From 169d011cccb4c0ba016da2c043f157b1f83fb7e7 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Fri, 13 Oct 2023 14:18:04 +0200 Subject: [PATCH 001/297] feat(reporter): <- adds skeleton for this --- packages/reporter/.env.example | 0 packages/reporter/.eslintignore | 2 + packages/reporter/.eslintrc.yml | 21 + packages/reporter/.nvmrc | 1 + packages/reporter/.prettierignore | 2 + packages/reporter/.prettierrc.yml | 7 + packages/reporter/README.md | 1 + packages/reporter/nodemon.json | 6 + packages/reporter/package.json | 29 + packages/reporter/src/index.ts | 0 packages/reporter/tsconfig.json | 28 + packages/reporter/yarn.lock | 2477 +++++++++++++++++++++++++++++ 12 files changed, 2574 insertions(+) create mode 100644 packages/reporter/.env.example create mode 100644 packages/reporter/.eslintignore create mode 100644 packages/reporter/.eslintrc.yml create mode 100644 packages/reporter/.nvmrc create mode 100644 packages/reporter/.prettierignore create mode 100644 packages/reporter/.prettierrc.yml create mode 100644 packages/reporter/README.md create mode 100644 packages/reporter/nodemon.json create mode 100644 packages/reporter/package.json create mode 100644 packages/reporter/src/index.ts create mode 100644 packages/reporter/tsconfig.json create mode 100644 packages/reporter/yarn.lock diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example new file mode 100644 index 00000000..e69de29b diff --git a/packages/reporter/.eslintignore b/packages/reporter/.eslintignore new file mode 100644 index 00000000..b68087da --- /dev/null +++ b/packages/reporter/.eslintignore @@ -0,0 +1,2 @@ +**/dist +**/node_modules \ No newline at end of file diff --git a/packages/reporter/.eslintrc.yml b/packages/reporter/.eslintrc.yml new file mode 100644 index 00000000..27672a35 --- /dev/null +++ b/packages/reporter/.eslintrc.yml @@ -0,0 +1,21 @@ +extends: + - "eslint:recommended" + - "plugin:@typescript-eslint/eslint-recommended" + - "plugin:@typescript-eslint/recommended" + - "prettier" +parser: "@typescript-eslint/parser" +parserOptions: + project: "tsconfig.json" +plugins: + - "@typescript-eslint" +root: true +rules: + "@typescript-eslint/no-floating-promises": + - error + - ignoreIIFE: true + ignoreVoid: true + "@typescript-eslint/no-inferrable-types": "off" + "@typescript-eslint/no-unused-vars": + - error + - argsIgnorePattern: "_" + varsIgnorePattern: "_" diff --git a/packages/reporter/.nvmrc b/packages/reporter/.nvmrc new file mode 100644 index 00000000..0828ab79 --- /dev/null +++ b/packages/reporter/.nvmrc @@ -0,0 +1 @@ +v18 \ No newline at end of file diff --git a/packages/reporter/.prettierignore b/packages/reporter/.prettierignore new file mode 100644 index 00000000..b68087da --- /dev/null +++ b/packages/reporter/.prettierignore @@ -0,0 +1,2 @@ +**/dist +**/node_modules \ No newline at end of file diff --git a/packages/reporter/.prettierrc.yml b/packages/reporter/.prettierrc.yml new file mode 100644 index 00000000..e9bada2e --- /dev/null +++ b/packages/reporter/.prettierrc.yml @@ -0,0 +1,7 @@ +bracketSpacing: true +printWidth: 120 +proseWrap: "always" +singleQuote: false +tabWidth: 2 +trailingComma: "all" +semi: false diff --git a/packages/reporter/README.md b/packages/reporter/README.md new file mode 100644 index 00000000..7d726673 --- /dev/null +++ b/packages/reporter/README.md @@ -0,0 +1 @@ +# reporter diff --git a/packages/reporter/nodemon.json b/packages/reporter/nodemon.json new file mode 100644 index 00000000..84ddf673 --- /dev/null +++ b/packages/reporter/nodemon.json @@ -0,0 +1,6 @@ +{ + "watch": ["src"], + "ext": "ts,json", + "ignore": ["src/**/*.spec.ts"], + "exec": "ts-node ./src/index.ts" + } \ No newline at end of file diff --git a/packages/reporter/package.json b/packages/reporter/package.json new file mode 100644 index 00000000..19121e24 --- /dev/null +++ b/packages/reporter/package.json @@ -0,0 +1,29 @@ +{ + "name": "reporter", + "author": { + "name": "gnosis", + "url": "https://github.com/gnosis" + }, + "scripts": { + "compile": "tsc", + "lint": "eslint --ignore-path ./.eslintignore --ext .js,.ts .", + "prettier:check": "prettier --check \"**/*.{js,json,md,sol,ts,yml}\"", + "prettier:write": "prettier --write \"**/*.{js,json,md,sol,ts,yml}\"", + "start:dev": "nodemon" + }, + "packageManager": "yarn@3.2.1", + "dependencies": { + "dotenv": "^16.3.1", + "viem": "^1.16.5" + }, + "devDependencies": { + "@typescript-eslint/eslint-plugin": "^6.7.5", + "@typescript-eslint/parser": "^6.7.5", + "eslint": "^8.51.0", + "eslint-config-prettier": "^9.0.0", + "nodemon": "^3.0.1", + "prettier": "^3.0.3", + "ts-node": "^10.9.1", + "typescript": "^5.2.2" + } +} diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts new file mode 100644 index 00000000..e69de29b diff --git a/packages/reporter/tsconfig.json b/packages/reporter/tsconfig.json new file mode 100644 index 00000000..eec3d55e --- /dev/null +++ b/packages/reporter/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "emitDecoratorMetadata": true, + "esModuleInterop": true, + "experimentalDecorators": true, + "forceConsistentCasingInFileNames": true, + "lib": [ + "es6" + ], + "module": "commonjs", + "moduleResolution": "node", + "noImplicitAny": true, + "outDir": "./dist", + "removeComments": true, + "resolveJsonModule": true, + "sourceMap": true, + "strict": true, + "target": "es6" + }, + "exclude": [ + "node_modules" + ], + "include": [ + "./src/**/*" + ] +} \ No newline at end of file diff --git a/packages/reporter/yarn.lock b/packages/reporter/yarn.lock new file mode 100644 index 00000000..32b985af --- /dev/null +++ b/packages/reporter/yarn.lock @@ -0,0 +1,2477 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 6 + cacheKey: 8 + +"@aashutoshrathi/word-wrap@npm:^1.2.3": + version: 1.2.6 + resolution: "@aashutoshrathi/word-wrap@npm:1.2.6" + checksum: ada901b9e7c680d190f1d012c84217ce0063d8f5c5a7725bb91ec3c5ed99bb7572680eb2d2938a531ccbaec39a95422fcd8a6b4a13110c7d98dd75402f66a0cd + languageName: node + linkType: hard + +"@adraffy/ens-normalize@npm:1.9.4": + version: 1.9.4 + resolution: "@adraffy/ens-normalize@npm:1.9.4" + checksum: 7d7fff58ebe2c4961f7e5e61dad123aa6a63fec0df5c84af1fa41079dc05d398599690be4427b3a94d2baa94084544bcfdf2d51cbed7504b9b0583b0960ad550 + languageName: node + linkType: hard + +"@cspotcode/source-map-support@npm:^0.8.0": + version: 0.8.1 + resolution: "@cspotcode/source-map-support@npm:0.8.1" + dependencies: + "@jridgewell/trace-mapping": 0.3.9 + checksum: 5718f267085ed8edb3e7ef210137241775e607ee18b77d95aa5bd7514f47f5019aa2d82d96b3bf342ef7aa890a346fa1044532ff7cc3009e7d24fce3ce6200fa + languageName: node + linkType: hard + +"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": + version: 4.4.0 + resolution: "@eslint-community/eslint-utils@npm:4.4.0" + dependencies: + eslint-visitor-keys: ^3.3.0 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: cdfe3ae42b4f572cbfb46d20edafe6f36fc5fb52bf2d90875c58aefe226892b9677fef60820e2832caf864a326fe4fc225714c46e8389ccca04d5f9288aabd22 + languageName: node + linkType: hard + +"@eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": + version: 4.9.1 + resolution: "@eslint-community/regexpp@npm:4.9.1" + checksum: 06fb839e9c756f6375cc545c2f2e05a0a64576bd6370e8e3c07983fd29a3d6e164ef4aa48a361f7d27e6713ab79c83053ff6a2ccb78748bc955e344279c4a3b6 + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^2.1.2": + version: 2.1.2 + resolution: "@eslint/eslintrc@npm:2.1.2" + 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 + checksum: bc742a1e3b361f06fedb4afb6bf32cbd27171292ef7924f61c62f2aed73048367bcc7ac68f98c06d4245cd3fabc43270f844e3c1699936d4734b3ac5398814a7 + languageName: node + linkType: hard + +"@eslint/js@npm:8.51.0": + version: 8.51.0 + resolution: "@eslint/js@npm:8.51.0" + checksum: 0228bf1e1e0414843e56d9ff362a2a72d579c078f93174666f29315690e9e30a8633ad72c923297f7fd7182381b5a476805ff04dac8debe638953eb1ded3ac73 + languageName: node + linkType: hard + +"@humanwhocodes/config-array@npm:^0.11.11": + version: 0.11.11 + resolution: "@humanwhocodes/config-array@npm:0.11.11" + dependencies: + "@humanwhocodes/object-schema": ^1.2.1 + debug: ^4.1.1 + minimatch: ^3.0.5 + checksum: db84507375ab77b8ffdd24f498a5b49ad6b64391d30dd2ac56885501d03964d29637e05b1ed5aefa09d57ac667e28028bc22d2da872bfcd619652fbdb5f4ca19 + languageName: node + linkType: hard + +"@humanwhocodes/module-importer@npm:^1.0.1": + version: 1.0.1 + resolution: "@humanwhocodes/module-importer@npm:1.0.1" + checksum: 0fd22007db8034a2cdf2c764b140d37d9020bbfce8a49d3ec5c05290e77d4b0263b1b972b752df8c89e5eaa94073408f2b7d977aed131faf6cf396ebb5d7fb61 + languageName: node + linkType: hard + +"@humanwhocodes/object-schema@npm:^1.2.1": + version: 1.2.1 + resolution: "@humanwhocodes/object-schema@npm:1.2.1" + checksum: a824a1ec31591231e4bad5787641f59e9633827d0a2eaae131a288d33c9ef0290bd16fda8da6f7c0fcb014147865d12118df10db57f27f41e20da92369fcb3f1 + languageName: node + linkType: hard + +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: ^5.1.2 + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: ^7.0.1 + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: ^8.1.0 + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: 4a473b9b32a7d4d3cfb7a614226e555091ff0c5a29a1734c28c72a182c2f6699b26fc6b5c2131dfd841e86b185aea714c72201d7c98c2fba5f17709333a67aeb + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.0.3": + version: 3.1.1 + resolution: "@jridgewell/resolve-uri@npm:3.1.1" + checksum: f5b441fe7900eab4f9155b3b93f9800a916257f4e8563afbcd3b5a5337b55e52bd8ae6735453b1b745457d9f6cdb16d74cd6220bbdd98cf153239e13f6cbb653 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10": + version: 1.4.15 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" + checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:0.3.9": + version: 0.3.9 + resolution: "@jridgewell/trace-mapping@npm:0.3.9" + dependencies: + "@jridgewell/resolve-uri": ^3.0.3 + "@jridgewell/sourcemap-codec": ^1.4.10 + checksum: d89597752fd88d3f3480845691a05a44bd21faac18e2185b6f436c3b0fd0c5a859fbbd9aaa92050c4052caf325ad3e10e2e1d1b64327517471b7d51babc0ddef + languageName: node + linkType: hard + +"@noble/curves@npm:1.2.0, @noble/curves@npm:~1.2.0": + version: 1.2.0 + resolution: "@noble/curves@npm:1.2.0" + dependencies: + "@noble/hashes": 1.3.2 + checksum: bb798d7a66d8e43789e93bc3c2ddff91a1e19fdb79a99b86cd98f1e5eff0ee2024a2672902c2576ef3577b6f282f3b5c778bebd55761ddbb30e36bf275e83dd0 + languageName: node + linkType: hard + +"@noble/hashes@npm:1.3.2, @noble/hashes@npm:~1.3.0, @noble/hashes@npm:~1.3.2": + version: 1.3.2 + resolution: "@noble/hashes@npm:1.3.2" + checksum: fe23536b436539d13f90e4b9be843cc63b1b17666a07634a2b1259dded6f490be3d050249e6af98076ea8f2ea0d56f578773c2197f2aa0eeaa5fba5bc18ba474 + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": 2.0.5 + run-parallel: ^1.1.9 + checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59 + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": 2.1.5 + fastq: ^1.6.0 + checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53 + languageName: node + linkType: hard + +"@npmcli/fs@npm:^3.1.0": + version: 3.1.0 + resolution: "@npmcli/fs@npm:3.1.0" + dependencies: + semver: ^7.3.5 + checksum: a50a6818de5fc557d0b0e6f50ec780a7a02ab8ad07e5ac8b16bf519e0ad60a144ac64f97d05c443c3367235d337182e1d012bbac0eb8dbae8dc7b40b193efd0e + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 6ad6a00fc4f2f2cfc6bff76fb1d88b8ee20bc0601e18ebb01b6d4be583733a860239a521a7fbca73b612e66705078809483549d2b18f370eb346c5155c8e4a0f + languageName: node + linkType: hard + +"@scure/base@npm:~1.1.0, @scure/base@npm:~1.1.2": + version: 1.1.3 + resolution: "@scure/base@npm:1.1.3" + checksum: 1606ab8a4db898cb3a1ada16c15437c3bce4e25854fadc8eb03ae93cbbbac1ed90655af4b0be3da37e12056fef11c0374499f69b9e658c9e5b7b3e06353c630c + languageName: node + linkType: hard + +"@scure/bip32@npm:1.3.2": + version: 1.3.2 + resolution: "@scure/bip32@npm:1.3.2" + dependencies: + "@noble/curves": ~1.2.0 + "@noble/hashes": ~1.3.2 + "@scure/base": ~1.1.2 + checksum: c5ae84fae43490853693b481531132b89e056d45c945fc8b92b9d032577f753dfd79c5a7bbcbf0a7f035951006ff0311b6cf7a389e26c9ec6335e42b20c53157 + languageName: node + linkType: hard + +"@scure/bip39@npm:1.2.1": + version: 1.2.1 + resolution: "@scure/bip39@npm:1.2.1" + dependencies: + "@noble/hashes": ~1.3.0 + "@scure/base": ~1.1.0 + checksum: c5bd6f1328fdbeae2dcdd891825b1610225310e5e62a4942714db51066866e4f7bef242c7b06a1b9dcc8043a4a13412cf5c5df76d3b10aa9e36b82e9b6e3eeaa + languageName: node + linkType: hard + +"@tootallnate/once@npm:2": + version: 2.0.0 + resolution: "@tootallnate/once@npm:2.0.0" + checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 + languageName: node + linkType: hard + +"@tsconfig/node10@npm:^1.0.7": + version: 1.0.9 + resolution: "@tsconfig/node10@npm:1.0.9" + checksum: a33ae4dc2a621c0678ac8ac4bceb8e512ae75dac65417a2ad9b022d9b5411e863c4c198b6ba9ef659e14b9fb609bbec680841a2e84c1172df7a5ffcf076539df + languageName: node + linkType: hard + +"@tsconfig/node12@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node12@npm:1.0.11" + checksum: 5ce29a41b13e7897a58b8e2df11269c5395999e588b9a467386f99d1d26f6c77d1af2719e407621412520ea30517d718d5192a32403b8dfcc163bf33e40a338a + languageName: node + linkType: hard + +"@tsconfig/node14@npm:^1.0.0": + version: 1.0.3 + resolution: "@tsconfig/node14@npm:1.0.3" + checksum: 19275fe80c4c8d0ad0abed6a96dbf00642e88b220b090418609c4376e1cef81bf16237bf170ad1b341452feddb8115d8dd2e5acdfdea1b27422071163dc9ba9d + languageName: node + linkType: hard + +"@tsconfig/node16@npm:^1.0.2": + version: 1.0.4 + resolution: "@tsconfig/node16@npm:1.0.4" + checksum: 202319785901f942a6e1e476b872d421baec20cf09f4b266a1854060efbf78cde16a4d256e8bc949d31e6cd9a90f1e8ef8fb06af96a65e98338a2b6b0de0a0ff + languageName: node + linkType: hard + +"@types/json-schema@npm:^7.0.12": + version: 7.0.13 + resolution: "@types/json-schema@npm:7.0.13" + checksum: 345df21a678fa72fb389f35f33de77833d09d4a142bb2bcb27c18690efa4cf70fc2876e43843cefb3fbdb9fcb12cd3e970a90936df30f53bbee899865ff605ab + languageName: node + linkType: hard + +"@types/semver@npm:^7.5.0": + version: 7.5.3 + resolution: "@types/semver@npm:7.5.3" + checksum: 349fdd1ab6c213bac5c991bac766bd07b8b12e63762462bb058740dcd2eb09c8193d068bb226f134661275f2022976214c0e727a4e5eb83ec1b131127c980d3e + languageName: node + linkType: hard + +"@typescript-eslint/eslint-plugin@npm:^6.7.5": + version: 6.7.5 + resolution: "@typescript-eslint/eslint-plugin@npm:6.7.5" + dependencies: + "@eslint-community/regexpp": ^4.5.1 + "@typescript-eslint/scope-manager": 6.7.5 + "@typescript-eslint/type-utils": 6.7.5 + "@typescript-eslint/utils": 6.7.5 + "@typescript-eslint/visitor-keys": 6.7.5 + debug: ^4.3.4 + graphemer: ^1.4.0 + ignore: ^5.2.4 + natural-compare: ^1.4.0 + semver: ^7.5.4 + ts-api-utils: ^1.0.1 + peerDependencies: + "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: c37edf5a703db4ff9227d67c2d2cf817e65c9afc94cc0e650fa3d2b05ac55201ef887ce9dadb9ca13779f4025bf4367e132b013e3559e777006a2332079bb180 + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:^6.7.5": + version: 6.7.5 + resolution: "@typescript-eslint/parser@npm:6.7.5" + dependencies: + "@typescript-eslint/scope-manager": 6.7.5 + "@typescript-eslint/types": 6.7.5 + "@typescript-eslint/typescript-estree": 6.7.5 + "@typescript-eslint/visitor-keys": 6.7.5 + debug: ^4.3.4 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 63f988c1c87697bd20487933be952b97f7a5f2a9977f505af671c7d49367fc01ca508817576646caa937c15cc0a0ef1e86adff9111eb19df8b489e7436d10620 + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:6.7.5": + version: 6.7.5 + resolution: "@typescript-eslint/scope-manager@npm:6.7.5" + dependencies: + "@typescript-eslint/types": 6.7.5 + "@typescript-eslint/visitor-keys": 6.7.5 + checksum: f21858ed78f81ab2d9879139f69657fda2a7b901078f79df64d1262d80f84ef66c56525ed0bb5e393fa5ca5474ad97f2225b7f713977c2d0f79cda31b2744af9 + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:6.7.5": + version: 6.7.5 + resolution: "@typescript-eslint/type-utils@npm:6.7.5" + dependencies: + "@typescript-eslint/typescript-estree": 6.7.5 + "@typescript-eslint/utils": 6.7.5 + debug: ^4.3.4 + ts-api-utils: ^1.0.1 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 8023d8ddcfbf4a0411b192016711068e9e6787c5811aee3a25ac40025ade0d063a1a3d7b38469e1a534bb31fa9dbeec08ab53b7a6d7b3128358294ac5b219d9a + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:6.7.5": + version: 6.7.5 + resolution: "@typescript-eslint/types@npm:6.7.5" + checksum: f21e5726b60f13feb3a920c92515fbc1205ba0e9bba9959b2e42c02c282a0ab4fb0e5ae84f3807b9b1cf95036027e9033d92a911fa88e6c243a87621d8dd7a01 + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:6.7.5": + version: 6.7.5 + resolution: "@typescript-eslint/typescript-estree@npm:6.7.5" + dependencies: + "@typescript-eslint/types": 6.7.5 + "@typescript-eslint/visitor-keys": 6.7.5 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + semver: ^7.5.4 + ts-api-utils: ^1.0.1 + peerDependenciesMeta: + typescript: + optional: true + checksum: 17685e8321edce1d1ec4278d84e63c0f41ccb19e9308f21c37450943ad0c33328755ac52b966e7855af17e01d22bc83d1fcda79c279fabe7d3460c8f315a7265 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:6.7.5": + version: 6.7.5 + resolution: "@typescript-eslint/utils@npm:6.7.5" + dependencies: + "@eslint-community/eslint-utils": ^4.4.0 + "@types/json-schema": ^7.0.12 + "@types/semver": ^7.5.0 + "@typescript-eslint/scope-manager": 6.7.5 + "@typescript-eslint/types": 6.7.5 + "@typescript-eslint/typescript-estree": 6.7.5 + semver: ^7.5.4 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + checksum: f365c654241f927e7784640079627d60a296aa3d575552b07594a69cfc419832eb5fa4adc87acb1988bea9741ae9cc4a5277dab168990310caef5de125255752 + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:6.7.5": + version: 6.7.5 + resolution: "@typescript-eslint/visitor-keys@npm:6.7.5" + dependencies: + "@typescript-eslint/types": 6.7.5 + eslint-visitor-keys: ^3.4.1 + checksum: 2df996742f63d89fa339b0e8ff3a3a289d36b3f584f7538a7626bed3869e9ae27f8f56ab31748519d25a63de2ae22a43dd8413610b00436ff342b0a17eb85289 + languageName: node + linkType: hard + +"abbrev@npm:1, abbrev@npm:^1.0.0": + version: 1.1.1 + resolution: "abbrev@npm:1.1.1" + checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 + languageName: node + linkType: hard + +"abitype@npm:0.9.8": + version: 0.9.8 + resolution: "abitype@npm:0.9.8" + peerDependencies: + typescript: ">=5.0.4" + zod: ^3 >=3.19.1 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + checksum: d7d887f29d6821e3f7a400de9620511b80ead3f85c5c87308aaec97965d3493e6687ed816e88722b4f512249bd66dee9e69231b49af0e1db8f69400a62c87cf6 + languageName: node + linkType: hard + +"acorn-jsx@npm:^5.3.2": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: c3d3b2a89c9a056b205b69530a37b972b404ee46ec8e5b341666f9513d3163e2a4f214a71f4dfc7370f5a9c07472d2fd1c11c91c3f03d093e37637d95da98950 + languageName: node + linkType: hard + +"acorn-walk@npm:^8.1.1": + version: 8.2.0 + resolution: "acorn-walk@npm:8.2.0" + checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1 + languageName: node + linkType: hard + +"acorn@npm:^8.4.1, acorn@npm:^8.9.0": + version: 8.10.0 + resolution: "acorn@npm:8.10.0" + bin: + acorn: bin/acorn + checksum: 538ba38af0cc9e5ef983aee196c4b8b4d87c0c94532334fa7e065b2c8a1f85863467bb774231aae91613fcda5e68740c15d97b1967ae3394d20faddddd8af61d + languageName: node + linkType: hard + +"agent-base@npm:6, agent-base@npm:^6.0.2": + version: 6.0.2 + resolution: "agent-base@npm:6.0.2" + dependencies: + debug: 4 + checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d + languageName: node + linkType: hard + +"agentkeepalive@npm:^4.2.1": + version: 4.5.0 + resolution: "agentkeepalive@npm:4.5.0" + dependencies: + humanize-ms: ^1.2.1 + checksum: 13278cd5b125e51eddd5079f04d6fe0914ac1b8b91c1f3db2c1822f99ac1a7457869068997784342fe455d59daaff22e14fb7b8c3da4e741896e7e31faf92481 + languageName: node + linkType: hard + +"aggregate-error@npm:^3.0.0": + version: 3.1.0 + resolution: "aggregate-error@npm:3.1.0" + dependencies: + clean-stack: ^2.0.0 + indent-string: ^4.0.0 + checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 + languageName: node + linkType: hard + +"ajv@npm:^6.12.4": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" + 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 + checksum: 874972efe5c4202ab0a68379481fbd3d1b5d0a7bd6d3cc21d40d3536ebff3352a2a1fabb632d4fd2cc7fe4cbdcd5ed6782084c9bbf7f32a1536d18f9da5007d4 + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b + languageName: node + linkType: hard + +"ansi-regex@npm:^6.0.1": + version: 6.0.1 + resolution: "ansi-regex@npm:6.0.1" + checksum: 1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: ^2.0.1 + checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 + languageName: node + linkType: hard + +"ansi-styles@npm:^6.1.0": + version: 6.2.1 + resolution: "ansi-styles@npm:6.2.1" + checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 + languageName: node + linkType: hard + +"anymatch@npm:~3.1.2": + version: 3.1.3 + resolution: "anymatch@npm:3.1.3" + dependencies: + normalize-path: ^3.0.0 + picomatch: ^2.0.4 + checksum: 3e044fd6d1d26545f235a9fe4d7a534e2029d8e59fa7fd9f2a6eb21230f6b5380ea1eaf55136e60cbf8e613544b3b766e7a6fa2102e2a3a117505466e3025dc2 + languageName: node + linkType: hard + +"aproba@npm:^1.0.3 || ^2.0.0": + version: 2.0.0 + resolution: "aproba@npm:2.0.0" + checksum: 5615cadcfb45289eea63f8afd064ab656006361020e1735112e346593856f87435e02d8dcc7ff0d11928bc7d425f27bc7c2a84f6c0b35ab0ff659c814c138a24 + languageName: node + linkType: hard + +"are-we-there-yet@npm:^3.0.0": + version: 3.0.1 + resolution: "are-we-there-yet@npm:3.0.1" + dependencies: + delegates: ^1.0.0 + readable-stream: ^3.6.0 + checksum: 52590c24860fa7173bedeb69a4c05fb573473e860197f618b9a28432ee4379049336727ae3a1f9c4cb083114601c1140cee578376164d0e651217a9843f9fe83 + languageName: node + linkType: hard + +"arg@npm:^4.1.0": + version: 4.1.3 + resolution: "arg@npm:4.1.3" + checksum: 544af8dd3f60546d3e4aff084d451b96961d2267d668670199692f8d054f0415d86fc5497d0e641e91546f0aa920e7c29e5250e99fc89f5552a34b5d93b77f43 + languageName: node + linkType: hard + +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced + languageName: node + linkType: hard + +"array-union@npm:^2.1.0": + version: 2.1.0 + resolution: "array-union@npm:2.1.0" + checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 + languageName: node + linkType: hard + +"binary-extensions@npm:^2.0.0": + version: 2.2.0 + resolution: "binary-extensions@npm:2.2.0" + checksum: ccd267956c58d2315f5d3ea6757cf09863c5fc703e50fbeb13a7dc849b812ef76e3cf9ca8f35a0c48498776a7478d7b4a0418e1e2b8cb9cb9731f2922aaad7f8 + languageName: node + linkType: hard + +"reporter@workspace:.": + version: 0.0.0-use.local + resolution: "reporter@workspace:." + dependencies: + "@typescript-eslint/eslint-plugin": ^6.7.5 + "@typescript-eslint/parser": ^6.7.5 + dotenv: ^16.3.1 + eslint: ^8.51.0 + eslint-config-prettier: ^9.0.0 + nodemon: ^3.0.1 + prettier: ^3.0.3 + ts-node: ^10.9.1 + typescript: ^5.2.2 + viem: ^1.16.5 + languageName: unknown + linkType: soft + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: ^1.0.0 + concat-map: 0.0.1 + checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" + dependencies: + balanced-match: ^1.0.0 + checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 + languageName: node + linkType: hard + +"braces@npm:^3.0.2, braces@npm:~3.0.2": + version: 3.0.2 + resolution: "braces@npm:3.0.2" + dependencies: + fill-range: ^7.0.1 + checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 + languageName: node + linkType: hard + +"cacache@npm:^17.0.0": + version: 17.1.4 + resolution: "cacache@npm:17.1.4" + dependencies: + "@npmcli/fs": ^3.1.0 + fs-minipass: ^3.0.0 + glob: ^10.2.2 + lru-cache: ^7.7.1 + minipass: ^7.0.3 + minipass-collect: ^1.0.2 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + p-map: ^4.0.0 + ssri: ^10.0.0 + tar: ^6.1.11 + unique-filename: ^3.0.0 + checksum: b7751df756656954a51201335addced8f63fc53266fa56392c9f5ae83c8d27debffb4458ac2d168a744a4517ec3f2163af05c20097f93d17bdc2dc8a385e14a6 + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 + languageName: node + linkType: hard + +"chalk@npm:^4.0.0": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: ^4.1.0 + supports-color: ^7.1.0 + checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc + languageName: node + linkType: hard + +"chokidar@npm:^3.5.2": + version: 3.5.3 + resolution: "chokidar@npm:3.5.3" + dependencies: + anymatch: ~3.1.2 + braces: ~3.0.2 + fsevents: ~2.3.2 + glob-parent: ~5.1.2 + is-binary-path: ~2.1.0 + is-glob: ~4.0.1 + normalize-path: ~3.0.0 + readdirp: ~3.6.0 + dependenciesMeta: + fsevents: + optional: true + checksum: b49fcde40176ba007ff361b198a2d35df60d9bb2a5aab228279eb810feae9294a6b4649ab15981304447afe1e6ffbf4788ad5db77235dc770ab777c6e771980c + languageName: node + linkType: hard + +"chownr@npm:^2.0.0": + version: 2.0.0 + resolution: "chownr@npm:2.0.0" + checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f + languageName: node + linkType: hard + +"clean-stack@npm:^2.0.0": + version: 2.2.0 + resolution: "clean-stack@npm:2.2.0" + checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: ~1.1.4 + checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 + languageName: node + linkType: hard + +"color-support@npm:^1.1.3": + version: 1.1.3 + resolution: "color-support@npm:1.1.3" + bin: + color-support: bin.js + checksum: 9b7356817670b9a13a26ca5af1c21615463b500783b739b7634a0c2047c16cef4b2865d7576875c31c3cddf9dd621fa19285e628f20198b233a5cfdda6d0793b + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af + languageName: node + linkType: hard + +"console-control-strings@npm:^1.1.0": + version: 1.1.0 + resolution: "console-control-strings@npm:1.1.0" + checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed + languageName: node + linkType: hard + +"create-require@npm:^1.1.0": + version: 1.1.1 + resolution: "create-require@npm:1.1.1" + checksum: a9a1503d4390d8b59ad86f4607de7870b39cad43d929813599a23714831e81c520bddf61bcdd1f8e30f05fd3a2b71ae8538e946eb2786dc65c2bbc520f692eff + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2": + version: 7.0.3 + resolution: "cross-spawn@npm:7.0.3" + dependencies: + path-key: ^3.1.0 + shebang-command: ^2.0.0 + which: ^2.0.1 + checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": + version: 4.3.4 + resolution: "debug@npm:4.3.4" + dependencies: + ms: 2.1.2 + peerDependenciesMeta: + supports-color: + optional: true + checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 + languageName: node + linkType: hard + +"debug@npm:^3.2.7": + version: 3.2.7 + resolution: "debug@npm:3.2.7" + dependencies: + ms: ^2.1.1 + checksum: b3d8c5940799914d30314b7c3304a43305fd0715581a919dacb8b3176d024a782062368405b47491516d2091d6462d4d11f2f4974a405048094f8bfebfa3071c + languageName: node + linkType: hard + +"deep-is@npm:^0.1.3": + version: 0.1.4 + resolution: "deep-is@npm:0.1.4" + checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 + languageName: node + linkType: hard + +"delegates@npm:^1.0.0": + version: 1.0.0 + resolution: "delegates@npm:1.0.0" + checksum: a51744d9b53c164ba9c0492471a1a2ffa0b6727451bdc89e31627fdf4adda9d51277cfcbfb20f0a6f08ccb3c436f341df3e92631a3440226d93a8971724771fd + languageName: node + linkType: hard + +"diff@npm:^4.0.1": + version: 4.0.2 + resolution: "diff@npm:4.0.2" + checksum: f2c09b0ce4e6b301c221addd83bf3f454c0bc00caa3dd837cf6c127d6edf7223aa2bbe3b688feea110b7f262adbfc845b757c44c8a9f8c0c5b15d8fa9ce9d20d + languageName: node + linkType: hard + +"dir-glob@npm:^3.0.1": + version: 3.0.1 + resolution: "dir-glob@npm:3.0.1" + dependencies: + path-type: ^4.0.0 + checksum: fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 + languageName: node + linkType: hard + +"doctrine@npm:^3.0.0": + version: 3.0.0 + resolution: "doctrine@npm:3.0.0" + dependencies: + esutils: ^2.0.2 + checksum: fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce + languageName: node + linkType: hard + +"dotenv@npm:^16.3.1": + version: 16.3.1 + resolution: "dotenv@npm:16.3.1" + checksum: 15d75e7279018f4bafd0ee9706593dd14455ddb71b3bcba9c52574460b7ccaf67d5cf8b2c08a5af1a9da6db36c956a04a1192b101ee102a3e0cf8817bbcf3dfd + languageName: node + linkType: hard + +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 + languageName: node + linkType: hard + +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601 + languageName: node + linkType: hard + +"encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" + dependencies: + iconv-lite: ^0.6.2 + checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 + languageName: node + linkType: hard + +"eslint-config-prettier@npm:^9.0.0": + version: 9.0.0 + resolution: "eslint-config-prettier@npm:9.0.0" + peerDependencies: + eslint: ">=7.0.0" + bin: + eslint-config-prettier: bin/cli.js + checksum: 362e991b6cb343f79362bada2d97c202e5303e6865888918a7445c555fb75e4c078b01278e90be98aa98ae22f8597d8e93d48314bec6824f540f7efcab3ce451 + languageName: node + linkType: hard + +"eslint-scope@npm:^7.2.2": + version: 7.2.2 + resolution: "eslint-scope@npm:7.2.2" + dependencies: + esrecurse: ^4.3.0 + estraverse: ^5.2.0 + checksum: ec97dbf5fb04b94e8f4c5a91a7f0a6dd3c55e46bfc7bbcd0e3138c3a76977570e02ed89a1810c778dcd72072ff0e9621ba1379b4babe53921d71e2e4486fda3e + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": + version: 3.4.3 + resolution: "eslint-visitor-keys@npm:3.4.3" + checksum: 36e9ef87fca698b6fd7ca5ca35d7b2b6eeaaf106572e2f7fd31c12d3bfdaccdb587bba6d3621067e5aece31c8c3a348b93922ab8f7b2cbc6aaab5e1d89040c60 + languageName: node + linkType: hard + +"eslint@npm:^8.51.0": + version: 8.51.0 + resolution: "eslint@npm:8.51.0" + dependencies: + "@eslint-community/eslint-utils": ^4.2.0 + "@eslint-community/regexpp": ^4.6.1 + "@eslint/eslintrc": ^2.1.2 + "@eslint/js": 8.51.0 + "@humanwhocodes/config-array": ^0.11.11 + "@humanwhocodes/module-importer": ^1.0.1 + "@nodelib/fs.walk": ^1.2.8 + 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 + bin: + eslint: bin/eslint.js + checksum: 214fa5d1fcb67af1b8992ce9584ccd85e1aa7a482f8b8ea5b96edc28fa838a18a3b69456db45fc1ed3ef95f1e9efa9714f737292dc681e572d471d02fda9649c + languageName: node + linkType: hard + +"espree@npm:^9.6.0, espree@npm:^9.6.1": + version: 9.6.1 + resolution: "espree@npm:9.6.1" + dependencies: + acorn: ^8.9.0 + acorn-jsx: ^5.3.2 + eslint-visitor-keys: ^3.4.1 + checksum: eb8c149c7a2a77b3f33a5af80c10875c3abd65450f60b8af6db1bfcfa8f101e21c1e56a561c6dc13b848e18148d43469e7cd208506238554fb5395a9ea5a1ab9 + languageName: node + linkType: hard + +"esquery@npm:^1.4.2": + version: 1.5.0 + resolution: "esquery@npm:1.5.0" + dependencies: + estraverse: ^5.1.0 + checksum: aefb0d2596c230118656cd4ec7532d447333a410a48834d80ea648b1e7b5c9bc9ed8b5e33a89cb04e487b60d622f44cf5713bf4abed7c97343edefdc84a35900 + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: ^5.2.0 + checksum: ebc17b1a33c51cef46fdc28b958994b1dc43cd2e86237515cbc3b4e5d2be6a811b2315d0a1a4d9d340b6d2308b15322f5c8291059521cc5f4802f65e7ec32837 + languageName: node + linkType: hard + +"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 22b5b08f74737379a840b8ed2036a5fb35826c709ab000683b092d9054e5c2a82c27818f12604bfc2a9a76b90b6834ef081edbc1c7ae30d1627012e067c6ec87 + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.1 + resolution: "exponential-backoff@npm:3.1.1" + checksum: 3d21519a4f8207c99f7457287291316306255a328770d320b401114ec8481986e4e467e854cb9914dd965e0a1ca810a23ccb559c642c88f4c7f55c55778a9b48 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d + languageName: node + linkType: hard + +"fast-glob@npm:^3.2.9": + version: 3.3.1 + resolution: "fast-glob@npm:3.3.1" + 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 + checksum: b6f3add6403e02cf3a798bfbb1183d0f6da2afd368f27456010c0bc1f9640aea308243d4cb2c0ab142f618276e65ecb8be1661d7c62a7b4e5ba774b9ce5432e5 + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:^2.0.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb + languageName: node + linkType: hard + +"fast-levenshtein@npm:^2.0.6": + version: 2.0.6 + resolution: "fast-levenshtein@npm:2.0.6" + checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.15.0 + resolution: "fastq@npm:1.15.0" + dependencies: + reusify: ^1.0.4 + checksum: 0170e6bfcd5d57a70412440b8ef600da6de3b2a6c5966aeaf0a852d542daff506a0ee92d6de7679d1de82e644bce69d7a574a6c93f0b03964b5337eed75ada1a + languageName: node + linkType: hard + +"file-entry-cache@npm:^6.0.1": + version: 6.0.1 + resolution: "file-entry-cache@npm:6.0.1" + dependencies: + flat-cache: ^3.0.4 + checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 + languageName: node + linkType: hard + +"fill-range@npm:^7.0.1": + version: 7.0.1 + resolution: "fill-range@npm:7.0.1" + dependencies: + to-regex-range: ^5.0.1 + checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 + languageName: node + linkType: hard + +"find-up@npm:^5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" + dependencies: + locate-path: ^6.0.0 + path-exists: ^4.0.0 + checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 + languageName: node + linkType: hard + +"flat-cache@npm:^3.0.4": + version: 3.1.1 + resolution: "flat-cache@npm:3.1.1" + dependencies: + flatted: ^3.2.9 + keyv: ^4.5.3 + rimraf: ^3.0.2 + checksum: 4958cfe0f46acf84953d4e16676ef5f0d38eab3a92d532a1e8d5f88f11eea8b36d5d598070ff2aeae15f1fde18f8d7d089eefaf9db10b5a587cc1c9072325c7a + languageName: node + linkType: hard + +"flatted@npm:^3.2.9": + version: 3.2.9 + resolution: "flatted@npm:3.2.9" + checksum: f14167fbe26a9d20f6fca8d998e8f1f41df72c8e81f9f2c9d61ed2bea058248f5e1cbd05e7f88c0e5087a6a0b822a1e5e2b446e879f3cfbe0b07ba2d7f80b026 + languageName: node + linkType: hard + +"foreground-child@npm:^3.1.0": + version: 3.1.1 + resolution: "foreground-child@npm:3.1.1" + dependencies: + cross-spawn: ^7.0.0 + signal-exit: ^4.0.1 + checksum: 139d270bc82dc9e6f8bc045fe2aae4001dc2472157044fdfad376d0a3457f77857fa883c1c8b21b491c6caade9a926a4bed3d3d2e8d3c9202b151a4cbbd0bcd5 + languageName: node + linkType: hard + +"fs-minipass@npm:^2.0.0": + version: 2.1.0 + resolution: "fs-minipass@npm:2.1.0" + dependencies: + minipass: ^3.0.0 + checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1 + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: ^7.0.3 + checksum: 8722a41109130851d979222d3ec88aabaceeaaf8f57b2a8f744ef8bd2d1ce95453b04a61daa0078822bc5cd21e008814f06fe6586f56fef511e71b8d2394d802 + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 + languageName: node + linkType: hard + +"fsevents@npm:~2.3.2": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" + dependencies: + node-gyp: latest + checksum: 11e6ea6fea15e42461fc55b4b0e4a0a3c654faa567f1877dbd353f39156f69def97a69936d1746619d656c4b93de2238bf731f6085a03a50cabf287c9d024317 + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@~2.3.2#~builtin": + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=18f3a7" + dependencies: + node-gyp: latest + conditions: os=darwin + languageName: node + linkType: hard + +"gauge@npm:^4.0.3": + version: 4.0.4 + resolution: "gauge@npm:4.0.4" + dependencies: + aproba: ^1.0.3 || ^2.0.0 + color-support: ^1.1.3 + console-control-strings: ^1.1.0 + has-unicode: ^2.0.1 + signal-exit: ^3.0.7 + string-width: ^4.2.3 + strip-ansi: ^6.0.1 + wide-align: ^1.1.5 + checksum: 788b6bfe52f1dd8e263cda800c26ac0ca2ff6de0b6eee2fe0d9e3abf15e149b651bd27bf5226be10e6e3edb5c4e5d5985a5a1a98137e7a892f75eff76467ad2d + languageName: node + linkType: hard + +"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: ^4.0.1 + checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e + languageName: node + linkType: hard + +"glob-parent@npm:^6.0.2": + version: 6.0.2 + resolution: "glob-parent@npm:6.0.2" + dependencies: + is-glob: ^4.0.3 + checksum: c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8 + languageName: node + linkType: hard + +"glob@npm:^10.2.2": + version: 10.3.10 + resolution: "glob@npm:10.3.10" + dependencies: + foreground-child: ^3.1.0 + jackspeak: ^2.3.5 + minimatch: ^9.0.1 + minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 + path-scurry: ^1.10.1 + bin: + glob: dist/esm/bin.mjs + checksum: 4f2fe2511e157b5a3f525a54092169a5f92405f24d2aed3142f4411df328baca13059f4182f1db1bf933e2c69c0bd89e57ae87edd8950cba8c7ccbe84f721cf3 + languageName: node + linkType: hard + +"glob@npm:^7.1.3, glob@npm:^7.1.4": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + 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 + checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 + languageName: node + linkType: hard + +"globals@npm:^13.19.0": + version: 13.23.0 + resolution: "globals@npm:13.23.0" + dependencies: + type-fest: ^0.20.2 + checksum: 194c97cf8d1ef6ba59417234c2386549c4103b6e5f24b1ff1952de61a4753e5d2069435ba629de711a6480b1b1d114a98e2ab27f85e966d5a10c319c3bbd3dc3 + languageName: node + linkType: hard + +"globby@npm:^11.1.0": + version: 11.1.0 + resolution: "globby@npm:11.1.0" + 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 + checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.2.6": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 + languageName: node + linkType: hard + +"graphemer@npm:^1.4.0": + version: 1.4.0 + resolution: "graphemer@npm:1.4.0" + checksum: bab8f0be9b568857c7bec9fda95a89f87b783546d02951c40c33f84d05bb7da3fd10f863a9beb901463669b6583173a8c8cc6d6b306ea2b9b9d5d3d943c3a673 + languageName: node + linkType: hard + +"has-flag@npm:^3.0.0": + version: 3.0.0 + resolution: "has-flag@npm:3.0.0" + checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad + languageName: node + linkType: hard + +"has-unicode@npm:^2.0.1": + version: 2.0.1 + resolution: "has-unicode@npm:2.0.1" + checksum: 1eab07a7436512db0be40a710b29b5dc21fa04880b7f63c9980b706683127e3c1b57cb80ea96d47991bdae2dfe479604f6a1ba410106ee1046a41d1bd0814400 + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.1.1": + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236 + languageName: node + linkType: hard + +"http-proxy-agent@npm:^5.0.0": + version: 5.0.0 + resolution: "http-proxy-agent@npm:5.0.0" + dependencies: + "@tootallnate/once": 2 + agent-base: 6 + debug: 4 + checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^5.0.0": + version: 5.0.1 + resolution: "https-proxy-agent@npm:5.0.1" + dependencies: + agent-base: 6 + debug: 4 + checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 + languageName: node + linkType: hard + +"humanize-ms@npm:^1.2.1": + version: 1.2.1 + resolution: "humanize-ms@npm:1.2.1" + dependencies: + ms: ^2.0.0 + checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16 + languageName: node + linkType: hard + +"iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: ">= 2.1.2 < 3.0.0" + checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf + languageName: node + linkType: hard + +"ignore-by-default@npm:^1.0.1": + version: 1.0.1 + resolution: "ignore-by-default@npm:1.0.1" + checksum: 441509147b3615e0365e407a3c18e189f78c07af08564176c680be1fabc94b6c789cad1342ad887175d4ecd5225de86f73d376cec8e06b42fd9b429505ffcf8a + languageName: node + linkType: hard + +"ignore@npm:^5.2.0, ignore@npm:^5.2.4": + version: 5.2.4 + resolution: "ignore@npm:5.2.4" + checksum: 3d4c309c6006e2621659311783eaea7ebcd41fe4ca1d78c91c473157ad6666a57a2df790fe0d07a12300d9aac2888204d7be8d59f9aaf665b1c7fcdb432517ef + languageName: node + linkType: hard + +"import-fresh@npm:^3.2.1": + version: 3.3.0 + resolution: "import-fresh@npm:3.3.0" + dependencies: + parent-module: ^1.0.0 + resolve-from: ^4.0.0 + checksum: 2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 + languageName: node + linkType: hard + +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: ^1.3.0 + wrappy: 1 + checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd + languageName: node + linkType: hard + +"inherits@npm:2, inherits@npm:^2.0.3": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 + languageName: node + linkType: hard + +"ip@npm:^2.0.0": + version: 2.0.0 + resolution: "ip@npm:2.0.0" + checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349 + languageName: node + linkType: hard + +"is-binary-path@npm:~2.1.0": + version: 2.1.0 + resolution: "is-binary-path@npm:2.1.0" + dependencies: + binary-extensions: ^2.0.0 + checksum: 84192eb88cff70d320426f35ecd63c3d6d495da9d805b19bc65b518984b7c0760280e57dbf119b7e9be6b161784a5a673ab2c6abe83abb5198a432232ad5b35c + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 + languageName: node + linkType: hard + +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: ^2.1.1 + checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 + languageName: node + linkType: hard + +"is-lambda@npm:^1.0.1": + version: 1.0.1 + resolution: "is-lambda@npm:1.0.1" + checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35 + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a + languageName: node + linkType: hard + +"is-path-inside@npm:^3.0.3": + version: 3.0.3 + resolution: "is-path-inside@npm:3.0.3" + checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 + languageName: node + linkType: hard + +"isows@npm:1.0.3": + version: 1.0.3 + resolution: "isows@npm:1.0.3" + peerDependencies: + ws: "*" + checksum: 9cacd5cf59f67deb51e825580cd445ab1725ecb05a67c704050383fb772856f3cd5e7da8ad08f5a3bd2823680d77d099459d0c6a7037972a74d6429af61af440 + languageName: node + linkType: hard + +"jackspeak@npm:^2.3.5": + version: 2.3.6 + resolution: "jackspeak@npm:2.3.6" + dependencies: + "@isaacs/cliui": ^8.0.2 + "@pkgjs/parseargs": ^0.11.0 + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: 57d43ad11eadc98cdfe7496612f6bbb5255ea69fe51ea431162db302c2a11011642f50cfad57288bd0aea78384a0612b16e131944ad8ecd09d619041c8531b54 + languageName: node + linkType: hard + +"js-yaml@npm:^4.1.0": + version: 4.1.0 + resolution: "js-yaml@npm:4.1.0" + dependencies: + argparse: ^2.0.1 + bin: + js-yaml: bin/js-yaml.js + checksum: c7830dfd456c3ef2c6e355cc5a92e6700ceafa1d14bba54497b34a99f0376cecbb3e9ac14d3e5849b426d5a5140709a66237a8c991c675431271c4ce5504151a + languageName: node + linkType: hard + +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 9026b03edc2847eefa2e37646c579300a1f3a4586cfb62bf857832b60c852042d0d6ae55d1afb8926163fa54c2b01d83ae24705f34990348bdac6273a29d4581 + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 7486074d3ba247769fda17d5181b345c9fb7d12e0da98b22d1d71a5db9698d8b4bd900a3ec1a4ffdd60846fc2556274a5c894d0c48795f14cb03aeae7b55260b + languageName: node + linkType: hard + +"json-stable-stringify-without-jsonify@npm:^1.0.1": + version: 1.0.1 + resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" + checksum: cff44156ddce9c67c44386ad5cddf91925fe06b1d217f2da9c4910d01f358c6e3989c4d5a02683c7a5667f9727ff05831f7aa8ae66c8ff691c556f0884d49215 + languageName: node + linkType: hard + +"keyv@npm:^4.5.3": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" + dependencies: + json-buffer: 3.0.1 + checksum: 74a24395b1c34bd44ad5cb2b49140d087553e170625240b86755a6604cd65aa16efdbdeae5cdb17ba1284a0fbb25ad06263755dbc71b8d8b06f74232ce3cdd72 + languageName: node + linkType: hard + +"levn@npm:^0.4.1": + version: 0.4.1 + resolution: "levn@npm:0.4.1" + dependencies: + prelude-ls: ^1.2.1 + type-check: ~0.4.0 + checksum: 12c5021c859bd0f5248561bf139121f0358285ec545ebf48bb3d346820d5c61a4309535c7f387ed7d84361cf821e124ce346c6b7cef8ee09a67c1473b46d0fc4 + languageName: node + linkType: hard + +"locate-path@npm:^6.0.0": + version: 6.0.0 + resolution: "locate-path@npm:6.0.0" + dependencies: + p-locate: ^5.0.0 + checksum: 72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a + languageName: node + linkType: hard + +"lodash.merge@npm:^4.6.2": + version: 4.6.2 + resolution: "lodash.merge@npm:4.6.2" + checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005 + languageName: node + linkType: hard + +"lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" + dependencies: + yallist: ^4.0.0 + checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 + languageName: node + linkType: hard + +"lru-cache@npm:^7.7.1": + version: 7.18.3 + resolution: "lru-cache@npm:7.18.3" + checksum: e550d772384709deea3f141af34b6d4fa392e2e418c1498c078de0ee63670f1f46f5eee746e8ef7e69e1c895af0d4224e62ee33e66a543a14763b0f2e74c1356 + languageName: node + linkType: hard + +"lru-cache@npm:^9.1.1 || ^10.0.0": + version: 10.0.1 + resolution: "lru-cache@npm:10.0.1" + checksum: 06f8d0e1ceabd76bb6f644a26dbb0b4c471b79c7b514c13c6856113879b3bf369eb7b497dad4ff2b7e2636db202412394865b33c332100876d838ad1372f0181 + languageName: node + linkType: hard + +"make-error@npm:^1.1.1": + version: 1.3.6 + resolution: "make-error@npm:1.3.6" + checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 + languageName: node + linkType: hard + +"make-fetch-happen@npm:^11.0.3": + version: 11.1.1 + resolution: "make-fetch-happen@npm:11.1.1" + dependencies: + agentkeepalive: ^4.2.1 + cacache: ^17.0.0 + http-cache-semantics: ^4.1.1 + http-proxy-agent: ^5.0.0 + https-proxy-agent: ^5.0.0 + is-lambda: ^1.0.1 + lru-cache: ^7.7.1 + minipass: ^5.0.0 + minipass-fetch: ^3.0.0 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + negotiator: ^0.6.3 + promise-retry: ^2.0.1 + socks-proxy-agent: ^7.0.0 + ssri: ^10.0.0 + checksum: 7268bf274a0f6dcf0343829489a4506603ff34bd0649c12058753900b0eb29191dce5dba12680719a5d0a983d3e57810f594a12f3c18494e93a1fbc6348a4540 + languageName: node + linkType: hard + +"merge2@npm:^1.3.0, merge2@npm:^1.4.1": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 + languageName: node + linkType: hard + +"micromatch@npm:^4.0.4": + version: 4.0.5 + resolution: "micromatch@npm:4.0.5" + dependencies: + braces: ^3.0.2 + picomatch: ^2.3.1 + checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc + languageName: node + linkType: hard + +"minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: ^1.1.7 + checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a + languageName: node + linkType: hard + +"minimatch@npm:^9.0.1": + version: 9.0.3 + resolution: "minimatch@npm:9.0.3" + dependencies: + brace-expansion: ^2.0.1 + checksum: 253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5 + languageName: node + linkType: hard + +"minipass-collect@npm:^1.0.2": + version: 1.0.2 + resolution: "minipass-collect@npm:1.0.2" + dependencies: + minipass: ^3.0.0 + checksum: 14df761028f3e47293aee72888f2657695ec66bd7d09cae7ad558da30415fdc4752bbfee66287dcc6fd5e6a2fa3466d6c484dc1cbd986525d9393b9523d97f10 + languageName: node + linkType: hard + +"minipass-fetch@npm:^3.0.0": + version: 3.0.4 + resolution: "minipass-fetch@npm:3.0.4" + dependencies: + encoding: ^0.1.13 + minipass: ^7.0.3 + minipass-sized: ^1.0.3 + minizlib: ^2.1.2 + dependenciesMeta: + encoding: + optional: true + checksum: af7aad15d5c128ab1ebe52e043bdf7d62c3c6f0cecb9285b40d7b395e1375b45dcdfd40e63e93d26a0e8249c9efd5c325c65575aceee192883970ff8cb11364a + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" + dependencies: + minipass: ^3.0.0 + checksum: 56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: ^3.0.0 + checksum: b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b + languageName: node + linkType: hard + +"minipass-sized@npm:^1.0.3": + version: 1.0.3 + resolution: "minipass-sized@npm:1.0.3" + dependencies: + minipass: ^3.0.0 + checksum: 79076749fcacf21b5d16dd596d32c3b6bf4d6e62abb43868fac21674078505c8b15eaca4e47ed844985a4514854f917d78f588fcd029693709417d8f98b2bd60 + languageName: node + linkType: hard + +"minipass@npm:^3.0.0": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: ^4.0.0 + checksum: a30d083c8054cee83cdcdc97f97e4641a3f58ae743970457b1489ce38ee1167b3aaf7d815cd39ec7a99b9c40397fd4f686e83750e73e652b21cb516f6d845e48 + languageName: node + linkType: hard + +"minipass@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass@npm:5.0.0" + checksum: 425dab288738853fded43da3314a0b5c035844d6f3097a8e3b5b29b328da8f3c1af6fc70618b32c29ff906284cf6406b6841376f21caaadd0793c1d5a6a620ea + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.3": + version: 7.0.4 + resolution: "minipass@npm:7.0.4" + checksum: 87585e258b9488caf2e7acea242fd7856bbe9a2c84a7807643513a338d66f368c7d518200ad7b70a508664d408aa000517647b2930c259a8b1f9f0984f344a21 + languageName: node + linkType: hard + +"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": + version: 2.1.2 + resolution: "minizlib@npm:2.1.2" + dependencies: + minipass: ^3.0.0 + yallist: ^4.0.0 + checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3 + languageName: node + linkType: hard + +"mkdirp@npm:^1.0.3": + version: 1.0.4 + resolution: "mkdirp@npm:1.0.4" + bin: + mkdirp: bin/cmd.js + checksum: a96865108c6c3b1b8e1d5e9f11843de1e077e57737602de1b82030815f311be11f96f09cce59bd5b903d0b29834733e5313f9301e3ed6d6f6fba2eae0df4298f + languageName: node + linkType: hard + +"ms@npm:2.1.2": + version: 2.1.2 + resolution: "ms@npm:2.1.2" + checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f + languageName: node + linkType: hard + +"ms@npm:^2.0.0, ms@npm:^2.1.1": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d + languageName: node + linkType: hard + +"natural-compare@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare@npm:1.4.0" + checksum: 23ad088b08f898fc9b53011d7bb78ec48e79de7627e01ab5518e806033861bef68d5b0cd0e2205c2f36690ac9571ff6bcb05eb777ced2eeda8d4ac5b44592c3d + languageName: node + linkType: hard + +"negotiator@npm:^0.6.3": + version: 0.6.3 + resolution: "negotiator@npm:0.6.3" + checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 9.4.0 + resolution: "node-gyp@npm:9.4.0" + dependencies: + env-paths: ^2.2.0 + exponential-backoff: ^3.1.1 + glob: ^7.1.4 + graceful-fs: ^4.2.6 + make-fetch-happen: ^11.0.3 + nopt: ^6.0.0 + npmlog: ^6.0.0 + rimraf: ^3.0.2 + semver: ^7.3.5 + tar: ^6.1.2 + which: ^2.0.2 + bin: + node-gyp: bin/node-gyp.js + checksum: 78b404e2e0639d64e145845f7f5a3cb20c0520cdaf6dda2f6e025e9b644077202ea7de1232396ba5bde3fee84cdc79604feebe6ba3ec84d464c85d407bb5da99 + languageName: node + linkType: hard + +"nodemon@npm:^3.0.1": + version: 3.0.1 + resolution: "nodemon@npm:3.0.1" + dependencies: + chokidar: ^3.5.2 + debug: ^3.2.7 + ignore-by-default: ^1.0.1 + minimatch: ^3.1.2 + pstree.remy: ^1.1.8 + semver: ^7.5.3 + simple-update-notifier: ^2.0.0 + supports-color: ^5.5.0 + touch: ^3.1.0 + undefsafe: ^2.0.5 + bin: + nodemon: bin/nodemon.js + checksum: 6a5d81855760d6617049eccce10ccf02bddb482dab13ceea5280ae595ec7004eee13e7b934368e3f46c37fe4d970342a8c38c99cae7e93e4d7a3ed1c1ecb6acf + languageName: node + linkType: hard + +"nopt@npm:^6.0.0": + version: 6.0.0 + resolution: "nopt@npm:6.0.0" + dependencies: + abbrev: ^1.0.0 + bin: + nopt: bin/nopt.js + checksum: 82149371f8be0c4b9ec2f863cc6509a7fd0fa729929c009f3a58e4eb0c9e4cae9920e8f1f8eb46e7d032fec8fb01bede7f0f41a67eb3553b7b8e14fa53de1dac + languageName: node + linkType: hard + +"nopt@npm:~1.0.10": + version: 1.0.10 + resolution: "nopt@npm:1.0.10" + dependencies: + abbrev: 1 + bin: + nopt: ./bin/nopt.js + checksum: f62575aceaa3be43f365bf37a596b89bbac2e796b001b6d2e2a85c2140a4e378ff919e2753ccba959c4fd344776fc88c29b393bc167fa939fb1513f126f4cd45 + languageName: node + linkType: hard + +"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 + languageName: node + linkType: hard + +"npmlog@npm:^6.0.0": + version: 6.0.2 + resolution: "npmlog@npm:6.0.2" + dependencies: + are-we-there-yet: ^3.0.0 + console-control-strings: ^1.1.0 + gauge: ^4.0.3 + set-blocking: ^2.0.0 + checksum: ae238cd264a1c3f22091cdd9e2b106f684297d3c184f1146984ecbe18aaa86343953f26b9520dedd1b1372bc0316905b736c1932d778dbeb1fcf5a1001390e2a + languageName: node + linkType: hard + +"once@npm:^1.3.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: 1 + checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 + languageName: node + linkType: hard + +"optionator@npm:^0.9.3": + version: 0.9.3 + resolution: "optionator@npm:0.9.3" + 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 + checksum: 09281999441f2fe9c33a5eeab76700795365a061563d66b098923eb719251a42bdbe432790d35064d0816ead9296dbeb1ad51a733edf4167c96bd5d0882e428a + languageName: node + linkType: hard + +"p-limit@npm:^3.0.2": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" + dependencies: + yocto-queue: ^0.1.0 + checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 + languageName: node + linkType: hard + +"p-locate@npm:^5.0.0": + version: 5.0.0 + resolution: "p-locate@npm:5.0.0" + dependencies: + p-limit: ^3.0.2 + checksum: 1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3 + languageName: node + linkType: hard + +"p-map@npm:^4.0.0": + version: 4.0.0 + resolution: "p-map@npm:4.0.0" + dependencies: + aggregate-error: ^3.0.0 + checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c + languageName: node + linkType: hard + +"parent-module@npm:^1.0.0": + version: 1.0.1 + resolution: "parent-module@npm:1.0.1" + dependencies: + callsites: ^3.0.0 + checksum: 6ba8b255145cae9470cf5551eb74be2d22281587af787a2626683a6c20fbb464978784661478dd2a3f1dad74d1e802d403e1b03c1a31fab310259eec8ac560ff + languageName: node + linkType: hard + +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 + languageName: node + linkType: hard + +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 + languageName: node + linkType: hard + +"path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 + languageName: node + linkType: hard + +"path-scurry@npm:^1.10.1": + version: 1.10.1 + resolution: "path-scurry@npm:1.10.1" + dependencies: + lru-cache: ^9.1.1 || ^10.0.0 + minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 + checksum: e2557cff3a8fb8bc07afdd6ab163a92587884f9969b05bbbaf6fe7379348bfb09af9ed292af12ed32398b15fb443e81692047b786d1eeb6d898a51eb17ed7d90 + languageName: node + linkType: hard + +"path-type@npm:^4.0.0": + version: 4.0.0 + resolution: "path-type@npm:4.0.0" + checksum: 5b1e2daa247062061325b8fdbfd1fb56dde0a448fb1455453276ea18c60685bdad23a445dc148cf87bc216be1573357509b7d4060494a6fd768c7efad833ee45 + languageName: node + linkType: hard + +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf + languageName: node + linkType: hard + +"prelude-ls@npm:^1.2.1": + version: 1.2.1 + resolution: "prelude-ls@npm:1.2.1" + checksum: cd192ec0d0a8e4c6da3bb80e4f62afe336df3f76271ac6deb0e6a36187133b6073a19e9727a1ff108cd8b9982e4768850d413baa71214dd80c7979617dca827a + languageName: node + linkType: hard + +"prettier@npm:^3.0.3": + version: 3.0.3 + resolution: "prettier@npm:3.0.3" + bin: + prettier: bin/prettier.cjs + checksum: e10b9af02b281f6c617362ebd2571b1d7fc9fb8a3bd17e371754428cda992e5e8d8b7a046e8f7d3e2da1dcd21aa001e2e3c797402ebb6111b5cd19609dd228e0 + languageName: node + linkType: hard + +"promise-retry@npm:^2.0.1": + version: 2.0.1 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: ^2.0.2 + retry: ^0.12.0 + checksum: f96a3f6d90b92b568a26f71e966cbbc0f63ab85ea6ff6c81284dc869b41510e6cdef99b6b65f9030f0db422bf7c96652a3fff9f2e8fb4a0f069d8f4430359429 + languageName: node + linkType: hard + +"pstree.remy@npm:^1.1.8": + version: 1.1.8 + resolution: "pstree.remy@npm:1.1.8" + checksum: 5cb53698d6bb34dfb278c8a26957964aecfff3e161af5fbf7cee00bbe9d8547c7aced4bd9cb193bce15fb56e9e4220fc02a5bf9c14345ffb13a36b858701ec2d + languageName: node + linkType: hard + +"punycode@npm:^2.1.0": + version: 2.3.0 + resolution: "punycode@npm:2.3.0" + checksum: 39f760e09a2a3bbfe8f5287cf733ecdad69d6af2fe6f97ca95f24b8921858b91e9ea3c9eeec6e08cede96181b3bb33f95c6ffd8c77e63986508aa2e8159fa200 + languageName: node + linkType: hard + +"queue-microtask@npm:^1.2.2": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 + languageName: node + linkType: hard + +"readable-stream@npm:^3.6.0": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" + dependencies: + inherits: ^2.0.3 + string_decoder: ^1.1.1 + util-deprecate: ^1.0.1 + checksum: bdcbe6c22e846b6af075e32cf8f4751c2576238c5043169a1c221c92ee2878458a816a4ea33f4c67623c0b6827c8a400409bfb3cf0bf3381392d0b1dfb52ac8d + languageName: node + linkType: hard + +"readdirp@npm:~3.6.0": + version: 3.6.0 + resolution: "readdirp@npm:3.6.0" + dependencies: + picomatch: ^2.2.1 + checksum: 1ced032e6e45670b6d7352d71d21ce7edf7b9b928494dcaba6f11fba63180d9da6cd7061ebc34175ffda6ff529f481818c962952004d273178acd70f7059b320 + languageName: node + linkType: hard + +"resolve-from@npm:^4.0.0": + version: 4.0.0 + resolution: "resolve-from@npm:4.0.0" + checksum: f4ba0b8494846a5066328ad33ef8ac173801a51739eb4d63408c847da9a2e1c1de1e6cbbf72699211f3d13f8fc1325648b169bd15eb7da35688e30a5fb0e4a7f + languageName: node + linkType: hard + +"retry@npm:^0.12.0": + version: 0.12.0 + resolution: "retry@npm:0.12.0" + checksum: 623bd7d2e5119467ba66202d733ec3c2e2e26568074923bc0585b6b99db14f357e79bdedb63cab56cec47491c4a0da7e6021a7465ca6dc4f481d3898fdd3158c + languageName: node + linkType: hard + +"reusify@npm:^1.0.4": + version: 1.0.4 + resolution: "reusify@npm:1.0.4" + checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc + languageName: node + linkType: hard + +"rimraf@npm:^3.0.2": + version: 3.0.2 + resolution: "rimraf@npm:3.0.2" + dependencies: + glob: ^7.1.3 + bin: + rimraf: bin.js + checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 + languageName: node + linkType: hard + +"run-parallel@npm:^1.1.9": + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" + dependencies: + queue-microtask: ^1.2.2 + checksum: cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d + languageName: node + linkType: hard + +"safe-buffer@npm:~5.2.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 + languageName: node + linkType: hard + +"semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4": + version: 7.5.4 + resolution: "semver@npm:7.5.4" + dependencies: + lru-cache: ^6.0.0 + bin: + semver: bin/semver.js + checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 + languageName: node + linkType: hard + +"set-blocking@npm:^2.0.0": + version: 2.0.0 + resolution: "set-blocking@npm:2.0.0" + checksum: 6e65a05f7cf7ebdf8b7c75b101e18c0b7e3dff4940d480efed8aad3a36a4005140b660fa1d804cb8bce911cac290441dc728084a30504d3516ac2ff7ad607b02 + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: ^3.0.0 + checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 + languageName: node + linkType: hard + +"signal-exit@npm:^3.0.7": + version: 3.0.7 + resolution: "signal-exit@npm:3.0.7" + checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 + languageName: node + linkType: hard + +"signal-exit@npm:^4.0.1": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: 64c757b498cb8629ffa5f75485340594d2f8189e9b08700e69199069c8e3070fb3e255f7ab873c05dc0b3cec412aea7402e10a5990cb6a050bd33ba062a6c549 + languageName: node + linkType: hard + +"simple-update-notifier@npm:^2.0.0": + version: 2.0.0 + resolution: "simple-update-notifier@npm:2.0.0" + dependencies: + semver: ^7.5.3 + checksum: 9ba00d38ce6a29682f64a46213834e4eb01634c2f52c813a9a7b8873ca49cdbb703696f3290f3b27dc067de6d9418b0b84bef22c3eb074acf352529b2d6c27fd + languageName: node + linkType: hard + +"slash@npm:^3.0.0": + version: 3.0.0 + resolution: "slash@npm:3.0.0" + checksum: 94a93fff615f25a999ad4b83c9d5e257a7280c90a32a7cb8b4a87996e4babf322e469c42b7f649fd5796edd8687652f3fb452a86dc97a816f01113183393f11c + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^7.0.0": + version: 7.0.0 + resolution: "socks-proxy-agent@npm:7.0.0" + dependencies: + agent-base: ^6.0.2 + debug: ^4.3.3 + socks: ^2.6.2 + checksum: 720554370154cbc979e2e9ce6a6ec6ced205d02757d8f5d93fe95adae454fc187a5cbfc6b022afab850a5ce9b4c7d73e0f98e381879cf45f66317a4895953846 + languageName: node + linkType: hard + +"socks@npm:^2.6.2": + version: 2.7.1 + resolution: "socks@npm:2.7.1" + dependencies: + ip: ^2.0.0 + smart-buffer: ^4.2.0 + checksum: 259d9e3e8e1c9809a7f5c32238c3d4d2a36b39b83851d0f573bfde5f21c4b1288417ce1af06af1452569cd1eb0841169afd4998f0e04ba04656f6b7f0e46d748 + languageName: node + linkType: hard + +"ssri@npm:^10.0.0": + version: 10.0.5 + resolution: "ssri@npm:10.0.5" + dependencies: + minipass: ^7.0.3 + checksum: 0a31b65f21872dea1ed3f7c200d7bc1c1b91c15e419deca14f282508ba917cbb342c08a6814c7f68ca4ca4116dd1a85da2bbf39227480e50125a1ceffeecb750 + languageName: node + linkType: hard + +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.3": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: ^8.0.0 + is-fullwidth-code-point: ^3.0.0 + strip-ansi: ^6.0.1 + checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb + languageName: node + linkType: hard + +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: ^0.2.0 + emoji-regex: ^9.2.2 + strip-ansi: ^7.0.1 + checksum: 7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 + languageName: node + linkType: hard + +"string_decoder@npm:^1.1.1": + version: 1.3.0 + resolution: "string_decoder@npm:1.3.0" + dependencies: + safe-buffer: ~5.2.0 + checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 + languageName: node + linkType: hard + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: ^5.0.1 + checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c + languageName: node + linkType: hard + +"strip-ansi@npm:^7.0.1": + version: 7.1.0 + resolution: "strip-ansi@npm:7.1.0" + dependencies: + ansi-regex: ^6.0.1 + checksum: 859c73fcf27869c22a4e4d8c6acfe690064659e84bef9458aa6d13719d09ca88dcfd40cbf31fd0be63518ea1a643fe070b4827d353e09533a5b0b9fd4553d64d + languageName: node + linkType: hard + +"strip-json-comments@npm:^3.1.1": + version: 3.1.1 + resolution: "strip-json-comments@npm:3.1.1" + checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 + languageName: node + linkType: hard + +"supports-color@npm:^5.5.0": + version: 5.5.0 + resolution: "supports-color@npm:5.5.0" + dependencies: + has-flag: ^3.0.0 + checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac + languageName: node + linkType: hard + +"supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: ^4.0.0 + checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a + languageName: node + linkType: hard + +"tar@npm:^6.1.11, tar@npm:^6.1.2": + version: 6.2.0 + resolution: "tar@npm:6.2.0" + dependencies: + chownr: ^2.0.0 + fs-minipass: ^2.0.0 + minipass: ^5.0.0 + minizlib: ^2.1.1 + mkdirp: ^1.0.3 + yallist: ^4.0.0 + checksum: db4d9fe74a2082c3a5016630092c54c8375ff3b280186938cfd104f2e089c4fd9bad58688ef6be9cf186a889671bf355c7cda38f09bbf60604b281715ca57f5c + languageName: node + linkType: hard + +"text-table@npm:^0.2.0": + version: 0.2.0 + resolution: "text-table@npm:0.2.0" + checksum: b6937a38c80c7f84d9c11dd75e49d5c44f71d95e810a3250bd1f1797fc7117c57698204adf676b71497acc205d769d65c16ae8fa10afad832ae1322630aef10a + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: ^7.0.0 + checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed + languageName: node + linkType: hard + +"touch@npm:^3.1.0": + version: 3.1.0 + resolution: "touch@npm:3.1.0" + dependencies: + nopt: ~1.0.10 + bin: + nodetouch: ./bin/nodetouch.js + checksum: e0be589cb5b0e6dbfce6e7e077d4a0d5f0aba558ef769c6d9c33f635e00d73d5be49da6f8631db302ee073919d82b5b7f56da2987feb28765c95a7673af68647 + languageName: node + linkType: hard + +"ts-api-utils@npm:^1.0.1": + version: 1.0.3 + resolution: "ts-api-utils@npm:1.0.3" + peerDependencies: + typescript: ">=4.2.0" + checksum: 441cc4489d65fd515ae6b0f4eb8690057add6f3b6a63a36073753547fb6ce0c9ea0e0530220a0b282b0eec535f52c4dfc315d35f8a4c9a91c0def0707a714ca6 + languageName: node + linkType: hard + +"ts-node@npm:^10.9.1": + version: 10.9.1 + resolution: "ts-node@npm:10.9.1" + dependencies: + "@cspotcode/source-map-support": ^0.8.0 + "@tsconfig/node10": ^1.0.7 + "@tsconfig/node12": ^1.0.7 + "@tsconfig/node14": ^1.0.0 + "@tsconfig/node16": ^1.0.2 + acorn: ^8.4.1 + acorn-walk: ^8.1.1 + arg: ^4.1.0 + create-require: ^1.1.0 + diff: ^4.0.1 + make-error: ^1.1.1 + v8-compile-cache-lib: ^3.0.1 + yn: 3.1.1 + peerDependencies: + "@swc/core": ">=1.2.50" + "@swc/wasm": ">=1.2.50" + "@types/node": "*" + typescript: ">=2.7" + peerDependenciesMeta: + "@swc/core": + optional: true + "@swc/wasm": + optional: true + bin: + ts-node: dist/bin.js + ts-node-cwd: dist/bin-cwd.js + ts-node-esm: dist/bin-esm.js + ts-node-script: dist/bin-script.js + ts-node-transpile-only: dist/bin-transpile.js + ts-script: dist/bin-script-deprecated.js + checksum: 090adff1302ab20bd3486e6b4799e90f97726ed39e02b39e566f8ab674fd5bd5f727f43615debbfc580d33c6d9d1c6b1b3ce7d8e3cca3e20530a145ffa232c35 + languageName: node + linkType: hard + +"type-check@npm:^0.4.0, type-check@npm:~0.4.0": + version: 0.4.0 + resolution: "type-check@npm:0.4.0" + dependencies: + prelude-ls: ^1.2.1 + checksum: ec688ebfc9c45d0c30412e41ca9c0cdbd704580eb3a9ccf07b9b576094d7b86a012baebc95681999dd38f4f444afd28504cb3a89f2ef16b31d4ab61a0739025a + languageName: node + linkType: hard + +"type-fest@npm:^0.20.2": + version: 0.20.2 + resolution: "type-fest@npm:0.20.2" + checksum: 4fb3272df21ad1c552486f8a2f8e115c09a521ad7a8db3d56d53718d0c907b62c6e9141ba5f584af3f6830d0872c521357e512381f24f7c44acae583ad517d73 + languageName: node + linkType: hard + +"typescript@npm:^5.2.2": + version: 5.2.2 + resolution: "typescript@npm:5.2.2" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 7912821dac4d962d315c36800fe387cdc0a6298dba7ec171b350b4a6e988b51d7b8f051317786db1094bd7431d526b648aba7da8236607febb26cf5b871d2d3c + languageName: node + linkType: hard + +"typescript@patch:typescript@^5.2.2#~builtin": + version: 5.2.2 + resolution: "typescript@patch:typescript@npm%3A5.2.2#~builtin::version=5.2.2&hash=7ad353" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 07106822b4305de3f22835cbba949a2b35451cad50888759b6818421290ff95d522b38ef7919e70fb381c5fe9c1c643d7dea22c8b31652a717ddbd57b7f4d554 + languageName: node + linkType: hard + +"undefsafe@npm:^2.0.5": + version: 2.0.5 + resolution: "undefsafe@npm:2.0.5" + checksum: f42ab3b5770fedd4ada175fc1b2eb775b78f609156f7c389106aafd231bfc210813ee49f54483d7191d7b76e483bc7f537b5d92d19ded27156baf57592eb02cc + languageName: node + linkType: hard + +"unique-filename@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-filename@npm:3.0.0" + dependencies: + unique-slug: ^4.0.0 + checksum: 8e2f59b356cb2e54aab14ff98a51ac6c45781d15ceaab6d4f1c2228b780193dc70fae4463ce9e1df4479cb9d3304d7c2043a3fb905bdeca71cc7e8ce27e063df + languageName: node + linkType: hard + +"unique-slug@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-slug@npm:4.0.0" + dependencies: + imurmurhash: ^0.1.4 + checksum: 0884b58365af59f89739e6f71e3feacb5b1b41f2df2d842d0757933620e6de08eff347d27e9d499b43c40476cbaf7988638d3acb2ffbcb9d35fd035591adfd15 + languageName: node + linkType: hard + +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: ^2.1.0 + checksum: 7167432de6817fe8e9e0c9684f1d2de2bb688c94388f7569f7dbdb1587c9f4ca2a77962f134ec90be0cc4d004c939ff0d05acc9f34a0db39a3c797dada262633 + languageName: node + linkType: hard + +"util-deprecate@npm:^1.0.1": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 + languageName: node + linkType: hard + +"v8-compile-cache-lib@npm:^3.0.1": + version: 3.0.1 + resolution: "v8-compile-cache-lib@npm:3.0.1" + checksum: 78089ad549e21bcdbfca10c08850022b22024cdcc2da9b168bcf5a73a6ed7bf01a9cebb9eac28e03cd23a684d81e0502797e88f3ccd27a32aeab1cfc44c39da0 + languageName: node + linkType: hard + +"viem@npm:^1.16.5": + version: 1.16.5 + resolution: "viem@npm:1.16.5" + dependencies: + "@adraffy/ens-normalize": 1.9.4 + "@noble/curves": 1.2.0 + "@noble/hashes": 1.3.2 + "@scure/bip32": 1.3.2 + "@scure/bip39": 1.2.1 + abitype: 0.9.8 + isows: 1.0.3 + ws: 8.13.0 + peerDependencies: + typescript: ">=5.0.4" + peerDependenciesMeta: + typescript: + optional: true + checksum: cc07bbc8ebf616c2cc6e14f08eea59d1b34df294d1dcba72090bf10e224e87c17014db593bcff223fe6c7c30999448d786d67d9e18691906f51900db940af821 + languageName: node + linkType: hard + +"which@npm:^2.0.1, which@npm:^2.0.2": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: ^2.0.0 + bin: + node-which: ./bin/node-which + checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 + languageName: node + linkType: hard + +"wide-align@npm:^1.1.5": + version: 1.1.5 + resolution: "wide-align@npm:1.1.5" + dependencies: + string-width: ^1.0.2 || 2 || 3 || 4 + checksum: d5fc37cd561f9daee3c80e03b92ed3e84d80dde3365a8767263d03dacfc8fa06b065ffe1df00d8c2a09f731482fcacae745abfbb478d4af36d0a891fad4834d3 + languageName: node + linkType: hard + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: ^4.0.0 + string-width: ^4.1.0 + strip-ansi: ^6.0.0 + checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: ^6.1.0 + string-width: ^5.0.1 + strip-ansi: ^7.0.1 + checksum: 371733296dc2d616900ce15a0049dca0ef67597d6394c57347ba334393599e800bab03c41d4d45221b6bc967b8c453ec3ae4749eff3894202d16800fdfe0e238 + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 + languageName: node + linkType: hard + +"ws@npm:8.13.0": + version: 8.13.0 + resolution: "ws@npm:8.13.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 53e991bbf928faf5dc6efac9b8eb9ab6497c69feeb94f963d648b7a3530a720b19ec2e0ec037344257e05a4f35bd9ad04d9de6f289615ffb133282031b18c61c + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 + languageName: node + linkType: hard + +"yn@npm:3.1.1": + version: 3.1.1 + resolution: "yn@npm:3.1.1" + checksum: 2c487b0e149e746ef48cda9f8bad10fc83693cd69d7f9dcd8be4214e985de33a29c9e24f3c0d6bcf2288427040a8947406ab27f7af67ee9456e6b84854f02dd6 + languageName: node + linkType: hard + +"yocto-queue@npm:^0.1.0": + version: 0.1.0 + resolution: "yocto-queue@npm:0.1.0" + checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 + languageName: node + linkType: hard From e7b600a04bd6c2a4675a591bd47a8188743319eb Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Sun, 15 Oct 2023 12:10:10 +0800 Subject: [PATCH 002/297] create ABI and AMBHeaderReporterCall script --- packages/reporter/.env.example | 13 + .../ABIs/SygmaReporterContractABI.json | 217 ++++++++ .../reporter/ABIs/ambReporterContractABI.json | 98 ++++ .../reporter/ABIs/telepathyAdapterABI.json | 229 ++++++++ .../reporter/ABIs/telepathyContractABI.json | 497 ++++++++++++++++++ .../ABIs/wormholeReporterContractABI.json | 76 +++ packages/reporter/package.json | 1 + .../reporter/src/AMBHeaderReporterCaller.js | 57 ++ packages/reporter/yarn.lock | 53 +- 9 files changed, 1224 insertions(+), 17 deletions(-) create mode 100644 packages/reporter/ABIs/SygmaReporterContractABI.json create mode 100644 packages/reporter/ABIs/ambReporterContractABI.json create mode 100644 packages/reporter/ABIs/telepathyAdapterABI.json create mode 100644 packages/reporter/ABIs/telepathyContractABI.json create mode 100644 packages/reporter/ABIs/wormholeReporterContractABI.json create mode 100644 packages/reporter/src/AMBHeaderReporterCaller.js diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index e69de29b..79724ee9 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -0,0 +1,13 @@ +PRIVATE_KEY=xxxxxxxxxxx01 +SOURCE_RPC_URL=https://goerli.infura.io/v3/xxxxxxxxxx1 +DEST_RPC_URL=https://rpc.gnosischain.com +AMB_REPORTER_CONTRACT_ADDRESS=0xedc0b1d3de4496e0d917af42f29cb71eb2982319 +SYGMA_REPORTER_CONTRACT_ADDRESS=0x2f96d347c932ac73b56e9352ecc0707e25173d88 +SYGMA_ADAPTER_ADDRESS=0x9AD7a6f4FDA8247cC0bF5932B68c5b619937dB15 +SYGMA_DEST_DOMAIN_ID=100 +SYGMA_FEE_DATA=0x +TELEPATHY_CONTRACT_ADDRESS=0x34b5378DE786389a477b40dD710812c250185f83 +TELEPATHY_ADAPTER_ADDRESS=0x2f1E51a2763FB67fe09971Fd8d849716137A3357 +TELEPATHY_PROOF_API_URL=https://api.telepathy.xyz/api/hashi/ +AMB_ADAPTER=0x01268DB05965CeAc2a89566c42CD550ED7eE5ECD +GAS=300000 \ No newline at end of file diff --git a/packages/reporter/ABIs/SygmaReporterContractABI.json b/packages/reporter/ABIs/SygmaReporterContractABI.json new file mode 100644 index 00000000..790e9b7f --- /dev/null +++ b/packages/reporter/ABIs/SygmaReporterContractABI.json @@ -0,0 +1,217 @@ +[ + { + "inputs": [ + { + "internalType": "contract IBridge", + "name": "bridge", + "type": "address" + }, + { + "internalType": "contract HeaderStorage", + "name": "headerStorage", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "resourceID", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "defaultDestinationDomainID", + "type": "uint8" + }, + { + "internalType": "address", + "name": "defaultSygmaAdapter", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "emitter", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "blockHeader", + "type": "bytes32" + } + ], + "name": "HeaderReported", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "blockNumbers", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "feeData", + "type": "bytes" + } + ], + "name": "reportHeaders", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "blockNumbers", + "type": "uint256[]" + }, + { + "internalType": "address", + "name": "sygmaAdapter", + "type": "address" + }, + { + "internalType": "uint8", + "name": "destinationDomainID", + "type": "uint8" + }, + { + "internalType": "bytes", + "name": "feeData", + "type": "bytes" + } + ], + "name": "reportHeadersToDomain", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "_bridge", + "outputs": [ + { + "internalType": "contract IBridge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_defaultDestinationDomainID", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_defaultSygmaAdapter", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_headerStorage", + "outputs": [ + { + "internalType": "contract HeaderStorage", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_resourceID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "blockNumbers", + "type": "uint256[]" + }, + { + "internalType": "bytes32[]", + "name": "blockHeaders", + "type": "bytes32[]" + } + ], + "name": "prepareDepositData", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "input", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "position", + "type": "uint256" + } + ], + "name": "slice", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "pure", + "type": "function" + } +] \ No newline at end of file diff --git a/packages/reporter/ABIs/ambReporterContractABI.json b/packages/reporter/ABIs/ambReporterContractABI.json new file mode 100644 index 00000000..75aa8d11 --- /dev/null +++ b/packages/reporter/ABIs/ambReporterContractABI.json @@ -0,0 +1,98 @@ +[ + { + "inputs": [ + { + "internalType": "contract IAMB", + "name": "_amb", + "type": "address" + }, + { + "internalType": "contract HeaderStorage", + "name": "_headerStorage", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "emitter", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "blockHeader", + "type": "bytes32" + } + ], + "name": "HeaderReported", + "type": "event" + }, + { + "inputs": [], + "name": "amb", + "outputs": [ + { + "internalType": "contract IAMB", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "headerStorage", + "outputs": [ + { + "internalType": "contract HeaderStorage", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "blockNumbers", + "type": "uint256[]" + }, + { + "internalType": "address", + "name": "ambAdapter", + "type": "address" + }, + { + "internalType": "uint256", + "name": "gas", + "type": "uint256" + } + ], + "name": "reportHeaders", + "outputs": [ + { + "internalType": "bytes32", + "name": "receipt", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ] \ No newline at end of file diff --git a/packages/reporter/ABIs/telepathyAdapterABI.json b/packages/reporter/ABIs/telepathyAdapterABI.json new file mode 100644 index 00000000..3fdada32 --- /dev/null +++ b/packages/reporter/ABIs/telepathyAdapterABI.json @@ -0,0 +1,229 @@ +[ + { + "type": "constructor", + "stateMutability": "nonpayable", + "inputs": [ + { + "type": "address", + "name": "_telepathyRouter", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "BlockHeaderNotAvailable", + "inputs": [ + { + "type": "uint256", + "name": "slot", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ConflictingBlockHeader", + "inputs": [ + { + "type": "uint256", + "name": "blockNumber", + "internalType": "uint256" + }, + { + "type": "bytes32", + "name": "reportedBlockHash", + "internalType": "bytes32" + }, + { + "type": "bytes32", + "name": "storedBlockHash", + "internalType": "bytes32" + } + ] + }, + { + "type": "error", + "name": "InconsistentLightClient", + "inputs": [ + { + "type": "address", + "name": "lightClient", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "InvalidBlockHashProof", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidBlockHeaderLength", + "inputs": [ + { + "type": "uint256", + "name": "length", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "InvalidBlockHeaderRLP", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidBlockNumberProof", + "inputs": [] + }, + { + "type": "error", + "name": "NoLightClientOnChain", + "inputs": [ + { + "type": "uint32", + "name": "chainId", + "internalType": "uint32" + } + ] + }, + { + "type": "event", + "name": "HashStored", + "inputs": [ + { + "type": "uint256", + "name": "id", + "internalType": "uint256", + "indexed": true + }, + { + "type": "bytes32", + "name": "hashes", + "internalType": "bytes32", + "indexed": true + } + ], + "anonymous": false + }, + { + "type": "function", + "stateMutability": "view", + "outputs": [ + { + "type": "bytes32", + "name": "hash", + "internalType": "bytes32" + } + ], + "name": "getHashFromOracle", + "inputs": [ + { + "type": "uint256", + "name": "domain", + "internalType": "uint256" + }, + { + "type": "uint256", + "name": "id", + "internalType": "uint256" + } + ] + }, + { + "type": "function", + "stateMutability": "view", + "outputs": [ + { + "type": "bytes32", + "name": "", + "internalType": "bytes32" + } + ], + "name": "hashes", + "inputs": [ + { + "type": "uint256", + "name": "", + "internalType": "uint256" + }, + { + "type": "uint256", + "name": "", + "internalType": "uint256" + } + ] + }, + { + "type": "function", + "stateMutability": "nonpayable", + "outputs": [], + "name": "proveAncestralBlockHashes", + "inputs": [ + { + "type": "uint256", + "name": "chainId", + "internalType": "uint256" + }, + { + "type": "bytes[]", + "name": "blockHeaders", + "internalType": "bytes[]" + } + ] + }, + { + "type": "function", + "stateMutability": "nonpayable", + "outputs": [], + "name": "storeBlockHeader", + "inputs": [ + { + "type": "uint32", + "name": "_chainId", + "internalType": "uint32" + }, + { + "type": "uint64", + "name": "_slot", + "internalType": "uint64" + }, + { + "type": "uint256", + "name": "_blockNumber", + "internalType": "uint256" + }, + { + "type": "bytes32[]", + "name": "_blockNumberProof", + "internalType": "bytes32[]" + }, + { + "type": "bytes32", + "name": "_blockHash", + "internalType": "bytes32" + }, + { + "type": "bytes32[]", + "name": "_blockHashProof", + "internalType": "bytes32[]" + } + ] + }, + { + "type": "function", + "stateMutability": "view", + "outputs": [ + { + "type": "address", + "name": "", + "internalType": "address" + } + ], + "name": "telepathyRouter", + "inputs": [] + } + ] \ No newline at end of file diff --git a/packages/reporter/ABIs/telepathyContractABI.json b/packages/reporter/ABIs/telepathyContractABI.json new file mode 100644 index 00000000..51b62d40 --- /dev/null +++ b/packages/reporter/ABIs/telepathyContractABI.json @@ -0,0 +1,497 @@ +[ + { + "inputs": [ + { + "internalType": "bytes32", + "name": "genesisValidatorsRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "genesisTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "secondsPerSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "slotsPerPeriod", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "syncCommitteePeriod", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "syncCommitteePoseidon", + "type": "bytes32" + }, + { + "internalType": "uint32", + "name": "sourceChainId", + "type": "uint32" + }, + { + "internalType": "uint16", + "name": "finalityThreshold", + "type": "uint16" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "slot", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "root", + "type": "bytes32" + } + ], + "name": "HeadUpdate", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "period", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "root", + "type": "bytes32" + } + ], + "name": "SyncCommitteeUpdate", + "type": "event" + }, + { + "inputs": [], + "name": "FINALITY_THRESHOLD", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "GENESIS_TIME", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "GENESIS_VALIDATORS_ROOT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SECONDS_PER_SLOT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SLOTS_PER_PERIOD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SOURCE_CHAIN_ID", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "consistent", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "executionStateRoots", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "head", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "headers", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "uint256", + "name": "attestedSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "finalizedSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "participation", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "finalizedHeaderRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "executionStateRoot", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "uint256[2]", + "name": "a", + "type": "uint256[2]" + }, + { + "internalType": "uint256[2][2]", + "name": "b", + "type": "uint256[2][2]" + }, + { + "internalType": "uint256[2]", + "name": "c", + "type": "uint256[2]" + } + ], + "internalType": "struct Groth16Proof", + "name": "proof", + "type": "tuple" + } + ], + "internalType": "struct LightClientStep", + "name": "step", + "type": "tuple" + }, + { + "internalType": "bytes32", + "name": "syncCommitteeSSZ", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "syncCommitteePoseidon", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "uint256[2]", + "name": "a", + "type": "uint256[2]" + }, + { + "internalType": "uint256[2][2]", + "name": "b", + "type": "uint256[2][2]" + }, + { + "internalType": "uint256[2]", + "name": "c", + "type": "uint256[2]" + } + ], + "internalType": "struct Groth16Proof", + "name": "proof", + "type": "tuple" + } + ], + "internalType": "struct LightClientRotate", + "name": "update", + "type": "tuple" + } + ], + "name": "rotate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "attestedSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "finalizedSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "participation", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "finalizedHeaderRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "executionStateRoot", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "uint256[2]", + "name": "a", + "type": "uint256[2]" + }, + { + "internalType": "uint256[2][2]", + "name": "b", + "type": "uint256[2][2]" + }, + { + "internalType": "uint256[2]", + "name": "c", + "type": "uint256[2]" + } + ], + "internalType": "struct Groth16Proof", + "name": "proof", + "type": "tuple" + } + ], + "internalType": "struct LightClientStep", + "name": "update", + "type": "tuple" + } + ], + "name": "step", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "syncCommitteePoseidons", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "timestamps", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[2]", + "name": "a", + "type": "uint256[2]" + }, + { + "internalType": "uint256[2][2]", + "name": "b", + "type": "uint256[2][2]" + }, + { + "internalType": "uint256[2]", + "name": "c", + "type": "uint256[2]" + }, + { + "internalType": "uint256[65]", + "name": "input", + "type": "uint256[65]" + } + ], + "name": "verifyProofRotate", + "outputs": [ + { + "internalType": "bool", + "name": "r", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[2]", + "name": "a", + "type": "uint256[2]" + }, + { + "internalType": "uint256[2][2]", + "name": "b", + "type": "uint256[2][2]" + }, + { + "internalType": "uint256[2]", + "name": "c", + "type": "uint256[2]" + }, + { + "internalType": "uint256[1]", + "name": "input", + "type": "uint256[1]" + } + ], + "name": "verifyProofStep", + "outputs": [ + { + "internalType": "bool", + "name": "r", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ] \ No newline at end of file diff --git a/packages/reporter/ABIs/wormholeReporterContractABI.json b/packages/reporter/ABIs/wormholeReporterContractABI.json new file mode 100644 index 00000000..f7e7d5dc --- /dev/null +++ b/packages/reporter/ABIs/wormholeReporterContractABI.json @@ -0,0 +1,76 @@ +[ + { + "inputs": [ + { + "internalType": "contract IWormhole", + "name": "_wormhole", + "type": "address" + }, + { + "internalType": "contract HeaderStorage", + "name": "_headerStorage", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "headerStorage", + "outputs": [ + { + "internalType": "contract HeaderStorage", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "oracleAdapter", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + } + ], + "name": "reportHeader", + "outputs": [ + { + "internalType": "uint64", + "name": "sequence", + "type": "uint64" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "wormhole", + "outputs": [ + { + "internalType": "contract IWormhole", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ] \ No newline at end of file diff --git a/packages/reporter/package.json b/packages/reporter/package.json index 19121e24..dac8fc67 100644 --- a/packages/reporter/package.json +++ b/packages/reporter/package.json @@ -14,6 +14,7 @@ "packageManager": "yarn@3.2.1", "dependencies": { "dotenv": "^16.3.1", + "node-cron": "^3.0.2", "viem": "^1.16.5" }, "devDependencies": { diff --git a/packages/reporter/src/AMBHeaderReporterCaller.js b/packages/reporter/src/AMBHeaderReporterCaller.js new file mode 100644 index 00000000..e349b9b1 --- /dev/null +++ b/packages/reporter/src/AMBHeaderReporterCaller.js @@ -0,0 +1,57 @@ +//Calls the AMBHeaderReporter reportHeaders() method every x hours + +// require('dotenv').config(); +// const { ethers } = require('ethers'); +// const cron = require('node-cron'); + +import { createPublicClient, http, createWalletClient } from 'viem' +import { mainnet, goerli, gnosis } from 'viem/chains' +import { privateKeyToAccount } from 'viem/accounts' +import 'dotenv/config' +import 'node-cron' + +const walletClient = createWalletClient({ + chain: goerli, + transport: http() +}) +const publicClient = createPublicClient({ + chain: goerli, + transport: http() +}) + + +const account = privateKeyToAccount(process.env.PRIVATE_KEY) +// Create an instance of the contract +const contractAddress = process.env.AMB_REPORTER_CONTRACT_ADDRESS; + +const contractABI = require('../ABIs/ambReporterContractABI.json'); + + + +// Set up the cron job to call the Solidity method every 1 hour. 24h -> '0 0 * * *' +cron.schedule('0 * * * *', async () => { + try { + // Get the latest block number + const blockNumber = await publicClient.getBlockNumber(); + console.log('Latest block number:', blockNumber); + + amb_adapter = process.env.AMB_ADAPTER; + gas = process.env.GAS; + + // Call the reportHeaders method using the contract instance + const {request} = await publicClient.simulateContract({ + account, // calling from account + address: contractAddress, + abi: contractABI, + functionName: 'reportHeaders', + args: [[blockNumber], amb_adapter, gas], + }) + ; + const txHash = await walletClient.writeContract(request); + console.log('Solidity method called successfully:', txHash); + } catch (error) { + console.error('Error calling Solidity method:', error); + } +}); + +console.log('Cron job scheduled to call the Solidity method every 1 hour.'); \ No newline at end of file diff --git a/packages/reporter/yarn.lock b/packages/reporter/yarn.lock index 32b985af..e2881934 100644 --- a/packages/reporter/yarn.lock +++ b/packages/reporter/yarn.lock @@ -570,23 +570,6 @@ __metadata: languageName: node linkType: hard -"reporter@workspace:.": - version: 0.0.0-use.local - resolution: "reporter@workspace:." - dependencies: - "@typescript-eslint/eslint-plugin": ^6.7.5 - "@typescript-eslint/parser": ^6.7.5 - dotenv: ^16.3.1 - eslint: ^8.51.0 - eslint-config-prettier: ^9.0.0 - nodemon: ^3.0.1 - prettier: ^3.0.3 - ts-node: ^10.9.1 - typescript: ^5.2.2 - viem: ^1.16.5 - languageName: unknown - linkType: soft - "brace-expansion@npm:^1.1.7": version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" @@ -1715,6 +1698,15 @@ __metadata: languageName: node linkType: hard +"node-cron@npm:^3.0.2": + version: 3.0.2 + resolution: "node-cron@npm:3.0.2" + dependencies: + uuid: 8.3.2 + checksum: dd21585c0d4069a0752022dad9b8380a4393c4783ec78355ffa99ff32b018c3743a35d4ebf9d7c7863949e94e302b440f58c884eb4960e71c7260d817e2d3f25 + languageName: node + linkType: hard + "node-gyp@npm:latest": version: 9.4.0 resolution: "node-gyp@npm:9.4.0" @@ -1968,6 +1960,24 @@ __metadata: languageName: node linkType: hard +"reporter@workspace:.": + version: 0.0.0-use.local + resolution: "reporter@workspace:." + dependencies: + "@typescript-eslint/eslint-plugin": ^6.7.5 + "@typescript-eslint/parser": ^6.7.5 + dotenv: ^16.3.1 + eslint: ^8.51.0 + eslint-config-prettier: ^9.0.0 + node-cron: ^3.0.2 + nodemon: ^3.0.1 + prettier: ^3.0.3 + ts-node: ^10.9.1 + typescript: ^5.2.2 + viem: ^1.16.5 + languageName: unknown + linkType: soft + "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" @@ -2363,6 +2373,15 @@ __metadata: languageName: node linkType: hard +"uuid@npm:8.3.2": + version: 8.3.2 + resolution: "uuid@npm:8.3.2" + bin: + uuid: dist/bin/uuid + checksum: 5575a8a75c13120e2f10e6ddc801b2c7ed7d8f3c8ac22c7ed0c7b2ba6383ec0abda88c905085d630e251719e0777045ae3236f04c812184b7c765f63a70e58df + languageName: node + linkType: hard + "v8-compile-cache-lib@npm:^3.0.1": version: 3.0.1 resolution: "v8-compile-cache-lib@npm:3.0.1" From aa96a8b047f154e788198f1309b9a7b6981bb54c Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Wed, 18 Oct 2023 17:36:35 +0800 Subject: [PATCH 003/297] WIP: first draft of reporter scripts --- packages/reporter/.env.example | 37 +- packages/reporter/README.md | 19 + packages/reporter/package-lock.json | 3224 ++++++++++++++++ packages/reporter/package.json | 3 + packages/reporter/src/ABIs/PingPongABI.json | 41 + .../ABIs/SygmaReporterContractABI.json | 0 .../ABIs/ambReporterContractABI.json | 0 .../{ => src}/ABIs/telepathyAdapterABI.json | 0 .../{ => src}/ABIs/telepathyContractABI.json | 0 .../ABIs/wormholeReporterContractABI.json | 0 packages/reporter/src/index.ts | 33 + packages/reporter/src/reporter/AMBReporter.ts | 65 + .../reporter/src/reporter/SygmaReporter.ts | 74 + .../src/reporter/TelepathyReporter.ts | 75 + packages/reporter/src/reporter/type.ts | 7 + packages/reporter/src/utils/address.json | 30 + packages/reporter/tsconfig.json | 4 +- packages/reporter/yarn.lock | 3401 +++++------------ 18 files changed, 4506 insertions(+), 2507 deletions(-) create mode 100644 packages/reporter/package-lock.json create mode 100644 packages/reporter/src/ABIs/PingPongABI.json rename packages/reporter/{ => src}/ABIs/SygmaReporterContractABI.json (100%) rename packages/reporter/{ => src}/ABIs/ambReporterContractABI.json (100%) rename packages/reporter/{ => src}/ABIs/telepathyAdapterABI.json (100%) rename packages/reporter/{ => src}/ABIs/telepathyContractABI.json (100%) rename packages/reporter/{ => src}/ABIs/wormholeReporterContractABI.json (100%) create mode 100644 packages/reporter/src/reporter/AMBReporter.ts create mode 100644 packages/reporter/src/reporter/SygmaReporter.ts create mode 100644 packages/reporter/src/reporter/TelepathyReporter.ts create mode 100644 packages/reporter/src/reporter/type.ts create mode 100644 packages/reporter/src/utils/address.json diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index 79724ee9..8f7a1a15 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -1,13 +1,32 @@ -PRIVATE_KEY=xxxxxxxxxxx01 -SOURCE_RPC_URL=https://goerli.infura.io/v3/xxxxxxxxxx1 +PRIVATE_KEY=0x0abc +SOURCE_RPC_URL= DEST_RPC_URL=https://rpc.gnosischain.com -AMB_REPORTER_CONTRACT_ADDRESS=0xedc0b1d3de4496e0d917af42f29cb71eb2982319 -SYGMA_REPORTER_CONTRACT_ADDRESS=0x2f96d347c932ac73b56e9352ecc0707e25173d88 -SYGMA_ADAPTER_ADDRESS=0x9AD7a6f4FDA8247cC0bF5932B68c5b619937dB15 -SYGMA_DEST_DOMAIN_ID=100 + SYGMA_FEE_DATA=0x -TELEPATHY_CONTRACT_ADDRESS=0x34b5378DE786389a477b40dD710812c250185f83 -TELEPATHY_ADAPTER_ADDRESS=0x2f1E51a2763FB67fe09971Fd8d849716137A3357 + TELEPATHY_PROOF_API_URL=https://api.telepathy.xyz/api/hashi/ AMB_ADAPTER=0x01268DB05965CeAc2a89566c42CD550ED7eE5ECD -GAS=300000 \ No newline at end of file +GAS=30000 + + +# If not run all, config each reporter separately +AMB_REPORTER=true +AMB_FREQUENCY=1,10,20,30,40,50 * * * * * +AMB_SOURCE_CHAIN=goerli +AMB_DEST_CHAIN=gnosis +AMB_GAS=50000 + +SYGMA_REPORTER=true +SYGMA_FREQUENCY= 1,10,20,30,40,50 * * * * * +SYGMA_SOURCE_CHAIN=goerli +SYGMA_DEST_CHAIN=gnosis +SYGMA_FEE_DATA=0x + +TELEPATHY_REPORTER=true +TELEPATHY_FREQUENCY=50000 #run every 50000ms +TELEPATHY_SOURCE_CHAIN=goerli +TELEPATHY_DEST_CHAIN=gnosis +TELEPATHY_PROOF_API_URL=https://api.telepathy.xyz/api/hashi/ + + + diff --git a/packages/reporter/README.md b/packages/reporter/README.md index 7d726673..4a378556 100644 --- a/packages/reporter/README.md +++ b/packages/reporter/README.md @@ -1 +1,20 @@ # reporter + +Script to call Header Reporter contracts of different oracle from source chain to destination chain. + +## Run the script + +1. Configure the correct node version by running `nvm use` +2. Installing packages by running `npm install` +3. Create `.env` file and define the configuration to run. +4. run `ts-node src/index.ts` + +## Configuration + +Configure the mode you want to run by editing the variable in `.env` + +1. `REPORTER` (true/false): to enable the reporter +2. `FREQUENCY` (cron job expression by default, seconds for telepathy reporterr): Define the frequency to run the + reporter script +3. `SOURCE_CHAIN` (string value of chain): Define the source chain to collect the block header from. `DEST_CHAIN` + (string value of chain): Define the destination chain to report the source chain's block header to. diff --git a/packages/reporter/package-lock.json b/packages/reporter/package-lock.json new file mode 100644 index 00000000..cd53e159 --- /dev/null +++ b/packages/reporter/package-lock.json @@ -0,0 +1,3224 @@ +{ + "name": "reporter", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "reporter", + "dependencies": { + "axios": "^1.5.1", + "dotenv": "^16.3.1", + "node-cron": "^3.0.2", + "viem": "^1.16.5" + }, + "devDependencies": { + "@types/node": "^20.8.6", + "@types/node-cron": "^3.0.9", + "@typescript-eslint/eslint-plugin": "^6.7.5", + "@typescript-eslint/parser": "^6.7.5", + "eslint": "^8.51.0", + "eslint-config-prettier": "^9.0.0", + "nodemon": "^3.0.1", + "prettier": "^3.0.3", + "ts-node": "^10.9.1", + "typescript": "^5.2.2" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@adraffy/ens-normalize": { + "version": "1.9.4", + "license": "MIT" + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.9.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.2", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.51.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.11", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@noble/curves": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.3.2", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@scure/base": { + "version": "1.1.3", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.2.0", + "@noble/hashes": "~1.3.2", + "@scure/base": "~1.1.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.3.0", + "@scure/base": "~1.1.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.13", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.8.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.6.tgz", + "integrity": "sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ==", + "dev": true, + "dependencies": { + "undici-types": "~5.25.1" + } + }, + "node_modules/@types/node-cron": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/node-cron/-/node-cron-3.0.9.tgz", + "integrity": "sha512-P10Vf+oagnMbefD31nqjS/dpBM34qzfdpvIgVZwtwsNb0Hg2lDaPFeGcyGUJIqh3zHlDMwYXGeunGgMnswgnPg==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.7.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.7.5", + "@typescript-eslint/type-utils": "6.7.5", + "@typescript-eslint/utils": "6.7.5", + "@typescript-eslint/visitor-keys": "6.7.5", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.7.5", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "6.7.5", + "@typescript-eslint/types": "6.7.5", + "@typescript-eslint/typescript-estree": "6.7.5", + "@typescript-eslint/visitor-keys": "6.7.5", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.7.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.7.5", + "@typescript-eslint/visitor-keys": "6.7.5" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.7.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "6.7.5", + "@typescript-eslint/utils": "6.7.5", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.7.5", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.7.5", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "6.7.5", + "@typescript-eslint/visitor-keys": "6.7.5", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.7.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.7.5", + "@typescript-eslint/types": "6.7.5", + "@typescript-eslint/typescript-estree": "6.7.5", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.7.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.7.5", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/abitype": { + "version": "0.9.8", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wagmi-dev" + } + ], + "license": "MIT", + "peerDependencies": { + "typescript": ">=5.0.4", + "zod": "^3 >=3.19.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-union": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.5.1", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/create-require": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.51.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.51.0", + "@humanwhocodes/config-array": "^0.11.11", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "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" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.0.0", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.15.0", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "13.23.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "license": "ISC" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/isows": { + "version": "1.0.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wagmi-dev" + } + ], + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "dev": true, + "license": "ISC" + }, + "node_modules/merge2": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/node-cron": { + "version": "3.0.2", + "license": "ISC", + "dependencies": { + "uuid": "8.3.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/nodemon": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "dev": true, + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-color/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.2.2", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "5.25.3", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", + "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==", + "dev": true + }, + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/viem": { + "version": "1.16.5", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wagmi-dev" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "1.9.4", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@scure/bip32": "1.3.2", + "@scure/bip39": "1.2.1", + "abitype": "0.9.8", + "isows": "1.0.3", + "ws": "8.13.0" + }, + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.13.0", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/yn": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "dev": true + }, + "@adraffy/ens-normalize": { + "version": "1.9.4" + }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + } + }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.9.1", + "dev": true + }, + "@eslint/eslintrc": { + "version": "2.1.2", + "dev": true, + "requires": { + "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": { + "version": "8.51.0", + "dev": true + }, + "@humanwhocodes/config-array": { + "version": "0.11.11", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "dev": true + }, + "@jridgewell/resolve-uri": { + "version": "3.1.1", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@noble/curves": { + "version": "1.2.0", + "requires": { + "@noble/hashes": "1.3.2" + } + }, + "@noble/hashes": { + "version": "1.3.2" + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@scure/base": { + "version": "1.1.3" + }, + "@scure/bip32": { + "version": "1.3.2", + "requires": { + "@noble/curves": "~1.2.0", + "@noble/hashes": "~1.3.2", + "@scure/base": "~1.1.2" + } + }, + "@scure/bip39": { + "version": "1.2.1", + "requires": { + "@noble/hashes": "~1.3.0", + "@scure/base": "~1.1.0" + } + }, + "@tsconfig/node10": { + "version": "1.0.9", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.4", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.13", + "dev": true + }, + "@types/node": { + "version": "20.8.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.6.tgz", + "integrity": "sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ==", + "dev": true, + "requires": { + "undici-types": "~5.25.1" + } + }, + "@types/node-cron": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/node-cron/-/node-cron-3.0.9.tgz", + "integrity": "sha512-P10Vf+oagnMbefD31nqjS/dpBM34qzfdpvIgVZwtwsNb0Hg2lDaPFeGcyGUJIqh3zHlDMwYXGeunGgMnswgnPg==", + "dev": true + }, + "@types/semver": { + "version": "7.5.3", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "6.7.5", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.7.5", + "@typescript-eslint/type-utils": "6.7.5", + "@typescript-eslint/utils": "6.7.5", + "@typescript-eslint/visitor-keys": "6.7.5", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/parser": { + "version": "6.7.5", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "6.7.5", + "@typescript-eslint/types": "6.7.5", + "@typescript-eslint/typescript-estree": "6.7.5", + "@typescript-eslint/visitor-keys": "6.7.5", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "6.7.5", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.7.5", + "@typescript-eslint/visitor-keys": "6.7.5" + } + }, + "@typescript-eslint/type-utils": { + "version": "6.7.5", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "6.7.5", + "@typescript-eslint/utils": "6.7.5", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/types": { + "version": "6.7.5", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "6.7.5", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.7.5", + "@typescript-eslint/visitor-keys": "6.7.5", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/utils": { + "version": "6.7.5", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.7.5", + "@typescript-eslint/types": "6.7.5", + "@typescript-eslint/typescript-estree": "6.7.5", + "semver": "^7.5.4" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "6.7.5", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.7.5", + "eslint-visitor-keys": "^3.4.1" + } + }, + "abbrev": { + "version": "1.1.1", + "dev": true + }, + "abitype": { + "version": "0.9.8", + "requires": {} + }, + "acorn": { + "version": "8.10.0", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "dev": true, + "requires": {} + }, + "acorn-walk": { + "version": "8.2.0", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "5.0.1", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.3", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "4.1.3", + "dev": true + }, + "argparse": { + "version": "2.0.1", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "dev": true + }, + "asynckit": { + "version": "0.4.0" + }, + "axios": { + "version": "1.5.1", + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "callsites": { + "version": "3.1.0", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "chokidar": { + "version": "3.5.3", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "dev": true + }, + "create-require": { + "version": "1.1.1", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.4", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "deep-is": { + "version": "0.1.4", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0" + }, + "diff": { + "version": "4.0.2", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dotenv": { + "version": "16.3.1" + }, + "escape-string-regexp": { + "version": "4.0.0", + "dev": true + }, + "eslint": { + "version": "8.51.0", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.51.0", + "@humanwhocodes/config-array": "^0.11.11", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "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" + }, + "dependencies": { + "glob-parent": { + "version": "6.0.2", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + } + } + }, + "eslint-config-prettier": { + "version": "9.0.0", + "dev": true, + "requires": {} + }, + "eslint-scope": { + "version": "7.2.2", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-visitor-keys": { + "version": "3.4.3", + "dev": true + }, + "espree": { + "version": "9.6.1", + "dev": true, + "requires": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + } + }, + "esquery": { + "version": "1.5.0", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "dev": true + }, + "fast-glob": { + "version": "3.3.1", + "dev": true, + "requires": { + "@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": { + "version": "2.1.0", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "dev": true + }, + "fastq": { + "version": "1.15.0", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "5.0.0", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.1.1", + "dev": true, + "requires": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.9", + "dev": true + }, + "follow-redirects": { + "version": "1.15.3" + }, + "form-data": { + "version": "4.0.0", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "dev": true + }, + "glob": { + "version": "7.2.3", + "dev": true, + "requires": { + "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-parent": { + "version": "5.1.2", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "13.23.0", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globby": { + "version": "11.1.0", + "dev": true, + "requires": { + "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" + } + }, + "graphemer": { + "version": "1.4.0", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "ignore": { + "version": "5.2.4", + "dev": true + }, + "ignore-by-default": { + "version": "1.0.1", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "dev": true + }, + "isows": { + "version": "1.0.3", + "requires": {} + }, + "js-yaml": { + "version": "4.1.0", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "json-buffer": { + "version": "3.0.1", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true + }, + "keyv": { + "version": "4.5.4", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, + "levn": { + "version": "0.4.1", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "locate-path": { + "version": "6.0.0", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash.merge": { + "version": "4.6.2", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "make-error": { + "version": "1.3.6", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime-db": { + "version": "1.52.0" + }, + "mime-types": { + "version": "2.1.35", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.1.2", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.2", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "dev": true + }, + "node-cron": { + "version": "3.0.2", + "requires": { + "uuid": "8.3.2" + } + }, + "nodemon": { + "version": "3.0.1", + "dev": true, + "requires": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "dev": true + } + } + }, + "nopt": { + "version": "1.0.10", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "dev": true + }, + "once": { + "version": "1.4.0", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.3", + "dev": true, + "requires": { + "@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" + } + }, + "p-limit": { + "version": "3.1.0", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "parent-module": { + "version": "1.0.1", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "path-exists": { + "version": "4.0.0", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "dev": true + }, + "prettier": { + "version": "3.0.3", + "dev": true + }, + "proxy-from-env": { + "version": "1.1.0" + }, + "pstree.remy": { + "version": "1.1.8", + "dev": true + }, + "punycode": { + "version": "2.3.0", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "dev": true + }, + "readdirp": { + "version": "3.6.0", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "resolve-from": { + "version": "4.0.0", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-parallel": { + "version": "1.2.0", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "semver": { + "version": "7.5.4", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "shebang-command": { + "version": "2.0.0", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "dev": true + }, + "simple-update-notifier": { + "version": "2.0.0", + "dev": true, + "requires": { + "semver": "^7.5.3" + } + }, + "slash": { + "version": "3.0.0", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + }, + "dependencies": { + "has-flag": { + "version": "3.0.0", + "dev": true + } + } + }, + "text-table": { + "version": "0.2.0", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "touch": { + "version": "3.1.0", + "dev": true, + "requires": { + "nopt": "~1.0.10" + } + }, + "ts-api-utils": { + "version": "1.0.3", + "dev": true, + "requires": {} + }, + "ts-node": { + "version": "10.9.1", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + } + }, + "type-check": { + "version": "0.4.0", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2", + "dev": true + }, + "typescript": { + "version": "5.2.2", + "devOptional": true + }, + "undefsafe": { + "version": "2.0.5", + "dev": true + }, + "undici-types": { + "version": "5.25.3", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", + "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "uuid": { + "version": "8.3.2" + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "dev": true + }, + "viem": { + "version": "1.16.5", + "requires": { + "@adraffy/ens-normalize": "1.9.4", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@scure/bip32": "1.3.2", + "@scure/bip39": "1.2.1", + "abitype": "0.9.8", + "isows": "1.0.3", + "ws": "8.13.0" + } + }, + "which": { + "version": "2.0.2", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "dev": true + }, + "ws": { + "version": "8.13.0", + "requires": {} + }, + "yallist": { + "version": "4.0.0", + "dev": true + }, + "yn": { + "version": "3.1.1", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "dev": true + } + } +} diff --git a/packages/reporter/package.json b/packages/reporter/package.json index dac8fc67..8d07caf7 100644 --- a/packages/reporter/package.json +++ b/packages/reporter/package.json @@ -13,11 +13,14 @@ }, "packageManager": "yarn@3.2.1", "dependencies": { + "axios": "^1.5.1", "dotenv": "^16.3.1", "node-cron": "^3.0.2", "viem": "^1.16.5" }, "devDependencies": { + "@types/node": "^20.8.6", + "@types/node-cron": "^3.0.9", "@typescript-eslint/eslint-plugin": "^6.7.5", "@typescript-eslint/parser": "^6.7.5", "eslint": "^8.51.0", diff --git a/packages/reporter/src/ABIs/PingPongABI.json b/packages/reporter/src/ABIs/PingPongABI.json new file mode 100644 index 00000000..ca7dfcd8 --- /dev/null +++ b/packages/reporter/src/ABIs/PingPongABI.json @@ -0,0 +1,41 @@ +[ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "pong", + "type": "string" + } + ], + "name": "Pong", + "type": "event" + }, + { + "inputs": [], + "name": "count", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ping", + "outputs": [ + { + "internalType": "string", + "name": "pong", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } +] diff --git a/packages/reporter/ABIs/SygmaReporterContractABI.json b/packages/reporter/src/ABIs/SygmaReporterContractABI.json similarity index 100% rename from packages/reporter/ABIs/SygmaReporterContractABI.json rename to packages/reporter/src/ABIs/SygmaReporterContractABI.json diff --git a/packages/reporter/ABIs/ambReporterContractABI.json b/packages/reporter/src/ABIs/ambReporterContractABI.json similarity index 100% rename from packages/reporter/ABIs/ambReporterContractABI.json rename to packages/reporter/src/ABIs/ambReporterContractABI.json diff --git a/packages/reporter/ABIs/telepathyAdapterABI.json b/packages/reporter/src/ABIs/telepathyAdapterABI.json similarity index 100% rename from packages/reporter/ABIs/telepathyAdapterABI.json rename to packages/reporter/src/ABIs/telepathyAdapterABI.json diff --git a/packages/reporter/ABIs/telepathyContractABI.json b/packages/reporter/src/ABIs/telepathyContractABI.json similarity index 100% rename from packages/reporter/ABIs/telepathyContractABI.json rename to packages/reporter/src/ABIs/telepathyContractABI.json diff --git a/packages/reporter/ABIs/wormholeReporterContractABI.json b/packages/reporter/src/ABIs/wormholeReporterContractABI.json similarity index 100% rename from packages/reporter/ABIs/wormholeReporterContractABI.json rename to packages/reporter/src/ABIs/wormholeReporterContractABI.json diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index e69de29b..52115a5b 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -0,0 +1,33 @@ +import "dotenv/config" +import AMB from "./reporter/AMBReporter" +import Sygma from "./reporter/SygmaReporter" +import Telepathy from "./reporter/TelepathyReporter" + +function main() { + if (process.env.AMB_REPORTER === "true") { + const amb = new AMB() + amb.callReportHeader({ + frequency_config: process.env.AMB_FREQUENCY!, + source_chain: process.env.AMB_SOURCE_CHAIN!, + destination_chain: process.env.AMB_DEST_CHAIN!, + }) + } + if (process.env.SYGMA_REPORTER === "true") { + const sygma = new Sygma() + sygma.callReportHeader({ + frequency_config: process.env.SYGMA_FREQUENCY!, + source_chain: process.env.SYGMA_SOURCE_CHAIN!, + destination_chain: process.env.SYGMA_DEST_CHAIN!, + }) + } + if (process.env.TELEPATHY_REPORTER === "true") { + const telepathy = new Telepathy() + telepathy.callReportHeader({ + frequency_config: process.env.TELEPATHY_FREQUENCY!, + source_chain: process.env.TELEPATHY_SOURCE_CHAIN!, + destination_chain: process.env.TELEPATHY_DEST_CHAIN!, + }) + } +} + +main() diff --git a/packages/reporter/src/reporter/AMBReporter.ts b/packages/reporter/src/reporter/AMBReporter.ts new file mode 100644 index 00000000..c5fdd4f1 --- /dev/null +++ b/packages/reporter/src/reporter/AMBReporter.ts @@ -0,0 +1,65 @@ +var cron = require("node-cron") +import { createPublicClient, http, createWalletClient } from "viem" +import { mainnet, goerli, gnosis } from "viem/chains" +import { privateKeyToAccount } from "viem/accounts" +import "dotenv/config" +import reporter_config from "./type" +import contract_address from "../utils/address.json" +import contractABI from "../ABIs/ambReporterContractABI.json" + +class AMBReporter { + constructor() {} + async callReportHeader(props: reporter_config) { + console.log("Starting AMB Reporter") + const walletClient = createWalletClient({ + chain: process.env.AMB_SOURCE_CHAIN === "goerli" ? goerli : mainnet, + transport: http(process.env.SOURCE_RPC_URL), + }) + const publicClient = createPublicClient({ + chain: goerli, + transport: http(process.env.SOURCE_RPC_URL), + }) + const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`) + + function getSourceReporterAddr() { + switch (props.source_chain) { + case "goerli": + return contract_address.amb.goerli_reporter + case "ethereum": + return contract_address.amb.ethereum_reporter + default: + return contract_address.amb.goerli_reporter + } + } + + function getDestAdapter() { + switch (props.destination_chain) { + case "gnosis": + return contract_address.amb.gnosis_adapter + default: + return contract_address.amb.gnosis_adapter + } + } + const reporterAddr = getSourceReporterAddr() + const adapterAddr = getDestAdapter() + + cron.schedule(`${props.frequency_config}`, async () => { + const blockNumber = await publicClient.getBlockNumber() + // Putting a buffer here for block number in case the provider's node is not up to date. + console.log(`Reporting BlockNumber: ${blockNumber - 10n}`) + + const { result, request } = await publicClient.simulateContract({ + account, // calling from account + address: reporterAddr as `0x${string}`, + abi: contractABI, + functionName: "reportHeaders", + args: [[blockNumber - 10n], adapterAddr, process.env.GAS], + }) + + const txhash = await walletClient.writeContract(request) + console.log("TxHash ", txhash) + }) + } +} + +export default AMBReporter diff --git a/packages/reporter/src/reporter/SygmaReporter.ts b/packages/reporter/src/reporter/SygmaReporter.ts new file mode 100644 index 00000000..cf84a58e --- /dev/null +++ b/packages/reporter/src/reporter/SygmaReporter.ts @@ -0,0 +1,74 @@ +var cron = require("node-cron") +import { createPublicClient, http, createWalletClient, parseEther } from "viem" +import { mainnet, goerli, gnosis } from "viem/chains" +import { privateKeyToAccount } from "viem/accounts" +import "dotenv/config" +import reporter_config from "./type" +import contract_address from "../utils/address.json" +import contractABI from "../ABIs/SygmaReporterContractABI.json" + +class SygmaReporter { + constructor() {} + async callReportHeader(props: reporter_config) { + console.log("Starting Sygma Reporter") + const walletClient = createWalletClient({ + chain: process.env.AMB_SOURCE_CHAIN === "goerli" ? goerli : mainnet, + transport: http(process.env.SOURCE_RPC_URL), + }) + const publicClient = createPublicClient({ + chain: goerli, + transport: http(process.env.SOURCE_RPC_URL), + }) + const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`) + + function getSourceReporterAddr() { + switch (props.source_chain) { + case "goerli": + return contract_address.sygma.goerli_reporter + case "ethereum": + return contract_address.sygma.ethereum_reporter + default: + return contract_address.sygma.goerli_reporter + } + } + + function getDestAdapter() { + switch (props.destination_chain) { + case "gnosis": + return contract_address.sygma.gnosis_adapter + default: + return contract_address.sygma.gnosis_adapter + } + } + + function getDomainID() { + switch (props.destination_chain) { + case "gnosis": + return 101 + default: + return 101 + } + } + const reporterAddr = getSourceReporterAddr() + const adapterAddr = getDestAdapter() + const destDomainId = getDomainID() + + cron.schedule(`${props.frequency_config}`, async () => { + const blockNumber = await publicClient.getBlockNumber() + // Putting a buffer here for block number in case the provider's node is not up to date. + console.log(`Reporting BlockNumber ${blockNumber - 10n}`) + const { result, request } = await publicClient.simulateContract({ + account, // calling from account + address: reporterAddr as `0x${string}`, + abi: contractABI, + functionName: "reportHeadersToDomain", + args: [[blockNumber - 10n], adapterAddr, destDomainId, "0x"], + value: parseEther("0.0001"), + }) + const txhash = await walletClient.writeContract(request) + console.log("TxHash ", txhash) + }) + } +} + +export default SygmaReporter diff --git a/packages/reporter/src/reporter/TelepathyReporter.ts b/packages/reporter/src/reporter/TelepathyReporter.ts new file mode 100644 index 00000000..9641dd3c --- /dev/null +++ b/packages/reporter/src/reporter/TelepathyReporter.ts @@ -0,0 +1,75 @@ +import axios from "axios" +import { createPublicClient, http, createWalletClient, parseAbiItem, hexToBigInt } from "viem" +import { mainnet, goerli, gnosis } from "viem/chains" +import { privateKeyToAccount } from "viem/accounts" +import "dotenv/config" +import reporter_config from "./type" +import contract_address from "../utils/address.json" +import lightClientContractABI from "../ABIs/telepathyContractABI.json" +import adapterContractABI from "../ABIs/telepathyAdapterABI.json" + +class TelepathyReporter { + constructor() {} + async callReportHeader(props: reporter_config) { + console.log("Starting Telepathy Reporter") + + var runJob = setInterval(async () => { + try { + await this.fetchProofAndStoreBlockHeader(props) + } catch (error) { + console.log("Error when calling Telepathy's storeBlockHeader : ", error) + } + }, Number(props.frequency_config)) + } + + async fetchProofAndStoreBlockHeader(props: reporter_config) { + const walletClient = createWalletClient({ + chain: gnosis, + transport: http(process.env.DEST_RPC_URL), + }) + const publicClient = createPublicClient({ + chain: gnosis, + transport: http(process.env.DEST_RPC_URL), + }) + const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`) + + const adapterAddr = contract_address.telepathy.gnosis_adapter + const lightClientAddr = contract_address.telepathy.gnosis_light_client + + // Getting the latest block number from provider + const currentBlockNumber = await publicClient.getBlockNumber() + + // get contract events from latest block -500 : latest block + console.log(`Getting Contract Event from block ${currentBlockNumber - 500n} to block ${currentBlockNumber}`) + const logs = await publicClient.getContractEvents({ + address: contract_address.telepathy.gnosis_light_client as `0x${string}`, + abi: lightClientContractABI, + eventName: "HeadUpdate", + fromBlock: currentBlockNumber - 500n, + toBlock: currentBlockNumber, + }) + + console.log("logs ", logs) + logs.forEach(async (event) => { + // get slot value from first indexed + const slotValue = event.topics[1] + const postUrl = process.env.TELEPATHY_PROOF_API_URL + "5" + "/" + slotValue + const response = await axios.post(postUrl) + console.log("Response from telepathy proof provider: ", response.data) + const { chainId, slot, blockNumber, blockNumberProof, blockHash, blockHashProof } = response.data.result + console.log(`Calling storeBlockHeader for block number ${blockNumber}`) + const { request, result } = await publicClient.simulateContract({ + account, + address: adapterAddr as `0x${string}`, + abi: adapterContractABI, + functionName: "storeBlockHeader", + args: [5, slot, blockNumber, blockNumberProof, blockHash, blockHashProof], + }) + + const txHash = await walletClient.writeContract(request) + console.log("TxHash ", txHash) + }) + } +} + +export default TelepathyReporter diff --git a/packages/reporter/src/reporter/type.ts b/packages/reporter/src/reporter/type.ts new file mode 100644 index 00000000..2455f619 --- /dev/null +++ b/packages/reporter/src/reporter/type.ts @@ -0,0 +1,7 @@ +type reporter_config = { + frequency_config: string + source_chain: string + destination_chain: string +} + +export default reporter_config diff --git a/packages/reporter/src/utils/address.json b/packages/reporter/src/utils/address.json new file mode 100644 index 00000000..1d1a9351 --- /dev/null +++ b/packages/reporter/src/utils/address.json @@ -0,0 +1,30 @@ +{ + "ethereum": { + "ambReporter": "", + "sygmaReporter": "" + }, + "goerli": { + "ambReporter": "0xedc0b1d3de4496e0d917af42f29cb71eb2982319", + "sygmaReporter": "0x2f96d347c932ac73b56e9352ecc0707e25173d88" + }, + "gnosis": { + "ambAdapter": "0x01268DB05965CeAc2a89566c42CD550ED7eE5ECD", + "sygmaAdapter": "0x9AD7a6f4FDA8247cC0bF5932B68c5b619937dB15", + "telepathyAdapter": "0x2f1E51a2763FB67fe09971Fd8d849716137A3357", + "telepathyLightClient": "0x34b5378DE786389a477b40dD710812c250185f83" + }, + "amb": { + "goerli_reporter": "0xedc0b1d3de4496e0d917af42f29cb71eb2982319", + "ethereum_reporter": "", + "gnosis_adapter": "0x01268DB05965CeAc2a89566c42CD550ED7eE5ECD" + }, + "sygma": { + "goerli_reporter": "0x2f96d347c932ac73b56e9352ecc0707e25173d88", + "ethereum_reporter": "", + "gnosis_adapter": "0x9AD7a6f4FDA8247cC0bF5932B68c5b619937dB15" + }, + "telepathy": { + "gnosis_adapter": "0x2f1E51a2763FB67fe09971Fd8d849716137A3357", + "gnosis_light_client": "0x34b5378DE786389a477b40dD710812c250185f83" + } +} diff --git a/packages/reporter/tsconfig.json b/packages/reporter/tsconfig.json index eec3d55e..3550a7f9 100644 --- a/packages/reporter/tsconfig.json +++ b/packages/reporter/tsconfig.json @@ -7,7 +7,7 @@ "experimentalDecorators": true, "forceConsistentCasingInFileNames": true, "lib": [ - "es6" + "es6","ESNext" ], "module": "commonjs", "moduleResolution": "node", @@ -17,7 +17,7 @@ "resolveJsonModule": true, "sourceMap": true, "strict": true, - "target": "es6" + "target": "ESNext" }, "exclude": [ "node_modules" diff --git a/packages/reporter/yarn.lock b/packages/reporter/yarn.lock index e2881934..21eb86f3 100644 --- a/packages/reporter/yarn.lock +++ b/packages/reporter/yarn.lock @@ -1,2496 +1,905 @@ -# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! - -__metadata: - version: 6 - cacheKey: 8 - -"@aashutoshrathi/word-wrap@npm:^1.2.3": - version: 1.2.6 - resolution: "@aashutoshrathi/word-wrap@npm:1.2.6" - checksum: ada901b9e7c680d190f1d012c84217ce0063d8f5c5a7725bb91ec3c5ed99bb7572680eb2d2938a531ccbaec39a95422fcd8a6b4a13110c7d98dd75402f66a0cd - languageName: node - linkType: hard - -"@adraffy/ens-normalize@npm:1.9.4": - version: 1.9.4 - resolution: "@adraffy/ens-normalize@npm:1.9.4" - checksum: 7d7fff58ebe2c4961f7e5e61dad123aa6a63fec0df5c84af1fa41079dc05d398599690be4427b3a94d2baa94084544bcfdf2d51cbed7504b9b0583b0960ad550 - languageName: node - linkType: hard - -"@cspotcode/source-map-support@npm:^0.8.0": - version: 0.8.1 - resolution: "@cspotcode/source-map-support@npm:0.8.1" - dependencies: - "@jridgewell/trace-mapping": 0.3.9 - checksum: 5718f267085ed8edb3e7ef210137241775e607ee18b77d95aa5bd7514f47f5019aa2d82d96b3bf342ef7aa890a346fa1044532ff7cc3009e7d24fce3ce6200fa - languageName: node - linkType: hard - -"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": - version: 4.4.0 - resolution: "@eslint-community/eslint-utils@npm:4.4.0" - dependencies: - eslint-visitor-keys: ^3.3.0 - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: cdfe3ae42b4f572cbfb46d20edafe6f36fc5fb52bf2d90875c58aefe226892b9677fef60820e2832caf864a326fe4fc225714c46e8389ccca04d5f9288aabd22 - languageName: node - linkType: hard - -"@eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": - version: 4.9.1 - resolution: "@eslint-community/regexpp@npm:4.9.1" - checksum: 06fb839e9c756f6375cc545c2f2e05a0a64576bd6370e8e3c07983fd29a3d6e164ef4aa48a361f7d27e6713ab79c83053ff6a2ccb78748bc955e344279c4a3b6 - languageName: node - linkType: hard - -"@eslint/eslintrc@npm:^2.1.2": - version: 2.1.2 - resolution: "@eslint/eslintrc@npm:2.1.2" - 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 - checksum: bc742a1e3b361f06fedb4afb6bf32cbd27171292ef7924f61c62f2aed73048367bcc7ac68f98c06d4245cd3fabc43270f844e3c1699936d4734b3ac5398814a7 - languageName: node - linkType: hard - -"@eslint/js@npm:8.51.0": - version: 8.51.0 - resolution: "@eslint/js@npm:8.51.0" - checksum: 0228bf1e1e0414843e56d9ff362a2a72d579c078f93174666f29315690e9e30a8633ad72c923297f7fd7182381b5a476805ff04dac8debe638953eb1ded3ac73 - languageName: node - linkType: hard - -"@humanwhocodes/config-array@npm:^0.11.11": - version: 0.11.11 - resolution: "@humanwhocodes/config-array@npm:0.11.11" - dependencies: - "@humanwhocodes/object-schema": ^1.2.1 - debug: ^4.1.1 - minimatch: ^3.0.5 - checksum: db84507375ab77b8ffdd24f498a5b49ad6b64391d30dd2ac56885501d03964d29637e05b1ed5aefa09d57ac667e28028bc22d2da872bfcd619652fbdb5f4ca19 - languageName: node - linkType: hard - -"@humanwhocodes/module-importer@npm:^1.0.1": - version: 1.0.1 - resolution: "@humanwhocodes/module-importer@npm:1.0.1" - checksum: 0fd22007db8034a2cdf2c764b140d37d9020bbfce8a49d3ec5c05290e77d4b0263b1b972b752df8c89e5eaa94073408f2b7d977aed131faf6cf396ebb5d7fb61 - languageName: node - linkType: hard - -"@humanwhocodes/object-schema@npm:^1.2.1": - version: 1.2.1 - resolution: "@humanwhocodes/object-schema@npm:1.2.1" - checksum: a824a1ec31591231e4bad5787641f59e9633827d0a2eaae131a288d33c9ef0290bd16fda8da6f7c0fcb014147865d12118df10db57f27f41e20da92369fcb3f1 - languageName: node - linkType: hard - -"@isaacs/cliui@npm:^8.0.2": - version: 8.0.2 - resolution: "@isaacs/cliui@npm:8.0.2" - dependencies: - string-width: ^5.1.2 - string-width-cjs: "npm:string-width@^4.2.0" - strip-ansi: ^7.0.1 - strip-ansi-cjs: "npm:strip-ansi@^6.0.1" - wrap-ansi: ^8.1.0 - wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" - checksum: 4a473b9b32a7d4d3cfb7a614226e555091ff0c5a29a1734c28c72a182c2f6699b26fc6b5c2131dfd841e86b185aea714c72201d7c98c2fba5f17709333a67aeb - languageName: node - linkType: hard - -"@jridgewell/resolve-uri@npm:^3.0.3": - version: 3.1.1 - resolution: "@jridgewell/resolve-uri@npm:3.1.1" - checksum: f5b441fe7900eab4f9155b3b93f9800a916257f4e8563afbcd3b5a5337b55e52bd8ae6735453b1b745457d9f6cdb16d74cd6220bbdd98cf153239e13f6cbb653 - languageName: node - linkType: hard - -"@jridgewell/sourcemap-codec@npm:^1.4.10": - version: 1.4.15 - resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" - checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:0.3.9": - version: 0.3.9 - resolution: "@jridgewell/trace-mapping@npm:0.3.9" - dependencies: - "@jridgewell/resolve-uri": ^3.0.3 - "@jridgewell/sourcemap-codec": ^1.4.10 - checksum: d89597752fd88d3f3480845691a05a44bd21faac18e2185b6f436c3b0fd0c5a859fbbd9aaa92050c4052caf325ad3e10e2e1d1b64327517471b7d51babc0ddef - languageName: node - linkType: hard - -"@noble/curves@npm:1.2.0, @noble/curves@npm:~1.2.0": - version: 1.2.0 - resolution: "@noble/curves@npm:1.2.0" - dependencies: - "@noble/hashes": 1.3.2 - checksum: bb798d7a66d8e43789e93bc3c2ddff91a1e19fdb79a99b86cd98f1e5eff0ee2024a2672902c2576ef3577b6f282f3b5c778bebd55761ddbb30e36bf275e83dd0 - languageName: node - linkType: hard - -"@noble/hashes@npm:1.3.2, @noble/hashes@npm:~1.3.0, @noble/hashes@npm:~1.3.2": - version: 1.3.2 - resolution: "@noble/hashes@npm:1.3.2" - checksum: fe23536b436539d13f90e4b9be843cc63b1b17666a07634a2b1259dded6f490be3d050249e6af98076ea8f2ea0d56f578773c2197f2aa0eeaa5fba5bc18ba474 - languageName: node - linkType: hard - -"@nodelib/fs.scandir@npm:2.1.5": - version: 2.1.5 - resolution: "@nodelib/fs.scandir@npm:2.1.5" - dependencies: - "@nodelib/fs.stat": 2.0.5 - run-parallel: ^1.1.9 - checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59 - languageName: node - linkType: hard - -"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": - version: 2.0.5 - resolution: "@nodelib/fs.stat@npm:2.0.5" - checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 - languageName: node - linkType: hard - -"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": - version: 1.2.8 - resolution: "@nodelib/fs.walk@npm:1.2.8" - dependencies: - "@nodelib/fs.scandir": 2.1.5 - fastq: ^1.6.0 - checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53 - languageName: node - linkType: hard - -"@npmcli/fs@npm:^3.1.0": - version: 3.1.0 - resolution: "@npmcli/fs@npm:3.1.0" - dependencies: - semver: ^7.3.5 - checksum: a50a6818de5fc557d0b0e6f50ec780a7a02ab8ad07e5ac8b16bf519e0ad60a144ac64f97d05c443c3367235d337182e1d012bbac0eb8dbae8dc7b40b193efd0e - languageName: node - linkType: hard - -"@pkgjs/parseargs@npm:^0.11.0": - version: 0.11.0 - resolution: "@pkgjs/parseargs@npm:0.11.0" - checksum: 6ad6a00fc4f2f2cfc6bff76fb1d88b8ee20bc0601e18ebb01b6d4be583733a860239a521a7fbca73b612e66705078809483549d2b18f370eb346c5155c8e4a0f - languageName: node - linkType: hard - -"@scure/base@npm:~1.1.0, @scure/base@npm:~1.1.2": - version: 1.1.3 - resolution: "@scure/base@npm:1.1.3" - checksum: 1606ab8a4db898cb3a1ada16c15437c3bce4e25854fadc8eb03ae93cbbbac1ed90655af4b0be3da37e12056fef11c0374499f69b9e658c9e5b7b3e06353c630c - languageName: node - linkType: hard - -"@scure/bip32@npm:1.3.2": - version: 1.3.2 - resolution: "@scure/bip32@npm:1.3.2" - dependencies: - "@noble/curves": ~1.2.0 - "@noble/hashes": ~1.3.2 - "@scure/base": ~1.1.2 - checksum: c5ae84fae43490853693b481531132b89e056d45c945fc8b92b9d032577f753dfd79c5a7bbcbf0a7f035951006ff0311b6cf7a389e26c9ec6335e42b20c53157 - languageName: node - linkType: hard - -"@scure/bip39@npm:1.2.1": - version: 1.2.1 - resolution: "@scure/bip39@npm:1.2.1" - dependencies: - "@noble/hashes": ~1.3.0 - "@scure/base": ~1.1.0 - checksum: c5bd6f1328fdbeae2dcdd891825b1610225310e5e62a4942714db51066866e4f7bef242c7b06a1b9dcc8043a4a13412cf5c5df76d3b10aa9e36b82e9b6e3eeaa - languageName: node - linkType: hard - -"@tootallnate/once@npm:2": - version: 2.0.0 - resolution: "@tootallnate/once@npm:2.0.0" - checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 - languageName: node - linkType: hard - -"@tsconfig/node10@npm:^1.0.7": - version: 1.0.9 - resolution: "@tsconfig/node10@npm:1.0.9" - checksum: a33ae4dc2a621c0678ac8ac4bceb8e512ae75dac65417a2ad9b022d9b5411e863c4c198b6ba9ef659e14b9fb609bbec680841a2e84c1172df7a5ffcf076539df - languageName: node - linkType: hard - -"@tsconfig/node12@npm:^1.0.7": - version: 1.0.11 - resolution: "@tsconfig/node12@npm:1.0.11" - checksum: 5ce29a41b13e7897a58b8e2df11269c5395999e588b9a467386f99d1d26f6c77d1af2719e407621412520ea30517d718d5192a32403b8dfcc163bf33e40a338a - languageName: node - linkType: hard - -"@tsconfig/node14@npm:^1.0.0": - version: 1.0.3 - resolution: "@tsconfig/node14@npm:1.0.3" - checksum: 19275fe80c4c8d0ad0abed6a96dbf00642e88b220b090418609c4376e1cef81bf16237bf170ad1b341452feddb8115d8dd2e5acdfdea1b27422071163dc9ba9d - languageName: node - linkType: hard - -"@tsconfig/node16@npm:^1.0.2": - version: 1.0.4 - resolution: "@tsconfig/node16@npm:1.0.4" - checksum: 202319785901f942a6e1e476b872d421baec20cf09f4b266a1854060efbf78cde16a4d256e8bc949d31e6cd9a90f1e8ef8fb06af96a65e98338a2b6b0de0a0ff - languageName: node - linkType: hard - -"@types/json-schema@npm:^7.0.12": - version: 7.0.13 - resolution: "@types/json-schema@npm:7.0.13" - checksum: 345df21a678fa72fb389f35f33de77833d09d4a142bb2bcb27c18690efa4cf70fc2876e43843cefb3fbdb9fcb12cd3e970a90936df30f53bbee899865ff605ab - languageName: node - linkType: hard - -"@types/semver@npm:^7.5.0": - version: 7.5.3 - resolution: "@types/semver@npm:7.5.3" - checksum: 349fdd1ab6c213bac5c991bac766bd07b8b12e63762462bb058740dcd2eb09c8193d068bb226f134661275f2022976214c0e727a4e5eb83ec1b131127c980d3e - languageName: node - linkType: hard - -"@typescript-eslint/eslint-plugin@npm:^6.7.5": - version: 6.7.5 - resolution: "@typescript-eslint/eslint-plugin@npm:6.7.5" - dependencies: - "@eslint-community/regexpp": ^4.5.1 - "@typescript-eslint/scope-manager": 6.7.5 - "@typescript-eslint/type-utils": 6.7.5 - "@typescript-eslint/utils": 6.7.5 - "@typescript-eslint/visitor-keys": 6.7.5 - debug: ^4.3.4 - graphemer: ^1.4.0 - ignore: ^5.2.4 - natural-compare: ^1.4.0 - semver: ^7.5.4 - ts-api-utils: ^1.0.1 - peerDependencies: - "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: c37edf5a703db4ff9227d67c2d2cf817e65c9afc94cc0e650fa3d2b05ac55201ef887ce9dadb9ca13779f4025bf4367e132b013e3559e777006a2332079bb180 - languageName: node - linkType: hard - -"@typescript-eslint/parser@npm:^6.7.5": - version: 6.7.5 - resolution: "@typescript-eslint/parser@npm:6.7.5" - dependencies: - "@typescript-eslint/scope-manager": 6.7.5 - "@typescript-eslint/types": 6.7.5 - "@typescript-eslint/typescript-estree": 6.7.5 - "@typescript-eslint/visitor-keys": 6.7.5 - debug: ^4.3.4 - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 63f988c1c87697bd20487933be952b97f7a5f2a9977f505af671c7d49367fc01ca508817576646caa937c15cc0a0ef1e86adff9111eb19df8b489e7436d10620 - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:6.7.5": - version: 6.7.5 - resolution: "@typescript-eslint/scope-manager@npm:6.7.5" - dependencies: - "@typescript-eslint/types": 6.7.5 - "@typescript-eslint/visitor-keys": 6.7.5 - checksum: f21858ed78f81ab2d9879139f69657fda2a7b901078f79df64d1262d80f84ef66c56525ed0bb5e393fa5ca5474ad97f2225b7f713977c2d0f79cda31b2744af9 - languageName: node - linkType: hard - -"@typescript-eslint/type-utils@npm:6.7.5": - version: 6.7.5 - resolution: "@typescript-eslint/type-utils@npm:6.7.5" - dependencies: - "@typescript-eslint/typescript-estree": 6.7.5 - "@typescript-eslint/utils": 6.7.5 - debug: ^4.3.4 - ts-api-utils: ^1.0.1 - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 8023d8ddcfbf4a0411b192016711068e9e6787c5811aee3a25ac40025ade0d063a1a3d7b38469e1a534bb31fa9dbeec08ab53b7a6d7b3128358294ac5b219d9a - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:6.7.5": - version: 6.7.5 - resolution: "@typescript-eslint/types@npm:6.7.5" - checksum: f21e5726b60f13feb3a920c92515fbc1205ba0e9bba9959b2e42c02c282a0ab4fb0e5ae84f3807b9b1cf95036027e9033d92a911fa88e6c243a87621d8dd7a01 - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:6.7.5": - version: 6.7.5 - resolution: "@typescript-eslint/typescript-estree@npm:6.7.5" - dependencies: - "@typescript-eslint/types": 6.7.5 - "@typescript-eslint/visitor-keys": 6.7.5 - debug: ^4.3.4 - globby: ^11.1.0 - is-glob: ^4.0.3 - semver: ^7.5.4 - ts-api-utils: ^1.0.1 - peerDependenciesMeta: - typescript: - optional: true - checksum: 17685e8321edce1d1ec4278d84e63c0f41ccb19e9308f21c37450943ad0c33328755ac52b966e7855af17e01d22bc83d1fcda79c279fabe7d3460c8f315a7265 - languageName: node - linkType: hard - -"@typescript-eslint/utils@npm:6.7.5": - version: 6.7.5 - resolution: "@typescript-eslint/utils@npm:6.7.5" - dependencies: - "@eslint-community/eslint-utils": ^4.4.0 - "@types/json-schema": ^7.0.12 - "@types/semver": ^7.5.0 - "@typescript-eslint/scope-manager": 6.7.5 - "@typescript-eslint/types": 6.7.5 - "@typescript-eslint/typescript-estree": 6.7.5 - semver: ^7.5.4 - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - checksum: f365c654241f927e7784640079627d60a296aa3d575552b07594a69cfc419832eb5fa4adc87acb1988bea9741ae9cc4a5277dab168990310caef5de125255752 - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:6.7.5": - version: 6.7.5 - resolution: "@typescript-eslint/visitor-keys@npm:6.7.5" - dependencies: - "@typescript-eslint/types": 6.7.5 - eslint-visitor-keys: ^3.4.1 - checksum: 2df996742f63d89fa339b0e8ff3a3a289d36b3f584f7538a7626bed3869e9ae27f8f56ab31748519d25a63de2ae22a43dd8413610b00436ff342b0a17eb85289 - languageName: node - linkType: hard - -"abbrev@npm:1, abbrev@npm:^1.0.0": - version: 1.1.1 - resolution: "abbrev@npm:1.1.1" - checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 - languageName: node - linkType: hard - -"abitype@npm:0.9.8": - version: 0.9.8 - resolution: "abitype@npm:0.9.8" - peerDependencies: - typescript: ">=5.0.4" - zod: ^3 >=3.19.1 - peerDependenciesMeta: - typescript: - optional: true - zod: - optional: true - checksum: d7d887f29d6821e3f7a400de9620511b80ead3f85c5c87308aaec97965d3493e6687ed816e88722b4f512249bd66dee9e69231b49af0e1db8f69400a62c87cf6 - languageName: node - linkType: hard - -"acorn-jsx@npm:^5.3.2": - version: 5.3.2 - resolution: "acorn-jsx@npm:5.3.2" - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: c3d3b2a89c9a056b205b69530a37b972b404ee46ec8e5b341666f9513d3163e2a4f214a71f4dfc7370f5a9c07472d2fd1c11c91c3f03d093e37637d95da98950 - languageName: node - linkType: hard - -"acorn-walk@npm:^8.1.1": - version: 8.2.0 - resolution: "acorn-walk@npm:8.2.0" - checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1 - languageName: node - linkType: hard - -"acorn@npm:^8.4.1, acorn@npm:^8.9.0": - version: 8.10.0 - resolution: "acorn@npm:8.10.0" - bin: - acorn: bin/acorn - checksum: 538ba38af0cc9e5ef983aee196c4b8b4d87c0c94532334fa7e065b2c8a1f85863467bb774231aae91613fcda5e68740c15d97b1967ae3394d20faddddd8af61d - languageName: node - linkType: hard - -"agent-base@npm:6, agent-base@npm:^6.0.2": - version: 6.0.2 - resolution: "agent-base@npm:6.0.2" - dependencies: - debug: 4 - checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d - languageName: node - linkType: hard - -"agentkeepalive@npm:^4.2.1": - version: 4.5.0 - resolution: "agentkeepalive@npm:4.5.0" - dependencies: - humanize-ms: ^1.2.1 - checksum: 13278cd5b125e51eddd5079f04d6fe0914ac1b8b91c1f3db2c1822f99ac1a7457869068997784342fe455d59daaff22e14fb7b8c3da4e741896e7e31faf92481 - languageName: node - linkType: hard - -"aggregate-error@npm:^3.0.0": - version: 3.1.0 - resolution: "aggregate-error@npm:3.1.0" - dependencies: - clean-stack: ^2.0.0 - indent-string: ^4.0.0 - checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 - languageName: node - linkType: hard - -"ajv@npm:^6.12.4": - version: 6.12.6 - resolution: "ajv@npm:6.12.6" - 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 - checksum: 874972efe5c4202ab0a68379481fbd3d1b5d0a7bd6d3cc21d40d3536ebff3352a2a1fabb632d4fd2cc7fe4cbdcd5ed6782084c9bbf7f32a1536d18f9da5007d4 - languageName: node - linkType: hard - -"ansi-regex@npm:^5.0.1": - version: 5.0.1 - resolution: "ansi-regex@npm:5.0.1" - checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b - languageName: node - linkType: hard - -"ansi-regex@npm:^6.0.1": - version: 6.0.1 - resolution: "ansi-regex@npm:6.0.1" - checksum: 1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 - languageName: node - linkType: hard - -"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": - version: 4.3.0 - resolution: "ansi-styles@npm:4.3.0" - dependencies: - color-convert: ^2.0.1 - checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 - languageName: node - linkType: hard - -"ansi-styles@npm:^6.1.0": - version: 6.2.1 - resolution: "ansi-styles@npm:6.2.1" - checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 - languageName: node - linkType: hard - -"anymatch@npm:~3.1.2": - version: 3.1.3 - resolution: "anymatch@npm:3.1.3" - dependencies: - normalize-path: ^3.0.0 - picomatch: ^2.0.4 - checksum: 3e044fd6d1d26545f235a9fe4d7a534e2029d8e59fa7fd9f2a6eb21230f6b5380ea1eaf55136e60cbf8e613544b3b766e7a6fa2102e2a3a117505466e3025dc2 - languageName: node - linkType: hard - -"aproba@npm:^1.0.3 || ^2.0.0": - version: 2.0.0 - resolution: "aproba@npm:2.0.0" - checksum: 5615cadcfb45289eea63f8afd064ab656006361020e1735112e346593856f87435e02d8dcc7ff0d11928bc7d425f27bc7c2a84f6c0b35ab0ff659c814c138a24 - languageName: node - linkType: hard - -"are-we-there-yet@npm:^3.0.0": - version: 3.0.1 - resolution: "are-we-there-yet@npm:3.0.1" - dependencies: - delegates: ^1.0.0 - readable-stream: ^3.6.0 - checksum: 52590c24860fa7173bedeb69a4c05fb573473e860197f618b9a28432ee4379049336727ae3a1f9c4cb083114601c1140cee578376164d0e651217a9843f9fe83 - languageName: node - linkType: hard - -"arg@npm:^4.1.0": - version: 4.1.3 - resolution: "arg@npm:4.1.3" - checksum: 544af8dd3f60546d3e4aff084d451b96961d2267d668670199692f8d054f0415d86fc5497d0e641e91546f0aa920e7c29e5250e99fc89f5552a34b5d93b77f43 - languageName: node - linkType: hard - -"argparse@npm:^2.0.1": - version: 2.0.1 - resolution: "argparse@npm:2.0.1" - checksum: 83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced - languageName: node - linkType: hard - -"array-union@npm:^2.1.0": - version: 2.1.0 - resolution: "array-union@npm:2.1.0" - checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d - languageName: node - linkType: hard - -"balanced-match@npm:^1.0.0": - version: 1.0.2 - resolution: "balanced-match@npm:1.0.2" - checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 - languageName: node - linkType: hard - -"binary-extensions@npm:^2.0.0": - version: 2.2.0 - resolution: "binary-extensions@npm:2.2.0" - checksum: ccd267956c58d2315f5d3ea6757cf09863c5fc703e50fbeb13a7dc849b812ef76e3cf9ca8f35a0c48498776a7478d7b4a0418e1e2b8cb9cb9731f2922aaad7f8 - languageName: node - linkType: hard - -"brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" - dependencies: - balanced-match: ^1.0.0 - concat-map: 0.0.1 - checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 - languageName: node - linkType: hard - -"brace-expansion@npm:^2.0.1": - version: 2.0.1 - resolution: "brace-expansion@npm:2.0.1" - dependencies: - balanced-match: ^1.0.0 - checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 - languageName: node - linkType: hard - -"braces@npm:^3.0.2, braces@npm:~3.0.2": - version: 3.0.2 - resolution: "braces@npm:3.0.2" - dependencies: - fill-range: ^7.0.1 - checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 - languageName: node - linkType: hard - -"cacache@npm:^17.0.0": - version: 17.1.4 - resolution: "cacache@npm:17.1.4" - dependencies: - "@npmcli/fs": ^3.1.0 - fs-minipass: ^3.0.0 - glob: ^10.2.2 - lru-cache: ^7.7.1 - minipass: ^7.0.3 - minipass-collect: ^1.0.2 - minipass-flush: ^1.0.5 - minipass-pipeline: ^1.2.4 - p-map: ^4.0.0 - ssri: ^10.0.0 - tar: ^6.1.11 - unique-filename: ^3.0.0 - checksum: b7751df756656954a51201335addced8f63fc53266fa56392c9f5ae83c8d27debffb4458ac2d168a744a4517ec3f2163af05c20097f93d17bdc2dc8a385e14a6 - languageName: node - linkType: hard - -"callsites@npm:^3.0.0": - version: 3.1.0 - resolution: "callsites@npm:3.1.0" - checksum: 072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 - languageName: node - linkType: hard - -"chalk@npm:^4.0.0": - version: 4.1.2 - resolution: "chalk@npm:4.1.2" - dependencies: - ansi-styles: ^4.1.0 - supports-color: ^7.1.0 - checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc - languageName: node - linkType: hard - -"chokidar@npm:^3.5.2": - version: 3.5.3 - resolution: "chokidar@npm:3.5.3" - dependencies: - anymatch: ~3.1.2 - braces: ~3.0.2 - fsevents: ~2.3.2 - glob-parent: ~5.1.2 - is-binary-path: ~2.1.0 - is-glob: ~4.0.1 - normalize-path: ~3.0.0 - readdirp: ~3.6.0 - dependenciesMeta: - fsevents: - optional: true - checksum: b49fcde40176ba007ff361b198a2d35df60d9bb2a5aab228279eb810feae9294a6b4649ab15981304447afe1e6ffbf4788ad5db77235dc770ab777c6e771980c - languageName: node - linkType: hard - -"chownr@npm:^2.0.0": - version: 2.0.0 - resolution: "chownr@npm:2.0.0" - checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f - languageName: node - linkType: hard - -"clean-stack@npm:^2.0.0": - version: 2.2.0 - resolution: "clean-stack@npm:2.2.0" - checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 - languageName: node - linkType: hard - -"color-convert@npm:^2.0.1": - version: 2.0.1 - resolution: "color-convert@npm:2.0.1" - dependencies: - color-name: ~1.1.4 - checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 - languageName: node - linkType: hard - -"color-name@npm:~1.1.4": - version: 1.1.4 - resolution: "color-name@npm:1.1.4" - checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 - languageName: node - linkType: hard - -"color-support@npm:^1.1.3": - version: 1.1.3 - resolution: "color-support@npm:1.1.3" - bin: - color-support: bin.js - checksum: 9b7356817670b9a13a26ca5af1c21615463b500783b739b7634a0c2047c16cef4b2865d7576875c31c3cddf9dd621fa19285e628f20198b233a5cfdda6d0793b - languageName: node - linkType: hard - -"concat-map@npm:0.0.1": - version: 0.0.1 - resolution: "concat-map@npm:0.0.1" - checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af - languageName: node - linkType: hard - -"console-control-strings@npm:^1.1.0": - version: 1.1.0 - resolution: "console-control-strings@npm:1.1.0" - checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed - languageName: node - linkType: hard - -"create-require@npm:^1.1.0": - version: 1.1.1 - resolution: "create-require@npm:1.1.1" - checksum: a9a1503d4390d8b59ad86f4607de7870b39cad43d929813599a23714831e81c520bddf61bcdd1f8e30f05fd3a2b71ae8538e946eb2786dc65c2bbc520f692eff - languageName: node - linkType: hard - -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" - dependencies: - path-key: ^3.1.0 - shebang-command: ^2.0.0 - which: ^2.0.1 - checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 - languageName: node - linkType: hard - -"debug@npm:4, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": - version: 4.3.4 - resolution: "debug@npm:4.3.4" - dependencies: - ms: 2.1.2 - peerDependenciesMeta: - supports-color: - optional: true - checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 - languageName: node - linkType: hard - -"debug@npm:^3.2.7": - version: 3.2.7 - resolution: "debug@npm:3.2.7" - dependencies: - ms: ^2.1.1 - checksum: b3d8c5940799914d30314b7c3304a43305fd0715581a919dacb8b3176d024a782062368405b47491516d2091d6462d4d11f2f4974a405048094f8bfebfa3071c - languageName: node - linkType: hard - -"deep-is@npm:^0.1.3": - version: 0.1.4 - resolution: "deep-is@npm:0.1.4" - checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 - languageName: node - linkType: hard - -"delegates@npm:^1.0.0": - version: 1.0.0 - resolution: "delegates@npm:1.0.0" - checksum: a51744d9b53c164ba9c0492471a1a2ffa0b6727451bdc89e31627fdf4adda9d51277cfcbfb20f0a6f08ccb3c436f341df3e92631a3440226d93a8971724771fd - languageName: node - linkType: hard - -"diff@npm:^4.0.1": - version: 4.0.2 - resolution: "diff@npm:4.0.2" - checksum: f2c09b0ce4e6b301c221addd83bf3f454c0bc00caa3dd837cf6c127d6edf7223aa2bbe3b688feea110b7f262adbfc845b757c44c8a9f8c0c5b15d8fa9ce9d20d - languageName: node - linkType: hard - -"dir-glob@npm:^3.0.1": - version: 3.0.1 - resolution: "dir-glob@npm:3.0.1" - dependencies: - path-type: ^4.0.0 - checksum: fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 - languageName: node - linkType: hard - -"doctrine@npm:^3.0.0": - version: 3.0.0 - resolution: "doctrine@npm:3.0.0" - dependencies: - esutils: ^2.0.2 - checksum: fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce - languageName: node - linkType: hard - -"dotenv@npm:^16.3.1": - version: 16.3.1 - resolution: "dotenv@npm:16.3.1" - checksum: 15d75e7279018f4bafd0ee9706593dd14455ddb71b3bcba9c52574460b7ccaf67d5cf8b2c08a5af1a9da6db36c956a04a1192b101ee102a3e0cf8817bbcf3dfd - languageName: node - linkType: hard - -"eastasianwidth@npm:^0.2.0": - version: 0.2.0 - resolution: "eastasianwidth@npm:0.2.0" - checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed - languageName: node - linkType: hard - -"emoji-regex@npm:^8.0.0": - version: 8.0.0 - resolution: "emoji-regex@npm:8.0.0" - checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 - languageName: node - linkType: hard - -"emoji-regex@npm:^9.2.2": - version: 9.2.2 - resolution: "emoji-regex@npm:9.2.2" - checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601 - languageName: node - linkType: hard - -"encoding@npm:^0.1.13": - version: 0.1.13 - resolution: "encoding@npm:0.1.13" - dependencies: - iconv-lite: ^0.6.2 - checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f - languageName: node - linkType: hard - -"env-paths@npm:^2.2.0": - version: 2.2.1 - resolution: "env-paths@npm:2.2.1" - checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e - languageName: node - linkType: hard - -"err-code@npm:^2.0.2": - version: 2.0.3 - resolution: "err-code@npm:2.0.3" - checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^4.0.0": - version: 4.0.0 - resolution: "escape-string-regexp@npm:4.0.0" - checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 - languageName: node - linkType: hard - -"eslint-config-prettier@npm:^9.0.0": - version: 9.0.0 - resolution: "eslint-config-prettier@npm:9.0.0" - peerDependencies: - eslint: ">=7.0.0" - bin: - eslint-config-prettier: bin/cli.js - checksum: 362e991b6cb343f79362bada2d97c202e5303e6865888918a7445c555fb75e4c078b01278e90be98aa98ae22f8597d8e93d48314bec6824f540f7efcab3ce451 - languageName: node - linkType: hard - -"eslint-scope@npm:^7.2.2": - version: 7.2.2 - resolution: "eslint-scope@npm:7.2.2" - dependencies: - esrecurse: ^4.3.0 - estraverse: ^5.2.0 - checksum: ec97dbf5fb04b94e8f4c5a91a7f0a6dd3c55e46bfc7bbcd0e3138c3a76977570e02ed89a1810c778dcd72072ff0e9621ba1379b4babe53921d71e2e4486fda3e - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": - version: 3.4.3 - resolution: "eslint-visitor-keys@npm:3.4.3" - checksum: 36e9ef87fca698b6fd7ca5ca35d7b2b6eeaaf106572e2f7fd31c12d3bfdaccdb587bba6d3621067e5aece31c8c3a348b93922ab8f7b2cbc6aaab5e1d89040c60 - languageName: node - linkType: hard - -"eslint@npm:^8.51.0": - version: 8.51.0 - resolution: "eslint@npm:8.51.0" - dependencies: - "@eslint-community/eslint-utils": ^4.2.0 - "@eslint-community/regexpp": ^4.6.1 - "@eslint/eslintrc": ^2.1.2 - "@eslint/js": 8.51.0 - "@humanwhocodes/config-array": ^0.11.11 - "@humanwhocodes/module-importer": ^1.0.1 - "@nodelib/fs.walk": ^1.2.8 - 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 - bin: - eslint: bin/eslint.js - checksum: 214fa5d1fcb67af1b8992ce9584ccd85e1aa7a482f8b8ea5b96edc28fa838a18a3b69456db45fc1ed3ef95f1e9efa9714f737292dc681e572d471d02fda9649c - languageName: node - linkType: hard - -"espree@npm:^9.6.0, espree@npm:^9.6.1": - version: 9.6.1 - resolution: "espree@npm:9.6.1" - dependencies: - acorn: ^8.9.0 - acorn-jsx: ^5.3.2 - eslint-visitor-keys: ^3.4.1 - checksum: eb8c149c7a2a77b3f33a5af80c10875c3abd65450f60b8af6db1bfcfa8f101e21c1e56a561c6dc13b848e18148d43469e7cd208506238554fb5395a9ea5a1ab9 - languageName: node - linkType: hard - -"esquery@npm:^1.4.2": - version: 1.5.0 - resolution: "esquery@npm:1.5.0" - dependencies: - estraverse: ^5.1.0 - checksum: aefb0d2596c230118656cd4ec7532d447333a410a48834d80ea648b1e7b5c9bc9ed8b5e33a89cb04e487b60d622f44cf5713bf4abed7c97343edefdc84a35900 - languageName: node - linkType: hard - -"esrecurse@npm:^4.3.0": - version: 4.3.0 - resolution: "esrecurse@npm:4.3.0" - dependencies: - estraverse: ^5.2.0 - checksum: ebc17b1a33c51cef46fdc28b958994b1dc43cd2e86237515cbc3b4e5d2be6a811b2315d0a1a4d9d340b6d2308b15322f5c8291059521cc5f4802f65e7ec32837 - languageName: node - linkType: hard - -"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": - version: 5.3.0 - resolution: "estraverse@npm:5.3.0" - checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b - languageName: node - linkType: hard - -"esutils@npm:^2.0.2": - version: 2.0.3 - resolution: "esutils@npm:2.0.3" - checksum: 22b5b08f74737379a840b8ed2036a5fb35826c709ab000683b092d9054e5c2a82c27818f12604bfc2a9a76b90b6834ef081edbc1c7ae30d1627012e067c6ec87 - languageName: node - linkType: hard - -"exponential-backoff@npm:^3.1.1": - version: 3.1.1 - resolution: "exponential-backoff@npm:3.1.1" - checksum: 3d21519a4f8207c99f7457287291316306255a328770d320b401114ec8481986e4e467e854cb9914dd965e0a1ca810a23ccb559c642c88f4c7f55c55778a9b48 - languageName: node - linkType: hard - -"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": - version: 3.1.3 - resolution: "fast-deep-equal@npm:3.1.3" - checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d - languageName: node - linkType: hard - -"fast-glob@npm:^3.2.9": - version: 3.3.1 - resolution: "fast-glob@npm:3.3.1" - 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 - checksum: b6f3add6403e02cf3a798bfbb1183d0f6da2afd368f27456010c0bc1f9640aea308243d4cb2c0ab142f618276e65ecb8be1661d7c62a7b4e5ba774b9ce5432e5 - languageName: node - linkType: hard - -"fast-json-stable-stringify@npm:^2.0.0": - version: 2.1.0 - resolution: "fast-json-stable-stringify@npm:2.1.0" - checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb - languageName: node - linkType: hard - -"fast-levenshtein@npm:^2.0.6": - version: 2.0.6 - resolution: "fast-levenshtein@npm:2.0.6" - checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c - languageName: node - linkType: hard - -"fastq@npm:^1.6.0": - version: 1.15.0 - resolution: "fastq@npm:1.15.0" - dependencies: - reusify: ^1.0.4 - checksum: 0170e6bfcd5d57a70412440b8ef600da6de3b2a6c5966aeaf0a852d542daff506a0ee92d6de7679d1de82e644bce69d7a574a6c93f0b03964b5337eed75ada1a - languageName: node - linkType: hard - -"file-entry-cache@npm:^6.0.1": - version: 6.0.1 - resolution: "file-entry-cache@npm:6.0.1" - dependencies: - flat-cache: ^3.0.4 - checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 - languageName: node - linkType: hard - -"fill-range@npm:^7.0.1": - version: 7.0.1 - resolution: "fill-range@npm:7.0.1" - dependencies: - to-regex-range: ^5.0.1 - checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 - languageName: node - linkType: hard - -"find-up@npm:^5.0.0": - version: 5.0.0 - resolution: "find-up@npm:5.0.0" - dependencies: - locate-path: ^6.0.0 - path-exists: ^4.0.0 - checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 - languageName: node - linkType: hard - -"flat-cache@npm:^3.0.4": - version: 3.1.1 - resolution: "flat-cache@npm:3.1.1" - dependencies: - flatted: ^3.2.9 - keyv: ^4.5.3 - rimraf: ^3.0.2 - checksum: 4958cfe0f46acf84953d4e16676ef5f0d38eab3a92d532a1e8d5f88f11eea8b36d5d598070ff2aeae15f1fde18f8d7d089eefaf9db10b5a587cc1c9072325c7a - languageName: node - linkType: hard - -"flatted@npm:^3.2.9": - version: 3.2.9 - resolution: "flatted@npm:3.2.9" - checksum: f14167fbe26a9d20f6fca8d998e8f1f41df72c8e81f9f2c9d61ed2bea058248f5e1cbd05e7f88c0e5087a6a0b822a1e5e2b446e879f3cfbe0b07ba2d7f80b026 - languageName: node - linkType: hard - -"foreground-child@npm:^3.1.0": - version: 3.1.1 - resolution: "foreground-child@npm:3.1.1" - dependencies: - cross-spawn: ^7.0.0 - signal-exit: ^4.0.1 - checksum: 139d270bc82dc9e6f8bc045fe2aae4001dc2472157044fdfad376d0a3457f77857fa883c1c8b21b491c6caade9a926a4bed3d3d2e8d3c9202b151a4cbbd0bcd5 - languageName: node - linkType: hard - -"fs-minipass@npm:^2.0.0": - version: 2.1.0 - resolution: "fs-minipass@npm:2.1.0" - dependencies: - minipass: ^3.0.0 - checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1 - languageName: node - linkType: hard - -"fs-minipass@npm:^3.0.0": - version: 3.0.3 - resolution: "fs-minipass@npm:3.0.3" - dependencies: - minipass: ^7.0.3 - checksum: 8722a41109130851d979222d3ec88aabaceeaaf8f57b2a8f744ef8bd2d1ce95453b04a61daa0078822bc5cd21e008814f06fe6586f56fef511e71b8d2394d802 - languageName: node - linkType: hard - -"fs.realpath@npm:^1.0.0": - version: 1.0.0 - resolution: "fs.realpath@npm:1.0.0" - checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 - languageName: node - linkType: hard - -"fsevents@npm:~2.3.2": - version: 2.3.3 - resolution: "fsevents@npm:2.3.3" - dependencies: - node-gyp: latest - checksum: 11e6ea6fea15e42461fc55b4b0e4a0a3c654faa567f1877dbd353f39156f69def97a69936d1746619d656c4b93de2238bf731f6085a03a50cabf287c9d024317 - conditions: os=darwin - languageName: node - linkType: hard - -"fsevents@patch:fsevents@~2.3.2#~builtin": - version: 2.3.3 - resolution: "fsevents@patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=18f3a7" - dependencies: - node-gyp: latest - conditions: os=darwin - languageName: node - linkType: hard - -"gauge@npm:^4.0.3": - version: 4.0.4 - resolution: "gauge@npm:4.0.4" - dependencies: - aproba: ^1.0.3 || ^2.0.0 - color-support: ^1.1.3 - console-control-strings: ^1.1.0 - has-unicode: ^2.0.1 - signal-exit: ^3.0.7 - string-width: ^4.2.3 - strip-ansi: ^6.0.1 - wide-align: ^1.1.5 - checksum: 788b6bfe52f1dd8e263cda800c26ac0ca2ff6de0b6eee2fe0d9e3abf15e149b651bd27bf5226be10e6e3edb5c4e5d5985a5a1a98137e7a892f75eff76467ad2d - languageName: node - linkType: hard - -"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": - version: 5.1.2 - resolution: "glob-parent@npm:5.1.2" - dependencies: - is-glob: ^4.0.1 - checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e - languageName: node - linkType: hard - -"glob-parent@npm:^6.0.2": - version: 6.0.2 - resolution: "glob-parent@npm:6.0.2" - dependencies: - is-glob: ^4.0.3 - checksum: c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8 - languageName: node - linkType: hard - -"glob@npm:^10.2.2": - version: 10.3.10 - resolution: "glob@npm:10.3.10" - dependencies: - foreground-child: ^3.1.0 - jackspeak: ^2.3.5 - minimatch: ^9.0.1 - minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 - path-scurry: ^1.10.1 - bin: - glob: dist/esm/bin.mjs - checksum: 4f2fe2511e157b5a3f525a54092169a5f92405f24d2aed3142f4411df328baca13059f4182f1db1bf933e2c69c0bd89e57ae87edd8950cba8c7ccbe84f721cf3 - languageName: node - linkType: hard - -"glob@npm:^7.1.3, glob@npm:^7.1.4": - version: 7.2.3 - resolution: "glob@npm:7.2.3" - 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 - checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 - languageName: node - linkType: hard - -"globals@npm:^13.19.0": - version: 13.23.0 - resolution: "globals@npm:13.23.0" - dependencies: - type-fest: ^0.20.2 - checksum: 194c97cf8d1ef6ba59417234c2386549c4103b6e5f24b1ff1952de61a4753e5d2069435ba629de711a6480b1b1d114a98e2ab27f85e966d5a10c319c3bbd3dc3 - languageName: node - linkType: hard - -"globby@npm:^11.1.0": - version: 11.1.0 - resolution: "globby@npm:11.1.0" - 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 - checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 - languageName: node - linkType: hard - -"graceful-fs@npm:^4.2.6": - version: 4.2.11 - resolution: "graceful-fs@npm:4.2.11" - checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 - languageName: node - linkType: hard - -"graphemer@npm:^1.4.0": - version: 1.4.0 - resolution: "graphemer@npm:1.4.0" - checksum: bab8f0be9b568857c7bec9fda95a89f87b783546d02951c40c33f84d05bb7da3fd10f863a9beb901463669b6583173a8c8cc6d6b306ea2b9b9d5d3d943c3a673 - languageName: node - linkType: hard - -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b - languageName: node - linkType: hard - -"has-flag@npm:^4.0.0": - version: 4.0.0 - resolution: "has-flag@npm:4.0.0" - checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad - languageName: node - linkType: hard - -"has-unicode@npm:^2.0.1": - version: 2.0.1 - resolution: "has-unicode@npm:2.0.1" - checksum: 1eab07a7436512db0be40a710b29b5dc21fa04880b7f63c9980b706683127e3c1b57cb80ea96d47991bdae2dfe479604f6a1ba410106ee1046a41d1bd0814400 - languageName: node - linkType: hard - -"http-cache-semantics@npm:^4.1.1": - version: 4.1.1 - resolution: "http-cache-semantics@npm:4.1.1" - checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236 - languageName: node - linkType: hard - -"http-proxy-agent@npm:^5.0.0": - version: 5.0.0 - resolution: "http-proxy-agent@npm:5.0.0" - dependencies: - "@tootallnate/once": 2 - agent-base: 6 - debug: 4 - checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786 - languageName: node - linkType: hard - -"https-proxy-agent@npm:^5.0.0": - version: 5.0.1 - resolution: "https-proxy-agent@npm:5.0.1" - dependencies: - agent-base: 6 - debug: 4 - checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 - languageName: node - linkType: hard - -"humanize-ms@npm:^1.2.1": - version: 1.2.1 - resolution: "humanize-ms@npm:1.2.1" - dependencies: - ms: ^2.0.0 - checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16 - languageName: node - linkType: hard - -"iconv-lite@npm:^0.6.2": - version: 0.6.3 - resolution: "iconv-lite@npm:0.6.3" - dependencies: - safer-buffer: ">= 2.1.2 < 3.0.0" - checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf - languageName: node - linkType: hard - -"ignore-by-default@npm:^1.0.1": - version: 1.0.1 - resolution: "ignore-by-default@npm:1.0.1" - checksum: 441509147b3615e0365e407a3c18e189f78c07af08564176c680be1fabc94b6c789cad1342ad887175d4ecd5225de86f73d376cec8e06b42fd9b429505ffcf8a - languageName: node - linkType: hard - -"ignore@npm:^5.2.0, ignore@npm:^5.2.4": - version: 5.2.4 - resolution: "ignore@npm:5.2.4" - checksum: 3d4c309c6006e2621659311783eaea7ebcd41fe4ca1d78c91c473157ad6666a57a2df790fe0d07a12300d9aac2888204d7be8d59f9aaf665b1c7fcdb432517ef - languageName: node - linkType: hard - -"import-fresh@npm:^3.2.1": - version: 3.3.0 - resolution: "import-fresh@npm:3.3.0" - dependencies: - parent-module: ^1.0.0 - resolve-from: ^4.0.0 - checksum: 2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa - languageName: node - linkType: hard - -"imurmurhash@npm:^0.1.4": - version: 0.1.4 - resolution: "imurmurhash@npm:0.1.4" - checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 - languageName: node - linkType: hard - -"indent-string@npm:^4.0.0": - version: 4.0.0 - resolution: "indent-string@npm:4.0.0" - checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 - languageName: node - linkType: hard - -"inflight@npm:^1.0.4": - version: 1.0.6 - resolution: "inflight@npm:1.0.6" - dependencies: - once: ^1.3.0 - wrappy: 1 - checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd - languageName: node - linkType: hard - -"inherits@npm:2, inherits@npm:^2.0.3": - version: 2.0.4 - resolution: "inherits@npm:2.0.4" - checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 - languageName: node - linkType: hard - -"ip@npm:^2.0.0": - version: 2.0.0 - resolution: "ip@npm:2.0.0" - checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349 - languageName: node - linkType: hard - -"is-binary-path@npm:~2.1.0": - version: 2.1.0 - resolution: "is-binary-path@npm:2.1.0" - dependencies: - binary-extensions: ^2.0.0 - checksum: 84192eb88cff70d320426f35ecd63c3d6d495da9d805b19bc65b518984b7c0760280e57dbf119b7e9be6b161784a5a673ab2c6abe83abb5198a432232ad5b35c - languageName: node - linkType: hard - -"is-extglob@npm:^2.1.1": - version: 2.1.1 - resolution: "is-extglob@npm:2.1.1" - checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^3.0.0": - version: 3.0.0 - resolution: "is-fullwidth-code-point@npm:3.0.0" - checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 - languageName: node - linkType: hard - -"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": - version: 4.0.3 - resolution: "is-glob@npm:4.0.3" - dependencies: - is-extglob: ^2.1.1 - checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 - languageName: node - linkType: hard - -"is-lambda@npm:^1.0.1": - version: 1.0.1 - resolution: "is-lambda@npm:1.0.1" - checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35 - languageName: node - linkType: hard - -"is-number@npm:^7.0.0": - version: 7.0.0 - resolution: "is-number@npm:7.0.0" - checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a - languageName: node - linkType: hard - -"is-path-inside@npm:^3.0.3": - version: 3.0.3 - resolution: "is-path-inside@npm:3.0.3" - checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 - languageName: node - linkType: hard - -"isexe@npm:^2.0.0": - version: 2.0.0 - resolution: "isexe@npm:2.0.0" - checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 - languageName: node - linkType: hard - -"isows@npm:1.0.3": - version: 1.0.3 - resolution: "isows@npm:1.0.3" - peerDependencies: - ws: "*" - checksum: 9cacd5cf59f67deb51e825580cd445ab1725ecb05a67c704050383fb772856f3cd5e7da8ad08f5a3bd2823680d77d099459d0c6a7037972a74d6429af61af440 - languageName: node - linkType: hard - -"jackspeak@npm:^2.3.5": - version: 2.3.6 - resolution: "jackspeak@npm:2.3.6" - dependencies: - "@isaacs/cliui": ^8.0.2 - "@pkgjs/parseargs": ^0.11.0 - dependenciesMeta: - "@pkgjs/parseargs": - optional: true - checksum: 57d43ad11eadc98cdfe7496612f6bbb5255ea69fe51ea431162db302c2a11011642f50cfad57288bd0aea78384a0612b16e131944ad8ecd09d619041c8531b54 - languageName: node - linkType: hard - -"js-yaml@npm:^4.1.0": - version: 4.1.0 - resolution: "js-yaml@npm:4.1.0" - dependencies: - argparse: ^2.0.1 - bin: - js-yaml: bin/js-yaml.js - checksum: c7830dfd456c3ef2c6e355cc5a92e6700ceafa1d14bba54497b34a99f0376cecbb3e9ac14d3e5849b426d5a5140709a66237a8c991c675431271c4ce5504151a - languageName: node - linkType: hard - -"json-buffer@npm:3.0.1": - version: 3.0.1 - resolution: "json-buffer@npm:3.0.1" - checksum: 9026b03edc2847eefa2e37646c579300a1f3a4586cfb62bf857832b60c852042d0d6ae55d1afb8926163fa54c2b01d83ae24705f34990348bdac6273a29d4581 - languageName: node - linkType: hard - -"json-schema-traverse@npm:^0.4.1": - version: 0.4.1 - resolution: "json-schema-traverse@npm:0.4.1" - checksum: 7486074d3ba247769fda17d5181b345c9fb7d12e0da98b22d1d71a5db9698d8b4bd900a3ec1a4ffdd60846fc2556274a5c894d0c48795f14cb03aeae7b55260b - languageName: node - linkType: hard - -"json-stable-stringify-without-jsonify@npm:^1.0.1": - version: 1.0.1 - resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" - checksum: cff44156ddce9c67c44386ad5cddf91925fe06b1d217f2da9c4910d01f358c6e3989c4d5a02683c7a5667f9727ff05831f7aa8ae66c8ff691c556f0884d49215 - languageName: node - linkType: hard - -"keyv@npm:^4.5.3": - version: 4.5.4 - resolution: "keyv@npm:4.5.4" - dependencies: - json-buffer: 3.0.1 - checksum: 74a24395b1c34bd44ad5cb2b49140d087553e170625240b86755a6604cd65aa16efdbdeae5cdb17ba1284a0fbb25ad06263755dbc71b8d8b06f74232ce3cdd72 - languageName: node - linkType: hard - -"levn@npm:^0.4.1": - version: 0.4.1 - resolution: "levn@npm:0.4.1" - dependencies: - prelude-ls: ^1.2.1 - type-check: ~0.4.0 - checksum: 12c5021c859bd0f5248561bf139121f0358285ec545ebf48bb3d346820d5c61a4309535c7f387ed7d84361cf821e124ce346c6b7cef8ee09a67c1473b46d0fc4 - languageName: node - linkType: hard - -"locate-path@npm:^6.0.0": - version: 6.0.0 - resolution: "locate-path@npm:6.0.0" - dependencies: - p-locate: ^5.0.0 - checksum: 72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a - languageName: node - linkType: hard - -"lodash.merge@npm:^4.6.2": - version: 4.6.2 - resolution: "lodash.merge@npm:4.6.2" - checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005 - languageName: node - linkType: hard - -"lru-cache@npm:^6.0.0": - version: 6.0.0 - resolution: "lru-cache@npm:6.0.0" - dependencies: - yallist: ^4.0.0 - checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 - languageName: node - linkType: hard - -"lru-cache@npm:^7.7.1": - version: 7.18.3 - resolution: "lru-cache@npm:7.18.3" - checksum: e550d772384709deea3f141af34b6d4fa392e2e418c1498c078de0ee63670f1f46f5eee746e8ef7e69e1c895af0d4224e62ee33e66a543a14763b0f2e74c1356 - languageName: node - linkType: hard - -"lru-cache@npm:^9.1.1 || ^10.0.0": - version: 10.0.1 - resolution: "lru-cache@npm:10.0.1" - checksum: 06f8d0e1ceabd76bb6f644a26dbb0b4c471b79c7b514c13c6856113879b3bf369eb7b497dad4ff2b7e2636db202412394865b33c332100876d838ad1372f0181 - languageName: node - linkType: hard - -"make-error@npm:^1.1.1": - version: 1.3.6 - resolution: "make-error@npm:1.3.6" - checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 - languageName: node - linkType: hard - -"make-fetch-happen@npm:^11.0.3": - version: 11.1.1 - resolution: "make-fetch-happen@npm:11.1.1" - dependencies: - agentkeepalive: ^4.2.1 - cacache: ^17.0.0 - http-cache-semantics: ^4.1.1 - http-proxy-agent: ^5.0.0 - https-proxy-agent: ^5.0.0 - is-lambda: ^1.0.1 - lru-cache: ^7.7.1 - minipass: ^5.0.0 - minipass-fetch: ^3.0.0 - minipass-flush: ^1.0.5 - minipass-pipeline: ^1.2.4 - negotiator: ^0.6.3 - promise-retry: ^2.0.1 - socks-proxy-agent: ^7.0.0 - ssri: ^10.0.0 - checksum: 7268bf274a0f6dcf0343829489a4506603ff34bd0649c12058753900b0eb29191dce5dba12680719a5d0a983d3e57810f594a12f3c18494e93a1fbc6348a4540 - languageName: node - linkType: hard - -"merge2@npm:^1.3.0, merge2@npm:^1.4.1": - version: 1.4.1 - resolution: "merge2@npm:1.4.1" - checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 - languageName: node - linkType: hard - -"micromatch@npm:^4.0.4": - version: 4.0.5 - resolution: "micromatch@npm:4.0.5" - dependencies: - braces: ^3.0.2 - picomatch: ^2.3.1 - checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc - languageName: node - linkType: hard - -"minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": - version: 3.1.2 - resolution: "minimatch@npm:3.1.2" - dependencies: - brace-expansion: ^1.1.7 - checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a - languageName: node - linkType: hard - -"minimatch@npm:^9.0.1": - version: 9.0.3 - resolution: "minimatch@npm:9.0.3" - dependencies: - brace-expansion: ^2.0.1 - checksum: 253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5 - languageName: node - linkType: hard - -"minipass-collect@npm:^1.0.2": - version: 1.0.2 - resolution: "minipass-collect@npm:1.0.2" - dependencies: - minipass: ^3.0.0 - checksum: 14df761028f3e47293aee72888f2657695ec66bd7d09cae7ad558da30415fdc4752bbfee66287dcc6fd5e6a2fa3466d6c484dc1cbd986525d9393b9523d97f10 - languageName: node - linkType: hard - -"minipass-fetch@npm:^3.0.0": - version: 3.0.4 - resolution: "minipass-fetch@npm:3.0.4" - dependencies: - encoding: ^0.1.13 - minipass: ^7.0.3 - minipass-sized: ^1.0.3 - minizlib: ^2.1.2 - dependenciesMeta: - encoding: - optional: true - checksum: af7aad15d5c128ab1ebe52e043bdf7d62c3c6f0cecb9285b40d7b395e1375b45dcdfd40e63e93d26a0e8249c9efd5c325c65575aceee192883970ff8cb11364a - languageName: node - linkType: hard - -"minipass-flush@npm:^1.0.5": - version: 1.0.5 - resolution: "minipass-flush@npm:1.0.5" - dependencies: - minipass: ^3.0.0 - checksum: 56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf - languageName: node - linkType: hard - -"minipass-pipeline@npm:^1.2.4": - version: 1.2.4 - resolution: "minipass-pipeline@npm:1.2.4" - dependencies: - minipass: ^3.0.0 - checksum: b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b - languageName: node - linkType: hard - -"minipass-sized@npm:^1.0.3": - version: 1.0.3 - resolution: "minipass-sized@npm:1.0.3" - dependencies: - minipass: ^3.0.0 - checksum: 79076749fcacf21b5d16dd596d32c3b6bf4d6e62abb43868fac21674078505c8b15eaca4e47ed844985a4514854f917d78f588fcd029693709417d8f98b2bd60 - languageName: node - linkType: hard - -"minipass@npm:^3.0.0": - version: 3.3.6 - resolution: "minipass@npm:3.3.6" - dependencies: - yallist: ^4.0.0 - checksum: a30d083c8054cee83cdcdc97f97e4641a3f58ae743970457b1489ce38ee1167b3aaf7d815cd39ec7a99b9c40397fd4f686e83750e73e652b21cb516f6d845e48 - languageName: node - linkType: hard - -"minipass@npm:^5.0.0": - version: 5.0.0 - resolution: "minipass@npm:5.0.0" - checksum: 425dab288738853fded43da3314a0b5c035844d6f3097a8e3b5b29b328da8f3c1af6fc70618b32c29ff906284cf6406b6841376f21caaadd0793c1d5a6a620ea - languageName: node - linkType: hard - -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.3": - version: 7.0.4 - resolution: "minipass@npm:7.0.4" - checksum: 87585e258b9488caf2e7acea242fd7856bbe9a2c84a7807643513a338d66f368c7d518200ad7b70a508664d408aa000517647b2930c259a8b1f9f0984f344a21 - languageName: node - linkType: hard - -"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": - version: 2.1.2 - resolution: "minizlib@npm:2.1.2" - dependencies: - minipass: ^3.0.0 - yallist: ^4.0.0 - checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3 - languageName: node - linkType: hard - -"mkdirp@npm:^1.0.3": - version: 1.0.4 - resolution: "mkdirp@npm:1.0.4" - bin: - mkdirp: bin/cmd.js - checksum: a96865108c6c3b1b8e1d5e9f11843de1e077e57737602de1b82030815f311be11f96f09cce59bd5b903d0b29834733e5313f9301e3ed6d6f6fba2eae0df4298f - languageName: node - linkType: hard - -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f - languageName: node - linkType: hard - -"ms@npm:^2.0.0, ms@npm:^2.1.1": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d - languageName: node - linkType: hard - -"natural-compare@npm:^1.4.0": - version: 1.4.0 - resolution: "natural-compare@npm:1.4.0" - checksum: 23ad088b08f898fc9b53011d7bb78ec48e79de7627e01ab5518e806033861bef68d5b0cd0e2205c2f36690ac9571ff6bcb05eb777ced2eeda8d4ac5b44592c3d - languageName: node - linkType: hard - -"negotiator@npm:^0.6.3": - version: 0.6.3 - resolution: "negotiator@npm:0.6.3" - checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 - languageName: node - linkType: hard - -"node-cron@npm:^3.0.2": - version: 3.0.2 - resolution: "node-cron@npm:3.0.2" - dependencies: - uuid: 8.3.2 - checksum: dd21585c0d4069a0752022dad9b8380a4393c4783ec78355ffa99ff32b018c3743a35d4ebf9d7c7863949e94e302b440f58c884eb4960e71c7260d817e2d3f25 - languageName: node - linkType: hard - -"node-gyp@npm:latest": - version: 9.4.0 - resolution: "node-gyp@npm:9.4.0" - dependencies: - env-paths: ^2.2.0 - exponential-backoff: ^3.1.1 - glob: ^7.1.4 - graceful-fs: ^4.2.6 - make-fetch-happen: ^11.0.3 - nopt: ^6.0.0 - npmlog: ^6.0.0 - rimraf: ^3.0.2 - semver: ^7.3.5 - tar: ^6.1.2 - which: ^2.0.2 - bin: - node-gyp: bin/node-gyp.js - checksum: 78b404e2e0639d64e145845f7f5a3cb20c0520cdaf6dda2f6e025e9b644077202ea7de1232396ba5bde3fee84cdc79604feebe6ba3ec84d464c85d407bb5da99 - languageName: node - linkType: hard - -"nodemon@npm:^3.0.1": - version: 3.0.1 - resolution: "nodemon@npm:3.0.1" - dependencies: - chokidar: ^3.5.2 - debug: ^3.2.7 - ignore-by-default: ^1.0.1 - minimatch: ^3.1.2 - pstree.remy: ^1.1.8 - semver: ^7.5.3 - simple-update-notifier: ^2.0.0 - supports-color: ^5.5.0 - touch: ^3.1.0 - undefsafe: ^2.0.5 - bin: - nodemon: bin/nodemon.js - checksum: 6a5d81855760d6617049eccce10ccf02bddb482dab13ceea5280ae595ec7004eee13e7b934368e3f46c37fe4d970342a8c38c99cae7e93e4d7a3ed1c1ecb6acf - languageName: node - linkType: hard - -"nopt@npm:^6.0.0": - version: 6.0.0 - resolution: "nopt@npm:6.0.0" - dependencies: - abbrev: ^1.0.0 - bin: - nopt: bin/nopt.js - checksum: 82149371f8be0c4b9ec2f863cc6509a7fd0fa729929c009f3a58e4eb0c9e4cae9920e8f1f8eb46e7d032fec8fb01bede7f0f41a67eb3553b7b8e14fa53de1dac - languageName: node - linkType: hard - -"nopt@npm:~1.0.10": - version: 1.0.10 - resolution: "nopt@npm:1.0.10" - dependencies: - abbrev: 1 - bin: - nopt: ./bin/nopt.js - checksum: f62575aceaa3be43f365bf37a596b89bbac2e796b001b6d2e2a85c2140a4e378ff919e2753ccba959c4fd344776fc88c29b393bc167fa939fb1513f126f4cd45 - languageName: node - linkType: hard - -"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": - version: 3.0.0 - resolution: "normalize-path@npm:3.0.0" - checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 - languageName: node - linkType: hard - -"npmlog@npm:^6.0.0": - version: 6.0.2 - resolution: "npmlog@npm:6.0.2" - dependencies: - are-we-there-yet: ^3.0.0 - console-control-strings: ^1.1.0 - gauge: ^4.0.3 - set-blocking: ^2.0.0 - checksum: ae238cd264a1c3f22091cdd9e2b106f684297d3c184f1146984ecbe18aaa86343953f26b9520dedd1b1372bc0316905b736c1932d778dbeb1fcf5a1001390e2a - languageName: node - linkType: hard - -"once@npm:^1.3.0": - version: 1.4.0 - resolution: "once@npm:1.4.0" - dependencies: - wrappy: 1 - checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 - languageName: node - linkType: hard - -"optionator@npm:^0.9.3": - version: 0.9.3 - resolution: "optionator@npm:0.9.3" - 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 - checksum: 09281999441f2fe9c33a5eeab76700795365a061563d66b098923eb719251a42bdbe432790d35064d0816ead9296dbeb1ad51a733edf4167c96bd5d0882e428a - languageName: node - linkType: hard - -"p-limit@npm:^3.0.2": - version: 3.1.0 - resolution: "p-limit@npm:3.1.0" - dependencies: - yocto-queue: ^0.1.0 - checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 - languageName: node - linkType: hard - -"p-locate@npm:^5.0.0": - version: 5.0.0 - resolution: "p-locate@npm:5.0.0" - dependencies: - p-limit: ^3.0.2 - checksum: 1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3 - languageName: node - linkType: hard - -"p-map@npm:^4.0.0": - version: 4.0.0 - resolution: "p-map@npm:4.0.0" - dependencies: - aggregate-error: ^3.0.0 - checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c - languageName: node - linkType: hard - -"parent-module@npm:^1.0.0": - version: 1.0.1 - resolution: "parent-module@npm:1.0.1" - dependencies: - callsites: ^3.0.0 - checksum: 6ba8b255145cae9470cf5551eb74be2d22281587af787a2626683a6c20fbb464978784661478dd2a3f1dad74d1e802d403e1b03c1a31fab310259eec8ac560ff - languageName: node - linkType: hard - -"path-exists@npm:^4.0.0": - version: 4.0.0 - resolution: "path-exists@npm:4.0.0" - checksum: 505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 - languageName: node - linkType: hard - -"path-is-absolute@npm:^1.0.0": - version: 1.0.1 - resolution: "path-is-absolute@npm:1.0.1" - checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 - languageName: node - linkType: hard - -"path-key@npm:^3.1.0": - version: 3.1.1 - resolution: "path-key@npm:3.1.1" - checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 - languageName: node - linkType: hard - -"path-scurry@npm:^1.10.1": - version: 1.10.1 - resolution: "path-scurry@npm:1.10.1" - dependencies: - lru-cache: ^9.1.1 || ^10.0.0 - minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 - checksum: e2557cff3a8fb8bc07afdd6ab163a92587884f9969b05bbbaf6fe7379348bfb09af9ed292af12ed32398b15fb443e81692047b786d1eeb6d898a51eb17ed7d90 - languageName: node - linkType: hard - -"path-type@npm:^4.0.0": - version: 4.0.0 - resolution: "path-type@npm:4.0.0" - checksum: 5b1e2daa247062061325b8fdbfd1fb56dde0a448fb1455453276ea18c60685bdad23a445dc148cf87bc216be1573357509b7d4060494a6fd768c7efad833ee45 - languageName: node - linkType: hard - -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1": - version: 2.3.1 - resolution: "picomatch@npm:2.3.1" - checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf - languageName: node - linkType: hard - -"prelude-ls@npm:^1.2.1": - version: 1.2.1 - resolution: "prelude-ls@npm:1.2.1" - checksum: cd192ec0d0a8e4c6da3bb80e4f62afe336df3f76271ac6deb0e6a36187133b6073a19e9727a1ff108cd8b9982e4768850d413baa71214dd80c7979617dca827a - languageName: node - linkType: hard - -"prettier@npm:^3.0.3": - version: 3.0.3 - resolution: "prettier@npm:3.0.3" - bin: - prettier: bin/prettier.cjs - checksum: e10b9af02b281f6c617362ebd2571b1d7fc9fb8a3bd17e371754428cda992e5e8d8b7a046e8f7d3e2da1dcd21aa001e2e3c797402ebb6111b5cd19609dd228e0 - languageName: node - linkType: hard - -"promise-retry@npm:^2.0.1": - version: 2.0.1 - resolution: "promise-retry@npm:2.0.1" - dependencies: - err-code: ^2.0.2 - retry: ^0.12.0 - checksum: f96a3f6d90b92b568a26f71e966cbbc0f63ab85ea6ff6c81284dc869b41510e6cdef99b6b65f9030f0db422bf7c96652a3fff9f2e8fb4a0f069d8f4430359429 - languageName: node - linkType: hard - -"pstree.remy@npm:^1.1.8": - version: 1.1.8 - resolution: "pstree.remy@npm:1.1.8" - checksum: 5cb53698d6bb34dfb278c8a26957964aecfff3e161af5fbf7cee00bbe9d8547c7aced4bd9cb193bce15fb56e9e4220fc02a5bf9c14345ffb13a36b858701ec2d - languageName: node - linkType: hard - -"punycode@npm:^2.1.0": - version: 2.3.0 - resolution: "punycode@npm:2.3.0" - checksum: 39f760e09a2a3bbfe8f5287cf733ecdad69d6af2fe6f97ca95f24b8921858b91e9ea3c9eeec6e08cede96181b3bb33f95c6ffd8c77e63986508aa2e8159fa200 - languageName: node - linkType: hard - -"queue-microtask@npm:^1.2.2": - version: 1.2.3 - resolution: "queue-microtask@npm:1.2.3" - checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 - languageName: node - linkType: hard - -"readable-stream@npm:^3.6.0": - version: 3.6.2 - resolution: "readable-stream@npm:3.6.2" - dependencies: - inherits: ^2.0.3 - string_decoder: ^1.1.1 - util-deprecate: ^1.0.1 - checksum: bdcbe6c22e846b6af075e32cf8f4751c2576238c5043169a1c221c92ee2878458a816a4ea33f4c67623c0b6827c8a400409bfb3cf0bf3381392d0b1dfb52ac8d - languageName: node - linkType: hard - -"readdirp@npm:~3.6.0": - version: 3.6.0 - resolution: "readdirp@npm:3.6.0" - dependencies: - picomatch: ^2.2.1 - checksum: 1ced032e6e45670b6d7352d71d21ce7edf7b9b928494dcaba6f11fba63180d9da6cd7061ebc34175ffda6ff529f481818c962952004d273178acd70f7059b320 - languageName: node - linkType: hard - -"reporter@workspace:.": - version: 0.0.0-use.local - resolution: "reporter@workspace:." - dependencies: - "@typescript-eslint/eslint-plugin": ^6.7.5 - "@typescript-eslint/parser": ^6.7.5 - dotenv: ^16.3.1 - eslint: ^8.51.0 - eslint-config-prettier: ^9.0.0 - node-cron: ^3.0.2 - nodemon: ^3.0.1 - prettier: ^3.0.3 - ts-node: ^10.9.1 - typescript: ^5.2.2 - viem: ^1.16.5 - languageName: unknown - linkType: soft - -"resolve-from@npm:^4.0.0": - version: 4.0.0 - resolution: "resolve-from@npm:4.0.0" - checksum: f4ba0b8494846a5066328ad33ef8ac173801a51739eb4d63408c847da9a2e1c1de1e6cbbf72699211f3d13f8fc1325648b169bd15eb7da35688e30a5fb0e4a7f - languageName: node - linkType: hard - -"retry@npm:^0.12.0": - version: 0.12.0 - resolution: "retry@npm:0.12.0" - checksum: 623bd7d2e5119467ba66202d733ec3c2e2e26568074923bc0585b6b99db14f357e79bdedb63cab56cec47491c4a0da7e6021a7465ca6dc4f481d3898fdd3158c - languageName: node - linkType: hard - -"reusify@npm:^1.0.4": - version: 1.0.4 - resolution: "reusify@npm:1.0.4" - checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc - languageName: node - linkType: hard - -"rimraf@npm:^3.0.2": - version: 3.0.2 - resolution: "rimraf@npm:3.0.2" - dependencies: - glob: ^7.1.3 - bin: - rimraf: bin.js - checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 - languageName: node - linkType: hard - -"run-parallel@npm:^1.1.9": - version: 1.2.0 - resolution: "run-parallel@npm:1.2.0" - dependencies: - queue-microtask: ^1.2.2 - checksum: cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d - languageName: node - linkType: hard - -"safe-buffer@npm:~5.2.0": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 - languageName: node - linkType: hard - -"safer-buffer@npm:>= 2.1.2 < 3.0.0": - version: 2.1.2 - resolution: "safer-buffer@npm:2.1.2" - checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 - languageName: node - linkType: hard - -"semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4": - version: 7.5.4 - resolution: "semver@npm:7.5.4" - dependencies: - lru-cache: ^6.0.0 - bin: - semver: bin/semver.js - checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 - languageName: node - linkType: hard - -"set-blocking@npm:^2.0.0": - version: 2.0.0 - resolution: "set-blocking@npm:2.0.0" - checksum: 6e65a05f7cf7ebdf8b7c75b101e18c0b7e3dff4940d480efed8aad3a36a4005140b660fa1d804cb8bce911cac290441dc728084a30504d3516ac2ff7ad607b02 - languageName: node - linkType: hard - -"shebang-command@npm:^2.0.0": - version: 2.0.0 - resolution: "shebang-command@npm:2.0.0" - dependencies: - shebang-regex: ^3.0.0 - checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa - languageName: node - linkType: hard - -"shebang-regex@npm:^3.0.0": - version: 3.0.0 - resolution: "shebang-regex@npm:3.0.0" - checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 - languageName: node - linkType: hard - -"signal-exit@npm:^3.0.7": - version: 3.0.7 - resolution: "signal-exit@npm:3.0.7" - checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 - languageName: node - linkType: hard - -"signal-exit@npm:^4.0.1": - version: 4.1.0 - resolution: "signal-exit@npm:4.1.0" - checksum: 64c757b498cb8629ffa5f75485340594d2f8189e9b08700e69199069c8e3070fb3e255f7ab873c05dc0b3cec412aea7402e10a5990cb6a050bd33ba062a6c549 - languageName: node - linkType: hard - -"simple-update-notifier@npm:^2.0.0": - version: 2.0.0 - resolution: "simple-update-notifier@npm:2.0.0" - dependencies: - semver: ^7.5.3 - checksum: 9ba00d38ce6a29682f64a46213834e4eb01634c2f52c813a9a7b8873ca49cdbb703696f3290f3b27dc067de6d9418b0b84bef22c3eb074acf352529b2d6c27fd - languageName: node - linkType: hard - -"slash@npm:^3.0.0": - version: 3.0.0 - resolution: "slash@npm:3.0.0" - checksum: 94a93fff615f25a999ad4b83c9d5e257a7280c90a32a7cb8b4a87996e4babf322e469c42b7f649fd5796edd8687652f3fb452a86dc97a816f01113183393f11c - languageName: node - linkType: hard - -"smart-buffer@npm:^4.2.0": - version: 4.2.0 - resolution: "smart-buffer@npm:4.2.0" - checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b - languageName: node - linkType: hard - -"socks-proxy-agent@npm:^7.0.0": - version: 7.0.0 - resolution: "socks-proxy-agent@npm:7.0.0" - dependencies: - agent-base: ^6.0.2 - debug: ^4.3.3 - socks: ^2.6.2 - checksum: 720554370154cbc979e2e9ce6a6ec6ced205d02757d8f5d93fe95adae454fc187a5cbfc6b022afab850a5ce9b4c7d73e0f98e381879cf45f66317a4895953846 - languageName: node - linkType: hard - -"socks@npm:^2.6.2": - version: 2.7.1 - resolution: "socks@npm:2.7.1" - dependencies: - ip: ^2.0.0 - smart-buffer: ^4.2.0 - checksum: 259d9e3e8e1c9809a7f5c32238c3d4d2a36b39b83851d0f573bfde5f21c4b1288417ce1af06af1452569cd1eb0841169afd4998f0e04ba04656f6b7f0e46d748 - languageName: node - linkType: hard - -"ssri@npm:^10.0.0": - version: 10.0.5 - resolution: "ssri@npm:10.0.5" - dependencies: - minipass: ^7.0.3 - checksum: 0a31b65f21872dea1ed3f7c200d7bc1c1b91c15e419deca14f282508ba917cbb342c08a6814c7f68ca4ca4116dd1a85da2bbf39227480e50125a1ceffeecb750 - languageName: node - linkType: hard - -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.3": - version: 4.2.3 - resolution: "string-width@npm:4.2.3" - dependencies: - emoji-regex: ^8.0.0 - is-fullwidth-code-point: ^3.0.0 - strip-ansi: ^6.0.1 - checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb - languageName: node - linkType: hard - -"string-width@npm:^5.0.1, string-width@npm:^5.1.2": - version: 5.1.2 - resolution: "string-width@npm:5.1.2" - dependencies: - eastasianwidth: ^0.2.0 - emoji-regex: ^9.2.2 - strip-ansi: ^7.0.1 - checksum: 7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 - languageName: node - linkType: hard - -"string_decoder@npm:^1.1.1": - version: 1.3.0 - resolution: "string_decoder@npm:1.3.0" - dependencies: - safe-buffer: ~5.2.0 - checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 - languageName: node - linkType: hard - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": - version: 6.0.1 - resolution: "strip-ansi@npm:6.0.1" - dependencies: - ansi-regex: ^5.0.1 - checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c - languageName: node - linkType: hard - -"strip-ansi@npm:^7.0.1": - version: 7.1.0 - resolution: "strip-ansi@npm:7.1.0" - dependencies: - ansi-regex: ^6.0.1 - checksum: 859c73fcf27869c22a4e4d8c6acfe690064659e84bef9458aa6d13719d09ca88dcfd40cbf31fd0be63518ea1a643fe070b4827d353e09533a5b0b9fd4553d64d - languageName: node - linkType: hard - -"strip-json-comments@npm:^3.1.1": - version: 3.1.1 - resolution: "strip-json-comments@npm:3.1.1" - checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 - languageName: node - linkType: hard - -"supports-color@npm:^5.5.0": - version: 5.5.0 - resolution: "supports-color@npm:5.5.0" - dependencies: - has-flag: ^3.0.0 - checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac - languageName: node - linkType: hard - -"supports-color@npm:^7.1.0": - version: 7.2.0 - resolution: "supports-color@npm:7.2.0" - dependencies: - has-flag: ^4.0.0 - checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a - languageName: node - linkType: hard - -"tar@npm:^6.1.11, tar@npm:^6.1.2": - version: 6.2.0 - resolution: "tar@npm:6.2.0" - dependencies: - chownr: ^2.0.0 - fs-minipass: ^2.0.0 - minipass: ^5.0.0 - minizlib: ^2.1.1 - mkdirp: ^1.0.3 - yallist: ^4.0.0 - checksum: db4d9fe74a2082c3a5016630092c54c8375ff3b280186938cfd104f2e089c4fd9bad58688ef6be9cf186a889671bf355c7cda38f09bbf60604b281715ca57f5c - languageName: node - linkType: hard - -"text-table@npm:^0.2.0": - version: 0.2.0 - resolution: "text-table@npm:0.2.0" - checksum: b6937a38c80c7f84d9c11dd75e49d5c44f71d95e810a3250bd1f1797fc7117c57698204adf676b71497acc205d769d65c16ae8fa10afad832ae1322630aef10a - languageName: node - linkType: hard - -"to-regex-range@npm:^5.0.1": - version: 5.0.1 - resolution: "to-regex-range@npm:5.0.1" - dependencies: - is-number: ^7.0.0 - checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed - languageName: node - linkType: hard - -"touch@npm:^3.1.0": - version: 3.1.0 - resolution: "touch@npm:3.1.0" - dependencies: - nopt: ~1.0.10 - bin: - nodetouch: ./bin/nodetouch.js - checksum: e0be589cb5b0e6dbfce6e7e077d4a0d5f0aba558ef769c6d9c33f635e00d73d5be49da6f8631db302ee073919d82b5b7f56da2987feb28765c95a7673af68647 - languageName: node - linkType: hard - -"ts-api-utils@npm:^1.0.1": - version: 1.0.3 - resolution: "ts-api-utils@npm:1.0.3" - peerDependencies: - typescript: ">=4.2.0" - checksum: 441cc4489d65fd515ae6b0f4eb8690057add6f3b6a63a36073753547fb6ce0c9ea0e0530220a0b282b0eec535f52c4dfc315d35f8a4c9a91c0def0707a714ca6 - languageName: node - linkType: hard - -"ts-node@npm:^10.9.1": - version: 10.9.1 - resolution: "ts-node@npm:10.9.1" - dependencies: - "@cspotcode/source-map-support": ^0.8.0 - "@tsconfig/node10": ^1.0.7 - "@tsconfig/node12": ^1.0.7 - "@tsconfig/node14": ^1.0.0 - "@tsconfig/node16": ^1.0.2 - acorn: ^8.4.1 - acorn-walk: ^8.1.1 - arg: ^4.1.0 - create-require: ^1.1.0 - diff: ^4.0.1 - make-error: ^1.1.1 - v8-compile-cache-lib: ^3.0.1 - yn: 3.1.1 - peerDependencies: - "@swc/core": ">=1.2.50" - "@swc/wasm": ">=1.2.50" - "@types/node": "*" - typescript: ">=2.7" - peerDependenciesMeta: - "@swc/core": - optional: true - "@swc/wasm": - optional: true - bin: - ts-node: dist/bin.js - ts-node-cwd: dist/bin-cwd.js - ts-node-esm: dist/bin-esm.js - ts-node-script: dist/bin-script.js - ts-node-transpile-only: dist/bin-transpile.js - ts-script: dist/bin-script-deprecated.js - checksum: 090adff1302ab20bd3486e6b4799e90f97726ed39e02b39e566f8ab674fd5bd5f727f43615debbfc580d33c6d9d1c6b1b3ce7d8e3cca3e20530a145ffa232c35 - languageName: node - linkType: hard - -"type-check@npm:^0.4.0, type-check@npm:~0.4.0": - version: 0.4.0 - resolution: "type-check@npm:0.4.0" - dependencies: - prelude-ls: ^1.2.1 - checksum: ec688ebfc9c45d0c30412e41ca9c0cdbd704580eb3a9ccf07b9b576094d7b86a012baebc95681999dd38f4f444afd28504cb3a89f2ef16b31d4ab61a0739025a - languageName: node - linkType: hard - -"type-fest@npm:^0.20.2": - version: 0.20.2 - resolution: "type-fest@npm:0.20.2" - checksum: 4fb3272df21ad1c552486f8a2f8e115c09a521ad7a8db3d56d53718d0c907b62c6e9141ba5f584af3f6830d0872c521357e512381f24f7c44acae583ad517d73 - languageName: node - linkType: hard - -"typescript@npm:^5.2.2": - version: 5.2.2 - resolution: "typescript@npm:5.2.2" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 7912821dac4d962d315c36800fe387cdc0a6298dba7ec171b350b4a6e988b51d7b8f051317786db1094bd7431d526b648aba7da8236607febb26cf5b871d2d3c - languageName: node - linkType: hard - -"typescript@patch:typescript@^5.2.2#~builtin": - version: 5.2.2 - resolution: "typescript@patch:typescript@npm%3A5.2.2#~builtin::version=5.2.2&hash=7ad353" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 07106822b4305de3f22835cbba949a2b35451cad50888759b6818421290ff95d522b38ef7919e70fb381c5fe9c1c643d7dea22c8b31652a717ddbd57b7f4d554 - languageName: node - linkType: hard - -"undefsafe@npm:^2.0.5": - version: 2.0.5 - resolution: "undefsafe@npm:2.0.5" - checksum: f42ab3b5770fedd4ada175fc1b2eb775b78f609156f7c389106aafd231bfc210813ee49f54483d7191d7b76e483bc7f537b5d92d19ded27156baf57592eb02cc - languageName: node - linkType: hard - -"unique-filename@npm:^3.0.0": - version: 3.0.0 - resolution: "unique-filename@npm:3.0.0" - dependencies: - unique-slug: ^4.0.0 - checksum: 8e2f59b356cb2e54aab14ff98a51ac6c45781d15ceaab6d4f1c2228b780193dc70fae4463ce9e1df4479cb9d3304d7c2043a3fb905bdeca71cc7e8ce27e063df - languageName: node - linkType: hard - -"unique-slug@npm:^4.0.0": - version: 4.0.0 - resolution: "unique-slug@npm:4.0.0" - dependencies: - imurmurhash: ^0.1.4 - checksum: 0884b58365af59f89739e6f71e3feacb5b1b41f2df2d842d0757933620e6de08eff347d27e9d499b43c40476cbaf7988638d3acb2ffbcb9d35fd035591adfd15 - languageName: node - linkType: hard - -"uri-js@npm:^4.2.2": - version: 4.4.1 - resolution: "uri-js@npm:4.4.1" - dependencies: - punycode: ^2.1.0 - checksum: 7167432de6817fe8e9e0c9684f1d2de2bb688c94388f7569f7dbdb1587c9f4ca2a77962f134ec90be0cc4d004c939ff0d05acc9f34a0db39a3c797dada262633 - languageName: node - linkType: hard - -"util-deprecate@npm:^1.0.1": - version: 1.0.2 - resolution: "util-deprecate@npm:1.0.2" - checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 - languageName: node - linkType: hard - -"uuid@npm:8.3.2": - version: 8.3.2 - resolution: "uuid@npm:8.3.2" - bin: - uuid: dist/bin/uuid - checksum: 5575a8a75c13120e2f10e6ddc801b2c7ed7d8f3c8ac22c7ed0c7b2ba6383ec0abda88c905085d630e251719e0777045ae3236f04c812184b7c765f63a70e58df - languageName: node - linkType: hard - -"v8-compile-cache-lib@npm:^3.0.1": - version: 3.0.1 - resolution: "v8-compile-cache-lib@npm:3.0.1" - checksum: 78089ad549e21bcdbfca10c08850022b22024cdcc2da9b168bcf5a73a6ed7bf01a9cebb9eac28e03cd23a684d81e0502797e88f3ccd27a32aeab1cfc44c39da0 - languageName: node - linkType: hard - -"viem@npm:^1.16.5": - version: 1.16.5 - resolution: "viem@npm:1.16.5" - dependencies: - "@adraffy/ens-normalize": 1.9.4 - "@noble/curves": 1.2.0 - "@noble/hashes": 1.3.2 - "@scure/bip32": 1.3.2 - "@scure/bip39": 1.2.1 - abitype: 0.9.8 - isows: 1.0.3 - ws: 8.13.0 - peerDependencies: - typescript: ">=5.0.4" - peerDependenciesMeta: - typescript: - optional: true - checksum: cc07bbc8ebf616c2cc6e14f08eea59d1b34df294d1dcba72090bf10e224e87c17014db593bcff223fe6c7c30999448d786d67d9e18691906f51900db940af821 - languageName: node - linkType: hard - -"which@npm:^2.0.1, which@npm:^2.0.2": - version: 2.0.2 - resolution: "which@npm:2.0.2" - dependencies: - isexe: ^2.0.0 - bin: - node-which: ./bin/node-which - checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 - languageName: node - linkType: hard - -"wide-align@npm:^1.1.5": - version: 1.1.5 - resolution: "wide-align@npm:1.1.5" - dependencies: - string-width: ^1.0.2 || 2 || 3 || 4 - checksum: d5fc37cd561f9daee3c80e03b92ed3e84d80dde3365a8767263d03dacfc8fa06b065ffe1df00d8c2a09f731482fcacae745abfbb478d4af36d0a891fad4834d3 - languageName: node - linkType: hard - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version: 7.0.0 - resolution: "wrap-ansi@npm:7.0.0" - dependencies: - ansi-styles: ^4.0.0 - string-width: ^4.1.0 - strip-ansi: ^6.0.0 - checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b - languageName: node - linkType: hard - -"wrap-ansi@npm:^8.1.0": - version: 8.1.0 - resolution: "wrap-ansi@npm:8.1.0" - dependencies: - ansi-styles: ^6.1.0 - string-width: ^5.0.1 - strip-ansi: ^7.0.1 - checksum: 371733296dc2d616900ce15a0049dca0ef67597d6394c57347ba334393599e800bab03c41d4d45221b6bc967b8c453ec3ae4749eff3894202d16800fdfe0e238 - languageName: node - linkType: hard - -"wrappy@npm:1": - version: 1.0.2 - resolution: "wrappy@npm:1.0.2" - checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 - languageName: node - linkType: hard - -"ws@npm:8.13.0": - version: 8.13.0 - resolution: "ws@npm:8.13.0" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 53e991bbf928faf5dc6efac9b8eb9ab6497c69feeb94f963d648b7a3530a720b19ec2e0ec037344257e05a4f35bd9ad04d9de6f289615ffb133282031b18c61c - languageName: node - linkType: hard - -"yallist@npm:^4.0.0": - version: 4.0.0 - resolution: "yallist@npm:4.0.0" - checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 - languageName: node - linkType: hard - -"yn@npm:3.1.1": - version: 3.1.1 - resolution: "yn@npm:3.1.1" - checksum: 2c487b0e149e746ef48cda9f8bad10fc83693cd69d7f9dcd8be4214e985de33a29c9e24f3c0d6bcf2288427040a8947406ab27f7af67ee9456e6b84854f02dd6 - languageName: node - linkType: hard - -"yocto-queue@npm:^0.1.0": - version: 0.1.0 - resolution: "yocto-queue@npm:0.1.0" - checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 - languageName: node - linkType: hard +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + +"@adraffy/ens-normalize@1.9.4": + version "1.9.4" + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": + version "4.9.1" + +"@eslint/eslintrc@^2.1.2": + version "2.1.2" + 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.51.0": + version "8.51.0" + +"@humanwhocodes/config-array@^0.11.11": + version "0.11.11" + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.1" + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@noble/curves@~1.2.0", "@noble/curves@1.2.0": + version "1.2.0" + dependencies: + "@noble/hashes" "1.3.2" + +"@noble/hashes@~1.3.0", "@noble/hashes@~1.3.2", "@noble/hashes@1.3.2": + version "1.3.2" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": + version "2.0.5" + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@scure/base@~1.1.0", "@scure/base@~1.1.2": + version "1.1.3" + +"@scure/bip32@1.3.2": + version "1.3.2" + dependencies: + "@noble/curves" "~1.2.0" + "@noble/hashes" "~1.3.2" + "@scure/base" "~1.1.2" + +"@scure/bip39@1.2.1": + version "1.2.1" + dependencies: + "@noble/hashes" "~1.3.0" + "@scure/base" "~1.1.0" + +"@tsconfig/node10@^1.0.7": + version "1.0.9" + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + +"@types/json-schema@^7.0.12": + version "7.0.13" + +"@types/node-cron@^3.0.9": + version "3.0.9" + resolved "https://registry.npmjs.org/@types/node-cron/-/node-cron-3.0.9.tgz" + integrity sha512-P10Vf+oagnMbefD31nqjS/dpBM34qzfdpvIgVZwtwsNb0Hg2lDaPFeGcyGUJIqh3zHlDMwYXGeunGgMnswgnPg== + +"@types/node@*", "@types/node@^20.8.6": + version "20.8.6" + resolved "https://registry.npmjs.org/@types/node/-/node-20.8.6.tgz" + integrity sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ== + dependencies: + undici-types "~5.25.1" + +"@types/semver@^7.5.0": + version "7.5.3" + +"@typescript-eslint/eslint-plugin@^6.7.5": + version "6.7.5" + dependencies: + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "6.7.5" + "@typescript-eslint/type-utils" "6.7.5" + "@typescript-eslint/utils" "6.7.5" + "@typescript-eslint/visitor-keys" "6.7.5" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/parser@^6.0.0 || ^6.0.0-alpha", "@typescript-eslint/parser@^6.7.5": + version "6.7.5" + dependencies: + "@typescript-eslint/scope-manager" "6.7.5" + "@typescript-eslint/types" "6.7.5" + "@typescript-eslint/typescript-estree" "6.7.5" + "@typescript-eslint/visitor-keys" "6.7.5" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@6.7.5": + version "6.7.5" + dependencies: + "@typescript-eslint/types" "6.7.5" + "@typescript-eslint/visitor-keys" "6.7.5" + +"@typescript-eslint/type-utils@6.7.5": + version "6.7.5" + dependencies: + "@typescript-eslint/typescript-estree" "6.7.5" + "@typescript-eslint/utils" "6.7.5" + debug "^4.3.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/types@6.7.5": + version "6.7.5" + +"@typescript-eslint/typescript-estree@6.7.5": + version "6.7.5" + dependencies: + "@typescript-eslint/types" "6.7.5" + "@typescript-eslint/visitor-keys" "6.7.5" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/utils@6.7.5": + version "6.7.5" + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.7.5" + "@typescript-eslint/types" "6.7.5" + "@typescript-eslint/typescript-estree" "6.7.5" + semver "^7.5.4" + +"@typescript-eslint/visitor-keys@6.7.5": + version "6.7.5" + dependencies: + "@typescript-eslint/types" "6.7.5" + eslint-visitor-keys "^3.4.1" + +abbrev@1: + version "1.1.1" + +abitype@0.9.8: + version "0.9.8" + +acorn-jsx@^5.3.2: + version "5.3.2" + +acorn-walk@^8.1.1: + version "8.2.0" + +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.4.1, acorn@^8.9.0: + version "8.10.0" + +ajv@^6.12.4: + version "6.12.6" + 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" + +ansi-regex@^5.0.1: + version "5.0.1" + +ansi-styles@^4.1.0: + version "4.3.0" + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.3" + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^4.1.0: + version "4.1.3" + +argparse@^2.0.1: + version "2.0.1" + +array-union@^2.1.0: + version "2.1.0" + +asynckit@^0.4.0: + version "0.4.0" + +axios@^1.5.1: + version "1.5.1" + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +balanced-match@^1.0.0: + version "1.0.2" + +binary-extensions@^2.0.0: + version "2.2.0" + +brace-expansion@^1.1.7: + version "1.1.11" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + dependencies: + fill-range "^7.0.1" + +callsites@^3.0.0: + version "3.1.0" + +chalk@^4.0.0: + version "4.1.2" + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@^3.5.2: + version "3.5.3" + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +color-convert@^2.0.1: + version "2.0.1" + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + +combined-stream@^1.0.8: + version "1.0.8" + dependencies: + delayed-stream "~1.0.0" + +concat-map@0.0.1: + version "0.0.1" + +create-require@^1.1.0: + version "1.1.1" + +cross-spawn@^7.0.2: + version "7.0.3" + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +debug@^3.2.7: + version "3.2.7" + dependencies: + ms "^2.1.1" + +debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + dependencies: + ms "2.1.2" + +deep-is@^0.1.3: + version "0.1.4" + +delayed-stream@~1.0.0: + version "1.0.0" + +diff@^4.0.1: + version "4.0.2" + +dir-glob@^3.0.1: + version "3.0.1" + dependencies: + path-type "^4.0.0" + +doctrine@^3.0.0: + version "3.0.0" + dependencies: + esutils "^2.0.2" + +dotenv@^16.3.1: + version "16.3.1" + +escape-string-regexp@^4.0.0: + version "4.0.0" + +eslint-config-prettier@^9.0.0: + version "9.0.0" + +eslint-scope@^7.2.2: + version "7.2.2" + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + +"eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", eslint@^8.51.0, eslint@>=7.0.0: + version "8.51.0" + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.2" + "@eslint/js" "8.51.0" + "@humanwhocodes/config-array" "^0.11.11" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + 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@^9.6.0, espree@^9.6.1: + version "9.6.1" + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esquery@^1.4.2: + version "1.5.0" + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + +esutils@^2.0.2: + version "2.0.3" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + +fast-glob@^3.2.9: + version "3.3.1" + 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" + +fast-levenshtein@^2.0.6: + version "2.0.6" + +fastq@^1.6.0: + version "1.15.0" + dependencies: + reusify "^1.0.4" + +file-entry-cache@^6.0.1: + version "6.0.1" + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + dependencies: + to-regex-range "^5.0.1" + +find-up@^5.0.0: + version "5.0.0" + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.1.1" + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flatted@^3.2.9: + version "3.2.9" + +follow-redirects@^1.15.0: + version "1.15.3" + +form-data@^4.0.0: + version "4.0.0" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fs.realpath@^1.0.0: + version "1.0.0" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + dependencies: + is-glob "^4.0.3" + +glob@^7.1.3: + version "7.2.3" + 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" + +globals@^13.19.0: + version "13.23.0" + dependencies: + type-fest "^0.20.2" + +globby@^11.1.0: + version "11.1.0" + 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" + +graphemer@^1.4.0: + version "1.4.0" + +has-flag@^3.0.0: + version "3.0.0" + +has-flag@^4.0.0: + version "4.0.0" + +ignore-by-default@^1.0.1: + version "1.0.1" + +ignore@^5.2.0, ignore@^5.2.4: + version "5.2.4" + +import-fresh@^3.2.1: + version "3.3.0" + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + +inflight@^1.0.4: + version "1.0.6" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + +is-binary-path@~2.1.0: + version "2.1.0" + dependencies: + binary-extensions "^2.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + +is-path-inside@^3.0.3: + version "3.0.3" + +isexe@^2.0.0: + version "2.0.0" + +isows@1.0.3: + version "1.0.3" + +js-yaml@^4.1.0: + version "4.1.0" + dependencies: + argparse "^2.0.1" + +json-buffer@3.0.1: + version "3.0.1" + +json-schema-traverse@^0.4.1: + version "0.4.1" + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + +keyv@^4.5.3: + version "4.5.4" + dependencies: + json-buffer "3.0.1" + +levn@^0.4.1: + version "0.4.1" + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +locate-path@^6.0.0: + version "6.0.0" + dependencies: + p-locate "^5.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + +lru-cache@^6.0.0: + version "6.0.0" + dependencies: + yallist "^4.0.0" + +make-error@^1.1.1: + version "1.3.6" + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + +micromatch@^4.0.4: + version "4.0.5" + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + +mime-types@^2.1.12: + version "2.1.35" + dependencies: + mime-db "1.52.0" + +minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + dependencies: + brace-expansion "^1.1.7" + +ms@^2.1.1: + version "2.1.3" + +ms@2.1.2: + version "2.1.2" + +natural-compare@^1.4.0: + version "1.4.0" + +node-cron@^3.0.2: + version "3.0.2" + dependencies: + uuid "8.3.2" + +nodemon@^3.0.1: + version "3.0.1" + dependencies: + chokidar "^3.5.2" + debug "^3.2.7" + ignore-by-default "^1.0.1" + minimatch "^3.1.2" + pstree.remy "^1.1.8" + semver "^7.5.3" + simple-update-notifier "^2.0.0" + supports-color "^5.5.0" + touch "^3.1.0" + undefsafe "^2.0.5" + +nopt@~1.0.10: + version "1.0.10" + dependencies: + abbrev "1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + +once@^1.3.0: + version "1.4.0" + dependencies: + wrappy "1" + +optionator@^0.9.3: + version "0.9.3" + 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" + +p-limit@^3.0.2: + version "3.1.0" + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + dependencies: + p-limit "^3.0.2" + +parent-module@^1.0.0: + version "1.0.1" + dependencies: + callsites "^3.0.0" + +path-exists@^4.0.0: + version "4.0.0" + +path-is-absolute@^1.0.0: + version "1.0.1" + +path-key@^3.1.0: + version "3.1.1" + +path-type@^4.0.0: + version "4.0.0" + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + +prelude-ls@^1.2.1: + version "1.2.1" + +prettier@^3.0.3: + version "3.0.3" + +proxy-from-env@^1.1.0: + version "1.1.0" + +pstree.remy@^1.1.8: + version "1.1.8" + +punycode@^2.1.0: + version "2.3.0" + +queue-microtask@^1.2.2: + version "1.2.3" + +readdirp@~3.6.0: + version "3.6.0" + dependencies: + picomatch "^2.2.1" + +resolve-from@^4.0.0: + version "4.0.0" + +reusify@^1.0.4: + version "1.0.4" + +rimraf@^3.0.2: + version "3.0.2" + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + dependencies: + queue-microtask "^1.2.2" + +semver@^7.5.3, semver@^7.5.4: + version "7.5.4" + dependencies: + lru-cache "^6.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + +simple-update-notifier@^2.0.0: + version "2.0.0" + dependencies: + semver "^7.5.3" + +slash@^3.0.0: + version "3.0.0" + +strip-ansi@^6.0.1: + version "6.0.1" + dependencies: + ansi-regex "^5.0.1" + +strip-json-comments@^3.1.1: + version "3.1.1" + +supports-color@^5.5.0: + version "5.5.0" + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + dependencies: + has-flag "^4.0.0" + +text-table@^0.2.0: + version "0.2.0" + +to-regex-range@^5.0.1: + version "5.0.1" + dependencies: + is-number "^7.0.0" + +touch@^3.1.0: + version "3.1.0" + dependencies: + nopt "~1.0.10" + +ts-api-utils@^1.0.1: + version "1.0.3" + +ts-node@^10.9.1: + version "10.9.1" + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + +typescript@^5.2.2, typescript@>=2.7, typescript@>=4.2.0, typescript@>=5.0.4: + version "5.2.2" + +undefsafe@^2.0.5: + version "2.0.5" + +undici-types@~5.25.1: + version "5.25.3" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz" + integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA== + +uri-js@^4.2.2: + version "4.4.1" + dependencies: + punycode "^2.1.0" + +uuid@8.3.2: + version "8.3.2" + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + +viem@^1.16.5: + version "1.16.5" + dependencies: + "@adraffy/ens-normalize" "1.9.4" + "@noble/curves" "1.2.0" + "@noble/hashes" "1.3.2" + "@scure/bip32" "1.3.2" + "@scure/bip39" "1.2.1" + abitype "0.9.8" + isows "1.0.3" + ws "8.13.0" + +which@^2.0.1: + version "2.0.2" + dependencies: + isexe "^2.0.0" + +wrappy@1: + version "1.0.2" + +ws@*, ws@8.13.0: + version "8.13.0" + +yallist@^4.0.0: + version "4.0.0" + +yn@3.1.1: + version "3.1.1" + +yocto-queue@^0.1.0: + version "0.1.0" From c310d20ddc9690612072c875b3249de11379fc6a Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Fri, 20 Oct 2023 13:12:51 +0800 Subject: [PATCH 004/297] WIP: controller with batching blocks functionality --- packages/reporter/.env.example | 30 +- packages/reporter/package.json | 3 +- .../reporter/src/AMBHeaderReporterCaller.js | 57 - packages/reporter/src/BlockListener.ts | 66 + .../reporter/src/controller/AMBController.ts | 71 + .../src/controller/SygmaController.ts | 81 + .../src/controller/TelepathyController.ts | 87 + packages/reporter/src/index.ts | 57 +- packages/reporter/src/newIndex.ts | 34 + packages/reporter/src/reporter/AMBReporter.ts | 65 - .../reporter/src/reporter/SygmaReporter.ts | 74 - .../src/reporter/TelepathyReporter.ts | 75 - packages/reporter/src/reporter/type.ts | 7 - packages/reporter/yarn.lock | 3716 +++++++++++++---- 14 files changed, 3191 insertions(+), 1232 deletions(-) delete mode 100644 packages/reporter/src/AMBHeaderReporterCaller.js create mode 100644 packages/reporter/src/BlockListener.ts create mode 100644 packages/reporter/src/controller/AMBController.ts create mode 100644 packages/reporter/src/controller/SygmaController.ts create mode 100644 packages/reporter/src/controller/TelepathyController.ts create mode 100644 packages/reporter/src/newIndex.ts delete mode 100644 packages/reporter/src/reporter/AMBReporter.ts delete mode 100644 packages/reporter/src/reporter/SygmaReporter.ts delete mode 100644 packages/reporter/src/reporter/TelepathyReporter.ts delete mode 100644 packages/reporter/src/reporter/type.ts diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index 8f7a1a15..d277c856 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -1,32 +1,22 @@ -PRIVATE_KEY=0x0abc +PRIVATE_KEY= SOURCE_RPC_URL= DEST_RPC_URL=https://rpc.gnosischain.com -SYGMA_FEE_DATA=0x - -TELEPATHY_PROOF_API_URL=https://api.telepathy.xyz/api/hashi/ -AMB_ADAPTER=0x01268DB05965CeAc2a89566c42CD550ED7eE5ECD -GAS=30000 +SOURCE_CHAIN=goerli +DEST_CHAIN=gnosis -# If not run all, config each reporter separately -AMB_REPORTER=true -AMB_FREQUENCY=1,10,20,30,40,50 * * * * * -AMB_SOURCE_CHAIN=goerli -AMB_DEST_CHAIN=gnosis -AMB_GAS=50000 +AMB_CONTROLLER=false -SYGMA_REPORTER=true -SYGMA_FREQUENCY= 1,10,20,30,40,50 * * * * * -SYGMA_SOURCE_CHAIN=goerli -SYGMA_DEST_CHAIN=gnosis +SYGMA_CONTROLLER=false SYGMA_FEE_DATA=0x -TELEPATHY_REPORTER=true -TELEPATHY_FREQUENCY=50000 #run every 50000ms -TELEPATHY_SOURCE_CHAIN=goerli -TELEPATHY_DEST_CHAIN=gnosis +TELEPATHY_CONTROLLER=true TELEPATHY_PROOF_API_URL=https://api.telepathy.xyz/api/hashi/ +GOERLI_BLOCKTIME=12 +ETHEREUM_BLOCKTIME=16 +GNOSIS_BLOCKTINE=5 +CHIADO_BLOCKTIME=5 diff --git a/packages/reporter/package.json b/packages/reporter/package.json index 8d07caf7..c223ddeb 100644 --- a/packages/reporter/package.json +++ b/packages/reporter/package.json @@ -16,7 +16,8 @@ "axios": "^1.5.1", "dotenv": "^16.3.1", "node-cron": "^3.0.2", - "viem": "^1.16.5" + "viem": "^1.16.5", + "winston": "^3.11.0" }, "devDependencies": { "@types/node": "^20.8.6", diff --git a/packages/reporter/src/AMBHeaderReporterCaller.js b/packages/reporter/src/AMBHeaderReporterCaller.js deleted file mode 100644 index e349b9b1..00000000 --- a/packages/reporter/src/AMBHeaderReporterCaller.js +++ /dev/null @@ -1,57 +0,0 @@ -//Calls the AMBHeaderReporter reportHeaders() method every x hours - -// require('dotenv').config(); -// const { ethers } = require('ethers'); -// const cron = require('node-cron'); - -import { createPublicClient, http, createWalletClient } from 'viem' -import { mainnet, goerli, gnosis } from 'viem/chains' -import { privateKeyToAccount } from 'viem/accounts' -import 'dotenv/config' -import 'node-cron' - -const walletClient = createWalletClient({ - chain: goerli, - transport: http() -}) -const publicClient = createPublicClient({ - chain: goerli, - transport: http() -}) - - -const account = privateKeyToAccount(process.env.PRIVATE_KEY) -// Create an instance of the contract -const contractAddress = process.env.AMB_REPORTER_CONTRACT_ADDRESS; - -const contractABI = require('../ABIs/ambReporterContractABI.json'); - - - -// Set up the cron job to call the Solidity method every 1 hour. 24h -> '0 0 * * *' -cron.schedule('0 * * * *', async () => { - try { - // Get the latest block number - const blockNumber = await publicClient.getBlockNumber(); - console.log('Latest block number:', blockNumber); - - amb_adapter = process.env.AMB_ADAPTER; - gas = process.env.GAS; - - // Call the reportHeaders method using the contract instance - const {request} = await publicClient.simulateContract({ - account, // calling from account - address: contractAddress, - abi: contractABI, - functionName: 'reportHeaders', - args: [[blockNumber], amb_adapter, gas], - }) - ; - const txHash = await walletClient.writeContract(request); - console.log('Solidity method called successfully:', txHash); - } catch (error) { - console.error('Error calling Solidity method:', error); - } -}); - -console.log('Cron job scheduled to call the Solidity method every 1 hour.'); \ No newline at end of file diff --git a/packages/reporter/src/BlockListener.ts b/packages/reporter/src/BlockListener.ts new file mode 100644 index 00000000..ff1a7ef5 --- /dev/null +++ b/packages/reporter/src/BlockListener.ts @@ -0,0 +1,66 @@ +import { createPublicClient, http, createWalletClient, PublicClient, Chain } from "viem" +import { mainnet, goerli, gnosis } from "viem/chains" +import winston from "winston" +class BlocksListener { + controllers: any[] + logger: winston.Logger + timeFetchBlocksMs: number + lastProcessedBlock: bigint = 0n + _interval: ReturnType | undefined // NodeJs.Timeout + + constructor(controllers: any[], timeFetchBlocksMs: number, logger: winston.Logger) { + this.controllers = controllers + this.timeFetchBlocksMs = timeFetchBlocksMs + this.logger = logger + } + + start() { + this._fetchBlocks() + this._interval = setInterval(() => { + this._fetchBlocks() + this.logger.info(`Waiting for ${this.timeFetchBlocksMs}ms...`) + }, this.timeFetchBlocksMs) + } + + stop() { + clearInterval(this._interval) + } + + async _fetchBlocks() { + try { + this.logger.info("Start to fetch blocks") + const publicClient = createPublicClient({ + chain: + process.env.SOURCE_CHAIN === "goerli" ? goerli : process.env.SOURCE_CHAIN === "mainnet" ? mainnet : undefined, + transport: http(process.env.SOURCE_RPC_URL), + }) + const currentBlockNumber = await publicClient.getBlockNumber() + this.logger.info(`Current Block Number: ${currentBlockNumber} , on source chain: ${process.env.SOURCE_CHAIN}`) + if (this.lastProcessedBlock !== currentBlockNumber) { + this.lastProcessedBlock = await publicClient.getBlockNumber() + + const queryBlockLength = 100n // the number of blocks to query + const blockBuffer = 10n // put 10 blocks before the current block in case the node provider don't sync up at the head + const startBlock = this.lastProcessedBlock - queryBlockLength - blockBuffer + const endBlock = this.lastProcessedBlock - blockBuffer + const blocks = await Promise.all( + Array.from({ length: Number(queryBlockLength + 1n) }, (value, index) => startBlock + BigInt(index)), + ) + this.logger.info(`Fetching block from ${startBlock} to ${endBlock}`) + + await Promise.all(this.controllers.map((_controller: any) => _controller.onBlocks(blocks))) + + this.lastProcessedBlock = endBlock + } else { + this.logger.error(`${currentBlockNumber} has already been fetched!`) + } + // delay for 1000ms + await new Promise((func) => setTimeout(func, 1000)) + } catch (_err) { + // logger.error(_err) + this.logger.error(`error from block listener ${_err}`) + } + } +} + +export default BlocksListener diff --git a/packages/reporter/src/controller/AMBController.ts b/packages/reporter/src/controller/AMBController.ts new file mode 100644 index 00000000..b666f66a --- /dev/null +++ b/packages/reporter/src/controller/AMBController.ts @@ -0,0 +1,71 @@ +var cron = require("node-cron") +import { createPublicClient, http, createWalletClient, PublicClient, Chain } from "viem" +import { mainnet, goerli, gnosis } from "viem/chains" +import { privateKeyToAccount } from "viem/accounts" +import "dotenv/config" +import contract_address from "../utils/address.json" +import contractABI from "../ABIs/ambReporterContractABI.json" +import winston from "winston" + +class AMBController { + sourceChain: string + destinationChain: string + isEnabled: boolean = false + logger: winston.Logger + constructor(sourceChain: string, destinationChain: string, isEnabled: boolean, logger: winston.Logger) { + this.sourceChain = sourceChain + this.destinationChain = destinationChain + this.isEnabled = isEnabled + this.logger = logger + } + async onBlocks(blockNumbers: string[]) { + try { + this.logger.info("AMB: Starting AMB Reporter") + const walletClient = createWalletClient({ + chain: this.sourceChain === "goerli" ? goerli : this.sourceChain === "mainnet" ? mainnet : undefined, + transport: http(process.env.SOURCE_RPC_URL), + }) + const publicClient = createPublicClient({ + chain: this.sourceChain === "goerli" ? goerli : this.sourceChain === "mainnet" ? mainnet : undefined, + transport: http(process.env.SOURCE_RPC_URL), + }) + const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`) + + const reporterAddr = this.getSourceReporterAddr() + const adapterAddr = this.getDestAdapter() + + const { result, request } = await publicClient.simulateContract({ + account, // calling from account + address: reporterAddr as `0x${string}`, + abi: contractABI, + functionName: "reportHeaders", + args: [blockNumbers, adapterAddr, process.env.GAS], + }) + + const txhash = await walletClient.writeContract(request) + this.logger.info(`AMB: TxHash from AMB Controller: ${txhash}`) + } catch (error) { + this.logger.error(`AMB: Error from AMB Controller: ${error}`) + } + } + getSourceReporterAddr() { + switch (this.sourceChain) { + case "goerli": + return contract_address.amb.goerli_reporter + case "ethereum": + return contract_address.amb.ethereum_reporter + default: + return contract_address.amb.goerli_reporter + } + } + getDestAdapter() { + switch (this.destinationChain) { + case "gnosis": + return contract_address.amb.gnosis_adapter + default: + return contract_address.amb.gnosis_adapter + } + } +} + +export default AMBController diff --git a/packages/reporter/src/controller/SygmaController.ts b/packages/reporter/src/controller/SygmaController.ts new file mode 100644 index 00000000..7ed3ca10 --- /dev/null +++ b/packages/reporter/src/controller/SygmaController.ts @@ -0,0 +1,81 @@ +var cron = require("node-cron") +import { createPublicClient, http, createWalletClient, parseEther } from "viem" +import { mainnet, goerli, gnosis } from "viem/chains" +import { privateKeyToAccount } from "viem/accounts" +import "dotenv/config" +import contract_address from "../utils/address.json" +import contractABI from "../ABIs/SygmaReporterContractABI.json" +import winston from "winston" + +class SygmaController { + sourceChain: string + destinationChain: string + isEnabled: boolean = false + logger: winston.Logger + constructor(sourceChain: string, destinationChain: string, isEnabled: boolean, logger: winston.Logger) { + this.sourceChain = sourceChain + this.destinationChain = destinationChain + this.isEnabled = isEnabled + this.logger = logger + } + + async onBlocks(blockNumbers: string[]) { + try { + this.logger.info("Sygma: Starting Sygma Reporter") + const walletClient = createWalletClient({ + chain: this.sourceChain === "goerli" ? goerli : this.sourceChain === "mainnet" ? mainnet : undefined, + transport: http(process.env.SOURCE_RPC_URL), + }) + const publicClient = createPublicClient({ + chain: this.sourceChain === "goerli" ? goerli : this.sourceChain === "mainnet" ? mainnet : undefined, + transport: http(process.env.SOURCE_RPC_URL), + }) + const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`) + + const reporterAddr = this.getSourceReporterAddr() + const adapterAddr = this.getDestAdapter() + const destDomainId = this.getDomainID() + + const { result, request } = await publicClient.simulateContract({ + account, // calling from account + address: reporterAddr as `0x${string}`, + abi: contractABI, + functionName: "reportHeadersToDomain", + args: [blockNumbers, adapterAddr, destDomainId, "0x"], + value: parseEther("0.0001"), + }) + const txhash = await walletClient.writeContract(request) + this.logger.info(`Sygma: TxHash from Sygma Controller: ${txhash}`) + } catch (error) { + this.logger.error(`Sygma: Error from Sygma Controller: ${error}`) + } + } + getSourceReporterAddr() { + switch (this.sourceChain) { + case "goerli": + return contract_address.sygma.goerli_reporter + case "ethereum": + return contract_address.sygma.ethereum_reporter + default: + return contract_address.sygma.goerli_reporter + } + } + getDestAdapter() { + switch (this.destinationChain) { + case "gnosis": + return contract_address.sygma.gnosis_adapter + default: + return contract_address.sygma.gnosis_adapter + } + } + getDomainID() { + switch (this.destinationChain) { + case "gnosis": + return 101 + default: + return 101 + } + } +} + +export default SygmaController diff --git a/packages/reporter/src/controller/TelepathyController.ts b/packages/reporter/src/controller/TelepathyController.ts new file mode 100644 index 00000000..9ca87cb2 --- /dev/null +++ b/packages/reporter/src/controller/TelepathyController.ts @@ -0,0 +1,87 @@ +import axios from "axios" +import { createPublicClient, http, createWalletClient, hexToNumber } from "viem" +import { gnosis } from "viem/chains" +import { privateKeyToAccount } from "viem/accounts" +import "dotenv/config" +import contract_address from "../utils/address.json" +import lightClientContractABI from "../ABIs/telepathyContractABI.json" +import adapterContractABI from "../ABIs/telepathyAdapterABI.json" +import winston from "winston" + +class TelepathyController { + sourceChain: string + destinationChain: string + isEnabled: boolean = false + logger: winston.Logger + constructor(sourceChain: string, destinationChain: string, isEnabled: boolean, logger: winston.Logger) { + this.sourceChain = sourceChain + this.destinationChain = destinationChain + this.isEnabled = isEnabled + this.logger = logger + } + + async onBlocks(blockNumbers: string[]) { + try { + // Telepathy on support light client on Gnosis at the moment + const walletClient = createWalletClient({ + chain: gnosis, + transport: http(process.env.DEST_RPC_URL), + }) + const publicClient = createPublicClient({ + chain: gnosis, + transport: http(process.env.DEST_RPC_URL), + }) + const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`) + + const adapterAddr = contract_address.telepathy.gnosis_adapter + const lightClientAddr = contract_address.telepathy.gnosis_light_client + + // Getting the latest block number from provider + const currentBlockNumber = await publicClient.getBlockNumber() + + // get contract events from latest block -500 : latest block + const queryBlockLength = 1000n // the number of blocks to query + const blockBuffer = 10n // put 10 blocks before the current block in case the node provider don't sync up at the head + const startBlock = currentBlockNumber - queryBlockLength - blockBuffer + const endBlock = currentBlockNumber - blockBuffer + this.logger.info(`Telepathy: Getting Contract Event from block ${startBlock} to block ${currentBlockNumber}`) + const logs = await publicClient.getContractEvents({ + address: lightClientAddr as `0x${string}`, + abi: lightClientContractABI, + eventName: "HeadUpdate", + fromBlock: startBlock, + toBlock: endBlock, + }) + + if (logs.length == 0) { + this.logger.error("No event is found!") + return + } + + logs.forEach(async (event) => { + // get slot value from first indexed + const slotValue = event.topics[1] + this.logger.info(`Fetching proof for slot ${slotValue}`) + const postUrl = process.env.TELEPATHY_PROOF_API_URL + "5" + "/" + hexToNumber(slotValue!) + const response = await axios.post(postUrl) + this.logger.info(`Telepathy: Response from telepathy proof provider: ${response.data}`) + const { chainId, slot, blockNumber, blockNumberProof, blockHash, blockHashProof } = response.data.result + this.logger.info(`Telepathy: Calling storeBlockHeader for block number ${blockNumber}`) + const { request, result } = await publicClient.simulateContract({ + account, + address: adapterAddr as `0x${string}`, + abi: adapterContractABI, + functionName: "storeBlockHeader", + args: [chainId, slot, blockNumber, blockNumberProof, blockHash, blockHashProof], + }) + + const txHash = await walletClient.writeContract(request) + this.logger.info(`Telepathy: TxHash from Telepathy Controller: ${txHash} `) + }) + } catch (error) { + this.logger.error(`Telepathy: Error from Telepathy Controller: ${error}`) + } + } +} + +export default TelepathyController diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 52115a5b..42d19f9b 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -1,33 +1,34 @@ +// import logger from "winston" +import { createPublicClient, http, createWalletClient, PublicClient, Chain } from "viem" +import AMBController from "./controller/AMBController" +import SygmaController from "./controller/SygmaController" +import TelepathyController from "./controller/TelepathyController" +import BlocksListener from "./BlockListener" import "dotenv/config" -import AMB from "./reporter/AMBReporter" -import Sygma from "./reporter/SygmaReporter" -import Telepathy from "./reporter/TelepathyReporter" - +import winston from "winston" function main() { - if (process.env.AMB_REPORTER === "true") { - const amb = new AMB() - amb.callReportHeader({ - frequency_config: process.env.AMB_FREQUENCY!, - source_chain: process.env.AMB_SOURCE_CHAIN!, - destination_chain: process.env.AMB_DEST_CHAIN!, - }) - } - if (process.env.SYGMA_REPORTER === "true") { - const sygma = new Sygma() - sygma.callReportHeader({ - frequency_config: process.env.SYGMA_FREQUENCY!, - source_chain: process.env.SYGMA_SOURCE_CHAIN!, - destination_chain: process.env.SYGMA_DEST_CHAIN!, - }) - } - if (process.env.TELEPATHY_REPORTER === "true") { - const telepathy = new Telepathy() - telepathy.callReportHeader({ - frequency_config: process.env.TELEPATHY_FREQUENCY!, - source_chain: process.env.TELEPATHY_SOURCE_CHAIN!, - destination_chain: process.env.TELEPATHY_DEST_CHAIN!, - }) - } + const logger = winston.createLogger({ + level: "info", + format: winston.format.json(), + transports: [new winston.transports.Console()], + }) + const sourceChain = process.env.SOURCE_CHAIN + const destChain = process.env.DEST_CHAIN + const ambController = new AMBController(sourceChain!, destChain!, process.env.AMB_CONTROLLER === "true", logger) + const sygmaController = new SygmaController(sourceChain!, destChain!, process.env.SYGMA_CONTROLLER === "true", logger) + const telepathyController = new TelepathyController( + sourceChain!, + destChain!, + process.env.TELEPATHY_CONTROLLER === "true", + logger, + ) + + const blocksListener = new BlocksListener( + [ambController, sygmaController, telepathyController].filter((controller) => controller.isEnabled == true), + 10 * 1000, + logger, + ) + blocksListener.start() } main() diff --git a/packages/reporter/src/newIndex.ts b/packages/reporter/src/newIndex.ts new file mode 100644 index 00000000..42d19f9b --- /dev/null +++ b/packages/reporter/src/newIndex.ts @@ -0,0 +1,34 @@ +// import logger from "winston" +import { createPublicClient, http, createWalletClient, PublicClient, Chain } from "viem" +import AMBController from "./controller/AMBController" +import SygmaController from "./controller/SygmaController" +import TelepathyController from "./controller/TelepathyController" +import BlocksListener from "./BlockListener" +import "dotenv/config" +import winston from "winston" +function main() { + const logger = winston.createLogger({ + level: "info", + format: winston.format.json(), + transports: [new winston.transports.Console()], + }) + const sourceChain = process.env.SOURCE_CHAIN + const destChain = process.env.DEST_CHAIN + const ambController = new AMBController(sourceChain!, destChain!, process.env.AMB_CONTROLLER === "true", logger) + const sygmaController = new SygmaController(sourceChain!, destChain!, process.env.SYGMA_CONTROLLER === "true", logger) + const telepathyController = new TelepathyController( + sourceChain!, + destChain!, + process.env.TELEPATHY_CONTROLLER === "true", + logger, + ) + + const blocksListener = new BlocksListener( + [ambController, sygmaController, telepathyController].filter((controller) => controller.isEnabled == true), + 10 * 1000, + logger, + ) + blocksListener.start() +} + +main() diff --git a/packages/reporter/src/reporter/AMBReporter.ts b/packages/reporter/src/reporter/AMBReporter.ts deleted file mode 100644 index c5fdd4f1..00000000 --- a/packages/reporter/src/reporter/AMBReporter.ts +++ /dev/null @@ -1,65 +0,0 @@ -var cron = require("node-cron") -import { createPublicClient, http, createWalletClient } from "viem" -import { mainnet, goerli, gnosis } from "viem/chains" -import { privateKeyToAccount } from "viem/accounts" -import "dotenv/config" -import reporter_config from "./type" -import contract_address from "../utils/address.json" -import contractABI from "../ABIs/ambReporterContractABI.json" - -class AMBReporter { - constructor() {} - async callReportHeader(props: reporter_config) { - console.log("Starting AMB Reporter") - const walletClient = createWalletClient({ - chain: process.env.AMB_SOURCE_CHAIN === "goerli" ? goerli : mainnet, - transport: http(process.env.SOURCE_RPC_URL), - }) - const publicClient = createPublicClient({ - chain: goerli, - transport: http(process.env.SOURCE_RPC_URL), - }) - const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`) - - function getSourceReporterAddr() { - switch (props.source_chain) { - case "goerli": - return contract_address.amb.goerli_reporter - case "ethereum": - return contract_address.amb.ethereum_reporter - default: - return contract_address.amb.goerli_reporter - } - } - - function getDestAdapter() { - switch (props.destination_chain) { - case "gnosis": - return contract_address.amb.gnosis_adapter - default: - return contract_address.amb.gnosis_adapter - } - } - const reporterAddr = getSourceReporterAddr() - const adapterAddr = getDestAdapter() - - cron.schedule(`${props.frequency_config}`, async () => { - const blockNumber = await publicClient.getBlockNumber() - // Putting a buffer here for block number in case the provider's node is not up to date. - console.log(`Reporting BlockNumber: ${blockNumber - 10n}`) - - const { result, request } = await publicClient.simulateContract({ - account, // calling from account - address: reporterAddr as `0x${string}`, - abi: contractABI, - functionName: "reportHeaders", - args: [[blockNumber - 10n], adapterAddr, process.env.GAS], - }) - - const txhash = await walletClient.writeContract(request) - console.log("TxHash ", txhash) - }) - } -} - -export default AMBReporter diff --git a/packages/reporter/src/reporter/SygmaReporter.ts b/packages/reporter/src/reporter/SygmaReporter.ts deleted file mode 100644 index cf84a58e..00000000 --- a/packages/reporter/src/reporter/SygmaReporter.ts +++ /dev/null @@ -1,74 +0,0 @@ -var cron = require("node-cron") -import { createPublicClient, http, createWalletClient, parseEther } from "viem" -import { mainnet, goerli, gnosis } from "viem/chains" -import { privateKeyToAccount } from "viem/accounts" -import "dotenv/config" -import reporter_config from "./type" -import contract_address from "../utils/address.json" -import contractABI from "../ABIs/SygmaReporterContractABI.json" - -class SygmaReporter { - constructor() {} - async callReportHeader(props: reporter_config) { - console.log("Starting Sygma Reporter") - const walletClient = createWalletClient({ - chain: process.env.AMB_SOURCE_CHAIN === "goerli" ? goerli : mainnet, - transport: http(process.env.SOURCE_RPC_URL), - }) - const publicClient = createPublicClient({ - chain: goerli, - transport: http(process.env.SOURCE_RPC_URL), - }) - const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`) - - function getSourceReporterAddr() { - switch (props.source_chain) { - case "goerli": - return contract_address.sygma.goerli_reporter - case "ethereum": - return contract_address.sygma.ethereum_reporter - default: - return contract_address.sygma.goerli_reporter - } - } - - function getDestAdapter() { - switch (props.destination_chain) { - case "gnosis": - return contract_address.sygma.gnosis_adapter - default: - return contract_address.sygma.gnosis_adapter - } - } - - function getDomainID() { - switch (props.destination_chain) { - case "gnosis": - return 101 - default: - return 101 - } - } - const reporterAddr = getSourceReporterAddr() - const adapterAddr = getDestAdapter() - const destDomainId = getDomainID() - - cron.schedule(`${props.frequency_config}`, async () => { - const blockNumber = await publicClient.getBlockNumber() - // Putting a buffer here for block number in case the provider's node is not up to date. - console.log(`Reporting BlockNumber ${blockNumber - 10n}`) - const { result, request } = await publicClient.simulateContract({ - account, // calling from account - address: reporterAddr as `0x${string}`, - abi: contractABI, - functionName: "reportHeadersToDomain", - args: [[blockNumber - 10n], adapterAddr, destDomainId, "0x"], - value: parseEther("0.0001"), - }) - const txhash = await walletClient.writeContract(request) - console.log("TxHash ", txhash) - }) - } -} - -export default SygmaReporter diff --git a/packages/reporter/src/reporter/TelepathyReporter.ts b/packages/reporter/src/reporter/TelepathyReporter.ts deleted file mode 100644 index 9641dd3c..00000000 --- a/packages/reporter/src/reporter/TelepathyReporter.ts +++ /dev/null @@ -1,75 +0,0 @@ -import axios from "axios" -import { createPublicClient, http, createWalletClient, parseAbiItem, hexToBigInt } from "viem" -import { mainnet, goerli, gnosis } from "viem/chains" -import { privateKeyToAccount } from "viem/accounts" -import "dotenv/config" -import reporter_config from "./type" -import contract_address from "../utils/address.json" -import lightClientContractABI from "../ABIs/telepathyContractABI.json" -import adapterContractABI from "../ABIs/telepathyAdapterABI.json" - -class TelepathyReporter { - constructor() {} - async callReportHeader(props: reporter_config) { - console.log("Starting Telepathy Reporter") - - var runJob = setInterval(async () => { - try { - await this.fetchProofAndStoreBlockHeader(props) - } catch (error) { - console.log("Error when calling Telepathy's storeBlockHeader : ", error) - } - }, Number(props.frequency_config)) - } - - async fetchProofAndStoreBlockHeader(props: reporter_config) { - const walletClient = createWalletClient({ - chain: gnosis, - transport: http(process.env.DEST_RPC_URL), - }) - const publicClient = createPublicClient({ - chain: gnosis, - transport: http(process.env.DEST_RPC_URL), - }) - const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`) - - const adapterAddr = contract_address.telepathy.gnosis_adapter - const lightClientAddr = contract_address.telepathy.gnosis_light_client - - // Getting the latest block number from provider - const currentBlockNumber = await publicClient.getBlockNumber() - - // get contract events from latest block -500 : latest block - console.log(`Getting Contract Event from block ${currentBlockNumber - 500n} to block ${currentBlockNumber}`) - const logs = await publicClient.getContractEvents({ - address: contract_address.telepathy.gnosis_light_client as `0x${string}`, - abi: lightClientContractABI, - eventName: "HeadUpdate", - fromBlock: currentBlockNumber - 500n, - toBlock: currentBlockNumber, - }) - - console.log("logs ", logs) - logs.forEach(async (event) => { - // get slot value from first indexed - const slotValue = event.topics[1] - const postUrl = process.env.TELEPATHY_PROOF_API_URL + "5" + "/" + slotValue - const response = await axios.post(postUrl) - console.log("Response from telepathy proof provider: ", response.data) - const { chainId, slot, blockNumber, blockNumberProof, blockHash, blockHashProof } = response.data.result - console.log(`Calling storeBlockHeader for block number ${blockNumber}`) - const { request, result } = await publicClient.simulateContract({ - account, - address: adapterAddr as `0x${string}`, - abi: adapterContractABI, - functionName: "storeBlockHeader", - args: [5, slot, blockNumber, blockNumberProof, blockHash, blockHashProof], - }) - - const txHash = await walletClient.writeContract(request) - console.log("TxHash ", txHash) - }) - } -} - -export default TelepathyReporter diff --git a/packages/reporter/src/reporter/type.ts b/packages/reporter/src/reporter/type.ts deleted file mode 100644 index 2455f619..00000000 --- a/packages/reporter/src/reporter/type.ts +++ /dev/null @@ -1,7 +0,0 @@ -type reporter_config = { - frequency_config: string - source_chain: string - destination_chain: string -} - -export default reporter_config diff --git a/packages/reporter/yarn.lock b/packages/reporter/yarn.lock index 21eb86f3..0e59c872 100644 --- a/packages/reporter/yarn.lock +++ b/packages/reporter/yarn.lock @@ -1,905 +1,2811 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@aashutoshrathi/word-wrap@^1.2.3": - version "1.2.6" - -"@adraffy/ens-normalize@1.9.4": - version "1.9.4" - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": - version "4.4.0" - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": - version "4.9.1" - -"@eslint/eslintrc@^2.1.2": - version "2.1.2" - 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.51.0": - version "8.51.0" - -"@humanwhocodes/config-array@^0.11.11": - version "0.11.11" - dependencies: - "@humanwhocodes/object-schema" "^1.2.1" - debug "^4.1.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.1" - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.15" - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@noble/curves@~1.2.0", "@noble/curves@1.2.0": - version "1.2.0" - dependencies: - "@noble/hashes" "1.3.2" - -"@noble/hashes@~1.3.0", "@noble/hashes@~1.3.2", "@noble/hashes@1.3.2": - version "1.3.2" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": - version "2.0.5" - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@scure/base@~1.1.0", "@scure/base@~1.1.2": - version "1.1.3" - -"@scure/bip32@1.3.2": - version "1.3.2" - dependencies: - "@noble/curves" "~1.2.0" - "@noble/hashes" "~1.3.2" - "@scure/base" "~1.1.2" - -"@scure/bip39@1.2.1": - version "1.2.1" - dependencies: - "@noble/hashes" "~1.3.0" - "@scure/base" "~1.1.0" - -"@tsconfig/node10@^1.0.7": - version "1.0.9" - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - -"@tsconfig/node16@^1.0.2": - version "1.0.4" - -"@types/json-schema@^7.0.12": - version "7.0.13" - -"@types/node-cron@^3.0.9": - version "3.0.9" - resolved "https://registry.npmjs.org/@types/node-cron/-/node-cron-3.0.9.tgz" - integrity sha512-P10Vf+oagnMbefD31nqjS/dpBM34qzfdpvIgVZwtwsNb0Hg2lDaPFeGcyGUJIqh3zHlDMwYXGeunGgMnswgnPg== - -"@types/node@*", "@types/node@^20.8.6": - version "20.8.6" - resolved "https://registry.npmjs.org/@types/node/-/node-20.8.6.tgz" - integrity sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ== - dependencies: - undici-types "~5.25.1" - -"@types/semver@^7.5.0": - version "7.5.3" - -"@typescript-eslint/eslint-plugin@^6.7.5": - version "6.7.5" - dependencies: - "@eslint-community/regexpp" "^4.5.1" - "@typescript-eslint/scope-manager" "6.7.5" - "@typescript-eslint/type-utils" "6.7.5" - "@typescript-eslint/utils" "6.7.5" - "@typescript-eslint/visitor-keys" "6.7.5" - debug "^4.3.4" - graphemer "^1.4.0" - ignore "^5.2.4" - natural-compare "^1.4.0" - semver "^7.5.4" - ts-api-utils "^1.0.1" - -"@typescript-eslint/parser@^6.0.0 || ^6.0.0-alpha", "@typescript-eslint/parser@^6.7.5": - version "6.7.5" - dependencies: - "@typescript-eslint/scope-manager" "6.7.5" - "@typescript-eslint/types" "6.7.5" - "@typescript-eslint/typescript-estree" "6.7.5" - "@typescript-eslint/visitor-keys" "6.7.5" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@6.7.5": - version "6.7.5" - dependencies: - "@typescript-eslint/types" "6.7.5" - "@typescript-eslint/visitor-keys" "6.7.5" - -"@typescript-eslint/type-utils@6.7.5": - version "6.7.5" - dependencies: - "@typescript-eslint/typescript-estree" "6.7.5" - "@typescript-eslint/utils" "6.7.5" - debug "^4.3.4" - ts-api-utils "^1.0.1" - -"@typescript-eslint/types@6.7.5": - version "6.7.5" - -"@typescript-eslint/typescript-estree@6.7.5": - version "6.7.5" - dependencies: - "@typescript-eslint/types" "6.7.5" - "@typescript-eslint/visitor-keys" "6.7.5" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.5.4" - ts-api-utils "^1.0.1" - -"@typescript-eslint/utils@6.7.5": - version "6.7.5" - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@types/json-schema" "^7.0.12" - "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "6.7.5" - "@typescript-eslint/types" "6.7.5" - "@typescript-eslint/typescript-estree" "6.7.5" - semver "^7.5.4" - -"@typescript-eslint/visitor-keys@6.7.5": - version "6.7.5" - dependencies: - "@typescript-eslint/types" "6.7.5" - eslint-visitor-keys "^3.4.1" - -abbrev@1: - version "1.1.1" - -abitype@0.9.8: - version "0.9.8" - -acorn-jsx@^5.3.2: - version "5.3.2" - -acorn-walk@^8.1.1: - version "8.2.0" - -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.4.1, acorn@^8.9.0: - version "8.10.0" - -ajv@^6.12.4: - version "6.12.6" - 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" - -ansi-regex@^5.0.1: - version "5.0.1" - -ansi-styles@^4.1.0: - version "4.3.0" - dependencies: - color-convert "^2.0.1" - -anymatch@~3.1.2: - version "3.1.3" - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arg@^4.1.0: - version "4.1.3" - -argparse@^2.0.1: - version "2.0.1" - -array-union@^2.1.0: - version "2.1.0" - -asynckit@^0.4.0: - version "0.4.0" - -axios@^1.5.1: - version "1.5.1" - dependencies: - follow-redirects "^1.15.0" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -balanced-match@^1.0.0: - version "1.0.2" - -binary-extensions@^2.0.0: - version "2.2.0" - -brace-expansion@^1.1.7: - version "1.1.11" - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - dependencies: - fill-range "^7.0.1" - -callsites@^3.0.0: - version "3.1.0" - -chalk@^4.0.0: - version "4.1.2" - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chokidar@^3.5.2: - version "3.5.3" - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -color-convert@^2.0.1: - version "2.0.1" - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - -combined-stream@^1.0.8: - version "1.0.8" - dependencies: - delayed-stream "~1.0.0" - -concat-map@0.0.1: - version "0.0.1" - -create-require@^1.1.0: - version "1.1.1" - -cross-spawn@^7.0.2: - version "7.0.3" - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -debug@^3.2.7: - version "3.2.7" - dependencies: - ms "^2.1.1" - -debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - dependencies: - ms "2.1.2" - -deep-is@^0.1.3: - version "0.1.4" - -delayed-stream@~1.0.0: - version "1.0.0" - -diff@^4.0.1: - version "4.0.2" - -dir-glob@^3.0.1: - version "3.0.1" - dependencies: - path-type "^4.0.0" - -doctrine@^3.0.0: - version "3.0.0" - dependencies: - esutils "^2.0.2" - -dotenv@^16.3.1: - version "16.3.1" - -escape-string-regexp@^4.0.0: - version "4.0.0" - -eslint-config-prettier@^9.0.0: - version "9.0.0" - -eslint-scope@^7.2.2: - version "7.2.2" - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: - version "3.4.3" - -"eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", eslint@^8.51.0, eslint@>=7.0.0: - version "8.51.0" - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.2" - "@eslint/js" "8.51.0" - "@humanwhocodes/config-array" "^0.11.11" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - 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@^9.6.0, espree@^9.6.1: - version "9.6.1" - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esquery@^1.4.2: - version "1.5.0" - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - dependencies: - estraverse "^5.2.0" - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - -esutils@^2.0.2: - version "2.0.3" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - -fast-glob@^3.2.9: - version "3.3.1" - 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" - -fast-levenshtein@^2.0.6: - version "2.0.6" - -fastq@^1.6.0: - version "1.15.0" - dependencies: - reusify "^1.0.4" - -file-entry-cache@^6.0.1: - version "6.0.1" - dependencies: - flat-cache "^3.0.4" - -fill-range@^7.0.1: - version "7.0.1" - dependencies: - to-regex-range "^5.0.1" - -find-up@^5.0.0: - version "5.0.0" - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.1.1" - dependencies: - flatted "^3.2.9" - keyv "^4.5.3" - rimraf "^3.0.2" - -flatted@^3.2.9: - version "3.2.9" - -follow-redirects@^1.15.0: - version "1.15.3" - -form-data@^4.0.0: - version "4.0.0" - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -fs.realpath@^1.0.0: - version "1.0.0" - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - dependencies: - is-glob "^4.0.3" - -glob@^7.1.3: - version "7.2.3" - 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" - -globals@^13.19.0: - version "13.23.0" - dependencies: - type-fest "^0.20.2" - -globby@^11.1.0: - version "11.1.0" - 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" - -graphemer@^1.4.0: - version "1.4.0" - -has-flag@^3.0.0: - version "3.0.0" - -has-flag@^4.0.0: - version "4.0.0" - -ignore-by-default@^1.0.1: - version "1.0.1" - -ignore@^5.2.0, ignore@^5.2.4: - version "5.2.4" - -import-fresh@^3.2.1: - version "3.3.0" - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - -inflight@^1.0.4: - version "1.0.6" - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - -is-binary-path@~2.1.0: - version "2.1.0" - dependencies: - binary-extensions "^2.0.0" - -is-extglob@^2.1.1: - version "2.1.1" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - -is-path-inside@^3.0.3: - version "3.0.3" - -isexe@^2.0.0: - version "2.0.0" - -isows@1.0.3: - version "1.0.3" - -js-yaml@^4.1.0: - version "4.1.0" - dependencies: - argparse "^2.0.1" - -json-buffer@3.0.1: - version "3.0.1" - -json-schema-traverse@^0.4.1: - version "0.4.1" - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - -keyv@^4.5.3: - version "4.5.4" - dependencies: - json-buffer "3.0.1" - -levn@^0.4.1: - version "0.4.1" - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -locate-path@^6.0.0: - version "6.0.0" - dependencies: - p-locate "^5.0.0" - -lodash.merge@^4.6.2: - version "4.6.2" - -lru-cache@^6.0.0: - version "6.0.0" - dependencies: - yallist "^4.0.0" - -make-error@^1.1.1: - version "1.3.6" - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - -micromatch@^4.0.4: - version "4.0.5" - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mime-db@1.52.0: - version "1.52.0" - -mime-types@^2.1.12: - version "2.1.35" - dependencies: - mime-db "1.52.0" - -minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - dependencies: - brace-expansion "^1.1.7" - -ms@^2.1.1: - version "2.1.3" - -ms@2.1.2: - version "2.1.2" - -natural-compare@^1.4.0: - version "1.4.0" - -node-cron@^3.0.2: - version "3.0.2" - dependencies: - uuid "8.3.2" - -nodemon@^3.0.1: - version "3.0.1" - dependencies: - chokidar "^3.5.2" - debug "^3.2.7" - ignore-by-default "^1.0.1" - minimatch "^3.1.2" - pstree.remy "^1.1.8" - semver "^7.5.3" - simple-update-notifier "^2.0.0" - supports-color "^5.5.0" - touch "^3.1.0" - undefsafe "^2.0.5" - -nopt@~1.0.10: - version "1.0.10" - dependencies: - abbrev "1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - -once@^1.3.0: - version "1.4.0" - dependencies: - wrappy "1" - -optionator@^0.9.3: - version "0.9.3" - 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" - -p-limit@^3.0.2: - version "3.1.0" - dependencies: - yocto-queue "^0.1.0" - -p-locate@^5.0.0: - version "5.0.0" - dependencies: - p-limit "^3.0.2" - -parent-module@^1.0.0: - version "1.0.1" - dependencies: - callsites "^3.0.0" - -path-exists@^4.0.0: - version "4.0.0" - -path-is-absolute@^1.0.0: - version "1.0.1" - -path-key@^3.1.0: - version "3.1.1" - -path-type@^4.0.0: - version "4.0.0" - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: - version "2.3.1" - -prelude-ls@^1.2.1: - version "1.2.1" - -prettier@^3.0.3: - version "3.0.3" - -proxy-from-env@^1.1.0: - version "1.1.0" - -pstree.remy@^1.1.8: - version "1.1.8" - -punycode@^2.1.0: - version "2.3.0" - -queue-microtask@^1.2.2: - version "1.2.3" - -readdirp@~3.6.0: - version "3.6.0" - dependencies: - picomatch "^2.2.1" - -resolve-from@^4.0.0: - version "4.0.0" - -reusify@^1.0.4: - version "1.0.4" - -rimraf@^3.0.2: - version "3.0.2" - dependencies: - glob "^7.1.3" - -run-parallel@^1.1.9: - version "1.2.0" - dependencies: - queue-microtask "^1.2.2" - -semver@^7.5.3, semver@^7.5.4: - version "7.5.4" - dependencies: - lru-cache "^6.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - -simple-update-notifier@^2.0.0: - version "2.0.0" - dependencies: - semver "^7.5.3" - -slash@^3.0.0: - version "3.0.0" - -strip-ansi@^6.0.1: - version "6.0.1" - dependencies: - ansi-regex "^5.0.1" - -strip-json-comments@^3.1.1: - version "3.1.1" - -supports-color@^5.5.0: - version "5.5.0" - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - dependencies: - has-flag "^4.0.0" - -text-table@^0.2.0: - version "0.2.0" - -to-regex-range@^5.0.1: - version "5.0.1" - dependencies: - is-number "^7.0.0" - -touch@^3.1.0: - version "3.1.0" - dependencies: - nopt "~1.0.10" - -ts-api-utils@^1.0.1: - version "1.0.3" - -ts-node@^10.9.1: - version "10.9.1" - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - dependencies: - prelude-ls "^1.2.1" - -type-fest@^0.20.2: - version "0.20.2" - -typescript@^5.2.2, typescript@>=2.7, typescript@>=4.2.0, typescript@>=5.0.4: - version "5.2.2" - -undefsafe@^2.0.5: - version "2.0.5" - -undici-types@~5.25.1: - version "5.25.3" - resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz" - integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA== - -uri-js@^4.2.2: - version "4.4.1" - dependencies: - punycode "^2.1.0" - -uuid@8.3.2: - version "8.3.2" - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - -viem@^1.16.5: - version "1.16.5" - dependencies: - "@adraffy/ens-normalize" "1.9.4" - "@noble/curves" "1.2.0" - "@noble/hashes" "1.3.2" - "@scure/bip32" "1.3.2" - "@scure/bip39" "1.2.1" - abitype "0.9.8" - isows "1.0.3" - ws "8.13.0" - -which@^2.0.1: - version "2.0.2" - dependencies: - isexe "^2.0.0" - -wrappy@1: - version "1.0.2" - -ws@*, ws@8.13.0: - version "8.13.0" - -yallist@^4.0.0: - version "4.0.0" - -yn@3.1.1: - version "3.1.1" - -yocto-queue@^0.1.0: - version "0.1.0" +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 6 + cacheKey: 8 + +"@aashutoshrathi/word-wrap@npm:^1.2.3": + version: 1.2.6 + resolution: "@aashutoshrathi/word-wrap@npm:1.2.6" + checksum: ada901b9e7c680d190f1d012c84217ce0063d8f5c5a7725bb91ec3c5ed99bb7572680eb2d2938a531ccbaec39a95422fcd8a6b4a13110c7d98dd75402f66a0cd + languageName: node + linkType: hard + +"@adraffy/ens-normalize@npm:1.9.4": + version: 1.9.4 + resolution: "@adraffy/ens-normalize@npm:1.9.4" + checksum: 7d7fff58ebe2c4961f7e5e61dad123aa6a63fec0df5c84af1fa41079dc05d398599690be4427b3a94d2baa94084544bcfdf2d51cbed7504b9b0583b0960ad550 + languageName: node + linkType: hard + +"@colors/colors@npm:1.6.0, @colors/colors@npm:^1.6.0": + version: 1.6.0 + resolution: "@colors/colors@npm:1.6.0" + checksum: aa209963e0c3218e80a4a20553ba8c0fbb6fa13140540b4e5f97923790be06801fc90172c1114fc8b7e888b3d012b67298cde6b9e81521361becfaee400c662f + languageName: node + linkType: hard + +"@cspotcode/source-map-support@npm:^0.8.0": + version: 0.8.1 + resolution: "@cspotcode/source-map-support@npm:0.8.1" + dependencies: + "@jridgewell/trace-mapping": 0.3.9 + checksum: 5718f267085ed8edb3e7ef210137241775e607ee18b77d95aa5bd7514f47f5019aa2d82d96b3bf342ef7aa890a346fa1044532ff7cc3009e7d24fce3ce6200fa + languageName: node + linkType: hard + +"@dabh/diagnostics@npm:^2.0.2": + version: 2.0.3 + resolution: "@dabh/diagnostics@npm:2.0.3" + dependencies: + colorspace: 1.1.x + enabled: 2.0.x + kuler: ^2.0.0 + checksum: 4879600c55c8315a0fb85fbb19057bad1adc08f0a080a8cb4e2b63f723c379bfc4283b68123a2b078d367b327dd8df12fcb27464efe791addc0a48b9df6d79a1 + languageName: node + linkType: hard + +"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": + version: 4.4.0 + resolution: "@eslint-community/eslint-utils@npm:4.4.0" + dependencies: + eslint-visitor-keys: ^3.3.0 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: cdfe3ae42b4f572cbfb46d20edafe6f36fc5fb52bf2d90875c58aefe226892b9677fef60820e2832caf864a326fe4fc225714c46e8389ccca04d5f9288aabd22 + languageName: node + linkType: hard + +"@eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": + version: 4.9.1 + resolution: "@eslint-community/regexpp@npm:4.9.1" + checksum: 06fb839e9c756f6375cc545c2f2e05a0a64576bd6370e8e3c07983fd29a3d6e164ef4aa48a361f7d27e6713ab79c83053ff6a2ccb78748bc955e344279c4a3b6 + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^2.1.2": + version: 2.1.2 + resolution: "@eslint/eslintrc@npm:2.1.2" + 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 + checksum: bc742a1e3b361f06fedb4afb6bf32cbd27171292ef7924f61c62f2aed73048367bcc7ac68f98c06d4245cd3fabc43270f844e3c1699936d4734b3ac5398814a7 + languageName: node + linkType: hard + +"@eslint/js@npm:8.51.0": + version: 8.51.0 + resolution: "@eslint/js@npm:8.51.0" + checksum: 0228bf1e1e0414843e56d9ff362a2a72d579c078f93174666f29315690e9e30a8633ad72c923297f7fd7182381b5a476805ff04dac8debe638953eb1ded3ac73 + languageName: node + linkType: hard + +"@humanwhocodes/config-array@npm:^0.11.11": + version: 0.11.12 + resolution: "@humanwhocodes/config-array@npm:0.11.12" + dependencies: + "@humanwhocodes/object-schema": ^2.0.0 + debug: ^4.1.1 + minimatch: ^3.0.5 + checksum: 8eab5a7c7e4948aa07cf26d0b6cca103298ab9bbb70f897c7cfbb3ee5fd5431a0d9f2ff5efd4d712dae7fd8fa941f09b1b22da842b9d87367ccb75b86bbd715b + languageName: node + linkType: hard + +"@humanwhocodes/module-importer@npm:^1.0.1": + version: 1.0.1 + resolution: "@humanwhocodes/module-importer@npm:1.0.1" + checksum: 0fd22007db8034a2cdf2c764b140d37d9020bbfce8a49d3ec5c05290e77d4b0263b1b972b752df8c89e5eaa94073408f2b7d977aed131faf6cf396ebb5d7fb61 + languageName: node + linkType: hard + +"@humanwhocodes/object-schema@npm:^2.0.0": + version: 2.0.0 + resolution: "@humanwhocodes/object-schema@npm:2.0.0" + checksum: e0558acd035198a69adfa3edce33ec385bb664c92478a08a91b3e8082acd2d96ef7bf43189d848e4b0bdd75092f9d494a55a4efaf5bed45101c9e83d28379d83 + languageName: node + linkType: hard + +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: ^5.1.2 + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: ^7.0.1 + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: ^8.1.0 + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: 4a473b9b32a7d4d3cfb7a614226e555091ff0c5a29a1734c28c72a182c2f6699b26fc6b5c2131dfd841e86b185aea714c72201d7c98c2fba5f17709333a67aeb + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.0.3": + version: 3.1.1 + resolution: "@jridgewell/resolve-uri@npm:3.1.1" + checksum: f5b441fe7900eab4f9155b3b93f9800a916257f4e8563afbcd3b5a5337b55e52bd8ae6735453b1b745457d9f6cdb16d74cd6220bbdd98cf153239e13f6cbb653 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10": + version: 1.4.15 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" + checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:0.3.9": + version: 0.3.9 + resolution: "@jridgewell/trace-mapping@npm:0.3.9" + dependencies: + "@jridgewell/resolve-uri": ^3.0.3 + "@jridgewell/sourcemap-codec": ^1.4.10 + checksum: d89597752fd88d3f3480845691a05a44bd21faac18e2185b6f436c3b0fd0c5a859fbbd9aaa92050c4052caf325ad3e10e2e1d1b64327517471b7d51babc0ddef + languageName: node + linkType: hard + +"@noble/curves@npm:1.2.0, @noble/curves@npm:~1.2.0": + version: 1.2.0 + resolution: "@noble/curves@npm:1.2.0" + dependencies: + "@noble/hashes": 1.3.2 + checksum: bb798d7a66d8e43789e93bc3c2ddff91a1e19fdb79a99b86cd98f1e5eff0ee2024a2672902c2576ef3577b6f282f3b5c778bebd55761ddbb30e36bf275e83dd0 + languageName: node + linkType: hard + +"@noble/hashes@npm:1.3.2, @noble/hashes@npm:~1.3.0, @noble/hashes@npm:~1.3.2": + version: 1.3.2 + resolution: "@noble/hashes@npm:1.3.2" + checksum: fe23536b436539d13f90e4b9be843cc63b1b17666a07634a2b1259dded6f490be3d050249e6af98076ea8f2ea0d56f578773c2197f2aa0eeaa5fba5bc18ba474 + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": 2.0.5 + run-parallel: ^1.1.9 + checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59 + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": 2.1.5 + fastq: ^1.6.0 + checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53 + languageName: node + linkType: hard + +"@npmcli/fs@npm:^3.1.0": + version: 3.1.0 + resolution: "@npmcli/fs@npm:3.1.0" + dependencies: + semver: ^7.3.5 + checksum: a50a6818de5fc557d0b0e6f50ec780a7a02ab8ad07e5ac8b16bf519e0ad60a144ac64f97d05c443c3367235d337182e1d012bbac0eb8dbae8dc7b40b193efd0e + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 6ad6a00fc4f2f2cfc6bff76fb1d88b8ee20bc0601e18ebb01b6d4be583733a860239a521a7fbca73b612e66705078809483549d2b18f370eb346c5155c8e4a0f + languageName: node + linkType: hard + +"@scure/base@npm:~1.1.0, @scure/base@npm:~1.1.2": + version: 1.1.3 + resolution: "@scure/base@npm:1.1.3" + checksum: 1606ab8a4db898cb3a1ada16c15437c3bce4e25854fadc8eb03ae93cbbbac1ed90655af4b0be3da37e12056fef11c0374499f69b9e658c9e5b7b3e06353c630c + languageName: node + linkType: hard + +"@scure/bip32@npm:1.3.2": + version: 1.3.2 + resolution: "@scure/bip32@npm:1.3.2" + dependencies: + "@noble/curves": ~1.2.0 + "@noble/hashes": ~1.3.2 + "@scure/base": ~1.1.2 + checksum: c5ae84fae43490853693b481531132b89e056d45c945fc8b92b9d032577f753dfd79c5a7bbcbf0a7f035951006ff0311b6cf7a389e26c9ec6335e42b20c53157 + languageName: node + linkType: hard + +"@scure/bip39@npm:1.2.1": + version: 1.2.1 + resolution: "@scure/bip39@npm:1.2.1" + dependencies: + "@noble/hashes": ~1.3.0 + "@scure/base": ~1.1.0 + checksum: c5bd6f1328fdbeae2dcdd891825b1610225310e5e62a4942714db51066866e4f7bef242c7b06a1b9dcc8043a4a13412cf5c5df76d3b10aa9e36b82e9b6e3eeaa + languageName: node + linkType: hard + +"@tootallnate/once@npm:2": + version: 2.0.0 + resolution: "@tootallnate/once@npm:2.0.0" + checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 + languageName: node + linkType: hard + +"@tsconfig/node10@npm:^1.0.7": + version: 1.0.9 + resolution: "@tsconfig/node10@npm:1.0.9" + checksum: a33ae4dc2a621c0678ac8ac4bceb8e512ae75dac65417a2ad9b022d9b5411e863c4c198b6ba9ef659e14b9fb609bbec680841a2e84c1172df7a5ffcf076539df + languageName: node + linkType: hard + +"@tsconfig/node12@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node12@npm:1.0.11" + checksum: 5ce29a41b13e7897a58b8e2df11269c5395999e588b9a467386f99d1d26f6c77d1af2719e407621412520ea30517d718d5192a32403b8dfcc163bf33e40a338a + languageName: node + linkType: hard + +"@tsconfig/node14@npm:^1.0.0": + version: 1.0.3 + resolution: "@tsconfig/node14@npm:1.0.3" + checksum: 19275fe80c4c8d0ad0abed6a96dbf00642e88b220b090418609c4376e1cef81bf16237bf170ad1b341452feddb8115d8dd2e5acdfdea1b27422071163dc9ba9d + languageName: node + linkType: hard + +"@tsconfig/node16@npm:^1.0.2": + version: 1.0.4 + resolution: "@tsconfig/node16@npm:1.0.4" + checksum: 202319785901f942a6e1e476b872d421baec20cf09f4b266a1854060efbf78cde16a4d256e8bc949d31e6cd9a90f1e8ef8fb06af96a65e98338a2b6b0de0a0ff + languageName: node + linkType: hard + +"@types/json-schema@npm:^7.0.12": + version: 7.0.14 + resolution: "@types/json-schema@npm:7.0.14" + checksum: 4b3dd99616c7c808201c56f6c7f6552eb67b5c0c753ab3fa03a6cb549aae950da537e9558e53fa65fba23d1be624a1e4e8d20c15027efbe41e03ca56f2b04fb0 + languageName: node + linkType: hard + +"@types/node-cron@npm:^3.0.9": + version: 3.0.9 + resolution: "@types/node-cron@npm:3.0.9" + checksum: 8335eb0a453b956cc2da5431269e4732e0063c6cca0763cf779c7c242d0dfe3eea1929951a0b11fb9e7a2eee838836ee8cda79e9d6098b1bee91d5a17dce1e73 + languageName: node + linkType: hard + +"@types/node@npm:^20.8.6": + version: 20.8.6 + resolution: "@types/node@npm:20.8.6" + dependencies: + undici-types: ~5.25.1 + checksum: ccfb7ac482c5a96edeb239893c5c099f5257fcc2ed9ae62fefdfbc782b79e16dbc2af9a85b379665237bf759904b44ca2be68e75d239e0297882aad42f61905c + languageName: node + linkType: hard + +"@types/semver@npm:^7.5.0": + version: 7.5.4 + resolution: "@types/semver@npm:7.5.4" + checksum: 120c0189f6fec5f2d12d0d71ac8a4cfa952dc17fa3d842e8afddb82bba8828a4052f8799c1653e2b47ae1977435f38e8985658fde971905ce5afb8e23ee97ecf + languageName: node + linkType: hard + +"@types/triple-beam@npm:^1.3.2": + version: 1.3.4 + resolution: "@types/triple-beam@npm:1.3.4" + checksum: 869641358164a9b87aec710e046c11a65803b7dc3545f33c3365df9590d1059c70592bb35a7fc4099fa746f112ab5a207881ba9fb570e9b1dea4ffd89761d804 + languageName: node + linkType: hard + +"@typescript-eslint/eslint-plugin@npm:^6.7.5": + version: 6.8.0 + resolution: "@typescript-eslint/eslint-plugin@npm:6.8.0" + dependencies: + "@eslint-community/regexpp": ^4.5.1 + "@typescript-eslint/scope-manager": 6.8.0 + "@typescript-eslint/type-utils": 6.8.0 + "@typescript-eslint/utils": 6.8.0 + "@typescript-eslint/visitor-keys": 6.8.0 + debug: ^4.3.4 + graphemer: ^1.4.0 + ignore: ^5.2.4 + natural-compare: ^1.4.0 + semver: ^7.5.4 + ts-api-utils: ^1.0.1 + peerDependencies: + "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: c36ccf606ebcaff8263c4ffa3b4cda58c6f93474b9eea9906e51be2fef8596977a245cc13770b21c6bfd38ccf45a3cf3613d5f4499429f62ec80afe15ae345bd + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:^6.7.5": + version: 6.8.0 + resolution: "@typescript-eslint/parser@npm:6.8.0" + dependencies: + "@typescript-eslint/scope-manager": 6.8.0 + "@typescript-eslint/types": 6.8.0 + "@typescript-eslint/typescript-estree": 6.8.0 + "@typescript-eslint/visitor-keys": 6.8.0 + debug: ^4.3.4 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10d7a3ae383fee5a5cba9541c72e23d6ab01cca6b414a62b44dacb5ebc15c80b80aa6c105b6469d3795f2f8514ae2499c069cd2d9dcac61f3db9ef6c7a75e080 + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:6.8.0": + version: 6.8.0 + resolution: "@typescript-eslint/scope-manager@npm:6.8.0" + dependencies: + "@typescript-eslint/types": 6.8.0 + "@typescript-eslint/visitor-keys": 6.8.0 + checksum: b6cf2803531d1c14b56c30fd3cd807b80e17fe48d0da8e5aa9ae50915407ed732c7e2a7ac8030b7cf8ed07b8e481a1138d76bf05b727837a0e016280c2f6873b + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:6.8.0": + version: 6.8.0 + resolution: "@typescript-eslint/type-utils@npm:6.8.0" + dependencies: + "@typescript-eslint/typescript-estree": 6.8.0 + "@typescript-eslint/utils": 6.8.0 + debug: ^4.3.4 + ts-api-utils: ^1.0.1 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 9b7d56904dc1a5719ef79eb1b7989d6fad10c71fb07ec3e66cf69b8c8dc5383d644ab122d4701bc4960fb7c99cc08aee4e645db3e4675d488d5779197e15dfda + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:6.8.0": + version: 6.8.0 + resolution: "@typescript-eslint/types@npm:6.8.0" + checksum: 1fcd85f6d575116d51c6ee757ed37610ae5e7e4296a29f93c9c6949f6cd16d24550eb7fc5bae7a43119cc08e13836f69a7ae7c54ebba6c95aef96b34d3bfb7f7 + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:6.8.0": + version: 6.8.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.8.0" + dependencies: + "@typescript-eslint/types": 6.8.0 + "@typescript-eslint/visitor-keys": 6.8.0 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + semver: ^7.5.4 + ts-api-utils: ^1.0.1 + peerDependenciesMeta: + typescript: + optional: true + checksum: 388db7f33ef1bc0e7b960c0bce9c744c2e32c66c7ab8dfae73d8533958202ad6f31663b0010f79c45b5ff93159c67f45b00693d73b9da2472b17156dfd26b4a8 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:6.8.0": + version: 6.8.0 + resolution: "@typescript-eslint/utils@npm:6.8.0" + dependencies: + "@eslint-community/eslint-utils": ^4.4.0 + "@types/json-schema": ^7.0.12 + "@types/semver": ^7.5.0 + "@typescript-eslint/scope-manager": 6.8.0 + "@typescript-eslint/types": 6.8.0 + "@typescript-eslint/typescript-estree": 6.8.0 + semver: ^7.5.4 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + checksum: 6d9f90db504502a9aa10e834830c3ffa25483757414670acc6141a3ebef9171a57688a3a179febf35a0e1e0b322f37228d9537bf1b279f1af7fc97888b873bc3 + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:6.8.0": + version: 6.8.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.8.0" + dependencies: + "@typescript-eslint/types": 6.8.0 + eslint-visitor-keys: ^3.4.1 + checksum: 710d9067b85d7715a400ae625c083c41733abb891d7b35108de083913980f9642e79d27689599fa39915f0fecae16dbfc30367007fccc838ccd917943660de22 + languageName: node + linkType: hard + +"abbrev@npm:1, abbrev@npm:^1.0.0": + version: 1.1.1 + resolution: "abbrev@npm:1.1.1" + checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 + languageName: node + linkType: hard + +"abitype@npm:0.9.8": + version: 0.9.8 + resolution: "abitype@npm:0.9.8" + peerDependencies: + typescript: ">=5.0.4" + zod: ^3 >=3.19.1 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + checksum: d7d887f29d6821e3f7a400de9620511b80ead3f85c5c87308aaec97965d3493e6687ed816e88722b4f512249bd66dee9e69231b49af0e1db8f69400a62c87cf6 + languageName: node + linkType: hard + +"acorn-jsx@npm:^5.3.2": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: c3d3b2a89c9a056b205b69530a37b972b404ee46ec8e5b341666f9513d3163e2a4f214a71f4dfc7370f5a9c07472d2fd1c11c91c3f03d093e37637d95da98950 + languageName: node + linkType: hard + +"acorn-walk@npm:^8.1.1": + version: 8.2.0 + resolution: "acorn-walk@npm:8.2.0" + checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1 + languageName: node + linkType: hard + +"acorn@npm:^8.4.1, acorn@npm:^8.9.0": + version: 8.10.0 + resolution: "acorn@npm:8.10.0" + bin: + acorn: bin/acorn + checksum: 538ba38af0cc9e5ef983aee196c4b8b4d87c0c94532334fa7e065b2c8a1f85863467bb774231aae91613fcda5e68740c15d97b1967ae3394d20faddddd8af61d + languageName: node + linkType: hard + +"agent-base@npm:6, agent-base@npm:^6.0.2": + version: 6.0.2 + resolution: "agent-base@npm:6.0.2" + dependencies: + debug: 4 + checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d + languageName: node + linkType: hard + +"agentkeepalive@npm:^4.2.1": + version: 4.5.0 + resolution: "agentkeepalive@npm:4.5.0" + dependencies: + humanize-ms: ^1.2.1 + checksum: 13278cd5b125e51eddd5079f04d6fe0914ac1b8b91c1f3db2c1822f99ac1a7457869068997784342fe455d59daaff22e14fb7b8c3da4e741896e7e31faf92481 + languageName: node + linkType: hard + +"aggregate-error@npm:^3.0.0": + version: 3.1.0 + resolution: "aggregate-error@npm:3.1.0" + dependencies: + clean-stack: ^2.0.0 + indent-string: ^4.0.0 + checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 + languageName: node + linkType: hard + +"ajv@npm:^6.12.4": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" + 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 + checksum: 874972efe5c4202ab0a68379481fbd3d1b5d0a7bd6d3cc21d40d3536ebff3352a2a1fabb632d4fd2cc7fe4cbdcd5ed6782084c9bbf7f32a1536d18f9da5007d4 + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b + languageName: node + linkType: hard + +"ansi-regex@npm:^6.0.1": + version: 6.0.1 + resolution: "ansi-regex@npm:6.0.1" + checksum: 1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: ^2.0.1 + checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 + languageName: node + linkType: hard + +"ansi-styles@npm:^6.1.0": + version: 6.2.1 + resolution: "ansi-styles@npm:6.2.1" + checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 + languageName: node + linkType: hard + +"anymatch@npm:~3.1.2": + version: 3.1.3 + resolution: "anymatch@npm:3.1.3" + dependencies: + normalize-path: ^3.0.0 + picomatch: ^2.0.4 + checksum: 3e044fd6d1d26545f235a9fe4d7a534e2029d8e59fa7fd9f2a6eb21230f6b5380ea1eaf55136e60cbf8e613544b3b766e7a6fa2102e2a3a117505466e3025dc2 + languageName: node + linkType: hard + +"aproba@npm:^1.0.3 || ^2.0.0": + version: 2.0.0 + resolution: "aproba@npm:2.0.0" + checksum: 5615cadcfb45289eea63f8afd064ab656006361020e1735112e346593856f87435e02d8dcc7ff0d11928bc7d425f27bc7c2a84f6c0b35ab0ff659c814c138a24 + languageName: node + linkType: hard + +"are-we-there-yet@npm:^3.0.0": + version: 3.0.1 + resolution: "are-we-there-yet@npm:3.0.1" + dependencies: + delegates: ^1.0.0 + readable-stream: ^3.6.0 + checksum: 52590c24860fa7173bedeb69a4c05fb573473e860197f618b9a28432ee4379049336727ae3a1f9c4cb083114601c1140cee578376164d0e651217a9843f9fe83 + languageName: node + linkType: hard + +"arg@npm:^4.1.0": + version: 4.1.3 + resolution: "arg@npm:4.1.3" + checksum: 544af8dd3f60546d3e4aff084d451b96961d2267d668670199692f8d054f0415d86fc5497d0e641e91546f0aa920e7c29e5250e99fc89f5552a34b5d93b77f43 + languageName: node + linkType: hard + +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced + languageName: node + linkType: hard + +"array-union@npm:^2.1.0": + version: 2.1.0 + resolution: "array-union@npm:2.1.0" + checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d + languageName: node + linkType: hard + +"async@npm:^3.2.3": + version: 3.2.4 + resolution: "async@npm:3.2.4" + checksum: 43d07459a4e1d09b84a20772414aa684ff4de085cbcaec6eea3c7a8f8150e8c62aa6cd4e699fe8ee93c3a5b324e777d34642531875a0817a35697522c1b02e89 + languageName: node + linkType: hard + +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 7b78c451df768adba04e2d02e63e2d0bf3b07adcd6e42b4cf665cb7ce899bedd344c69a1dcbce355b5f972d597b25aaa1c1742b52cffd9caccb22f348114f6be + languageName: node + linkType: hard + +"axios@npm:^1.5.1": + version: 1.5.1 + resolution: "axios@npm:1.5.1" + dependencies: + follow-redirects: ^1.15.0 + form-data: ^4.0.0 + proxy-from-env: ^1.1.0 + checksum: 4444f06601f4ede154183767863d2b8e472b4a6bfc5253597ed6d21899887e1fd0ee2b3de792ac4f8459fe2e359d2aa07c216e45fd8b9e4e0688a6ebf48a5a8d + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 + languageName: node + linkType: hard + +"binary-extensions@npm:^2.0.0": + version: 2.2.0 + resolution: "binary-extensions@npm:2.2.0" + checksum: ccd267956c58d2315f5d3ea6757cf09863c5fc703e50fbeb13a7dc849b812ef76e3cf9ca8f35a0c48498776a7478d7b4a0418e1e2b8cb9cb9731f2922aaad7f8 + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: ^1.0.0 + concat-map: 0.0.1 + checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" + dependencies: + balanced-match: ^1.0.0 + checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 + languageName: node + linkType: hard + +"braces@npm:^3.0.2, braces@npm:~3.0.2": + version: 3.0.2 + resolution: "braces@npm:3.0.2" + dependencies: + fill-range: ^7.0.1 + checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 + languageName: node + linkType: hard + +"cacache@npm:^17.0.0": + version: 17.1.4 + resolution: "cacache@npm:17.1.4" + dependencies: + "@npmcli/fs": ^3.1.0 + fs-minipass: ^3.0.0 + glob: ^10.2.2 + lru-cache: ^7.7.1 + minipass: ^7.0.3 + minipass-collect: ^1.0.2 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + p-map: ^4.0.0 + ssri: ^10.0.0 + tar: ^6.1.11 + unique-filename: ^3.0.0 + checksum: b7751df756656954a51201335addced8f63fc53266fa56392c9f5ae83c8d27debffb4458ac2d168a744a4517ec3f2163af05c20097f93d17bdc2dc8a385e14a6 + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 + languageName: node + linkType: hard + +"chalk@npm:^4.0.0": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: ^4.1.0 + supports-color: ^7.1.0 + checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc + languageName: node + linkType: hard + +"chokidar@npm:^3.5.2": + version: 3.5.3 + resolution: "chokidar@npm:3.5.3" + dependencies: + anymatch: ~3.1.2 + braces: ~3.0.2 + fsevents: ~2.3.2 + glob-parent: ~5.1.2 + is-binary-path: ~2.1.0 + is-glob: ~4.0.1 + normalize-path: ~3.0.0 + readdirp: ~3.6.0 + dependenciesMeta: + fsevents: + optional: true + checksum: b49fcde40176ba007ff361b198a2d35df60d9bb2a5aab228279eb810feae9294a6b4649ab15981304447afe1e6ffbf4788ad5db77235dc770ab777c6e771980c + languageName: node + linkType: hard + +"chownr@npm:^2.0.0": + version: 2.0.0 + resolution: "chownr@npm:2.0.0" + checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f + languageName: node + linkType: hard + +"clean-stack@npm:^2.0.0": + version: 2.2.0 + resolution: "clean-stack@npm:2.2.0" + checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 + languageName: node + linkType: hard + +"color-convert@npm:^1.9.3": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" + dependencies: + color-name: 1.1.3 + checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: ~1.1.4 + checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 + languageName: node + linkType: hard + +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d + languageName: node + linkType: hard + +"color-name@npm:^1.0.0, color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 + languageName: node + linkType: hard + +"color-string@npm:^1.6.0": + version: 1.9.1 + resolution: "color-string@npm:1.9.1" + dependencies: + color-name: ^1.0.0 + simple-swizzle: ^0.2.2 + checksum: c13fe7cff7885f603f49105827d621ce87f4571d78ba28ef4a3f1a104304748f620615e6bf065ecd2145d0d9dad83a3553f52bb25ede7239d18e9f81622f1cc5 + languageName: node + linkType: hard + +"color-support@npm:^1.1.3": + version: 1.1.3 + resolution: "color-support@npm:1.1.3" + bin: + color-support: bin.js + checksum: 9b7356817670b9a13a26ca5af1c21615463b500783b739b7634a0c2047c16cef4b2865d7576875c31c3cddf9dd621fa19285e628f20198b233a5cfdda6d0793b + languageName: node + linkType: hard + +"color@npm:^3.1.3": + version: 3.2.1 + resolution: "color@npm:3.2.1" + dependencies: + color-convert: ^1.9.3 + color-string: ^1.6.0 + checksum: f81220e8b774d35865c2561be921f5652117638dcda7ca4029262046e37fc2444ac7bbfdd110cf1fd9c074a4ee5eda8f85944ffbdda26186b602dd9bb05f6400 + languageName: node + linkType: hard + +"colorspace@npm:1.1.x": + version: 1.1.4 + resolution: "colorspace@npm:1.1.4" + dependencies: + color: ^3.1.3 + text-hex: 1.0.x + checksum: bb3934ef3c417e961e6d03d7ca60ea6e175947029bfadfcdb65109b01881a1c0ecf9c2b0b59abcd0ee4a0d7c1eae93beed01b0e65848936472270a0b341ebce8 + languageName: node + linkType: hard + +"combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: ~1.0.0 + checksum: 49fa4aeb4916567e33ea81d088f6584749fc90c7abec76fd516bf1c5aa5c79f3584b5ba3de6b86d26ddd64bae5329c4c7479343250cfe71c75bb366eae53bb7c + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af + languageName: node + linkType: hard + +"console-control-strings@npm:^1.1.0": + version: 1.1.0 + resolution: "console-control-strings@npm:1.1.0" + checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed + languageName: node + linkType: hard + +"create-require@npm:^1.1.0": + version: 1.1.1 + resolution: "create-require@npm:1.1.1" + checksum: a9a1503d4390d8b59ad86f4607de7870b39cad43d929813599a23714831e81c520bddf61bcdd1f8e30f05fd3a2b71ae8538e946eb2786dc65c2bbc520f692eff + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2": + version: 7.0.3 + resolution: "cross-spawn@npm:7.0.3" + dependencies: + path-key: ^3.1.0 + shebang-command: ^2.0.0 + which: ^2.0.1 + checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": + version: 4.3.4 + resolution: "debug@npm:4.3.4" + dependencies: + ms: 2.1.2 + peerDependenciesMeta: + supports-color: + optional: true + checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 + languageName: node + linkType: hard + +"debug@npm:^3.2.7": + version: 3.2.7 + resolution: "debug@npm:3.2.7" + dependencies: + ms: ^2.1.1 + checksum: b3d8c5940799914d30314b7c3304a43305fd0715581a919dacb8b3176d024a782062368405b47491516d2091d6462d4d11f2f4974a405048094f8bfebfa3071c + languageName: node + linkType: hard + +"deep-is@npm:^0.1.3": + version: 0.1.4 + resolution: "deep-is@npm:0.1.4" + checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 + languageName: node + linkType: hard + +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020 + languageName: node + linkType: hard + +"delegates@npm:^1.0.0": + version: 1.0.0 + resolution: "delegates@npm:1.0.0" + checksum: a51744d9b53c164ba9c0492471a1a2ffa0b6727451bdc89e31627fdf4adda9d51277cfcbfb20f0a6f08ccb3c436f341df3e92631a3440226d93a8971724771fd + languageName: node + linkType: hard + +"diff@npm:^4.0.1": + version: 4.0.2 + resolution: "diff@npm:4.0.2" + checksum: f2c09b0ce4e6b301c221addd83bf3f454c0bc00caa3dd837cf6c127d6edf7223aa2bbe3b688feea110b7f262adbfc845b757c44c8a9f8c0c5b15d8fa9ce9d20d + languageName: node + linkType: hard + +"dir-glob@npm:^3.0.1": + version: 3.0.1 + resolution: "dir-glob@npm:3.0.1" + dependencies: + path-type: ^4.0.0 + checksum: fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 + languageName: node + linkType: hard + +"doctrine@npm:^3.0.0": + version: 3.0.0 + resolution: "doctrine@npm:3.0.0" + dependencies: + esutils: ^2.0.2 + checksum: fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce + languageName: node + linkType: hard + +"dotenv@npm:^16.3.1": + version: 16.3.1 + resolution: "dotenv@npm:16.3.1" + checksum: 15d75e7279018f4bafd0ee9706593dd14455ddb71b3bcba9c52574460b7ccaf67d5cf8b2c08a5af1a9da6db36c956a04a1192b101ee102a3e0cf8817bbcf3dfd + languageName: node + linkType: hard + +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 + languageName: node + linkType: hard + +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601 + languageName: node + linkType: hard + +"enabled@npm:2.0.x": + version: 2.0.0 + resolution: "enabled@npm:2.0.0" + checksum: 9d256d89f4e8a46ff988c6a79b22fa814b4ffd82826c4fdacd9b42e9b9465709d3b748866d0ab4d442dfc6002d81de7f7b384146ccd1681f6a7f868d2acca063 + languageName: node + linkType: hard + +"encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" + dependencies: + iconv-lite: ^0.6.2 + checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 + languageName: node + linkType: hard + +"eslint-config-prettier@npm:^9.0.0": + version: 9.0.0 + resolution: "eslint-config-prettier@npm:9.0.0" + peerDependencies: + eslint: ">=7.0.0" + bin: + eslint-config-prettier: bin/cli.js + checksum: 362e991b6cb343f79362bada2d97c202e5303e6865888918a7445c555fb75e4c078b01278e90be98aa98ae22f8597d8e93d48314bec6824f540f7efcab3ce451 + languageName: node + linkType: hard + +"eslint-scope@npm:^7.2.2": + version: 7.2.2 + resolution: "eslint-scope@npm:7.2.2" + dependencies: + esrecurse: ^4.3.0 + estraverse: ^5.2.0 + checksum: ec97dbf5fb04b94e8f4c5a91a7f0a6dd3c55e46bfc7bbcd0e3138c3a76977570e02ed89a1810c778dcd72072ff0e9621ba1379b4babe53921d71e2e4486fda3e + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": + version: 3.4.3 + resolution: "eslint-visitor-keys@npm:3.4.3" + checksum: 36e9ef87fca698b6fd7ca5ca35d7b2b6eeaaf106572e2f7fd31c12d3bfdaccdb587bba6d3621067e5aece31c8c3a348b93922ab8f7b2cbc6aaab5e1d89040c60 + languageName: node + linkType: hard + +"eslint@npm:^8.51.0": + version: 8.51.0 + resolution: "eslint@npm:8.51.0" + dependencies: + "@eslint-community/eslint-utils": ^4.2.0 + "@eslint-community/regexpp": ^4.6.1 + "@eslint/eslintrc": ^2.1.2 + "@eslint/js": 8.51.0 + "@humanwhocodes/config-array": ^0.11.11 + "@humanwhocodes/module-importer": ^1.0.1 + "@nodelib/fs.walk": ^1.2.8 + 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 + bin: + eslint: bin/eslint.js + checksum: 214fa5d1fcb67af1b8992ce9584ccd85e1aa7a482f8b8ea5b96edc28fa838a18a3b69456db45fc1ed3ef95f1e9efa9714f737292dc681e572d471d02fda9649c + languageName: node + linkType: hard + +"espree@npm:^9.6.0, espree@npm:^9.6.1": + version: 9.6.1 + resolution: "espree@npm:9.6.1" + dependencies: + acorn: ^8.9.0 + acorn-jsx: ^5.3.2 + eslint-visitor-keys: ^3.4.1 + checksum: eb8c149c7a2a77b3f33a5af80c10875c3abd65450f60b8af6db1bfcfa8f101e21c1e56a561c6dc13b848e18148d43469e7cd208506238554fb5395a9ea5a1ab9 + languageName: node + linkType: hard + +"esquery@npm:^1.4.2": + version: 1.5.0 + resolution: "esquery@npm:1.5.0" + dependencies: + estraverse: ^5.1.0 + checksum: aefb0d2596c230118656cd4ec7532d447333a410a48834d80ea648b1e7b5c9bc9ed8b5e33a89cb04e487b60d622f44cf5713bf4abed7c97343edefdc84a35900 + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: ^5.2.0 + checksum: ebc17b1a33c51cef46fdc28b958994b1dc43cd2e86237515cbc3b4e5d2be6a811b2315d0a1a4d9d340b6d2308b15322f5c8291059521cc5f4802f65e7ec32837 + languageName: node + linkType: hard + +"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 22b5b08f74737379a840b8ed2036a5fb35826c709ab000683b092d9054e5c2a82c27818f12604bfc2a9a76b90b6834ef081edbc1c7ae30d1627012e067c6ec87 + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.1 + resolution: "exponential-backoff@npm:3.1.1" + checksum: 3d21519a4f8207c99f7457287291316306255a328770d320b401114ec8481986e4e467e854cb9914dd965e0a1ca810a23ccb559c642c88f4c7f55c55778a9b48 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d + languageName: node + linkType: hard + +"fast-glob@npm:^3.2.9": + version: 3.3.1 + resolution: "fast-glob@npm:3.3.1" + 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 + checksum: b6f3add6403e02cf3a798bfbb1183d0f6da2afd368f27456010c0bc1f9640aea308243d4cb2c0ab142f618276e65ecb8be1661d7c62a7b4e5ba774b9ce5432e5 + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:^2.0.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb + languageName: node + linkType: hard + +"fast-levenshtein@npm:^2.0.6": + version: 2.0.6 + resolution: "fast-levenshtein@npm:2.0.6" + checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.15.0 + resolution: "fastq@npm:1.15.0" + dependencies: + reusify: ^1.0.4 + checksum: 0170e6bfcd5d57a70412440b8ef600da6de3b2a6c5966aeaf0a852d542daff506a0ee92d6de7679d1de82e644bce69d7a574a6c93f0b03964b5337eed75ada1a + languageName: node + linkType: hard + +"fecha@npm:^4.2.0": + version: 4.2.3 + resolution: "fecha@npm:4.2.3" + checksum: f94e2fb3acf5a7754165d04549460d3ae6c34830394d20c552197e3e000035d69732d74af04b9bed3283bf29fe2a9ebdcc0085e640b0be3cc3658b9726265e31 + languageName: node + linkType: hard + +"file-entry-cache@npm:^6.0.1": + version: 6.0.1 + resolution: "file-entry-cache@npm:6.0.1" + dependencies: + flat-cache: ^3.0.4 + checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 + languageName: node + linkType: hard + +"fill-range@npm:^7.0.1": + version: 7.0.1 + resolution: "fill-range@npm:7.0.1" + dependencies: + to-regex-range: ^5.0.1 + checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 + languageName: node + linkType: hard + +"find-up@npm:^5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" + dependencies: + locate-path: ^6.0.0 + path-exists: ^4.0.0 + checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 + languageName: node + linkType: hard + +"flat-cache@npm:^3.0.4": + version: 3.1.1 + resolution: "flat-cache@npm:3.1.1" + dependencies: + flatted: ^3.2.9 + keyv: ^4.5.3 + rimraf: ^3.0.2 + checksum: 4958cfe0f46acf84953d4e16676ef5f0d38eab3a92d532a1e8d5f88f11eea8b36d5d598070ff2aeae15f1fde18f8d7d089eefaf9db10b5a587cc1c9072325c7a + languageName: node + linkType: hard + +"flatted@npm:^3.2.9": + version: 3.2.9 + resolution: "flatted@npm:3.2.9" + checksum: f14167fbe26a9d20f6fca8d998e8f1f41df72c8e81f9f2c9d61ed2bea058248f5e1cbd05e7f88c0e5087a6a0b822a1e5e2b446e879f3cfbe0b07ba2d7f80b026 + languageName: node + linkType: hard + +"fn.name@npm:1.x.x": + version: 1.1.0 + resolution: "fn.name@npm:1.1.0" + checksum: e357144f48cfc9a7f52a82bbc6c23df7c8de639fce049cac41d41d62cabb740cdb9f14eddc6485e29c933104455bdd7a69bb14a9012cef9cd4fa252a4d0cf293 + languageName: node + linkType: hard + +"follow-redirects@npm:^1.15.0": + version: 1.15.3 + resolution: "follow-redirects@npm:1.15.3" + peerDependenciesMeta: + debug: + optional: true + checksum: 584da22ec5420c837bd096559ebfb8fe69d82512d5585004e36a3b4a6ef6d5905780e0c74508c7b72f907d1fa2b7bd339e613859e9c304d0dc96af2027fd0231 + languageName: node + linkType: hard + +"foreground-child@npm:^3.1.0": + version: 3.1.1 + resolution: "foreground-child@npm:3.1.1" + dependencies: + cross-spawn: ^7.0.0 + signal-exit: ^4.0.1 + checksum: 139d270bc82dc9e6f8bc045fe2aae4001dc2472157044fdfad376d0a3457f77857fa883c1c8b21b491c6caade9a926a4bed3d3d2e8d3c9202b151a4cbbd0bcd5 + languageName: node + linkType: hard + +"form-data@npm:^4.0.0": + version: 4.0.0 + resolution: "form-data@npm:4.0.0" + dependencies: + asynckit: ^0.4.0 + combined-stream: ^1.0.8 + mime-types: ^2.1.12 + checksum: 01135bf8675f9d5c61ff18e2e2932f719ca4de964e3be90ef4c36aacfc7b9cb2fceb5eca0b7e0190e3383fe51c5b37f4cb80b62ca06a99aaabfcfd6ac7c9328c + languageName: node + linkType: hard + +"fs-minipass@npm:^2.0.0": + version: 2.1.0 + resolution: "fs-minipass@npm:2.1.0" + dependencies: + minipass: ^3.0.0 + checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1 + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: ^7.0.3 + checksum: 8722a41109130851d979222d3ec88aabaceeaaf8f57b2a8f744ef8bd2d1ce95453b04a61daa0078822bc5cd21e008814f06fe6586f56fef511e71b8d2394d802 + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 + languageName: node + linkType: hard + +"fsevents@npm:~2.3.2": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" + dependencies: + node-gyp: latest + checksum: 11e6ea6fea15e42461fc55b4b0e4a0a3c654faa567f1877dbd353f39156f69def97a69936d1746619d656c4b93de2238bf731f6085a03a50cabf287c9d024317 + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@~2.3.2#~builtin": + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=18f3a7" + dependencies: + node-gyp: latest + conditions: os=darwin + languageName: node + linkType: hard + +"gauge@npm:^4.0.3": + version: 4.0.4 + resolution: "gauge@npm:4.0.4" + dependencies: + aproba: ^1.0.3 || ^2.0.0 + color-support: ^1.1.3 + console-control-strings: ^1.1.0 + has-unicode: ^2.0.1 + signal-exit: ^3.0.7 + string-width: ^4.2.3 + strip-ansi: ^6.0.1 + wide-align: ^1.1.5 + checksum: 788b6bfe52f1dd8e263cda800c26ac0ca2ff6de0b6eee2fe0d9e3abf15e149b651bd27bf5226be10e6e3edb5c4e5d5985a5a1a98137e7a892f75eff76467ad2d + languageName: node + linkType: hard + +"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: ^4.0.1 + checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e + languageName: node + linkType: hard + +"glob-parent@npm:^6.0.2": + version: 6.0.2 + resolution: "glob-parent@npm:6.0.2" + dependencies: + is-glob: ^4.0.3 + checksum: c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8 + languageName: node + linkType: hard + +"glob@npm:^10.2.2": + version: 10.3.10 + resolution: "glob@npm:10.3.10" + dependencies: + foreground-child: ^3.1.0 + jackspeak: ^2.3.5 + minimatch: ^9.0.1 + minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 + path-scurry: ^1.10.1 + bin: + glob: dist/esm/bin.mjs + checksum: 4f2fe2511e157b5a3f525a54092169a5f92405f24d2aed3142f4411df328baca13059f4182f1db1bf933e2c69c0bd89e57ae87edd8950cba8c7ccbe84f721cf3 + languageName: node + linkType: hard + +"glob@npm:^7.1.3, glob@npm:^7.1.4": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + 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 + checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 + languageName: node + linkType: hard + +"globals@npm:^13.19.0": + version: 13.23.0 + resolution: "globals@npm:13.23.0" + dependencies: + type-fest: ^0.20.2 + checksum: 194c97cf8d1ef6ba59417234c2386549c4103b6e5f24b1ff1952de61a4753e5d2069435ba629de711a6480b1b1d114a98e2ab27f85e966d5a10c319c3bbd3dc3 + languageName: node + linkType: hard + +"globby@npm:^11.1.0": + version: 11.1.0 + resolution: "globby@npm:11.1.0" + 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 + checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.2.6": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 + languageName: node + linkType: hard + +"graphemer@npm:^1.4.0": + version: 1.4.0 + resolution: "graphemer@npm:1.4.0" + checksum: bab8f0be9b568857c7bec9fda95a89f87b783546d02951c40c33f84d05bb7da3fd10f863a9beb901463669b6583173a8c8cc6d6b306ea2b9b9d5d3d943c3a673 + languageName: node + linkType: hard + +"has-flag@npm:^3.0.0": + version: 3.0.0 + resolution: "has-flag@npm:3.0.0" + checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad + languageName: node + linkType: hard + +"has-unicode@npm:^2.0.1": + version: 2.0.1 + resolution: "has-unicode@npm:2.0.1" + checksum: 1eab07a7436512db0be40a710b29b5dc21fa04880b7f63c9980b706683127e3c1b57cb80ea96d47991bdae2dfe479604f6a1ba410106ee1046a41d1bd0814400 + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.1.1": + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236 + languageName: node + linkType: hard + +"http-proxy-agent@npm:^5.0.0": + version: 5.0.0 + resolution: "http-proxy-agent@npm:5.0.0" + dependencies: + "@tootallnate/once": 2 + agent-base: 6 + debug: 4 + checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^5.0.0": + version: 5.0.1 + resolution: "https-proxy-agent@npm:5.0.1" + dependencies: + agent-base: 6 + debug: 4 + checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 + languageName: node + linkType: hard + +"humanize-ms@npm:^1.2.1": + version: 1.2.1 + resolution: "humanize-ms@npm:1.2.1" + dependencies: + ms: ^2.0.0 + checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16 + languageName: node + linkType: hard + +"iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: ">= 2.1.2 < 3.0.0" + checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf + languageName: node + linkType: hard + +"ignore-by-default@npm:^1.0.1": + version: 1.0.1 + resolution: "ignore-by-default@npm:1.0.1" + checksum: 441509147b3615e0365e407a3c18e189f78c07af08564176c680be1fabc94b6c789cad1342ad887175d4ecd5225de86f73d376cec8e06b42fd9b429505ffcf8a + languageName: node + linkType: hard + +"ignore@npm:^5.2.0, ignore@npm:^5.2.4": + version: 5.2.4 + resolution: "ignore@npm:5.2.4" + checksum: 3d4c309c6006e2621659311783eaea7ebcd41fe4ca1d78c91c473157ad6666a57a2df790fe0d07a12300d9aac2888204d7be8d59f9aaf665b1c7fcdb432517ef + languageName: node + linkType: hard + +"import-fresh@npm:^3.2.1": + version: 3.3.0 + resolution: "import-fresh@npm:3.3.0" + dependencies: + parent-module: ^1.0.0 + resolve-from: ^4.0.0 + checksum: 2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 + languageName: node + linkType: hard + +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: ^1.3.0 + wrappy: 1 + checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd + languageName: node + linkType: hard + +"inherits@npm:2, inherits@npm:^2.0.3": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 + languageName: node + linkType: hard + +"ip@npm:^2.0.0": + version: 2.0.0 + resolution: "ip@npm:2.0.0" + checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349 + languageName: node + linkType: hard + +"is-arrayish@npm:^0.3.1": + version: 0.3.2 + resolution: "is-arrayish@npm:0.3.2" + checksum: 977e64f54d91c8f169b59afcd80ff19227e9f5c791fa28fa2e5bce355cbaf6c2c356711b734656e80c9dd4a854dd7efcf7894402f1031dfc5de5d620775b4d5f + languageName: node + linkType: hard + +"is-binary-path@npm:~2.1.0": + version: 2.1.0 + resolution: "is-binary-path@npm:2.1.0" + dependencies: + binary-extensions: ^2.0.0 + checksum: 84192eb88cff70d320426f35ecd63c3d6d495da9d805b19bc65b518984b7c0760280e57dbf119b7e9be6b161784a5a673ab2c6abe83abb5198a432232ad5b35c + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 + languageName: node + linkType: hard + +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: ^2.1.1 + checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 + languageName: node + linkType: hard + +"is-lambda@npm:^1.0.1": + version: 1.0.1 + resolution: "is-lambda@npm:1.0.1" + checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35 + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a + languageName: node + linkType: hard + +"is-path-inside@npm:^3.0.3": + version: 3.0.3 + resolution: "is-path-inside@npm:3.0.3" + checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 + languageName: node + linkType: hard + +"is-stream@npm:^2.0.0": + version: 2.0.1 + resolution: "is-stream@npm:2.0.1" + checksum: b8e05ccdf96ac330ea83c12450304d4a591f9958c11fd17bed240af8d5ffe08aedafa4c0f4cfccd4d28dc9d4d129daca1023633d5c11601a6cbc77521f6fae66 + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 + languageName: node + linkType: hard + +"isows@npm:1.0.3": + version: 1.0.3 + resolution: "isows@npm:1.0.3" + peerDependencies: + ws: "*" + checksum: 9cacd5cf59f67deb51e825580cd445ab1725ecb05a67c704050383fb772856f3cd5e7da8ad08f5a3bd2823680d77d099459d0c6a7037972a74d6429af61af440 + languageName: node + linkType: hard + +"jackspeak@npm:^2.3.5": + version: 2.3.6 + resolution: "jackspeak@npm:2.3.6" + dependencies: + "@isaacs/cliui": ^8.0.2 + "@pkgjs/parseargs": ^0.11.0 + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: 57d43ad11eadc98cdfe7496612f6bbb5255ea69fe51ea431162db302c2a11011642f50cfad57288bd0aea78384a0612b16e131944ad8ecd09d619041c8531b54 + languageName: node + linkType: hard + +"js-yaml@npm:^4.1.0": + version: 4.1.0 + resolution: "js-yaml@npm:4.1.0" + dependencies: + argparse: ^2.0.1 + bin: + js-yaml: bin/js-yaml.js + checksum: c7830dfd456c3ef2c6e355cc5a92e6700ceafa1d14bba54497b34a99f0376cecbb3e9ac14d3e5849b426d5a5140709a66237a8c991c675431271c4ce5504151a + languageName: node + linkType: hard + +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 9026b03edc2847eefa2e37646c579300a1f3a4586cfb62bf857832b60c852042d0d6ae55d1afb8926163fa54c2b01d83ae24705f34990348bdac6273a29d4581 + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 7486074d3ba247769fda17d5181b345c9fb7d12e0da98b22d1d71a5db9698d8b4bd900a3ec1a4ffdd60846fc2556274a5c894d0c48795f14cb03aeae7b55260b + languageName: node + linkType: hard + +"json-stable-stringify-without-jsonify@npm:^1.0.1": + version: 1.0.1 + resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" + checksum: cff44156ddce9c67c44386ad5cddf91925fe06b1d217f2da9c4910d01f358c6e3989c4d5a02683c7a5667f9727ff05831f7aa8ae66c8ff691c556f0884d49215 + languageName: node + linkType: hard + +"keyv@npm:^4.5.3": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" + dependencies: + json-buffer: 3.0.1 + checksum: 74a24395b1c34bd44ad5cb2b49140d087553e170625240b86755a6604cd65aa16efdbdeae5cdb17ba1284a0fbb25ad06263755dbc71b8d8b06f74232ce3cdd72 + languageName: node + linkType: hard + +"kuler@npm:^2.0.0": + version: 2.0.0 + resolution: "kuler@npm:2.0.0" + checksum: 9e10b5a1659f9ed8761d38df3c35effabffbd19fc6107324095238e4ef0ff044392cae9ac64a1c2dda26e532426485342226b93806bd97504b174b0dcf04ed81 + languageName: node + linkType: hard + +"levn@npm:^0.4.1": + version: 0.4.1 + resolution: "levn@npm:0.4.1" + dependencies: + prelude-ls: ^1.2.1 + type-check: ~0.4.0 + checksum: 12c5021c859bd0f5248561bf139121f0358285ec545ebf48bb3d346820d5c61a4309535c7f387ed7d84361cf821e124ce346c6b7cef8ee09a67c1473b46d0fc4 + languageName: node + linkType: hard + +"locate-path@npm:^6.0.0": + version: 6.0.0 + resolution: "locate-path@npm:6.0.0" + dependencies: + p-locate: ^5.0.0 + checksum: 72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a + languageName: node + linkType: hard + +"lodash.merge@npm:^4.6.2": + version: 4.6.2 + resolution: "lodash.merge@npm:4.6.2" + checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005 + languageName: node + linkType: hard + +"logform@npm:^2.3.2, logform@npm:^2.4.0": + version: 2.6.0 + resolution: "logform@npm:2.6.0" + dependencies: + "@colors/colors": 1.6.0 + "@types/triple-beam": ^1.3.2 + fecha: ^4.2.0 + ms: ^2.1.1 + safe-stable-stringify: ^2.3.1 + triple-beam: ^1.3.0 + checksum: b9ea74bb75e55379ad0eb3e4d65ae6e8d02bc45b431c218162878bf663997ab9258a73104c2b30e09dd2db288bb83c8bf8748e46689d75f5e7e34cf69378d6df + languageName: node + linkType: hard + +"lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" + dependencies: + yallist: ^4.0.0 + checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 + languageName: node + linkType: hard + +"lru-cache@npm:^7.7.1": + version: 7.18.3 + resolution: "lru-cache@npm:7.18.3" + checksum: e550d772384709deea3f141af34b6d4fa392e2e418c1498c078de0ee63670f1f46f5eee746e8ef7e69e1c895af0d4224e62ee33e66a543a14763b0f2e74c1356 + languageName: node + linkType: hard + +"lru-cache@npm:^9.1.1 || ^10.0.0": + version: 10.0.1 + resolution: "lru-cache@npm:10.0.1" + checksum: 06f8d0e1ceabd76bb6f644a26dbb0b4c471b79c7b514c13c6856113879b3bf369eb7b497dad4ff2b7e2636db202412394865b33c332100876d838ad1372f0181 + languageName: node + linkType: hard + +"make-error@npm:^1.1.1": + version: 1.3.6 + resolution: "make-error@npm:1.3.6" + checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 + languageName: node + linkType: hard + +"make-fetch-happen@npm:^11.0.3": + version: 11.1.1 + resolution: "make-fetch-happen@npm:11.1.1" + dependencies: + agentkeepalive: ^4.2.1 + cacache: ^17.0.0 + http-cache-semantics: ^4.1.1 + http-proxy-agent: ^5.0.0 + https-proxy-agent: ^5.0.0 + is-lambda: ^1.0.1 + lru-cache: ^7.7.1 + minipass: ^5.0.0 + minipass-fetch: ^3.0.0 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + negotiator: ^0.6.3 + promise-retry: ^2.0.1 + socks-proxy-agent: ^7.0.0 + ssri: ^10.0.0 + checksum: 7268bf274a0f6dcf0343829489a4506603ff34bd0649c12058753900b0eb29191dce5dba12680719a5d0a983d3e57810f594a12f3c18494e93a1fbc6348a4540 + languageName: node + linkType: hard + +"merge2@npm:^1.3.0, merge2@npm:^1.4.1": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 + languageName: node + linkType: hard + +"micromatch@npm:^4.0.4": + version: 4.0.5 + resolution: "micromatch@npm:4.0.5" + dependencies: + braces: ^3.0.2 + picomatch: ^2.3.1 + checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc + languageName: node + linkType: hard + +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f + languageName: node + linkType: hard + +"mime-types@npm:^2.1.12": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: 1.52.0 + checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836 + languageName: node + linkType: hard + +"minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: ^1.1.7 + checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a + languageName: node + linkType: hard + +"minimatch@npm:^9.0.1": + version: 9.0.3 + resolution: "minimatch@npm:9.0.3" + dependencies: + brace-expansion: ^2.0.1 + checksum: 253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5 + languageName: node + linkType: hard + +"minipass-collect@npm:^1.0.2": + version: 1.0.2 + resolution: "minipass-collect@npm:1.0.2" + dependencies: + minipass: ^3.0.0 + checksum: 14df761028f3e47293aee72888f2657695ec66bd7d09cae7ad558da30415fdc4752bbfee66287dcc6fd5e6a2fa3466d6c484dc1cbd986525d9393b9523d97f10 + languageName: node + linkType: hard + +"minipass-fetch@npm:^3.0.0": + version: 3.0.4 + resolution: "minipass-fetch@npm:3.0.4" + dependencies: + encoding: ^0.1.13 + minipass: ^7.0.3 + minipass-sized: ^1.0.3 + minizlib: ^2.1.2 + dependenciesMeta: + encoding: + optional: true + checksum: af7aad15d5c128ab1ebe52e043bdf7d62c3c6f0cecb9285b40d7b395e1375b45dcdfd40e63e93d26a0e8249c9efd5c325c65575aceee192883970ff8cb11364a + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" + dependencies: + minipass: ^3.0.0 + checksum: 56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: ^3.0.0 + checksum: b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b + languageName: node + linkType: hard + +"minipass-sized@npm:^1.0.3": + version: 1.0.3 + resolution: "minipass-sized@npm:1.0.3" + dependencies: + minipass: ^3.0.0 + checksum: 79076749fcacf21b5d16dd596d32c3b6bf4d6e62abb43868fac21674078505c8b15eaca4e47ed844985a4514854f917d78f588fcd029693709417d8f98b2bd60 + languageName: node + linkType: hard + +"minipass@npm:^3.0.0": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: ^4.0.0 + checksum: a30d083c8054cee83cdcdc97f97e4641a3f58ae743970457b1489ce38ee1167b3aaf7d815cd39ec7a99b9c40397fd4f686e83750e73e652b21cb516f6d845e48 + languageName: node + linkType: hard + +"minipass@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass@npm:5.0.0" + checksum: 425dab288738853fded43da3314a0b5c035844d6f3097a8e3b5b29b328da8f3c1af6fc70618b32c29ff906284cf6406b6841376f21caaadd0793c1d5a6a620ea + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.3": + version: 7.0.4 + resolution: "minipass@npm:7.0.4" + checksum: 87585e258b9488caf2e7acea242fd7856bbe9a2c84a7807643513a338d66f368c7d518200ad7b70a508664d408aa000517647b2930c259a8b1f9f0984f344a21 + languageName: node + linkType: hard + +"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": + version: 2.1.2 + resolution: "minizlib@npm:2.1.2" + dependencies: + minipass: ^3.0.0 + yallist: ^4.0.0 + checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3 + languageName: node + linkType: hard + +"mkdirp@npm:^1.0.3": + version: 1.0.4 + resolution: "mkdirp@npm:1.0.4" + bin: + mkdirp: bin/cmd.js + checksum: a96865108c6c3b1b8e1d5e9f11843de1e077e57737602de1b82030815f311be11f96f09cce59bd5b903d0b29834733e5313f9301e3ed6d6f6fba2eae0df4298f + languageName: node + linkType: hard + +"ms@npm:2.1.2": + version: 2.1.2 + resolution: "ms@npm:2.1.2" + checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f + languageName: node + linkType: hard + +"ms@npm:^2.0.0, ms@npm:^2.1.1": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d + languageName: node + linkType: hard + +"natural-compare@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare@npm:1.4.0" + checksum: 23ad088b08f898fc9b53011d7bb78ec48e79de7627e01ab5518e806033861bef68d5b0cd0e2205c2f36690ac9571ff6bcb05eb777ced2eeda8d4ac5b44592c3d + languageName: node + linkType: hard + +"negotiator@npm:^0.6.3": + version: 0.6.3 + resolution: "negotiator@npm:0.6.3" + checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 + languageName: node + linkType: hard + +"node-cron@npm:^3.0.2": + version: 3.0.2 + resolution: "node-cron@npm:3.0.2" + dependencies: + uuid: 8.3.2 + checksum: dd21585c0d4069a0752022dad9b8380a4393c4783ec78355ffa99ff32b018c3743a35d4ebf9d7c7863949e94e302b440f58c884eb4960e71c7260d817e2d3f25 + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 9.4.0 + resolution: "node-gyp@npm:9.4.0" + dependencies: + env-paths: ^2.2.0 + exponential-backoff: ^3.1.1 + glob: ^7.1.4 + graceful-fs: ^4.2.6 + make-fetch-happen: ^11.0.3 + nopt: ^6.0.0 + npmlog: ^6.0.0 + rimraf: ^3.0.2 + semver: ^7.3.5 + tar: ^6.1.2 + which: ^2.0.2 + bin: + node-gyp: bin/node-gyp.js + checksum: 78b404e2e0639d64e145845f7f5a3cb20c0520cdaf6dda2f6e025e9b644077202ea7de1232396ba5bde3fee84cdc79604feebe6ba3ec84d464c85d407bb5da99 + languageName: node + linkType: hard + +"nodemon@npm:^3.0.1": + version: 3.0.1 + resolution: "nodemon@npm:3.0.1" + dependencies: + chokidar: ^3.5.2 + debug: ^3.2.7 + ignore-by-default: ^1.0.1 + minimatch: ^3.1.2 + pstree.remy: ^1.1.8 + semver: ^7.5.3 + simple-update-notifier: ^2.0.0 + supports-color: ^5.5.0 + touch: ^3.1.0 + undefsafe: ^2.0.5 + bin: + nodemon: bin/nodemon.js + checksum: 6a5d81855760d6617049eccce10ccf02bddb482dab13ceea5280ae595ec7004eee13e7b934368e3f46c37fe4d970342a8c38c99cae7e93e4d7a3ed1c1ecb6acf + languageName: node + linkType: hard + +"nopt@npm:^6.0.0": + version: 6.0.0 + resolution: "nopt@npm:6.0.0" + dependencies: + abbrev: ^1.0.0 + bin: + nopt: bin/nopt.js + checksum: 82149371f8be0c4b9ec2f863cc6509a7fd0fa729929c009f3a58e4eb0c9e4cae9920e8f1f8eb46e7d032fec8fb01bede7f0f41a67eb3553b7b8e14fa53de1dac + languageName: node + linkType: hard + +"nopt@npm:~1.0.10": + version: 1.0.10 + resolution: "nopt@npm:1.0.10" + dependencies: + abbrev: 1 + bin: + nopt: ./bin/nopt.js + checksum: f62575aceaa3be43f365bf37a596b89bbac2e796b001b6d2e2a85c2140a4e378ff919e2753ccba959c4fd344776fc88c29b393bc167fa939fb1513f126f4cd45 + languageName: node + linkType: hard + +"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 + languageName: node + linkType: hard + +"npmlog@npm:^6.0.0": + version: 6.0.2 + resolution: "npmlog@npm:6.0.2" + dependencies: + are-we-there-yet: ^3.0.0 + console-control-strings: ^1.1.0 + gauge: ^4.0.3 + set-blocking: ^2.0.0 + checksum: ae238cd264a1c3f22091cdd9e2b106f684297d3c184f1146984ecbe18aaa86343953f26b9520dedd1b1372bc0316905b736c1932d778dbeb1fcf5a1001390e2a + languageName: node + linkType: hard + +"once@npm:^1.3.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: 1 + checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 + languageName: node + linkType: hard + +"one-time@npm:^1.0.0": + version: 1.0.0 + resolution: "one-time@npm:1.0.0" + dependencies: + fn.name: 1.x.x + checksum: fd008d7e992bdec1c67f53a2f9b46381ee12a9b8c309f88b21f0223546003fb47e8ad7c1fd5843751920a8d276c63bd4b45670ef80c61fb3e07dbccc962b5c7d + languageName: node + linkType: hard + +"optionator@npm:^0.9.3": + version: 0.9.3 + resolution: "optionator@npm:0.9.3" + 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 + checksum: 09281999441f2fe9c33a5eeab76700795365a061563d66b098923eb719251a42bdbe432790d35064d0816ead9296dbeb1ad51a733edf4167c96bd5d0882e428a + languageName: node + linkType: hard + +"p-limit@npm:^3.0.2": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" + dependencies: + yocto-queue: ^0.1.0 + checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 + languageName: node + linkType: hard + +"p-locate@npm:^5.0.0": + version: 5.0.0 + resolution: "p-locate@npm:5.0.0" + dependencies: + p-limit: ^3.0.2 + checksum: 1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3 + languageName: node + linkType: hard + +"p-map@npm:^4.0.0": + version: 4.0.0 + resolution: "p-map@npm:4.0.0" + dependencies: + aggregate-error: ^3.0.0 + checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c + languageName: node + linkType: hard + +"parent-module@npm:^1.0.0": + version: 1.0.1 + resolution: "parent-module@npm:1.0.1" + dependencies: + callsites: ^3.0.0 + checksum: 6ba8b255145cae9470cf5551eb74be2d22281587af787a2626683a6c20fbb464978784661478dd2a3f1dad74d1e802d403e1b03c1a31fab310259eec8ac560ff + languageName: node + linkType: hard + +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 + languageName: node + linkType: hard + +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 + languageName: node + linkType: hard + +"path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 + languageName: node + linkType: hard + +"path-scurry@npm:^1.10.1": + version: 1.10.1 + resolution: "path-scurry@npm:1.10.1" + dependencies: + lru-cache: ^9.1.1 || ^10.0.0 + minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 + checksum: e2557cff3a8fb8bc07afdd6ab163a92587884f9969b05bbbaf6fe7379348bfb09af9ed292af12ed32398b15fb443e81692047b786d1eeb6d898a51eb17ed7d90 + languageName: node + linkType: hard + +"path-type@npm:^4.0.0": + version: 4.0.0 + resolution: "path-type@npm:4.0.0" + checksum: 5b1e2daa247062061325b8fdbfd1fb56dde0a448fb1455453276ea18c60685bdad23a445dc148cf87bc216be1573357509b7d4060494a6fd768c7efad833ee45 + languageName: node + linkType: hard + +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf + languageName: node + linkType: hard + +"prelude-ls@npm:^1.2.1": + version: 1.2.1 + resolution: "prelude-ls@npm:1.2.1" + checksum: cd192ec0d0a8e4c6da3bb80e4f62afe336df3f76271ac6deb0e6a36187133b6073a19e9727a1ff108cd8b9982e4768850d413baa71214dd80c7979617dca827a + languageName: node + linkType: hard + +"prettier@npm:^3.0.3": + version: 3.0.3 + resolution: "prettier@npm:3.0.3" + bin: + prettier: bin/prettier.cjs + checksum: e10b9af02b281f6c617362ebd2571b1d7fc9fb8a3bd17e371754428cda992e5e8d8b7a046e8f7d3e2da1dcd21aa001e2e3c797402ebb6111b5cd19609dd228e0 + languageName: node + linkType: hard + +"promise-retry@npm:^2.0.1": + version: 2.0.1 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: ^2.0.2 + retry: ^0.12.0 + checksum: f96a3f6d90b92b568a26f71e966cbbc0f63ab85ea6ff6c81284dc869b41510e6cdef99b6b65f9030f0db422bf7c96652a3fff9f2e8fb4a0f069d8f4430359429 + languageName: node + linkType: hard + +"proxy-from-env@npm:^1.1.0": + version: 1.1.0 + resolution: "proxy-from-env@npm:1.1.0" + checksum: ed7fcc2ba0a33404958e34d95d18638249a68c430e30fcb6c478497d72739ba64ce9810a24f53a7d921d0c065e5b78e3822759800698167256b04659366ca4d4 + languageName: node + linkType: hard + +"pstree.remy@npm:^1.1.8": + version: 1.1.8 + resolution: "pstree.remy@npm:1.1.8" + checksum: 5cb53698d6bb34dfb278c8a26957964aecfff3e161af5fbf7cee00bbe9d8547c7aced4bd9cb193bce15fb56e9e4220fc02a5bf9c14345ffb13a36b858701ec2d + languageName: node + linkType: hard + +"punycode@npm:^2.1.0": + version: 2.3.0 + resolution: "punycode@npm:2.3.0" + checksum: 39f760e09a2a3bbfe8f5287cf733ecdad69d6af2fe6f97ca95f24b8921858b91e9ea3c9eeec6e08cede96181b3bb33f95c6ffd8c77e63986508aa2e8159fa200 + languageName: node + linkType: hard + +"queue-microtask@npm:^1.2.2": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 + languageName: node + linkType: hard + +"readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" + dependencies: + inherits: ^2.0.3 + string_decoder: ^1.1.1 + util-deprecate: ^1.0.1 + checksum: bdcbe6c22e846b6af075e32cf8f4751c2576238c5043169a1c221c92ee2878458a816a4ea33f4c67623c0b6827c8a400409bfb3cf0bf3381392d0b1dfb52ac8d + languageName: node + linkType: hard + +"readdirp@npm:~3.6.0": + version: 3.6.0 + resolution: "readdirp@npm:3.6.0" + dependencies: + picomatch: ^2.2.1 + checksum: 1ced032e6e45670b6d7352d71d21ce7edf7b9b928494dcaba6f11fba63180d9da6cd7061ebc34175ffda6ff529f481818c962952004d273178acd70f7059b320 + languageName: node + linkType: hard + +"reporter@workspace:.": + version: 0.0.0-use.local + resolution: "reporter@workspace:." + dependencies: + "@types/node": ^20.8.6 + "@types/node-cron": ^3.0.9 + "@typescript-eslint/eslint-plugin": ^6.7.5 + "@typescript-eslint/parser": ^6.7.5 + axios: ^1.5.1 + dotenv: ^16.3.1 + eslint: ^8.51.0 + eslint-config-prettier: ^9.0.0 + node-cron: ^3.0.2 + nodemon: ^3.0.1 + prettier: ^3.0.3 + ts-node: ^10.9.1 + typescript: ^5.2.2 + viem: ^1.16.5 + winston: ^3.11.0 + languageName: unknown + linkType: soft + +"resolve-from@npm:^4.0.0": + version: 4.0.0 + resolution: "resolve-from@npm:4.0.0" + checksum: f4ba0b8494846a5066328ad33ef8ac173801a51739eb4d63408c847da9a2e1c1de1e6cbbf72699211f3d13f8fc1325648b169bd15eb7da35688e30a5fb0e4a7f + languageName: node + linkType: hard + +"retry@npm:^0.12.0": + version: 0.12.0 + resolution: "retry@npm:0.12.0" + checksum: 623bd7d2e5119467ba66202d733ec3c2e2e26568074923bc0585b6b99db14f357e79bdedb63cab56cec47491c4a0da7e6021a7465ca6dc4f481d3898fdd3158c + languageName: node + linkType: hard + +"reusify@npm:^1.0.4": + version: 1.0.4 + resolution: "reusify@npm:1.0.4" + checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc + languageName: node + linkType: hard + +"rimraf@npm:^3.0.2": + version: 3.0.2 + resolution: "rimraf@npm:3.0.2" + dependencies: + glob: ^7.1.3 + bin: + rimraf: bin.js + checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 + languageName: node + linkType: hard + +"run-parallel@npm:^1.1.9": + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" + dependencies: + queue-microtask: ^1.2.2 + checksum: cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d + languageName: node + linkType: hard + +"safe-buffer@npm:~5.2.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 + languageName: node + linkType: hard + +"safe-stable-stringify@npm:^2.3.1": + version: 2.4.3 + resolution: "safe-stable-stringify@npm:2.4.3" + checksum: 3aeb64449706ee1f5ad2459fc99648b131d48e7a1fbb608d7c628020177512dc9d94108a5cb61bbc953985d313d0afea6566d243237743e02870490afef04b43 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 + languageName: node + linkType: hard + +"semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4": + version: 7.5.4 + resolution: "semver@npm:7.5.4" + dependencies: + lru-cache: ^6.0.0 + bin: + semver: bin/semver.js + checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 + languageName: node + linkType: hard + +"set-blocking@npm:^2.0.0": + version: 2.0.0 + resolution: "set-blocking@npm:2.0.0" + checksum: 6e65a05f7cf7ebdf8b7c75b101e18c0b7e3dff4940d480efed8aad3a36a4005140b660fa1d804cb8bce911cac290441dc728084a30504d3516ac2ff7ad607b02 + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: ^3.0.0 + checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 + languageName: node + linkType: hard + +"signal-exit@npm:^3.0.7": + version: 3.0.7 + resolution: "signal-exit@npm:3.0.7" + checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 + languageName: node + linkType: hard + +"signal-exit@npm:^4.0.1": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: 64c757b498cb8629ffa5f75485340594d2f8189e9b08700e69199069c8e3070fb3e255f7ab873c05dc0b3cec412aea7402e10a5990cb6a050bd33ba062a6c549 + languageName: node + linkType: hard + +"simple-swizzle@npm:^0.2.2": + version: 0.2.2 + resolution: "simple-swizzle@npm:0.2.2" + dependencies: + is-arrayish: ^0.3.1 + checksum: a7f3f2ab5c76c4472d5c578df892e857323e452d9f392e1b5cf74b74db66e6294a1e1b8b390b519fa1b96b5b613f2a37db6cffef52c3f1f8f3c5ea64eb2d54c0 + languageName: node + linkType: hard + +"simple-update-notifier@npm:^2.0.0": + version: 2.0.0 + resolution: "simple-update-notifier@npm:2.0.0" + dependencies: + semver: ^7.5.3 + checksum: 9ba00d38ce6a29682f64a46213834e4eb01634c2f52c813a9a7b8873ca49cdbb703696f3290f3b27dc067de6d9418b0b84bef22c3eb074acf352529b2d6c27fd + languageName: node + linkType: hard + +"slash@npm:^3.0.0": + version: 3.0.0 + resolution: "slash@npm:3.0.0" + checksum: 94a93fff615f25a999ad4b83c9d5e257a7280c90a32a7cb8b4a87996e4babf322e469c42b7f649fd5796edd8687652f3fb452a86dc97a816f01113183393f11c + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^7.0.0": + version: 7.0.0 + resolution: "socks-proxy-agent@npm:7.0.0" + dependencies: + agent-base: ^6.0.2 + debug: ^4.3.3 + socks: ^2.6.2 + checksum: 720554370154cbc979e2e9ce6a6ec6ced205d02757d8f5d93fe95adae454fc187a5cbfc6b022afab850a5ce9b4c7d73e0f98e381879cf45f66317a4895953846 + languageName: node + linkType: hard + +"socks@npm:^2.6.2": + version: 2.7.1 + resolution: "socks@npm:2.7.1" + dependencies: + ip: ^2.0.0 + smart-buffer: ^4.2.0 + checksum: 259d9e3e8e1c9809a7f5c32238c3d4d2a36b39b83851d0f573bfde5f21c4b1288417ce1af06af1452569cd1eb0841169afd4998f0e04ba04656f6b7f0e46d748 + languageName: node + linkType: hard + +"ssri@npm:^10.0.0": + version: 10.0.5 + resolution: "ssri@npm:10.0.5" + dependencies: + minipass: ^7.0.3 + checksum: 0a31b65f21872dea1ed3f7c200d7bc1c1b91c15e419deca14f282508ba917cbb342c08a6814c7f68ca4ca4116dd1a85da2bbf39227480e50125a1ceffeecb750 + languageName: node + linkType: hard + +"stack-trace@npm:0.0.x": + version: 0.0.10 + resolution: "stack-trace@npm:0.0.10" + checksum: 473036ad32f8c00e889613153d6454f9be0536d430eb2358ca51cad6b95cea08a3cc33cc0e34de66b0dad221582b08ed2e61ef8e13f4087ab690f388362d6610 + languageName: node + linkType: hard + +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.3": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: ^8.0.0 + is-fullwidth-code-point: ^3.0.0 + strip-ansi: ^6.0.1 + checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb + languageName: node + linkType: hard + +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: ^0.2.0 + emoji-regex: ^9.2.2 + strip-ansi: ^7.0.1 + checksum: 7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 + languageName: node + linkType: hard + +"string_decoder@npm:^1.1.1": + version: 1.3.0 + resolution: "string_decoder@npm:1.3.0" + dependencies: + safe-buffer: ~5.2.0 + checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 + languageName: node + linkType: hard + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: ^5.0.1 + checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c + languageName: node + linkType: hard + +"strip-ansi@npm:^7.0.1": + version: 7.1.0 + resolution: "strip-ansi@npm:7.1.0" + dependencies: + ansi-regex: ^6.0.1 + checksum: 859c73fcf27869c22a4e4d8c6acfe690064659e84bef9458aa6d13719d09ca88dcfd40cbf31fd0be63518ea1a643fe070b4827d353e09533a5b0b9fd4553d64d + languageName: node + linkType: hard + +"strip-json-comments@npm:^3.1.1": + version: 3.1.1 + resolution: "strip-json-comments@npm:3.1.1" + checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 + languageName: node + linkType: hard + +"supports-color@npm:^5.5.0": + version: 5.5.0 + resolution: "supports-color@npm:5.5.0" + dependencies: + has-flag: ^3.0.0 + checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac + languageName: node + linkType: hard + +"supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: ^4.0.0 + checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a + languageName: node + linkType: hard + +"tar@npm:^6.1.11, tar@npm:^6.1.2": + version: 6.2.0 + resolution: "tar@npm:6.2.0" + dependencies: + chownr: ^2.0.0 + fs-minipass: ^2.0.0 + minipass: ^5.0.0 + minizlib: ^2.1.1 + mkdirp: ^1.0.3 + yallist: ^4.0.0 + checksum: db4d9fe74a2082c3a5016630092c54c8375ff3b280186938cfd104f2e089c4fd9bad58688ef6be9cf186a889671bf355c7cda38f09bbf60604b281715ca57f5c + languageName: node + linkType: hard + +"text-hex@npm:1.0.x": + version: 1.0.0 + resolution: "text-hex@npm:1.0.0" + checksum: 1138f68adc97bf4381a302a24e2352f04992b7b1316c5003767e9b0d3367ffd0dc73d65001ea02b07cd0ecc2a9d186de0cf02f3c2d880b8a522d4ccb9342244a + languageName: node + linkType: hard + +"text-table@npm:^0.2.0": + version: 0.2.0 + resolution: "text-table@npm:0.2.0" + checksum: b6937a38c80c7f84d9c11dd75e49d5c44f71d95e810a3250bd1f1797fc7117c57698204adf676b71497acc205d769d65c16ae8fa10afad832ae1322630aef10a + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: ^7.0.0 + checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed + languageName: node + linkType: hard + +"touch@npm:^3.1.0": + version: 3.1.0 + resolution: "touch@npm:3.1.0" + dependencies: + nopt: ~1.0.10 + bin: + nodetouch: ./bin/nodetouch.js + checksum: e0be589cb5b0e6dbfce6e7e077d4a0d5f0aba558ef769c6d9c33f635e00d73d5be49da6f8631db302ee073919d82b5b7f56da2987feb28765c95a7673af68647 + languageName: node + linkType: hard + +"triple-beam@npm:^1.3.0": + version: 1.4.1 + resolution: "triple-beam@npm:1.4.1" + checksum: 2e881a3e8e076b6f2b85b9ec9dd4a900d3f5016e6d21183ed98e78f9abcc0149e7d54d79a3f432b23afde46b0885bdcdcbff789f39bc75de796316961ec07f61 + languageName: node + linkType: hard + +"ts-api-utils@npm:^1.0.1": + version: 1.0.3 + resolution: "ts-api-utils@npm:1.0.3" + peerDependencies: + typescript: ">=4.2.0" + checksum: 441cc4489d65fd515ae6b0f4eb8690057add6f3b6a63a36073753547fb6ce0c9ea0e0530220a0b282b0eec535f52c4dfc315d35f8a4c9a91c0def0707a714ca6 + languageName: node + linkType: hard + +"ts-node@npm:^10.9.1": + version: 10.9.1 + resolution: "ts-node@npm:10.9.1" + dependencies: + "@cspotcode/source-map-support": ^0.8.0 + "@tsconfig/node10": ^1.0.7 + "@tsconfig/node12": ^1.0.7 + "@tsconfig/node14": ^1.0.0 + "@tsconfig/node16": ^1.0.2 + acorn: ^8.4.1 + acorn-walk: ^8.1.1 + arg: ^4.1.0 + create-require: ^1.1.0 + diff: ^4.0.1 + make-error: ^1.1.1 + v8-compile-cache-lib: ^3.0.1 + yn: 3.1.1 + peerDependencies: + "@swc/core": ">=1.2.50" + "@swc/wasm": ">=1.2.50" + "@types/node": "*" + typescript: ">=2.7" + peerDependenciesMeta: + "@swc/core": + optional: true + "@swc/wasm": + optional: true + bin: + ts-node: dist/bin.js + ts-node-cwd: dist/bin-cwd.js + ts-node-esm: dist/bin-esm.js + ts-node-script: dist/bin-script.js + ts-node-transpile-only: dist/bin-transpile.js + ts-script: dist/bin-script-deprecated.js + checksum: 090adff1302ab20bd3486e6b4799e90f97726ed39e02b39e566f8ab674fd5bd5f727f43615debbfc580d33c6d9d1c6b1b3ce7d8e3cca3e20530a145ffa232c35 + languageName: node + linkType: hard + +"type-check@npm:^0.4.0, type-check@npm:~0.4.0": + version: 0.4.0 + resolution: "type-check@npm:0.4.0" + dependencies: + prelude-ls: ^1.2.1 + checksum: ec688ebfc9c45d0c30412e41ca9c0cdbd704580eb3a9ccf07b9b576094d7b86a012baebc95681999dd38f4f444afd28504cb3a89f2ef16b31d4ab61a0739025a + languageName: node + linkType: hard + +"type-fest@npm:^0.20.2": + version: 0.20.2 + resolution: "type-fest@npm:0.20.2" + checksum: 4fb3272df21ad1c552486f8a2f8e115c09a521ad7a8db3d56d53718d0c907b62c6e9141ba5f584af3f6830d0872c521357e512381f24f7c44acae583ad517d73 + languageName: node + linkType: hard + +"typescript@npm:^5.2.2": + version: 5.2.2 + resolution: "typescript@npm:5.2.2" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 7912821dac4d962d315c36800fe387cdc0a6298dba7ec171b350b4a6e988b51d7b8f051317786db1094bd7431d526b648aba7da8236607febb26cf5b871d2d3c + languageName: node + linkType: hard + +"typescript@patch:typescript@^5.2.2#~builtin": + version: 5.2.2 + resolution: "typescript@patch:typescript@npm%3A5.2.2#~builtin::version=5.2.2&hash=7ad353" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 07106822b4305de3f22835cbba949a2b35451cad50888759b6818421290ff95d522b38ef7919e70fb381c5fe9c1c643d7dea22c8b31652a717ddbd57b7f4d554 + languageName: node + linkType: hard + +"undefsafe@npm:^2.0.5": + version: 2.0.5 + resolution: "undefsafe@npm:2.0.5" + checksum: f42ab3b5770fedd4ada175fc1b2eb775b78f609156f7c389106aafd231bfc210813ee49f54483d7191d7b76e483bc7f537b5d92d19ded27156baf57592eb02cc + languageName: node + linkType: hard + +"undici-types@npm:~5.25.1": + version: 5.25.3 + resolution: "undici-types@npm:5.25.3" + checksum: ec9d2cc36520cbd9fbe3b3b6c682a87fe5be214699e1f57d1e3d9a2cb5be422e62735f06e0067dc325fd3dd7404c697e4d479f9147dc8a804e049e29f357f2ff + languageName: node + linkType: hard + +"unique-filename@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-filename@npm:3.0.0" + dependencies: + unique-slug: ^4.0.0 + checksum: 8e2f59b356cb2e54aab14ff98a51ac6c45781d15ceaab6d4f1c2228b780193dc70fae4463ce9e1df4479cb9d3304d7c2043a3fb905bdeca71cc7e8ce27e063df + languageName: node + linkType: hard + +"unique-slug@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-slug@npm:4.0.0" + dependencies: + imurmurhash: ^0.1.4 + checksum: 0884b58365af59f89739e6f71e3feacb5b1b41f2df2d842d0757933620e6de08eff347d27e9d499b43c40476cbaf7988638d3acb2ffbcb9d35fd035591adfd15 + languageName: node + linkType: hard + +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: ^2.1.0 + checksum: 7167432de6817fe8e9e0c9684f1d2de2bb688c94388f7569f7dbdb1587c9f4ca2a77962f134ec90be0cc4d004c939ff0d05acc9f34a0db39a3c797dada262633 + languageName: node + linkType: hard + +"util-deprecate@npm:^1.0.1": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 + languageName: node + linkType: hard + +"uuid@npm:8.3.2": + version: 8.3.2 + resolution: "uuid@npm:8.3.2" + bin: + uuid: dist/bin/uuid + checksum: 5575a8a75c13120e2f10e6ddc801b2c7ed7d8f3c8ac22c7ed0c7b2ba6383ec0abda88c905085d630e251719e0777045ae3236f04c812184b7c765f63a70e58df + languageName: node + linkType: hard + +"v8-compile-cache-lib@npm:^3.0.1": + version: 3.0.1 + resolution: "v8-compile-cache-lib@npm:3.0.1" + checksum: 78089ad549e21bcdbfca10c08850022b22024cdcc2da9b168bcf5a73a6ed7bf01a9cebb9eac28e03cd23a684d81e0502797e88f3ccd27a32aeab1cfc44c39da0 + languageName: node + linkType: hard + +"viem@npm:^1.16.5": + version: 1.16.6 + resolution: "viem@npm:1.16.6" + dependencies: + "@adraffy/ens-normalize": 1.9.4 + "@noble/curves": 1.2.0 + "@noble/hashes": 1.3.2 + "@scure/bip32": 1.3.2 + "@scure/bip39": 1.2.1 + abitype: 0.9.8 + isows: 1.0.3 + ws: 8.13.0 + peerDependencies: + typescript: ">=5.0.4" + peerDependenciesMeta: + typescript: + optional: true + checksum: 2f116cad184cfc7a9584073451549edfb23c3847b1784f092b80a279b848fe011a054bc4141c923b5bcce1d8493db98284db65416ce72e8ba522225d02786a9a + languageName: node + linkType: hard + +"which@npm:^2.0.1, which@npm:^2.0.2": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: ^2.0.0 + bin: + node-which: ./bin/node-which + checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 + languageName: node + linkType: hard + +"wide-align@npm:^1.1.5": + version: 1.1.5 + resolution: "wide-align@npm:1.1.5" + dependencies: + string-width: ^1.0.2 || 2 || 3 || 4 + checksum: d5fc37cd561f9daee3c80e03b92ed3e84d80dde3365a8767263d03dacfc8fa06b065ffe1df00d8c2a09f731482fcacae745abfbb478d4af36d0a891fad4834d3 + languageName: node + linkType: hard + +"winston-transport@npm:^4.5.0": + version: 4.6.0 + resolution: "winston-transport@npm:4.6.0" + dependencies: + logform: ^2.3.2 + readable-stream: ^3.6.0 + triple-beam: ^1.3.0 + checksum: 19f06ebdbb57cb14cdd48a23145d418d3bbe538851053303f84f04a8a849bb530b78b1495a175059c1299f92945dc61d5421c4914fee32d9a41bc397d84f26d7 + languageName: node + linkType: hard + +"winston@npm:^3.11.0": + version: 3.11.0 + resolution: "winston@npm:3.11.0" + dependencies: + "@colors/colors": ^1.6.0 + "@dabh/diagnostics": ^2.0.2 + async: ^3.2.3 + is-stream: ^2.0.0 + logform: ^2.4.0 + one-time: ^1.0.0 + readable-stream: ^3.4.0 + safe-stable-stringify: ^2.3.1 + stack-trace: 0.0.x + triple-beam: ^1.3.0 + winston-transport: ^4.5.0 + checksum: ca4454070f7a71b19f53c8c1765c59a013dab220edb49161b2e81917751d3e9edc3382430e4fb050feda04fb8463290ecab7cbc9240ec8d3d3b32a121849bbb0 + languageName: node + linkType: hard + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: ^4.0.0 + string-width: ^4.1.0 + strip-ansi: ^6.0.0 + checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: ^6.1.0 + string-width: ^5.0.1 + strip-ansi: ^7.0.1 + checksum: 371733296dc2d616900ce15a0049dca0ef67597d6394c57347ba334393599e800bab03c41d4d45221b6bc967b8c453ec3ae4749eff3894202d16800fdfe0e238 + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 + languageName: node + linkType: hard + +"ws@npm:8.13.0": + version: 8.13.0 + resolution: "ws@npm:8.13.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 53e991bbf928faf5dc6efac9b8eb9ab6497c69feeb94f963d648b7a3530a720b19ec2e0ec037344257e05a4f35bd9ad04d9de6f289615ffb133282031b18c61c + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 + languageName: node + linkType: hard + +"yn@npm:3.1.1": + version: 3.1.1 + resolution: "yn@npm:3.1.1" + checksum: 2c487b0e149e746ef48cda9f8bad10fc83693cd69d7f9dcd8be4214e985de33a29c9e24f3c0d6bcf2288427040a8947406ab27f7af67ee9456e6b84854f02dd6 + languageName: node + linkType: hard + +"yocto-queue@npm:^0.1.0": + version: 0.1.0 + resolution: "yocto-queue@npm:0.1.0" + checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 + languageName: node + linkType: hard From 55d965e7acd33a30b43393eccc0b90e02b8b354c Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Sat, 21 Oct 2023 15:54:28 +0800 Subject: [PATCH 005/297] WIP: add Multiclient class --- packages/reporter/.env.example | 7 ++-- packages/reporter/src/BlockListener.ts | 21 +++++----- packages/reporter/src/MultiClient.ts | 39 +++++++++++++++++++ .../reporter/src/controller/AMBController.ts | 36 +++++++++-------- .../src/controller/SygmaController.ts | 31 ++++++++------- .../src/controller/TelepathyController.ts | 36 +++++++++-------- packages/reporter/src/index.ts | 39 ++++++++++++------- 7 files changed, 139 insertions(+), 70 deletions(-) create mode 100644 packages/reporter/src/MultiClient.ts diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index d277c856..d468c52e 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -1,17 +1,18 @@ PRIVATE_KEY= -SOURCE_RPC_URL= -DEST_RPC_URL=https://rpc.gnosischain.com +GOERLI_RPC_URL= +GNOSIS_RPC_URL= SOURCE_CHAIN=goerli DEST_CHAIN=gnosis AMB_CONTROLLER=false +GAS=30000 SYGMA_CONTROLLER=false SYGMA_FEE_DATA=0x -TELEPATHY_CONTROLLER=true +TELEPATHY_CONTROLLER=false TELEPATHY_PROOF_API_URL=https://api.telepathy.xyz/api/hashi/ GOERLI_BLOCKTIME=12 diff --git a/packages/reporter/src/BlockListener.ts b/packages/reporter/src/BlockListener.ts index ff1a7ef5..1ee4545b 100644 --- a/packages/reporter/src/BlockListener.ts +++ b/packages/reporter/src/BlockListener.ts @@ -1,17 +1,20 @@ -import { createPublicClient, http, createWalletClient, PublicClient, Chain } from "viem" +import { createPublicClient, http, createWalletClient, PublicClient, Chain, publicActions } from "viem" import { mainnet, goerli, gnosis } from "viem/chains" +import Multiclient from "./MultiClient" import winston from "winston" class BlocksListener { controllers: any[] logger: winston.Logger timeFetchBlocksMs: number lastProcessedBlock: bigint = 0n + multiclient: Multiclient _interval: ReturnType | undefined // NodeJs.Timeout - constructor(controllers: any[], timeFetchBlocksMs: number, logger: winston.Logger) { + constructor(controllers: any[], timeFetchBlocksMs: number, logger: winston.Logger, multiclient: Multiclient) { this.controllers = controllers this.timeFetchBlocksMs = timeFetchBlocksMs this.logger = logger + this.multiclient = multiclient } start() { @@ -29,15 +32,14 @@ class BlocksListener { async _fetchBlocks() { try { this.logger.info("Start to fetch blocks") - const publicClient = createPublicClient({ - chain: - process.env.SOURCE_CHAIN === "goerli" ? goerli : process.env.SOURCE_CHAIN === "mainnet" ? mainnet : undefined, - transport: http(process.env.SOURCE_RPC_URL), - }) - const currentBlockNumber = await publicClient.getBlockNumber() + + const client = this.multiclient + .getClientByChain(process.env.SOURCE_CHAIN === "goerli" ? goerli : mainnet) + .extend(publicActions) + const currentBlockNumber = await client.getBlockNumber() this.logger.info(`Current Block Number: ${currentBlockNumber} , on source chain: ${process.env.SOURCE_CHAIN}`) if (this.lastProcessedBlock !== currentBlockNumber) { - this.lastProcessedBlock = await publicClient.getBlockNumber() + this.lastProcessedBlock = await client.getBlockNumber() const queryBlockLength = 100n // the number of blocks to query const blockBuffer = 10n // put 10 blocks before the current block in case the node provider don't sync up at the head @@ -46,6 +48,7 @@ class BlocksListener { const blocks = await Promise.all( Array.from({ length: Number(queryBlockLength + 1n) }, (value, index) => startBlock + BigInt(index)), ) + console.log("blocks ", blocks) this.logger.info(`Fetching block from ${startBlock} to ${endBlock}`) await Promise.all(this.controllers.map((_controller: any) => _controller.onBlocks(blocks))) diff --git a/packages/reporter/src/MultiClient.ts b/packages/reporter/src/MultiClient.ts new file mode 100644 index 00000000..79669af1 --- /dev/null +++ b/packages/reporter/src/MultiClient.ts @@ -0,0 +1,39 @@ +import { createWalletClient, http, Chain, Client } from "viem" +import { privateKeyToAccount } from "viem/accounts" + +type ContructorConfigs = { + chains: Chain[] + privateKey: `0x${string}` + rpcUrls: { [chainName: string]: string } +} + +type GetClientsConfigs = { + chain?: Chain | undefined + privateKey: `0x${string}` + rpcUrl: string +} + +const getClient = ({ chain, privateKey, rpcUrl }: GetClientsConfigs) => + createWalletClient({ + account: privateKeyToAccount(privateKey), + chain: chain as Chain | undefined, + transport: http(rpcUrl), + }) + +class Multiclient { + private _clients: { [chainName: string]: Client } + + constructor({ chains, privateKey, rpcUrls }: ContructorConfigs) { + this._clients = chains.reduce((_acc: { [chainName: string]: any }, _chain: Chain) => { + const rpcUrl = rpcUrls[_chain.name] + _acc[_chain.name] = getClient({ chain: _chain, privateKey, rpcUrl }) + return _acc + }, {}) + } + + getClientByChain(_chain: Chain) { + return this._clients[_chain.name] + } +} + +export default Multiclient diff --git a/packages/reporter/src/controller/AMBController.ts b/packages/reporter/src/controller/AMBController.ts index b666f66a..522e5d2f 100644 --- a/packages/reporter/src/controller/AMBController.ts +++ b/packages/reporter/src/controller/AMBController.ts @@ -1,40 +1,44 @@ -var cron = require("node-cron") -import { createPublicClient, http, createWalletClient, PublicClient, Chain } from "viem" +import { publicActions, walletActions } from "viem" import { mainnet, goerli, gnosis } from "viem/chains" import { privateKeyToAccount } from "viem/accounts" import "dotenv/config" import contract_address from "../utils/address.json" import contractABI from "../ABIs/ambReporterContractABI.json" import winston from "winston" +import Multiclient from "../MultiClient" class AMBController { sourceChain: string destinationChain: string isEnabled: boolean = false logger: winston.Logger - constructor(sourceChain: string, destinationChain: string, isEnabled: boolean, logger: winston.Logger) { + multiClient: Multiclient + constructor( + sourceChain: string, + destinationChain: string, + isEnabled: boolean, + logger: winston.Logger, + multiClient: Multiclient, + ) { this.sourceChain = sourceChain this.destinationChain = destinationChain this.isEnabled = isEnabled this.logger = logger + this.multiClient = multiClient } - async onBlocks(blockNumbers: string[]) { + + async onBlocks(blockNumbers: bigint[]) { try { this.logger.info("AMB: Starting AMB Reporter") - const walletClient = createWalletClient({ - chain: this.sourceChain === "goerli" ? goerli : this.sourceChain === "mainnet" ? mainnet : undefined, - transport: http(process.env.SOURCE_RPC_URL), - }) - const publicClient = createPublicClient({ - chain: this.sourceChain === "goerli" ? goerli : this.sourceChain === "mainnet" ? mainnet : undefined, - transport: http(process.env.SOURCE_RPC_URL), - }) - const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`) + const client = this.multiClient + .getClientByChain(this.sourceChain === "goerli" ? goerli : mainnet) + .extend(walletActions) + .extend(publicActions) const reporterAddr = this.getSourceReporterAddr() const adapterAddr = this.getDestAdapter() - - const { result, request } = await publicClient.simulateContract({ + const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`) + const { result, request } = await client.simulateContract({ account, // calling from account address: reporterAddr as `0x${string}`, abi: contractABI, @@ -42,7 +46,7 @@ class AMBController { args: [blockNumbers, adapterAddr, process.env.GAS], }) - const txhash = await walletClient.writeContract(request) + const txhash = await client.writeContract(request) this.logger.info(`AMB: TxHash from AMB Controller: ${txhash}`) } catch (error) { this.logger.error(`AMB: Error from AMB Controller: ${error}`) diff --git a/packages/reporter/src/controller/SygmaController.ts b/packages/reporter/src/controller/SygmaController.ts index 7ed3ca10..b88c224c 100644 --- a/packages/reporter/src/controller/SygmaController.ts +++ b/packages/reporter/src/controller/SygmaController.ts @@ -1,42 +1,47 @@ -var cron = require("node-cron") -import { createPublicClient, http, createWalletClient, parseEther } from "viem" +import { parseEther, walletActions, publicActions } from "viem" import { mainnet, goerli, gnosis } from "viem/chains" import { privateKeyToAccount } from "viem/accounts" import "dotenv/config" import contract_address from "../utils/address.json" import contractABI from "../ABIs/SygmaReporterContractABI.json" import winston from "winston" +import Multiclient from "../MultiClient" class SygmaController { sourceChain: string destinationChain: string isEnabled: boolean = false logger: winston.Logger - constructor(sourceChain: string, destinationChain: string, isEnabled: boolean, logger: winston.Logger) { + multiClient: Multiclient + constructor( + sourceChain: string, + destinationChain: string, + isEnabled: boolean, + logger: winston.Logger, + multiClient: Multiclient, + ) { this.sourceChain = sourceChain this.destinationChain = destinationChain this.isEnabled = isEnabled this.logger = logger + this.multiClient = multiClient } async onBlocks(blockNumbers: string[]) { try { this.logger.info("Sygma: Starting Sygma Reporter") - const walletClient = createWalletClient({ - chain: this.sourceChain === "goerli" ? goerli : this.sourceChain === "mainnet" ? mainnet : undefined, - transport: http(process.env.SOURCE_RPC_URL), - }) - const publicClient = createPublicClient({ - chain: this.sourceChain === "goerli" ? goerli : this.sourceChain === "mainnet" ? mainnet : undefined, - transport: http(process.env.SOURCE_RPC_URL), - }) + const client = this.multiClient + .getClientByChain(this.sourceChain === "goerli" ? goerli : mainnet) + .extend(walletActions) + .extend(publicActions) + const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`) const reporterAddr = this.getSourceReporterAddr() const adapterAddr = this.getDestAdapter() const destDomainId = this.getDomainID() - const { result, request } = await publicClient.simulateContract({ + const { result, request } = await client.simulateContract({ account, // calling from account address: reporterAddr as `0x${string}`, abi: contractABI, @@ -44,7 +49,7 @@ class SygmaController { args: [blockNumbers, adapterAddr, destDomainId, "0x"], value: parseEther("0.0001"), }) - const txhash = await walletClient.writeContract(request) + const txhash = await client.writeContract(request) this.logger.info(`Sygma: TxHash from Sygma Controller: ${txhash}`) } catch (error) { this.logger.error(`Sygma: Error from Sygma Controller: ${error}`) diff --git a/packages/reporter/src/controller/TelepathyController.ts b/packages/reporter/src/controller/TelepathyController.ts index 9ca87cb2..80379f78 100644 --- a/packages/reporter/src/controller/TelepathyController.ts +++ b/packages/reporter/src/controller/TelepathyController.ts @@ -1,43 +1,47 @@ import axios from "axios" -import { createPublicClient, http, createWalletClient, hexToNumber } from "viem" -import { gnosis } from "viem/chains" +import { hexToNumber, publicActions, walletActions } from "viem" +import { gnosis, mainnet } from "viem/chains" import { privateKeyToAccount } from "viem/accounts" import "dotenv/config" import contract_address from "../utils/address.json" import lightClientContractABI from "../ABIs/telepathyContractABI.json" import adapterContractABI from "../ABIs/telepathyAdapterABI.json" import winston from "winston" +import Multiclient from "../MultiClient" class TelepathyController { sourceChain: string destinationChain: string isEnabled: boolean = false logger: winston.Logger - constructor(sourceChain: string, destinationChain: string, isEnabled: boolean, logger: winston.Logger) { + multiClient: Multiclient + constructor( + sourceChain: string, + destinationChain: string, + isEnabled: boolean, + logger: winston.Logger, + multiClient: Multiclient, + ) { this.sourceChain = sourceChain this.destinationChain = destinationChain this.isEnabled = isEnabled this.logger = logger + this.multiClient = multiClient } - async onBlocks(blockNumbers: string[]) { try { // Telepathy on support light client on Gnosis at the moment - const walletClient = createWalletClient({ - chain: gnosis, - transport: http(process.env.DEST_RPC_URL), - }) - const publicClient = createPublicClient({ - chain: gnosis, - transport: http(process.env.DEST_RPC_URL), - }) + const client = this.multiClient + .getClientByChain(this.destinationChain === "gnosis" ? gnosis : mainnet) + .extend(publicActions) + .extend(walletActions) const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`) const adapterAddr = contract_address.telepathy.gnosis_adapter const lightClientAddr = contract_address.telepathy.gnosis_light_client // Getting the latest block number from provider - const currentBlockNumber = await publicClient.getBlockNumber() + const currentBlockNumber = await client.getBlockNumber() // get contract events from latest block -500 : latest block const queryBlockLength = 1000n // the number of blocks to query @@ -45,7 +49,7 @@ class TelepathyController { const startBlock = currentBlockNumber - queryBlockLength - blockBuffer const endBlock = currentBlockNumber - blockBuffer this.logger.info(`Telepathy: Getting Contract Event from block ${startBlock} to block ${currentBlockNumber}`) - const logs = await publicClient.getContractEvents({ + const logs = await client.getContractEvents({ address: lightClientAddr as `0x${string}`, abi: lightClientContractABI, eventName: "HeadUpdate", @@ -67,7 +71,7 @@ class TelepathyController { this.logger.info(`Telepathy: Response from telepathy proof provider: ${response.data}`) const { chainId, slot, blockNumber, blockNumberProof, blockHash, blockHashProof } = response.data.result this.logger.info(`Telepathy: Calling storeBlockHeader for block number ${blockNumber}`) - const { request, result } = await publicClient.simulateContract({ + const { request, result } = await client.simulateContract({ account, address: adapterAddr as `0x${string}`, abi: adapterContractABI, @@ -75,7 +79,7 @@ class TelepathyController { args: [chainId, slot, blockNumber, blockNumberProof, blockHash, blockHashProof], }) - const txHash = await walletClient.writeContract(request) + const txHash = await client.writeContract(request) this.logger.info(`Telepathy: TxHash from Telepathy Controller: ${txHash} `) }) } catch (error) { diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 42d19f9b..8325968b 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -1,32 +1,45 @@ -// import logger from "winston" -import { createPublicClient, http, createWalletClient, PublicClient, Chain } from "viem" +import { gnosis, goerli, mainnet } from "viem/chains" +import Multiclient from "./MultiClient" import AMBController from "./controller/AMBController" import SygmaController from "./controller/SygmaController" import TelepathyController from "./controller/TelepathyController" import BlocksListener from "./BlockListener" import "dotenv/config" import winston from "winston" + function main() { + const goerliRPC = process.env.GOERLI_RPC_URL as string + const gnosisRPC = process.env.GNOSIS_RPC_URL as string + const sourceChain = process.env.SOURCE_CHAIN + const destChain = process.env.DEST_CHAIN + const privKey = process.env.PRIVATE_KEY as `0x${string}` + const isAMBEnabled = process.env.AMB_CONTROLLER === "true" + const isSygmaEnabled = process.env.SYGMA_CONTROLLER === "true" + const isTelepathyEnabled = process.env.TELEPATHY_CONTROLLER === "true" + const logger = winston.createLogger({ level: "info", format: winston.format.json(), transports: [new winston.transports.Console()], }) - const sourceChain = process.env.SOURCE_CHAIN - const destChain = process.env.DEST_CHAIN - const ambController = new AMBController(sourceChain!, destChain!, process.env.AMB_CONTROLLER === "true", logger) - const sygmaController = new SygmaController(sourceChain!, destChain!, process.env.SYGMA_CONTROLLER === "true", logger) - const telepathyController = new TelepathyController( - sourceChain!, - destChain!, - process.env.TELEPATHY_CONTROLLER === "true", - logger, - ) + const multiClient = new Multiclient({ + chains: [goerli, gnosis], + privateKey: privKey, + rpcUrls: { + goerli: goerliRPC, + gnosis: gnosisRPC, + }, + }) + + const ambController = new AMBController(sourceChain!, destChain!, isAMBEnabled, logger, multiClient) + const sygmaController = new SygmaController(sourceChain!, destChain!, isSygmaEnabled, logger, multiClient) + const telepathyController = new TelepathyController(sourceChain!, destChain!, isTelepathyEnabled, logger, multiClient) const blocksListener = new BlocksListener( [ambController, sygmaController, telepathyController].filter((controller) => controller.isEnabled == true), - 10 * 1000, + 5 * 60 * 1000, // every 5 minutes logger, + multiClient, ) blocksListener.start() } From 8e3656ebbeb3a0689f689db38e87e9361b654703 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Sun, 22 Oct 2023 11:13:44 +0800 Subject: [PATCH 006/297] feat: controller logic --- packages/reporter/src/BlockListener.ts | 18 +++++++++++------- packages/reporter/src/index.ts | 3 ++- packages/reporter/src/utils/address.json | 14 -------------- 3 files changed, 13 insertions(+), 22 deletions(-) diff --git a/packages/reporter/src/BlockListener.ts b/packages/reporter/src/BlockListener.ts index 1ee4545b..85299909 100644 --- a/packages/reporter/src/BlockListener.ts +++ b/packages/reporter/src/BlockListener.ts @@ -1,7 +1,7 @@ -import { createPublicClient, http, createWalletClient, PublicClient, Chain, publicActions } from "viem" +import { publicActions } from "viem" import { mainnet, goerli, gnosis } from "viem/chains" import Multiclient from "./MultiClient" -import winston from "winston" +import winston, { query } from "winston" class BlocksListener { controllers: any[] logger: winston.Logger @@ -41,14 +41,19 @@ class BlocksListener { if (this.lastProcessedBlock !== currentBlockNumber) { this.lastProcessedBlock = await client.getBlockNumber() - const queryBlockLength = 100n // the number of blocks to query + const queryBlockLength = 100n // the number of blocks to query, make sure it is less than 256 const blockBuffer = 10n // put 10 blocks before the current block in case the node provider don't sync up at the head - const startBlock = this.lastProcessedBlock - queryBlockLength - blockBuffer + if (queryBlockLength > 256n - blockBuffer) { + this.logger.error("Please choose a block length less than 256-buffer!") + } + const startBlock = this.lastProcessedBlock - queryBlockLength const endBlock = this.lastProcessedBlock - blockBuffer const blocks = await Promise.all( - Array.from({ length: Number(queryBlockLength + 1n) }, (value, index) => startBlock + BigInt(index)), + Array.from( + { length: Number(queryBlockLength - blockBuffer + 1n) }, + (value, index) => startBlock + BigInt(index), + ), ) - console.log("blocks ", blocks) this.logger.info(`Fetching block from ${startBlock} to ${endBlock}`) await Promise.all(this.controllers.map((_controller: any) => _controller.onBlocks(blocks))) @@ -60,7 +65,6 @@ class BlocksListener { // delay for 1000ms await new Promise((func) => setTimeout(func, 1000)) } catch (_err) { - // logger.error(_err) this.logger.error(`error from block listener ${_err}`) } } diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 8325968b..9072278d 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -16,6 +16,7 @@ function main() { const isAMBEnabled = process.env.AMB_CONTROLLER === "true" const isSygmaEnabled = process.env.SYGMA_CONTROLLER === "true" const isTelepathyEnabled = process.env.TELEPATHY_CONTROLLER === "true" + const timeFetchBlocksMs = 5 * 60 * 1000 const logger = winston.createLogger({ level: "info", @@ -37,7 +38,7 @@ function main() { const blocksListener = new BlocksListener( [ambController, sygmaController, telepathyController].filter((controller) => controller.isEnabled == true), - 5 * 60 * 1000, // every 5 minutes + timeFetchBlocksMs, // every 5 minutes logger, multiClient, ) diff --git a/packages/reporter/src/utils/address.json b/packages/reporter/src/utils/address.json index 1d1a9351..e9e16166 100644 --- a/packages/reporter/src/utils/address.json +++ b/packages/reporter/src/utils/address.json @@ -1,18 +1,4 @@ { - "ethereum": { - "ambReporter": "", - "sygmaReporter": "" - }, - "goerli": { - "ambReporter": "0xedc0b1d3de4496e0d917af42f29cb71eb2982319", - "sygmaReporter": "0x2f96d347c932ac73b56e9352ecc0707e25173d88" - }, - "gnosis": { - "ambAdapter": "0x01268DB05965CeAc2a89566c42CD550ED7eE5ECD", - "sygmaAdapter": "0x9AD7a6f4FDA8247cC0bF5932B68c5b619937dB15", - "telepathyAdapter": "0x2f1E51a2763FB67fe09971Fd8d849716137A3357", - "telepathyLightClient": "0x34b5378DE786389a477b40dD710812c250185f83" - }, "amb": { "goerli_reporter": "0xedc0b1d3de4496e0d917af42f29cb71eb2982319", "ethereum_reporter": "", From 6f2f1e8c694b1cbdd73fa98e4f0a762a97e11ab3 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Sun, 22 Oct 2023 11:18:50 +0800 Subject: [PATCH 007/297] doc: update README.md --- packages/reporter/.env.example | 6 ------ packages/reporter/README.md | 16 +++++++++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index d468c52e..cd3b3ab9 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -15,9 +15,3 @@ SYGMA_FEE_DATA=0x TELEPATHY_CONTROLLER=false TELEPATHY_PROOF_API_URL=https://api.telepathy.xyz/api/hashi/ -GOERLI_BLOCKTIME=12 -ETHEREUM_BLOCKTIME=16 -GNOSIS_BLOCKTINE=5 -CHIADO_BLOCKTIME=5 - - diff --git a/packages/reporter/README.md b/packages/reporter/README.md index 4a378556..56b7d603 100644 --- a/packages/reporter/README.md +++ b/packages/reporter/README.md @@ -13,8 +13,14 @@ Script to call Header Reporter contracts of different oracle from source chain t Configure the mode you want to run by editing the variable in `.env` -1. `REPORTER` (true/false): to enable the reporter -2. `FREQUENCY` (cron job expression by default, seconds for telepathy reporterr): Define the frequency to run the - reporter script -3. `SOURCE_CHAIN` (string value of chain): Define the source chain to collect the block header from. `DEST_CHAIN` - (string value of chain): Define the destination chain to report the source chain's block header to. +1. `_CONTROLLER` (true/false): to enable the controller +2. `SOURCE_CHAIN` (string value of chain): Define the source chain to collect the block header from. +3. `DEST_CHAIN` (string value of chain): Define the destination chain to report the source chain's block header to. + +## Adding a new controller + +1. Add a new file under `/controller`, create the constructor and `onBlocks` function to call block header reporter + contract periodically. +2. Add the contract addresses under `utils/address.json`. +3. Add the new controller instant in `index.ts`. +4. Add the env variable in `.env.example`. From f802b1cd57853c60dad54c14f477b8756de35190 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Mon, 23 Oct 2023 19:20:49 +0800 Subject: [PATCH 008/297] fix: first review --- packages/reporter/nodemon.json | 10 +- packages/reporter/package-lock.json | 482 +- packages/reporter/package.json | 1 - .../src/ABIs/AMBReporterContractABI.json | 98 + packages/reporter/src/ABIs/PingPongABI.json | 41 - .../src/ABIs/SygmaReporterContractABI.json | 432 +- .../src/ABIs/TelepathyAdapterABI.json | 229 + .../src/ABIs/TelepathyContractABI.json | 497 +++ .../src/ABIs/WormholeReporterContractABI.json | 76 + .../src/ABIs/ambReporterContractABI.json | 98 - .../src/ABIs/telepathyAdapterABI.json | 229 - .../src/ABIs/telepathyContractABI.json | 497 --- .../src/ABIs/wormholeReporterContractABI.json | 76 - packages/reporter/src/BlockListener.ts | 69 +- packages/reporter/src/MultiClient.ts | 6 +- .../reporter/src/controller/AMBController.ts | 75 - .../src/controller/SygmaController.ts | 86 - .../src/controller/TelepathyController.ts | 91 - .../src/controllers/AMBReporterController.ts | 54 + .../controllers/SygmaReporterController.ts | 64 + .../TelepathyReporterController.ts | 90 + packages/reporter/src/index.ts | 57 +- packages/reporter/src/newIndex.ts | 34 - packages/reporter/src/utils/settings.json | 15 + packages/reporter/src/utils/type.ts | 25 + packages/reporter/tsconfig.json | 48 +- packages/reporter/yarn.lock | 3893 +++++------------ 27 files changed, 3000 insertions(+), 4373 deletions(-) create mode 100644 packages/reporter/src/ABIs/AMBReporterContractABI.json delete mode 100644 packages/reporter/src/ABIs/PingPongABI.json create mode 100644 packages/reporter/src/ABIs/TelepathyAdapterABI.json create mode 100644 packages/reporter/src/ABIs/TelepathyContractABI.json create mode 100644 packages/reporter/src/ABIs/WormholeReporterContractABI.json delete mode 100644 packages/reporter/src/ABIs/ambReporterContractABI.json delete mode 100644 packages/reporter/src/ABIs/telepathyAdapterABI.json delete mode 100644 packages/reporter/src/ABIs/telepathyContractABI.json delete mode 100644 packages/reporter/src/ABIs/wormholeReporterContractABI.json delete mode 100644 packages/reporter/src/controller/AMBController.ts delete mode 100644 packages/reporter/src/controller/SygmaController.ts delete mode 100644 packages/reporter/src/controller/TelepathyController.ts create mode 100644 packages/reporter/src/controllers/AMBReporterController.ts create mode 100644 packages/reporter/src/controllers/SygmaReporterController.ts create mode 100644 packages/reporter/src/controllers/TelepathyReporterController.ts delete mode 100644 packages/reporter/src/newIndex.ts create mode 100644 packages/reporter/src/utils/settings.json create mode 100644 packages/reporter/src/utils/type.ts diff --git a/packages/reporter/nodemon.json b/packages/reporter/nodemon.json index 84ddf673..58b690d4 100644 --- a/packages/reporter/nodemon.json +++ b/packages/reporter/nodemon.json @@ -1,6 +1,6 @@ { - "watch": ["src"], - "ext": "ts,json", - "ignore": ["src/**/*.spec.ts"], - "exec": "ts-node ./src/index.ts" - } \ No newline at end of file + "watch": ["src"], + "ext": "ts,json", + "ignore": ["src/**/*.spec.ts"], + "exec": "ts-node ./src/index.ts" +} diff --git a/packages/reporter/package-lock.json b/packages/reporter/package-lock.json index cd53e159..af58acd8 100644 --- a/packages/reporter/package-lock.json +++ b/packages/reporter/package-lock.json @@ -8,8 +8,8 @@ "dependencies": { "axios": "^1.5.1", "dotenv": "^16.3.1", - "node-cron": "^3.0.2", - "viem": "^1.16.5" + "viem": "^1.16.5", + "winston": "^3.11.0" }, "devDependencies": { "@types/node": "^20.8.6", @@ -36,6 +36,14 @@ "version": "1.9.4", "license": "MIT" }, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "dev": true, @@ -47,6 +55,16 @@ "node": ">=12" } }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "dev": true, @@ -278,6 +296,11 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/triple-beam": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.4.tgz", + "integrity": "sha512-HlJjF3wxV4R2VQkFpKe0YqJLilYNgtRtsqqZtby7RkVsSs+i+vbyzjtUwpFEdUCKcrGzCiEJE7F/0mKjh0sunA==" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "6.7.5", "dev": true, @@ -580,6 +603,11 @@ "node": ">=8" } }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, "node_modules/asynckit": { "version": "0.4.0", "license": "MIT" @@ -686,6 +714,15 @@ "fsevents": "~2.3.2" } }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "dev": true, @@ -699,9 +736,39 @@ }, "node_modules/color-name": { "version": "1.1.4", - "dev": true, "license": "MIT" }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "dependencies": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "license": "MIT", @@ -803,6 +870,11 @@ "url": "https://github.com/motdotla/dotenv?sponsor=1" } }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "dev": true, @@ -1007,6 +1079,11 @@ "reusify": "^1.0.4" } }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, "node_modules/file-entry-cache": { "version": "6.0.1", "dev": true, @@ -1062,6 +1139,11 @@ "dev": true, "license": "ISC" }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, "node_modules/follow-redirects": { "version": "1.15.3", "funding": [ @@ -1220,9 +1302,13 @@ }, "node_modules/inherits": { "version": "2.0.4", - "dev": true, "license": "ISC" }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, "node_modules/is-binary-path": { "version": "2.1.0", "dev": true, @@ -1269,6 +1355,17 @@ "node": ">=8" } }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/isexe": { "version": "2.0.0", "dev": true, @@ -1321,6 +1418,11 @@ "json-buffer": "3.0.1" } }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, "node_modules/levn": { "version": "0.4.1", "dev": true, @@ -1352,6 +1454,22 @@ "dev": true, "license": "MIT" }, + "node_modules/logform": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", + "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/lru-cache": { "version": "6.0.0", "dev": true, @@ -1418,7 +1536,6 @@ }, "node_modules/ms": { "version": "2.1.2", - "dev": true, "license": "MIT" }, "node_modules/natural-compare": { @@ -1426,16 +1543,6 @@ "dev": true, "license": "MIT" }, - "node_modules/node-cron": { - "version": "3.0.2", - "license": "ISC", - "dependencies": { - "uuid": "8.3.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/nodemon": { "version": "3.0.1", "dev": true, @@ -1503,6 +1610,14 @@ "wrappy": "1" } }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "dependencies": { + "fn.name": "1.x.x" + } + }, "node_modules/optionator": { "version": "0.9.3", "dev": true, @@ -1659,6 +1774,19 @@ ], "license": "MIT" }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/readdirp": { "version": "3.6.0", "dev": true, @@ -1723,6 +1851,33 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } + }, "node_modules/semver": { "version": "7.5.4", "dev": true, @@ -1756,6 +1911,14 @@ "node": ">=8" } }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, "node_modules/simple-update-notifier": { "version": "2.0.0", "dev": true, @@ -1775,6 +1938,22 @@ "node": ">=8" } }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "engines": { + "node": "*" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "dev": true, @@ -1816,6 +1995,11 @@ "node": ">=4" } }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, "node_modules/text-table": { "version": "0.2.0", "dev": true, @@ -1843,6 +2027,14 @@ "nodetouch": "bin/nodetouch.js" } }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/ts-api-utils": { "version": "1.0.3", "dev": true, @@ -1949,12 +2141,10 @@ "punycode": "^2.1.0" } }, - "node_modules/uuid": { - "version": "8.3.2", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", @@ -2003,6 +2193,40 @@ "node": ">= 8" } }, + "node_modules/winston": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.11.0.tgz", + "integrity": "sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g==", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.4.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.5.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.6.0.tgz", + "integrity": "sha512-wbBA9PbPAHxKiygo7ub7BYRiKxms0tpfU2ljtWzb3SjRjv5yl6Ozuy/TkXf00HTAt+Uylo3gSkNwzc4ME0wiIg==", + "dependencies": { + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/wrappy": { "version": "1.0.2", "dev": true, @@ -2060,6 +2284,11 @@ "@adraffy/ens-normalize": { "version": "1.9.4" }, + "@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==" + }, "@cspotcode/source-map-support": { "version": "0.8.1", "dev": true, @@ -2067,6 +2296,16 @@ "@jridgewell/trace-mapping": "0.3.9" } }, + "@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "requires": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, "@eslint-community/eslint-utils": { "version": "4.4.0", "dev": true, @@ -2216,6 +2455,11 @@ "version": "7.5.3", "dev": true }, + "@types/triple-beam": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.4.tgz", + "integrity": "sha512-HlJjF3wxV4R2VQkFpKe0YqJLilYNgtRtsqqZtby7RkVsSs+i+vbyzjtUwpFEdUCKcrGzCiEJE7F/0mKjh0sunA==" + }, "@typescript-eslint/eslint-plugin": { "version": "6.7.5", "dev": true, @@ -2362,6 +2606,11 @@ "version": "2.1.0", "dev": true }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, "asynckit": { "version": "0.4.0" }, @@ -2431,6 +2680,30 @@ "readdirp": "~3.6.0" } }, + "color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "requires": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + }, + "dependencies": { + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + } + } + }, "color-convert": { "version": "2.0.1", "dev": true, @@ -2439,8 +2712,25 @@ } }, "color-name": { + "version": "1.1.4" + }, + "color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colorspace": { "version": "1.1.4", - "dev": true + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "requires": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } }, "combined-stream": { "version": "1.0.8", @@ -2500,6 +2790,11 @@ "dotenv": { "version": "16.3.1" }, + "enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, "escape-string-regexp": { "version": "4.0.0", "dev": true @@ -2634,6 +2929,11 @@ "reusify": "^1.0.4" } }, + "fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, "file-entry-cache": { "version": "6.0.1", "dev": true, @@ -2669,6 +2969,11 @@ "version": "3.2.9", "dev": true }, + "fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, "follow-redirects": { "version": "1.15.3" }, @@ -2759,8 +3064,12 @@ } }, "inherits": { - "version": "2.0.4", - "dev": true + "version": "2.0.4" + }, + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, "is-binary-path": { "version": "2.1.0", @@ -2788,6 +3097,11 @@ "version": "3.0.3", "dev": true }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, "isexe": { "version": "2.0.0", "dev": true @@ -2822,6 +3136,11 @@ "json-buffer": "3.0.1" } }, + "kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, "levn": { "version": "0.4.1", "dev": true, @@ -2841,6 +3160,19 @@ "version": "4.6.2", "dev": true }, + "logform": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", + "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==", + "requires": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + } + }, "lru-cache": { "version": "6.0.0", "dev": true, @@ -2881,19 +3213,12 @@ } }, "ms": { - "version": "2.1.2", - "dev": true + "version": "2.1.2" }, "natural-compare": { "version": "1.4.0", "dev": true }, - "node-cron": { - "version": "3.0.2", - "requires": { - "uuid": "8.3.2" - } - }, "nodemon": { "version": "3.0.1", "dev": true, @@ -2941,6 +3266,14 @@ "wrappy": "1" } }, + "one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "requires": { + "fn.name": "1.x.x" + } + }, "optionator": { "version": "0.9.3", "dev": true, @@ -3017,6 +3350,16 @@ "version": "1.2.3", "dev": true }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, "readdirp": { "version": "3.6.0", "dev": true, @@ -3046,6 +3389,16 @@ "queue-microtask": "^1.2.2" } }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==" + }, "semver": { "version": "7.5.4", "dev": true, @@ -3064,6 +3417,14 @@ "version": "3.0.0", "dev": true }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "requires": { + "is-arrayish": "^0.3.1" + } + }, "simple-update-notifier": { "version": "2.0.0", "dev": true, @@ -3075,6 +3436,19 @@ "version": "3.0.0", "dev": true }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, "strip-ansi": { "version": "6.0.1", "dev": true, @@ -3099,6 +3473,11 @@ } } }, + "text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, "text-table": { "version": "0.2.0", "dev": true @@ -3117,6 +3496,11 @@ "nopt": "~1.0.10" } }, + "triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==" + }, "ts-api-utils": { "version": "1.0.3", "dev": true, @@ -3173,8 +3557,10 @@ "punycode": "^2.1.0" } }, - "uuid": { - "version": "8.3.2" + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "v8-compile-cache-lib": { "version": "3.0.1", @@ -3200,6 +3586,34 @@ "isexe": "^2.0.0" } }, + "winston": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.11.0.tgz", + "integrity": "sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g==", + "requires": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.4.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.5.0" + } + }, + "winston-transport": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.6.0.tgz", + "integrity": "sha512-wbBA9PbPAHxKiygo7ub7BYRiKxms0tpfU2ljtWzb3SjRjv5yl6Ozuy/TkXf00HTAt+Uylo3gSkNwzc4ME0wiIg==", + "requires": { + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" + } + }, "wrappy": { "version": "1.0.2", "dev": true diff --git a/packages/reporter/package.json b/packages/reporter/package.json index c223ddeb..9cd4848c 100644 --- a/packages/reporter/package.json +++ b/packages/reporter/package.json @@ -15,7 +15,6 @@ "dependencies": { "axios": "^1.5.1", "dotenv": "^16.3.1", - "node-cron": "^3.0.2", "viem": "^1.16.5", "winston": "^3.11.0" }, diff --git a/packages/reporter/src/ABIs/AMBReporterContractABI.json b/packages/reporter/src/ABIs/AMBReporterContractABI.json new file mode 100644 index 00000000..2601c7eb --- /dev/null +++ b/packages/reporter/src/ABIs/AMBReporterContractABI.json @@ -0,0 +1,98 @@ +[ + { + "inputs": [ + { + "internalType": "contract IAMB", + "name": "_amb", + "type": "address" + }, + { + "internalType": "contract HeaderStorage", + "name": "_headerStorage", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "emitter", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "blockHeader", + "type": "bytes32" + } + ], + "name": "HeaderReported", + "type": "event" + }, + { + "inputs": [], + "name": "amb", + "outputs": [ + { + "internalType": "contract IAMB", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "headerStorage", + "outputs": [ + { + "internalType": "contract HeaderStorage", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "blockNumbers", + "type": "uint256[]" + }, + { + "internalType": "address", + "name": "ambAdapter", + "type": "address" + }, + { + "internalType": "uint256", + "name": "gas", + "type": "uint256" + } + ], + "name": "reportHeaders", + "outputs": [ + { + "internalType": "bytes32", + "name": "receipt", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } +] diff --git a/packages/reporter/src/ABIs/PingPongABI.json b/packages/reporter/src/ABIs/PingPongABI.json deleted file mode 100644 index ca7dfcd8..00000000 --- a/packages/reporter/src/ABIs/PingPongABI.json +++ /dev/null @@ -1,41 +0,0 @@ -[ - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "string", - "name": "pong", - "type": "string" - } - ], - "name": "Pong", - "type": "event" - }, - { - "inputs": [], - "name": "count", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ping", - "outputs": [ - { - "internalType": "string", - "name": "pong", - "type": "string" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/packages/reporter/src/ABIs/SygmaReporterContractABI.json b/packages/reporter/src/ABIs/SygmaReporterContractABI.json index 790e9b7f..b05640d1 100644 --- a/packages/reporter/src/ABIs/SygmaReporterContractABI.json +++ b/packages/reporter/src/ABIs/SygmaReporterContractABI.json @@ -1,217 +1,217 @@ [ - { - "inputs": [ - { - "internalType": "contract IBridge", - "name": "bridge", - "type": "address" - }, - { - "internalType": "contract HeaderStorage", - "name": "headerStorage", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "resourceID", - "type": "bytes32" - }, - { - "internalType": "uint8", - "name": "defaultDestinationDomainID", - "type": "uint8" - }, - { - "internalType": "address", - "name": "defaultSygmaAdapter", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "emitter", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "blockHeader", - "type": "bytes32" - } - ], - "name": "HeaderReported", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "uint256[]", - "name": "blockNumbers", - "type": "uint256[]" - }, - { - "internalType": "bytes", - "name": "feeData", - "type": "bytes" - } - ], - "name": "reportHeaders", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256[]", - "name": "blockNumbers", - "type": "uint256[]" - }, - { - "internalType": "address", - "name": "sygmaAdapter", - "type": "address" - }, - { - "internalType": "uint8", - "name": "destinationDomainID", - "type": "uint8" - }, - { - "internalType": "bytes", - "name": "feeData", - "type": "bytes" - } - ], - "name": "reportHeadersToDomain", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "_bridge", - "outputs": [ - { - "internalType": "contract IBridge", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "_defaultDestinationDomainID", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "_defaultSygmaAdapter", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "_headerStorage", - "outputs": [ - { - "internalType": "contract HeaderStorage", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "_resourceID", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256[]", - "name": "blockNumbers", - "type": "uint256[]" - }, - { - "internalType": "bytes32[]", - "name": "blockHeaders", - "type": "bytes32[]" - } - ], - "name": "prepareDepositData", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "input", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "position", - "type": "uint256" - } - ], - "name": "slice", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "pure", - "type": "function" - } -] \ No newline at end of file + { + "inputs": [ + { + "internalType": "contract IBridge", + "name": "bridge", + "type": "address" + }, + { + "internalType": "contract HeaderStorage", + "name": "headerStorage", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "resourceID", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "defaultDestinationDomainID", + "type": "uint8" + }, + { + "internalType": "address", + "name": "defaultSygmaAdapter", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "emitter", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "blockHeader", + "type": "bytes32" + } + ], + "name": "HeaderReported", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "blockNumbers", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "feeData", + "type": "bytes" + } + ], + "name": "reportHeaders", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "blockNumbers", + "type": "uint256[]" + }, + { + "internalType": "address", + "name": "sygmaAdapter", + "type": "address" + }, + { + "internalType": "uint8", + "name": "destinationDomainID", + "type": "uint8" + }, + { + "internalType": "bytes", + "name": "feeData", + "type": "bytes" + } + ], + "name": "reportHeadersToDomain", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "_bridge", + "outputs": [ + { + "internalType": "contract IBridge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_defaultDestinationDomainID", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_defaultSygmaAdapter", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_headerStorage", + "outputs": [ + { + "internalType": "contract HeaderStorage", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_resourceID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "blockNumbers", + "type": "uint256[]" + }, + { + "internalType": "bytes32[]", + "name": "blockHeaders", + "type": "bytes32[]" + } + ], + "name": "prepareDepositData", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "input", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "position", + "type": "uint256" + } + ], + "name": "slice", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "pure", + "type": "function" + } +] diff --git a/packages/reporter/src/ABIs/TelepathyAdapterABI.json b/packages/reporter/src/ABIs/TelepathyAdapterABI.json new file mode 100644 index 00000000..805ab0d5 --- /dev/null +++ b/packages/reporter/src/ABIs/TelepathyAdapterABI.json @@ -0,0 +1,229 @@ +[ + { + "type": "constructor", + "stateMutability": "nonpayable", + "inputs": [ + { + "type": "address", + "name": "_telepathyRouter", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "BlockHeaderNotAvailable", + "inputs": [ + { + "type": "uint256", + "name": "slot", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ConflictingBlockHeader", + "inputs": [ + { + "type": "uint256", + "name": "blockNumber", + "internalType": "uint256" + }, + { + "type": "bytes32", + "name": "reportedBlockHash", + "internalType": "bytes32" + }, + { + "type": "bytes32", + "name": "storedBlockHash", + "internalType": "bytes32" + } + ] + }, + { + "type": "error", + "name": "InconsistentLightClient", + "inputs": [ + { + "type": "address", + "name": "lightClient", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "InvalidBlockHashProof", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidBlockHeaderLength", + "inputs": [ + { + "type": "uint256", + "name": "length", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "InvalidBlockHeaderRLP", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidBlockNumberProof", + "inputs": [] + }, + { + "type": "error", + "name": "NoLightClientOnChain", + "inputs": [ + { + "type": "uint32", + "name": "chainId", + "internalType": "uint32" + } + ] + }, + { + "type": "event", + "name": "HashStored", + "inputs": [ + { + "type": "uint256", + "name": "id", + "internalType": "uint256", + "indexed": true + }, + { + "type": "bytes32", + "name": "hashes", + "internalType": "bytes32", + "indexed": true + } + ], + "anonymous": false + }, + { + "type": "function", + "stateMutability": "view", + "outputs": [ + { + "type": "bytes32", + "name": "hash", + "internalType": "bytes32" + } + ], + "name": "getHashFromOracle", + "inputs": [ + { + "type": "uint256", + "name": "domain", + "internalType": "uint256" + }, + { + "type": "uint256", + "name": "id", + "internalType": "uint256" + } + ] + }, + { + "type": "function", + "stateMutability": "view", + "outputs": [ + { + "type": "bytes32", + "name": "", + "internalType": "bytes32" + } + ], + "name": "hashes", + "inputs": [ + { + "type": "uint256", + "name": "", + "internalType": "uint256" + }, + { + "type": "uint256", + "name": "", + "internalType": "uint256" + } + ] + }, + { + "type": "function", + "stateMutability": "nonpayable", + "outputs": [], + "name": "proveAncestralBlockHashes", + "inputs": [ + { + "type": "uint256", + "name": "chainId", + "internalType": "uint256" + }, + { + "type": "bytes[]", + "name": "blockHeaders", + "internalType": "bytes[]" + } + ] + }, + { + "type": "function", + "stateMutability": "nonpayable", + "outputs": [], + "name": "storeBlockHeader", + "inputs": [ + { + "type": "uint32", + "name": "_chainId", + "internalType": "uint32" + }, + { + "type": "uint64", + "name": "_slot", + "internalType": "uint64" + }, + { + "type": "uint256", + "name": "_blockNumber", + "internalType": "uint256" + }, + { + "type": "bytes32[]", + "name": "_blockNumberProof", + "internalType": "bytes32[]" + }, + { + "type": "bytes32", + "name": "_blockHash", + "internalType": "bytes32" + }, + { + "type": "bytes32[]", + "name": "_blockHashProof", + "internalType": "bytes32[]" + } + ] + }, + { + "type": "function", + "stateMutability": "view", + "outputs": [ + { + "type": "address", + "name": "", + "internalType": "address" + } + ], + "name": "telepathyRouter", + "inputs": [] + } +] diff --git a/packages/reporter/src/ABIs/TelepathyContractABI.json b/packages/reporter/src/ABIs/TelepathyContractABI.json new file mode 100644 index 00000000..082fc596 --- /dev/null +++ b/packages/reporter/src/ABIs/TelepathyContractABI.json @@ -0,0 +1,497 @@ +[ + { + "inputs": [ + { + "internalType": "bytes32", + "name": "genesisValidatorsRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "genesisTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "secondsPerSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "slotsPerPeriod", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "syncCommitteePeriod", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "syncCommitteePoseidon", + "type": "bytes32" + }, + { + "internalType": "uint32", + "name": "sourceChainId", + "type": "uint32" + }, + { + "internalType": "uint16", + "name": "finalityThreshold", + "type": "uint16" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "slot", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "root", + "type": "bytes32" + } + ], + "name": "HeadUpdate", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "period", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "root", + "type": "bytes32" + } + ], + "name": "SyncCommitteeUpdate", + "type": "event" + }, + { + "inputs": [], + "name": "FINALITY_THRESHOLD", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "GENESIS_TIME", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "GENESIS_VALIDATORS_ROOT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SECONDS_PER_SLOT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SLOTS_PER_PERIOD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SOURCE_CHAIN_ID", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "consistent", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "executionStateRoots", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "head", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "headers", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "uint256", + "name": "attestedSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "finalizedSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "participation", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "finalizedHeaderRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "executionStateRoot", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "uint256[2]", + "name": "a", + "type": "uint256[2]" + }, + { + "internalType": "uint256[2][2]", + "name": "b", + "type": "uint256[2][2]" + }, + { + "internalType": "uint256[2]", + "name": "c", + "type": "uint256[2]" + } + ], + "internalType": "struct Groth16Proof", + "name": "proof", + "type": "tuple" + } + ], + "internalType": "struct LightClientStep", + "name": "step", + "type": "tuple" + }, + { + "internalType": "bytes32", + "name": "syncCommitteeSSZ", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "syncCommitteePoseidon", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "uint256[2]", + "name": "a", + "type": "uint256[2]" + }, + { + "internalType": "uint256[2][2]", + "name": "b", + "type": "uint256[2][2]" + }, + { + "internalType": "uint256[2]", + "name": "c", + "type": "uint256[2]" + } + ], + "internalType": "struct Groth16Proof", + "name": "proof", + "type": "tuple" + } + ], + "internalType": "struct LightClientRotate", + "name": "update", + "type": "tuple" + } + ], + "name": "rotate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "attestedSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "finalizedSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "participation", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "finalizedHeaderRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "executionStateRoot", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "uint256[2]", + "name": "a", + "type": "uint256[2]" + }, + { + "internalType": "uint256[2][2]", + "name": "b", + "type": "uint256[2][2]" + }, + { + "internalType": "uint256[2]", + "name": "c", + "type": "uint256[2]" + } + ], + "internalType": "struct Groth16Proof", + "name": "proof", + "type": "tuple" + } + ], + "internalType": "struct LightClientStep", + "name": "update", + "type": "tuple" + } + ], + "name": "step", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "syncCommitteePoseidons", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "timestamps", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[2]", + "name": "a", + "type": "uint256[2]" + }, + { + "internalType": "uint256[2][2]", + "name": "b", + "type": "uint256[2][2]" + }, + { + "internalType": "uint256[2]", + "name": "c", + "type": "uint256[2]" + }, + { + "internalType": "uint256[65]", + "name": "input", + "type": "uint256[65]" + } + ], + "name": "verifyProofRotate", + "outputs": [ + { + "internalType": "bool", + "name": "r", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[2]", + "name": "a", + "type": "uint256[2]" + }, + { + "internalType": "uint256[2][2]", + "name": "b", + "type": "uint256[2][2]" + }, + { + "internalType": "uint256[2]", + "name": "c", + "type": "uint256[2]" + }, + { + "internalType": "uint256[1]", + "name": "input", + "type": "uint256[1]" + } + ], + "name": "verifyProofStep", + "outputs": [ + { + "internalType": "bool", + "name": "r", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/packages/reporter/src/ABIs/WormholeReporterContractABI.json b/packages/reporter/src/ABIs/WormholeReporterContractABI.json new file mode 100644 index 00000000..93f84c1f --- /dev/null +++ b/packages/reporter/src/ABIs/WormholeReporterContractABI.json @@ -0,0 +1,76 @@ +[ + { + "inputs": [ + { + "internalType": "contract IWormhole", + "name": "_wormhole", + "type": "address" + }, + { + "internalType": "contract HeaderStorage", + "name": "_headerStorage", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "headerStorage", + "outputs": [ + { + "internalType": "contract HeaderStorage", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "oracleAdapter", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + } + ], + "name": "reportHeader", + "outputs": [ + { + "internalType": "uint64", + "name": "sequence", + "type": "uint64" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "wormhole", + "outputs": [ + { + "internalType": "contract IWormhole", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/packages/reporter/src/ABIs/ambReporterContractABI.json b/packages/reporter/src/ABIs/ambReporterContractABI.json deleted file mode 100644 index 75aa8d11..00000000 --- a/packages/reporter/src/ABIs/ambReporterContractABI.json +++ /dev/null @@ -1,98 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "contract IAMB", - "name": "_amb", - "type": "address" - }, - { - "internalType": "contract HeaderStorage", - "name": "_headerStorage", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "emitter", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "blockHeader", - "type": "bytes32" - } - ], - "name": "HeaderReported", - "type": "event" - }, - { - "inputs": [], - "name": "amb", - "outputs": [ - { - "internalType": "contract IAMB", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "headerStorage", - "outputs": [ - { - "internalType": "contract HeaderStorage", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256[]", - "name": "blockNumbers", - "type": "uint256[]" - }, - { - "internalType": "address", - "name": "ambAdapter", - "type": "address" - }, - { - "internalType": "uint256", - "name": "gas", - "type": "uint256" - } - ], - "name": "reportHeaders", - "outputs": [ - { - "internalType": "bytes32", - "name": "receipt", - "type": "bytes32" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } - ] \ No newline at end of file diff --git a/packages/reporter/src/ABIs/telepathyAdapterABI.json b/packages/reporter/src/ABIs/telepathyAdapterABI.json deleted file mode 100644 index 3fdada32..00000000 --- a/packages/reporter/src/ABIs/telepathyAdapterABI.json +++ /dev/null @@ -1,229 +0,0 @@ -[ - { - "type": "constructor", - "stateMutability": "nonpayable", - "inputs": [ - { - "type": "address", - "name": "_telepathyRouter", - "internalType": "address" - } - ] - }, - { - "type": "error", - "name": "BlockHeaderNotAvailable", - "inputs": [ - { - "type": "uint256", - "name": "slot", - "internalType": "uint256" - } - ] - }, - { - "type": "error", - "name": "ConflictingBlockHeader", - "inputs": [ - { - "type": "uint256", - "name": "blockNumber", - "internalType": "uint256" - }, - { - "type": "bytes32", - "name": "reportedBlockHash", - "internalType": "bytes32" - }, - { - "type": "bytes32", - "name": "storedBlockHash", - "internalType": "bytes32" - } - ] - }, - { - "type": "error", - "name": "InconsistentLightClient", - "inputs": [ - { - "type": "address", - "name": "lightClient", - "internalType": "address" - } - ] - }, - { - "type": "error", - "name": "InvalidBlockHashProof", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidBlockHeaderLength", - "inputs": [ - { - "type": "uint256", - "name": "length", - "internalType": "uint256" - } - ] - }, - { - "type": "error", - "name": "InvalidBlockHeaderRLP", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidBlockNumberProof", - "inputs": [] - }, - { - "type": "error", - "name": "NoLightClientOnChain", - "inputs": [ - { - "type": "uint32", - "name": "chainId", - "internalType": "uint32" - } - ] - }, - { - "type": "event", - "name": "HashStored", - "inputs": [ - { - "type": "uint256", - "name": "id", - "internalType": "uint256", - "indexed": true - }, - { - "type": "bytes32", - "name": "hashes", - "internalType": "bytes32", - "indexed": true - } - ], - "anonymous": false - }, - { - "type": "function", - "stateMutability": "view", - "outputs": [ - { - "type": "bytes32", - "name": "hash", - "internalType": "bytes32" - } - ], - "name": "getHashFromOracle", - "inputs": [ - { - "type": "uint256", - "name": "domain", - "internalType": "uint256" - }, - { - "type": "uint256", - "name": "id", - "internalType": "uint256" - } - ] - }, - { - "type": "function", - "stateMutability": "view", - "outputs": [ - { - "type": "bytes32", - "name": "", - "internalType": "bytes32" - } - ], - "name": "hashes", - "inputs": [ - { - "type": "uint256", - "name": "", - "internalType": "uint256" - }, - { - "type": "uint256", - "name": "", - "internalType": "uint256" - } - ] - }, - { - "type": "function", - "stateMutability": "nonpayable", - "outputs": [], - "name": "proveAncestralBlockHashes", - "inputs": [ - { - "type": "uint256", - "name": "chainId", - "internalType": "uint256" - }, - { - "type": "bytes[]", - "name": "blockHeaders", - "internalType": "bytes[]" - } - ] - }, - { - "type": "function", - "stateMutability": "nonpayable", - "outputs": [], - "name": "storeBlockHeader", - "inputs": [ - { - "type": "uint32", - "name": "_chainId", - "internalType": "uint32" - }, - { - "type": "uint64", - "name": "_slot", - "internalType": "uint64" - }, - { - "type": "uint256", - "name": "_blockNumber", - "internalType": "uint256" - }, - { - "type": "bytes32[]", - "name": "_blockNumberProof", - "internalType": "bytes32[]" - }, - { - "type": "bytes32", - "name": "_blockHash", - "internalType": "bytes32" - }, - { - "type": "bytes32[]", - "name": "_blockHashProof", - "internalType": "bytes32[]" - } - ] - }, - { - "type": "function", - "stateMutability": "view", - "outputs": [ - { - "type": "address", - "name": "", - "internalType": "address" - } - ], - "name": "telepathyRouter", - "inputs": [] - } - ] \ No newline at end of file diff --git a/packages/reporter/src/ABIs/telepathyContractABI.json b/packages/reporter/src/ABIs/telepathyContractABI.json deleted file mode 100644 index 51b62d40..00000000 --- a/packages/reporter/src/ABIs/telepathyContractABI.json +++ /dev/null @@ -1,497 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "bytes32", - "name": "genesisValidatorsRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "genesisTime", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "secondsPerSlot", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "slotsPerPeriod", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "syncCommitteePeriod", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "syncCommitteePoseidon", - "type": "bytes32" - }, - { - "internalType": "uint32", - "name": "sourceChainId", - "type": "uint32" - }, - { - "internalType": "uint16", - "name": "finalityThreshold", - "type": "uint16" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "slot", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "root", - "type": "bytes32" - } - ], - "name": "HeadUpdate", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "period", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "root", - "type": "bytes32" - } - ], - "name": "SyncCommitteeUpdate", - "type": "event" - }, - { - "inputs": [], - "name": "FINALITY_THRESHOLD", - "outputs": [ - { - "internalType": "uint16", - "name": "", - "type": "uint16" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "GENESIS_TIME", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "GENESIS_VALIDATORS_ROOT", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "SECONDS_PER_SLOT", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "SLOTS_PER_PERIOD", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "SOURCE_CHAIN_ID", - "outputs": [ - { - "internalType": "uint32", - "name": "", - "type": "uint32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "consistent", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "executionStateRoots", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "head", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "headers", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "components": [ - { - "internalType": "uint256", - "name": "attestedSlot", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "finalizedSlot", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "participation", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "finalizedHeaderRoot", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "executionStateRoot", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "uint256[2]", - "name": "a", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2][2]", - "name": "b", - "type": "uint256[2][2]" - }, - { - "internalType": "uint256[2]", - "name": "c", - "type": "uint256[2]" - } - ], - "internalType": "struct Groth16Proof", - "name": "proof", - "type": "tuple" - } - ], - "internalType": "struct LightClientStep", - "name": "step", - "type": "tuple" - }, - { - "internalType": "bytes32", - "name": "syncCommitteeSSZ", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "syncCommitteePoseidon", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "uint256[2]", - "name": "a", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2][2]", - "name": "b", - "type": "uint256[2][2]" - }, - { - "internalType": "uint256[2]", - "name": "c", - "type": "uint256[2]" - } - ], - "internalType": "struct Groth16Proof", - "name": "proof", - "type": "tuple" - } - ], - "internalType": "struct LightClientRotate", - "name": "update", - "type": "tuple" - } - ], - "name": "rotate", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "attestedSlot", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "finalizedSlot", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "participation", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "finalizedHeaderRoot", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "executionStateRoot", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "uint256[2]", - "name": "a", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2][2]", - "name": "b", - "type": "uint256[2][2]" - }, - { - "internalType": "uint256[2]", - "name": "c", - "type": "uint256[2]" - } - ], - "internalType": "struct Groth16Proof", - "name": "proof", - "type": "tuple" - } - ], - "internalType": "struct LightClientStep", - "name": "update", - "type": "tuple" - } - ], - "name": "step", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "syncCommitteePoseidons", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "timestamps", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256[2]", - "name": "a", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2][2]", - "name": "b", - "type": "uint256[2][2]" - }, - { - "internalType": "uint256[2]", - "name": "c", - "type": "uint256[2]" - }, - { - "internalType": "uint256[65]", - "name": "input", - "type": "uint256[65]" - } - ], - "name": "verifyProofRotate", - "outputs": [ - { - "internalType": "bool", - "name": "r", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256[2]", - "name": "a", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2][2]", - "name": "b", - "type": "uint256[2][2]" - }, - { - "internalType": "uint256[2]", - "name": "c", - "type": "uint256[2]" - }, - { - "internalType": "uint256[1]", - "name": "input", - "type": "uint256[1]" - } - ], - "name": "verifyProofStep", - "outputs": [ - { - "internalType": "bool", - "name": "r", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ] \ No newline at end of file diff --git a/packages/reporter/src/ABIs/wormholeReporterContractABI.json b/packages/reporter/src/ABIs/wormholeReporterContractABI.json deleted file mode 100644 index f7e7d5dc..00000000 --- a/packages/reporter/src/ABIs/wormholeReporterContractABI.json +++ /dev/null @@ -1,76 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "contract IWormhole", - "name": "_wormhole", - "type": "address" - }, - { - "internalType": "contract HeaderStorage", - "name": "_headerStorage", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "headerStorage", - "outputs": [ - { - "internalType": "contract HeaderStorage", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "oracleAdapter", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - } - ], - "name": "reportHeader", - "outputs": [ - { - "internalType": "uint64", - "name": "sequence", - "type": "uint64" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "wormhole", - "outputs": [ - { - "internalType": "contract IWormhole", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ] \ No newline at end of file diff --git a/packages/reporter/src/BlockListener.ts b/packages/reporter/src/BlockListener.ts index 85299909..fae15207 100644 --- a/packages/reporter/src/BlockListener.ts +++ b/packages/reporter/src/BlockListener.ts @@ -1,7 +1,9 @@ -import { publicActions } from "viem" -import { mainnet, goerli, gnosis } from "viem/chains" +import { Chain, publicActions } from "viem" +import winston from "winston" + import Multiclient from "./MultiClient" -import winston, { query } from "winston" +import { BlockListenerConfig } from "./utils/type" + class BlocksListener { controllers: any[] logger: winston.Logger @@ -9,19 +11,23 @@ class BlocksListener { lastProcessedBlock: bigint = 0n multiclient: Multiclient _interval: ReturnType | undefined // NodeJs.Timeout + sourceChain: Chain + queryBlockLength: number - constructor(controllers: any[], timeFetchBlocksMs: number, logger: winston.Logger, multiclient: Multiclient) { - this.controllers = controllers - this.timeFetchBlocksMs = timeFetchBlocksMs - this.logger = logger - this.multiclient = multiclient + constructor(props: BlockListenerConfig) { + this.controllers = props.controllers + this.timeFetchBlocksMs = props.timeFetchBlocksMs + this.logger = props.logger + this.multiclient = props.multiclient + this.sourceChain = props.sourceChain + this.lastProcessedBlock = props.lastProcessedBlock + this.queryBlockLength = props.queryBlockLength } start() { this._fetchBlocks() this._interval = setInterval(() => { this._fetchBlocks() - this.logger.info(`Waiting for ${this.timeFetchBlocksMs}ms...`) }, this.timeFetchBlocksMs) } @@ -31,39 +37,32 @@ class BlocksListener { async _fetchBlocks() { try { - this.logger.info("Start to fetch blocks") + const client = this.multiclient.getClientByChain(this.sourceChain) - const client = this.multiclient - .getClientByChain(process.env.SOURCE_CHAIN === "goerli" ? goerli : mainnet) - .extend(publicActions) const currentBlockNumber = await client.getBlockNumber() this.logger.info(`Current Block Number: ${currentBlockNumber} , on source chain: ${process.env.SOURCE_CHAIN}`) - if (this.lastProcessedBlock !== currentBlockNumber) { + if (!this.lastProcessedBlock) { this.lastProcessedBlock = await client.getBlockNumber() + } - const queryBlockLength = 100n // the number of blocks to query, make sure it is less than 256 - const blockBuffer = 10n // put 10 blocks before the current block in case the node provider don't sync up at the head - if (queryBlockLength > 256n - blockBuffer) { - this.logger.error("Please choose a block length less than 256-buffer!") - } - const startBlock = this.lastProcessedBlock - queryBlockLength - const endBlock = this.lastProcessedBlock - blockBuffer - const blocks = await Promise.all( - Array.from( - { length: Number(queryBlockLength - blockBuffer + 1n) }, - (value, index) => startBlock + BigInt(index), - ), - ) - this.logger.info(`Fetching block from ${startBlock} to ${endBlock}`) + const blockBuffer = 10 // put 10 blocks before the current block in case the node provider don't sync up at the head + if (this.queryBlockLength > 256 - blockBuffer) { + this.logger.error(`Please choose a block length less than ${256 - blockBuffer}!`) + } + const startBlock = this.lastProcessedBlock - BigInt(this.queryBlockLength) + const endBlock = this.lastProcessedBlock - BigInt(blockBuffer) + const blocks = await Promise.all( + Array.from( + { length: Number(this.queryBlockLength - blockBuffer + 1) }, + (_, index) => startBlock + BigInt(index), + ), + ) + this.logger.info(`Fetching block from ${startBlock} to ${endBlock}`) - await Promise.all(this.controllers.map((_controller: any) => _controller.onBlocks(blocks))) + await Promise.all(this.controllers.map((_controller: any) => _controller.onBlocks(blocks))) - this.lastProcessedBlock = endBlock - } else { - this.logger.error(`${currentBlockNumber} has already been fetched!`) - } - // delay for 1000ms - await new Promise((func) => setTimeout(func, 1000)) + this.lastProcessedBlock = endBlock + this.logger.info(`Waiting for ${this.timeFetchBlocksMs / 1000}s...`) } catch (_err) { this.logger.error(`error from block listener ${_err}`) } diff --git a/packages/reporter/src/MultiClient.ts b/packages/reporter/src/MultiClient.ts index 79669af1..8312a435 100644 --- a/packages/reporter/src/MultiClient.ts +++ b/packages/reporter/src/MultiClient.ts @@ -1,4 +1,4 @@ -import { createWalletClient, http, Chain, Client } from "viem" +import { createWalletClient, http, Chain, publicActions } from "viem" import { privateKeyToAccount } from "viem/accounts" type ContructorConfigs = { @@ -18,10 +18,10 @@ const getClient = ({ chain, privateKey, rpcUrl }: GetClientsConfigs) => account: privateKeyToAccount(privateKey), chain: chain as Chain | undefined, transport: http(rpcUrl), - }) + }).extend(publicActions) class Multiclient { - private _clients: { [chainName: string]: Client } + private _clients: { [chainName: string]: any } constructor({ chains, privateKey, rpcUrls }: ContructorConfigs) { this._clients = chains.reduce((_acc: { [chainName: string]: any }, _chain: Chain) => { diff --git a/packages/reporter/src/controller/AMBController.ts b/packages/reporter/src/controller/AMBController.ts deleted file mode 100644 index 522e5d2f..00000000 --- a/packages/reporter/src/controller/AMBController.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { publicActions, walletActions } from "viem" -import { mainnet, goerli, gnosis } from "viem/chains" -import { privateKeyToAccount } from "viem/accounts" -import "dotenv/config" -import contract_address from "../utils/address.json" -import contractABI from "../ABIs/ambReporterContractABI.json" -import winston from "winston" -import Multiclient from "../MultiClient" - -class AMBController { - sourceChain: string - destinationChain: string - isEnabled: boolean = false - logger: winston.Logger - multiClient: Multiclient - constructor( - sourceChain: string, - destinationChain: string, - isEnabled: boolean, - logger: winston.Logger, - multiClient: Multiclient, - ) { - this.sourceChain = sourceChain - this.destinationChain = destinationChain - this.isEnabled = isEnabled - this.logger = logger - this.multiClient = multiClient - } - - async onBlocks(blockNumbers: bigint[]) { - try { - this.logger.info("AMB: Starting AMB Reporter") - - const client = this.multiClient - .getClientByChain(this.sourceChain === "goerli" ? goerli : mainnet) - .extend(walletActions) - .extend(publicActions) - const reporterAddr = this.getSourceReporterAddr() - const adapterAddr = this.getDestAdapter() - const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`) - const { result, request } = await client.simulateContract({ - account, // calling from account - address: reporterAddr as `0x${string}`, - abi: contractABI, - functionName: "reportHeaders", - args: [blockNumbers, adapterAddr, process.env.GAS], - }) - - const txhash = await client.writeContract(request) - this.logger.info(`AMB: TxHash from AMB Controller: ${txhash}`) - } catch (error) { - this.logger.error(`AMB: Error from AMB Controller: ${error}`) - } - } - getSourceReporterAddr() { - switch (this.sourceChain) { - case "goerli": - return contract_address.amb.goerli_reporter - case "ethereum": - return contract_address.amb.ethereum_reporter - default: - return contract_address.amb.goerli_reporter - } - } - getDestAdapter() { - switch (this.destinationChain) { - case "gnosis": - return contract_address.amb.gnosis_adapter - default: - return contract_address.amb.gnosis_adapter - } - } -} - -export default AMBController diff --git a/packages/reporter/src/controller/SygmaController.ts b/packages/reporter/src/controller/SygmaController.ts deleted file mode 100644 index b88c224c..00000000 --- a/packages/reporter/src/controller/SygmaController.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { parseEther, walletActions, publicActions } from "viem" -import { mainnet, goerli, gnosis } from "viem/chains" -import { privateKeyToAccount } from "viem/accounts" -import "dotenv/config" -import contract_address from "../utils/address.json" -import contractABI from "../ABIs/SygmaReporterContractABI.json" -import winston from "winston" -import Multiclient from "../MultiClient" - -class SygmaController { - sourceChain: string - destinationChain: string - isEnabled: boolean = false - logger: winston.Logger - multiClient: Multiclient - constructor( - sourceChain: string, - destinationChain: string, - isEnabled: boolean, - logger: winston.Logger, - multiClient: Multiclient, - ) { - this.sourceChain = sourceChain - this.destinationChain = destinationChain - this.isEnabled = isEnabled - this.logger = logger - this.multiClient = multiClient - } - - async onBlocks(blockNumbers: string[]) { - try { - this.logger.info("Sygma: Starting Sygma Reporter") - const client = this.multiClient - .getClientByChain(this.sourceChain === "goerli" ? goerli : mainnet) - .extend(walletActions) - .extend(publicActions) - - const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`) - - const reporterAddr = this.getSourceReporterAddr() - const adapterAddr = this.getDestAdapter() - const destDomainId = this.getDomainID() - - const { result, request } = await client.simulateContract({ - account, // calling from account - address: reporterAddr as `0x${string}`, - abi: contractABI, - functionName: "reportHeadersToDomain", - args: [blockNumbers, adapterAddr, destDomainId, "0x"], - value: parseEther("0.0001"), - }) - const txhash = await client.writeContract(request) - this.logger.info(`Sygma: TxHash from Sygma Controller: ${txhash}`) - } catch (error) { - this.logger.error(`Sygma: Error from Sygma Controller: ${error}`) - } - } - getSourceReporterAddr() { - switch (this.sourceChain) { - case "goerli": - return contract_address.sygma.goerli_reporter - case "ethereum": - return contract_address.sygma.ethereum_reporter - default: - return contract_address.sygma.goerli_reporter - } - } - getDestAdapter() { - switch (this.destinationChain) { - case "gnosis": - return contract_address.sygma.gnosis_adapter - default: - return contract_address.sygma.gnosis_adapter - } - } - getDomainID() { - switch (this.destinationChain) { - case "gnosis": - return 101 - default: - return 101 - } - } -} - -export default SygmaController diff --git a/packages/reporter/src/controller/TelepathyController.ts b/packages/reporter/src/controller/TelepathyController.ts deleted file mode 100644 index 80379f78..00000000 --- a/packages/reporter/src/controller/TelepathyController.ts +++ /dev/null @@ -1,91 +0,0 @@ -import axios from "axios" -import { hexToNumber, publicActions, walletActions } from "viem" -import { gnosis, mainnet } from "viem/chains" -import { privateKeyToAccount } from "viem/accounts" -import "dotenv/config" -import contract_address from "../utils/address.json" -import lightClientContractABI from "../ABIs/telepathyContractABI.json" -import adapterContractABI from "../ABIs/telepathyAdapterABI.json" -import winston from "winston" -import Multiclient from "../MultiClient" - -class TelepathyController { - sourceChain: string - destinationChain: string - isEnabled: boolean = false - logger: winston.Logger - multiClient: Multiclient - constructor( - sourceChain: string, - destinationChain: string, - isEnabled: boolean, - logger: winston.Logger, - multiClient: Multiclient, - ) { - this.sourceChain = sourceChain - this.destinationChain = destinationChain - this.isEnabled = isEnabled - this.logger = logger - this.multiClient = multiClient - } - async onBlocks(blockNumbers: string[]) { - try { - // Telepathy on support light client on Gnosis at the moment - const client = this.multiClient - .getClientByChain(this.destinationChain === "gnosis" ? gnosis : mainnet) - .extend(publicActions) - .extend(walletActions) - const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`) - - const adapterAddr = contract_address.telepathy.gnosis_adapter - const lightClientAddr = contract_address.telepathy.gnosis_light_client - - // Getting the latest block number from provider - const currentBlockNumber = await client.getBlockNumber() - - // get contract events from latest block -500 : latest block - const queryBlockLength = 1000n // the number of blocks to query - const blockBuffer = 10n // put 10 blocks before the current block in case the node provider don't sync up at the head - const startBlock = currentBlockNumber - queryBlockLength - blockBuffer - const endBlock = currentBlockNumber - blockBuffer - this.logger.info(`Telepathy: Getting Contract Event from block ${startBlock} to block ${currentBlockNumber}`) - const logs = await client.getContractEvents({ - address: lightClientAddr as `0x${string}`, - abi: lightClientContractABI, - eventName: "HeadUpdate", - fromBlock: startBlock, - toBlock: endBlock, - }) - - if (logs.length == 0) { - this.logger.error("No event is found!") - return - } - - logs.forEach(async (event) => { - // get slot value from first indexed - const slotValue = event.topics[1] - this.logger.info(`Fetching proof for slot ${slotValue}`) - const postUrl = process.env.TELEPATHY_PROOF_API_URL + "5" + "/" + hexToNumber(slotValue!) - const response = await axios.post(postUrl) - this.logger.info(`Telepathy: Response from telepathy proof provider: ${response.data}`) - const { chainId, slot, blockNumber, blockNumberProof, blockHash, blockHashProof } = response.data.result - this.logger.info(`Telepathy: Calling storeBlockHeader for block number ${blockNumber}`) - const { request, result } = await client.simulateContract({ - account, - address: adapterAddr as `0x${string}`, - abi: adapterContractABI, - functionName: "storeBlockHeader", - args: [chainId, slot, blockNumber, blockNumberProof, blockHash, blockHashProof], - }) - - const txHash = await client.writeContract(request) - this.logger.info(`Telepathy: TxHash from Telepathy Controller: ${txHash} `) - }) - } catch (error) { - this.logger.error(`Telepathy: Error from Telepathy Controller: ${error}`) - } - } -} - -export default TelepathyController diff --git a/packages/reporter/src/controllers/AMBReporterController.ts b/packages/reporter/src/controllers/AMBReporterController.ts new file mode 100644 index 00000000..c1f4a9fe --- /dev/null +++ b/packages/reporter/src/controllers/AMBReporterController.ts @@ -0,0 +1,54 @@ +import { Chain } from "viem" +import { privateKeyToAccount } from "viem/accounts" +import winston from "winston" +import "dotenv/config" + +import contractABI from "../ABIs/AMBReporterContractABI.json" +import Multiclient from "../MultiClient" +import { ControllerConfig } from "../utils/type" + +class AMBReporterController { + sourceChain: Chain + destinationChains: Chain[] + isEnabled: boolean = false + logger: winston.Logger + multiClient: Multiclient + reporterAddr: string + adapterAddr: { [chainName: string]: string } + constructor(props: ControllerConfig) { + this.sourceChain = props.sourceChain + this.destinationChains = props.destinationChains + this.isEnabled = props.isEnabled + this.logger = props.logger + this.multiClient = props.multiClient + this.reporterAddr = props.reporterAddress + this.adapterAddr = props.adapterAddress + } + + async onBlocks(blockNumbers: bigint[]) { + try { + this.logger.info("AMB: Starting AMB Reporter") + + const client = this.multiClient.getClientByChain(this.sourceChain) + + const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`) + + for (const chain of this.destinationChains) { + const { result, request } = await client.simulateContract({ + account, // calling from account + address: this.reporterAddr as `0x${string}`, + abi: contractABI, + functionName: "reportHeaders", + args: [blockNumbers, this.adapterAddr[chain.name.toLocaleLowerCase()], process.env.GAS], + }) + + const txhash = await client.writeContract(request) + this.logger.info(`AMB: TxHash from AMB Controller: ${txhash}`) + } + } catch (error) { + this.logger.error(`AMB: Error from AMB Controller: ${error}`) + } + } +} + +export default AMBReporterController diff --git a/packages/reporter/src/controllers/SygmaReporterController.ts b/packages/reporter/src/controllers/SygmaReporterController.ts new file mode 100644 index 00000000..f1e9f937 --- /dev/null +++ b/packages/reporter/src/controllers/SygmaReporterController.ts @@ -0,0 +1,64 @@ +import { parseEther, Chain } from "viem" +import { gnosis } from "viem/chains" +import { privateKeyToAccount } from "viem/accounts" +import winston from "winston" +import "dotenv/config" + +import contractABI from "../ABIs/SygmaReporterContractABI.json" +import Multiclient from "../MultiClient" +import { ControllerConfig } from "../utils/type" + +class SygmaReporterController { + sourceChain: Chain + destinationChains: Chain[] + isEnabled: boolean = false + logger: winston.Logger + multiClient: Multiclient + reporterAddr: string + adapterAddr: { [chainName: string]: string } + constructor(props: ControllerConfig) { + this.sourceChain = props.sourceChain + this.destinationChains = props.destinationChains + this.isEnabled = props.isEnabled + this.logger = props.logger + this.multiClient = props.multiClient + this.reporterAddr = props.reporterAddress + this.adapterAddr = props.adapterAddress + } + + async onBlocks(blockNumbers: string[]) { + try { + this.logger.info("Sygma: Starting Sygma Reporter") + const client = this.multiClient.getClientByChain(this.sourceChain) + + const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`) + + for (const chain of this.destinationChains) { + const destDomainId = this.getDomainID(chain) + const { result, request } = await client.simulateContract({ + account, // calling from account + address: this.reporterAddr as `0x${string}`, + abi: contractABI, + functionName: "reportHeadersToDomain", + args: [blockNumbers, this.adapterAddr[chain.name.toLocaleLowerCase()], destDomainId, "0x"], + value: parseEther("0.0001"), + }) + const txhash = await client.writeContract(request) + this.logger.info(`Sygma: TxHash from Sygma Controller: ${txhash}`) + } + } catch (error) { + this.logger.error(`Sygma: Error from Sygma Controller: ${error}`) + } + } + + getDomainID(destinationChain: Chain) { + switch (destinationChain) { + case gnosis: + return 101 + default: + return 101 + } + } +} + +export default SygmaReporterController diff --git a/packages/reporter/src/controllers/TelepathyReporterController.ts b/packages/reporter/src/controllers/TelepathyReporterController.ts new file mode 100644 index 00000000..245d7c4d --- /dev/null +++ b/packages/reporter/src/controllers/TelepathyReporterController.ts @@ -0,0 +1,90 @@ +import axios from "axios" +import { hexToNumber, Chain } from "viem" +import { privateKeyToAccount } from "viem/accounts" +import winston from "winston" +import "dotenv/config" + +import lightClientContractABI from "../ABIs/TelepathyContractABI.json" +import adapterContractABI from "../ABIs/TelepathyAdapterABI.json" +import Multiclient from "../MultiClient" +import { ControllerConfig } from "../utils/type" +import settings from "../utils/settings.json" + +class TelepathyReporterController { + sourceChain: Chain + destinationChains: Chain[] + isEnabled: boolean = false + logger: winston.Logger + multiClient: Multiclient + reporterAddr: string + adapterAddr: { [chainName: string]: string } + constructor(props: ControllerConfig) { + this.sourceChain = props.sourceChain + this.destinationChains = props.destinationChains + this.isEnabled = props.isEnabled + this.logger = props.logger + this.multiClient = props.multiClient + this.reporterAddr = props.reporterAddress + this.adapterAddr = props.adapterAddress + } + async onBlocks(blockNumbers: string[]) { + try { + // Telepathy on support light client on Gnosis at the moment + + for (const chain of this.destinationChains) { + const client = this.multiClient.getClientByChain(chain) + const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`) + + const adapterAddr = this.adapterAddr[chain.name.toLocaleLowerCase()] + const lightClientAddr = settings.contractAddresses.gnosis.TelepathyLightClient + + // Getting the latest block number from provider + const currentBlockNumber = await client.getBlockNumber() + + // get contract events from latest block - 1000 : latest block - 10 + const queryBlockLength = 1000n // the number of blocks to query + const blockBuffer = 10n // put 10 blocks before the current block in case the node provider don't sync up at the head + const startBlock = currentBlockNumber - queryBlockLength + const endBlock = currentBlockNumber - blockBuffer + this.logger.info(`Telepathy: Getting Contract Event from block ${startBlock} to block ${currentBlockNumber}`) + const logs = await client.getContractEvents({ + address: lightClientAddr as `0x${string}`, + abi: lightClientContractABI, + eventName: "HeadUpdate", + fromBlock: startBlock, + toBlock: endBlock, + }) + + if (logs.length == 0) { + this.logger.error("No event is found!") + return + } + + logs.forEach(async (event: any) => { + // get slot value from first indexed + const slotValue = event.topics[1] + this.logger.info(`Fetching proof for slot ${slotValue}`) + const postUrl = process.env.TELEPATHY_PROOF_API_URL + "5" + "/" + hexToNumber(slotValue!) + const response = await axios.post(postUrl) + this.logger.info(`Telepathy: Response from telepathy proof provider: ${response.data}`) + const { chainId, slot, blockNumber, blockNumberProof, blockHash, blockHashProof } = response.data.result + this.logger.info(`Telepathy: Calling storeBlockHeader for block number ${blockNumber}`) + const { request, result } = await client.simulateContract({ + account, + address: adapterAddr as `0x${string}`, + abi: adapterContractABI, + functionName: "storeBlockHeader", + args: [chainId, slot, blockNumber, blockNumberProof, blockHash, blockHashProof], + }) + + const txHash = await client.writeContract(request) + this.logger.info(`Telepathy: TxHash from Telepathy Controller: ${txHash} `) + }) + } + } catch (error) { + this.logger.error(`Telepathy: Error from Telepathy Controller: ${error}`) + } + } +} + +export default TelepathyReporterController diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 9072278d..89e7d40b 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -1,12 +1,12 @@ import { gnosis, goerli, mainnet } from "viem/chains" import Multiclient from "./MultiClient" -import AMBController from "./controller/AMBController" -import SygmaController from "./controller/SygmaController" -import TelepathyController from "./controller/TelepathyController" +import AMBReporterController from "./controllers/AMBReporterController" +import SygmaReporterController from "./controllers/SygmaReporterController" +import TelepathyReporterController from "./controllers/TelepathyReporterController" import BlocksListener from "./BlockListener" import "dotenv/config" import winston from "winston" - +import settings from "./utils/settings.json" function main() { const goerliRPC = process.env.GOERLI_RPC_URL as string const gnosisRPC = process.env.GNOSIS_RPC_URL as string @@ -16,7 +16,7 @@ function main() { const isAMBEnabled = process.env.AMB_CONTROLLER === "true" const isSygmaEnabled = process.env.SYGMA_CONTROLLER === "true" const isTelepathyEnabled = process.env.TELEPATHY_CONTROLLER === "true" - const timeFetchBlocksMs = 5 * 60 * 1000 + const timeFetchBlocksMs = 10 * 1000 const logger = winston.createLogger({ level: "info", @@ -32,16 +32,45 @@ function main() { }, }) - const ambController = new AMBController(sourceChain!, destChain!, isAMBEnabled, logger, multiClient) - const sygmaController = new SygmaController(sourceChain!, destChain!, isSygmaEnabled, logger, multiClient) - const telepathyController = new TelepathyController(sourceChain!, destChain!, isTelepathyEnabled, logger, multiClient) + const ambReporterController = new AMBReporterController({ + sourceChain: goerli, + destinationChains: [gnosis], + isEnabled: isAMBEnabled, + logger: logger, + multiClient: multiClient, + reporterAddress: settings.contractAddresses.goerli.AMBReporter, + adapterAddress: { gnosis: settings.contractAddresses.gnosis.AMBAdapter }, + }) + const sygmaReporterController = new SygmaReporterController({ + sourceChain: goerli, + destinationChains: [gnosis], + isEnabled: isSygmaEnabled, + logger: logger, + multiClient: multiClient, + reporterAddress: settings.contractAddresses.goerli.SygmaReporter, + adapterAddress: { gnosis: settings.contractAddresses.gnosis.SygmaAdapter }, + }) + const telepathyReporterController = new TelepathyReporterController({ + sourceChain: goerli, + destinationChains: [gnosis], + isEnabled: isTelepathyEnabled, + logger: logger, + multiClient: multiClient, + reporterAddress: "", + adapterAddress: { gnosis: settings.contractAddresses.gnosis.SygmaAdapter }, + }) - const blocksListener = new BlocksListener( - [ambController, sygmaController, telepathyController].filter((controller) => controller.isEnabled == true), - timeFetchBlocksMs, // every 5 minutes - logger, - multiClient, - ) + const blocksListener = new BlocksListener({ + controllers: [ambReporterController, sygmaReporterController, telepathyReporterController].filter( + (controller) => controller.isEnabled == true, + ), + timeFetchBlocksMs: timeFetchBlocksMs, + logger: logger, + multiclient: multiClient, + sourceChain: goerli, + queryBlockLength: 100, + lastProcessedBlock: 0n, + }) blocksListener.start() } diff --git a/packages/reporter/src/newIndex.ts b/packages/reporter/src/newIndex.ts deleted file mode 100644 index 42d19f9b..00000000 --- a/packages/reporter/src/newIndex.ts +++ /dev/null @@ -1,34 +0,0 @@ -// import logger from "winston" -import { createPublicClient, http, createWalletClient, PublicClient, Chain } from "viem" -import AMBController from "./controller/AMBController" -import SygmaController from "./controller/SygmaController" -import TelepathyController from "./controller/TelepathyController" -import BlocksListener from "./BlockListener" -import "dotenv/config" -import winston from "winston" -function main() { - const logger = winston.createLogger({ - level: "info", - format: winston.format.json(), - transports: [new winston.transports.Console()], - }) - const sourceChain = process.env.SOURCE_CHAIN - const destChain = process.env.DEST_CHAIN - const ambController = new AMBController(sourceChain!, destChain!, process.env.AMB_CONTROLLER === "true", logger) - const sygmaController = new SygmaController(sourceChain!, destChain!, process.env.SYGMA_CONTROLLER === "true", logger) - const telepathyController = new TelepathyController( - sourceChain!, - destChain!, - process.env.TELEPATHY_CONTROLLER === "true", - logger, - ) - - const blocksListener = new BlocksListener( - [ambController, sygmaController, telepathyController].filter((controller) => controller.isEnabled == true), - 10 * 1000, - logger, - ) - blocksListener.start() -} - -main() diff --git a/packages/reporter/src/utils/settings.json b/packages/reporter/src/utils/settings.json new file mode 100644 index 00000000..acb189f2 --- /dev/null +++ b/packages/reporter/src/utils/settings.json @@ -0,0 +1,15 @@ +{ + "contractAddresses": { + "goerli": { + "AMBReporter": "0xedc0b1d3de4496e0d917af42f29cb71eb2982319", + "SygmaReporter": "0x2f96d347c932ac73b56e9352ecc0707e25173d88" + }, + "mainnet": {}, + "gnosis": { + "AMBAdapter": "0x01268DB05965CeAc2a89566c42CD550ED7eE5ECD", + "SygmaAdapter": "0x9AD7a6f4FDA8247cC0bF5932B68c5b619937dB15", + "TelepathyLightClient": "0x34b5378DE786389a477b40dD710812c250185f83", + "TelapathyAdapter": "0x2f1E51a2763FB67fe09971Fd8d849716137A3357" + } + } +} diff --git a/packages/reporter/src/utils/type.ts b/packages/reporter/src/utils/type.ts new file mode 100644 index 00000000..00e7848b --- /dev/null +++ b/packages/reporter/src/utils/type.ts @@ -0,0 +1,25 @@ +import { Chain } from "viem" +import winston = require("winston") +import Multiclient from "../MultiClient" + +type ControllerConfig = { + sourceChain: Chain + destinationChains: Chain[] + reporterAddress: string + adapterAddress: { [chainName: string]: string } + logger: winston.Logger + multiClient: Multiclient + isEnabled: boolean +} + +type BlockListenerConfig = { + controllers: any[] + logger: winston.Logger + timeFetchBlocksMs: number + multiclient: Multiclient + sourceChain: Chain + queryBlockLength: number + lastProcessedBlock: bigint +} + +export { ControllerConfig, BlockListenerConfig } diff --git a/packages/reporter/tsconfig.json b/packages/reporter/tsconfig.json index 3550a7f9..acfb993d 100644 --- a/packages/reporter/tsconfig.json +++ b/packages/reporter/tsconfig.json @@ -1,28 +1,22 @@ { - "compilerOptions": { - "declaration": true, - "declarationMap": true, - "emitDecoratorMetadata": true, - "esModuleInterop": true, - "experimentalDecorators": true, - "forceConsistentCasingInFileNames": true, - "lib": [ - "es6","ESNext" - ], - "module": "commonjs", - "moduleResolution": "node", - "noImplicitAny": true, - "outDir": "./dist", - "removeComments": true, - "resolveJsonModule": true, - "sourceMap": true, - "strict": true, - "target": "ESNext" - }, - "exclude": [ - "node_modules" - ], - "include": [ - "./src/**/*" - ] -} \ No newline at end of file + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "emitDecoratorMetadata": true, + "esModuleInterop": true, + "experimentalDecorators": true, + "forceConsistentCasingInFileNames": true, + "lib": ["es6", "ESNext"], + "module": "commonjs", + "moduleResolution": "node", + "noImplicitAny": true, + "outDir": "./dist", + "removeComments": true, + "resolveJsonModule": true, + "sourceMap": true, + "strict": true, + "target": "ESNext" + }, + "exclude": ["node_modules"], + "include": ["./src/**/*"] +} diff --git a/packages/reporter/yarn.lock b/packages/reporter/yarn.lock index 0e59c872..898adfbb 100644 --- a/packages/reporter/yarn.lock +++ b/packages/reporter/yarn.lock @@ -1,2811 +1,1082 @@ -# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! - -__metadata: - version: 6 - cacheKey: 8 - -"@aashutoshrathi/word-wrap@npm:^1.2.3": - version: 1.2.6 - resolution: "@aashutoshrathi/word-wrap@npm:1.2.6" - checksum: ada901b9e7c680d190f1d012c84217ce0063d8f5c5a7725bb91ec3c5ed99bb7572680eb2d2938a531ccbaec39a95422fcd8a6b4a13110c7d98dd75402f66a0cd - languageName: node - linkType: hard - -"@adraffy/ens-normalize@npm:1.9.4": - version: 1.9.4 - resolution: "@adraffy/ens-normalize@npm:1.9.4" - checksum: 7d7fff58ebe2c4961f7e5e61dad123aa6a63fec0df5c84af1fa41079dc05d398599690be4427b3a94d2baa94084544bcfdf2d51cbed7504b9b0583b0960ad550 - languageName: node - linkType: hard - -"@colors/colors@npm:1.6.0, @colors/colors@npm:^1.6.0": - version: 1.6.0 - resolution: "@colors/colors@npm:1.6.0" - checksum: aa209963e0c3218e80a4a20553ba8c0fbb6fa13140540b4e5f97923790be06801fc90172c1114fc8b7e888b3d012b67298cde6b9e81521361becfaee400c662f - languageName: node - linkType: hard - -"@cspotcode/source-map-support@npm:^0.8.0": - version: 0.8.1 - resolution: "@cspotcode/source-map-support@npm:0.8.1" - dependencies: - "@jridgewell/trace-mapping": 0.3.9 - checksum: 5718f267085ed8edb3e7ef210137241775e607ee18b77d95aa5bd7514f47f5019aa2d82d96b3bf342ef7aa890a346fa1044532ff7cc3009e7d24fce3ce6200fa - languageName: node - linkType: hard - -"@dabh/diagnostics@npm:^2.0.2": - version: 2.0.3 - resolution: "@dabh/diagnostics@npm:2.0.3" - dependencies: - colorspace: 1.1.x - enabled: 2.0.x - kuler: ^2.0.0 - checksum: 4879600c55c8315a0fb85fbb19057bad1adc08f0a080a8cb4e2b63f723c379bfc4283b68123a2b078d367b327dd8df12fcb27464efe791addc0a48b9df6d79a1 - languageName: node - linkType: hard - -"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": - version: 4.4.0 - resolution: "@eslint-community/eslint-utils@npm:4.4.0" - dependencies: - eslint-visitor-keys: ^3.3.0 - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: cdfe3ae42b4f572cbfb46d20edafe6f36fc5fb52bf2d90875c58aefe226892b9677fef60820e2832caf864a326fe4fc225714c46e8389ccca04d5f9288aabd22 - languageName: node - linkType: hard - -"@eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": - version: 4.9.1 - resolution: "@eslint-community/regexpp@npm:4.9.1" - checksum: 06fb839e9c756f6375cc545c2f2e05a0a64576bd6370e8e3c07983fd29a3d6e164ef4aa48a361f7d27e6713ab79c83053ff6a2ccb78748bc955e344279c4a3b6 - languageName: node - linkType: hard - -"@eslint/eslintrc@npm:^2.1.2": - version: 2.1.2 - resolution: "@eslint/eslintrc@npm:2.1.2" - 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 - checksum: bc742a1e3b361f06fedb4afb6bf32cbd27171292ef7924f61c62f2aed73048367bcc7ac68f98c06d4245cd3fabc43270f844e3c1699936d4734b3ac5398814a7 - languageName: node - linkType: hard - -"@eslint/js@npm:8.51.0": - version: 8.51.0 - resolution: "@eslint/js@npm:8.51.0" - checksum: 0228bf1e1e0414843e56d9ff362a2a72d579c078f93174666f29315690e9e30a8633ad72c923297f7fd7182381b5a476805ff04dac8debe638953eb1ded3ac73 - languageName: node - linkType: hard - -"@humanwhocodes/config-array@npm:^0.11.11": - version: 0.11.12 - resolution: "@humanwhocodes/config-array@npm:0.11.12" - dependencies: - "@humanwhocodes/object-schema": ^2.0.0 - debug: ^4.1.1 - minimatch: ^3.0.5 - checksum: 8eab5a7c7e4948aa07cf26d0b6cca103298ab9bbb70f897c7cfbb3ee5fd5431a0d9f2ff5efd4d712dae7fd8fa941f09b1b22da842b9d87367ccb75b86bbd715b - languageName: node - linkType: hard - -"@humanwhocodes/module-importer@npm:^1.0.1": - version: 1.0.1 - resolution: "@humanwhocodes/module-importer@npm:1.0.1" - checksum: 0fd22007db8034a2cdf2c764b140d37d9020bbfce8a49d3ec5c05290e77d4b0263b1b972b752df8c89e5eaa94073408f2b7d977aed131faf6cf396ebb5d7fb61 - languageName: node - linkType: hard - -"@humanwhocodes/object-schema@npm:^2.0.0": - version: 2.0.0 - resolution: "@humanwhocodes/object-schema@npm:2.0.0" - checksum: e0558acd035198a69adfa3edce33ec385bb664c92478a08a91b3e8082acd2d96ef7bf43189d848e4b0bdd75092f9d494a55a4efaf5bed45101c9e83d28379d83 - languageName: node - linkType: hard - -"@isaacs/cliui@npm:^8.0.2": - version: 8.0.2 - resolution: "@isaacs/cliui@npm:8.0.2" - dependencies: - string-width: ^5.1.2 - string-width-cjs: "npm:string-width@^4.2.0" - strip-ansi: ^7.0.1 - strip-ansi-cjs: "npm:strip-ansi@^6.0.1" - wrap-ansi: ^8.1.0 - wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" - checksum: 4a473b9b32a7d4d3cfb7a614226e555091ff0c5a29a1734c28c72a182c2f6699b26fc6b5c2131dfd841e86b185aea714c72201d7c98c2fba5f17709333a67aeb - languageName: node - linkType: hard - -"@jridgewell/resolve-uri@npm:^3.0.3": - version: 3.1.1 - resolution: "@jridgewell/resolve-uri@npm:3.1.1" - checksum: f5b441fe7900eab4f9155b3b93f9800a916257f4e8563afbcd3b5a5337b55e52bd8ae6735453b1b745457d9f6cdb16d74cd6220bbdd98cf153239e13f6cbb653 - languageName: node - linkType: hard - -"@jridgewell/sourcemap-codec@npm:^1.4.10": - version: 1.4.15 - resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" - checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:0.3.9": - version: 0.3.9 - resolution: "@jridgewell/trace-mapping@npm:0.3.9" - dependencies: - "@jridgewell/resolve-uri": ^3.0.3 - "@jridgewell/sourcemap-codec": ^1.4.10 - checksum: d89597752fd88d3f3480845691a05a44bd21faac18e2185b6f436c3b0fd0c5a859fbbd9aaa92050c4052caf325ad3e10e2e1d1b64327517471b7d51babc0ddef - languageName: node - linkType: hard - -"@noble/curves@npm:1.2.0, @noble/curves@npm:~1.2.0": - version: 1.2.0 - resolution: "@noble/curves@npm:1.2.0" - dependencies: - "@noble/hashes": 1.3.2 - checksum: bb798d7a66d8e43789e93bc3c2ddff91a1e19fdb79a99b86cd98f1e5eff0ee2024a2672902c2576ef3577b6f282f3b5c778bebd55761ddbb30e36bf275e83dd0 - languageName: node - linkType: hard - -"@noble/hashes@npm:1.3.2, @noble/hashes@npm:~1.3.0, @noble/hashes@npm:~1.3.2": - version: 1.3.2 - resolution: "@noble/hashes@npm:1.3.2" - checksum: fe23536b436539d13f90e4b9be843cc63b1b17666a07634a2b1259dded6f490be3d050249e6af98076ea8f2ea0d56f578773c2197f2aa0eeaa5fba5bc18ba474 - languageName: node - linkType: hard - -"@nodelib/fs.scandir@npm:2.1.5": - version: 2.1.5 - resolution: "@nodelib/fs.scandir@npm:2.1.5" - dependencies: - "@nodelib/fs.stat": 2.0.5 - run-parallel: ^1.1.9 - checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59 - languageName: node - linkType: hard - -"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": - version: 2.0.5 - resolution: "@nodelib/fs.stat@npm:2.0.5" - checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 - languageName: node - linkType: hard - -"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": - version: 1.2.8 - resolution: "@nodelib/fs.walk@npm:1.2.8" - dependencies: - "@nodelib/fs.scandir": 2.1.5 - fastq: ^1.6.0 - checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53 - languageName: node - linkType: hard - -"@npmcli/fs@npm:^3.1.0": - version: 3.1.0 - resolution: "@npmcli/fs@npm:3.1.0" - dependencies: - semver: ^7.3.5 - checksum: a50a6818de5fc557d0b0e6f50ec780a7a02ab8ad07e5ac8b16bf519e0ad60a144ac64f97d05c443c3367235d337182e1d012bbac0eb8dbae8dc7b40b193efd0e - languageName: node - linkType: hard - -"@pkgjs/parseargs@npm:^0.11.0": - version: 0.11.0 - resolution: "@pkgjs/parseargs@npm:0.11.0" - checksum: 6ad6a00fc4f2f2cfc6bff76fb1d88b8ee20bc0601e18ebb01b6d4be583733a860239a521a7fbca73b612e66705078809483549d2b18f370eb346c5155c8e4a0f - languageName: node - linkType: hard - -"@scure/base@npm:~1.1.0, @scure/base@npm:~1.1.2": - version: 1.1.3 - resolution: "@scure/base@npm:1.1.3" - checksum: 1606ab8a4db898cb3a1ada16c15437c3bce4e25854fadc8eb03ae93cbbbac1ed90655af4b0be3da37e12056fef11c0374499f69b9e658c9e5b7b3e06353c630c - languageName: node - linkType: hard - -"@scure/bip32@npm:1.3.2": - version: 1.3.2 - resolution: "@scure/bip32@npm:1.3.2" - dependencies: - "@noble/curves": ~1.2.0 - "@noble/hashes": ~1.3.2 - "@scure/base": ~1.1.2 - checksum: c5ae84fae43490853693b481531132b89e056d45c945fc8b92b9d032577f753dfd79c5a7bbcbf0a7f035951006ff0311b6cf7a389e26c9ec6335e42b20c53157 - languageName: node - linkType: hard - -"@scure/bip39@npm:1.2.1": - version: 1.2.1 - resolution: "@scure/bip39@npm:1.2.1" - dependencies: - "@noble/hashes": ~1.3.0 - "@scure/base": ~1.1.0 - checksum: c5bd6f1328fdbeae2dcdd891825b1610225310e5e62a4942714db51066866e4f7bef242c7b06a1b9dcc8043a4a13412cf5c5df76d3b10aa9e36b82e9b6e3eeaa - languageName: node - linkType: hard - -"@tootallnate/once@npm:2": - version: 2.0.0 - resolution: "@tootallnate/once@npm:2.0.0" - checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 - languageName: node - linkType: hard - -"@tsconfig/node10@npm:^1.0.7": - version: 1.0.9 - resolution: "@tsconfig/node10@npm:1.0.9" - checksum: a33ae4dc2a621c0678ac8ac4bceb8e512ae75dac65417a2ad9b022d9b5411e863c4c198b6ba9ef659e14b9fb609bbec680841a2e84c1172df7a5ffcf076539df - languageName: node - linkType: hard - -"@tsconfig/node12@npm:^1.0.7": - version: 1.0.11 - resolution: "@tsconfig/node12@npm:1.0.11" - checksum: 5ce29a41b13e7897a58b8e2df11269c5395999e588b9a467386f99d1d26f6c77d1af2719e407621412520ea30517d718d5192a32403b8dfcc163bf33e40a338a - languageName: node - linkType: hard - -"@tsconfig/node14@npm:^1.0.0": - version: 1.0.3 - resolution: "@tsconfig/node14@npm:1.0.3" - checksum: 19275fe80c4c8d0ad0abed6a96dbf00642e88b220b090418609c4376e1cef81bf16237bf170ad1b341452feddb8115d8dd2e5acdfdea1b27422071163dc9ba9d - languageName: node - linkType: hard - -"@tsconfig/node16@npm:^1.0.2": - version: 1.0.4 - resolution: "@tsconfig/node16@npm:1.0.4" - checksum: 202319785901f942a6e1e476b872d421baec20cf09f4b266a1854060efbf78cde16a4d256e8bc949d31e6cd9a90f1e8ef8fb06af96a65e98338a2b6b0de0a0ff - languageName: node - linkType: hard - -"@types/json-schema@npm:^7.0.12": - version: 7.0.14 - resolution: "@types/json-schema@npm:7.0.14" - checksum: 4b3dd99616c7c808201c56f6c7f6552eb67b5c0c753ab3fa03a6cb549aae950da537e9558e53fa65fba23d1be624a1e4e8d20c15027efbe41e03ca56f2b04fb0 - languageName: node - linkType: hard - -"@types/node-cron@npm:^3.0.9": - version: 3.0.9 - resolution: "@types/node-cron@npm:3.0.9" - checksum: 8335eb0a453b956cc2da5431269e4732e0063c6cca0763cf779c7c242d0dfe3eea1929951a0b11fb9e7a2eee838836ee8cda79e9d6098b1bee91d5a17dce1e73 - languageName: node - linkType: hard - -"@types/node@npm:^20.8.6": - version: 20.8.6 - resolution: "@types/node@npm:20.8.6" - dependencies: - undici-types: ~5.25.1 - checksum: ccfb7ac482c5a96edeb239893c5c099f5257fcc2ed9ae62fefdfbc782b79e16dbc2af9a85b379665237bf759904b44ca2be68e75d239e0297882aad42f61905c - languageName: node - linkType: hard - -"@types/semver@npm:^7.5.0": - version: 7.5.4 - resolution: "@types/semver@npm:7.5.4" - checksum: 120c0189f6fec5f2d12d0d71ac8a4cfa952dc17fa3d842e8afddb82bba8828a4052f8799c1653e2b47ae1977435f38e8985658fde971905ce5afb8e23ee97ecf - languageName: node - linkType: hard - -"@types/triple-beam@npm:^1.3.2": - version: 1.3.4 - resolution: "@types/triple-beam@npm:1.3.4" - checksum: 869641358164a9b87aec710e046c11a65803b7dc3545f33c3365df9590d1059c70592bb35a7fc4099fa746f112ab5a207881ba9fb570e9b1dea4ffd89761d804 - languageName: node - linkType: hard - -"@typescript-eslint/eslint-plugin@npm:^6.7.5": - version: 6.8.0 - resolution: "@typescript-eslint/eslint-plugin@npm:6.8.0" - dependencies: - "@eslint-community/regexpp": ^4.5.1 - "@typescript-eslint/scope-manager": 6.8.0 - "@typescript-eslint/type-utils": 6.8.0 - "@typescript-eslint/utils": 6.8.0 - "@typescript-eslint/visitor-keys": 6.8.0 - debug: ^4.3.4 - graphemer: ^1.4.0 - ignore: ^5.2.4 - natural-compare: ^1.4.0 - semver: ^7.5.4 - ts-api-utils: ^1.0.1 - peerDependencies: - "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: c36ccf606ebcaff8263c4ffa3b4cda58c6f93474b9eea9906e51be2fef8596977a245cc13770b21c6bfd38ccf45a3cf3613d5f4499429f62ec80afe15ae345bd - languageName: node - linkType: hard - -"@typescript-eslint/parser@npm:^6.7.5": - version: 6.8.0 - resolution: "@typescript-eslint/parser@npm:6.8.0" - dependencies: - "@typescript-eslint/scope-manager": 6.8.0 - "@typescript-eslint/types": 6.8.0 - "@typescript-eslint/typescript-estree": 6.8.0 - "@typescript-eslint/visitor-keys": 6.8.0 - debug: ^4.3.4 - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 10d7a3ae383fee5a5cba9541c72e23d6ab01cca6b414a62b44dacb5ebc15c80b80aa6c105b6469d3795f2f8514ae2499c069cd2d9dcac61f3db9ef6c7a75e080 - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:6.8.0": - version: 6.8.0 - resolution: "@typescript-eslint/scope-manager@npm:6.8.0" - dependencies: - "@typescript-eslint/types": 6.8.0 - "@typescript-eslint/visitor-keys": 6.8.0 - checksum: b6cf2803531d1c14b56c30fd3cd807b80e17fe48d0da8e5aa9ae50915407ed732c7e2a7ac8030b7cf8ed07b8e481a1138d76bf05b727837a0e016280c2f6873b - languageName: node - linkType: hard - -"@typescript-eslint/type-utils@npm:6.8.0": - version: 6.8.0 - resolution: "@typescript-eslint/type-utils@npm:6.8.0" - dependencies: - "@typescript-eslint/typescript-estree": 6.8.0 - "@typescript-eslint/utils": 6.8.0 - debug: ^4.3.4 - ts-api-utils: ^1.0.1 - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 9b7d56904dc1a5719ef79eb1b7989d6fad10c71fb07ec3e66cf69b8c8dc5383d644ab122d4701bc4960fb7c99cc08aee4e645db3e4675d488d5779197e15dfda - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:6.8.0": - version: 6.8.0 - resolution: "@typescript-eslint/types@npm:6.8.0" - checksum: 1fcd85f6d575116d51c6ee757ed37610ae5e7e4296a29f93c9c6949f6cd16d24550eb7fc5bae7a43119cc08e13836f69a7ae7c54ebba6c95aef96b34d3bfb7f7 - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:6.8.0": - version: 6.8.0 - resolution: "@typescript-eslint/typescript-estree@npm:6.8.0" - dependencies: - "@typescript-eslint/types": 6.8.0 - "@typescript-eslint/visitor-keys": 6.8.0 - debug: ^4.3.4 - globby: ^11.1.0 - is-glob: ^4.0.3 - semver: ^7.5.4 - ts-api-utils: ^1.0.1 - peerDependenciesMeta: - typescript: - optional: true - checksum: 388db7f33ef1bc0e7b960c0bce9c744c2e32c66c7ab8dfae73d8533958202ad6f31663b0010f79c45b5ff93159c67f45b00693d73b9da2472b17156dfd26b4a8 - languageName: node - linkType: hard - -"@typescript-eslint/utils@npm:6.8.0": - version: 6.8.0 - resolution: "@typescript-eslint/utils@npm:6.8.0" - dependencies: - "@eslint-community/eslint-utils": ^4.4.0 - "@types/json-schema": ^7.0.12 - "@types/semver": ^7.5.0 - "@typescript-eslint/scope-manager": 6.8.0 - "@typescript-eslint/types": 6.8.0 - "@typescript-eslint/typescript-estree": 6.8.0 - semver: ^7.5.4 - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - checksum: 6d9f90db504502a9aa10e834830c3ffa25483757414670acc6141a3ebef9171a57688a3a179febf35a0e1e0b322f37228d9537bf1b279f1af7fc97888b873bc3 - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:6.8.0": - version: 6.8.0 - resolution: "@typescript-eslint/visitor-keys@npm:6.8.0" - dependencies: - "@typescript-eslint/types": 6.8.0 - eslint-visitor-keys: ^3.4.1 - checksum: 710d9067b85d7715a400ae625c083c41733abb891d7b35108de083913980f9642e79d27689599fa39915f0fecae16dbfc30367007fccc838ccd917943660de22 - languageName: node - linkType: hard - -"abbrev@npm:1, abbrev@npm:^1.0.0": - version: 1.1.1 - resolution: "abbrev@npm:1.1.1" - checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 - languageName: node - linkType: hard - -"abitype@npm:0.9.8": - version: 0.9.8 - resolution: "abitype@npm:0.9.8" - peerDependencies: - typescript: ">=5.0.4" - zod: ^3 >=3.19.1 - peerDependenciesMeta: - typescript: - optional: true - zod: - optional: true - checksum: d7d887f29d6821e3f7a400de9620511b80ead3f85c5c87308aaec97965d3493e6687ed816e88722b4f512249bd66dee9e69231b49af0e1db8f69400a62c87cf6 - languageName: node - linkType: hard - -"acorn-jsx@npm:^5.3.2": - version: 5.3.2 - resolution: "acorn-jsx@npm:5.3.2" - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: c3d3b2a89c9a056b205b69530a37b972b404ee46ec8e5b341666f9513d3163e2a4f214a71f4dfc7370f5a9c07472d2fd1c11c91c3f03d093e37637d95da98950 - languageName: node - linkType: hard - -"acorn-walk@npm:^8.1.1": - version: 8.2.0 - resolution: "acorn-walk@npm:8.2.0" - checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1 - languageName: node - linkType: hard - -"acorn@npm:^8.4.1, acorn@npm:^8.9.0": - version: 8.10.0 - resolution: "acorn@npm:8.10.0" - bin: - acorn: bin/acorn - checksum: 538ba38af0cc9e5ef983aee196c4b8b4d87c0c94532334fa7e065b2c8a1f85863467bb774231aae91613fcda5e68740c15d97b1967ae3394d20faddddd8af61d - languageName: node - linkType: hard - -"agent-base@npm:6, agent-base@npm:^6.0.2": - version: 6.0.2 - resolution: "agent-base@npm:6.0.2" - dependencies: - debug: 4 - checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d - languageName: node - linkType: hard - -"agentkeepalive@npm:^4.2.1": - version: 4.5.0 - resolution: "agentkeepalive@npm:4.5.0" - dependencies: - humanize-ms: ^1.2.1 - checksum: 13278cd5b125e51eddd5079f04d6fe0914ac1b8b91c1f3db2c1822f99ac1a7457869068997784342fe455d59daaff22e14fb7b8c3da4e741896e7e31faf92481 - languageName: node - linkType: hard - -"aggregate-error@npm:^3.0.0": - version: 3.1.0 - resolution: "aggregate-error@npm:3.1.0" - dependencies: - clean-stack: ^2.0.0 - indent-string: ^4.0.0 - checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 - languageName: node - linkType: hard - -"ajv@npm:^6.12.4": - version: 6.12.6 - resolution: "ajv@npm:6.12.6" - 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 - checksum: 874972efe5c4202ab0a68379481fbd3d1b5d0a7bd6d3cc21d40d3536ebff3352a2a1fabb632d4fd2cc7fe4cbdcd5ed6782084c9bbf7f32a1536d18f9da5007d4 - languageName: node - linkType: hard - -"ansi-regex@npm:^5.0.1": - version: 5.0.1 - resolution: "ansi-regex@npm:5.0.1" - checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b - languageName: node - linkType: hard - -"ansi-regex@npm:^6.0.1": - version: 6.0.1 - resolution: "ansi-regex@npm:6.0.1" - checksum: 1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 - languageName: node - linkType: hard - -"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": - version: 4.3.0 - resolution: "ansi-styles@npm:4.3.0" - dependencies: - color-convert: ^2.0.1 - checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 - languageName: node - linkType: hard - -"ansi-styles@npm:^6.1.0": - version: 6.2.1 - resolution: "ansi-styles@npm:6.2.1" - checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 - languageName: node - linkType: hard - -"anymatch@npm:~3.1.2": - version: 3.1.3 - resolution: "anymatch@npm:3.1.3" - dependencies: - normalize-path: ^3.0.0 - picomatch: ^2.0.4 - checksum: 3e044fd6d1d26545f235a9fe4d7a534e2029d8e59fa7fd9f2a6eb21230f6b5380ea1eaf55136e60cbf8e613544b3b766e7a6fa2102e2a3a117505466e3025dc2 - languageName: node - linkType: hard - -"aproba@npm:^1.0.3 || ^2.0.0": - version: 2.0.0 - resolution: "aproba@npm:2.0.0" - checksum: 5615cadcfb45289eea63f8afd064ab656006361020e1735112e346593856f87435e02d8dcc7ff0d11928bc7d425f27bc7c2a84f6c0b35ab0ff659c814c138a24 - languageName: node - linkType: hard - -"are-we-there-yet@npm:^3.0.0": - version: 3.0.1 - resolution: "are-we-there-yet@npm:3.0.1" - dependencies: - delegates: ^1.0.0 - readable-stream: ^3.6.0 - checksum: 52590c24860fa7173bedeb69a4c05fb573473e860197f618b9a28432ee4379049336727ae3a1f9c4cb083114601c1140cee578376164d0e651217a9843f9fe83 - languageName: node - linkType: hard - -"arg@npm:^4.1.0": - version: 4.1.3 - resolution: "arg@npm:4.1.3" - checksum: 544af8dd3f60546d3e4aff084d451b96961d2267d668670199692f8d054f0415d86fc5497d0e641e91546f0aa920e7c29e5250e99fc89f5552a34b5d93b77f43 - languageName: node - linkType: hard - -"argparse@npm:^2.0.1": - version: 2.0.1 - resolution: "argparse@npm:2.0.1" - checksum: 83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced - languageName: node - linkType: hard - -"array-union@npm:^2.1.0": - version: 2.1.0 - resolution: "array-union@npm:2.1.0" - checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d - languageName: node - linkType: hard - -"async@npm:^3.2.3": - version: 3.2.4 - resolution: "async@npm:3.2.4" - checksum: 43d07459a4e1d09b84a20772414aa684ff4de085cbcaec6eea3c7a8f8150e8c62aa6cd4e699fe8ee93c3a5b324e777d34642531875a0817a35697522c1b02e89 - languageName: node - linkType: hard - -"asynckit@npm:^0.4.0": - version: 0.4.0 - resolution: "asynckit@npm:0.4.0" - checksum: 7b78c451df768adba04e2d02e63e2d0bf3b07adcd6e42b4cf665cb7ce899bedd344c69a1dcbce355b5f972d597b25aaa1c1742b52cffd9caccb22f348114f6be - languageName: node - linkType: hard - -"axios@npm:^1.5.1": - version: 1.5.1 - resolution: "axios@npm:1.5.1" - dependencies: - follow-redirects: ^1.15.0 - form-data: ^4.0.0 - proxy-from-env: ^1.1.0 - checksum: 4444f06601f4ede154183767863d2b8e472b4a6bfc5253597ed6d21899887e1fd0ee2b3de792ac4f8459fe2e359d2aa07c216e45fd8b9e4e0688a6ebf48a5a8d - languageName: node - linkType: hard - -"balanced-match@npm:^1.0.0": - version: 1.0.2 - resolution: "balanced-match@npm:1.0.2" - checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 - languageName: node - linkType: hard - -"binary-extensions@npm:^2.0.0": - version: 2.2.0 - resolution: "binary-extensions@npm:2.2.0" - checksum: ccd267956c58d2315f5d3ea6757cf09863c5fc703e50fbeb13a7dc849b812ef76e3cf9ca8f35a0c48498776a7478d7b4a0418e1e2b8cb9cb9731f2922aaad7f8 - languageName: node - linkType: hard - -"brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" - dependencies: - balanced-match: ^1.0.0 - concat-map: 0.0.1 - checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 - languageName: node - linkType: hard - -"brace-expansion@npm:^2.0.1": - version: 2.0.1 - resolution: "brace-expansion@npm:2.0.1" - dependencies: - balanced-match: ^1.0.0 - checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 - languageName: node - linkType: hard - -"braces@npm:^3.0.2, braces@npm:~3.0.2": - version: 3.0.2 - resolution: "braces@npm:3.0.2" - dependencies: - fill-range: ^7.0.1 - checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 - languageName: node - linkType: hard - -"cacache@npm:^17.0.0": - version: 17.1.4 - resolution: "cacache@npm:17.1.4" - dependencies: - "@npmcli/fs": ^3.1.0 - fs-minipass: ^3.0.0 - glob: ^10.2.2 - lru-cache: ^7.7.1 - minipass: ^7.0.3 - minipass-collect: ^1.0.2 - minipass-flush: ^1.0.5 - minipass-pipeline: ^1.2.4 - p-map: ^4.0.0 - ssri: ^10.0.0 - tar: ^6.1.11 - unique-filename: ^3.0.0 - checksum: b7751df756656954a51201335addced8f63fc53266fa56392c9f5ae83c8d27debffb4458ac2d168a744a4517ec3f2163af05c20097f93d17bdc2dc8a385e14a6 - languageName: node - linkType: hard - -"callsites@npm:^3.0.0": - version: 3.1.0 - resolution: "callsites@npm:3.1.0" - checksum: 072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 - languageName: node - linkType: hard - -"chalk@npm:^4.0.0": - version: 4.1.2 - resolution: "chalk@npm:4.1.2" - dependencies: - ansi-styles: ^4.1.0 - supports-color: ^7.1.0 - checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc - languageName: node - linkType: hard - -"chokidar@npm:^3.5.2": - version: 3.5.3 - resolution: "chokidar@npm:3.5.3" - dependencies: - anymatch: ~3.1.2 - braces: ~3.0.2 - fsevents: ~2.3.2 - glob-parent: ~5.1.2 - is-binary-path: ~2.1.0 - is-glob: ~4.0.1 - normalize-path: ~3.0.0 - readdirp: ~3.6.0 - dependenciesMeta: - fsevents: - optional: true - checksum: b49fcde40176ba007ff361b198a2d35df60d9bb2a5aab228279eb810feae9294a6b4649ab15981304447afe1e6ffbf4788ad5db77235dc770ab777c6e771980c - languageName: node - linkType: hard - -"chownr@npm:^2.0.0": - version: 2.0.0 - resolution: "chownr@npm:2.0.0" - checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f - languageName: node - linkType: hard - -"clean-stack@npm:^2.0.0": - version: 2.2.0 - resolution: "clean-stack@npm:2.2.0" - checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 - languageName: node - linkType: hard - -"color-convert@npm:^1.9.3": - version: 1.9.3 - resolution: "color-convert@npm:1.9.3" - dependencies: - color-name: 1.1.3 - checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 - languageName: node - linkType: hard - -"color-convert@npm:^2.0.1": - version: 2.0.1 - resolution: "color-convert@npm:2.0.1" - dependencies: - color-name: ~1.1.4 - checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 - languageName: node - linkType: hard - -"color-name@npm:1.1.3": - version: 1.1.3 - resolution: "color-name@npm:1.1.3" - checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d - languageName: node - linkType: hard - -"color-name@npm:^1.0.0, color-name@npm:~1.1.4": - version: 1.1.4 - resolution: "color-name@npm:1.1.4" - checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 - languageName: node - linkType: hard - -"color-string@npm:^1.6.0": - version: 1.9.1 - resolution: "color-string@npm:1.9.1" - dependencies: - color-name: ^1.0.0 - simple-swizzle: ^0.2.2 - checksum: c13fe7cff7885f603f49105827d621ce87f4571d78ba28ef4a3f1a104304748f620615e6bf065ecd2145d0d9dad83a3553f52bb25ede7239d18e9f81622f1cc5 - languageName: node - linkType: hard - -"color-support@npm:^1.1.3": - version: 1.1.3 - resolution: "color-support@npm:1.1.3" - bin: - color-support: bin.js - checksum: 9b7356817670b9a13a26ca5af1c21615463b500783b739b7634a0c2047c16cef4b2865d7576875c31c3cddf9dd621fa19285e628f20198b233a5cfdda6d0793b - languageName: node - linkType: hard - -"color@npm:^3.1.3": - version: 3.2.1 - resolution: "color@npm:3.2.1" - dependencies: - color-convert: ^1.9.3 - color-string: ^1.6.0 - checksum: f81220e8b774d35865c2561be921f5652117638dcda7ca4029262046e37fc2444ac7bbfdd110cf1fd9c074a4ee5eda8f85944ffbdda26186b602dd9bb05f6400 - languageName: node - linkType: hard - -"colorspace@npm:1.1.x": - version: 1.1.4 - resolution: "colorspace@npm:1.1.4" - dependencies: - color: ^3.1.3 - text-hex: 1.0.x - checksum: bb3934ef3c417e961e6d03d7ca60ea6e175947029bfadfcdb65109b01881a1c0ecf9c2b0b59abcd0ee4a0d7c1eae93beed01b0e65848936472270a0b341ebce8 - languageName: node - linkType: hard - -"combined-stream@npm:^1.0.8": - version: 1.0.8 - resolution: "combined-stream@npm:1.0.8" - dependencies: - delayed-stream: ~1.0.0 - checksum: 49fa4aeb4916567e33ea81d088f6584749fc90c7abec76fd516bf1c5aa5c79f3584b5ba3de6b86d26ddd64bae5329c4c7479343250cfe71c75bb366eae53bb7c - languageName: node - linkType: hard - -"concat-map@npm:0.0.1": - version: 0.0.1 - resolution: "concat-map@npm:0.0.1" - checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af - languageName: node - linkType: hard - -"console-control-strings@npm:^1.1.0": - version: 1.1.0 - resolution: "console-control-strings@npm:1.1.0" - checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed - languageName: node - linkType: hard - -"create-require@npm:^1.1.0": - version: 1.1.1 - resolution: "create-require@npm:1.1.1" - checksum: a9a1503d4390d8b59ad86f4607de7870b39cad43d929813599a23714831e81c520bddf61bcdd1f8e30f05fd3a2b71ae8538e946eb2786dc65c2bbc520f692eff - languageName: node - linkType: hard - -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" - dependencies: - path-key: ^3.1.0 - shebang-command: ^2.0.0 - which: ^2.0.1 - checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 - languageName: node - linkType: hard - -"debug@npm:4, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": - version: 4.3.4 - resolution: "debug@npm:4.3.4" - dependencies: - ms: 2.1.2 - peerDependenciesMeta: - supports-color: - optional: true - checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 - languageName: node - linkType: hard - -"debug@npm:^3.2.7": - version: 3.2.7 - resolution: "debug@npm:3.2.7" - dependencies: - ms: ^2.1.1 - checksum: b3d8c5940799914d30314b7c3304a43305fd0715581a919dacb8b3176d024a782062368405b47491516d2091d6462d4d11f2f4974a405048094f8bfebfa3071c - languageName: node - linkType: hard - -"deep-is@npm:^0.1.3": - version: 0.1.4 - resolution: "deep-is@npm:0.1.4" - checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 - languageName: node - linkType: hard - -"delayed-stream@npm:~1.0.0": - version: 1.0.0 - resolution: "delayed-stream@npm:1.0.0" - checksum: 46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020 - languageName: node - linkType: hard - -"delegates@npm:^1.0.0": - version: 1.0.0 - resolution: "delegates@npm:1.0.0" - checksum: a51744d9b53c164ba9c0492471a1a2ffa0b6727451bdc89e31627fdf4adda9d51277cfcbfb20f0a6f08ccb3c436f341df3e92631a3440226d93a8971724771fd - languageName: node - linkType: hard - -"diff@npm:^4.0.1": - version: 4.0.2 - resolution: "diff@npm:4.0.2" - checksum: f2c09b0ce4e6b301c221addd83bf3f454c0bc00caa3dd837cf6c127d6edf7223aa2bbe3b688feea110b7f262adbfc845b757c44c8a9f8c0c5b15d8fa9ce9d20d - languageName: node - linkType: hard - -"dir-glob@npm:^3.0.1": - version: 3.0.1 - resolution: "dir-glob@npm:3.0.1" - dependencies: - path-type: ^4.0.0 - checksum: fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 - languageName: node - linkType: hard - -"doctrine@npm:^3.0.0": - version: 3.0.0 - resolution: "doctrine@npm:3.0.0" - dependencies: - esutils: ^2.0.2 - checksum: fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce - languageName: node - linkType: hard - -"dotenv@npm:^16.3.1": - version: 16.3.1 - resolution: "dotenv@npm:16.3.1" - checksum: 15d75e7279018f4bafd0ee9706593dd14455ddb71b3bcba9c52574460b7ccaf67d5cf8b2c08a5af1a9da6db36c956a04a1192b101ee102a3e0cf8817bbcf3dfd - languageName: node - linkType: hard - -"eastasianwidth@npm:^0.2.0": - version: 0.2.0 - resolution: "eastasianwidth@npm:0.2.0" - checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed - languageName: node - linkType: hard - -"emoji-regex@npm:^8.0.0": - version: 8.0.0 - resolution: "emoji-regex@npm:8.0.0" - checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 - languageName: node - linkType: hard - -"emoji-regex@npm:^9.2.2": - version: 9.2.2 - resolution: "emoji-regex@npm:9.2.2" - checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601 - languageName: node - linkType: hard - -"enabled@npm:2.0.x": - version: 2.0.0 - resolution: "enabled@npm:2.0.0" - checksum: 9d256d89f4e8a46ff988c6a79b22fa814b4ffd82826c4fdacd9b42e9b9465709d3b748866d0ab4d442dfc6002d81de7f7b384146ccd1681f6a7f868d2acca063 - languageName: node - linkType: hard - -"encoding@npm:^0.1.13": - version: 0.1.13 - resolution: "encoding@npm:0.1.13" - dependencies: - iconv-lite: ^0.6.2 - checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f - languageName: node - linkType: hard - -"env-paths@npm:^2.2.0": - version: 2.2.1 - resolution: "env-paths@npm:2.2.1" - checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e - languageName: node - linkType: hard - -"err-code@npm:^2.0.2": - version: 2.0.3 - resolution: "err-code@npm:2.0.3" - checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^4.0.0": - version: 4.0.0 - resolution: "escape-string-regexp@npm:4.0.0" - checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 - languageName: node - linkType: hard - -"eslint-config-prettier@npm:^9.0.0": - version: 9.0.0 - resolution: "eslint-config-prettier@npm:9.0.0" - peerDependencies: - eslint: ">=7.0.0" - bin: - eslint-config-prettier: bin/cli.js - checksum: 362e991b6cb343f79362bada2d97c202e5303e6865888918a7445c555fb75e4c078b01278e90be98aa98ae22f8597d8e93d48314bec6824f540f7efcab3ce451 - languageName: node - linkType: hard - -"eslint-scope@npm:^7.2.2": - version: 7.2.2 - resolution: "eslint-scope@npm:7.2.2" - dependencies: - esrecurse: ^4.3.0 - estraverse: ^5.2.0 - checksum: ec97dbf5fb04b94e8f4c5a91a7f0a6dd3c55e46bfc7bbcd0e3138c3a76977570e02ed89a1810c778dcd72072ff0e9621ba1379b4babe53921d71e2e4486fda3e - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": - version: 3.4.3 - resolution: "eslint-visitor-keys@npm:3.4.3" - checksum: 36e9ef87fca698b6fd7ca5ca35d7b2b6eeaaf106572e2f7fd31c12d3bfdaccdb587bba6d3621067e5aece31c8c3a348b93922ab8f7b2cbc6aaab5e1d89040c60 - languageName: node - linkType: hard - -"eslint@npm:^8.51.0": - version: 8.51.0 - resolution: "eslint@npm:8.51.0" - dependencies: - "@eslint-community/eslint-utils": ^4.2.0 - "@eslint-community/regexpp": ^4.6.1 - "@eslint/eslintrc": ^2.1.2 - "@eslint/js": 8.51.0 - "@humanwhocodes/config-array": ^0.11.11 - "@humanwhocodes/module-importer": ^1.0.1 - "@nodelib/fs.walk": ^1.2.8 - 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 - bin: - eslint: bin/eslint.js - checksum: 214fa5d1fcb67af1b8992ce9584ccd85e1aa7a482f8b8ea5b96edc28fa838a18a3b69456db45fc1ed3ef95f1e9efa9714f737292dc681e572d471d02fda9649c - languageName: node - linkType: hard - -"espree@npm:^9.6.0, espree@npm:^9.6.1": - version: 9.6.1 - resolution: "espree@npm:9.6.1" - dependencies: - acorn: ^8.9.0 - acorn-jsx: ^5.3.2 - eslint-visitor-keys: ^3.4.1 - checksum: eb8c149c7a2a77b3f33a5af80c10875c3abd65450f60b8af6db1bfcfa8f101e21c1e56a561c6dc13b848e18148d43469e7cd208506238554fb5395a9ea5a1ab9 - languageName: node - linkType: hard - -"esquery@npm:^1.4.2": - version: 1.5.0 - resolution: "esquery@npm:1.5.0" - dependencies: - estraverse: ^5.1.0 - checksum: aefb0d2596c230118656cd4ec7532d447333a410a48834d80ea648b1e7b5c9bc9ed8b5e33a89cb04e487b60d622f44cf5713bf4abed7c97343edefdc84a35900 - languageName: node - linkType: hard - -"esrecurse@npm:^4.3.0": - version: 4.3.0 - resolution: "esrecurse@npm:4.3.0" - dependencies: - estraverse: ^5.2.0 - checksum: ebc17b1a33c51cef46fdc28b958994b1dc43cd2e86237515cbc3b4e5d2be6a811b2315d0a1a4d9d340b6d2308b15322f5c8291059521cc5f4802f65e7ec32837 - languageName: node - linkType: hard - -"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": - version: 5.3.0 - resolution: "estraverse@npm:5.3.0" - checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b - languageName: node - linkType: hard - -"esutils@npm:^2.0.2": - version: 2.0.3 - resolution: "esutils@npm:2.0.3" - checksum: 22b5b08f74737379a840b8ed2036a5fb35826c709ab000683b092d9054e5c2a82c27818f12604bfc2a9a76b90b6834ef081edbc1c7ae30d1627012e067c6ec87 - languageName: node - linkType: hard - -"exponential-backoff@npm:^3.1.1": - version: 3.1.1 - resolution: "exponential-backoff@npm:3.1.1" - checksum: 3d21519a4f8207c99f7457287291316306255a328770d320b401114ec8481986e4e467e854cb9914dd965e0a1ca810a23ccb559c642c88f4c7f55c55778a9b48 - languageName: node - linkType: hard - -"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": - version: 3.1.3 - resolution: "fast-deep-equal@npm:3.1.3" - checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d - languageName: node - linkType: hard - -"fast-glob@npm:^3.2.9": - version: 3.3.1 - resolution: "fast-glob@npm:3.3.1" - 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 - checksum: b6f3add6403e02cf3a798bfbb1183d0f6da2afd368f27456010c0bc1f9640aea308243d4cb2c0ab142f618276e65ecb8be1661d7c62a7b4e5ba774b9ce5432e5 - languageName: node - linkType: hard - -"fast-json-stable-stringify@npm:^2.0.0": - version: 2.1.0 - resolution: "fast-json-stable-stringify@npm:2.1.0" - checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb - languageName: node - linkType: hard - -"fast-levenshtein@npm:^2.0.6": - version: 2.0.6 - resolution: "fast-levenshtein@npm:2.0.6" - checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c - languageName: node - linkType: hard - -"fastq@npm:^1.6.0": - version: 1.15.0 - resolution: "fastq@npm:1.15.0" - dependencies: - reusify: ^1.0.4 - checksum: 0170e6bfcd5d57a70412440b8ef600da6de3b2a6c5966aeaf0a852d542daff506a0ee92d6de7679d1de82e644bce69d7a574a6c93f0b03964b5337eed75ada1a - languageName: node - linkType: hard - -"fecha@npm:^4.2.0": - version: 4.2.3 - resolution: "fecha@npm:4.2.3" - checksum: f94e2fb3acf5a7754165d04549460d3ae6c34830394d20c552197e3e000035d69732d74af04b9bed3283bf29fe2a9ebdcc0085e640b0be3cc3658b9726265e31 - languageName: node - linkType: hard - -"file-entry-cache@npm:^6.0.1": - version: 6.0.1 - resolution: "file-entry-cache@npm:6.0.1" - dependencies: - flat-cache: ^3.0.4 - checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 - languageName: node - linkType: hard - -"fill-range@npm:^7.0.1": - version: 7.0.1 - resolution: "fill-range@npm:7.0.1" - dependencies: - to-regex-range: ^5.0.1 - checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 - languageName: node - linkType: hard - -"find-up@npm:^5.0.0": - version: 5.0.0 - resolution: "find-up@npm:5.0.0" - dependencies: - locate-path: ^6.0.0 - path-exists: ^4.0.0 - checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 - languageName: node - linkType: hard - -"flat-cache@npm:^3.0.4": - version: 3.1.1 - resolution: "flat-cache@npm:3.1.1" - dependencies: - flatted: ^3.2.9 - keyv: ^4.5.3 - rimraf: ^3.0.2 - checksum: 4958cfe0f46acf84953d4e16676ef5f0d38eab3a92d532a1e8d5f88f11eea8b36d5d598070ff2aeae15f1fde18f8d7d089eefaf9db10b5a587cc1c9072325c7a - languageName: node - linkType: hard - -"flatted@npm:^3.2.9": - version: 3.2.9 - resolution: "flatted@npm:3.2.9" - checksum: f14167fbe26a9d20f6fca8d998e8f1f41df72c8e81f9f2c9d61ed2bea058248f5e1cbd05e7f88c0e5087a6a0b822a1e5e2b446e879f3cfbe0b07ba2d7f80b026 - languageName: node - linkType: hard - -"fn.name@npm:1.x.x": - version: 1.1.0 - resolution: "fn.name@npm:1.1.0" - checksum: e357144f48cfc9a7f52a82bbc6c23df7c8de639fce049cac41d41d62cabb740cdb9f14eddc6485e29c933104455bdd7a69bb14a9012cef9cd4fa252a4d0cf293 - languageName: node - linkType: hard - -"follow-redirects@npm:^1.15.0": - version: 1.15.3 - resolution: "follow-redirects@npm:1.15.3" - peerDependenciesMeta: - debug: - optional: true - checksum: 584da22ec5420c837bd096559ebfb8fe69d82512d5585004e36a3b4a6ef6d5905780e0c74508c7b72f907d1fa2b7bd339e613859e9c304d0dc96af2027fd0231 - languageName: node - linkType: hard - -"foreground-child@npm:^3.1.0": - version: 3.1.1 - resolution: "foreground-child@npm:3.1.1" - dependencies: - cross-spawn: ^7.0.0 - signal-exit: ^4.0.1 - checksum: 139d270bc82dc9e6f8bc045fe2aae4001dc2472157044fdfad376d0a3457f77857fa883c1c8b21b491c6caade9a926a4bed3d3d2e8d3c9202b151a4cbbd0bcd5 - languageName: node - linkType: hard - -"form-data@npm:^4.0.0": - version: 4.0.0 - resolution: "form-data@npm:4.0.0" - dependencies: - asynckit: ^0.4.0 - combined-stream: ^1.0.8 - mime-types: ^2.1.12 - checksum: 01135bf8675f9d5c61ff18e2e2932f719ca4de964e3be90ef4c36aacfc7b9cb2fceb5eca0b7e0190e3383fe51c5b37f4cb80b62ca06a99aaabfcfd6ac7c9328c - languageName: node - linkType: hard - -"fs-minipass@npm:^2.0.0": - version: 2.1.0 - resolution: "fs-minipass@npm:2.1.0" - dependencies: - minipass: ^3.0.0 - checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1 - languageName: node - linkType: hard - -"fs-minipass@npm:^3.0.0": - version: 3.0.3 - resolution: "fs-minipass@npm:3.0.3" - dependencies: - minipass: ^7.0.3 - checksum: 8722a41109130851d979222d3ec88aabaceeaaf8f57b2a8f744ef8bd2d1ce95453b04a61daa0078822bc5cd21e008814f06fe6586f56fef511e71b8d2394d802 - languageName: node - linkType: hard - -"fs.realpath@npm:^1.0.0": - version: 1.0.0 - resolution: "fs.realpath@npm:1.0.0" - checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 - languageName: node - linkType: hard - -"fsevents@npm:~2.3.2": - version: 2.3.3 - resolution: "fsevents@npm:2.3.3" - dependencies: - node-gyp: latest - checksum: 11e6ea6fea15e42461fc55b4b0e4a0a3c654faa567f1877dbd353f39156f69def97a69936d1746619d656c4b93de2238bf731f6085a03a50cabf287c9d024317 - conditions: os=darwin - languageName: node - linkType: hard - -"fsevents@patch:fsevents@~2.3.2#~builtin": - version: 2.3.3 - resolution: "fsevents@patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=18f3a7" - dependencies: - node-gyp: latest - conditions: os=darwin - languageName: node - linkType: hard - -"gauge@npm:^4.0.3": - version: 4.0.4 - resolution: "gauge@npm:4.0.4" - dependencies: - aproba: ^1.0.3 || ^2.0.0 - color-support: ^1.1.3 - console-control-strings: ^1.1.0 - has-unicode: ^2.0.1 - signal-exit: ^3.0.7 - string-width: ^4.2.3 - strip-ansi: ^6.0.1 - wide-align: ^1.1.5 - checksum: 788b6bfe52f1dd8e263cda800c26ac0ca2ff6de0b6eee2fe0d9e3abf15e149b651bd27bf5226be10e6e3edb5c4e5d5985a5a1a98137e7a892f75eff76467ad2d - languageName: node - linkType: hard - -"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": - version: 5.1.2 - resolution: "glob-parent@npm:5.1.2" - dependencies: - is-glob: ^4.0.1 - checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e - languageName: node - linkType: hard - -"glob-parent@npm:^6.0.2": - version: 6.0.2 - resolution: "glob-parent@npm:6.0.2" - dependencies: - is-glob: ^4.0.3 - checksum: c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8 - languageName: node - linkType: hard - -"glob@npm:^10.2.2": - version: 10.3.10 - resolution: "glob@npm:10.3.10" - dependencies: - foreground-child: ^3.1.0 - jackspeak: ^2.3.5 - minimatch: ^9.0.1 - minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 - path-scurry: ^1.10.1 - bin: - glob: dist/esm/bin.mjs - checksum: 4f2fe2511e157b5a3f525a54092169a5f92405f24d2aed3142f4411df328baca13059f4182f1db1bf933e2c69c0bd89e57ae87edd8950cba8c7ccbe84f721cf3 - languageName: node - linkType: hard - -"glob@npm:^7.1.3, glob@npm:^7.1.4": - version: 7.2.3 - resolution: "glob@npm:7.2.3" - 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 - checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 - languageName: node - linkType: hard - -"globals@npm:^13.19.0": - version: 13.23.0 - resolution: "globals@npm:13.23.0" - dependencies: - type-fest: ^0.20.2 - checksum: 194c97cf8d1ef6ba59417234c2386549c4103b6e5f24b1ff1952de61a4753e5d2069435ba629de711a6480b1b1d114a98e2ab27f85e966d5a10c319c3bbd3dc3 - languageName: node - linkType: hard - -"globby@npm:^11.1.0": - version: 11.1.0 - resolution: "globby@npm:11.1.0" - 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 - checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 - languageName: node - linkType: hard - -"graceful-fs@npm:^4.2.6": - version: 4.2.11 - resolution: "graceful-fs@npm:4.2.11" - checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 - languageName: node - linkType: hard - -"graphemer@npm:^1.4.0": - version: 1.4.0 - resolution: "graphemer@npm:1.4.0" - checksum: bab8f0be9b568857c7bec9fda95a89f87b783546d02951c40c33f84d05bb7da3fd10f863a9beb901463669b6583173a8c8cc6d6b306ea2b9b9d5d3d943c3a673 - languageName: node - linkType: hard - -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b - languageName: node - linkType: hard - -"has-flag@npm:^4.0.0": - version: 4.0.0 - resolution: "has-flag@npm:4.0.0" - checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad - languageName: node - linkType: hard - -"has-unicode@npm:^2.0.1": - version: 2.0.1 - resolution: "has-unicode@npm:2.0.1" - checksum: 1eab07a7436512db0be40a710b29b5dc21fa04880b7f63c9980b706683127e3c1b57cb80ea96d47991bdae2dfe479604f6a1ba410106ee1046a41d1bd0814400 - languageName: node - linkType: hard - -"http-cache-semantics@npm:^4.1.1": - version: 4.1.1 - resolution: "http-cache-semantics@npm:4.1.1" - checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236 - languageName: node - linkType: hard - -"http-proxy-agent@npm:^5.0.0": - version: 5.0.0 - resolution: "http-proxy-agent@npm:5.0.0" - dependencies: - "@tootallnate/once": 2 - agent-base: 6 - debug: 4 - checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786 - languageName: node - linkType: hard - -"https-proxy-agent@npm:^5.0.0": - version: 5.0.1 - resolution: "https-proxy-agent@npm:5.0.1" - dependencies: - agent-base: 6 - debug: 4 - checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 - languageName: node - linkType: hard - -"humanize-ms@npm:^1.2.1": - version: 1.2.1 - resolution: "humanize-ms@npm:1.2.1" - dependencies: - ms: ^2.0.0 - checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16 - languageName: node - linkType: hard - -"iconv-lite@npm:^0.6.2": - version: 0.6.3 - resolution: "iconv-lite@npm:0.6.3" - dependencies: - safer-buffer: ">= 2.1.2 < 3.0.0" - checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf - languageName: node - linkType: hard - -"ignore-by-default@npm:^1.0.1": - version: 1.0.1 - resolution: "ignore-by-default@npm:1.0.1" - checksum: 441509147b3615e0365e407a3c18e189f78c07af08564176c680be1fabc94b6c789cad1342ad887175d4ecd5225de86f73d376cec8e06b42fd9b429505ffcf8a - languageName: node - linkType: hard - -"ignore@npm:^5.2.0, ignore@npm:^5.2.4": - version: 5.2.4 - resolution: "ignore@npm:5.2.4" - checksum: 3d4c309c6006e2621659311783eaea7ebcd41fe4ca1d78c91c473157ad6666a57a2df790fe0d07a12300d9aac2888204d7be8d59f9aaf665b1c7fcdb432517ef - languageName: node - linkType: hard - -"import-fresh@npm:^3.2.1": - version: 3.3.0 - resolution: "import-fresh@npm:3.3.0" - dependencies: - parent-module: ^1.0.0 - resolve-from: ^4.0.0 - checksum: 2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa - languageName: node - linkType: hard - -"imurmurhash@npm:^0.1.4": - version: 0.1.4 - resolution: "imurmurhash@npm:0.1.4" - checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 - languageName: node - linkType: hard - -"indent-string@npm:^4.0.0": - version: 4.0.0 - resolution: "indent-string@npm:4.0.0" - checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 - languageName: node - linkType: hard - -"inflight@npm:^1.0.4": - version: 1.0.6 - resolution: "inflight@npm:1.0.6" - dependencies: - once: ^1.3.0 - wrappy: 1 - checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd - languageName: node - linkType: hard - -"inherits@npm:2, inherits@npm:^2.0.3": - version: 2.0.4 - resolution: "inherits@npm:2.0.4" - checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 - languageName: node - linkType: hard - -"ip@npm:^2.0.0": - version: 2.0.0 - resolution: "ip@npm:2.0.0" - checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349 - languageName: node - linkType: hard - -"is-arrayish@npm:^0.3.1": - version: 0.3.2 - resolution: "is-arrayish@npm:0.3.2" - checksum: 977e64f54d91c8f169b59afcd80ff19227e9f5c791fa28fa2e5bce355cbaf6c2c356711b734656e80c9dd4a854dd7efcf7894402f1031dfc5de5d620775b4d5f - languageName: node - linkType: hard - -"is-binary-path@npm:~2.1.0": - version: 2.1.0 - resolution: "is-binary-path@npm:2.1.0" - dependencies: - binary-extensions: ^2.0.0 - checksum: 84192eb88cff70d320426f35ecd63c3d6d495da9d805b19bc65b518984b7c0760280e57dbf119b7e9be6b161784a5a673ab2c6abe83abb5198a432232ad5b35c - languageName: node - linkType: hard - -"is-extglob@npm:^2.1.1": - version: 2.1.1 - resolution: "is-extglob@npm:2.1.1" - checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^3.0.0": - version: 3.0.0 - resolution: "is-fullwidth-code-point@npm:3.0.0" - checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 - languageName: node - linkType: hard - -"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": - version: 4.0.3 - resolution: "is-glob@npm:4.0.3" - dependencies: - is-extglob: ^2.1.1 - checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 - languageName: node - linkType: hard - -"is-lambda@npm:^1.0.1": - version: 1.0.1 - resolution: "is-lambda@npm:1.0.1" - checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35 - languageName: node - linkType: hard - -"is-number@npm:^7.0.0": - version: 7.0.0 - resolution: "is-number@npm:7.0.0" - checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a - languageName: node - linkType: hard - -"is-path-inside@npm:^3.0.3": - version: 3.0.3 - resolution: "is-path-inside@npm:3.0.3" - checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 - languageName: node - linkType: hard - -"is-stream@npm:^2.0.0": - version: 2.0.1 - resolution: "is-stream@npm:2.0.1" - checksum: b8e05ccdf96ac330ea83c12450304d4a591f9958c11fd17bed240af8d5ffe08aedafa4c0f4cfccd4d28dc9d4d129daca1023633d5c11601a6cbc77521f6fae66 - languageName: node - linkType: hard - -"isexe@npm:^2.0.0": - version: 2.0.0 - resolution: "isexe@npm:2.0.0" - checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 - languageName: node - linkType: hard - -"isows@npm:1.0.3": - version: 1.0.3 - resolution: "isows@npm:1.0.3" - peerDependencies: - ws: "*" - checksum: 9cacd5cf59f67deb51e825580cd445ab1725ecb05a67c704050383fb772856f3cd5e7da8ad08f5a3bd2823680d77d099459d0c6a7037972a74d6429af61af440 - languageName: node - linkType: hard - -"jackspeak@npm:^2.3.5": - version: 2.3.6 - resolution: "jackspeak@npm:2.3.6" - dependencies: - "@isaacs/cliui": ^8.0.2 - "@pkgjs/parseargs": ^0.11.0 - dependenciesMeta: - "@pkgjs/parseargs": - optional: true - checksum: 57d43ad11eadc98cdfe7496612f6bbb5255ea69fe51ea431162db302c2a11011642f50cfad57288bd0aea78384a0612b16e131944ad8ecd09d619041c8531b54 - languageName: node - linkType: hard - -"js-yaml@npm:^4.1.0": - version: 4.1.0 - resolution: "js-yaml@npm:4.1.0" - dependencies: - argparse: ^2.0.1 - bin: - js-yaml: bin/js-yaml.js - checksum: c7830dfd456c3ef2c6e355cc5a92e6700ceafa1d14bba54497b34a99f0376cecbb3e9ac14d3e5849b426d5a5140709a66237a8c991c675431271c4ce5504151a - languageName: node - linkType: hard - -"json-buffer@npm:3.0.1": - version: 3.0.1 - resolution: "json-buffer@npm:3.0.1" - checksum: 9026b03edc2847eefa2e37646c579300a1f3a4586cfb62bf857832b60c852042d0d6ae55d1afb8926163fa54c2b01d83ae24705f34990348bdac6273a29d4581 - languageName: node - linkType: hard - -"json-schema-traverse@npm:^0.4.1": - version: 0.4.1 - resolution: "json-schema-traverse@npm:0.4.1" - checksum: 7486074d3ba247769fda17d5181b345c9fb7d12e0da98b22d1d71a5db9698d8b4bd900a3ec1a4ffdd60846fc2556274a5c894d0c48795f14cb03aeae7b55260b - languageName: node - linkType: hard - -"json-stable-stringify-without-jsonify@npm:^1.0.1": - version: 1.0.1 - resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" - checksum: cff44156ddce9c67c44386ad5cddf91925fe06b1d217f2da9c4910d01f358c6e3989c4d5a02683c7a5667f9727ff05831f7aa8ae66c8ff691c556f0884d49215 - languageName: node - linkType: hard - -"keyv@npm:^4.5.3": - version: 4.5.4 - resolution: "keyv@npm:4.5.4" - dependencies: - json-buffer: 3.0.1 - checksum: 74a24395b1c34bd44ad5cb2b49140d087553e170625240b86755a6604cd65aa16efdbdeae5cdb17ba1284a0fbb25ad06263755dbc71b8d8b06f74232ce3cdd72 - languageName: node - linkType: hard - -"kuler@npm:^2.0.0": - version: 2.0.0 - resolution: "kuler@npm:2.0.0" - checksum: 9e10b5a1659f9ed8761d38df3c35effabffbd19fc6107324095238e4ef0ff044392cae9ac64a1c2dda26e532426485342226b93806bd97504b174b0dcf04ed81 - languageName: node - linkType: hard - -"levn@npm:^0.4.1": - version: 0.4.1 - resolution: "levn@npm:0.4.1" - dependencies: - prelude-ls: ^1.2.1 - type-check: ~0.4.0 - checksum: 12c5021c859bd0f5248561bf139121f0358285ec545ebf48bb3d346820d5c61a4309535c7f387ed7d84361cf821e124ce346c6b7cef8ee09a67c1473b46d0fc4 - languageName: node - linkType: hard - -"locate-path@npm:^6.0.0": - version: 6.0.0 - resolution: "locate-path@npm:6.0.0" - dependencies: - p-locate: ^5.0.0 - checksum: 72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a - languageName: node - linkType: hard - -"lodash.merge@npm:^4.6.2": - version: 4.6.2 - resolution: "lodash.merge@npm:4.6.2" - checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005 - languageName: node - linkType: hard - -"logform@npm:^2.3.2, logform@npm:^2.4.0": - version: 2.6.0 - resolution: "logform@npm:2.6.0" - dependencies: - "@colors/colors": 1.6.0 - "@types/triple-beam": ^1.3.2 - fecha: ^4.2.0 - ms: ^2.1.1 - safe-stable-stringify: ^2.3.1 - triple-beam: ^1.3.0 - checksum: b9ea74bb75e55379ad0eb3e4d65ae6e8d02bc45b431c218162878bf663997ab9258a73104c2b30e09dd2db288bb83c8bf8748e46689d75f5e7e34cf69378d6df - languageName: node - linkType: hard - -"lru-cache@npm:^6.0.0": - version: 6.0.0 - resolution: "lru-cache@npm:6.0.0" - dependencies: - yallist: ^4.0.0 - checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 - languageName: node - linkType: hard - -"lru-cache@npm:^7.7.1": - version: 7.18.3 - resolution: "lru-cache@npm:7.18.3" - checksum: e550d772384709deea3f141af34b6d4fa392e2e418c1498c078de0ee63670f1f46f5eee746e8ef7e69e1c895af0d4224e62ee33e66a543a14763b0f2e74c1356 - languageName: node - linkType: hard - -"lru-cache@npm:^9.1.1 || ^10.0.0": - version: 10.0.1 - resolution: "lru-cache@npm:10.0.1" - checksum: 06f8d0e1ceabd76bb6f644a26dbb0b4c471b79c7b514c13c6856113879b3bf369eb7b497dad4ff2b7e2636db202412394865b33c332100876d838ad1372f0181 - languageName: node - linkType: hard - -"make-error@npm:^1.1.1": - version: 1.3.6 - resolution: "make-error@npm:1.3.6" - checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 - languageName: node - linkType: hard - -"make-fetch-happen@npm:^11.0.3": - version: 11.1.1 - resolution: "make-fetch-happen@npm:11.1.1" - dependencies: - agentkeepalive: ^4.2.1 - cacache: ^17.0.0 - http-cache-semantics: ^4.1.1 - http-proxy-agent: ^5.0.0 - https-proxy-agent: ^5.0.0 - is-lambda: ^1.0.1 - lru-cache: ^7.7.1 - minipass: ^5.0.0 - minipass-fetch: ^3.0.0 - minipass-flush: ^1.0.5 - minipass-pipeline: ^1.2.4 - negotiator: ^0.6.3 - promise-retry: ^2.0.1 - socks-proxy-agent: ^7.0.0 - ssri: ^10.0.0 - checksum: 7268bf274a0f6dcf0343829489a4506603ff34bd0649c12058753900b0eb29191dce5dba12680719a5d0a983d3e57810f594a12f3c18494e93a1fbc6348a4540 - languageName: node - linkType: hard - -"merge2@npm:^1.3.0, merge2@npm:^1.4.1": - version: 1.4.1 - resolution: "merge2@npm:1.4.1" - checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 - languageName: node - linkType: hard - -"micromatch@npm:^4.0.4": - version: 4.0.5 - resolution: "micromatch@npm:4.0.5" - dependencies: - braces: ^3.0.2 - picomatch: ^2.3.1 - checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc - languageName: node - linkType: hard - -"mime-db@npm:1.52.0": - version: 1.52.0 - resolution: "mime-db@npm:1.52.0" - checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f - languageName: node - linkType: hard - -"mime-types@npm:^2.1.12": - version: 2.1.35 - resolution: "mime-types@npm:2.1.35" - dependencies: - mime-db: 1.52.0 - checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836 - languageName: node - linkType: hard - -"minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": - version: 3.1.2 - resolution: "minimatch@npm:3.1.2" - dependencies: - brace-expansion: ^1.1.7 - checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a - languageName: node - linkType: hard - -"minimatch@npm:^9.0.1": - version: 9.0.3 - resolution: "minimatch@npm:9.0.3" - dependencies: - brace-expansion: ^2.0.1 - checksum: 253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5 - languageName: node - linkType: hard - -"minipass-collect@npm:^1.0.2": - version: 1.0.2 - resolution: "minipass-collect@npm:1.0.2" - dependencies: - minipass: ^3.0.0 - checksum: 14df761028f3e47293aee72888f2657695ec66bd7d09cae7ad558da30415fdc4752bbfee66287dcc6fd5e6a2fa3466d6c484dc1cbd986525d9393b9523d97f10 - languageName: node - linkType: hard - -"minipass-fetch@npm:^3.0.0": - version: 3.0.4 - resolution: "minipass-fetch@npm:3.0.4" - dependencies: - encoding: ^0.1.13 - minipass: ^7.0.3 - minipass-sized: ^1.0.3 - minizlib: ^2.1.2 - dependenciesMeta: - encoding: - optional: true - checksum: af7aad15d5c128ab1ebe52e043bdf7d62c3c6f0cecb9285b40d7b395e1375b45dcdfd40e63e93d26a0e8249c9efd5c325c65575aceee192883970ff8cb11364a - languageName: node - linkType: hard - -"minipass-flush@npm:^1.0.5": - version: 1.0.5 - resolution: "minipass-flush@npm:1.0.5" - dependencies: - minipass: ^3.0.0 - checksum: 56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf - languageName: node - linkType: hard - -"minipass-pipeline@npm:^1.2.4": - version: 1.2.4 - resolution: "minipass-pipeline@npm:1.2.4" - dependencies: - minipass: ^3.0.0 - checksum: b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b - languageName: node - linkType: hard - -"minipass-sized@npm:^1.0.3": - version: 1.0.3 - resolution: "minipass-sized@npm:1.0.3" - dependencies: - minipass: ^3.0.0 - checksum: 79076749fcacf21b5d16dd596d32c3b6bf4d6e62abb43868fac21674078505c8b15eaca4e47ed844985a4514854f917d78f588fcd029693709417d8f98b2bd60 - languageName: node - linkType: hard - -"minipass@npm:^3.0.0": - version: 3.3.6 - resolution: "minipass@npm:3.3.6" - dependencies: - yallist: ^4.0.0 - checksum: a30d083c8054cee83cdcdc97f97e4641a3f58ae743970457b1489ce38ee1167b3aaf7d815cd39ec7a99b9c40397fd4f686e83750e73e652b21cb516f6d845e48 - languageName: node - linkType: hard - -"minipass@npm:^5.0.0": - version: 5.0.0 - resolution: "minipass@npm:5.0.0" - checksum: 425dab288738853fded43da3314a0b5c035844d6f3097a8e3b5b29b328da8f3c1af6fc70618b32c29ff906284cf6406b6841376f21caaadd0793c1d5a6a620ea - languageName: node - linkType: hard - -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.3": - version: 7.0.4 - resolution: "minipass@npm:7.0.4" - checksum: 87585e258b9488caf2e7acea242fd7856bbe9a2c84a7807643513a338d66f368c7d518200ad7b70a508664d408aa000517647b2930c259a8b1f9f0984f344a21 - languageName: node - linkType: hard - -"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": - version: 2.1.2 - resolution: "minizlib@npm:2.1.2" - dependencies: - minipass: ^3.0.0 - yallist: ^4.0.0 - checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3 - languageName: node - linkType: hard - -"mkdirp@npm:^1.0.3": - version: 1.0.4 - resolution: "mkdirp@npm:1.0.4" - bin: - mkdirp: bin/cmd.js - checksum: a96865108c6c3b1b8e1d5e9f11843de1e077e57737602de1b82030815f311be11f96f09cce59bd5b903d0b29834733e5313f9301e3ed6d6f6fba2eae0df4298f - languageName: node - linkType: hard - -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f - languageName: node - linkType: hard - -"ms@npm:^2.0.0, ms@npm:^2.1.1": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d - languageName: node - linkType: hard - -"natural-compare@npm:^1.4.0": - version: 1.4.0 - resolution: "natural-compare@npm:1.4.0" - checksum: 23ad088b08f898fc9b53011d7bb78ec48e79de7627e01ab5518e806033861bef68d5b0cd0e2205c2f36690ac9571ff6bcb05eb777ced2eeda8d4ac5b44592c3d - languageName: node - linkType: hard - -"negotiator@npm:^0.6.3": - version: 0.6.3 - resolution: "negotiator@npm:0.6.3" - checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 - languageName: node - linkType: hard - -"node-cron@npm:^3.0.2": - version: 3.0.2 - resolution: "node-cron@npm:3.0.2" - dependencies: - uuid: 8.3.2 - checksum: dd21585c0d4069a0752022dad9b8380a4393c4783ec78355ffa99ff32b018c3743a35d4ebf9d7c7863949e94e302b440f58c884eb4960e71c7260d817e2d3f25 - languageName: node - linkType: hard - -"node-gyp@npm:latest": - version: 9.4.0 - resolution: "node-gyp@npm:9.4.0" - dependencies: - env-paths: ^2.2.0 - exponential-backoff: ^3.1.1 - glob: ^7.1.4 - graceful-fs: ^4.2.6 - make-fetch-happen: ^11.0.3 - nopt: ^6.0.0 - npmlog: ^6.0.0 - rimraf: ^3.0.2 - semver: ^7.3.5 - tar: ^6.1.2 - which: ^2.0.2 - bin: - node-gyp: bin/node-gyp.js - checksum: 78b404e2e0639d64e145845f7f5a3cb20c0520cdaf6dda2f6e025e9b644077202ea7de1232396ba5bde3fee84cdc79604feebe6ba3ec84d464c85d407bb5da99 - languageName: node - linkType: hard - -"nodemon@npm:^3.0.1": - version: 3.0.1 - resolution: "nodemon@npm:3.0.1" - dependencies: - chokidar: ^3.5.2 - debug: ^3.2.7 - ignore-by-default: ^1.0.1 - minimatch: ^3.1.2 - pstree.remy: ^1.1.8 - semver: ^7.5.3 - simple-update-notifier: ^2.0.0 - supports-color: ^5.5.0 - touch: ^3.1.0 - undefsafe: ^2.0.5 - bin: - nodemon: bin/nodemon.js - checksum: 6a5d81855760d6617049eccce10ccf02bddb482dab13ceea5280ae595ec7004eee13e7b934368e3f46c37fe4d970342a8c38c99cae7e93e4d7a3ed1c1ecb6acf - languageName: node - linkType: hard - -"nopt@npm:^6.0.0": - version: 6.0.0 - resolution: "nopt@npm:6.0.0" - dependencies: - abbrev: ^1.0.0 - bin: - nopt: bin/nopt.js - checksum: 82149371f8be0c4b9ec2f863cc6509a7fd0fa729929c009f3a58e4eb0c9e4cae9920e8f1f8eb46e7d032fec8fb01bede7f0f41a67eb3553b7b8e14fa53de1dac - languageName: node - linkType: hard - -"nopt@npm:~1.0.10": - version: 1.0.10 - resolution: "nopt@npm:1.0.10" - dependencies: - abbrev: 1 - bin: - nopt: ./bin/nopt.js - checksum: f62575aceaa3be43f365bf37a596b89bbac2e796b001b6d2e2a85c2140a4e378ff919e2753ccba959c4fd344776fc88c29b393bc167fa939fb1513f126f4cd45 - languageName: node - linkType: hard - -"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": - version: 3.0.0 - resolution: "normalize-path@npm:3.0.0" - checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 - languageName: node - linkType: hard - -"npmlog@npm:^6.0.0": - version: 6.0.2 - resolution: "npmlog@npm:6.0.2" - dependencies: - are-we-there-yet: ^3.0.0 - console-control-strings: ^1.1.0 - gauge: ^4.0.3 - set-blocking: ^2.0.0 - checksum: ae238cd264a1c3f22091cdd9e2b106f684297d3c184f1146984ecbe18aaa86343953f26b9520dedd1b1372bc0316905b736c1932d778dbeb1fcf5a1001390e2a - languageName: node - linkType: hard - -"once@npm:^1.3.0": - version: 1.4.0 - resolution: "once@npm:1.4.0" - dependencies: - wrappy: 1 - checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 - languageName: node - linkType: hard - -"one-time@npm:^1.0.0": - version: 1.0.0 - resolution: "one-time@npm:1.0.0" - dependencies: - fn.name: 1.x.x - checksum: fd008d7e992bdec1c67f53a2f9b46381ee12a9b8c309f88b21f0223546003fb47e8ad7c1fd5843751920a8d276c63bd4b45670ef80c61fb3e07dbccc962b5c7d - languageName: node - linkType: hard - -"optionator@npm:^0.9.3": - version: 0.9.3 - resolution: "optionator@npm:0.9.3" - 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 - checksum: 09281999441f2fe9c33a5eeab76700795365a061563d66b098923eb719251a42bdbe432790d35064d0816ead9296dbeb1ad51a733edf4167c96bd5d0882e428a - languageName: node - linkType: hard - -"p-limit@npm:^3.0.2": - version: 3.1.0 - resolution: "p-limit@npm:3.1.0" - dependencies: - yocto-queue: ^0.1.0 - checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 - languageName: node - linkType: hard - -"p-locate@npm:^5.0.0": - version: 5.0.0 - resolution: "p-locate@npm:5.0.0" - dependencies: - p-limit: ^3.0.2 - checksum: 1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3 - languageName: node - linkType: hard - -"p-map@npm:^4.0.0": - version: 4.0.0 - resolution: "p-map@npm:4.0.0" - dependencies: - aggregate-error: ^3.0.0 - checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c - languageName: node - linkType: hard - -"parent-module@npm:^1.0.0": - version: 1.0.1 - resolution: "parent-module@npm:1.0.1" - dependencies: - callsites: ^3.0.0 - checksum: 6ba8b255145cae9470cf5551eb74be2d22281587af787a2626683a6c20fbb464978784661478dd2a3f1dad74d1e802d403e1b03c1a31fab310259eec8ac560ff - languageName: node - linkType: hard - -"path-exists@npm:^4.0.0": - version: 4.0.0 - resolution: "path-exists@npm:4.0.0" - checksum: 505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 - languageName: node - linkType: hard - -"path-is-absolute@npm:^1.0.0": - version: 1.0.1 - resolution: "path-is-absolute@npm:1.0.1" - checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 - languageName: node - linkType: hard - -"path-key@npm:^3.1.0": - version: 3.1.1 - resolution: "path-key@npm:3.1.1" - checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 - languageName: node - linkType: hard - -"path-scurry@npm:^1.10.1": - version: 1.10.1 - resolution: "path-scurry@npm:1.10.1" - dependencies: - lru-cache: ^9.1.1 || ^10.0.0 - minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 - checksum: e2557cff3a8fb8bc07afdd6ab163a92587884f9969b05bbbaf6fe7379348bfb09af9ed292af12ed32398b15fb443e81692047b786d1eeb6d898a51eb17ed7d90 - languageName: node - linkType: hard - -"path-type@npm:^4.0.0": - version: 4.0.0 - resolution: "path-type@npm:4.0.0" - checksum: 5b1e2daa247062061325b8fdbfd1fb56dde0a448fb1455453276ea18c60685bdad23a445dc148cf87bc216be1573357509b7d4060494a6fd768c7efad833ee45 - languageName: node - linkType: hard - -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1": - version: 2.3.1 - resolution: "picomatch@npm:2.3.1" - checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf - languageName: node - linkType: hard - -"prelude-ls@npm:^1.2.1": - version: 1.2.1 - resolution: "prelude-ls@npm:1.2.1" - checksum: cd192ec0d0a8e4c6da3bb80e4f62afe336df3f76271ac6deb0e6a36187133b6073a19e9727a1ff108cd8b9982e4768850d413baa71214dd80c7979617dca827a - languageName: node - linkType: hard - -"prettier@npm:^3.0.3": - version: 3.0.3 - resolution: "prettier@npm:3.0.3" - bin: - prettier: bin/prettier.cjs - checksum: e10b9af02b281f6c617362ebd2571b1d7fc9fb8a3bd17e371754428cda992e5e8d8b7a046e8f7d3e2da1dcd21aa001e2e3c797402ebb6111b5cd19609dd228e0 - languageName: node - linkType: hard - -"promise-retry@npm:^2.0.1": - version: 2.0.1 - resolution: "promise-retry@npm:2.0.1" - dependencies: - err-code: ^2.0.2 - retry: ^0.12.0 - checksum: f96a3f6d90b92b568a26f71e966cbbc0f63ab85ea6ff6c81284dc869b41510e6cdef99b6b65f9030f0db422bf7c96652a3fff9f2e8fb4a0f069d8f4430359429 - languageName: node - linkType: hard - -"proxy-from-env@npm:^1.1.0": - version: 1.1.0 - resolution: "proxy-from-env@npm:1.1.0" - checksum: ed7fcc2ba0a33404958e34d95d18638249a68c430e30fcb6c478497d72739ba64ce9810a24f53a7d921d0c065e5b78e3822759800698167256b04659366ca4d4 - languageName: node - linkType: hard - -"pstree.remy@npm:^1.1.8": - version: 1.1.8 - resolution: "pstree.remy@npm:1.1.8" - checksum: 5cb53698d6bb34dfb278c8a26957964aecfff3e161af5fbf7cee00bbe9d8547c7aced4bd9cb193bce15fb56e9e4220fc02a5bf9c14345ffb13a36b858701ec2d - languageName: node - linkType: hard - -"punycode@npm:^2.1.0": - version: 2.3.0 - resolution: "punycode@npm:2.3.0" - checksum: 39f760e09a2a3bbfe8f5287cf733ecdad69d6af2fe6f97ca95f24b8921858b91e9ea3c9eeec6e08cede96181b3bb33f95c6ffd8c77e63986508aa2e8159fa200 - languageName: node - linkType: hard - -"queue-microtask@npm:^1.2.2": - version: 1.2.3 - resolution: "queue-microtask@npm:1.2.3" - checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 - languageName: node - linkType: hard - -"readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": - version: 3.6.2 - resolution: "readable-stream@npm:3.6.2" - dependencies: - inherits: ^2.0.3 - string_decoder: ^1.1.1 - util-deprecate: ^1.0.1 - checksum: bdcbe6c22e846b6af075e32cf8f4751c2576238c5043169a1c221c92ee2878458a816a4ea33f4c67623c0b6827c8a400409bfb3cf0bf3381392d0b1dfb52ac8d - languageName: node - linkType: hard - -"readdirp@npm:~3.6.0": - version: 3.6.0 - resolution: "readdirp@npm:3.6.0" - dependencies: - picomatch: ^2.2.1 - checksum: 1ced032e6e45670b6d7352d71d21ce7edf7b9b928494dcaba6f11fba63180d9da6cd7061ebc34175ffda6ff529f481818c962952004d273178acd70f7059b320 - languageName: node - linkType: hard - -"reporter@workspace:.": - version: 0.0.0-use.local - resolution: "reporter@workspace:." - dependencies: - "@types/node": ^20.8.6 - "@types/node-cron": ^3.0.9 - "@typescript-eslint/eslint-plugin": ^6.7.5 - "@typescript-eslint/parser": ^6.7.5 - axios: ^1.5.1 - dotenv: ^16.3.1 - eslint: ^8.51.0 - eslint-config-prettier: ^9.0.0 - node-cron: ^3.0.2 - nodemon: ^3.0.1 - prettier: ^3.0.3 - ts-node: ^10.9.1 - typescript: ^5.2.2 - viem: ^1.16.5 - winston: ^3.11.0 - languageName: unknown - linkType: soft - -"resolve-from@npm:^4.0.0": - version: 4.0.0 - resolution: "resolve-from@npm:4.0.0" - checksum: f4ba0b8494846a5066328ad33ef8ac173801a51739eb4d63408c847da9a2e1c1de1e6cbbf72699211f3d13f8fc1325648b169bd15eb7da35688e30a5fb0e4a7f - languageName: node - linkType: hard - -"retry@npm:^0.12.0": - version: 0.12.0 - resolution: "retry@npm:0.12.0" - checksum: 623bd7d2e5119467ba66202d733ec3c2e2e26568074923bc0585b6b99db14f357e79bdedb63cab56cec47491c4a0da7e6021a7465ca6dc4f481d3898fdd3158c - languageName: node - linkType: hard - -"reusify@npm:^1.0.4": - version: 1.0.4 - resolution: "reusify@npm:1.0.4" - checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc - languageName: node - linkType: hard - -"rimraf@npm:^3.0.2": - version: 3.0.2 - resolution: "rimraf@npm:3.0.2" - dependencies: - glob: ^7.1.3 - bin: - rimraf: bin.js - checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 - languageName: node - linkType: hard - -"run-parallel@npm:^1.1.9": - version: 1.2.0 - resolution: "run-parallel@npm:1.2.0" - dependencies: - queue-microtask: ^1.2.2 - checksum: cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d - languageName: node - linkType: hard - -"safe-buffer@npm:~5.2.0": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 - languageName: node - linkType: hard - -"safe-stable-stringify@npm:^2.3.1": - version: 2.4.3 - resolution: "safe-stable-stringify@npm:2.4.3" - checksum: 3aeb64449706ee1f5ad2459fc99648b131d48e7a1fbb608d7c628020177512dc9d94108a5cb61bbc953985d313d0afea6566d243237743e02870490afef04b43 - languageName: node - linkType: hard - -"safer-buffer@npm:>= 2.1.2 < 3.0.0": - version: 2.1.2 - resolution: "safer-buffer@npm:2.1.2" - checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 - languageName: node - linkType: hard - -"semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4": - version: 7.5.4 - resolution: "semver@npm:7.5.4" - dependencies: - lru-cache: ^6.0.0 - bin: - semver: bin/semver.js - checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 - languageName: node - linkType: hard - -"set-blocking@npm:^2.0.0": - version: 2.0.0 - resolution: "set-blocking@npm:2.0.0" - checksum: 6e65a05f7cf7ebdf8b7c75b101e18c0b7e3dff4940d480efed8aad3a36a4005140b660fa1d804cb8bce911cac290441dc728084a30504d3516ac2ff7ad607b02 - languageName: node - linkType: hard - -"shebang-command@npm:^2.0.0": - version: 2.0.0 - resolution: "shebang-command@npm:2.0.0" - dependencies: - shebang-regex: ^3.0.0 - checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa - languageName: node - linkType: hard - -"shebang-regex@npm:^3.0.0": - version: 3.0.0 - resolution: "shebang-regex@npm:3.0.0" - checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 - languageName: node - linkType: hard - -"signal-exit@npm:^3.0.7": - version: 3.0.7 - resolution: "signal-exit@npm:3.0.7" - checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 - languageName: node - linkType: hard - -"signal-exit@npm:^4.0.1": - version: 4.1.0 - resolution: "signal-exit@npm:4.1.0" - checksum: 64c757b498cb8629ffa5f75485340594d2f8189e9b08700e69199069c8e3070fb3e255f7ab873c05dc0b3cec412aea7402e10a5990cb6a050bd33ba062a6c549 - languageName: node - linkType: hard - -"simple-swizzle@npm:^0.2.2": - version: 0.2.2 - resolution: "simple-swizzle@npm:0.2.2" - dependencies: - is-arrayish: ^0.3.1 - checksum: a7f3f2ab5c76c4472d5c578df892e857323e452d9f392e1b5cf74b74db66e6294a1e1b8b390b519fa1b96b5b613f2a37db6cffef52c3f1f8f3c5ea64eb2d54c0 - languageName: node - linkType: hard - -"simple-update-notifier@npm:^2.0.0": - version: 2.0.0 - resolution: "simple-update-notifier@npm:2.0.0" - dependencies: - semver: ^7.5.3 - checksum: 9ba00d38ce6a29682f64a46213834e4eb01634c2f52c813a9a7b8873ca49cdbb703696f3290f3b27dc067de6d9418b0b84bef22c3eb074acf352529b2d6c27fd - languageName: node - linkType: hard - -"slash@npm:^3.0.0": - version: 3.0.0 - resolution: "slash@npm:3.0.0" - checksum: 94a93fff615f25a999ad4b83c9d5e257a7280c90a32a7cb8b4a87996e4babf322e469c42b7f649fd5796edd8687652f3fb452a86dc97a816f01113183393f11c - languageName: node - linkType: hard - -"smart-buffer@npm:^4.2.0": - version: 4.2.0 - resolution: "smart-buffer@npm:4.2.0" - checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b - languageName: node - linkType: hard - -"socks-proxy-agent@npm:^7.0.0": - version: 7.0.0 - resolution: "socks-proxy-agent@npm:7.0.0" - dependencies: - agent-base: ^6.0.2 - debug: ^4.3.3 - socks: ^2.6.2 - checksum: 720554370154cbc979e2e9ce6a6ec6ced205d02757d8f5d93fe95adae454fc187a5cbfc6b022afab850a5ce9b4c7d73e0f98e381879cf45f66317a4895953846 - languageName: node - linkType: hard - -"socks@npm:^2.6.2": - version: 2.7.1 - resolution: "socks@npm:2.7.1" - dependencies: - ip: ^2.0.0 - smart-buffer: ^4.2.0 - checksum: 259d9e3e8e1c9809a7f5c32238c3d4d2a36b39b83851d0f573bfde5f21c4b1288417ce1af06af1452569cd1eb0841169afd4998f0e04ba04656f6b7f0e46d748 - languageName: node - linkType: hard - -"ssri@npm:^10.0.0": - version: 10.0.5 - resolution: "ssri@npm:10.0.5" - dependencies: - minipass: ^7.0.3 - checksum: 0a31b65f21872dea1ed3f7c200d7bc1c1b91c15e419deca14f282508ba917cbb342c08a6814c7f68ca4ca4116dd1a85da2bbf39227480e50125a1ceffeecb750 - languageName: node - linkType: hard - -"stack-trace@npm:0.0.x": - version: 0.0.10 - resolution: "stack-trace@npm:0.0.10" - checksum: 473036ad32f8c00e889613153d6454f9be0536d430eb2358ca51cad6b95cea08a3cc33cc0e34de66b0dad221582b08ed2e61ef8e13f4087ab690f388362d6610 - languageName: node - linkType: hard - -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.3": - version: 4.2.3 - resolution: "string-width@npm:4.2.3" - dependencies: - emoji-regex: ^8.0.0 - is-fullwidth-code-point: ^3.0.0 - strip-ansi: ^6.0.1 - checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb - languageName: node - linkType: hard - -"string-width@npm:^5.0.1, string-width@npm:^5.1.2": - version: 5.1.2 - resolution: "string-width@npm:5.1.2" - dependencies: - eastasianwidth: ^0.2.0 - emoji-regex: ^9.2.2 - strip-ansi: ^7.0.1 - checksum: 7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 - languageName: node - linkType: hard - -"string_decoder@npm:^1.1.1": - version: 1.3.0 - resolution: "string_decoder@npm:1.3.0" - dependencies: - safe-buffer: ~5.2.0 - checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 - languageName: node - linkType: hard - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": - version: 6.0.1 - resolution: "strip-ansi@npm:6.0.1" - dependencies: - ansi-regex: ^5.0.1 - checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c - languageName: node - linkType: hard - -"strip-ansi@npm:^7.0.1": - version: 7.1.0 - resolution: "strip-ansi@npm:7.1.0" - dependencies: - ansi-regex: ^6.0.1 - checksum: 859c73fcf27869c22a4e4d8c6acfe690064659e84bef9458aa6d13719d09ca88dcfd40cbf31fd0be63518ea1a643fe070b4827d353e09533a5b0b9fd4553d64d - languageName: node - linkType: hard - -"strip-json-comments@npm:^3.1.1": - version: 3.1.1 - resolution: "strip-json-comments@npm:3.1.1" - checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 - languageName: node - linkType: hard - -"supports-color@npm:^5.5.0": - version: 5.5.0 - resolution: "supports-color@npm:5.5.0" - dependencies: - has-flag: ^3.0.0 - checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac - languageName: node - linkType: hard - -"supports-color@npm:^7.1.0": - version: 7.2.0 - resolution: "supports-color@npm:7.2.0" - dependencies: - has-flag: ^4.0.0 - checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a - languageName: node - linkType: hard - -"tar@npm:^6.1.11, tar@npm:^6.1.2": - version: 6.2.0 - resolution: "tar@npm:6.2.0" - dependencies: - chownr: ^2.0.0 - fs-minipass: ^2.0.0 - minipass: ^5.0.0 - minizlib: ^2.1.1 - mkdirp: ^1.0.3 - yallist: ^4.0.0 - checksum: db4d9fe74a2082c3a5016630092c54c8375ff3b280186938cfd104f2e089c4fd9bad58688ef6be9cf186a889671bf355c7cda38f09bbf60604b281715ca57f5c - languageName: node - linkType: hard - -"text-hex@npm:1.0.x": - version: 1.0.0 - resolution: "text-hex@npm:1.0.0" - checksum: 1138f68adc97bf4381a302a24e2352f04992b7b1316c5003767e9b0d3367ffd0dc73d65001ea02b07cd0ecc2a9d186de0cf02f3c2d880b8a522d4ccb9342244a - languageName: node - linkType: hard - -"text-table@npm:^0.2.0": - version: 0.2.0 - resolution: "text-table@npm:0.2.0" - checksum: b6937a38c80c7f84d9c11dd75e49d5c44f71d95e810a3250bd1f1797fc7117c57698204adf676b71497acc205d769d65c16ae8fa10afad832ae1322630aef10a - languageName: node - linkType: hard - -"to-regex-range@npm:^5.0.1": - version: 5.0.1 - resolution: "to-regex-range@npm:5.0.1" - dependencies: - is-number: ^7.0.0 - checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed - languageName: node - linkType: hard - -"touch@npm:^3.1.0": - version: 3.1.0 - resolution: "touch@npm:3.1.0" - dependencies: - nopt: ~1.0.10 - bin: - nodetouch: ./bin/nodetouch.js - checksum: e0be589cb5b0e6dbfce6e7e077d4a0d5f0aba558ef769c6d9c33f635e00d73d5be49da6f8631db302ee073919d82b5b7f56da2987feb28765c95a7673af68647 - languageName: node - linkType: hard - -"triple-beam@npm:^1.3.0": - version: 1.4.1 - resolution: "triple-beam@npm:1.4.1" - checksum: 2e881a3e8e076b6f2b85b9ec9dd4a900d3f5016e6d21183ed98e78f9abcc0149e7d54d79a3f432b23afde46b0885bdcdcbff789f39bc75de796316961ec07f61 - languageName: node - linkType: hard - -"ts-api-utils@npm:^1.0.1": - version: 1.0.3 - resolution: "ts-api-utils@npm:1.0.3" - peerDependencies: - typescript: ">=4.2.0" - checksum: 441cc4489d65fd515ae6b0f4eb8690057add6f3b6a63a36073753547fb6ce0c9ea0e0530220a0b282b0eec535f52c4dfc315d35f8a4c9a91c0def0707a714ca6 - languageName: node - linkType: hard - -"ts-node@npm:^10.9.1": - version: 10.9.1 - resolution: "ts-node@npm:10.9.1" - dependencies: - "@cspotcode/source-map-support": ^0.8.0 - "@tsconfig/node10": ^1.0.7 - "@tsconfig/node12": ^1.0.7 - "@tsconfig/node14": ^1.0.0 - "@tsconfig/node16": ^1.0.2 - acorn: ^8.4.1 - acorn-walk: ^8.1.1 - arg: ^4.1.0 - create-require: ^1.1.0 - diff: ^4.0.1 - make-error: ^1.1.1 - v8-compile-cache-lib: ^3.0.1 - yn: 3.1.1 - peerDependencies: - "@swc/core": ">=1.2.50" - "@swc/wasm": ">=1.2.50" - "@types/node": "*" - typescript: ">=2.7" - peerDependenciesMeta: - "@swc/core": - optional: true - "@swc/wasm": - optional: true - bin: - ts-node: dist/bin.js - ts-node-cwd: dist/bin-cwd.js - ts-node-esm: dist/bin-esm.js - ts-node-script: dist/bin-script.js - ts-node-transpile-only: dist/bin-transpile.js - ts-script: dist/bin-script-deprecated.js - checksum: 090adff1302ab20bd3486e6b4799e90f97726ed39e02b39e566f8ab674fd5bd5f727f43615debbfc580d33c6d9d1c6b1b3ce7d8e3cca3e20530a145ffa232c35 - languageName: node - linkType: hard - -"type-check@npm:^0.4.0, type-check@npm:~0.4.0": - version: 0.4.0 - resolution: "type-check@npm:0.4.0" - dependencies: - prelude-ls: ^1.2.1 - checksum: ec688ebfc9c45d0c30412e41ca9c0cdbd704580eb3a9ccf07b9b576094d7b86a012baebc95681999dd38f4f444afd28504cb3a89f2ef16b31d4ab61a0739025a - languageName: node - linkType: hard - -"type-fest@npm:^0.20.2": - version: 0.20.2 - resolution: "type-fest@npm:0.20.2" - checksum: 4fb3272df21ad1c552486f8a2f8e115c09a521ad7a8db3d56d53718d0c907b62c6e9141ba5f584af3f6830d0872c521357e512381f24f7c44acae583ad517d73 - languageName: node - linkType: hard - -"typescript@npm:^5.2.2": - version: 5.2.2 - resolution: "typescript@npm:5.2.2" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 7912821dac4d962d315c36800fe387cdc0a6298dba7ec171b350b4a6e988b51d7b8f051317786db1094bd7431d526b648aba7da8236607febb26cf5b871d2d3c - languageName: node - linkType: hard - -"typescript@patch:typescript@^5.2.2#~builtin": - version: 5.2.2 - resolution: "typescript@patch:typescript@npm%3A5.2.2#~builtin::version=5.2.2&hash=7ad353" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 07106822b4305de3f22835cbba949a2b35451cad50888759b6818421290ff95d522b38ef7919e70fb381c5fe9c1c643d7dea22c8b31652a717ddbd57b7f4d554 - languageName: node - linkType: hard - -"undefsafe@npm:^2.0.5": - version: 2.0.5 - resolution: "undefsafe@npm:2.0.5" - checksum: f42ab3b5770fedd4ada175fc1b2eb775b78f609156f7c389106aafd231bfc210813ee49f54483d7191d7b76e483bc7f537b5d92d19ded27156baf57592eb02cc - languageName: node - linkType: hard - -"undici-types@npm:~5.25.1": - version: 5.25.3 - resolution: "undici-types@npm:5.25.3" - checksum: ec9d2cc36520cbd9fbe3b3b6c682a87fe5be214699e1f57d1e3d9a2cb5be422e62735f06e0067dc325fd3dd7404c697e4d479f9147dc8a804e049e29f357f2ff - languageName: node - linkType: hard - -"unique-filename@npm:^3.0.0": - version: 3.0.0 - resolution: "unique-filename@npm:3.0.0" - dependencies: - unique-slug: ^4.0.0 - checksum: 8e2f59b356cb2e54aab14ff98a51ac6c45781d15ceaab6d4f1c2228b780193dc70fae4463ce9e1df4479cb9d3304d7c2043a3fb905bdeca71cc7e8ce27e063df - languageName: node - linkType: hard - -"unique-slug@npm:^4.0.0": - version: 4.0.0 - resolution: "unique-slug@npm:4.0.0" - dependencies: - imurmurhash: ^0.1.4 - checksum: 0884b58365af59f89739e6f71e3feacb5b1b41f2df2d842d0757933620e6de08eff347d27e9d499b43c40476cbaf7988638d3acb2ffbcb9d35fd035591adfd15 - languageName: node - linkType: hard - -"uri-js@npm:^4.2.2": - version: 4.4.1 - resolution: "uri-js@npm:4.4.1" - dependencies: - punycode: ^2.1.0 - checksum: 7167432de6817fe8e9e0c9684f1d2de2bb688c94388f7569f7dbdb1587c9f4ca2a77962f134ec90be0cc4d004c939ff0d05acc9f34a0db39a3c797dada262633 - languageName: node - linkType: hard - -"util-deprecate@npm:^1.0.1": - version: 1.0.2 - resolution: "util-deprecate@npm:1.0.2" - checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 - languageName: node - linkType: hard - -"uuid@npm:8.3.2": - version: 8.3.2 - resolution: "uuid@npm:8.3.2" - bin: - uuid: dist/bin/uuid - checksum: 5575a8a75c13120e2f10e6ddc801b2c7ed7d8f3c8ac22c7ed0c7b2ba6383ec0abda88c905085d630e251719e0777045ae3236f04c812184b7c765f63a70e58df - languageName: node - linkType: hard - -"v8-compile-cache-lib@npm:^3.0.1": - version: 3.0.1 - resolution: "v8-compile-cache-lib@npm:3.0.1" - checksum: 78089ad549e21bcdbfca10c08850022b22024cdcc2da9b168bcf5a73a6ed7bf01a9cebb9eac28e03cd23a684d81e0502797e88f3ccd27a32aeab1cfc44c39da0 - languageName: node - linkType: hard - -"viem@npm:^1.16.5": - version: 1.16.6 - resolution: "viem@npm:1.16.6" - dependencies: - "@adraffy/ens-normalize": 1.9.4 - "@noble/curves": 1.2.0 - "@noble/hashes": 1.3.2 - "@scure/bip32": 1.3.2 - "@scure/bip39": 1.2.1 - abitype: 0.9.8 - isows: 1.0.3 - ws: 8.13.0 - peerDependencies: - typescript: ">=5.0.4" - peerDependenciesMeta: - typescript: - optional: true - checksum: 2f116cad184cfc7a9584073451549edfb23c3847b1784f092b80a279b848fe011a054bc4141c923b5bcce1d8493db98284db65416ce72e8ba522225d02786a9a - languageName: node - linkType: hard - -"which@npm:^2.0.1, which@npm:^2.0.2": - version: 2.0.2 - resolution: "which@npm:2.0.2" - dependencies: - isexe: ^2.0.0 - bin: - node-which: ./bin/node-which - checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 - languageName: node - linkType: hard - -"wide-align@npm:^1.1.5": - version: 1.1.5 - resolution: "wide-align@npm:1.1.5" - dependencies: - string-width: ^1.0.2 || 2 || 3 || 4 - checksum: d5fc37cd561f9daee3c80e03b92ed3e84d80dde3365a8767263d03dacfc8fa06b065ffe1df00d8c2a09f731482fcacae745abfbb478d4af36d0a891fad4834d3 - languageName: node - linkType: hard - -"winston-transport@npm:^4.5.0": - version: 4.6.0 - resolution: "winston-transport@npm:4.6.0" - dependencies: - logform: ^2.3.2 - readable-stream: ^3.6.0 - triple-beam: ^1.3.0 - checksum: 19f06ebdbb57cb14cdd48a23145d418d3bbe538851053303f84f04a8a849bb530b78b1495a175059c1299f92945dc61d5421c4914fee32d9a41bc397d84f26d7 - languageName: node - linkType: hard - -"winston@npm:^3.11.0": - version: 3.11.0 - resolution: "winston@npm:3.11.0" - dependencies: - "@colors/colors": ^1.6.0 - "@dabh/diagnostics": ^2.0.2 - async: ^3.2.3 - is-stream: ^2.0.0 - logform: ^2.4.0 - one-time: ^1.0.0 - readable-stream: ^3.4.0 - safe-stable-stringify: ^2.3.1 - stack-trace: 0.0.x - triple-beam: ^1.3.0 - winston-transport: ^4.5.0 - checksum: ca4454070f7a71b19f53c8c1765c59a013dab220edb49161b2e81917751d3e9edc3382430e4fb050feda04fb8463290ecab7cbc9240ec8d3d3b32a121849bbb0 - languageName: node - linkType: hard - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version: 7.0.0 - resolution: "wrap-ansi@npm:7.0.0" - dependencies: - ansi-styles: ^4.0.0 - string-width: ^4.1.0 - strip-ansi: ^6.0.0 - checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b - languageName: node - linkType: hard - -"wrap-ansi@npm:^8.1.0": - version: 8.1.0 - resolution: "wrap-ansi@npm:8.1.0" - dependencies: - ansi-styles: ^6.1.0 - string-width: ^5.0.1 - strip-ansi: ^7.0.1 - checksum: 371733296dc2d616900ce15a0049dca0ef67597d6394c57347ba334393599e800bab03c41d4d45221b6bc967b8c453ec3ae4749eff3894202d16800fdfe0e238 - languageName: node - linkType: hard - -"wrappy@npm:1": - version: 1.0.2 - resolution: "wrappy@npm:1.0.2" - checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 - languageName: node - linkType: hard - -"ws@npm:8.13.0": - version: 8.13.0 - resolution: "ws@npm:8.13.0" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 53e991bbf928faf5dc6efac9b8eb9ab6497c69feeb94f963d648b7a3530a720b19ec2e0ec037344257e05a4f35bd9ad04d9de6f289615ffb133282031b18c61c - languageName: node - linkType: hard - -"yallist@npm:^4.0.0": - version: 4.0.0 - resolution: "yallist@npm:4.0.0" - checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 - languageName: node - linkType: hard - -"yn@npm:3.1.1": - version: 3.1.1 - resolution: "yn@npm:3.1.1" - checksum: 2c487b0e149e746ef48cda9f8bad10fc83693cd69d7f9dcd8be4214e985de33a29c9e24f3c0d6bcf2288427040a8947406ab27f7af67ee9456e6b84854f02dd6 - languageName: node - linkType: hard - -"yocto-queue@npm:^0.1.0": - version: 0.1.0 - resolution: "yocto-queue@npm:0.1.0" - checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 - languageName: node - linkType: hard +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aashutoshrathi/word-wrap@^1.2.3": + "version" "1.2.6" + +"@adraffy/ens-normalize@1.9.4": + "version" "1.9.4" + +"@colors/colors@^1.6.0", "@colors/colors@1.6.0": + "integrity" "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==" + "resolved" "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz" + "version" "1.6.0" + +"@cspotcode/source-map-support@^0.8.0": + "version" "0.8.1" + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@dabh/diagnostics@^2.0.2": + "integrity" "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==" + "resolved" "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz" + "version" "2.0.3" + dependencies: + "colorspace" "1.1.x" + "enabled" "2.0.x" + "kuler" "^2.0.0" + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + "version" "4.4.0" + dependencies: + "eslint-visitor-keys" "^3.3.0" + +"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": + "version" "4.9.1" + +"@eslint/eslintrc@^2.1.2": + "version" "2.1.2" + 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.51.0": + "version" "8.51.0" + +"@humanwhocodes/config-array@^0.11.11": + "version" "0.11.11" + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + "debug" "^4.1.1" + "minimatch" "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + "version" "1.0.1" + +"@humanwhocodes/object-schema@^1.2.1": + "version" "1.2.1" + +"@jridgewell/resolve-uri@^3.0.3": + "version" "3.1.1" + +"@jridgewell/sourcemap-codec@^1.4.10": + "version" "1.4.15" + +"@jridgewell/trace-mapping@0.3.9": + "version" "0.3.9" + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@noble/curves@~1.2.0", "@noble/curves@1.2.0": + "version" "1.2.0" + dependencies: + "@noble/hashes" "1.3.2" + +"@noble/hashes@~1.3.0", "@noble/hashes@~1.3.2", "@noble/hashes@1.3.2": + "version" "1.3.2" + +"@nodelib/fs.scandir@2.1.5": + "version" "2.1.5" + dependencies: + "@nodelib/fs.stat" "2.0.5" + "run-parallel" "^1.1.9" + +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": + "version" "2.0.5" + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + "version" "1.2.8" + dependencies: + "@nodelib/fs.scandir" "2.1.5" + "fastq" "^1.6.0" + +"@scure/base@~1.1.0", "@scure/base@~1.1.2": + "version" "1.1.3" + +"@scure/bip32@1.3.2": + "version" "1.3.2" + dependencies: + "@noble/curves" "~1.2.0" + "@noble/hashes" "~1.3.2" + "@scure/base" "~1.1.2" + +"@scure/bip39@1.2.1": + "version" "1.2.1" + dependencies: + "@noble/hashes" "~1.3.0" + "@scure/base" "~1.1.0" + +"@tsconfig/node10@^1.0.7": + "version" "1.0.9" + +"@tsconfig/node12@^1.0.7": + "version" "1.0.11" + +"@tsconfig/node14@^1.0.0": + "version" "1.0.3" + +"@tsconfig/node16@^1.0.2": + "version" "1.0.4" + +"@types/json-schema@^7.0.12": + "version" "7.0.13" + +"@types/node-cron@^3.0.9": + "integrity" "sha512-P10Vf+oagnMbefD31nqjS/dpBM34qzfdpvIgVZwtwsNb0Hg2lDaPFeGcyGUJIqh3zHlDMwYXGeunGgMnswgnPg==" + "resolved" "https://registry.npmjs.org/@types/node-cron/-/node-cron-3.0.9.tgz" + "version" "3.0.9" + +"@types/node@*", "@types/node@^20.8.6": + "integrity" "sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ==" + "resolved" "https://registry.npmjs.org/@types/node/-/node-20.8.6.tgz" + "version" "20.8.6" + dependencies: + "undici-types" "~5.25.1" + +"@types/semver@^7.5.0": + "version" "7.5.3" + +"@types/triple-beam@^1.3.2": + "integrity" "sha512-HlJjF3wxV4R2VQkFpKe0YqJLilYNgtRtsqqZtby7RkVsSs+i+vbyzjtUwpFEdUCKcrGzCiEJE7F/0mKjh0sunA==" + "resolved" "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.4.tgz" + "version" "1.3.4" + +"@typescript-eslint/eslint-plugin@^6.7.5": + "version" "6.7.5" + dependencies: + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "6.7.5" + "@typescript-eslint/type-utils" "6.7.5" + "@typescript-eslint/utils" "6.7.5" + "@typescript-eslint/visitor-keys" "6.7.5" + "debug" "^4.3.4" + "graphemer" "^1.4.0" + "ignore" "^5.2.4" + "natural-compare" "^1.4.0" + "semver" "^7.5.4" + "ts-api-utils" "^1.0.1" + +"@typescript-eslint/parser@^6.0.0 || ^6.0.0-alpha", "@typescript-eslint/parser@^6.7.5": + "version" "6.7.5" + dependencies: + "@typescript-eslint/scope-manager" "6.7.5" + "@typescript-eslint/types" "6.7.5" + "@typescript-eslint/typescript-estree" "6.7.5" + "@typescript-eslint/visitor-keys" "6.7.5" + "debug" "^4.3.4" + +"@typescript-eslint/scope-manager@6.7.5": + "version" "6.7.5" + dependencies: + "@typescript-eslint/types" "6.7.5" + "@typescript-eslint/visitor-keys" "6.7.5" + +"@typescript-eslint/type-utils@6.7.5": + "version" "6.7.5" + dependencies: + "@typescript-eslint/typescript-estree" "6.7.5" + "@typescript-eslint/utils" "6.7.5" + "debug" "^4.3.4" + "ts-api-utils" "^1.0.1" + +"@typescript-eslint/types@6.7.5": + "version" "6.7.5" + +"@typescript-eslint/typescript-estree@6.7.5": + "version" "6.7.5" + dependencies: + "@typescript-eslint/types" "6.7.5" + "@typescript-eslint/visitor-keys" "6.7.5" + "debug" "^4.3.4" + "globby" "^11.1.0" + "is-glob" "^4.0.3" + "semver" "^7.5.4" + "ts-api-utils" "^1.0.1" + +"@typescript-eslint/utils@6.7.5": + "version" "6.7.5" + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.7.5" + "@typescript-eslint/types" "6.7.5" + "@typescript-eslint/typescript-estree" "6.7.5" + "semver" "^7.5.4" + +"@typescript-eslint/visitor-keys@6.7.5": + "version" "6.7.5" + dependencies: + "@typescript-eslint/types" "6.7.5" + "eslint-visitor-keys" "^3.4.1" + +"abbrev@1": + "version" "1.1.1" + +"abitype@0.9.8": + "version" "0.9.8" + +"acorn-jsx@^5.3.2": + "version" "5.3.2" + +"acorn-walk@^8.1.1": + "version" "8.2.0" + +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", "acorn@^8.4.1", "acorn@^8.9.0": + "version" "8.10.0" + +"ajv@^6.12.4": + "version" "6.12.6" + 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" + +"ansi-regex@^5.0.1": + "version" "5.0.1" + +"ansi-styles@^4.1.0": + "version" "4.3.0" + dependencies: + "color-convert" "^2.0.1" + +"anymatch@~3.1.2": + "version" "3.1.3" + dependencies: + "normalize-path" "^3.0.0" + "picomatch" "^2.0.4" + +"arg@^4.1.0": + "version" "4.1.3" + +"argparse@^2.0.1": + "version" "2.0.1" + +"array-union@^2.1.0": + "version" "2.1.0" + +"async@^3.2.3": + "integrity" "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + "resolved" "https://registry.npmjs.org/async/-/async-3.2.4.tgz" + "version" "3.2.4" + +"asynckit@^0.4.0": + "version" "0.4.0" + +"axios@^1.5.1": + "version" "1.5.1" + dependencies: + "follow-redirects" "^1.15.0" + "form-data" "^4.0.0" + "proxy-from-env" "^1.1.0" + +"balanced-match@^1.0.0": + "version" "1.0.2" + +"binary-extensions@^2.0.0": + "version" "2.2.0" + +"brace-expansion@^1.1.7": + "version" "1.1.11" + dependencies: + "balanced-match" "^1.0.0" + "concat-map" "0.0.1" + +"braces@^3.0.2", "braces@~3.0.2": + "version" "3.0.2" + dependencies: + "fill-range" "^7.0.1" + +"callsites@^3.0.0": + "version" "3.1.0" + +"chalk@^4.0.0": + "version" "4.1.2" + dependencies: + "ansi-styles" "^4.1.0" + "supports-color" "^7.1.0" + +"chokidar@^3.5.2": + "version" "3.5.3" + dependencies: + "anymatch" "~3.1.2" + "braces" "~3.0.2" + "glob-parent" "~5.1.2" + "is-binary-path" "~2.1.0" + "is-glob" "~4.0.1" + "normalize-path" "~3.0.0" + "readdirp" "~3.6.0" + optionalDependencies: + "fsevents" "~2.3.2" + +"color-convert@^1.9.3": + "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==" + "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + "version" "1.9.3" + dependencies: + "color-name" "1.1.3" + +"color-convert@^2.0.1": + "version" "2.0.1" + dependencies: + "color-name" "~1.1.4" + +"color-name@^1.0.0", "color-name@~1.1.4": + "version" "1.1.4" + +"color-name@1.1.3": + "integrity" "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + "version" "1.1.3" + +"color-string@^1.6.0": + "integrity" "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==" + "resolved" "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz" + "version" "1.9.1" + dependencies: + "color-name" "^1.0.0" + "simple-swizzle" "^0.2.2" + +"color@^3.1.3": + "integrity" "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==" + "resolved" "https://registry.npmjs.org/color/-/color-3.2.1.tgz" + "version" "3.2.1" + dependencies: + "color-convert" "^1.9.3" + "color-string" "^1.6.0" + +"colorspace@1.1.x": + "integrity" "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==" + "resolved" "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz" + "version" "1.1.4" + dependencies: + "color" "^3.1.3" + "text-hex" "1.0.x" + +"combined-stream@^1.0.8": + "version" "1.0.8" + dependencies: + "delayed-stream" "~1.0.0" + +"concat-map@0.0.1": + "version" "0.0.1" + +"create-require@^1.1.0": + "version" "1.1.1" + +"cross-spawn@^7.0.2": + "version" "7.0.3" + dependencies: + "path-key" "^3.1.0" + "shebang-command" "^2.0.0" + "which" "^2.0.1" + +"debug@^3.2.7": + "version" "3.2.7" + dependencies: + "ms" "^2.1.1" + +"debug@^4.1.1", "debug@^4.3.2", "debug@^4.3.4": + "version" "4.3.4" + dependencies: + "ms" "2.1.2" + +"deep-is@^0.1.3": + "version" "0.1.4" + +"delayed-stream@~1.0.0": + "version" "1.0.0" + +"diff@^4.0.1": + "version" "4.0.2" + +"dir-glob@^3.0.1": + "version" "3.0.1" + dependencies: + "path-type" "^4.0.0" + +"doctrine@^3.0.0": + "version" "3.0.0" + dependencies: + "esutils" "^2.0.2" + +"dotenv@^16.3.1": + "version" "16.3.1" + +"enabled@2.0.x": + "integrity" "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + "resolved" "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz" + "version" "2.0.0" + +"escape-string-regexp@^4.0.0": + "version" "4.0.0" + +"eslint-config-prettier@^9.0.0": + "version" "9.0.0" + +"eslint-scope@^7.2.2": + "version" "7.2.2" + dependencies: + "esrecurse" "^4.3.0" + "estraverse" "^5.2.0" + +"eslint-visitor-keys@^3.3.0", "eslint-visitor-keys@^3.4.1", "eslint-visitor-keys@^3.4.3": + "version" "3.4.3" + +"eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", "eslint@^8.51.0", "eslint@>=7.0.0": + "version" "8.51.0" + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.2" + "@eslint/js" "8.51.0" + "@humanwhocodes/config-array" "^0.11.11" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "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@^9.6.0", "espree@^9.6.1": + "version" "9.6.1" + dependencies: + "acorn" "^8.9.0" + "acorn-jsx" "^5.3.2" + "eslint-visitor-keys" "^3.4.1" + +"esquery@^1.4.2": + "version" "1.5.0" + dependencies: + "estraverse" "^5.1.0" + +"esrecurse@^4.3.0": + "version" "4.3.0" + dependencies: + "estraverse" "^5.2.0" + +"estraverse@^5.1.0", "estraverse@^5.2.0": + "version" "5.3.0" + +"esutils@^2.0.2": + "version" "2.0.3" + +"fast-deep-equal@^3.1.1", "fast-deep-equal@^3.1.3": + "version" "3.1.3" + +"fast-glob@^3.2.9": + "version" "3.3.1" + 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" + +"fast-levenshtein@^2.0.6": + "version" "2.0.6" + +"fastq@^1.6.0": + "version" "1.15.0" + dependencies: + "reusify" "^1.0.4" + +"fecha@^4.2.0": + "integrity" "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + "resolved" "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz" + "version" "4.2.3" + +"file-entry-cache@^6.0.1": + "version" "6.0.1" + dependencies: + "flat-cache" "^3.0.4" + +"fill-range@^7.0.1": + "version" "7.0.1" + dependencies: + "to-regex-range" "^5.0.1" + +"find-up@^5.0.0": + "version" "5.0.0" + dependencies: + "locate-path" "^6.0.0" + "path-exists" "^4.0.0" + +"flat-cache@^3.0.4": + "version" "3.1.1" + dependencies: + "flatted" "^3.2.9" + "keyv" "^4.5.3" + "rimraf" "^3.0.2" + +"flatted@^3.2.9": + "version" "3.2.9" + +"fn.name@1.x.x": + "integrity" "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + "resolved" "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz" + "version" "1.1.0" + +"follow-redirects@^1.15.0": + "version" "1.15.3" + +"form-data@^4.0.0": + "version" "4.0.0" + dependencies: + "asynckit" "^0.4.0" + "combined-stream" "^1.0.8" + "mime-types" "^2.1.12" + +"fs.realpath@^1.0.0": + "version" "1.0.0" + +"glob-parent@^5.1.2", "glob-parent@~5.1.2": + "version" "5.1.2" + dependencies: + "is-glob" "^4.0.1" + +"glob-parent@^6.0.2": + "version" "6.0.2" + dependencies: + "is-glob" "^4.0.3" + +"glob@^7.1.3": + "version" "7.2.3" + 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" + +"globals@^13.19.0": + "version" "13.23.0" + dependencies: + "type-fest" "^0.20.2" + +"globby@^11.1.0": + "version" "11.1.0" + 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" + +"graphemer@^1.4.0": + "version" "1.4.0" + +"has-flag@^3.0.0": + "version" "3.0.0" + +"has-flag@^4.0.0": + "version" "4.0.0" + +"ignore-by-default@^1.0.1": + "version" "1.0.1" + +"ignore@^5.2.0", "ignore@^5.2.4": + "version" "5.2.4" + +"import-fresh@^3.2.1": + "version" "3.3.0" + dependencies: + "parent-module" "^1.0.0" + "resolve-from" "^4.0.0" + +"imurmurhash@^0.1.4": + "version" "0.1.4" + +"inflight@^1.0.4": + "version" "1.0.6" + dependencies: + "once" "^1.3.0" + "wrappy" "1" + +"inherits@^2.0.3", "inherits@2": + "version" "2.0.4" + +"is-arrayish@^0.3.1": + "integrity" "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + "resolved" "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz" + "version" "0.3.2" + +"is-binary-path@~2.1.0": + "version" "2.1.0" + dependencies: + "binary-extensions" "^2.0.0" + +"is-extglob@^2.1.1": + "version" "2.1.1" + +"is-glob@^4.0.0", "is-glob@^4.0.1", "is-glob@^4.0.3", "is-glob@~4.0.1": + "version" "4.0.3" + dependencies: + "is-extglob" "^2.1.1" + +"is-number@^7.0.0": + "version" "7.0.0" + +"is-path-inside@^3.0.3": + "version" "3.0.3" + +"is-stream@^2.0.0": + "integrity" "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + "resolved" "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + "version" "2.0.1" + +"isexe@^2.0.0": + "version" "2.0.0" + +"isows@1.0.3": + "version" "1.0.3" + +"js-yaml@^4.1.0": + "version" "4.1.0" + dependencies: + "argparse" "^2.0.1" + +"json-buffer@3.0.1": + "version" "3.0.1" + +"json-schema-traverse@^0.4.1": + "version" "0.4.1" + +"json-stable-stringify-without-jsonify@^1.0.1": + "version" "1.0.1" + +"keyv@^4.5.3": + "version" "4.5.4" + dependencies: + "json-buffer" "3.0.1" + +"kuler@^2.0.0": + "integrity" "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + "resolved" "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz" + "version" "2.0.0" + +"levn@^0.4.1": + "version" "0.4.1" + dependencies: + "prelude-ls" "^1.2.1" + "type-check" "~0.4.0" + +"locate-path@^6.0.0": + "version" "6.0.0" + dependencies: + "p-locate" "^5.0.0" + +"lodash.merge@^4.6.2": + "version" "4.6.2" + +"logform@^2.3.2", "logform@^2.4.0": + "integrity" "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==" + "resolved" "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz" + "version" "2.6.0" + dependencies: + "@colors/colors" "1.6.0" + "@types/triple-beam" "^1.3.2" + "fecha" "^4.2.0" + "ms" "^2.1.1" + "safe-stable-stringify" "^2.3.1" + "triple-beam" "^1.3.0" + +"lru-cache@^6.0.0": + "version" "6.0.0" + dependencies: + "yallist" "^4.0.0" + +"make-error@^1.1.1": + "version" "1.3.6" + +"merge2@^1.3.0", "merge2@^1.4.1": + "version" "1.4.1" + +"micromatch@^4.0.4": + "version" "4.0.5" + dependencies: + "braces" "^3.0.2" + "picomatch" "^2.3.1" + +"mime-db@1.52.0": + "version" "1.52.0" + +"mime-types@^2.1.12": + "version" "2.1.35" + dependencies: + "mime-db" "1.52.0" + +"minimatch@^3.0.5", "minimatch@^3.1.1", "minimatch@^3.1.2": + "version" "3.1.2" + dependencies: + "brace-expansion" "^1.1.7" + +"ms@^2.1.1", "ms@2.1.2": + "version" "2.1.2" + +"natural-compare@^1.4.0": + "version" "1.4.0" + +"nodemon@^3.0.1": + "version" "3.0.1" + dependencies: + "chokidar" "^3.5.2" + "debug" "^3.2.7" + "ignore-by-default" "^1.0.1" + "minimatch" "^3.1.2" + "pstree.remy" "^1.1.8" + "semver" "^7.5.3" + "simple-update-notifier" "^2.0.0" + "supports-color" "^5.5.0" + "touch" "^3.1.0" + "undefsafe" "^2.0.5" + +"nopt@~1.0.10": + "version" "1.0.10" + dependencies: + "abbrev" "1" + +"normalize-path@^3.0.0", "normalize-path@~3.0.0": + "version" "3.0.0" + +"once@^1.3.0": + "version" "1.4.0" + dependencies: + "wrappy" "1" + +"one-time@^1.0.0": + "integrity" "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==" + "resolved" "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "fn.name" "1.x.x" + +"optionator@^0.9.3": + "version" "0.9.3" + 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" + +"p-limit@^3.0.2": + "version" "3.1.0" + dependencies: + "yocto-queue" "^0.1.0" + +"p-locate@^5.0.0": + "version" "5.0.0" + dependencies: + "p-limit" "^3.0.2" + +"parent-module@^1.0.0": + "version" "1.0.1" + dependencies: + "callsites" "^3.0.0" + +"path-exists@^4.0.0": + "version" "4.0.0" + +"path-is-absolute@^1.0.0": + "version" "1.0.1" + +"path-key@^3.1.0": + "version" "3.1.1" + +"path-type@^4.0.0": + "version" "4.0.0" + +"picomatch@^2.0.4", "picomatch@^2.2.1", "picomatch@^2.3.1": + "version" "2.3.1" + +"prelude-ls@^1.2.1": + "version" "1.2.1" + +"prettier@^3.0.3": + "version" "3.0.3" + +"proxy-from-env@^1.1.0": + "version" "1.1.0" + +"pstree.remy@^1.1.8": + "version" "1.1.8" + +"punycode@^2.1.0": + "version" "2.3.0" + +"queue-microtask@^1.2.2": + "version" "1.2.3" + +"readable-stream@^3.4.0", "readable-stream@^3.6.0": + "integrity" "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==" + "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" + "version" "3.6.2" + dependencies: + "inherits" "^2.0.3" + "string_decoder" "^1.1.1" + "util-deprecate" "^1.0.1" + +"readdirp@~3.6.0": + "version" "3.6.0" + dependencies: + "picomatch" "^2.2.1" + +"resolve-from@^4.0.0": + "version" "4.0.0" + +"reusify@^1.0.4": + "version" "1.0.4" + +"rimraf@^3.0.2": + "version" "3.0.2" + dependencies: + "glob" "^7.1.3" + +"run-parallel@^1.1.9": + "version" "1.2.0" + dependencies: + "queue-microtask" "^1.2.2" + +"safe-buffer@~5.2.0": + "integrity" "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + "version" "5.2.1" + +"safe-stable-stringify@^2.3.1": + "integrity" "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==" + "resolved" "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz" + "version" "2.4.3" + +"semver@^7.5.3", "semver@^7.5.4": + "version" "7.5.4" + dependencies: + "lru-cache" "^6.0.0" + +"shebang-command@^2.0.0": + "version" "2.0.0" + dependencies: + "shebang-regex" "^3.0.0" + +"shebang-regex@^3.0.0": + "version" "3.0.0" + +"simple-swizzle@^0.2.2": + "integrity" "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==" + "resolved" "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" + "version" "0.2.2" + dependencies: + "is-arrayish" "^0.3.1" + +"simple-update-notifier@^2.0.0": + "version" "2.0.0" + dependencies: + "semver" "^7.5.3" + +"slash@^3.0.0": + "version" "3.0.0" + +"stack-trace@0.0.x": + "integrity" "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==" + "resolved" "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz" + "version" "0.0.10" + +"string_decoder@^1.1.1": + "integrity" "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==" + "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + "version" "1.3.0" + dependencies: + "safe-buffer" "~5.2.0" + +"strip-ansi@^6.0.1": + "version" "6.0.1" + dependencies: + "ansi-regex" "^5.0.1" + +"strip-json-comments@^3.1.1": + "version" "3.1.1" + +"supports-color@^5.5.0": + "version" "5.5.0" + dependencies: + "has-flag" "^3.0.0" + +"supports-color@^7.1.0": + "version" "7.2.0" + dependencies: + "has-flag" "^4.0.0" + +"text-hex@1.0.x": + "integrity" "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + "resolved" "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz" + "version" "1.0.0" + +"text-table@^0.2.0": + "version" "0.2.0" + +"to-regex-range@^5.0.1": + "version" "5.0.1" + dependencies: + "is-number" "^7.0.0" + +"touch@^3.1.0": + "version" "3.1.0" + dependencies: + "nopt" "~1.0.10" + +"triple-beam@^1.3.0": + "integrity" "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==" + "resolved" "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz" + "version" "1.4.1" + +"ts-api-utils@^1.0.1": + "version" "1.0.3" + +"ts-node@^10.9.1": + "version" "10.9.1" + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + "acorn" "^8.4.1" + "acorn-walk" "^8.1.1" + "arg" "^4.1.0" + "create-require" "^1.1.0" + "diff" "^4.0.1" + "make-error" "^1.1.1" + "v8-compile-cache-lib" "^3.0.1" + "yn" "3.1.1" + +"type-check@^0.4.0", "type-check@~0.4.0": + "version" "0.4.0" + dependencies: + "prelude-ls" "^1.2.1" + +"type-fest@^0.20.2": + "version" "0.20.2" + +"typescript@^5.2.2", "typescript@>=2.7", "typescript@>=4.2.0", "typescript@>=5.0.4": + "version" "5.2.2" + +"undefsafe@^2.0.5": + "version" "2.0.5" + +"undici-types@~5.25.1": + "integrity" "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==" + "resolved" "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz" + "version" "5.25.3" + +"uri-js@^4.2.2": + "version" "4.4.1" + dependencies: + "punycode" "^2.1.0" + +"util-deprecate@^1.0.1": + "integrity" "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "resolved" "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + "version" "1.0.2" + +"v8-compile-cache-lib@^3.0.1": + "version" "3.0.1" + +"viem@^1.16.5": + "version" "1.16.5" + dependencies: + "@adraffy/ens-normalize" "1.9.4" + "@noble/curves" "1.2.0" + "@noble/hashes" "1.3.2" + "@scure/bip32" "1.3.2" + "@scure/bip39" "1.2.1" + "abitype" "0.9.8" + "isows" "1.0.3" + "ws" "8.13.0" + +"which@^2.0.1": + "version" "2.0.2" + dependencies: + "isexe" "^2.0.0" + +"winston-transport@^4.5.0": + "integrity" "sha512-wbBA9PbPAHxKiygo7ub7BYRiKxms0tpfU2ljtWzb3SjRjv5yl6Ozuy/TkXf00HTAt+Uylo3gSkNwzc4ME0wiIg==" + "resolved" "https://registry.npmjs.org/winston-transport/-/winston-transport-4.6.0.tgz" + "version" "4.6.0" + dependencies: + "logform" "^2.3.2" + "readable-stream" "^3.6.0" + "triple-beam" "^1.3.0" + +"winston@^3.11.0": + "integrity" "sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g==" + "resolved" "https://registry.npmjs.org/winston/-/winston-3.11.0.tgz" + "version" "3.11.0" + dependencies: + "@colors/colors" "^1.6.0" + "@dabh/diagnostics" "^2.0.2" + "async" "^3.2.3" + "is-stream" "^2.0.0" + "logform" "^2.4.0" + "one-time" "^1.0.0" + "readable-stream" "^3.4.0" + "safe-stable-stringify" "^2.3.1" + "stack-trace" "0.0.x" + "triple-beam" "^1.3.0" + "winston-transport" "^4.5.0" + +"wrappy@1": + "version" "1.0.2" + +"ws@*", "ws@8.13.0": + "version" "8.13.0" + +"yallist@^4.0.0": + "version" "4.0.0" + +"yn@3.1.1": + "version" "3.1.1" + +"yocto-queue@^0.1.0": + "version" "0.1.0" From bf7dd35e58ee37277b8536fc7ae3b099e36c2602 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Tue, 24 Oct 2023 11:43:08 +0800 Subject: [PATCH 009/297] fix: second review --- packages/reporter/.env.example | 6 +- .../src/ABIs/WormholeReporterContractABI.json | 76 ------------------- packages/reporter/src/BlockListener.ts | 2 +- packages/reporter/src/MultiClient.ts | 4 +- .../src/controllers/AMBReporterController.ts | 8 +- .../controllers/SygmaReporterController.ts | 35 ++++----- .../TelepathyReporterController.ts | 9 ++- packages/reporter/src/index.ts | 23 +++--- packages/reporter/src/settings/index.ts | 19 +++++ packages/reporter/src/utils/address.json | 16 ---- packages/reporter/src/utils/settings.json | 15 ---- packages/reporter/src/utils/type.ts | 25 ------ 12 files changed, 57 insertions(+), 181 deletions(-) delete mode 100644 packages/reporter/src/ABIs/WormholeReporterContractABI.json create mode 100644 packages/reporter/src/settings/index.ts delete mode 100644 packages/reporter/src/utils/address.json delete mode 100644 packages/reporter/src/utils/settings.json delete mode 100644 packages/reporter/src/utils/type.ts diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index cd3b3ab9..8a9debe3 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -1,17 +1,15 @@ PRIVATE_KEY= +REPORTERS_ENABLED=amb,sygma + GOERLI_RPC_URL= GNOSIS_RPC_URL= SOURCE_CHAIN=goerli DEST_CHAIN=gnosis - -AMB_CONTROLLER=false GAS=30000 -SYGMA_CONTROLLER=false SYGMA_FEE_DATA=0x -TELEPATHY_CONTROLLER=false TELEPATHY_PROOF_API_URL=https://api.telepathy.xyz/api/hashi/ diff --git a/packages/reporter/src/ABIs/WormholeReporterContractABI.json b/packages/reporter/src/ABIs/WormholeReporterContractABI.json deleted file mode 100644 index 93f84c1f..00000000 --- a/packages/reporter/src/ABIs/WormholeReporterContractABI.json +++ /dev/null @@ -1,76 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "contract IWormhole", - "name": "_wormhole", - "type": "address" - }, - { - "internalType": "contract HeaderStorage", - "name": "_headerStorage", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "headerStorage", - "outputs": [ - { - "internalType": "contract HeaderStorage", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "oracleAdapter", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - } - ], - "name": "reportHeader", - "outputs": [ - { - "internalType": "uint64", - "name": "sequence", - "type": "uint64" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "wormhole", - "outputs": [ - { - "internalType": "contract IWormhole", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } -] diff --git a/packages/reporter/src/BlockListener.ts b/packages/reporter/src/BlockListener.ts index fae15207..e027f075 100644 --- a/packages/reporter/src/BlockListener.ts +++ b/packages/reporter/src/BlockListener.ts @@ -2,7 +2,7 @@ import { Chain, publicActions } from "viem" import winston from "winston" import Multiclient from "./MultiClient" -import { BlockListenerConfig } from "./utils/type" +import { BlockListenerConfig } from "./types/index" class BlocksListener { controllers: any[] diff --git a/packages/reporter/src/MultiClient.ts b/packages/reporter/src/MultiClient.ts index 8312a435..6413d584 100644 --- a/packages/reporter/src/MultiClient.ts +++ b/packages/reporter/src/MultiClient.ts @@ -1,4 +1,4 @@ -import { createWalletClient, http, Chain, publicActions } from "viem" +import { createWalletClient, http, Chain, publicActions, WalletClient, PublicClient } from "viem" import { privateKeyToAccount } from "viem/accounts" type ContructorConfigs = { @@ -21,7 +21,7 @@ const getClient = ({ chain, privateKey, rpcUrl }: GetClientsConfigs) => }).extend(publicActions) class Multiclient { - private _clients: { [chainName: string]: any } + private _clients: { [chainName: string]: PublicClient & WalletClient } constructor({ chains, privateKey, rpcUrls }: ContructorConfigs) { this._clients = chains.reduce((_acc: { [chainName: string]: any }, _chain: Chain) => { diff --git a/packages/reporter/src/controllers/AMBReporterController.ts b/packages/reporter/src/controllers/AMBReporterController.ts index c1f4a9fe..5f6426a3 100644 --- a/packages/reporter/src/controllers/AMBReporterController.ts +++ b/packages/reporter/src/controllers/AMBReporterController.ts @@ -5,12 +5,12 @@ import "dotenv/config" import contractABI from "../ABIs/AMBReporterContractABI.json" import Multiclient from "../MultiClient" -import { ControllerConfig } from "../utils/type" +import { ControllerConfig } from "../types/index" class AMBReporterController { sourceChain: Chain destinationChains: Chain[] - isEnabled: boolean = false + name: string = "amb" logger: winston.Logger multiClient: Multiclient reporterAddr: string @@ -18,7 +18,6 @@ class AMBReporterController { constructor(props: ControllerConfig) { this.sourceChain = props.sourceChain this.destinationChains = props.destinationChains - this.isEnabled = props.isEnabled this.logger = props.logger this.multiClient = props.multiClient this.reporterAddr = props.reporterAddress @@ -34,12 +33,13 @@ class AMBReporterController { const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`) for (const chain of this.destinationChains) { + let chainName = chain.name.toLocaleLowerCase() const { result, request } = await client.simulateContract({ account, // calling from account address: this.reporterAddr as `0x${string}`, abi: contractABI, functionName: "reportHeaders", - args: [blockNumbers, this.adapterAddr[chain.name.toLocaleLowerCase()], process.env.GAS], + args: [blockNumbers, this.adapterAddr[chainName], process.env.GAS], }) const txhash = await client.writeContract(request) diff --git a/packages/reporter/src/controllers/SygmaReporterController.ts b/packages/reporter/src/controllers/SygmaReporterController.ts index f1e9f937..9b5eda19 100644 --- a/packages/reporter/src/controllers/SygmaReporterController.ts +++ b/packages/reporter/src/controllers/SygmaReporterController.ts @@ -1,29 +1,28 @@ import { parseEther, Chain } from "viem" -import { gnosis } from "viem/chains" import { privateKeyToAccount } from "viem/accounts" import winston from "winston" import "dotenv/config" import contractABI from "../ABIs/SygmaReporterContractABI.json" import Multiclient from "../MultiClient" -import { ControllerConfig } from "../utils/type" +import { ControllerConfig } from "../types/index" +import { settings } from "../settings" class SygmaReporterController { sourceChain: Chain destinationChains: Chain[] - isEnabled: boolean = false + name: string = "sygma" logger: winston.Logger multiClient: Multiclient - reporterAddr: string - adapterAddr: { [chainName: string]: string } + reporterAddress: string + adapterAddress: { [chainName: string]: string } constructor(props: ControllerConfig) { this.sourceChain = props.sourceChain this.destinationChains = props.destinationChains - this.isEnabled = props.isEnabled this.logger = props.logger this.multiClient = props.multiClient - this.reporterAddr = props.reporterAddress - this.adapterAddr = props.adapterAddress + this.reporterAddress = props.reporterAddress + this.adapterAddress = props.adapterAddress } async onBlocks(blockNumbers: string[]) { @@ -34,13 +33,18 @@ class SygmaReporterController { const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`) for (const chain of this.destinationChains) { - const destDomainId = this.getDomainID(chain) + const chainName = chain.name.toLocaleLowerCase() const { result, request } = await client.simulateContract({ account, // calling from account - address: this.reporterAddr as `0x${string}`, + address: this.reporterAddress as `0x${string}`, abi: contractABI, functionName: "reportHeadersToDomain", - args: [blockNumbers, this.adapterAddr[chain.name.toLocaleLowerCase()], destDomainId, "0x"], + args: [ + blockNumbers, + this.adapterAddress[chainName], + settings.sygmaDomainID[chainName as keyof typeof settings.sygmaDomainID], + "0x", + ], value: parseEther("0.0001"), }) const txhash = await client.writeContract(request) @@ -50,15 +54,6 @@ class SygmaReporterController { this.logger.error(`Sygma: Error from Sygma Controller: ${error}`) } } - - getDomainID(destinationChain: Chain) { - switch (destinationChain) { - case gnosis: - return 101 - default: - return 101 - } - } } export default SygmaReporterController diff --git a/packages/reporter/src/controllers/TelepathyReporterController.ts b/packages/reporter/src/controllers/TelepathyReporterController.ts index 245d7c4d..9f5bf4db 100644 --- a/packages/reporter/src/controllers/TelepathyReporterController.ts +++ b/packages/reporter/src/controllers/TelepathyReporterController.ts @@ -7,13 +7,13 @@ import "dotenv/config" import lightClientContractABI from "../ABIs/TelepathyContractABI.json" import adapterContractABI from "../ABIs/TelepathyAdapterABI.json" import Multiclient from "../MultiClient" -import { ControllerConfig } from "../utils/type" -import settings from "../utils/settings.json" +import { ControllerConfig } from "../types/index" +import { settings } from "../settings" class TelepathyReporterController { sourceChain: Chain destinationChains: Chain[] - isEnabled: boolean = false + name: string = "telepathy" logger: winston.Logger multiClient: Multiclient reporterAddr: string @@ -21,7 +21,6 @@ class TelepathyReporterController { constructor(props: ControllerConfig) { this.sourceChain = props.sourceChain this.destinationChains = props.destinationChains - this.isEnabled = props.isEnabled this.logger = props.logger this.multiClient = props.multiClient this.reporterAddr = props.reporterAddress @@ -46,7 +45,9 @@ class TelepathyReporterController { const blockBuffer = 10n // put 10 blocks before the current block in case the node provider don't sync up at the head const startBlock = currentBlockNumber - queryBlockLength const endBlock = currentBlockNumber - blockBuffer + this.logger.info(`Telepathy: Getting Contract Event from block ${startBlock} to block ${currentBlockNumber}`) + const logs = await client.getContractEvents({ address: lightClientAddr as `0x${string}`, abi: lightClientContractABI, diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 89e7d40b..6107a119 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -1,22 +1,19 @@ import { gnosis, goerli, mainnet } from "viem/chains" +import winston from "winston" +import "dotenv/config" + import Multiclient from "./MultiClient" import AMBReporterController from "./controllers/AMBReporterController" import SygmaReporterController from "./controllers/SygmaReporterController" import TelepathyReporterController from "./controllers/TelepathyReporterController" import BlocksListener from "./BlockListener" -import "dotenv/config" -import winston from "winston" -import settings from "./utils/settings.json" +import { settings } from "./settings/index" + function main() { const goerliRPC = process.env.GOERLI_RPC_URL as string const gnosisRPC = process.env.GNOSIS_RPC_URL as string - const sourceChain = process.env.SOURCE_CHAIN - const destChain = process.env.DEST_CHAIN const privKey = process.env.PRIVATE_KEY as `0x${string}` - const isAMBEnabled = process.env.AMB_CONTROLLER === "true" - const isSygmaEnabled = process.env.SYGMA_CONTROLLER === "true" - const isTelepathyEnabled = process.env.TELEPATHY_CONTROLLER === "true" - const timeFetchBlocksMs = 10 * 1000 + const timeFetchBlocksMs = 5 * 60 * 1000 // modify the frequency here const logger = winston.createLogger({ level: "info", @@ -35,7 +32,6 @@ function main() { const ambReporterController = new AMBReporterController({ sourceChain: goerli, destinationChains: [gnosis], - isEnabled: isAMBEnabled, logger: logger, multiClient: multiClient, reporterAddress: settings.contractAddresses.goerli.AMBReporter, @@ -44,7 +40,6 @@ function main() { const sygmaReporterController = new SygmaReporterController({ sourceChain: goerli, destinationChains: [gnosis], - isEnabled: isSygmaEnabled, logger: logger, multiClient: multiClient, reporterAddress: settings.contractAddresses.goerli.SygmaReporter, @@ -53,22 +48,22 @@ function main() { const telepathyReporterController = new TelepathyReporterController({ sourceChain: goerli, destinationChains: [gnosis], - isEnabled: isTelepathyEnabled, logger: logger, multiClient: multiClient, reporterAddress: "", adapterAddress: { gnosis: settings.contractAddresses.gnosis.SygmaAdapter }, }) + const controllersEnabled = process.env.REPORTERS_ENABLED?.split(",") const blocksListener = new BlocksListener({ controllers: [ambReporterController, sygmaReporterController, telepathyReporterController].filter( - (controller) => controller.isEnabled == true, + (controller) => controllersEnabled?.includes(controller.name), ), timeFetchBlocksMs: timeFetchBlocksMs, logger: logger, multiclient: multiClient, sourceChain: goerli, - queryBlockLength: 100, + queryBlockLength: 100, // modify the query block length here, <256 lastProcessedBlock: 0n, }) blocksListener.start() diff --git a/packages/reporter/src/settings/index.ts b/packages/reporter/src/settings/index.ts new file mode 100644 index 00000000..fb6c68d9 --- /dev/null +++ b/packages/reporter/src/settings/index.ts @@ -0,0 +1,19 @@ +export const settings = { + contractAddresses: { + goerli: { + AMBReporter: "0xedc0b1d3de4496e0d917af42f29cb71eb2982319", + SygmaReporter: "0x2f96d347c932ac73b56e9352ecc0707e25173d88", + }, + mainnet: {}, + gnosis: { + AMBAdapter: "0x01268DB05965CeAc2a89566c42CD550ED7eE5ECD", + SygmaAdapter: "0x9AD7a6f4FDA8247cC0bF5932B68c5b619937dB15", + TelepathyLightClient: "0x34b5378DE786389a477b40dD710812c250185f83", + TelapathyAdapter: "0x2f1E51a2763FB67fe09971Fd8d849716137A3357", + }, + }, + sygmaDomainID: { + gnosis: "101", + goerli: "1", + }, +} diff --git a/packages/reporter/src/utils/address.json b/packages/reporter/src/utils/address.json deleted file mode 100644 index e9e16166..00000000 --- a/packages/reporter/src/utils/address.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "amb": { - "goerli_reporter": "0xedc0b1d3de4496e0d917af42f29cb71eb2982319", - "ethereum_reporter": "", - "gnosis_adapter": "0x01268DB05965CeAc2a89566c42CD550ED7eE5ECD" - }, - "sygma": { - "goerli_reporter": "0x2f96d347c932ac73b56e9352ecc0707e25173d88", - "ethereum_reporter": "", - "gnosis_adapter": "0x9AD7a6f4FDA8247cC0bF5932B68c5b619937dB15" - }, - "telepathy": { - "gnosis_adapter": "0x2f1E51a2763FB67fe09971Fd8d849716137A3357", - "gnosis_light_client": "0x34b5378DE786389a477b40dD710812c250185f83" - } -} diff --git a/packages/reporter/src/utils/settings.json b/packages/reporter/src/utils/settings.json deleted file mode 100644 index acb189f2..00000000 --- a/packages/reporter/src/utils/settings.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "contractAddresses": { - "goerli": { - "AMBReporter": "0xedc0b1d3de4496e0d917af42f29cb71eb2982319", - "SygmaReporter": "0x2f96d347c932ac73b56e9352ecc0707e25173d88" - }, - "mainnet": {}, - "gnosis": { - "AMBAdapter": "0x01268DB05965CeAc2a89566c42CD550ED7eE5ECD", - "SygmaAdapter": "0x9AD7a6f4FDA8247cC0bF5932B68c5b619937dB15", - "TelepathyLightClient": "0x34b5378DE786389a477b40dD710812c250185f83", - "TelapathyAdapter": "0x2f1E51a2763FB67fe09971Fd8d849716137A3357" - } - } -} diff --git a/packages/reporter/src/utils/type.ts b/packages/reporter/src/utils/type.ts deleted file mode 100644 index 00e7848b..00000000 --- a/packages/reporter/src/utils/type.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Chain } from "viem" -import winston = require("winston") -import Multiclient from "../MultiClient" - -type ControllerConfig = { - sourceChain: Chain - destinationChains: Chain[] - reporterAddress: string - adapterAddress: { [chainName: string]: string } - logger: winston.Logger - multiClient: Multiclient - isEnabled: boolean -} - -type BlockListenerConfig = { - controllers: any[] - logger: winston.Logger - timeFetchBlocksMs: number - multiclient: Multiclient - sourceChain: Chain - queryBlockLength: number - lastProcessedBlock: bigint -} - -export { ControllerConfig, BlockListenerConfig } From 79883e088e2fc427a84a1ab4eacb4bb97375d05c Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Tue, 24 Oct 2023 11:44:47 +0800 Subject: [PATCH 010/297] remove unused code --- packages/reporter/src/BlockListener.ts | 2 +- packages/reporter/src/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/reporter/src/BlockListener.ts b/packages/reporter/src/BlockListener.ts index e027f075..4aec356e 100644 --- a/packages/reporter/src/BlockListener.ts +++ b/packages/reporter/src/BlockListener.ts @@ -1,4 +1,4 @@ -import { Chain, publicActions } from "viem" +import { Chain } from "viem" import winston from "winston" import Multiclient from "./MultiClient" diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 6107a119..5489d301 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -1,4 +1,4 @@ -import { gnosis, goerli, mainnet } from "viem/chains" +import { gnosis, goerli } from "viem/chains" import winston from "winston" import "dotenv/config" From a7fe83ecba6b330b4b50e3ab4cb94b39d7a5cabe Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Tue, 24 Oct 2023 13:44:14 +0800 Subject: [PATCH 011/297] remove process.env in class and add data field as constructor parameter --- .../reporter/src/controllers/AMBReporterController.ts | 9 ++++----- .../src/controllers/SygmaReporterController.ts | 8 +++----- .../src/controllers/TelepathyReporterController.ts | 10 +++++----- packages/reporter/src/index.ts | 5 ++++- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/reporter/src/controllers/AMBReporterController.ts b/packages/reporter/src/controllers/AMBReporterController.ts index 5f6426a3..1e7ddebc 100644 --- a/packages/reporter/src/controllers/AMBReporterController.ts +++ b/packages/reporter/src/controllers/AMBReporterController.ts @@ -1,5 +1,4 @@ import { Chain } from "viem" -import { privateKeyToAccount } from "viem/accounts" import winston from "winston" import "dotenv/config" @@ -15,6 +14,8 @@ class AMBReporterController { multiClient: Multiclient reporterAddr: string adapterAddr: { [chainName: string]: string } + gas: string + constructor(props: ControllerConfig) { this.sourceChain = props.sourceChain this.destinationChains = props.destinationChains @@ -22,6 +23,7 @@ class AMBReporterController { this.multiClient = props.multiClient this.reporterAddr = props.reporterAddress this.adapterAddr = props.adapterAddress + this.gas = props.data } async onBlocks(blockNumbers: bigint[]) { @@ -30,16 +32,13 @@ class AMBReporterController { const client = this.multiClient.getClientByChain(this.sourceChain) - const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`) - for (const chain of this.destinationChains) { let chainName = chain.name.toLocaleLowerCase() const { result, request } = await client.simulateContract({ - account, // calling from account address: this.reporterAddr as `0x${string}`, abi: contractABI, functionName: "reportHeaders", - args: [blockNumbers, this.adapterAddr[chainName], process.env.GAS], + args: [blockNumbers, this.adapterAddr[chainName], this.gas], }) const txhash = await client.writeContract(request) diff --git a/packages/reporter/src/controllers/SygmaReporterController.ts b/packages/reporter/src/controllers/SygmaReporterController.ts index 9b5eda19..fd5a1d92 100644 --- a/packages/reporter/src/controllers/SygmaReporterController.ts +++ b/packages/reporter/src/controllers/SygmaReporterController.ts @@ -1,5 +1,4 @@ import { parseEther, Chain } from "viem" -import { privateKeyToAccount } from "viem/accounts" import winston from "winston" import "dotenv/config" @@ -16,6 +15,7 @@ class SygmaReporterController { multiClient: Multiclient reporterAddress: string adapterAddress: { [chainName: string]: string } + gas: string constructor(props: ControllerConfig) { this.sourceChain = props.sourceChain this.destinationChains = props.destinationChains @@ -23,6 +23,7 @@ class SygmaReporterController { this.multiClient = props.multiClient this.reporterAddress = props.reporterAddress this.adapterAddress = props.adapterAddress + this.gas = props.data } async onBlocks(blockNumbers: string[]) { @@ -30,12 +31,9 @@ class SygmaReporterController { this.logger.info("Sygma: Starting Sygma Reporter") const client = this.multiClient.getClientByChain(this.sourceChain) - const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`) - for (const chain of this.destinationChains) { const chainName = chain.name.toLocaleLowerCase() const { result, request } = await client.simulateContract({ - account, // calling from account address: this.reporterAddress as `0x${string}`, abi: contractABI, functionName: "reportHeadersToDomain", @@ -45,7 +43,7 @@ class SygmaReporterController { settings.sygmaDomainID[chainName as keyof typeof settings.sygmaDomainID], "0x", ], - value: parseEther("0.0001"), + value: parseEther(this.gas), }) const txhash = await client.writeContract(request) this.logger.info(`Sygma: TxHash from Sygma Controller: ${txhash}`) diff --git a/packages/reporter/src/controllers/TelepathyReporterController.ts b/packages/reporter/src/controllers/TelepathyReporterController.ts index 9f5bf4db..d703bd15 100644 --- a/packages/reporter/src/controllers/TelepathyReporterController.ts +++ b/packages/reporter/src/controllers/TelepathyReporterController.ts @@ -1,6 +1,5 @@ import axios from "axios" import { hexToNumber, Chain } from "viem" -import { privateKeyToAccount } from "viem/accounts" import winston from "winston" import "dotenv/config" @@ -18,6 +17,7 @@ class TelepathyReporterController { multiClient: Multiclient reporterAddr: string adapterAddr: { [chainName: string]: string } + data: any constructor(props: ControllerConfig) { this.sourceChain = props.sourceChain this.destinationChains = props.destinationChains @@ -25,6 +25,7 @@ class TelepathyReporterController { this.multiClient = props.multiClient this.reporterAddr = props.reporterAddress this.adapterAddr = props.adapterAddress + this.data = props.data } async onBlocks(blockNumbers: string[]) { try { @@ -32,7 +33,6 @@ class TelepathyReporterController { for (const chain of this.destinationChains) { const client = this.multiClient.getClientByChain(chain) - const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`) const adapterAddr = this.adapterAddr[chain.name.toLocaleLowerCase()] const lightClientAddr = settings.contractAddresses.gnosis.TelepathyLightClient @@ -65,13 +65,13 @@ class TelepathyReporterController { // get slot value from first indexed const slotValue = event.topics[1] this.logger.info(`Fetching proof for slot ${slotValue}`) - const postUrl = process.env.TELEPATHY_PROOF_API_URL + "5" + "/" + hexToNumber(slotValue!) + const postUrl = this.data + "5" + "/" + hexToNumber(slotValue!) + const response = await axios.post(postUrl) - this.logger.info(`Telepathy: Response from telepathy proof provider: ${response.data}`) const { chainId, slot, blockNumber, blockNumberProof, blockHash, blockHashProof } = response.data.result this.logger.info(`Telepathy: Calling storeBlockHeader for block number ${blockNumber}`) + const { request, result } = await client.simulateContract({ - account, address: adapterAddr as `0x${string}`, abi: adapterContractABI, functionName: "storeBlockHeader", diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 5489d301..5d034bbb 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -36,6 +36,7 @@ function main() { multiClient: multiClient, reporterAddress: settings.contractAddresses.goerli.AMBReporter, adapterAddress: { gnosis: settings.contractAddresses.gnosis.AMBAdapter }, + data: process.env.GAS, // gas to call amb }) const sygmaReporterController = new SygmaReporterController({ sourceChain: goerli, @@ -44,14 +45,16 @@ function main() { multiClient: multiClient, reporterAddress: settings.contractAddresses.goerli.SygmaReporter, adapterAddress: { gnosis: settings.contractAddresses.gnosis.SygmaAdapter }, + data: "0.0001", // msg.value in ether }) const telepathyReporterController = new TelepathyReporterController({ sourceChain: goerli, destinationChains: [gnosis], logger: logger, multiClient: multiClient, - reporterAddress: "", + reporterAddress: "", // reporter address is not required in telepathy adapterAddress: { gnosis: settings.contractAddresses.gnosis.SygmaAdapter }, + data: process.env.TELEPATHY_PROOF_API_URL, }) const controllersEnabled = process.env.REPORTERS_ENABLED?.split(",") From afb0e587ed39999dde051b315902fd9b8958866b Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Tue, 24 Oct 2023 14:35:27 +0800 Subject: [PATCH 012/297] fix: naming of variables --- packages/reporter/src/BlockListener.ts | 1 - .../src/controllers/AMBReporterController.ts | 26 ++++++------- .../controllers/SygmaReporterController.ts | 22 +++++------ .../TelepathyReporterController.ts | 37 +++++++++---------- packages/reporter/src/index.ts | 27 ++++++++------ 5 files changed, 58 insertions(+), 55 deletions(-) diff --git a/packages/reporter/src/BlockListener.ts b/packages/reporter/src/BlockListener.ts index 4aec356e..7d3bf649 100644 --- a/packages/reporter/src/BlockListener.ts +++ b/packages/reporter/src/BlockListener.ts @@ -40,7 +40,6 @@ class BlocksListener { const client = this.multiclient.getClientByChain(this.sourceChain) const currentBlockNumber = await client.getBlockNumber() - this.logger.info(`Current Block Number: ${currentBlockNumber} , on source chain: ${process.env.SOURCE_CHAIN}`) if (!this.lastProcessedBlock) { this.lastProcessedBlock = await client.getBlockNumber() } diff --git a/packages/reporter/src/controllers/AMBReporterController.ts b/packages/reporter/src/controllers/AMBReporterController.ts index 1e7ddebc..d3de5fde 100644 --- a/packages/reporter/src/controllers/AMBReporterController.ts +++ b/packages/reporter/src/controllers/AMBReporterController.ts @@ -12,18 +12,18 @@ class AMBReporterController { name: string = "amb" logger: winston.Logger multiClient: Multiclient - reporterAddr: string - adapterAddr: { [chainName: string]: string } + reporterAddress: string + adapterAddresses: { [chainName: string]: `0x${string}` } gas: string - constructor(props: ControllerConfig) { - this.sourceChain = props.sourceChain - this.destinationChains = props.destinationChains - this.logger = props.logger - this.multiClient = props.multiClient - this.reporterAddr = props.reporterAddress - this.adapterAddr = props.adapterAddress - this.gas = props.data + constructor(configs: ControllerConfig) { + this.sourceChain = configs.sourceChain + this.destinationChains = configs.destinationChains + this.logger = configs.logger + this.multiClient = configs.multiClient + this.reporterAddress = configs.reporterAddress + this.adapterAddresses = configs.adapterAddresses + this.gas = configs.data } async onBlocks(blockNumbers: bigint[]) { @@ -34,11 +34,11 @@ class AMBReporterController { for (const chain of this.destinationChains) { let chainName = chain.name.toLocaleLowerCase() - const { result, request } = await client.simulateContract({ - address: this.reporterAddr as `0x${string}`, + const { request } = await client.simulateContract({ + address: this.reporterAddress as `0x${string}`, abi: contractABI, functionName: "reportHeaders", - args: [blockNumbers, this.adapterAddr[chainName], this.gas], + args: [blockNumbers, this.adapterAddresses[chainName], this.gas], }) const txhash = await client.writeContract(request) diff --git a/packages/reporter/src/controllers/SygmaReporterController.ts b/packages/reporter/src/controllers/SygmaReporterController.ts index fd5a1d92..55a5ab3c 100644 --- a/packages/reporter/src/controllers/SygmaReporterController.ts +++ b/packages/reporter/src/controllers/SygmaReporterController.ts @@ -14,16 +14,16 @@ class SygmaReporterController { logger: winston.Logger multiClient: Multiclient reporterAddress: string - adapterAddress: { [chainName: string]: string } + adapterAddresses: { [chainName: string]: `0x${string}` } gas: string - constructor(props: ControllerConfig) { - this.sourceChain = props.sourceChain - this.destinationChains = props.destinationChains - this.logger = props.logger - this.multiClient = props.multiClient - this.reporterAddress = props.reporterAddress - this.adapterAddress = props.adapterAddress - this.gas = props.data + constructor(configs: ControllerConfig) { + this.sourceChain = configs.sourceChain + this.destinationChains = configs.destinationChains + this.logger = configs.logger + this.multiClient = configs.multiClient + this.reporterAddress = configs.reporterAddress + this.adapterAddresses = configs.adapterAddresses + this.gas = configs.data } async onBlocks(blockNumbers: string[]) { @@ -33,13 +33,13 @@ class SygmaReporterController { for (const chain of this.destinationChains) { const chainName = chain.name.toLocaleLowerCase() - const { result, request } = await client.simulateContract({ + const { request } = await client.simulateContract({ address: this.reporterAddress as `0x${string}`, abi: contractABI, functionName: "reportHeadersToDomain", args: [ blockNumbers, - this.adapterAddress[chainName], + this.adapterAddresses[chainName], settings.sygmaDomainID[chainName as keyof typeof settings.sygmaDomainID], "0x", ], diff --git a/packages/reporter/src/controllers/TelepathyReporterController.ts b/packages/reporter/src/controllers/TelepathyReporterController.ts index d703bd15..b5146b9b 100644 --- a/packages/reporter/src/controllers/TelepathyReporterController.ts +++ b/packages/reporter/src/controllers/TelepathyReporterController.ts @@ -7,7 +7,6 @@ import lightClientContractABI from "../ABIs/TelepathyContractABI.json" import adapterContractABI from "../ABIs/TelepathyAdapterABI.json" import Multiclient from "../MultiClient" import { ControllerConfig } from "../types/index" -import { settings } from "../settings" class TelepathyReporterController { sourceChain: Chain @@ -15,34 +14,34 @@ class TelepathyReporterController { name: string = "telepathy" logger: winston.Logger multiClient: Multiclient - reporterAddr: string - adapterAddr: { [chainName: string]: string } + reporterAddress: string + adapterAddresses: { [chainName: string]: `0x${string}` } data: any - constructor(props: ControllerConfig) { - this.sourceChain = props.sourceChain - this.destinationChains = props.destinationChains - this.logger = props.logger - this.multiClient = props.multiClient - this.reporterAddr = props.reporterAddress - this.adapterAddr = props.adapterAddress - this.data = props.data + constructor(configs: ControllerConfig) { + this.sourceChain = configs.sourceChain + this.destinationChains = configs.destinationChains + this.logger = configs.logger + this.multiClient = configs.multiClient + this.reporterAddress = configs.reporterAddress + this.adapterAddresses = configs.adapterAddresses + this.data = configs.data } async onBlocks(blockNumbers: string[]) { try { - // Telepathy on support light client on Gnosis at the moment + // Telepathy only support light client on Gnosis at the moment for (const chain of this.destinationChains) { const client = this.multiClient.getClientByChain(chain) - const adapterAddr = this.adapterAddr[chain.name.toLocaleLowerCase()] - const lightClientAddr = settings.contractAddresses.gnosis.TelepathyLightClient + const adapterAddr = this.adapterAddresses[chain.name.toLocaleLowerCase()] + const lightClientAddr = this.data.lightClientAddress // Getting the latest block number from provider const currentBlockNumber = await client.getBlockNumber() - // get contract events from latest block - 1000 : latest block - 10 - const queryBlockLength = 1000n // the number of blocks to query - const blockBuffer = 10n // put 10 blocks before the current block in case the node provider don't sync up at the head + // get contract events from latest block - queryBlockLength : latest block - blockBuffer + const queryBlockLength = BigInt(this.data.queryBlockLength) // the number of blocks to query + const blockBuffer = BigInt(this.data.blockBuffer) // put ${buffer} blocks before the current block in case the node provider don't sync up at the head const startBlock = currentBlockNumber - queryBlockLength const endBlock = currentBlockNumber - blockBuffer @@ -65,13 +64,13 @@ class TelepathyReporterController { // get slot value from first indexed const slotValue = event.topics[1] this.logger.info(`Fetching proof for slot ${slotValue}`) - const postUrl = this.data + "5" + "/" + hexToNumber(slotValue!) + const postUrl = this.data.proofURL + "5" + "/" + hexToNumber(slotValue!) const response = await axios.post(postUrl) const { chainId, slot, blockNumber, blockNumberProof, blockHash, blockHashProof } = response.data.result this.logger.info(`Telepathy: Calling storeBlockHeader for block number ${blockNumber}`) - const { request, result } = await client.simulateContract({ + const { request } = await client.simulateContract({ address: adapterAddr as `0x${string}`, abi: adapterContractABI, functionName: "storeBlockHeader", diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 5d034bbb..2ed27d3d 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -32,29 +32,34 @@ function main() { const ambReporterController = new AMBReporterController({ sourceChain: goerli, destinationChains: [gnosis], - logger: logger, - multiClient: multiClient, + logger, + multiClient, reporterAddress: settings.contractAddresses.goerli.AMBReporter, - adapterAddress: { gnosis: settings.contractAddresses.gnosis.AMBAdapter }, + adapterAddresses: { gnosis: settings.contractAddresses.gnosis.AMBAdapter as `0x${string}` }, data: process.env.GAS, // gas to call amb }) const sygmaReporterController = new SygmaReporterController({ sourceChain: goerli, destinationChains: [gnosis], - logger: logger, - multiClient: multiClient, + logger, + multiClient, reporterAddress: settings.contractAddresses.goerli.SygmaReporter, - adapterAddress: { gnosis: settings.contractAddresses.gnosis.SygmaAdapter }, + adapterAddresses: { gnosis: settings.contractAddresses.gnosis.SygmaAdapter as `0x${string}` }, data: "0.0001", // msg.value in ether }) const telepathyReporterController = new TelepathyReporterController({ sourceChain: goerli, destinationChains: [gnosis], - logger: logger, - multiClient: multiClient, + logger, + multiClient, reporterAddress: "", // reporter address is not required in telepathy - adapterAddress: { gnosis: settings.contractAddresses.gnosis.SygmaAdapter }, - data: process.env.TELEPATHY_PROOF_API_URL, + adapterAddresses: { gnosis: settings.contractAddresses.gnosis.SygmaAdapter as `0x${string}` }, + data: { + proofURL: process.env.TELEPATHY_PROOF_API_URL, + lightClientAddress: settings.contractAddresses.gnosis.TelepathyLightClient, + queryBlockLength: 1000, + blockBuffer: 10, + }, }) const controllersEnabled = process.env.REPORTERS_ENABLED?.split(",") @@ -63,7 +68,7 @@ function main() { (controller) => controllersEnabled?.includes(controller.name), ), timeFetchBlocksMs: timeFetchBlocksMs, - logger: logger, + logger, multiclient: multiClient, sourceChain: goerli, queryBlockLength: 100, // modify the query block length here, <256 From 1fb6f5638be9646c57b407a1aa27586e24cc584d Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Tue, 24 Oct 2023 20:22:45 +0800 Subject: [PATCH 013/297] fix: change BlockListener constructur to config --- packages/reporter/.env.example | 1 - packages/reporter/src/BlockListener.ts | 34 +++++++++---------- .../controllers/SygmaReporterController.ts | 1 + .../TelepathyReporterController.ts | 1 + packages/reporter/src/index.ts | 2 +- 5 files changed, 19 insertions(+), 20 deletions(-) diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index 8a9debe3..0f87811f 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -9,7 +9,6 @@ DEST_CHAIN=gnosis GAS=30000 -SYGMA_FEE_DATA=0x TELEPATHY_PROOF_API_URL=https://api.telepathy.xyz/api/hashi/ diff --git a/packages/reporter/src/BlockListener.ts b/packages/reporter/src/BlockListener.ts index 7d3bf649..611ca2c2 100644 --- a/packages/reporter/src/BlockListener.ts +++ b/packages/reporter/src/BlockListener.ts @@ -13,15 +13,16 @@ class BlocksListener { _interval: ReturnType | undefined // NodeJs.Timeout sourceChain: Chain queryBlockLength: number + blockBuffer: number - constructor(props: BlockListenerConfig) { - this.controllers = props.controllers - this.timeFetchBlocksMs = props.timeFetchBlocksMs - this.logger = props.logger - this.multiclient = props.multiclient - this.sourceChain = props.sourceChain - this.lastProcessedBlock = props.lastProcessedBlock - this.queryBlockLength = props.queryBlockLength + constructor(configs: BlockListenerConfig) { + this.controllers = configs.controllers + this.timeFetchBlocksMs = configs.timeFetchBlocksMs + this.logger = configs.logger + this.multiclient = configs.multiclient + this.sourceChain = configs.sourceChain + this.queryBlockLength = configs.queryBlockLength + this.blockBuffer = configs.blockBuffer } start() { @@ -39,20 +40,17 @@ class BlocksListener { try { const client = this.multiclient.getClientByChain(this.sourceChain) - const currentBlockNumber = await client.getBlockNumber() - if (!this.lastProcessedBlock) { - this.lastProcessedBlock = await client.getBlockNumber() - } + let currentBlockNumber = await client.getBlockNumber() - const blockBuffer = 10 // put 10 blocks before the current block in case the node provider don't sync up at the head - if (this.queryBlockLength > 256 - blockBuffer) { - this.logger.error(`Please choose a block length less than ${256 - blockBuffer}!`) + if (this.queryBlockLength > 256 - this.blockBuffer) { + this.logger.error(`Please choose a block length less than ${256 - this.blockBuffer}!`) } - const startBlock = this.lastProcessedBlock - BigInt(this.queryBlockLength) - const endBlock = this.lastProcessedBlock - BigInt(blockBuffer) + + const startBlock = currentBlockNumber - BigInt(this.queryBlockLength) + const endBlock = currentBlockNumber - BigInt(this.blockBuffer) const blocks = await Promise.all( Array.from( - { length: Number(this.queryBlockLength - blockBuffer + 1) }, + { length: Number(this.queryBlockLength - this.blockBuffer + 1) }, (_, index) => startBlock + BigInt(index), ), ) diff --git a/packages/reporter/src/controllers/SygmaReporterController.ts b/packages/reporter/src/controllers/SygmaReporterController.ts index 55a5ab3c..75ef9137 100644 --- a/packages/reporter/src/controllers/SygmaReporterController.ts +++ b/packages/reporter/src/controllers/SygmaReporterController.ts @@ -16,6 +16,7 @@ class SygmaReporterController { reporterAddress: string adapterAddresses: { [chainName: string]: `0x${string}` } gas: string + constructor(configs: ControllerConfig) { this.sourceChain = configs.sourceChain this.destinationChains = configs.destinationChains diff --git a/packages/reporter/src/controllers/TelepathyReporterController.ts b/packages/reporter/src/controllers/TelepathyReporterController.ts index b5146b9b..bac6ba2c 100644 --- a/packages/reporter/src/controllers/TelepathyReporterController.ts +++ b/packages/reporter/src/controllers/TelepathyReporterController.ts @@ -17,6 +17,7 @@ class TelepathyReporterController { reporterAddress: string adapterAddresses: { [chainName: string]: `0x${string}` } data: any + constructor(configs: ControllerConfig) { this.sourceChain = configs.sourceChain this.destinationChains = configs.destinationChains diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 2ed27d3d..32d3a781 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -72,7 +72,7 @@ function main() { multiclient: multiClient, sourceChain: goerli, queryBlockLength: 100, // modify the query block length here, <256 - lastProcessedBlock: 0n, + blockBuffer: 10, }) blocksListener.start() } From 4422cda2164d8dfe434cbbe68c3205aaeb865006 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Wed, 25 Oct 2023 14:09:57 +0800 Subject: [PATCH 014/297] refactor: putting all configurable variables under settings/index.ts --- packages/reporter/.env.example | 12 ++++++--- packages/reporter/README.md | 22 +++++++++++---- packages/reporter/src/BlockListener.ts | 1 + .../src/controllers/AMBReporterController.ts | 4 +-- .../controllers/SygmaReporterController.ts | 13 ++++----- .../TelepathyReporterController.ts | 20 ++++++++------ packages/reporter/src/index.ts | 23 ++++++++-------- packages/reporter/src/settings/index.ts | 27 ++++++++++++++++--- 8 files changed, 84 insertions(+), 38 deletions(-) diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index 0f87811f..cb95d258 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -4,11 +4,17 @@ REPORTERS_ENABLED=amb,sygma GOERLI_RPC_URL= GNOSIS_RPC_URL= -SOURCE_CHAIN=goerli -DEST_CHAIN=gnosis -GAS=30000 +AMB_GAS=30000 + +SYGMA_MSG_VALUE=0.0001 TELEPATHY_PROOF_API_URL=https://api.telepathy.xyz/api/hashi/ +TELEPATHY_QUERY_BLOCK_LENGTH=1000 +TELEPATHY_BLOCK_BUFFER=10 + +TIME_FETCH_BLOCKS_MS=60000 #in ms +BLOCK_BUFFER=10 +QUERY_BLOCK_LENGTH=200 diff --git a/packages/reporter/README.md b/packages/reporter/README.md index 56b7d603..b20f445d 100644 --- a/packages/reporter/README.md +++ b/packages/reporter/README.md @@ -13,14 +13,26 @@ Script to call Header Reporter contracts of different oracle from source chain t Configure the mode you want to run by editing the variable in `.env` -1. `_CONTROLLER` (true/false): to enable the controller -2. `SOURCE_CHAIN` (string value of chain): Define the source chain to collect the block header from. -3. `DEST_CHAIN` (string value of chain): Define the destination chain to report the source chain's block header to. +1. `REPORTERS_ENABLED` (name of reporter,separated by ',', with no space between): to enable the controller, i.e. + amb,sygma +2. `AMB_GAS` (number): gas used in AMB reporter to pass block header. +3. `SYGMA_MSG_VALUE` (number): amount of ethers sent when bridging block header from sygma, similar to gas fee, i.e. + 0.001 (ethers). +4. `TIME_FETCH_BLOCKS_MS` (number): block reporter restart period (in ms), i.e. 60000 (ms). +5. `BLOCK_BUFFER` (number): amount of blocks away from the latest block, in case the node provider is not sync up with + the latest block, i.e. 10 (blocks). +6. `QUERY_BLOCK_LENGTH` (number): the amount of block headers from source chain to send to destination chain, should be + less than 256 due to the limitation of Solidity + [blockhash()](https://docs.soliditylang.org/en/v0.8.21/units-and-global-variables.html#block-and-transaction-properties). +7. `TELEPATHY_PROOF_API_URL` (string): url of telepathy proof api +8. `TELEPATHY_QUERY_BLOCK_LENGTH` (number): block range to query on `HeadUpdate` event, i.e. 1000 (blocks) +9. `TELEPATHY_BLOCK_BUFFER` (number): amount of blocks away from the latest block in destination chain, in case the node + provider is not sync up with the latest block, i.e. 10 (blocks). ## Adding a new controller -1. Add a new file under `/controller`, create the constructor and `onBlocks` function to call block header reporter +1. Add a new file under `/controllers`, create the constructor and `onBlocks` function to call block header reporter contract periodically. -2. Add the contract addresses under `utils/address.json`. +2. Configure the settings under `settings/index.ts`. 3. Add the new controller instant in `index.ts`. 4. Add the env variable in `.env.example`. diff --git a/packages/reporter/src/BlockListener.ts b/packages/reporter/src/BlockListener.ts index 611ca2c2..53f67dcf 100644 --- a/packages/reporter/src/BlockListener.ts +++ b/packages/reporter/src/BlockListener.ts @@ -23,6 +23,7 @@ class BlocksListener { this.sourceChain = configs.sourceChain this.queryBlockLength = configs.queryBlockLength this.blockBuffer = configs.blockBuffer + this.timeFetchBlocksMs = configs.timeFetchBlocksMs } start() { diff --git a/packages/reporter/src/controllers/AMBReporterController.ts b/packages/reporter/src/controllers/AMBReporterController.ts index d3de5fde..611de302 100644 --- a/packages/reporter/src/controllers/AMBReporterController.ts +++ b/packages/reporter/src/controllers/AMBReporterController.ts @@ -21,9 +21,9 @@ class AMBReporterController { this.destinationChains = configs.destinationChains this.logger = configs.logger this.multiClient = configs.multiClient - this.reporterAddress = configs.reporterAddress + this.reporterAddress = configs.reporterAddress !== undefined ? configs.reporterAddress : "" this.adapterAddresses = configs.adapterAddresses - this.gas = configs.data + this.gas = configs.data.gas } async onBlocks(blockNumbers: bigint[]) { diff --git a/packages/reporter/src/controllers/SygmaReporterController.ts b/packages/reporter/src/controllers/SygmaReporterController.ts index 75ef9137..4508f750 100644 --- a/packages/reporter/src/controllers/SygmaReporterController.ts +++ b/packages/reporter/src/controllers/SygmaReporterController.ts @@ -5,7 +5,6 @@ import "dotenv/config" import contractABI from "../ABIs/SygmaReporterContractABI.json" import Multiclient from "../MultiClient" import { ControllerConfig } from "../types/index" -import { settings } from "../settings" class SygmaReporterController { sourceChain: Chain @@ -15,16 +14,18 @@ class SygmaReporterController { multiClient: Multiclient reporterAddress: string adapterAddresses: { [chainName: string]: `0x${string}` } - gas: string + destinationDomainID: string + fee: string constructor(configs: ControllerConfig) { this.sourceChain = configs.sourceChain this.destinationChains = configs.destinationChains this.logger = configs.logger this.multiClient = configs.multiClient - this.reporterAddress = configs.reporterAddress + this.reporterAddress = configs.reporterAddress !== undefined ? configs.reporterAddress : "" this.adapterAddresses = configs.adapterAddresses - this.gas = configs.data + this.destinationDomainID = configs.data.destDomainID + this.fee = configs.data.fee } async onBlocks(blockNumbers: string[]) { @@ -41,10 +42,10 @@ class SygmaReporterController { args: [ blockNumbers, this.adapterAddresses[chainName], - settings.sygmaDomainID[chainName as keyof typeof settings.sygmaDomainID], + this.destinationDomainID[chainName as keyof typeof this.destinationDomainID], "0x", ], - value: parseEther(this.gas), + value: parseEther(this.fee), }) const txhash = await client.writeContract(request) this.logger.info(`Sygma: TxHash from Sygma Controller: ${txhash}`) diff --git a/packages/reporter/src/controllers/TelepathyReporterController.ts b/packages/reporter/src/controllers/TelepathyReporterController.ts index bac6ba2c..9d5fceba 100644 --- a/packages/reporter/src/controllers/TelepathyReporterController.ts +++ b/packages/reporter/src/controllers/TelepathyReporterController.ts @@ -14,18 +14,22 @@ class TelepathyReporterController { name: string = "telepathy" logger: winston.Logger multiClient: Multiclient - reporterAddress: string adapterAddresses: { [chainName: string]: `0x${string}` } - data: any + lightClientAddresses: { [chainName: string]: `0x${string}` } + proofURL: string + queryBlockLength: string + blockBuffer: string constructor(configs: ControllerConfig) { this.sourceChain = configs.sourceChain this.destinationChains = configs.destinationChains this.logger = configs.logger this.multiClient = configs.multiClient - this.reporterAddress = configs.reporterAddress this.adapterAddresses = configs.adapterAddresses - this.data = configs.data + this.lightClientAddresses = configs.data.lightClientAddresses + this.proofURL = configs.data.proofURL + this.queryBlockLength = configs.data.queryBlockLength + this.blockBuffer = configs.data.blockBuffer } async onBlocks(blockNumbers: string[]) { try { @@ -35,14 +39,14 @@ class TelepathyReporterController { const client = this.multiClient.getClientByChain(chain) const adapterAddr = this.adapterAddresses[chain.name.toLocaleLowerCase()] - const lightClientAddr = this.data.lightClientAddress + const lightClientAddr = this.lightClientAddresses[chain.name.toLocaleLowerCase()] // Getting the latest block number from provider const currentBlockNumber = await client.getBlockNumber() // get contract events from latest block - queryBlockLength : latest block - blockBuffer - const queryBlockLength = BigInt(this.data.queryBlockLength) // the number of blocks to query - const blockBuffer = BigInt(this.data.blockBuffer) // put ${buffer} blocks before the current block in case the node provider don't sync up at the head + const queryBlockLength = BigInt(this.queryBlockLength) // the number of blocks to query + const blockBuffer = BigInt(this.blockBuffer) // put ${buffer} blocks before the current block in case the node provider don't sync up at the head const startBlock = currentBlockNumber - queryBlockLength const endBlock = currentBlockNumber - blockBuffer @@ -65,7 +69,7 @@ class TelepathyReporterController { // get slot value from first indexed const slotValue = event.topics[1] this.logger.info(`Fetching proof for slot ${slotValue}`) - const postUrl = this.data.proofURL + "5" + "/" + hexToNumber(slotValue!) + const postUrl = this.proofURL + "5" + "/" + hexToNumber(slotValue!) // 5 is chainID for Goerli const response = await axios.post(postUrl) const { chainId, slot, blockNumber, blockNumberProof, blockHash, blockHashProof } = response.data.result diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 32d3a781..854e7a1f 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -13,7 +13,6 @@ function main() { const goerliRPC = process.env.GOERLI_RPC_URL as string const gnosisRPC = process.env.GNOSIS_RPC_URL as string const privKey = process.env.PRIVATE_KEY as `0x${string}` - const timeFetchBlocksMs = 5 * 60 * 1000 // modify the frequency here const logger = winston.createLogger({ level: "info", @@ -36,7 +35,7 @@ function main() { multiClient, reporterAddress: settings.contractAddresses.goerli.AMBReporter, adapterAddresses: { gnosis: settings.contractAddresses.gnosis.AMBAdapter as `0x${string}` }, - data: process.env.GAS, // gas to call amb + data: { gas: settings.reporterController.ambReporterController.gas }, }) const sygmaReporterController = new SygmaReporterController({ sourceChain: goerli, @@ -45,20 +44,22 @@ function main() { multiClient, reporterAddress: settings.contractAddresses.goerli.SygmaReporter, adapterAddresses: { gnosis: settings.contractAddresses.gnosis.SygmaAdapter as `0x${string}` }, - data: "0.0001", // msg.value in ether + data: { + fee: settings.reporterController.sygmaReporterController.data, + destDomainID: settings.reporterController.sygmaReporterController.domainID, + }, }) const telepathyReporterController = new TelepathyReporterController({ sourceChain: goerli, destinationChains: [gnosis], logger, multiClient, - reporterAddress: "", // reporter address is not required in telepathy adapterAddresses: { gnosis: settings.contractAddresses.gnosis.SygmaAdapter as `0x${string}` }, data: { - proofURL: process.env.TELEPATHY_PROOF_API_URL, - lightClientAddress: settings.contractAddresses.gnosis.TelepathyLightClient, - queryBlockLength: 1000, - blockBuffer: 10, + proofURL: settings.reporterController.telepathyReporterController.proofURL, + lightClientAddresses: { gnosis: settings.contractAddresses.gnosis.TelepathyLightClient }, + queryBlockLength: settings.reporterController.telepathyReporterController.queryBlockLength, + blockBuffer: settings.reporterController.telepathyReporterController.blockBuffer, }, }) @@ -67,12 +68,12 @@ function main() { controllers: [ambReporterController, sygmaReporterController, telepathyReporterController].filter( (controller) => controllersEnabled?.includes(controller.name), ), - timeFetchBlocksMs: timeFetchBlocksMs, + timeFetchBlocksMs: Number(settings.blockListener.timeFetchBlocksMs), logger, multiclient: multiClient, sourceChain: goerli, - queryBlockLength: 100, // modify the query block length here, <256 - blockBuffer: 10, + queryBlockLength: Number(settings.blockListener.queryBlockLength), // modify the query block length here, <256 + blockBuffer: Number(settings.blockListener.blockBuffer), }) blocksListener.start() } diff --git a/packages/reporter/src/settings/index.ts b/packages/reporter/src/settings/index.ts index fb6c68d9..c7d3ded7 100644 --- a/packages/reporter/src/settings/index.ts +++ b/packages/reporter/src/settings/index.ts @@ -1,3 +1,5 @@ +import "dotenv/config" + export const settings = { contractAddresses: { goerli: { @@ -12,8 +14,27 @@ export const settings = { TelapathyAdapter: "0x2f1E51a2763FB67fe09971Fd8d849716137A3357", }, }, - sygmaDomainID: { - gnosis: "101", - goerli: "1", + reporterController: { + ambReporterController: { + gas: process.env.AMB_GAS, + }, + sygmaReporterController: { + domainID: { + gnosis: "101", + goerli: "1", + }, + data: process.env.SYGMA_MSG_VALUE, + }, + telepathyReporterController: { + proofURL: process.env.TELEPATHY_PROOF_API_URL, + queryBlockLength: process.env.TELEPATHY_QUERY_BLOCK_LENGTH, + blockBuffer: process.env.TELEPATHY_BLOCK_BUFFER, + }, + }, + + blockListener: { + queryBlockLength: process.env.QUERY_BLOCK_LENGTH, + blockBuffer: process.env.BLOCK_BUFFER, + timeFetchBlocksMs: process.env.TIME_FETCH_BLOCKS_MS, }, } From 91981fe06b684f140021d3d82f2914221091f2a0 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Wed, 25 Oct 2023 16:44:49 +0800 Subject: [PATCH 015/297] fix: remove lastProcessedBlock and move queryBlockLength logic to index.ts --- packages/reporter/src/BlockListener.ts | 6 ------ packages/reporter/src/index.ts | 10 ++++++++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/reporter/src/BlockListener.ts b/packages/reporter/src/BlockListener.ts index 53f67dcf..8d7f3091 100644 --- a/packages/reporter/src/BlockListener.ts +++ b/packages/reporter/src/BlockListener.ts @@ -8,7 +8,6 @@ class BlocksListener { controllers: any[] logger: winston.Logger timeFetchBlocksMs: number - lastProcessedBlock: bigint = 0n multiclient: Multiclient _interval: ReturnType | undefined // NodeJs.Timeout sourceChain: Chain @@ -43,10 +42,6 @@ class BlocksListener { let currentBlockNumber = await client.getBlockNumber() - if (this.queryBlockLength > 256 - this.blockBuffer) { - this.logger.error(`Please choose a block length less than ${256 - this.blockBuffer}!`) - } - const startBlock = currentBlockNumber - BigInt(this.queryBlockLength) const endBlock = currentBlockNumber - BigInt(this.blockBuffer) const blocks = await Promise.all( @@ -59,7 +54,6 @@ class BlocksListener { await Promise.all(this.controllers.map((_controller: any) => _controller.onBlocks(blocks))) - this.lastProcessedBlock = endBlock this.logger.info(`Waiting for ${this.timeFetchBlocksMs / 1000}s...`) } catch (_err) { this.logger.error(`error from block listener ${_err}`) diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 854e7a1f..338ad5c1 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -13,6 +13,8 @@ function main() { const goerliRPC = process.env.GOERLI_RPC_URL as string const gnosisRPC = process.env.GNOSIS_RPC_URL as string const privKey = process.env.PRIVATE_KEY as `0x${string}` + const queryBlockLength = Number(settings.blockListener.queryBlockLength) + const blockBuffer = Number(settings.blockListener.blockBuffer) const logger = winston.createLogger({ level: "info", @@ -63,6 +65,10 @@ function main() { }, }) + if (queryBlockLength > 256 - blockBuffer) { + throw logger.error(`Please choose a block length less than ${256 - Number(settings.blockListener.blockBuffer)}!`) + } + const controllersEnabled = process.env.REPORTERS_ENABLED?.split(",") const blocksListener = new BlocksListener({ controllers: [ambReporterController, sygmaReporterController, telepathyReporterController].filter( @@ -72,8 +78,8 @@ function main() { logger, multiclient: multiClient, sourceChain: goerli, - queryBlockLength: Number(settings.blockListener.queryBlockLength), // modify the query block length here, <256 - blockBuffer: Number(settings.blockListener.blockBuffer), + queryBlockLength, // modify the query block length here, <256 - block buffer + blockBuffer, }) blocksListener.start() } From c902049a1fae70ff7682fdff21638b1222f0e9fc Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Wed, 25 Oct 2023 21:32:14 +0800 Subject: [PATCH 016/297] fix: remove unused code --- .gitignore | 1 - packages/reporter/src/BlockListener.ts | 4 +++ .../src/controllers/AMBReporterController.ts | 7 +++-- .../controllers/SygmaReporterController.ts | 9 +++---- .../TelepathyReporterController.ts | 16 ++++++------ packages/reporter/src/index.ts | 17 +++++------- packages/reporter/src/settings/index.ts | 10 +++---- packages/reporter/src/types/index.ts | 26 +++++++++++++++++++ 8 files changed, 56 insertions(+), 34 deletions(-) create mode 100644 packages/reporter/src/types/index.ts diff --git a/.gitignore b/.gitignore index 5e533b47..344ecd39 100644 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,6 @@ **/.coverage_contracts **/dist **/node_modules -**/types **/.yarn # files diff --git a/packages/reporter/src/BlockListener.ts b/packages/reporter/src/BlockListener.ts index 8d7f3091..214560af 100644 --- a/packages/reporter/src/BlockListener.ts +++ b/packages/reporter/src/BlockListener.ts @@ -23,6 +23,10 @@ class BlocksListener { this.queryBlockLength = configs.queryBlockLength this.blockBuffer = configs.blockBuffer this.timeFetchBlocksMs = configs.timeFetchBlocksMs + + if (this.queryBlockLength > 256 - this.blockBuffer) { + throw new Error(`Please choose a block length less than ${256 - this.blockBuffer}!`) + } } start() { diff --git a/packages/reporter/src/controllers/AMBReporterController.ts b/packages/reporter/src/controllers/AMBReporterController.ts index 611de302..120e0d70 100644 --- a/packages/reporter/src/controllers/AMBReporterController.ts +++ b/packages/reporter/src/controllers/AMBReporterController.ts @@ -1,6 +1,5 @@ import { Chain } from "viem" import winston from "winston" -import "dotenv/config" import contractABI from "../ABIs/AMBReporterContractABI.json" import Multiclient from "../MultiClient" @@ -12,7 +11,7 @@ class AMBReporterController { name: string = "amb" logger: winston.Logger multiClient: Multiclient - reporterAddress: string + reporterAddress: `0x${string}` adapterAddresses: { [chainName: string]: `0x${string}` } gas: string @@ -21,7 +20,7 @@ class AMBReporterController { this.destinationChains = configs.destinationChains this.logger = configs.logger this.multiClient = configs.multiClient - this.reporterAddress = configs.reporterAddress !== undefined ? configs.reporterAddress : "" + this.reporterAddress = configs.reporterAddress as `0x${string}` this.adapterAddresses = configs.adapterAddresses this.gas = configs.data.gas } @@ -42,7 +41,7 @@ class AMBReporterController { }) const txhash = await client.writeContract(request) - this.logger.info(`AMB: TxHash from AMB Controller: ${txhash}`) + this.logger.info(`AMB: TxHash from AMB Controller: ${txhash} on ${chain.name}`) } } catch (error) { this.logger.error(`AMB: Error from AMB Controller: ${error}`) diff --git a/packages/reporter/src/controllers/SygmaReporterController.ts b/packages/reporter/src/controllers/SygmaReporterController.ts index 4508f750..91e8d9a3 100644 --- a/packages/reporter/src/controllers/SygmaReporterController.ts +++ b/packages/reporter/src/controllers/SygmaReporterController.ts @@ -1,6 +1,5 @@ import { parseEther, Chain } from "viem" import winston from "winston" -import "dotenv/config" import contractABI from "../ABIs/SygmaReporterContractABI.json" import Multiclient from "../MultiClient" @@ -12,7 +11,7 @@ class SygmaReporterController { name: string = "sygma" logger: winston.Logger multiClient: Multiclient - reporterAddress: string + reporterAddress: `0x${string}` adapterAddresses: { [chainName: string]: `0x${string}` } destinationDomainID: string fee: string @@ -22,13 +21,13 @@ class SygmaReporterController { this.destinationChains = configs.destinationChains this.logger = configs.logger this.multiClient = configs.multiClient - this.reporterAddress = configs.reporterAddress !== undefined ? configs.reporterAddress : "" + this.reporterAddress = configs.reporterAddress as `0x${string}` this.adapterAddresses = configs.adapterAddresses this.destinationDomainID = configs.data.destDomainID this.fee = configs.data.fee } - async onBlocks(blockNumbers: string[]) { + async onBlocks(blockNumbers: bigint[]) { try { this.logger.info("Sygma: Starting Sygma Reporter") const client = this.multiClient.getClientByChain(this.sourceChain) @@ -48,7 +47,7 @@ class SygmaReporterController { value: parseEther(this.fee), }) const txhash = await client.writeContract(request) - this.logger.info(`Sygma: TxHash from Sygma Controller: ${txhash}`) + this.logger.info(`Sygma: TxHash from Sygma Controller: ${txhash} on ${chain.name}`) } } catch (error) { this.logger.error(`Sygma: Error from Sygma Controller: ${error}`) diff --git a/packages/reporter/src/controllers/TelepathyReporterController.ts b/packages/reporter/src/controllers/TelepathyReporterController.ts index 9d5fceba..71f03b2d 100644 --- a/packages/reporter/src/controllers/TelepathyReporterController.ts +++ b/packages/reporter/src/controllers/TelepathyReporterController.ts @@ -1,7 +1,6 @@ import axios from "axios" import { hexToNumber, Chain } from "viem" import winston from "winston" -import "dotenv/config" import lightClientContractABI from "../ABIs/TelepathyContractABI.json" import adapterContractABI from "../ABIs/TelepathyAdapterABI.json" @@ -16,7 +15,7 @@ class TelepathyReporterController { multiClient: Multiclient adapterAddresses: { [chainName: string]: `0x${string}` } lightClientAddresses: { [chainName: string]: `0x${string}` } - proofURL: string + baseProofUrl: string queryBlockLength: string blockBuffer: string @@ -27,11 +26,11 @@ class TelepathyReporterController { this.multiClient = configs.multiClient this.adapterAddresses = configs.adapterAddresses this.lightClientAddresses = configs.data.lightClientAddresses - this.proofURL = configs.data.proofURL + this.baseProofUrl = configs.data.baseProofUrl this.queryBlockLength = configs.data.queryBlockLength this.blockBuffer = configs.data.blockBuffer } - async onBlocks(blockNumbers: string[]) { + async onBlocks(blockNumbers: bigint[]) { try { // Telepathy only support light client on Gnosis at the moment @@ -68,10 +67,11 @@ class TelepathyReporterController { logs.forEach(async (event: any) => { // get slot value from first indexed const slotValue = event.topics[1] - this.logger.info(`Fetching proof for slot ${slotValue}`) - const postUrl = this.proofURL + "5" + "/" + hexToNumber(slotValue!) // 5 is chainID for Goerli + this.logger.info(`Fetching proof for slot ${slotValue} on ${chain.name}`) - const response = await axios.post(postUrl) + const url = `${this.baseProofUrl}/${this.sourceChain.id}/${hexToNumber(slotValue!)}` + console.log("URL ", url) + const response = await axios.post(url) const { chainId, slot, blockNumber, blockNumberProof, blockHash, blockHashProof } = response.data.result this.logger.info(`Telepathy: Calling storeBlockHeader for block number ${blockNumber}`) @@ -83,7 +83,7 @@ class TelepathyReporterController { }) const txHash = await client.writeContract(request) - this.logger.info(`Telepathy: TxHash from Telepathy Controller: ${txHash} `) + this.logger.info(`Telepathy: TxHash from Telepathy Controller: ${txHash} on ${chain.name} `) }) } } catch (error) { diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 338ad5c1..551df4c0 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -1,6 +1,5 @@ import { gnosis, goerli } from "viem/chains" import winston from "winston" -import "dotenv/config" import Multiclient from "./MultiClient" import AMBReporterController from "./controllers/AMBReporterController" @@ -37,7 +36,7 @@ function main() { multiClient, reporterAddress: settings.contractAddresses.goerli.AMBReporter, adapterAddresses: { gnosis: settings.contractAddresses.gnosis.AMBAdapter as `0x${string}` }, - data: { gas: settings.reporterController.ambReporterController.gas }, + data: { gas: settings.reporterControllers.AMBReporterController.gas }, }) const sygmaReporterController = new SygmaReporterController({ sourceChain: goerli, @@ -47,8 +46,8 @@ function main() { reporterAddress: settings.contractAddresses.goerli.SygmaReporter, adapterAddresses: { gnosis: settings.contractAddresses.gnosis.SygmaAdapter as `0x${string}` }, data: { - fee: settings.reporterController.sygmaReporterController.data, - destDomainID: settings.reporterController.sygmaReporterController.domainID, + fee: settings.reporterControllers.SygmaReporterController.data, + destDomainID: settings.reporterControllers.SygmaReporterController.domainID, }, }) const telepathyReporterController = new TelepathyReporterController({ @@ -58,17 +57,13 @@ function main() { multiClient, adapterAddresses: { gnosis: settings.contractAddresses.gnosis.SygmaAdapter as `0x${string}` }, data: { - proofURL: settings.reporterController.telepathyReporterController.proofURL, + baseProofUrl: settings.reporterControllers.TelepathyReporterController.baseProofUrl, lightClientAddresses: { gnosis: settings.contractAddresses.gnosis.TelepathyLightClient }, - queryBlockLength: settings.reporterController.telepathyReporterController.queryBlockLength, - blockBuffer: settings.reporterController.telepathyReporterController.blockBuffer, + queryBlockLength: settings.reporterControllers.TelepathyReporterController.queryBlockLength, + blockBuffer: settings.reporterControllers.TelepathyReporterController.blockBuffer, }, }) - if (queryBlockLength > 256 - blockBuffer) { - throw logger.error(`Please choose a block length less than ${256 - Number(settings.blockListener.blockBuffer)}!`) - } - const controllersEnabled = process.env.REPORTERS_ENABLED?.split(",") const blocksListener = new BlocksListener({ controllers: [ambReporterController, sygmaReporterController, telepathyReporterController].filter( diff --git a/packages/reporter/src/settings/index.ts b/packages/reporter/src/settings/index.ts index c7d3ded7..6710c9f1 100644 --- a/packages/reporter/src/settings/index.ts +++ b/packages/reporter/src/settings/index.ts @@ -14,19 +14,19 @@ export const settings = { TelapathyAdapter: "0x2f1E51a2763FB67fe09971Fd8d849716137A3357", }, }, - reporterController: { - ambReporterController: { + reporterControllers: { + AMBReporterController: { gas: process.env.AMB_GAS, }, - sygmaReporterController: { + SygmaReporterController: { domainID: { gnosis: "101", goerli: "1", }, data: process.env.SYGMA_MSG_VALUE, }, - telepathyReporterController: { - proofURL: process.env.TELEPATHY_PROOF_API_URL, + TelepathyReporterController: { + baseProofUrl: process.env.TELEPATHY_PROOF_API_URL, queryBlockLength: process.env.TELEPATHY_QUERY_BLOCK_LENGTH, blockBuffer: process.env.TELEPATHY_BLOCK_BUFFER, }, diff --git a/packages/reporter/src/types/index.ts b/packages/reporter/src/types/index.ts new file mode 100644 index 00000000..964daf81 --- /dev/null +++ b/packages/reporter/src/types/index.ts @@ -0,0 +1,26 @@ +import { Chain } from "viem" +import winston = require("winston") + +import Multiclient from "../MultiClient" + +type ControllerConfig = { + sourceChain: Chain + destinationChains: Chain[] + reporterAddress?: string + adapterAddresses: { [chainName: string]: `0x${string}` } + logger: winston.Logger + multiClient: Multiclient + data: any // controller-specific data +} + +type BlockListenerConfig = { + controllers: any[] + logger: winston.Logger + timeFetchBlocksMs: number + multiclient: Multiclient + sourceChain: Chain + queryBlockLength: number + blockBuffer: number +} + +export { ControllerConfig, BlockListenerConfig } From 32dffd970db58590eb3f899f83db4df55877aa87 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 25 Oct 2023 17:24:46 +0200 Subject: [PATCH 017/297] chore(evm): adds gitignore --- packages/evm/.gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 packages/evm/.gitignore diff --git a/packages/evm/.gitignore b/packages/evm/.gitignore new file mode 100644 index 00000000..bcbfbbf2 --- /dev/null +++ b/packages/evm/.gitignore @@ -0,0 +1 @@ +types/ \ No newline at end of file From 96a5ff46ec367b537786172175cf40cd84d2d8fb Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Thu, 26 Oct 2023 13:56:21 +0800 Subject: [PATCH 018/297] feat: allow each controllers to set interval individually --- packages/reporter/.env.example | 5 ++-- packages/reporter/src/BlockListener.ts | 18 +++++++------- .../src/controllers/AMBReporterController.ts | 3 +++ .../controllers/SygmaReporterController.ts | 3 +++ .../TelepathyReporterController.ts | 24 ++++++++++++------- packages/reporter/src/index.ts | 7 +++++- packages/reporter/src/settings/index.ts | 4 +++- packages/reporter/src/types/index.ts | 1 + 8 files changed, 44 insertions(+), 21 deletions(-) diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index cb95d258..6619c0c7 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -7,14 +7,15 @@ GNOSIS_RPC_URL= AMB_GAS=30000 +AMB_INTERVAL=60000 SYGMA_MSG_VALUE=0.0001 +SYGMA_INTERVAL=60000 TELEPATHY_PROOF_API_URL=https://api.telepathy.xyz/api/hashi/ -TELEPATHY_QUERY_BLOCK_LENGTH=1000 TELEPATHY_BLOCK_BUFFER=10 +TELEPATHY_INTERVAL=60000 TIME_FETCH_BLOCKS_MS=60000 #in ms BLOCK_BUFFER=10 -QUERY_BLOCK_LENGTH=200 diff --git a/packages/reporter/src/BlockListener.ts b/packages/reporter/src/BlockListener.ts index 214560af..0528b649 100644 --- a/packages/reporter/src/BlockListener.ts +++ b/packages/reporter/src/BlockListener.ts @@ -9,7 +9,7 @@ class BlocksListener { logger: winston.Logger timeFetchBlocksMs: number multiclient: Multiclient - _interval: ReturnType | undefined // NodeJs.Timeout + //intervals: ReturnType | undefined // NodeJs.Timeout sourceChain: Chain queryBlockLength: number blockBuffer: number @@ -31,13 +31,10 @@ class BlocksListener { start() { this._fetchBlocks() - this._interval = setInterval(() => { - this._fetchBlocks() - }, this.timeFetchBlocksMs) } stop() { - clearInterval(this._interval) + // TODO: clearInterval() } async _fetchBlocks() { @@ -54,11 +51,14 @@ class BlocksListener { (_, index) => startBlock + BigInt(index), ), ) - this.logger.info(`Fetching block from ${startBlock} to ${endBlock}`) + this.logger.info(`Fetching block from ${startBlock} to ${endBlock} on ${this.sourceChain.name}`) - await Promise.all(this.controllers.map((_controller: any) => _controller.onBlocks(blocks))) - - this.logger.info(`Waiting for ${this.timeFetchBlocksMs / 1000}s...`) + this.controllers.map((_controller: any) => { + _controller.onBlocks(blocks) + setInterval(() => { + _controller.onBlocks(blocks) + }, _controller.interval) + }) } catch (_err) { this.logger.error(`error from block listener ${_err}`) } diff --git a/packages/reporter/src/controllers/AMBReporterController.ts b/packages/reporter/src/controllers/AMBReporterController.ts index 120e0d70..7605998d 100644 --- a/packages/reporter/src/controllers/AMBReporterController.ts +++ b/packages/reporter/src/controllers/AMBReporterController.ts @@ -11,6 +11,7 @@ class AMBReporterController { name: string = "amb" logger: winston.Logger multiClient: Multiclient + interval: number reporterAddress: `0x${string}` adapterAddresses: { [chainName: string]: `0x${string}` } gas: string @@ -20,6 +21,7 @@ class AMBReporterController { this.destinationChains = configs.destinationChains this.logger = configs.logger this.multiClient = configs.multiClient + this.interval = configs.interval this.reporterAddress = configs.reporterAddress as `0x${string}` this.adapterAddresses = configs.adapterAddresses this.gas = configs.data.gas @@ -42,6 +44,7 @@ class AMBReporterController { const txhash = await client.writeContract(request) this.logger.info(`AMB: TxHash from AMB Controller: ${txhash} on ${chain.name}`) + this.logger.info(`Restarting AMB in ${this.interval / 1000} seconds`) } } catch (error) { this.logger.error(`AMB: Error from AMB Controller: ${error}`) diff --git a/packages/reporter/src/controllers/SygmaReporterController.ts b/packages/reporter/src/controllers/SygmaReporterController.ts index 91e8d9a3..aebb9ee2 100644 --- a/packages/reporter/src/controllers/SygmaReporterController.ts +++ b/packages/reporter/src/controllers/SygmaReporterController.ts @@ -11,6 +11,7 @@ class SygmaReporterController { name: string = "sygma" logger: winston.Logger multiClient: Multiclient + interval: number reporterAddress: `0x${string}` adapterAddresses: { [chainName: string]: `0x${string}` } destinationDomainID: string @@ -21,6 +22,7 @@ class SygmaReporterController { this.destinationChains = configs.destinationChains this.logger = configs.logger this.multiClient = configs.multiClient + this.interval = configs.interval this.reporterAddress = configs.reporterAddress as `0x${string}` this.adapterAddresses = configs.adapterAddresses this.destinationDomainID = configs.data.destDomainID @@ -48,6 +50,7 @@ class SygmaReporterController { }) const txhash = await client.writeContract(request) this.logger.info(`Sygma: TxHash from Sygma Controller: ${txhash} on ${chain.name}`) + this.logger.info(`Restarting Sygma in ${this.interval / 1000} seconds`) } } catch (error) { this.logger.error(`Sygma: Error from Sygma Controller: ${error}`) diff --git a/packages/reporter/src/controllers/TelepathyReporterController.ts b/packages/reporter/src/controllers/TelepathyReporterController.ts index 71f03b2d..fbe65971 100644 --- a/packages/reporter/src/controllers/TelepathyReporterController.ts +++ b/packages/reporter/src/controllers/TelepathyReporterController.ts @@ -13,21 +13,24 @@ class TelepathyReporterController { name: string = "telepathy" logger: winston.Logger multiClient: Multiclient + interval: number adapterAddresses: { [chainName: string]: `0x${string}` } lightClientAddresses: { [chainName: string]: `0x${string}` } baseProofUrl: string - queryBlockLength: string + blockBuffer: string + lastProcessedBlock: bigint = 30000000n constructor(configs: ControllerConfig) { this.sourceChain = configs.sourceChain this.destinationChains = configs.destinationChains this.logger = configs.logger this.multiClient = configs.multiClient + this.interval = configs.interval this.adapterAddresses = configs.adapterAddresses this.lightClientAddresses = configs.data.lightClientAddresses this.baseProofUrl = configs.data.baseProofUrl - this.queryBlockLength = configs.data.queryBlockLength + this.blockBuffer = configs.data.blockBuffer } async onBlocks(blockNumbers: bigint[]) { @@ -44,12 +47,14 @@ class TelepathyReporterController { const currentBlockNumber = await client.getBlockNumber() // get contract events from latest block - queryBlockLength : latest block - blockBuffer - const queryBlockLength = BigInt(this.queryBlockLength) // the number of blocks to query + const blockBuffer = BigInt(this.blockBuffer) // put ${buffer} blocks before the current block in case the node provider don't sync up at the head - const startBlock = currentBlockNumber - queryBlockLength + const startBlock = this.lastProcessedBlock const endBlock = currentBlockNumber - blockBuffer - this.logger.info(`Telepathy: Getting Contract Event from block ${startBlock} to block ${currentBlockNumber}`) + this.logger.info( + `Telepathy: Getting Contract Event from block ${startBlock} to block ${endBlock} on ${chain.name}`, + ) const logs = await client.getContractEvents({ address: lightClientAddr as `0x${string}`, @@ -65,12 +70,11 @@ class TelepathyReporterController { } logs.forEach(async (event: any) => { - // get slot value from first indexed const slotValue = event.topics[1] this.logger.info(`Fetching proof for slot ${slotValue} on ${chain.name}`) - const url = `${this.baseProofUrl}/${this.sourceChain.id}/${hexToNumber(slotValue!)}` - console.log("URL ", url) + const url = `${this.baseProofUrl}${this.sourceChain.id}/${hexToNumber(slotValue!)}` + const response = await axios.post(url) const { chainId, slot, blockNumber, blockNumberProof, blockHash, blockHashProof } = response.data.result this.logger.info(`Telepathy: Calling storeBlockHeader for block number ${blockNumber}`) @@ -83,8 +87,12 @@ class TelepathyReporterController { }) const txHash = await client.writeContract(request) + setTimeout(() => {}, 2000) + this.logger.info(`Telepathy: TxHash from Telepathy Controller: ${txHash} on ${chain.name} `) }) + this.lastProcessedBlock = endBlock + this.logger.info(`Restarting Telepathy in ${this.interval / 1000} seconds`) } } catch (error) { this.logger.error(`Telepathy: Error from Telepathy Controller: ${error}`) diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 551df4c0..a8de088f 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -14,6 +14,9 @@ function main() { const privKey = process.env.PRIVATE_KEY as `0x${string}` const queryBlockLength = Number(settings.blockListener.queryBlockLength) const blockBuffer = Number(settings.blockListener.blockBuffer) + const ambInterval = Number(process.env.AMB_INTERVAL) + const sygmaInterval = Number(process.env.SYGMA_INTERVAL) + const telepathyInterval = Number(process.env.TELEPATHY_INTERVAL) const logger = winston.createLogger({ level: "info", @@ -34,6 +37,7 @@ function main() { destinationChains: [gnosis], logger, multiClient, + interval: ambInterval, reporterAddress: settings.contractAddresses.goerli.AMBReporter, adapterAddresses: { gnosis: settings.contractAddresses.gnosis.AMBAdapter as `0x${string}` }, data: { gas: settings.reporterControllers.AMBReporterController.gas }, @@ -43,6 +47,7 @@ function main() { destinationChains: [gnosis], logger, multiClient, + interval: sygmaInterval, reporterAddress: settings.contractAddresses.goerli.SygmaReporter, adapterAddresses: { gnosis: settings.contractAddresses.gnosis.SygmaAdapter as `0x${string}` }, data: { @@ -55,11 +60,11 @@ function main() { destinationChains: [gnosis], logger, multiClient, + interval: telepathyInterval, adapterAddresses: { gnosis: settings.contractAddresses.gnosis.SygmaAdapter as `0x${string}` }, data: { baseProofUrl: settings.reporterControllers.TelepathyReporterController.baseProofUrl, lightClientAddresses: { gnosis: settings.contractAddresses.gnosis.TelepathyLightClient }, - queryBlockLength: settings.reporterControllers.TelepathyReporterController.queryBlockLength, blockBuffer: settings.reporterControllers.TelepathyReporterController.blockBuffer, }, }) diff --git a/packages/reporter/src/settings/index.ts b/packages/reporter/src/settings/index.ts index 6710c9f1..269cf2d5 100644 --- a/packages/reporter/src/settings/index.ts +++ b/packages/reporter/src/settings/index.ts @@ -16,6 +16,7 @@ export const settings = { }, reporterControllers: { AMBReporterController: { + interval: process.env.AMB_INTERVAL, gas: process.env.AMB_GAS, }, SygmaReporterController: { @@ -23,11 +24,12 @@ export const settings = { gnosis: "101", goerli: "1", }, + interval: process.env.SYGMA_INTERVAL, data: process.env.SYGMA_MSG_VALUE, }, TelepathyReporterController: { + internal: process.env.TELEPATHY_INTERVAL, baseProofUrl: process.env.TELEPATHY_PROOF_API_URL, - queryBlockLength: process.env.TELEPATHY_QUERY_BLOCK_LENGTH, blockBuffer: process.env.TELEPATHY_BLOCK_BUFFER, }, }, diff --git a/packages/reporter/src/types/index.ts b/packages/reporter/src/types/index.ts index 964daf81..a8b53d4e 100644 --- a/packages/reporter/src/types/index.ts +++ b/packages/reporter/src/types/index.ts @@ -10,6 +10,7 @@ type ControllerConfig = { adapterAddresses: { [chainName: string]: `0x${string}` } logger: winston.Logger multiClient: Multiclient + interval: number data: any // controller-specific data } From 466ef45db8dcd6d39035e6a6581f6ba85aa6a546 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Thu, 26 Oct 2023 21:16:22 +0800 Subject: [PATCH 019/297] feat: added isLightClient check and separate intervals for LC based reporter --- packages/reporter/.env.example | 15 ++++---- packages/reporter/README.md | 15 ++++---- packages/reporter/src/BlockListener.ts | 36 +++++++++++++++---- .../src/controllers/AMBReporterController.ts | 5 ++- .../controllers/SygmaReporterController.ts | 5 ++- .../TelepathyReporterController.ts | 9 +++-- packages/reporter/src/index.ts | 22 ++++++------ packages/reporter/src/settings/index.ts | 6 ++++ packages/reporter/src/types/index.ts | 3 +- 9 files changed, 74 insertions(+), 42 deletions(-) diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index 6619c0c7..c49fa6f7 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -1,21 +1,22 @@ PRIVATE_KEY= -REPORTERS_ENABLED=amb,sygma +REPORTERS_ENABLED=amb,telepathy GOERLI_RPC_URL= -GNOSIS_RPC_URL= +GNOSIS_RPC_URL=https://rpc.gnosischain.com AMB_GAS=30000 -AMB_INTERVAL=60000 - SYGMA_MSG_VALUE=0.0001 -SYGMA_INTERVAL=60000 TELEPATHY_PROOF_API_URL=https://api.telepathy.xyz/api/hashi/ TELEPATHY_BLOCK_BUFFER=10 -TELEPATHY_INTERVAL=60000 -TIME_FETCH_BLOCKS_MS=60000 #in ms + +TIME_FETCH_BLOCKS_MS=60000 #in ms, frequency to call _fetchBlocks for non-Light Client based controllers +LC_TIME_STORE_HASHES_MS=60000 # in ms, frequency to call _storeHashes for Light Client based controllers + +## Block Listener Configs for non-Light CLient based controllers BLOCK_BUFFER=10 +QUERY_BLOCK_LENGTH=200 diff --git a/packages/reporter/README.md b/packages/reporter/README.md index b20f445d..8ba1db29 100644 --- a/packages/reporter/README.md +++ b/packages/reporter/README.md @@ -19,15 +19,16 @@ Configure the mode you want to run by editing the variable in `.env` 3. `SYGMA_MSG_VALUE` (number): amount of ethers sent when bridging block header from sygma, similar to gas fee, i.e. 0.001 (ethers). 4. `TIME_FETCH_BLOCKS_MS` (number): block reporter restart period (in ms), i.e. 60000 (ms). -5. `BLOCK_BUFFER` (number): amount of blocks away from the latest block, in case the node provider is not sync up with - the latest block, i.e. 10 (blocks). -6. `QUERY_BLOCK_LENGTH` (number): the amount of block headers from source chain to send to destination chain, should be +5. `LC_TIME_STORE_HASHES_MS` (number): Light client based reporter (Telepathy) restart period (in ms), i.e. 60000 (ms). +6. `BLOCK_BUFFER` (number): the amount of blocks from source chain away from the latest block, in case the node provider + is not sync up with the latest block, i.e. 10 (blocks). +7. `QUERY_BLOCK_LENGTH` (number): the amount of block headers from source chain to send to destination chain, should be less than 256 due to the limitation of Solidity [blockhash()](https://docs.soliditylang.org/en/v0.8.21/units-and-global-variables.html#block-and-transaction-properties). -7. `TELEPATHY_PROOF_API_URL` (string): url of telepathy proof api -8. `TELEPATHY_QUERY_BLOCK_LENGTH` (number): block range to query on `HeadUpdate` event, i.e. 1000 (blocks) -9. `TELEPATHY_BLOCK_BUFFER` (number): amount of blocks away from the latest block in destination chain, in case the node - provider is not sync up with the latest block, i.e. 10 (blocks). +8. `TELEPATHY_PROOF_API_URL` (string): url of telepathy proof api +9. `TELEPATHY_QUERY_BLOCK_LENGTH` (number): block range to query on `HeadUpdate` event, i.e. 1000 (blocks) +10. `TELEPATHY_BLOCK_BUFFER` (number): amount of blocks away from the latest block in destination chain, in case the + node provider is not sync up with the latest block, i.e. 10 (blocks). ## Adding a new controller diff --git a/packages/reporter/src/BlockListener.ts b/packages/reporter/src/BlockListener.ts index 0528b649..f507e568 100644 --- a/packages/reporter/src/BlockListener.ts +++ b/packages/reporter/src/BlockListener.ts @@ -8,8 +8,10 @@ class BlocksListener { controllers: any[] logger: winston.Logger timeFetchBlocksMs: number + LCTimeStoreHashesMs: number multiclient: Multiclient - //intervals: ReturnType | undefined // NodeJs.Timeout + intervals: ReturnType | undefined // NodeJs.Timeout + LCIntervals: ReturnType | undefined // NodeJs.Timeout sourceChain: Chain queryBlockLength: number blockBuffer: number @@ -23,6 +25,7 @@ class BlocksListener { this.queryBlockLength = configs.queryBlockLength this.blockBuffer = configs.blockBuffer this.timeFetchBlocksMs = configs.timeFetchBlocksMs + this.LCTimeStoreHashesMs = configs.LCTimeStoreHashesMs if (this.queryBlockLength > 256 - this.blockBuffer) { throw new Error(`Please choose a block length less than ${256 - this.blockBuffer}!`) @@ -30,11 +33,26 @@ class BlocksListener { } start() { + // Non Light Client based controllers, fetch block from source chain and call report BlockHeaders this._fetchBlocks() + + this.intervals = setInterval(() => { + this._fetchBlocks() + this.logger.info(`Non LC reporter controllers: Waiting for ${this.timeFetchBlocksMs / 1000} seconds`) + }, this.timeFetchBlocksMs) + + // Light Client based controllers, query event from destination chain and call store block hash + this._storeHashes() + + this.LCIntervals = setInterval(() => { + this._storeHashes() + this.logger.info(`LC reporter controllers: Waiting for ${this.LCTimeStoreHashesMs / 1000} seconds`) + }, this.LCTimeStoreHashesMs) } stop() { - // TODO: clearInterval() + clearInterval(this.intervals) + clearInterval(this.LCIntervals) } async _fetchBlocks() { @@ -54,15 +72,21 @@ class BlocksListener { this.logger.info(`Fetching block from ${startBlock} to ${endBlock} on ${this.sourceChain.name}`) this.controllers.map((_controller: any) => { - _controller.onBlocks(blocks) - setInterval(() => { + if (!_controller.isLightClient) { _controller.onBlocks(blocks) - }, _controller.interval) + } }) } catch (_err) { - this.logger.error(`error from block listener ${_err}`) + this.logger.error(`Error from block listener ${_err}`) } } + async _storeHashes() { + this.controllers.map((_controller: any) => { + if (_controller.isLightClient) { + _controller.onBlocks() + } + }) + } } export default BlocksListener diff --git a/packages/reporter/src/controllers/AMBReporterController.ts b/packages/reporter/src/controllers/AMBReporterController.ts index 7605998d..2a599de6 100644 --- a/packages/reporter/src/controllers/AMBReporterController.ts +++ b/packages/reporter/src/controllers/AMBReporterController.ts @@ -11,19 +11,19 @@ class AMBReporterController { name: string = "amb" logger: winston.Logger multiClient: Multiclient - interval: number reporterAddress: `0x${string}` adapterAddresses: { [chainName: string]: `0x${string}` } gas: string + isLightClient: boolean constructor(configs: ControllerConfig) { this.sourceChain = configs.sourceChain this.destinationChains = configs.destinationChains this.logger = configs.logger this.multiClient = configs.multiClient - this.interval = configs.interval this.reporterAddress = configs.reporterAddress as `0x${string}` this.adapterAddresses = configs.adapterAddresses + this.isLightClient = configs.isLightClient this.gas = configs.data.gas } @@ -44,7 +44,6 @@ class AMBReporterController { const txhash = await client.writeContract(request) this.logger.info(`AMB: TxHash from AMB Controller: ${txhash} on ${chain.name}`) - this.logger.info(`Restarting AMB in ${this.interval / 1000} seconds`) } } catch (error) { this.logger.error(`AMB: Error from AMB Controller: ${error}`) diff --git a/packages/reporter/src/controllers/SygmaReporterController.ts b/packages/reporter/src/controllers/SygmaReporterController.ts index aebb9ee2..fb70635f 100644 --- a/packages/reporter/src/controllers/SygmaReporterController.ts +++ b/packages/reporter/src/controllers/SygmaReporterController.ts @@ -11,18 +11,18 @@ class SygmaReporterController { name: string = "sygma" logger: winston.Logger multiClient: Multiclient - interval: number reporterAddress: `0x${string}` adapterAddresses: { [chainName: string]: `0x${string}` } destinationDomainID: string fee: string + isLightClient: boolean constructor(configs: ControllerConfig) { this.sourceChain = configs.sourceChain this.destinationChains = configs.destinationChains this.logger = configs.logger this.multiClient = configs.multiClient - this.interval = configs.interval + this.isLightClient = configs.isLightClient this.reporterAddress = configs.reporterAddress as `0x${string}` this.adapterAddresses = configs.adapterAddresses this.destinationDomainID = configs.data.destDomainID @@ -50,7 +50,6 @@ class SygmaReporterController { }) const txhash = await client.writeContract(request) this.logger.info(`Sygma: TxHash from Sygma Controller: ${txhash} on ${chain.name}`) - this.logger.info(`Restarting Sygma in ${this.interval / 1000} seconds`) } } catch (error) { this.logger.error(`Sygma: Error from Sygma Controller: ${error}`) diff --git a/packages/reporter/src/controllers/TelepathyReporterController.ts b/packages/reporter/src/controllers/TelepathyReporterController.ts index fbe65971..df55af1d 100644 --- a/packages/reporter/src/controllers/TelepathyReporterController.ts +++ b/packages/reporter/src/controllers/TelepathyReporterController.ts @@ -13,11 +13,10 @@ class TelepathyReporterController { name: string = "telepathy" logger: winston.Logger multiClient: Multiclient - interval: number + isLightClient: boolean adapterAddresses: { [chainName: string]: `0x${string}` } lightClientAddresses: { [chainName: string]: `0x${string}` } baseProofUrl: string - blockBuffer: string lastProcessedBlock: bigint = 30000000n @@ -26,16 +25,17 @@ class TelepathyReporterController { this.destinationChains = configs.destinationChains this.logger = configs.logger this.multiClient = configs.multiClient - this.interval = configs.interval + this.isLightClient = configs.isLightClient this.adapterAddresses = configs.adapterAddresses this.lightClientAddresses = configs.data.lightClientAddresses this.baseProofUrl = configs.data.baseProofUrl this.blockBuffer = configs.data.blockBuffer } - async onBlocks(blockNumbers: bigint[]) { + async onBlocks() { try { // Telepathy only support light client on Gnosis at the moment + this.logger.info("Telepathy: Starting Telepathy Reporter") for (const chain of this.destinationChains) { const client = this.multiClient.getClientByChain(chain) @@ -92,7 +92,6 @@ class TelepathyReporterController { this.logger.info(`Telepathy: TxHash from Telepathy Controller: ${txHash} on ${chain.name} `) }) this.lastProcessedBlock = endBlock - this.logger.info(`Restarting Telepathy in ${this.interval / 1000} seconds`) } } catch (error) { this.logger.error(`Telepathy: Error from Telepathy Controller: ${error}`) diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index a8de088f..c774cba3 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -9,14 +9,13 @@ import BlocksListener from "./BlockListener" import { settings } from "./settings/index" function main() { - const goerliRPC = process.env.GOERLI_RPC_URL as string - const gnosisRPC = process.env.GNOSIS_RPC_URL as string - const privKey = process.env.PRIVATE_KEY as `0x${string}` + const goerliRPC = settings.config.goerliRPC as string + const gnosisRPC = settings.config.gnosisRPC as string + const privKey = settings.config.privKey as `0x${string}` const queryBlockLength = Number(settings.blockListener.queryBlockLength) const blockBuffer = Number(settings.blockListener.blockBuffer) - const ambInterval = Number(process.env.AMB_INTERVAL) - const sygmaInterval = Number(process.env.SYGMA_INTERVAL) - const telepathyInterval = Number(process.env.TELEPATHY_INTERVAL) + const timeFetchBlocksMs = Number(settings.blockListener.timeFetchBlocksMs) + const LCTimeStoreHashesMs = Number(settings.blockListener.LCTimeStoreHashesMs) const logger = winston.createLogger({ level: "info", @@ -37,7 +36,7 @@ function main() { destinationChains: [gnosis], logger, multiClient, - interval: ambInterval, + isLightClient: false, reporterAddress: settings.contractAddresses.goerli.AMBReporter, adapterAddresses: { gnosis: settings.contractAddresses.gnosis.AMBAdapter as `0x${string}` }, data: { gas: settings.reporterControllers.AMBReporterController.gas }, @@ -47,7 +46,7 @@ function main() { destinationChains: [gnosis], logger, multiClient, - interval: sygmaInterval, + isLightClient: false, reporterAddress: settings.contractAddresses.goerli.SygmaReporter, adapterAddresses: { gnosis: settings.contractAddresses.gnosis.SygmaAdapter as `0x${string}` }, data: { @@ -60,7 +59,7 @@ function main() { destinationChains: [gnosis], logger, multiClient, - interval: telepathyInterval, + isLightClient: true, adapterAddresses: { gnosis: settings.contractAddresses.gnosis.SygmaAdapter as `0x${string}` }, data: { baseProofUrl: settings.reporterControllers.TelepathyReporterController.baseProofUrl, @@ -70,17 +69,20 @@ function main() { }) const controllersEnabled = process.env.REPORTERS_ENABLED?.split(",") + const blocksListener = new BlocksListener({ controllers: [ambReporterController, sygmaReporterController, telepathyReporterController].filter( (controller) => controllersEnabled?.includes(controller.name), ), - timeFetchBlocksMs: Number(settings.blockListener.timeFetchBlocksMs), + timeFetchBlocksMs, + LCTimeStoreHashesMs, logger, multiclient: multiClient, sourceChain: goerli, queryBlockLength, // modify the query block length here, <256 - block buffer blockBuffer, }) + blocksListener.start() } diff --git a/packages/reporter/src/settings/index.ts b/packages/reporter/src/settings/index.ts index 269cf2d5..be89f0ac 100644 --- a/packages/reporter/src/settings/index.ts +++ b/packages/reporter/src/settings/index.ts @@ -14,6 +14,11 @@ export const settings = { TelapathyAdapter: "0x2f1E51a2763FB67fe09971Fd8d849716137A3357", }, }, + config: { + goerliRPC: process.env.GOERLI_RPC_URL, + gnosisRPC: process.env.GNOSIS_RPC_URL, + privKey: process.env.PRIVATE_KEY, + }, reporterControllers: { AMBReporterController: { interval: process.env.AMB_INTERVAL, @@ -38,5 +43,6 @@ export const settings = { queryBlockLength: process.env.QUERY_BLOCK_LENGTH, blockBuffer: process.env.BLOCK_BUFFER, timeFetchBlocksMs: process.env.TIME_FETCH_BLOCKS_MS, + LCTimeStoreHashesMs: process.env.LC_TIME_STORE_HASHES_MS, }, } diff --git a/packages/reporter/src/types/index.ts b/packages/reporter/src/types/index.ts index a8b53d4e..4e7d5253 100644 --- a/packages/reporter/src/types/index.ts +++ b/packages/reporter/src/types/index.ts @@ -10,14 +10,15 @@ type ControllerConfig = { adapterAddresses: { [chainName: string]: `0x${string}` } logger: winston.Logger multiClient: Multiclient - interval: number data: any // controller-specific data + isLightClient: boolean } type BlockListenerConfig = { controllers: any[] logger: winston.Logger timeFetchBlocksMs: number + LCTimeStoreHashesMs: number multiclient: Multiclient sourceChain: Chain queryBlockLength: number From fc6c679421a61c94d41210de94ce01546182a942 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 26 Oct 2023 19:03:09 +0200 Subject: [PATCH 020/297] feat(reporter): improves classes design, rm not used code and improves the logger --- packages/reporter/.env.example | 11 +- packages/reporter/.gitignore | 1 + packages/reporter/README.md | 22 +- packages/reporter/src/BlockListener.ts | 82 +- .../src/controllers/AMBReporterController.ts | 61 +- .../src/controllers/BaseController.ts | 29 + .../controllers/SygmaReporterController.ts | 70 +- .../TelepathyReporterController.ts | 127 +- packages/reporter/src/index.ts | 97 +- packages/reporter/src/settings/index.ts | 57 +- packages/reporter/src/types/index.ts | 33 +- packages/reporter/src/utils/logger.ts | 28 + packages/reporter/yarn.lock | 3882 ++++++++++++----- 13 files changed, 3112 insertions(+), 1388 deletions(-) create mode 100644 packages/reporter/.gitignore create mode 100644 packages/reporter/src/controllers/BaseController.ts create mode 100644 packages/reporter/src/utils/logger.ts diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index c49fa6f7..ffad1105 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -1,22 +1,23 @@ PRIVATE_KEY= -REPORTERS_ENABLED=amb,telepathy +REPORTERS_ENABLED=AMBReporterController,TelepathyReporterController,SygmaReporterController GOERLI_RPC_URL= GNOSIS_RPC_URL=https://rpc.gnosischain.com -AMB_GAS=30000 -SYGMA_MSG_VALUE=0.0001 +AMB_REPORTER_HEADERS_GAS=30000 +SYGMA_REPORT_HEADERS_TO_DOMAIN_MSG_VALUE=0.0001 TELEPATHY_PROOF_API_URL=https://api.telepathy.xyz/api/hashi/ TELEPATHY_BLOCK_BUFFER=10 - +TELEPATHY_TIME_FETCH_BLOCK_MS=200000 TIME_FETCH_BLOCKS_MS=60000 #in ms, frequency to call _fetchBlocks for non-Light Client based controllers -LC_TIME_STORE_HASHES_MS=60000 # in ms, frequency to call _storeHashes for Light Client based controllers ## Block Listener Configs for non-Light CLient based controllers BLOCK_BUFFER=10 QUERY_BLOCK_LENGTH=200 +SOURCE_CHAIN=5 +DESTINATION_CHAINS=100 \ No newline at end of file diff --git a/packages/reporter/.gitignore b/packages/reporter/.gitignore new file mode 100644 index 00000000..5292519a --- /dev/null +++ b/packages/reporter/.gitignore @@ -0,0 +1 @@ +logs/ \ No newline at end of file diff --git a/packages/reporter/README.md b/packages/reporter/README.md index 8ba1db29..0999ad8d 100644 --- a/packages/reporter/README.md +++ b/packages/reporter/README.md @@ -15,20 +15,22 @@ Configure the mode you want to run by editing the variable in `.env` 1. `REPORTERS_ENABLED` (name of reporter,separated by ',', with no space between): to enable the controller, i.e. amb,sygma -2. `AMB_GAS` (number): gas used in AMB reporter to pass block header. -3. `SYGMA_MSG_VALUE` (number): amount of ethers sent when bridging block header from sygma, similar to gas fee, i.e. - 0.001 (ethers). +2. `AMB_REPORTER_HEADERS_GAS` (number): gas used in AMB reporter to pass block header. +3. `SYGMA_REPORT_HEADERS_TO_DOMAIN_MSG_VALUE` (number): amount of ethers sent when bridging block header from sygma, + similar to reportHeadersGas fee, i.e. 0.001 (ethers). 4. `TIME_FETCH_BLOCKS_MS` (number): block reporter restart period (in ms), i.e. 60000 (ms). -5. `LC_TIME_STORE_HASHES_MS` (number): Light client based reporter (Telepathy) restart period (in ms), i.e. 60000 (ms). -6. `BLOCK_BUFFER` (number): the amount of blocks from source chain away from the latest block, in case the node provider +5. `BLOCK_BUFFER` (number): the amount of blocks from source chain away from the latest block, in case the node provider is not sync up with the latest block, i.e. 10 (blocks). -7. `QUERY_BLOCK_LENGTH` (number): the amount of block headers from source chain to send to destination chain, should be +6. `QUERY_BLOCK_LENGTH` (number): the amount of block headers from source chain to send to destination chain, should be less than 256 due to the limitation of Solidity [blockhash()](https://docs.soliditylang.org/en/v0.8.21/units-and-global-variables.html#block-and-transaction-properties). -8. `TELEPATHY_PROOF_API_URL` (string): url of telepathy proof api -9. `TELEPATHY_QUERY_BLOCK_LENGTH` (number): block range to query on `HeadUpdate` event, i.e. 1000 (blocks) -10. `TELEPATHY_BLOCK_BUFFER` (number): amount of blocks away from the latest block in destination chain, in case the - node provider is not sync up with the latest block, i.e. 10 (blocks). +7. `TELEPATHY_PROOF_API_URL` (string): url of telepathy proof api +8. `TELEPATHY_QUERY_BLOCK_LENGTH` (number): block range to query on `HeadUpdate` event, i.e. 1000 (blocks) +9. `TELEPATHY_BLOCK_BUFFER` (number): amount of blocks away from the latest block in destination chain, in case the node + provider is not sync up with the latest block, i.e. 10 (blocks). +10. `TELEPATHY_TIME_FETCH_BLOCK_MS`: interval time for which the controller looks for new `HeadUpdate` events. +11. `SOURCE_CHAIN`: source chain `chainId`. +12. `DESTINATION_CHAINS`: destination chain `chainIds` separated by a comma. ## Adding a new controller diff --git a/packages/reporter/src/BlockListener.ts b/packages/reporter/src/BlockListener.ts index f507e568..f4332a90 100644 --- a/packages/reporter/src/BlockListener.ts +++ b/packages/reporter/src/BlockListener.ts @@ -2,91 +2,63 @@ import { Chain } from "viem" import winston from "winston" import Multiclient from "./MultiClient" -import { BlockListenerConfig } from "./types/index" + +import { BlockListenerConfigs } from "./types/index" class BlocksListener { controllers: any[] logger: winston.Logger - timeFetchBlocksMs: number - LCTimeStoreHashesMs: number + intervalFetchBlocksMs: number multiclient: Multiclient - intervals: ReturnType | undefined // NodeJs.Timeout - LCIntervals: ReturnType | undefined // NodeJs.Timeout + intervals: ReturnType | undefined sourceChain: Chain queryBlockLength: number blockBuffer: number - constructor(configs: BlockListenerConfig) { - this.controllers = configs.controllers - this.timeFetchBlocksMs = configs.timeFetchBlocksMs - this.logger = configs.logger - this.multiclient = configs.multiclient - this.sourceChain = configs.sourceChain - this.queryBlockLength = configs.queryBlockLength - this.blockBuffer = configs.blockBuffer - this.timeFetchBlocksMs = configs.timeFetchBlocksMs - this.LCTimeStoreHashesMs = configs.LCTimeStoreHashesMs - - if (this.queryBlockLength > 256 - this.blockBuffer) { - throw new Error(`Please choose a block length less than ${256 - this.blockBuffer}!`) + constructor(_configs: BlockListenerConfigs) { + if (_configs.queryBlockLength > 256 - _configs.blockBuffer) { + throw new Error(`Please choose a block length less than ${256 - _configs.blockBuffer}!`) } + + this.controllers = _configs.controllers + this.intervalFetchBlocksMs = _configs.intervalFetchBlocksMs + this.logger = _configs.logger.child({ service: "BlocksListener" }) + this.multiclient = _configs.multiclient + this.sourceChain = _configs.sourceChain + this.queryBlockLength = _configs.queryBlockLength + this.blockBuffer = _configs.blockBuffer + this.intervalFetchBlocksMs = _configs.intervalFetchBlocksMs } start() { - // Non Light Client based controllers, fetch block from source chain and call report BlockHeaders - this._fetchBlocks() - + this.fetchBlocks() this.intervals = setInterval(() => { - this._fetchBlocks() - this.logger.info(`Non LC reporter controllers: Waiting for ${this.timeFetchBlocksMs / 1000} seconds`) - }, this.timeFetchBlocksMs) - - // Light Client based controllers, query event from destination chain and call store block hash - this._storeHashes() - - this.LCIntervals = setInterval(() => { - this._storeHashes() - this.logger.info(`LC reporter controllers: Waiting for ${this.LCTimeStoreHashesMs / 1000} seconds`) - }, this.LCTimeStoreHashesMs) + this.fetchBlocks() + }, this.intervalFetchBlocksMs) } stop() { clearInterval(this.intervals) - clearInterval(this.LCIntervals) } - async _fetchBlocks() { + async fetchBlocks() { try { const client = this.multiclient.getClientByChain(this.sourceChain) - let currentBlockNumber = await client.getBlockNumber() - + const currentBlockNumber = await client.getBlockNumber() const startBlock = currentBlockNumber - BigInt(this.queryBlockLength) const endBlock = currentBlockNumber - BigInt(this.blockBuffer) - const blocks = await Promise.all( - Array.from( - { length: Number(this.queryBlockLength - this.blockBuffer + 1) }, - (_, index) => startBlock + BigInt(index), - ), - ) - this.logger.info(`Fetching block from ${startBlock} to ${endBlock} on ${this.sourceChain.name}`) - this.controllers.map((_controller: any) => { - if (!_controller.isLightClient) { - _controller.onBlocks(blocks) - } - }) + const blocks = Array.from( + { length: Number(this.queryBlockLength - this.blockBuffer + 1) }, + (_, _index) => startBlock + BigInt(_index), + ) + this.logger.info(`New blocks detected on ${this.sourceChain.name}: [${startBlock},${endBlock}]`) + this.controllers.map((_controller: any) => _controller.onBlocks(blocks)) } catch (_err) { this.logger.error(`Error from block listener ${_err}`) } } - async _storeHashes() { - this.controllers.map((_controller: any) => { - if (_controller.isLightClient) { - _controller.onBlocks() - } - }) - } } export default BlocksListener diff --git a/packages/reporter/src/controllers/AMBReporterController.ts b/packages/reporter/src/controllers/AMBReporterController.ts index 2a599de6..00329307 100644 --- a/packages/reporter/src/controllers/AMBReporterController.ts +++ b/packages/reporter/src/controllers/AMBReporterController.ts @@ -1,52 +1,39 @@ -import { Chain } from "viem" -import winston from "winston" - -import contractABI from "../ABIs/AMBReporterContractABI.json" -import Multiclient from "../MultiClient" -import { ControllerConfig } from "../types/index" - -class AMBReporterController { - sourceChain: Chain - destinationChains: Chain[] - name: string = "amb" - logger: winston.Logger - multiClient: Multiclient - reporterAddress: `0x${string}` - adapterAddresses: { [chainName: string]: `0x${string}` } - gas: string - isLightClient: boolean - - constructor(configs: ControllerConfig) { - this.sourceChain = configs.sourceChain - this.destinationChains = configs.destinationChains - this.logger = configs.logger - this.multiClient = configs.multiClient - this.reporterAddress = configs.reporterAddress as `0x${string}` - this.adapterAddresses = configs.adapterAddresses - this.isLightClient = configs.isLightClient - this.gas = configs.data.gas +import ABI from "../ABIs/AMBReporterContractABI.json" + +import { AMBReporterControllerConfigs } from "../types/index" + +import BaseController from "./BaseController" + +class AMBReporterController extends BaseController { + private _reportHeadersGas: number + + constructor(_configs: AMBReporterControllerConfigs) { + super(_configs, "AMBReporterController") + this._reportHeadersGas = _configs.reportHeadersGas } - async onBlocks(blockNumbers: bigint[]) { + async onBlocks(_blockNumbers: bigint[]) { try { - this.logger.info("AMB: Starting AMB Reporter") - const client = this.multiClient.getClientByChain(this.sourceChain) for (const chain of this.destinationChains) { - let chainName = chain.name.toLocaleLowerCase() + this.logger.info( + `reporting block headers of blocks [${_blockNumbers[0]},${_blockNumbers[_blockNumbers.length - 1]}] on ${ + chain.name + } ...`, + ) const { request } = await client.simulateContract({ address: this.reporterAddress as `0x${string}`, - abi: contractABI, + abi: ABI, functionName: "reportHeaders", - args: [blockNumbers, this.adapterAddresses[chainName], this.gas], + args: [_blockNumbers, this.adapterAddresses[chain.name], this._reportHeadersGas], }) - const txhash = await client.writeContract(request) - this.logger.info(`AMB: TxHash from AMB Controller: ${txhash} on ${chain.name}`) + const txHash = await client.writeContract(request) + this.logger.info(`tx sent on ${chain.name}: ${txHash}`) } - } catch (error) { - this.logger.error(`AMB: Error from AMB Controller: ${error}`) + } catch (_error) { + this.logger.error(_error) } } } diff --git a/packages/reporter/src/controllers/BaseController.ts b/packages/reporter/src/controllers/BaseController.ts new file mode 100644 index 00000000..a5405a6a --- /dev/null +++ b/packages/reporter/src/controllers/BaseController.ts @@ -0,0 +1,29 @@ +import { Chain } from "viem" +import winston from "winston" + +import Multiclient from "../MultiClient" + +import { BaseControllerConfigs } from "../types" + +class BaseController { + name: string + sourceChain: Chain + destinationChains: Chain[] + reporterAddress?: string + adapterAddresses: { [chainName: string]: `0x${string}` } + logger: winston.Logger + multiClient: Multiclient + + constructor(configs: BaseControllerConfigs, name: string) { + this.sourceChain = configs.sourceChain + this.destinationChains = configs.destinationChains + this.reporterAddress = configs.reporterAddress as `0x${string}` + this.adapterAddresses = configs.adapterAddresses + this.multiClient = configs.multiClient + this.name = name + + this.logger = configs.logger.child({ service: this.name }) + } +} + +export default BaseController diff --git a/packages/reporter/src/controllers/SygmaReporterController.ts b/packages/reporter/src/controllers/SygmaReporterController.ts index fb70635f..ec2fe288 100644 --- a/packages/reporter/src/controllers/SygmaReporterController.ts +++ b/packages/reporter/src/controllers/SygmaReporterController.ts @@ -1,58 +1,48 @@ -import { parseEther, Chain } from "viem" -import winston from "winston" - -import contractABI from "../ABIs/SygmaReporterContractABI.json" -import Multiclient from "../MultiClient" -import { ControllerConfig } from "../types/index" - -class SygmaReporterController { - sourceChain: Chain - destinationChains: Chain[] - name: string = "sygma" - logger: winston.Logger - multiClient: Multiclient - reporterAddress: `0x${string}` - adapterAddresses: { [chainName: string]: `0x${string}` } - destinationDomainID: string - fee: string - isLightClient: boolean - - constructor(configs: ControllerConfig) { - this.sourceChain = configs.sourceChain - this.destinationChains = configs.destinationChains - this.logger = configs.logger - this.multiClient = configs.multiClient - this.isLightClient = configs.isLightClient - this.reporterAddress = configs.reporterAddress as `0x${string}` - this.adapterAddresses = configs.adapterAddresses - this.destinationDomainID = configs.data.destDomainID - this.fee = configs.data.fee +import { parseEther } from "viem" + +import ABI from "../ABIs/SygmaReporterContractABI.json" +import BaseController from "./BaseController" + +import { SygmaReporterControllerConfigs } from "../types/index" + +class SygmaReporterController extends BaseController { + private _domainIds: { [chainName: string]: number } + private _reportHeadersToDomainMsgValue: string + + constructor(_configs: SygmaReporterControllerConfigs) { + super(_configs, "SygmaReporterController") + this._domainIds = _configs.domainIds + this._reportHeadersToDomainMsgValue = _configs.reportHeadersToDomainMsgValue } - async onBlocks(blockNumbers: bigint[]) { + async onBlocks(_blockNumbers: bigint[]) { try { - this.logger.info("Sygma: Starting Sygma Reporter") const client = this.multiClient.getClientByChain(this.sourceChain) for (const chain of this.destinationChains) { - const chainName = chain.name.toLocaleLowerCase() + this.logger.info( + `reporting block headers of blocks [${_blockNumbers[0]},${_blockNumbers[_blockNumbers.length - 1]}] on ${ + chain.name + } ...`, + ) + const { request } = await client.simulateContract({ address: this.reporterAddress as `0x${string}`, - abi: contractABI, + abi: ABI, functionName: "reportHeadersToDomain", args: [ - blockNumbers, - this.adapterAddresses[chainName], - this.destinationDomainID[chainName as keyof typeof this.destinationDomainID], + _blockNumbers, + this.adapterAddresses[chain.name], + this._domainIds[chain.name as keyof typeof this._domainIds], "0x", ], - value: parseEther(this.fee), + value: parseEther(this._reportHeadersToDomainMsgValue), }) const txhash = await client.writeContract(request) - this.logger.info(`Sygma: TxHash from Sygma Controller: ${txhash} on ${chain.name}`) + this.logger.info(`tx sent on ${chain.name}: ${txhash}`) } - } catch (error) { - this.logger.error(`Sygma: Error from Sygma Controller: ${error}`) + } catch (_error) { + this.logger.error(_error) } } } diff --git a/packages/reporter/src/controllers/TelepathyReporterController.ts b/packages/reporter/src/controllers/TelepathyReporterController.ts index df55af1d..9e8b2960 100644 --- a/packages/reporter/src/controllers/TelepathyReporterController.ts +++ b/packages/reporter/src/controllers/TelepathyReporterController.ts @@ -1,100 +1,89 @@ import axios from "axios" -import { hexToNumber, Chain } from "viem" -import winston from "winston" - -import lightClientContractABI from "../ABIs/TelepathyContractABI.json" -import adapterContractABI from "../ABIs/TelepathyAdapterABI.json" -import Multiclient from "../MultiClient" -import { ControllerConfig } from "../types/index" - -class TelepathyReporterController { - sourceChain: Chain - destinationChains: Chain[] - name: string = "telepathy" - logger: winston.Logger - multiClient: Multiclient - isLightClient: boolean - adapterAddresses: { [chainName: string]: `0x${string}` } +import { hexToNumber } from "viem" + +import LightClientContractABI from "../ABIs/TelepathyContractABI.json" +import AdapterContractABI from "../ABIs/TelepathyAdapterABI.json" +import BaseController from "./BaseController" + +import { TelepathyReporterControllerConfigs } from "../types/index" + +class TelepathyReporterController extends BaseController { + lastProcessedBlock: bigint + blockBuffer: number lightClientAddresses: { [chainName: string]: `0x${string}` } - baseProofUrl: string - blockBuffer: string - lastProcessedBlock: bigint = 30000000n - - constructor(configs: ControllerConfig) { - this.sourceChain = configs.sourceChain - this.destinationChains = configs.destinationChains - this.logger = configs.logger - this.multiClient = configs.multiClient - this.isLightClient = configs.isLightClient - this.adapterAddresses = configs.adapterAddresses - this.lightClientAddresses = configs.data.lightClientAddresses - this.baseProofUrl = configs.data.baseProofUrl - - this.blockBuffer = configs.data.blockBuffer + + private _baseProofUrl: string + private _intervalFetchBlocksMs: number + private _intervals: ReturnType | undefined + + constructor(_configs: TelepathyReporterControllerConfigs) { + super(_configs, "TelepathyReporterController") + + this.lightClientAddresses = _configs.lightClientAddresses + this.blockBuffer = _configs.blockBuffer + this._intervalFetchBlocksMs = _configs.intervalFetchBlocksMs + this._baseProofUrl = _configs.baseProofUrl + + this.lastProcessedBlock = 0n + } + + start() { + this.fetchHeadUpdates() + this._intervals = setInterval(() => { + this.fetchHeadUpdates() + }, this._intervalFetchBlocksMs) + } + + stop() { + clearInterval(this._intervals) } - async onBlocks() { - try { - // Telepathy only support light client on Gnosis at the moment - this.logger.info("Telepathy: Starting Telepathy Reporter") + async fetchHeadUpdates() { + try { for (const chain of this.destinationChains) { const client = this.multiClient.getClientByChain(chain) - const adapterAddr = this.adapterAddresses[chain.name.toLocaleLowerCase()] - const lightClientAddr = this.lightClientAddresses[chain.name.toLocaleLowerCase()] - - // Getting the latest block number from provider const currentBlockNumber = await client.getBlockNumber() + const fromBlock = this.lastProcessedBlock + 1n + const toBlock = currentBlockNumber - BigInt(this.blockBuffer) - // get contract events from latest block - queryBlockLength : latest block - blockBuffer - - const blockBuffer = BigInt(this.blockBuffer) // put ${buffer} blocks before the current block in case the node provider don't sync up at the head - const startBlock = this.lastProcessedBlock - const endBlock = currentBlockNumber - blockBuffer - - this.logger.info( - `Telepathy: Getting Contract Event from block ${startBlock} to block ${endBlock} on ${chain.name}`, - ) + this.logger.info(`getting HeadUpdate events in [${fromBlock},${toBlock}] on ${chain.name} ...`) const logs = await client.getContractEvents({ - address: lightClientAddr as `0x${string}`, - abi: lightClientContractABI, + address: this.lightClientAddresses[chain.name.toLocaleLowerCase()] as `0x${string}`, + abi: LightClientContractABI, eventName: "HeadUpdate", - fromBlock: startBlock, - toBlock: endBlock, + fromBlock, + toBlock, }) if (logs.length == 0) { - this.logger.error("No event is found!") - return + continue } - logs.forEach(async (event: any) => { - const slotValue = event.topics[1] - this.logger.info(`Fetching proof for slot ${slotValue} on ${chain.name}`) + this.logger.error(`detected ${logs.length} HeadUpdate events. Processing them ...`) + logs.forEach(async (_log: any) => { + const slotValue = _log.topics[1] + this.logger.info(`fetching proof for slot ${slotValue} on ${chain.name} ...`) - const url = `${this.baseProofUrl}${this.sourceChain.id}/${hexToNumber(slotValue!)}` - - const response = await axios.post(url) + const response = await axios.post(`${this._baseProofUrl}${this.sourceChain.id}/${hexToNumber(slotValue!)}`) const { chainId, slot, blockNumber, blockNumberProof, blockHash, blockHashProof } = response.data.result - this.logger.info(`Telepathy: Calling storeBlockHeader for block number ${blockNumber}`) + this.logger.info(`calling storeBlockHeader for block number ${blockNumber} ...`) const { request } = await client.simulateContract({ - address: adapterAddr as `0x${string}`, - abi: adapterContractABI, + address: this.adapterAddresses[chain.name.toLocaleLowerCase()] as `0x${string}`, + abi: AdapterContractABI, functionName: "storeBlockHeader", args: [chainId, slot, blockNumber, blockNumberProof, blockHash, blockHashProof], }) const txHash = await client.writeContract(request) - setTimeout(() => {}, 2000) - - this.logger.info(`Telepathy: TxHash from Telepathy Controller: ${txHash} on ${chain.name} `) + this.logger.info(`tx sent on ${chain.name}: ${txHash}`) }) - this.lastProcessedBlock = endBlock + this.lastProcessedBlock = toBlock } - } catch (error) { - this.logger.error(`Telepathy: Error from Telepathy Controller: ${error}`) + } catch (_error) { + this.logger.error(_error) } } } diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index c774cba3..b0efa0c7 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -1,5 +1,6 @@ -import { gnosis, goerli } from "viem/chains" -import winston from "winston" +import * as chains from "viem/chains" +import { gnosis } from "viem/chains" +import { Chain } from "viem" import Multiclient from "./MultiClient" import AMBReporterController from "./controllers/AMBReporterController" @@ -7,83 +8,75 @@ import SygmaReporterController from "./controllers/SygmaReporterController" import TelepathyReporterController from "./controllers/TelepathyReporterController" import BlocksListener from "./BlockListener" import { settings } from "./settings/index" +import logger from "./utils/logger" -function main() { - const goerliRPC = settings.config.goerliRPC as string - const gnosisRPC = settings.config.gnosisRPC as string - const privKey = settings.config.privKey as `0x${string}` - const queryBlockLength = Number(settings.blockListener.queryBlockLength) - const blockBuffer = Number(settings.blockListener.blockBuffer) - const timeFetchBlocksMs = Number(settings.blockListener.timeFetchBlocksMs) - const LCTimeStoreHashesMs = Number(settings.blockListener.LCTimeStoreHashesMs) +const main = () => { + const controllersEnabled = process.env.REPORTERS_ENABLED?.split(",") + const sourceChainId = Number(process.env.SOURCE_CHAIN_ID) + const destinationChainIds = process.env.DESTINATION_CHAIN_IDS?.split(",").map((_chainId) => Number(_chainId)) + + const sourceChain = Object.values(chains).find((_chain) => _chain.id === sourceChainId) as Chain + const destinationChains = Object.values(chains).filter((_chain) => destinationChainIds?.includes(_chain.id)) - const logger = winston.createLogger({ - level: "info", - format: winston.format.json(), - transports: [new winston.transports.Console()], - }) const multiClient = new Multiclient({ - chains: [goerli, gnosis], - privateKey: privKey, + chains: [sourceChain, ...destinationChains], + privateKey: process.env.PRIVATE_KEY as `0x${string}`, rpcUrls: { - goerli: goerliRPC, - gnosis: gnosisRPC, + goerli: settings.rpcUrls.Gnosis, + gnosis: settings.rpcUrls.Goerli, }, }) const ambReporterController = new AMBReporterController({ - sourceChain: goerli, - destinationChains: [gnosis], + sourceChain, + destinationChains, logger, multiClient, - isLightClient: false, - reporterAddress: settings.contractAddresses.goerli.AMBReporter, - adapterAddresses: { gnosis: settings.contractAddresses.gnosis.AMBAdapter as `0x${string}` }, - data: { gas: settings.reporterControllers.AMBReporterController.gas }, + reporterAddress: settings.contractAddresses.Goerli.AMBReporter, + adapterAddresses: { [gnosis.name]: settings.contractAddresses.Gnosis.AMBAdapter }, + reportHeadersGas: settings.reporterControllers.AMBReporterController.reportHeadersGas, }) + const sygmaReporterController = new SygmaReporterController({ - sourceChain: goerli, - destinationChains: [gnosis], + sourceChain, + destinationChains, logger, multiClient, - isLightClient: false, - reporterAddress: settings.contractAddresses.goerli.SygmaReporter, - adapterAddresses: { gnosis: settings.contractAddresses.gnosis.SygmaAdapter as `0x${string}` }, - data: { - fee: settings.reporterControllers.SygmaReporterController.data, - destDomainID: settings.reporterControllers.SygmaReporterController.domainID, - }, + reporterAddress: settings.contractAddresses.Goerli.SygmaReporter, + adapterAddresses: { [gnosis.name]: settings.contractAddresses.Gnosis.SygmaAdapter }, + reportHeadersToDomainMsgValue: settings.reporterControllers.SygmaReporterController.reportHeadersToDomainMsgValue, + domainIds: settings.reporterControllers.SygmaReporterController.domainIds, }) + const telepathyReporterController = new TelepathyReporterController({ - sourceChain: goerli, - destinationChains: [gnosis], + sourceChain, + destinationChains, logger, multiClient, - isLightClient: true, - adapterAddresses: { gnosis: settings.contractAddresses.gnosis.SygmaAdapter as `0x${string}` }, - data: { - baseProofUrl: settings.reporterControllers.TelepathyReporterController.baseProofUrl, - lightClientAddresses: { gnosis: settings.contractAddresses.gnosis.TelepathyLightClient }, - blockBuffer: settings.reporterControllers.TelepathyReporterController.blockBuffer, - }, + adapterAddresses: { [gnosis.name]: settings.contractAddresses.Gnosis.SygmaAdapter }, + baseProofUrl: settings.reporterControllers.TelepathyReporterController.baseProofUrl, + lightClientAddresses: { [gnosis.name]: settings.contractAddresses.Gnosis.TelepathyLightClient }, + blockBuffer: settings.reporterControllers.TelepathyReporterController.blockBuffer, + intervalFetchBlocksMs: settings.reporterControllers.TelepathyReporterController.intervalFetchBlocksMs, }) - const controllersEnabled = process.env.REPORTERS_ENABLED?.split(",") - const blocksListener = new BlocksListener({ - controllers: [ambReporterController, sygmaReporterController, telepathyReporterController].filter( - (controller) => controllersEnabled?.includes(controller.name), + controllers: [ambReporterController, sygmaReporterController].filter( + (_controller) => controllersEnabled?.includes(_controller.name), ), - timeFetchBlocksMs, - LCTimeStoreHashesMs, + intervalFetchBlocksMs: settings.BlockListener.intervalFetchBlocksMs, logger, multiclient: multiClient, - sourceChain: goerli, - queryBlockLength, // modify the query block length here, <256 - block buffer - blockBuffer, + sourceChain, + queryBlockLength: settings.BlockListener.queryBlockLength, + blockBuffer: settings.BlockListener.blockBuffer, }) blocksListener.start() + + if (controllersEnabled?.includes(telepathyReporterController.name)) { + telepathyReporterController.start() + } } main() diff --git a/packages/reporter/src/settings/index.ts b/packages/reporter/src/settings/index.ts index be89f0ac..6e71e696 100644 --- a/packages/reporter/src/settings/index.ts +++ b/packages/reporter/src/settings/index.ts @@ -1,48 +1,43 @@ import "dotenv/config" +import { gnosis, mainnet, goerli } from "viem/chains" export const settings = { + BlockListener: { + blockBuffer: Number(process.env.BLOCK_BUFFER), + queryBlockLength: Number(process.env.QUERY_BLOCK_LENGTH), + intervalFetchBlocksMs: Number(process.env.TIME_FETCH_BLOCKS_MS), + }, + rpcUrls: { + [gnosis.name]: process.env.GNOSIS_RPC_URL as string, + [goerli.name]: process.env.GOERLI_RPC_URL as string, + }, contractAddresses: { - goerli: { - AMBReporter: "0xedc0b1d3de4496e0d917af42f29cb71eb2982319", - SygmaReporter: "0x2f96d347c932ac73b56e9352ecc0707e25173d88", + [gnosis.name]: { + AMBAdapter: "0x01268DB05965CeAc2a89566c42CD550ED7eE5ECD" as `0x${string}`, + SygmaAdapter: "0x9AD7a6f4FDA8247cC0bF5932B68c5b619937dB15" as `0x${string}`, + TelapathyAdapter: "0x2f1E51a2763FB67fe09971Fd8d849716137A3357" as `0x${string}`, + TelepathyLightClient: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, }, - mainnet: {}, - gnosis: { - AMBAdapter: "0x01268DB05965CeAc2a89566c42CD550ED7eE5ECD", - SygmaAdapter: "0x9AD7a6f4FDA8247cC0bF5932B68c5b619937dB15", - TelepathyLightClient: "0x34b5378DE786389a477b40dD710812c250185f83", - TelapathyAdapter: "0x2f1E51a2763FB67fe09971Fd8d849716137A3357", + [goerli.name]: { + AMBReporter: "0xedc0b1d3de4496e0d917af42f29cb71eb2982319" as `0x${string}`, + SygmaReporter: "0x2f96d347c932ac73b56e9352ecc0707e25173d88" as `0x${string}`, }, }, - config: { - goerliRPC: process.env.GOERLI_RPC_URL, - gnosisRPC: process.env.GNOSIS_RPC_URL, - privKey: process.env.PRIVATE_KEY, - }, reporterControllers: { AMBReporterController: { - interval: process.env.AMB_INTERVAL, - gas: process.env.AMB_GAS, + reportHeadersGas: Number(process.env.AMB_REPORTER_HEADERS_GAS), }, SygmaReporterController: { - domainID: { - gnosis: "101", - goerli: "1", + reportHeadersToDomainMsgValue: process.env.SYGMA_REPORT_HEADERS_TO_DOMAIN_MSG_VALUE as string, + domainIds: { + [gnosis.name]: 101, + [mainnet.name]: 1, }, - interval: process.env.SYGMA_INTERVAL, - data: process.env.SYGMA_MSG_VALUE, }, TelepathyReporterController: { - internal: process.env.TELEPATHY_INTERVAL, - baseProofUrl: process.env.TELEPATHY_PROOF_API_URL, - blockBuffer: process.env.TELEPATHY_BLOCK_BUFFER, + baseProofUrl: process.env.TELEPATHY_PROOF_API_URL as string, + blockBuffer: Number(process.env.TELEPATHY_BLOCK_BUFFER), + intervalFetchBlocksMs: Number(process.env.TELEPATHY_TIME_FETCH_BLOCK_MS), }, }, - - blockListener: { - queryBlockLength: process.env.QUERY_BLOCK_LENGTH, - blockBuffer: process.env.BLOCK_BUFFER, - timeFetchBlocksMs: process.env.TIME_FETCH_BLOCKS_MS, - LCTimeStoreHashesMs: process.env.LC_TIME_STORE_HASHES_MS, - }, } diff --git a/packages/reporter/src/types/index.ts b/packages/reporter/src/types/index.ts index 4e7d5253..5110faba 100644 --- a/packages/reporter/src/types/index.ts +++ b/packages/reporter/src/types/index.ts @@ -3,26 +3,45 @@ import winston = require("winston") import Multiclient from "../MultiClient" -type ControllerConfig = { +type BaseControllerConfigs = { sourceChain: Chain destinationChains: Chain[] reporterAddress?: string adapterAddresses: { [chainName: string]: `0x${string}` } logger: winston.Logger multiClient: Multiclient - data: any // controller-specific data - isLightClient: boolean } -type BlockListenerConfig = { +interface TelepathyReporterControllerConfigs extends BaseControllerConfigs { + lightClientAddresses: { [chainName: string]: `0x${string}` } + baseProofUrl: string + blockBuffer: number + intervalFetchBlocksMs: number +} + +interface AMBReporterControllerConfigs extends BaseControllerConfigs { + reportHeadersGas: number +} + +interface SygmaReporterControllerConfigs extends BaseControllerConfigs { + reportHeadersToDomainMsgValue: string + domainIds: { [chainName: string]: number } +} + +interface BlockListenerConfigs { controllers: any[] logger: winston.Logger - timeFetchBlocksMs: number - LCTimeStoreHashesMs: number + intervalFetchBlocksMs: number multiclient: Multiclient sourceChain: Chain queryBlockLength: number blockBuffer: number } -export { ControllerConfig, BlockListenerConfig } +export { + AMBReporterControllerConfigs, + BaseControllerConfigs, + BlockListenerConfigs, + SygmaReporterControllerConfigs, + TelepathyReporterControllerConfigs, +} diff --git a/packages/reporter/src/utils/logger.ts b/packages/reporter/src/utils/logger.ts new file mode 100644 index 00000000..54055ed2 --- /dev/null +++ b/packages/reporter/src/utils/logger.ts @@ -0,0 +1,28 @@ +import winston from "winston" + +const colors = { + error: "red", + warn: "yellow", + info: "cyan", + debug: "blue", + service: "magenta", +} + +const logger = winston.createLogger({ + level: "info", + format: winston.format.combine( + winston.format.colorize({ + colors, + }), + winston.format.timestamp(), + winston.format.printf(({ timestamp, level, message, service }) => { + const colorize = winston.format.colorize() + return `${timestamp} [${level}] ${colorize.colorize("service", `${service}`)}: ${message}` + }), + ), + transports: [new winston.transports.Console(), new winston.transports.File({ filename: "./logs/application.log" })], +}) + +winston.addColors(colors) + +export default logger diff --git a/packages/reporter/yarn.lock b/packages/reporter/yarn.lock index 898adfbb..db593311 100644 --- a/packages/reporter/yarn.lock +++ b/packages/reporter/yarn.lock @@ -1,1082 +1,2800 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@aashutoshrathi/word-wrap@^1.2.3": - "version" "1.2.6" - -"@adraffy/ens-normalize@1.9.4": - "version" "1.9.4" - -"@colors/colors@^1.6.0", "@colors/colors@1.6.0": - "integrity" "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==" - "resolved" "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz" - "version" "1.6.0" - -"@cspotcode/source-map-support@^0.8.0": - "version" "0.8.1" - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@dabh/diagnostics@^2.0.2": - "integrity" "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==" - "resolved" "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz" - "version" "2.0.3" - dependencies: - "colorspace" "1.1.x" - "enabled" "2.0.x" - "kuler" "^2.0.0" - -"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": - "version" "4.4.0" - dependencies: - "eslint-visitor-keys" "^3.3.0" - -"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": - "version" "4.9.1" - -"@eslint/eslintrc@^2.1.2": - "version" "2.1.2" - 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.51.0": - "version" "8.51.0" - -"@humanwhocodes/config-array@^0.11.11": - "version" "0.11.11" - dependencies: - "@humanwhocodes/object-schema" "^1.2.1" - "debug" "^4.1.1" - "minimatch" "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - "version" "1.0.1" - -"@humanwhocodes/object-schema@^1.2.1": - "version" "1.2.1" - -"@jridgewell/resolve-uri@^3.0.3": - "version" "3.1.1" - -"@jridgewell/sourcemap-codec@^1.4.10": - "version" "1.4.15" - -"@jridgewell/trace-mapping@0.3.9": - "version" "0.3.9" - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@noble/curves@~1.2.0", "@noble/curves@1.2.0": - "version" "1.2.0" - dependencies: - "@noble/hashes" "1.3.2" - -"@noble/hashes@~1.3.0", "@noble/hashes@~1.3.2", "@noble/hashes@1.3.2": - "version" "1.3.2" - -"@nodelib/fs.scandir@2.1.5": - "version" "2.1.5" - dependencies: - "@nodelib/fs.stat" "2.0.5" - "run-parallel" "^1.1.9" - -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": - "version" "2.0.5" - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - "version" "1.2.8" - dependencies: - "@nodelib/fs.scandir" "2.1.5" - "fastq" "^1.6.0" - -"@scure/base@~1.1.0", "@scure/base@~1.1.2": - "version" "1.1.3" - -"@scure/bip32@1.3.2": - "version" "1.3.2" - dependencies: - "@noble/curves" "~1.2.0" - "@noble/hashes" "~1.3.2" - "@scure/base" "~1.1.2" - -"@scure/bip39@1.2.1": - "version" "1.2.1" - dependencies: - "@noble/hashes" "~1.3.0" - "@scure/base" "~1.1.0" - -"@tsconfig/node10@^1.0.7": - "version" "1.0.9" - -"@tsconfig/node12@^1.0.7": - "version" "1.0.11" - -"@tsconfig/node14@^1.0.0": - "version" "1.0.3" - -"@tsconfig/node16@^1.0.2": - "version" "1.0.4" - -"@types/json-schema@^7.0.12": - "version" "7.0.13" - -"@types/node-cron@^3.0.9": - "integrity" "sha512-P10Vf+oagnMbefD31nqjS/dpBM34qzfdpvIgVZwtwsNb0Hg2lDaPFeGcyGUJIqh3zHlDMwYXGeunGgMnswgnPg==" - "resolved" "https://registry.npmjs.org/@types/node-cron/-/node-cron-3.0.9.tgz" - "version" "3.0.9" - -"@types/node@*", "@types/node@^20.8.6": - "integrity" "sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ==" - "resolved" "https://registry.npmjs.org/@types/node/-/node-20.8.6.tgz" - "version" "20.8.6" - dependencies: - "undici-types" "~5.25.1" - -"@types/semver@^7.5.0": - "version" "7.5.3" - -"@types/triple-beam@^1.3.2": - "integrity" "sha512-HlJjF3wxV4R2VQkFpKe0YqJLilYNgtRtsqqZtby7RkVsSs+i+vbyzjtUwpFEdUCKcrGzCiEJE7F/0mKjh0sunA==" - "resolved" "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.4.tgz" - "version" "1.3.4" - -"@typescript-eslint/eslint-plugin@^6.7.5": - "version" "6.7.5" - dependencies: - "@eslint-community/regexpp" "^4.5.1" - "@typescript-eslint/scope-manager" "6.7.5" - "@typescript-eslint/type-utils" "6.7.5" - "@typescript-eslint/utils" "6.7.5" - "@typescript-eslint/visitor-keys" "6.7.5" - "debug" "^4.3.4" - "graphemer" "^1.4.0" - "ignore" "^5.2.4" - "natural-compare" "^1.4.0" - "semver" "^7.5.4" - "ts-api-utils" "^1.0.1" - -"@typescript-eslint/parser@^6.0.0 || ^6.0.0-alpha", "@typescript-eslint/parser@^6.7.5": - "version" "6.7.5" - dependencies: - "@typescript-eslint/scope-manager" "6.7.5" - "@typescript-eslint/types" "6.7.5" - "@typescript-eslint/typescript-estree" "6.7.5" - "@typescript-eslint/visitor-keys" "6.7.5" - "debug" "^4.3.4" - -"@typescript-eslint/scope-manager@6.7.5": - "version" "6.7.5" - dependencies: - "@typescript-eslint/types" "6.7.5" - "@typescript-eslint/visitor-keys" "6.7.5" - -"@typescript-eslint/type-utils@6.7.5": - "version" "6.7.5" - dependencies: - "@typescript-eslint/typescript-estree" "6.7.5" - "@typescript-eslint/utils" "6.7.5" - "debug" "^4.3.4" - "ts-api-utils" "^1.0.1" - -"@typescript-eslint/types@6.7.5": - "version" "6.7.5" - -"@typescript-eslint/typescript-estree@6.7.5": - "version" "6.7.5" - dependencies: - "@typescript-eslint/types" "6.7.5" - "@typescript-eslint/visitor-keys" "6.7.5" - "debug" "^4.3.4" - "globby" "^11.1.0" - "is-glob" "^4.0.3" - "semver" "^7.5.4" - "ts-api-utils" "^1.0.1" - -"@typescript-eslint/utils@6.7.5": - "version" "6.7.5" - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@types/json-schema" "^7.0.12" - "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "6.7.5" - "@typescript-eslint/types" "6.7.5" - "@typescript-eslint/typescript-estree" "6.7.5" - "semver" "^7.5.4" - -"@typescript-eslint/visitor-keys@6.7.5": - "version" "6.7.5" - dependencies: - "@typescript-eslint/types" "6.7.5" - "eslint-visitor-keys" "^3.4.1" - -"abbrev@1": - "version" "1.1.1" - -"abitype@0.9.8": - "version" "0.9.8" - -"acorn-jsx@^5.3.2": - "version" "5.3.2" - -"acorn-walk@^8.1.1": - "version" "8.2.0" - -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", "acorn@^8.4.1", "acorn@^8.9.0": - "version" "8.10.0" - -"ajv@^6.12.4": - "version" "6.12.6" - 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" - -"ansi-regex@^5.0.1": - "version" "5.0.1" - -"ansi-styles@^4.1.0": - "version" "4.3.0" - dependencies: - "color-convert" "^2.0.1" - -"anymatch@~3.1.2": - "version" "3.1.3" - dependencies: - "normalize-path" "^3.0.0" - "picomatch" "^2.0.4" - -"arg@^4.1.0": - "version" "4.1.3" - -"argparse@^2.0.1": - "version" "2.0.1" - -"array-union@^2.1.0": - "version" "2.1.0" - -"async@^3.2.3": - "integrity" "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" - "resolved" "https://registry.npmjs.org/async/-/async-3.2.4.tgz" - "version" "3.2.4" - -"asynckit@^0.4.0": - "version" "0.4.0" - -"axios@^1.5.1": - "version" "1.5.1" - dependencies: - "follow-redirects" "^1.15.0" - "form-data" "^4.0.0" - "proxy-from-env" "^1.1.0" - -"balanced-match@^1.0.0": - "version" "1.0.2" - -"binary-extensions@^2.0.0": - "version" "2.2.0" - -"brace-expansion@^1.1.7": - "version" "1.1.11" - dependencies: - "balanced-match" "^1.0.0" - "concat-map" "0.0.1" - -"braces@^3.0.2", "braces@~3.0.2": - "version" "3.0.2" - dependencies: - "fill-range" "^7.0.1" - -"callsites@^3.0.0": - "version" "3.1.0" - -"chalk@^4.0.0": - "version" "4.1.2" - dependencies: - "ansi-styles" "^4.1.0" - "supports-color" "^7.1.0" - -"chokidar@^3.5.2": - "version" "3.5.3" - dependencies: - "anymatch" "~3.1.2" - "braces" "~3.0.2" - "glob-parent" "~5.1.2" - "is-binary-path" "~2.1.0" - "is-glob" "~4.0.1" - "normalize-path" "~3.0.0" - "readdirp" "~3.6.0" - optionalDependencies: - "fsevents" "~2.3.2" - -"color-convert@^1.9.3": - "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==" - "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - "version" "1.9.3" - dependencies: - "color-name" "1.1.3" - -"color-convert@^2.0.1": - "version" "2.0.1" - dependencies: - "color-name" "~1.1.4" - -"color-name@^1.0.0", "color-name@~1.1.4": - "version" "1.1.4" - -"color-name@1.1.3": - "integrity" "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - "version" "1.1.3" - -"color-string@^1.6.0": - "integrity" "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==" - "resolved" "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz" - "version" "1.9.1" - dependencies: - "color-name" "^1.0.0" - "simple-swizzle" "^0.2.2" - -"color@^3.1.3": - "integrity" "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==" - "resolved" "https://registry.npmjs.org/color/-/color-3.2.1.tgz" - "version" "3.2.1" - dependencies: - "color-convert" "^1.9.3" - "color-string" "^1.6.0" - -"colorspace@1.1.x": - "integrity" "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==" - "resolved" "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz" - "version" "1.1.4" - dependencies: - "color" "^3.1.3" - "text-hex" "1.0.x" - -"combined-stream@^1.0.8": - "version" "1.0.8" - dependencies: - "delayed-stream" "~1.0.0" - -"concat-map@0.0.1": - "version" "0.0.1" - -"create-require@^1.1.0": - "version" "1.1.1" - -"cross-spawn@^7.0.2": - "version" "7.0.3" - dependencies: - "path-key" "^3.1.0" - "shebang-command" "^2.0.0" - "which" "^2.0.1" - -"debug@^3.2.7": - "version" "3.2.7" - dependencies: - "ms" "^2.1.1" - -"debug@^4.1.1", "debug@^4.3.2", "debug@^4.3.4": - "version" "4.3.4" - dependencies: - "ms" "2.1.2" - -"deep-is@^0.1.3": - "version" "0.1.4" - -"delayed-stream@~1.0.0": - "version" "1.0.0" - -"diff@^4.0.1": - "version" "4.0.2" - -"dir-glob@^3.0.1": - "version" "3.0.1" - dependencies: - "path-type" "^4.0.0" - -"doctrine@^3.0.0": - "version" "3.0.0" - dependencies: - "esutils" "^2.0.2" - -"dotenv@^16.3.1": - "version" "16.3.1" - -"enabled@2.0.x": - "integrity" "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" - "resolved" "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz" - "version" "2.0.0" - -"escape-string-regexp@^4.0.0": - "version" "4.0.0" - -"eslint-config-prettier@^9.0.0": - "version" "9.0.0" - -"eslint-scope@^7.2.2": - "version" "7.2.2" - dependencies: - "esrecurse" "^4.3.0" - "estraverse" "^5.2.0" - -"eslint-visitor-keys@^3.3.0", "eslint-visitor-keys@^3.4.1", "eslint-visitor-keys@^3.4.3": - "version" "3.4.3" - -"eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", "eslint@^8.51.0", "eslint@>=7.0.0": - "version" "8.51.0" - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.2" - "@eslint/js" "8.51.0" - "@humanwhocodes/config-array" "^0.11.11" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - "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@^9.6.0", "espree@^9.6.1": - "version" "9.6.1" - dependencies: - "acorn" "^8.9.0" - "acorn-jsx" "^5.3.2" - "eslint-visitor-keys" "^3.4.1" - -"esquery@^1.4.2": - "version" "1.5.0" - dependencies: - "estraverse" "^5.1.0" - -"esrecurse@^4.3.0": - "version" "4.3.0" - dependencies: - "estraverse" "^5.2.0" - -"estraverse@^5.1.0", "estraverse@^5.2.0": - "version" "5.3.0" - -"esutils@^2.0.2": - "version" "2.0.3" - -"fast-deep-equal@^3.1.1", "fast-deep-equal@^3.1.3": - "version" "3.1.3" - -"fast-glob@^3.2.9": - "version" "3.3.1" - 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" - -"fast-levenshtein@^2.0.6": - "version" "2.0.6" - -"fastq@^1.6.0": - "version" "1.15.0" - dependencies: - "reusify" "^1.0.4" - -"fecha@^4.2.0": - "integrity" "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" - "resolved" "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz" - "version" "4.2.3" - -"file-entry-cache@^6.0.1": - "version" "6.0.1" - dependencies: - "flat-cache" "^3.0.4" - -"fill-range@^7.0.1": - "version" "7.0.1" - dependencies: - "to-regex-range" "^5.0.1" - -"find-up@^5.0.0": - "version" "5.0.0" - dependencies: - "locate-path" "^6.0.0" - "path-exists" "^4.0.0" - -"flat-cache@^3.0.4": - "version" "3.1.1" - dependencies: - "flatted" "^3.2.9" - "keyv" "^4.5.3" - "rimraf" "^3.0.2" - -"flatted@^3.2.9": - "version" "3.2.9" - -"fn.name@1.x.x": - "integrity" "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" - "resolved" "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz" - "version" "1.1.0" - -"follow-redirects@^1.15.0": - "version" "1.15.3" - -"form-data@^4.0.0": - "version" "4.0.0" - dependencies: - "asynckit" "^0.4.0" - "combined-stream" "^1.0.8" - "mime-types" "^2.1.12" - -"fs.realpath@^1.0.0": - "version" "1.0.0" - -"glob-parent@^5.1.2", "glob-parent@~5.1.2": - "version" "5.1.2" - dependencies: - "is-glob" "^4.0.1" - -"glob-parent@^6.0.2": - "version" "6.0.2" - dependencies: - "is-glob" "^4.0.3" - -"glob@^7.1.3": - "version" "7.2.3" - 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" - -"globals@^13.19.0": - "version" "13.23.0" - dependencies: - "type-fest" "^0.20.2" - -"globby@^11.1.0": - "version" "11.1.0" - 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" - -"graphemer@^1.4.0": - "version" "1.4.0" - -"has-flag@^3.0.0": - "version" "3.0.0" - -"has-flag@^4.0.0": - "version" "4.0.0" - -"ignore-by-default@^1.0.1": - "version" "1.0.1" - -"ignore@^5.2.0", "ignore@^5.2.4": - "version" "5.2.4" - -"import-fresh@^3.2.1": - "version" "3.3.0" - dependencies: - "parent-module" "^1.0.0" - "resolve-from" "^4.0.0" - -"imurmurhash@^0.1.4": - "version" "0.1.4" - -"inflight@^1.0.4": - "version" "1.0.6" - dependencies: - "once" "^1.3.0" - "wrappy" "1" - -"inherits@^2.0.3", "inherits@2": - "version" "2.0.4" - -"is-arrayish@^0.3.1": - "integrity" "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - "resolved" "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz" - "version" "0.3.2" - -"is-binary-path@~2.1.0": - "version" "2.1.0" - dependencies: - "binary-extensions" "^2.0.0" - -"is-extglob@^2.1.1": - "version" "2.1.1" - -"is-glob@^4.0.0", "is-glob@^4.0.1", "is-glob@^4.0.3", "is-glob@~4.0.1": - "version" "4.0.3" - dependencies: - "is-extglob" "^2.1.1" - -"is-number@^7.0.0": - "version" "7.0.0" - -"is-path-inside@^3.0.3": - "version" "3.0.3" - -"is-stream@^2.0.0": - "integrity" "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" - "resolved" "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" - "version" "2.0.1" - -"isexe@^2.0.0": - "version" "2.0.0" - -"isows@1.0.3": - "version" "1.0.3" - -"js-yaml@^4.1.0": - "version" "4.1.0" - dependencies: - "argparse" "^2.0.1" - -"json-buffer@3.0.1": - "version" "3.0.1" - -"json-schema-traverse@^0.4.1": - "version" "0.4.1" - -"json-stable-stringify-without-jsonify@^1.0.1": - "version" "1.0.1" - -"keyv@^4.5.3": - "version" "4.5.4" - dependencies: - "json-buffer" "3.0.1" - -"kuler@^2.0.0": - "integrity" "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" - "resolved" "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz" - "version" "2.0.0" - -"levn@^0.4.1": - "version" "0.4.1" - dependencies: - "prelude-ls" "^1.2.1" - "type-check" "~0.4.0" - -"locate-path@^6.0.0": - "version" "6.0.0" - dependencies: - "p-locate" "^5.0.0" - -"lodash.merge@^4.6.2": - "version" "4.6.2" - -"logform@^2.3.2", "logform@^2.4.0": - "integrity" "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==" - "resolved" "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz" - "version" "2.6.0" - dependencies: - "@colors/colors" "1.6.0" - "@types/triple-beam" "^1.3.2" - "fecha" "^4.2.0" - "ms" "^2.1.1" - "safe-stable-stringify" "^2.3.1" - "triple-beam" "^1.3.0" - -"lru-cache@^6.0.0": - "version" "6.0.0" - dependencies: - "yallist" "^4.0.0" - -"make-error@^1.1.1": - "version" "1.3.6" - -"merge2@^1.3.0", "merge2@^1.4.1": - "version" "1.4.1" - -"micromatch@^4.0.4": - "version" "4.0.5" - dependencies: - "braces" "^3.0.2" - "picomatch" "^2.3.1" - -"mime-db@1.52.0": - "version" "1.52.0" - -"mime-types@^2.1.12": - "version" "2.1.35" - dependencies: - "mime-db" "1.52.0" - -"minimatch@^3.0.5", "minimatch@^3.1.1", "minimatch@^3.1.2": - "version" "3.1.2" - dependencies: - "brace-expansion" "^1.1.7" - -"ms@^2.1.1", "ms@2.1.2": - "version" "2.1.2" - -"natural-compare@^1.4.0": - "version" "1.4.0" - -"nodemon@^3.0.1": - "version" "3.0.1" - dependencies: - "chokidar" "^3.5.2" - "debug" "^3.2.7" - "ignore-by-default" "^1.0.1" - "minimatch" "^3.1.2" - "pstree.remy" "^1.1.8" - "semver" "^7.5.3" - "simple-update-notifier" "^2.0.0" - "supports-color" "^5.5.0" - "touch" "^3.1.0" - "undefsafe" "^2.0.5" - -"nopt@~1.0.10": - "version" "1.0.10" - dependencies: - "abbrev" "1" - -"normalize-path@^3.0.0", "normalize-path@~3.0.0": - "version" "3.0.0" - -"once@^1.3.0": - "version" "1.4.0" - dependencies: - "wrappy" "1" - -"one-time@^1.0.0": - "integrity" "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==" - "resolved" "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "fn.name" "1.x.x" - -"optionator@^0.9.3": - "version" "0.9.3" - 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" - -"p-limit@^3.0.2": - "version" "3.1.0" - dependencies: - "yocto-queue" "^0.1.0" - -"p-locate@^5.0.0": - "version" "5.0.0" - dependencies: - "p-limit" "^3.0.2" - -"parent-module@^1.0.0": - "version" "1.0.1" - dependencies: - "callsites" "^3.0.0" - -"path-exists@^4.0.0": - "version" "4.0.0" - -"path-is-absolute@^1.0.0": - "version" "1.0.1" - -"path-key@^3.1.0": - "version" "3.1.1" - -"path-type@^4.0.0": - "version" "4.0.0" - -"picomatch@^2.0.4", "picomatch@^2.2.1", "picomatch@^2.3.1": - "version" "2.3.1" - -"prelude-ls@^1.2.1": - "version" "1.2.1" - -"prettier@^3.0.3": - "version" "3.0.3" - -"proxy-from-env@^1.1.0": - "version" "1.1.0" - -"pstree.remy@^1.1.8": - "version" "1.1.8" - -"punycode@^2.1.0": - "version" "2.3.0" - -"queue-microtask@^1.2.2": - "version" "1.2.3" - -"readable-stream@^3.4.0", "readable-stream@^3.6.0": - "integrity" "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==" - "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" - "version" "3.6.2" - dependencies: - "inherits" "^2.0.3" - "string_decoder" "^1.1.1" - "util-deprecate" "^1.0.1" - -"readdirp@~3.6.0": - "version" "3.6.0" - dependencies: - "picomatch" "^2.2.1" - -"resolve-from@^4.0.0": - "version" "4.0.0" - -"reusify@^1.0.4": - "version" "1.0.4" - -"rimraf@^3.0.2": - "version" "3.0.2" - dependencies: - "glob" "^7.1.3" - -"run-parallel@^1.1.9": - "version" "1.2.0" - dependencies: - "queue-microtask" "^1.2.2" - -"safe-buffer@~5.2.0": - "integrity" "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - "version" "5.2.1" - -"safe-stable-stringify@^2.3.1": - "integrity" "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==" - "resolved" "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz" - "version" "2.4.3" - -"semver@^7.5.3", "semver@^7.5.4": - "version" "7.5.4" - dependencies: - "lru-cache" "^6.0.0" - -"shebang-command@^2.0.0": - "version" "2.0.0" - dependencies: - "shebang-regex" "^3.0.0" - -"shebang-regex@^3.0.0": - "version" "3.0.0" - -"simple-swizzle@^0.2.2": - "integrity" "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==" - "resolved" "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" - "version" "0.2.2" - dependencies: - "is-arrayish" "^0.3.1" - -"simple-update-notifier@^2.0.0": - "version" "2.0.0" - dependencies: - "semver" "^7.5.3" - -"slash@^3.0.0": - "version" "3.0.0" - -"stack-trace@0.0.x": - "integrity" "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==" - "resolved" "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz" - "version" "0.0.10" - -"string_decoder@^1.1.1": - "integrity" "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==" - "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - "version" "1.3.0" - dependencies: - "safe-buffer" "~5.2.0" - -"strip-ansi@^6.0.1": - "version" "6.0.1" - dependencies: - "ansi-regex" "^5.0.1" - -"strip-json-comments@^3.1.1": - "version" "3.1.1" - -"supports-color@^5.5.0": - "version" "5.5.0" - dependencies: - "has-flag" "^3.0.0" - -"supports-color@^7.1.0": - "version" "7.2.0" - dependencies: - "has-flag" "^4.0.0" - -"text-hex@1.0.x": - "integrity" "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" - "resolved" "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz" - "version" "1.0.0" - -"text-table@^0.2.0": - "version" "0.2.0" - -"to-regex-range@^5.0.1": - "version" "5.0.1" - dependencies: - "is-number" "^7.0.0" - -"touch@^3.1.0": - "version" "3.1.0" - dependencies: - "nopt" "~1.0.10" - -"triple-beam@^1.3.0": - "integrity" "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==" - "resolved" "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz" - "version" "1.4.1" - -"ts-api-utils@^1.0.1": - "version" "1.0.3" - -"ts-node@^10.9.1": - "version" "10.9.1" - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - "acorn" "^8.4.1" - "acorn-walk" "^8.1.1" - "arg" "^4.1.0" - "create-require" "^1.1.0" - "diff" "^4.0.1" - "make-error" "^1.1.1" - "v8-compile-cache-lib" "^3.0.1" - "yn" "3.1.1" - -"type-check@^0.4.0", "type-check@~0.4.0": - "version" "0.4.0" - dependencies: - "prelude-ls" "^1.2.1" - -"type-fest@^0.20.2": - "version" "0.20.2" - -"typescript@^5.2.2", "typescript@>=2.7", "typescript@>=4.2.0", "typescript@>=5.0.4": - "version" "5.2.2" - -"undefsafe@^2.0.5": - "version" "2.0.5" - -"undici-types@~5.25.1": - "integrity" "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==" - "resolved" "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz" - "version" "5.25.3" - -"uri-js@^4.2.2": - "version" "4.4.1" - dependencies: - "punycode" "^2.1.0" - -"util-deprecate@^1.0.1": - "integrity" "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - "resolved" "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - "version" "1.0.2" - -"v8-compile-cache-lib@^3.0.1": - "version" "3.0.1" - -"viem@^1.16.5": - "version" "1.16.5" - dependencies: - "@adraffy/ens-normalize" "1.9.4" - "@noble/curves" "1.2.0" - "@noble/hashes" "1.3.2" - "@scure/bip32" "1.3.2" - "@scure/bip39" "1.2.1" - "abitype" "0.9.8" - "isows" "1.0.3" - "ws" "8.13.0" - -"which@^2.0.1": - "version" "2.0.2" - dependencies: - "isexe" "^2.0.0" - -"winston-transport@^4.5.0": - "integrity" "sha512-wbBA9PbPAHxKiygo7ub7BYRiKxms0tpfU2ljtWzb3SjRjv5yl6Ozuy/TkXf00HTAt+Uylo3gSkNwzc4ME0wiIg==" - "resolved" "https://registry.npmjs.org/winston-transport/-/winston-transport-4.6.0.tgz" - "version" "4.6.0" - dependencies: - "logform" "^2.3.2" - "readable-stream" "^3.6.0" - "triple-beam" "^1.3.0" - -"winston@^3.11.0": - "integrity" "sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g==" - "resolved" "https://registry.npmjs.org/winston/-/winston-3.11.0.tgz" - "version" "3.11.0" - dependencies: - "@colors/colors" "^1.6.0" - "@dabh/diagnostics" "^2.0.2" - "async" "^3.2.3" - "is-stream" "^2.0.0" - "logform" "^2.4.0" - "one-time" "^1.0.0" - "readable-stream" "^3.4.0" - "safe-stable-stringify" "^2.3.1" - "stack-trace" "0.0.x" - "triple-beam" "^1.3.0" - "winston-transport" "^4.5.0" - -"wrappy@1": - "version" "1.0.2" - -"ws@*", "ws@8.13.0": - "version" "8.13.0" - -"yallist@^4.0.0": - "version" "4.0.0" - -"yn@3.1.1": - "version" "3.1.1" - -"yocto-queue@^0.1.0": - "version" "0.1.0" +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 6 + cacheKey: 8 + +"@aashutoshrathi/word-wrap@npm:^1.2.3": + version: 1.2.6 + resolution: "@aashutoshrathi/word-wrap@npm:1.2.6" + checksum: ada901b9e7c680d190f1d012c84217ce0063d8f5c5a7725bb91ec3c5ed99bb7572680eb2d2938a531ccbaec39a95422fcd8a6b4a13110c7d98dd75402f66a0cd + languageName: node + linkType: hard + +"@adraffy/ens-normalize@npm:1.9.4": + version: 1.9.4 + resolution: "@adraffy/ens-normalize@npm:1.9.4" + checksum: 7d7fff58ebe2c4961f7e5e61dad123aa6a63fec0df5c84af1fa41079dc05d398599690be4427b3a94d2baa94084544bcfdf2d51cbed7504b9b0583b0960ad550 + languageName: node + linkType: hard + +"@colors/colors@npm:1.6.0, @colors/colors@npm:^1.6.0": + version: 1.6.0 + resolution: "@colors/colors@npm:1.6.0" + checksum: aa209963e0c3218e80a4a20553ba8c0fbb6fa13140540b4e5f97923790be06801fc90172c1114fc8b7e888b3d012b67298cde6b9e81521361becfaee400c662f + languageName: node + linkType: hard + +"@cspotcode/source-map-support@npm:^0.8.0": + version: 0.8.1 + resolution: "@cspotcode/source-map-support@npm:0.8.1" + dependencies: + "@jridgewell/trace-mapping": 0.3.9 + checksum: 5718f267085ed8edb3e7ef210137241775e607ee18b77d95aa5bd7514f47f5019aa2d82d96b3bf342ef7aa890a346fa1044532ff7cc3009e7d24fce3ce6200fa + languageName: node + linkType: hard + +"@dabh/diagnostics@npm:^2.0.2": + version: 2.0.3 + resolution: "@dabh/diagnostics@npm:2.0.3" + dependencies: + colorspace: 1.1.x + enabled: 2.0.x + kuler: ^2.0.0 + checksum: 4879600c55c8315a0fb85fbb19057bad1adc08f0a080a8cb4e2b63f723c379bfc4283b68123a2b078d367b327dd8df12fcb27464efe791addc0a48b9df6d79a1 + languageName: node + linkType: hard + +"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": + version: 4.4.0 + resolution: "@eslint-community/eslint-utils@npm:4.4.0" + dependencies: + eslint-visitor-keys: ^3.3.0 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: cdfe3ae42b4f572cbfb46d20edafe6f36fc5fb52bf2d90875c58aefe226892b9677fef60820e2832caf864a326fe4fc225714c46e8389ccca04d5f9288aabd22 + languageName: node + linkType: hard + +"@eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": + version: 4.10.0 + resolution: "@eslint-community/regexpp@npm:4.10.0" + checksum: 2a6e345429ea8382aaaf3a61f865cae16ed44d31ca917910033c02dc00d505d939f10b81e079fa14d43b51499c640138e153b7e40743c4c094d9df97d4e56f7b + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^2.1.2": + version: 2.1.2 + resolution: "@eslint/eslintrc@npm:2.1.2" + 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 + checksum: bc742a1e3b361f06fedb4afb6bf32cbd27171292ef7924f61c62f2aed73048367bcc7ac68f98c06d4245cd3fabc43270f844e3c1699936d4734b3ac5398814a7 + languageName: node + linkType: hard + +"@eslint/js@npm:8.52.0": + version: 8.52.0 + resolution: "@eslint/js@npm:8.52.0" + checksum: 490893b8091a66415f4ac98b963d23eb287264ea3bd6af7ec788f0570705cf64fd6ab84b717785980f55e39d08ff5c7fde6d8e4391ccb507169370ce3a6d091a + languageName: node + linkType: hard + +"@humanwhocodes/config-array@npm:^0.11.13": + version: 0.11.13 + resolution: "@humanwhocodes/config-array@npm:0.11.13" + dependencies: + "@humanwhocodes/object-schema": ^2.0.1 + debug: ^4.1.1 + minimatch: ^3.0.5 + checksum: f8ea57b0d7ed7f2d64cd3944654976829d9da91c04d9c860e18804729a33f7681f78166ef4c761850b8c324d362f7d53f14c5c44907a6b38b32c703ff85e4805 + languageName: node + linkType: hard + +"@humanwhocodes/module-importer@npm:^1.0.1": + version: 1.0.1 + resolution: "@humanwhocodes/module-importer@npm:1.0.1" + checksum: 0fd22007db8034a2cdf2c764b140d37d9020bbfce8a49d3ec5c05290e77d4b0263b1b972b752df8c89e5eaa94073408f2b7d977aed131faf6cf396ebb5d7fb61 + languageName: node + linkType: hard + +"@humanwhocodes/object-schema@npm:^2.0.1": + version: 2.0.1 + resolution: "@humanwhocodes/object-schema@npm:2.0.1" + checksum: 24929487b1ed48795d2f08346a0116cc5ee4634848bce64161fb947109352c562310fd159fc64dda0e8b853307f5794605191a9547f7341158559ca3c8262a45 + languageName: node + linkType: hard + +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: ^5.1.2 + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: ^7.0.1 + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: ^8.1.0 + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: 4a473b9b32a7d4d3cfb7a614226e555091ff0c5a29a1734c28c72a182c2f6699b26fc6b5c2131dfd841e86b185aea714c72201d7c98c2fba5f17709333a67aeb + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.0.3": + version: 3.1.1 + resolution: "@jridgewell/resolve-uri@npm:3.1.1" + checksum: f5b441fe7900eab4f9155b3b93f9800a916257f4e8563afbcd3b5a5337b55e52bd8ae6735453b1b745457d9f6cdb16d74cd6220bbdd98cf153239e13f6cbb653 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10": + version: 1.4.15 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" + checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:0.3.9": + version: 0.3.9 + resolution: "@jridgewell/trace-mapping@npm:0.3.9" + dependencies: + "@jridgewell/resolve-uri": ^3.0.3 + "@jridgewell/sourcemap-codec": ^1.4.10 + checksum: d89597752fd88d3f3480845691a05a44bd21faac18e2185b6f436c3b0fd0c5a859fbbd9aaa92050c4052caf325ad3e10e2e1d1b64327517471b7d51babc0ddef + languageName: node + linkType: hard + +"@noble/curves@npm:1.2.0, @noble/curves@npm:~1.2.0": + version: 1.2.0 + resolution: "@noble/curves@npm:1.2.0" + dependencies: + "@noble/hashes": 1.3.2 + checksum: bb798d7a66d8e43789e93bc3c2ddff91a1e19fdb79a99b86cd98f1e5eff0ee2024a2672902c2576ef3577b6f282f3b5c778bebd55761ddbb30e36bf275e83dd0 + languageName: node + linkType: hard + +"@noble/hashes@npm:1.3.2, @noble/hashes@npm:~1.3.0, @noble/hashes@npm:~1.3.2": + version: 1.3.2 + resolution: "@noble/hashes@npm:1.3.2" + checksum: fe23536b436539d13f90e4b9be843cc63b1b17666a07634a2b1259dded6f490be3d050249e6af98076ea8f2ea0d56f578773c2197f2aa0eeaa5fba5bc18ba474 + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": 2.0.5 + run-parallel: ^1.1.9 + checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59 + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": 2.1.5 + fastq: ^1.6.0 + checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53 + languageName: node + linkType: hard + +"@npmcli/fs@npm:^3.1.0": + version: 3.1.0 + resolution: "@npmcli/fs@npm:3.1.0" + dependencies: + semver: ^7.3.5 + checksum: a50a6818de5fc557d0b0e6f50ec780a7a02ab8ad07e5ac8b16bf519e0ad60a144ac64f97d05c443c3367235d337182e1d012bbac0eb8dbae8dc7b40b193efd0e + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 6ad6a00fc4f2f2cfc6bff76fb1d88b8ee20bc0601e18ebb01b6d4be583733a860239a521a7fbca73b612e66705078809483549d2b18f370eb346c5155c8e4a0f + languageName: node + linkType: hard + +"@scure/base@npm:~1.1.0, @scure/base@npm:~1.1.2": + version: 1.1.3 + resolution: "@scure/base@npm:1.1.3" + checksum: 1606ab8a4db898cb3a1ada16c15437c3bce4e25854fadc8eb03ae93cbbbac1ed90655af4b0be3da37e12056fef11c0374499f69b9e658c9e5b7b3e06353c630c + languageName: node + linkType: hard + +"@scure/bip32@npm:1.3.2": + version: 1.3.2 + resolution: "@scure/bip32@npm:1.3.2" + dependencies: + "@noble/curves": ~1.2.0 + "@noble/hashes": ~1.3.2 + "@scure/base": ~1.1.2 + checksum: c5ae84fae43490853693b481531132b89e056d45c945fc8b92b9d032577f753dfd79c5a7bbcbf0a7f035951006ff0311b6cf7a389e26c9ec6335e42b20c53157 + languageName: node + linkType: hard + +"@scure/bip39@npm:1.2.1": + version: 1.2.1 + resolution: "@scure/bip39@npm:1.2.1" + dependencies: + "@noble/hashes": ~1.3.0 + "@scure/base": ~1.1.0 + checksum: c5bd6f1328fdbeae2dcdd891825b1610225310e5e62a4942714db51066866e4f7bef242c7b06a1b9dcc8043a4a13412cf5c5df76d3b10aa9e36b82e9b6e3eeaa + languageName: node + linkType: hard + +"@tootallnate/once@npm:2": + version: 2.0.0 + resolution: "@tootallnate/once@npm:2.0.0" + checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 + languageName: node + linkType: hard + +"@tsconfig/node10@npm:^1.0.7": + version: 1.0.9 + resolution: "@tsconfig/node10@npm:1.0.9" + checksum: a33ae4dc2a621c0678ac8ac4bceb8e512ae75dac65417a2ad9b022d9b5411e863c4c198b6ba9ef659e14b9fb609bbec680841a2e84c1172df7a5ffcf076539df + languageName: node + linkType: hard + +"@tsconfig/node12@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node12@npm:1.0.11" + checksum: 5ce29a41b13e7897a58b8e2df11269c5395999e588b9a467386f99d1d26f6c77d1af2719e407621412520ea30517d718d5192a32403b8dfcc163bf33e40a338a + languageName: node + linkType: hard + +"@tsconfig/node14@npm:^1.0.0": + version: 1.0.3 + resolution: "@tsconfig/node14@npm:1.0.3" + checksum: 19275fe80c4c8d0ad0abed6a96dbf00642e88b220b090418609c4376e1cef81bf16237bf170ad1b341452feddb8115d8dd2e5acdfdea1b27422071163dc9ba9d + languageName: node + linkType: hard + +"@tsconfig/node16@npm:^1.0.2": + version: 1.0.4 + resolution: "@tsconfig/node16@npm:1.0.4" + checksum: 202319785901f942a6e1e476b872d421baec20cf09f4b266a1854060efbf78cde16a4d256e8bc949d31e6cd9a90f1e8ef8fb06af96a65e98338a2b6b0de0a0ff + languageName: node + linkType: hard + +"@types/json-schema@npm:^7.0.12": + version: 7.0.14 + resolution: "@types/json-schema@npm:7.0.14" + checksum: 4b3dd99616c7c808201c56f6c7f6552eb67b5c0c753ab3fa03a6cb549aae950da537e9558e53fa65fba23d1be624a1e4e8d20c15027efbe41e03ca56f2b04fb0 + languageName: node + linkType: hard + +"@types/node-cron@npm:^3.0.9": + version: 3.0.9 + resolution: "@types/node-cron@npm:3.0.9" + checksum: 8335eb0a453b956cc2da5431269e4732e0063c6cca0763cf779c7c242d0dfe3eea1929951a0b11fb9e7a2eee838836ee8cda79e9d6098b1bee91d5a17dce1e73 + languageName: node + linkType: hard + +"@types/node@npm:^20.8.6": + version: 20.8.6 + resolution: "@types/node@npm:20.8.6" + dependencies: + undici-types: ~5.25.1 + checksum: ccfb7ac482c5a96edeb239893c5c099f5257fcc2ed9ae62fefdfbc782b79e16dbc2af9a85b379665237bf759904b44ca2be68e75d239e0297882aad42f61905c + languageName: node + linkType: hard + +"@types/semver@npm:^7.5.0": + version: 7.5.4 + resolution: "@types/semver@npm:7.5.4" + checksum: 120c0189f6fec5f2d12d0d71ac8a4cfa952dc17fa3d842e8afddb82bba8828a4052f8799c1653e2b47ae1977435f38e8985658fde971905ce5afb8e23ee97ecf + languageName: node + linkType: hard + +"@types/triple-beam@npm:^1.3.2": + version: 1.3.4 + resolution: "@types/triple-beam@npm:1.3.4" + checksum: 869641358164a9b87aec710e046c11a65803b7dc3545f33c3365df9590d1059c70592bb35a7fc4099fa746f112ab5a207881ba9fb570e9b1dea4ffd89761d804 + languageName: node + linkType: hard + +"@typescript-eslint/eslint-plugin@npm:^6.7.5": + version: 6.9.0 + resolution: "@typescript-eslint/eslint-plugin@npm:6.9.0" + dependencies: + "@eslint-community/regexpp": ^4.5.1 + "@typescript-eslint/scope-manager": 6.9.0 + "@typescript-eslint/type-utils": 6.9.0 + "@typescript-eslint/utils": 6.9.0 + "@typescript-eslint/visitor-keys": 6.9.0 + debug: ^4.3.4 + graphemer: ^1.4.0 + ignore: ^5.2.4 + natural-compare: ^1.4.0 + semver: ^7.5.4 + ts-api-utils: ^1.0.1 + peerDependencies: + "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 51d7afc18bab711e20147f7163083f05435b6860174169eae56de217ed2cb1b3c08cba01b7d338315c2d8ecb982e83ce8f2ca7d2108c1c7c04faff2001b094d3 + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:^6.7.5": + version: 6.9.0 + resolution: "@typescript-eslint/parser@npm:6.9.0" + dependencies: + "@typescript-eslint/scope-manager": 6.9.0 + "@typescript-eslint/types": 6.9.0 + "@typescript-eslint/typescript-estree": 6.9.0 + "@typescript-eslint/visitor-keys": 6.9.0 + debug: ^4.3.4 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: d8ff69d236d6495474ab93c67e2785cc94bf9c098f25c33f1c5958a4b2b5af2b70edf1cdd0c23ee3436df454a769e80eb47d2d34df8382a826fcdb79bac4382d + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:6.9.0": + version: 6.9.0 + resolution: "@typescript-eslint/scope-manager@npm:6.9.0" + dependencies: + "@typescript-eslint/types": 6.9.0 + "@typescript-eslint/visitor-keys": 6.9.0 + checksum: b7ddcea11bdb95107659800bdf3b33eae22a4dc5c28dc0f8dc5507aa9affaae0e332b6d8c7d5286a7ec75e7c4abd211eb9fdf9647a9a796689cdcc11f6ab40c6 + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:6.9.0": + version: 6.9.0 + resolution: "@typescript-eslint/type-utils@npm:6.9.0" + dependencies: + "@typescript-eslint/typescript-estree": 6.9.0 + "@typescript-eslint/utils": 6.9.0 + debug: ^4.3.4 + ts-api-utils: ^1.0.1 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 279b0000cd2fe7ccfbd2f311736b14c8bb9287081f553c9452c95966650c822e67442ba5a62d7fea3ee2f61ccc0fcb218f21e1ee7ccf3984c52e5942d2bbb065 + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:6.9.0": + version: 6.9.0 + resolution: "@typescript-eslint/types@npm:6.9.0" + checksum: e0444afa1f2ebca746c72b3d0bf95982eb1e8b4fb91bcba465c1345c35fa13b36c589bfd91c776b864f223bc50817b2613df5892185c2e34332bf4cc57cc865d + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:6.9.0": + version: 6.9.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.9.0" + dependencies: + "@typescript-eslint/types": 6.9.0 + "@typescript-eslint/visitor-keys": 6.9.0 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + semver: ^7.5.4 + ts-api-utils: ^1.0.1 + peerDependenciesMeta: + typescript: + optional: true + checksum: 51088c23cca608a6e5c195b0a2d8a17ad00ca47199ba4df0c1013912a80194bff9f5bd4d035d6ab2596788491e9a3e04bbf6cad6494a3b1bbd59fea442750268 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:6.9.0": + version: 6.9.0 + resolution: "@typescript-eslint/utils@npm:6.9.0" + dependencies: + "@eslint-community/eslint-utils": ^4.4.0 + "@types/json-schema": ^7.0.12 + "@types/semver": ^7.5.0 + "@typescript-eslint/scope-manager": 6.9.0 + "@typescript-eslint/types": 6.9.0 + "@typescript-eslint/typescript-estree": 6.9.0 + semver: ^7.5.4 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + checksum: 973c24d7858f224934958ee58c21ff21dfe54dbb1d0e0c5f889298fadcd7ee2dbfd49cf86ccafab74d428c31de66cd9beee7c39d2b64f9edcc9e941573bac175 + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:6.9.0": + version: 6.9.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.9.0" + dependencies: + "@typescript-eslint/types": 6.9.0 + eslint-visitor-keys: ^3.4.1 + checksum: de8e2e363df41e5ae9774a5ebd1c49d29c771ea8b3869917f65a74cd4d14a67417c79916f456ee81ef5b0d947b7b8975385fc6eea3f1812d53a2eaaea832459e + languageName: node + linkType: hard + +"@ungap/structured-clone@npm:^1.2.0": + version: 1.2.0 + resolution: "@ungap/structured-clone@npm:1.2.0" + checksum: 4f656b7b4672f2ce6e272f2427d8b0824ed11546a601d8d5412b9d7704e83db38a8d9f402ecdf2b9063fc164af842ad0ec4a55819f621ed7e7ea4d1efcc74524 + languageName: node + linkType: hard + +"abbrev@npm:1, abbrev@npm:^1.0.0": + version: 1.1.1 + resolution: "abbrev@npm:1.1.1" + checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 + languageName: node + linkType: hard + +"abitype@npm:0.9.8": + version: 0.9.8 + resolution: "abitype@npm:0.9.8" + peerDependencies: + typescript: ">=5.0.4" + zod: ^3 >=3.19.1 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + checksum: d7d887f29d6821e3f7a400de9620511b80ead3f85c5c87308aaec97965d3493e6687ed816e88722b4f512249bd66dee9e69231b49af0e1db8f69400a62c87cf6 + languageName: node + linkType: hard + +"acorn-jsx@npm:^5.3.2": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: c3d3b2a89c9a056b205b69530a37b972b404ee46ec8e5b341666f9513d3163e2a4f214a71f4dfc7370f5a9c07472d2fd1c11c91c3f03d093e37637d95da98950 + languageName: node + linkType: hard + +"acorn-walk@npm:^8.1.1": + version: 8.2.0 + resolution: "acorn-walk@npm:8.2.0" + checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1 + languageName: node + linkType: hard + +"acorn@npm:^8.4.1, acorn@npm:^8.9.0": + version: 8.10.0 + resolution: "acorn@npm:8.10.0" + bin: + acorn: bin/acorn + checksum: 538ba38af0cc9e5ef983aee196c4b8b4d87c0c94532334fa7e065b2c8a1f85863467bb774231aae91613fcda5e68740c15d97b1967ae3394d20faddddd8af61d + languageName: node + linkType: hard + +"agent-base@npm:6, agent-base@npm:^6.0.2": + version: 6.0.2 + resolution: "agent-base@npm:6.0.2" + dependencies: + debug: 4 + checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d + languageName: node + linkType: hard + +"agentkeepalive@npm:^4.2.1": + version: 4.5.0 + resolution: "agentkeepalive@npm:4.5.0" + dependencies: + humanize-ms: ^1.2.1 + checksum: 13278cd5b125e51eddd5079f04d6fe0914ac1b8b91c1f3db2c1822f99ac1a7457869068997784342fe455d59daaff22e14fb7b8c3da4e741896e7e31faf92481 + languageName: node + linkType: hard + +"aggregate-error@npm:^3.0.0": + version: 3.1.0 + resolution: "aggregate-error@npm:3.1.0" + dependencies: + clean-stack: ^2.0.0 + indent-string: ^4.0.0 + checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 + languageName: node + linkType: hard + +"ajv@npm:^6.12.4": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" + 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 + checksum: 874972efe5c4202ab0a68379481fbd3d1b5d0a7bd6d3cc21d40d3536ebff3352a2a1fabb632d4fd2cc7fe4cbdcd5ed6782084c9bbf7f32a1536d18f9da5007d4 + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b + languageName: node + linkType: hard + +"ansi-regex@npm:^6.0.1": + version: 6.0.1 + resolution: "ansi-regex@npm:6.0.1" + checksum: 1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: ^2.0.1 + checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 + languageName: node + linkType: hard + +"ansi-styles@npm:^6.1.0": + version: 6.2.1 + resolution: "ansi-styles@npm:6.2.1" + checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 + languageName: node + linkType: hard + +"anymatch@npm:~3.1.2": + version: 3.1.3 + resolution: "anymatch@npm:3.1.3" + dependencies: + normalize-path: ^3.0.0 + picomatch: ^2.0.4 + checksum: 3e044fd6d1d26545f235a9fe4d7a534e2029d8e59fa7fd9f2a6eb21230f6b5380ea1eaf55136e60cbf8e613544b3b766e7a6fa2102e2a3a117505466e3025dc2 + languageName: node + linkType: hard + +"aproba@npm:^1.0.3 || ^2.0.0": + version: 2.0.0 + resolution: "aproba@npm:2.0.0" + checksum: 5615cadcfb45289eea63f8afd064ab656006361020e1735112e346593856f87435e02d8dcc7ff0d11928bc7d425f27bc7c2a84f6c0b35ab0ff659c814c138a24 + languageName: node + linkType: hard + +"are-we-there-yet@npm:^3.0.0": + version: 3.0.1 + resolution: "are-we-there-yet@npm:3.0.1" + dependencies: + delegates: ^1.0.0 + readable-stream: ^3.6.0 + checksum: 52590c24860fa7173bedeb69a4c05fb573473e860197f618b9a28432ee4379049336727ae3a1f9c4cb083114601c1140cee578376164d0e651217a9843f9fe83 + languageName: node + linkType: hard + +"arg@npm:^4.1.0": + version: 4.1.3 + resolution: "arg@npm:4.1.3" + checksum: 544af8dd3f60546d3e4aff084d451b96961d2267d668670199692f8d054f0415d86fc5497d0e641e91546f0aa920e7c29e5250e99fc89f5552a34b5d93b77f43 + languageName: node + linkType: hard + +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced + languageName: node + linkType: hard + +"array-union@npm:^2.1.0": + version: 2.1.0 + resolution: "array-union@npm:2.1.0" + checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d + languageName: node + linkType: hard + +"async@npm:^3.2.3": + version: 3.2.4 + resolution: "async@npm:3.2.4" + checksum: 43d07459a4e1d09b84a20772414aa684ff4de085cbcaec6eea3c7a8f8150e8c62aa6cd4e699fe8ee93c3a5b324e777d34642531875a0817a35697522c1b02e89 + languageName: node + linkType: hard + +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 7b78c451df768adba04e2d02e63e2d0bf3b07adcd6e42b4cf665cb7ce899bedd344c69a1dcbce355b5f972d597b25aaa1c1742b52cffd9caccb22f348114f6be + languageName: node + linkType: hard + +"axios@npm:^1.5.1": + version: 1.5.1 + resolution: "axios@npm:1.5.1" + dependencies: + follow-redirects: ^1.15.0 + form-data: ^4.0.0 + proxy-from-env: ^1.1.0 + checksum: 4444f06601f4ede154183767863d2b8e472b4a6bfc5253597ed6d21899887e1fd0ee2b3de792ac4f8459fe2e359d2aa07c216e45fd8b9e4e0688a6ebf48a5a8d + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 + languageName: node + linkType: hard + +"binary-extensions@npm:^2.0.0": + version: 2.2.0 + resolution: "binary-extensions@npm:2.2.0" + checksum: ccd267956c58d2315f5d3ea6757cf09863c5fc703e50fbeb13a7dc849b812ef76e3cf9ca8f35a0c48498776a7478d7b4a0418e1e2b8cb9cb9731f2922aaad7f8 + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: ^1.0.0 + concat-map: 0.0.1 + checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" + dependencies: + balanced-match: ^1.0.0 + checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 + languageName: node + linkType: hard + +"braces@npm:^3.0.2, braces@npm:~3.0.2": + version: 3.0.2 + resolution: "braces@npm:3.0.2" + dependencies: + fill-range: ^7.0.1 + checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 + languageName: node + linkType: hard + +"cacache@npm:^17.0.0": + version: 17.1.4 + resolution: "cacache@npm:17.1.4" + dependencies: + "@npmcli/fs": ^3.1.0 + fs-minipass: ^3.0.0 + glob: ^10.2.2 + lru-cache: ^7.7.1 + minipass: ^7.0.3 + minipass-collect: ^1.0.2 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + p-map: ^4.0.0 + ssri: ^10.0.0 + tar: ^6.1.11 + unique-filename: ^3.0.0 + checksum: b7751df756656954a51201335addced8f63fc53266fa56392c9f5ae83c8d27debffb4458ac2d168a744a4517ec3f2163af05c20097f93d17bdc2dc8a385e14a6 + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 + languageName: node + linkType: hard + +"chalk@npm:^4.0.0": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: ^4.1.0 + supports-color: ^7.1.0 + checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc + languageName: node + linkType: hard + +"chokidar@npm:^3.5.2": + version: 3.5.3 + resolution: "chokidar@npm:3.5.3" + dependencies: + anymatch: ~3.1.2 + braces: ~3.0.2 + fsevents: ~2.3.2 + glob-parent: ~5.1.2 + is-binary-path: ~2.1.0 + is-glob: ~4.0.1 + normalize-path: ~3.0.0 + readdirp: ~3.6.0 + dependenciesMeta: + fsevents: + optional: true + checksum: b49fcde40176ba007ff361b198a2d35df60d9bb2a5aab228279eb810feae9294a6b4649ab15981304447afe1e6ffbf4788ad5db77235dc770ab777c6e771980c + languageName: node + linkType: hard + +"chownr@npm:^2.0.0": + version: 2.0.0 + resolution: "chownr@npm:2.0.0" + checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f + languageName: node + linkType: hard + +"clean-stack@npm:^2.0.0": + version: 2.2.0 + resolution: "clean-stack@npm:2.2.0" + checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 + languageName: node + linkType: hard + +"color-convert@npm:^1.9.3": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" + dependencies: + color-name: 1.1.3 + checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: ~1.1.4 + checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 + languageName: node + linkType: hard + +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d + languageName: node + linkType: hard + +"color-name@npm:^1.0.0, color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 + languageName: node + linkType: hard + +"color-string@npm:^1.6.0": + version: 1.9.1 + resolution: "color-string@npm:1.9.1" + dependencies: + color-name: ^1.0.0 + simple-swizzle: ^0.2.2 + checksum: c13fe7cff7885f603f49105827d621ce87f4571d78ba28ef4a3f1a104304748f620615e6bf065ecd2145d0d9dad83a3553f52bb25ede7239d18e9f81622f1cc5 + languageName: node + linkType: hard + +"color-support@npm:^1.1.3": + version: 1.1.3 + resolution: "color-support@npm:1.1.3" + bin: + color-support: bin.js + checksum: 9b7356817670b9a13a26ca5af1c21615463b500783b739b7634a0c2047c16cef4b2865d7576875c31c3cddf9dd621fa19285e628f20198b233a5cfdda6d0793b + languageName: node + linkType: hard + +"color@npm:^3.1.3": + version: 3.2.1 + resolution: "color@npm:3.2.1" + dependencies: + color-convert: ^1.9.3 + color-string: ^1.6.0 + checksum: f81220e8b774d35865c2561be921f5652117638dcda7ca4029262046e37fc2444ac7bbfdd110cf1fd9c074a4ee5eda8f85944ffbdda26186b602dd9bb05f6400 + languageName: node + linkType: hard + +"colorspace@npm:1.1.x": + version: 1.1.4 + resolution: "colorspace@npm:1.1.4" + dependencies: + color: ^3.1.3 + text-hex: 1.0.x + checksum: bb3934ef3c417e961e6d03d7ca60ea6e175947029bfadfcdb65109b01881a1c0ecf9c2b0b59abcd0ee4a0d7c1eae93beed01b0e65848936472270a0b341ebce8 + languageName: node + linkType: hard + +"combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: ~1.0.0 + checksum: 49fa4aeb4916567e33ea81d088f6584749fc90c7abec76fd516bf1c5aa5c79f3584b5ba3de6b86d26ddd64bae5329c4c7479343250cfe71c75bb366eae53bb7c + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af + languageName: node + linkType: hard + +"console-control-strings@npm:^1.1.0": + version: 1.1.0 + resolution: "console-control-strings@npm:1.1.0" + checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed + languageName: node + linkType: hard + +"create-require@npm:^1.1.0": + version: 1.1.1 + resolution: "create-require@npm:1.1.1" + checksum: a9a1503d4390d8b59ad86f4607de7870b39cad43d929813599a23714831e81c520bddf61bcdd1f8e30f05fd3a2b71ae8538e946eb2786dc65c2bbc520f692eff + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2": + version: 7.0.3 + resolution: "cross-spawn@npm:7.0.3" + dependencies: + path-key: ^3.1.0 + shebang-command: ^2.0.0 + which: ^2.0.1 + checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": + version: 4.3.4 + resolution: "debug@npm:4.3.4" + dependencies: + ms: 2.1.2 + peerDependenciesMeta: + supports-color: + optional: true + checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 + languageName: node + linkType: hard + +"debug@npm:^3.2.7": + version: 3.2.7 + resolution: "debug@npm:3.2.7" + dependencies: + ms: ^2.1.1 + checksum: b3d8c5940799914d30314b7c3304a43305fd0715581a919dacb8b3176d024a782062368405b47491516d2091d6462d4d11f2f4974a405048094f8bfebfa3071c + languageName: node + linkType: hard + +"deep-is@npm:^0.1.3": + version: 0.1.4 + resolution: "deep-is@npm:0.1.4" + checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 + languageName: node + linkType: hard + +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020 + languageName: node + linkType: hard + +"delegates@npm:^1.0.0": + version: 1.0.0 + resolution: "delegates@npm:1.0.0" + checksum: a51744d9b53c164ba9c0492471a1a2ffa0b6727451bdc89e31627fdf4adda9d51277cfcbfb20f0a6f08ccb3c436f341df3e92631a3440226d93a8971724771fd + languageName: node + linkType: hard + +"diff@npm:^4.0.1": + version: 4.0.2 + resolution: "diff@npm:4.0.2" + checksum: f2c09b0ce4e6b301c221addd83bf3f454c0bc00caa3dd837cf6c127d6edf7223aa2bbe3b688feea110b7f262adbfc845b757c44c8a9f8c0c5b15d8fa9ce9d20d + languageName: node + linkType: hard + +"dir-glob@npm:^3.0.1": + version: 3.0.1 + resolution: "dir-glob@npm:3.0.1" + dependencies: + path-type: ^4.0.0 + checksum: fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 + languageName: node + linkType: hard + +"doctrine@npm:^3.0.0": + version: 3.0.0 + resolution: "doctrine@npm:3.0.0" + dependencies: + esutils: ^2.0.2 + checksum: fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce + languageName: node + linkType: hard + +"dotenv@npm:^16.3.1": + version: 16.3.1 + resolution: "dotenv@npm:16.3.1" + checksum: 15d75e7279018f4bafd0ee9706593dd14455ddb71b3bcba9c52574460b7ccaf67d5cf8b2c08a5af1a9da6db36c956a04a1192b101ee102a3e0cf8817bbcf3dfd + languageName: node + linkType: hard + +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 + languageName: node + linkType: hard + +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601 + languageName: node + linkType: hard + +"enabled@npm:2.0.x": + version: 2.0.0 + resolution: "enabled@npm:2.0.0" + checksum: 9d256d89f4e8a46ff988c6a79b22fa814b4ffd82826c4fdacd9b42e9b9465709d3b748866d0ab4d442dfc6002d81de7f7b384146ccd1681f6a7f868d2acca063 + languageName: node + linkType: hard + +"encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" + dependencies: + iconv-lite: ^0.6.2 + checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 + languageName: node + linkType: hard + +"eslint-config-prettier@npm:^9.0.0": + version: 9.0.0 + resolution: "eslint-config-prettier@npm:9.0.0" + peerDependencies: + eslint: ">=7.0.0" + bin: + eslint-config-prettier: bin/cli.js + checksum: 362e991b6cb343f79362bada2d97c202e5303e6865888918a7445c555fb75e4c078b01278e90be98aa98ae22f8597d8e93d48314bec6824f540f7efcab3ce451 + languageName: node + linkType: hard + +"eslint-scope@npm:^7.2.2": + version: 7.2.2 + resolution: "eslint-scope@npm:7.2.2" + dependencies: + esrecurse: ^4.3.0 + estraverse: ^5.2.0 + checksum: ec97dbf5fb04b94e8f4c5a91a7f0a6dd3c55e46bfc7bbcd0e3138c3a76977570e02ed89a1810c778dcd72072ff0e9621ba1379b4babe53921d71e2e4486fda3e + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": + version: 3.4.3 + resolution: "eslint-visitor-keys@npm:3.4.3" + checksum: 36e9ef87fca698b6fd7ca5ca35d7b2b6eeaaf106572e2f7fd31c12d3bfdaccdb587bba6d3621067e5aece31c8c3a348b93922ab8f7b2cbc6aaab5e1d89040c60 + languageName: node + linkType: hard + +"eslint@npm:^8.51.0": + version: 8.52.0 + resolution: "eslint@npm:8.52.0" + dependencies: + "@eslint-community/eslint-utils": ^4.2.0 + "@eslint-community/regexpp": ^4.6.1 + "@eslint/eslintrc": ^2.1.2 + "@eslint/js": 8.52.0 + "@humanwhocodes/config-array": ^0.11.13 + "@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 + bin: + eslint: bin/eslint.js + checksum: fd22d1e9bd7090e31b00cbc7a3b98f3b76020a4c4641f987ae7d0c8f52e1b88c3b268bdfdabac2e1a93513e5d11339b718ff45cbff48a44c35d7e52feba510ed + languageName: node + linkType: hard + +"espree@npm:^9.6.0, espree@npm:^9.6.1": + version: 9.6.1 + resolution: "espree@npm:9.6.1" + dependencies: + acorn: ^8.9.0 + acorn-jsx: ^5.3.2 + eslint-visitor-keys: ^3.4.1 + checksum: eb8c149c7a2a77b3f33a5af80c10875c3abd65450f60b8af6db1bfcfa8f101e21c1e56a561c6dc13b848e18148d43469e7cd208506238554fb5395a9ea5a1ab9 + languageName: node + linkType: hard + +"esquery@npm:^1.4.2": + version: 1.5.0 + resolution: "esquery@npm:1.5.0" + dependencies: + estraverse: ^5.1.0 + checksum: aefb0d2596c230118656cd4ec7532d447333a410a48834d80ea648b1e7b5c9bc9ed8b5e33a89cb04e487b60d622f44cf5713bf4abed7c97343edefdc84a35900 + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: ^5.2.0 + checksum: ebc17b1a33c51cef46fdc28b958994b1dc43cd2e86237515cbc3b4e5d2be6a811b2315d0a1a4d9d340b6d2308b15322f5c8291059521cc5f4802f65e7ec32837 + languageName: node + linkType: hard + +"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 22b5b08f74737379a840b8ed2036a5fb35826c709ab000683b092d9054e5c2a82c27818f12604bfc2a9a76b90b6834ef081edbc1c7ae30d1627012e067c6ec87 + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.1 + resolution: "exponential-backoff@npm:3.1.1" + checksum: 3d21519a4f8207c99f7457287291316306255a328770d320b401114ec8481986e4e467e854cb9914dd965e0a1ca810a23ccb559c642c88f4c7f55c55778a9b48 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d + languageName: node + linkType: hard + +"fast-glob@npm:^3.2.9": + version: 3.3.1 + resolution: "fast-glob@npm:3.3.1" + 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 + checksum: b6f3add6403e02cf3a798bfbb1183d0f6da2afd368f27456010c0bc1f9640aea308243d4cb2c0ab142f618276e65ecb8be1661d7c62a7b4e5ba774b9ce5432e5 + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:^2.0.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb + languageName: node + linkType: hard + +"fast-levenshtein@npm:^2.0.6": + version: 2.0.6 + resolution: "fast-levenshtein@npm:2.0.6" + checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.15.0 + resolution: "fastq@npm:1.15.0" + dependencies: + reusify: ^1.0.4 + checksum: 0170e6bfcd5d57a70412440b8ef600da6de3b2a6c5966aeaf0a852d542daff506a0ee92d6de7679d1de82e644bce69d7a574a6c93f0b03964b5337eed75ada1a + languageName: node + linkType: hard + +"fecha@npm:^4.2.0": + version: 4.2.3 + resolution: "fecha@npm:4.2.3" + checksum: f94e2fb3acf5a7754165d04549460d3ae6c34830394d20c552197e3e000035d69732d74af04b9bed3283bf29fe2a9ebdcc0085e640b0be3cc3658b9726265e31 + languageName: node + linkType: hard + +"file-entry-cache@npm:^6.0.1": + version: 6.0.1 + resolution: "file-entry-cache@npm:6.0.1" + dependencies: + flat-cache: ^3.0.4 + checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 + languageName: node + linkType: hard + +"fill-range@npm:^7.0.1": + version: 7.0.1 + resolution: "fill-range@npm:7.0.1" + dependencies: + to-regex-range: ^5.0.1 + checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 + languageName: node + linkType: hard + +"find-up@npm:^5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" + dependencies: + locate-path: ^6.0.0 + path-exists: ^4.0.0 + checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 + languageName: node + linkType: hard + +"flat-cache@npm:^3.0.4": + version: 3.1.1 + resolution: "flat-cache@npm:3.1.1" + dependencies: + flatted: ^3.2.9 + keyv: ^4.5.3 + rimraf: ^3.0.2 + checksum: 4958cfe0f46acf84953d4e16676ef5f0d38eab3a92d532a1e8d5f88f11eea8b36d5d598070ff2aeae15f1fde18f8d7d089eefaf9db10b5a587cc1c9072325c7a + languageName: node + linkType: hard + +"flatted@npm:^3.2.9": + version: 3.2.9 + resolution: "flatted@npm:3.2.9" + checksum: f14167fbe26a9d20f6fca8d998e8f1f41df72c8e81f9f2c9d61ed2bea058248f5e1cbd05e7f88c0e5087a6a0b822a1e5e2b446e879f3cfbe0b07ba2d7f80b026 + languageName: node + linkType: hard + +"fn.name@npm:1.x.x": + version: 1.1.0 + resolution: "fn.name@npm:1.1.0" + checksum: e357144f48cfc9a7f52a82bbc6c23df7c8de639fce049cac41d41d62cabb740cdb9f14eddc6485e29c933104455bdd7a69bb14a9012cef9cd4fa252a4d0cf293 + languageName: node + linkType: hard + +"follow-redirects@npm:^1.15.0": + version: 1.15.3 + resolution: "follow-redirects@npm:1.15.3" + peerDependenciesMeta: + debug: + optional: true + checksum: 584da22ec5420c837bd096559ebfb8fe69d82512d5585004e36a3b4a6ef6d5905780e0c74508c7b72f907d1fa2b7bd339e613859e9c304d0dc96af2027fd0231 + languageName: node + linkType: hard + +"foreground-child@npm:^3.1.0": + version: 3.1.1 + resolution: "foreground-child@npm:3.1.1" + dependencies: + cross-spawn: ^7.0.0 + signal-exit: ^4.0.1 + checksum: 139d270bc82dc9e6f8bc045fe2aae4001dc2472157044fdfad376d0a3457f77857fa883c1c8b21b491c6caade9a926a4bed3d3d2e8d3c9202b151a4cbbd0bcd5 + languageName: node + linkType: hard + +"form-data@npm:^4.0.0": + version: 4.0.0 + resolution: "form-data@npm:4.0.0" + dependencies: + asynckit: ^0.4.0 + combined-stream: ^1.0.8 + mime-types: ^2.1.12 + checksum: 01135bf8675f9d5c61ff18e2e2932f719ca4de964e3be90ef4c36aacfc7b9cb2fceb5eca0b7e0190e3383fe51c5b37f4cb80b62ca06a99aaabfcfd6ac7c9328c + languageName: node + linkType: hard + +"fs-minipass@npm:^2.0.0": + version: 2.1.0 + resolution: "fs-minipass@npm:2.1.0" + dependencies: + minipass: ^3.0.0 + checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1 + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: ^7.0.3 + checksum: 8722a41109130851d979222d3ec88aabaceeaaf8f57b2a8f744ef8bd2d1ce95453b04a61daa0078822bc5cd21e008814f06fe6586f56fef511e71b8d2394d802 + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 + languageName: node + linkType: hard + +"fsevents@npm:~2.3.2": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" + dependencies: + node-gyp: latest + checksum: 11e6ea6fea15e42461fc55b4b0e4a0a3c654faa567f1877dbd353f39156f69def97a69936d1746619d656c4b93de2238bf731f6085a03a50cabf287c9d024317 + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@~2.3.2#~builtin": + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=18f3a7" + dependencies: + node-gyp: latest + conditions: os=darwin + languageName: node + linkType: hard + +"gauge@npm:^4.0.3": + version: 4.0.4 + resolution: "gauge@npm:4.0.4" + dependencies: + aproba: ^1.0.3 || ^2.0.0 + color-support: ^1.1.3 + console-control-strings: ^1.1.0 + has-unicode: ^2.0.1 + signal-exit: ^3.0.7 + string-width: ^4.2.3 + strip-ansi: ^6.0.1 + wide-align: ^1.1.5 + checksum: 788b6bfe52f1dd8e263cda800c26ac0ca2ff6de0b6eee2fe0d9e3abf15e149b651bd27bf5226be10e6e3edb5c4e5d5985a5a1a98137e7a892f75eff76467ad2d + languageName: node + linkType: hard + +"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: ^4.0.1 + checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e + languageName: node + linkType: hard + +"glob-parent@npm:^6.0.2": + version: 6.0.2 + resolution: "glob-parent@npm:6.0.2" + dependencies: + is-glob: ^4.0.3 + checksum: c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8 + languageName: node + linkType: hard + +"glob@npm:^10.2.2": + version: 10.3.10 + resolution: "glob@npm:10.3.10" + dependencies: + foreground-child: ^3.1.0 + jackspeak: ^2.3.5 + minimatch: ^9.0.1 + minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 + path-scurry: ^1.10.1 + bin: + glob: dist/esm/bin.mjs + checksum: 4f2fe2511e157b5a3f525a54092169a5f92405f24d2aed3142f4411df328baca13059f4182f1db1bf933e2c69c0bd89e57ae87edd8950cba8c7ccbe84f721cf3 + languageName: node + linkType: hard + +"glob@npm:^7.1.3, glob@npm:^7.1.4": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + 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 + checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 + languageName: node + linkType: hard + +"globals@npm:^13.19.0": + version: 13.23.0 + resolution: "globals@npm:13.23.0" + dependencies: + type-fest: ^0.20.2 + checksum: 194c97cf8d1ef6ba59417234c2386549c4103b6e5f24b1ff1952de61a4753e5d2069435ba629de711a6480b1b1d114a98e2ab27f85e966d5a10c319c3bbd3dc3 + languageName: node + linkType: hard + +"globby@npm:^11.1.0": + version: 11.1.0 + resolution: "globby@npm:11.1.0" + 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 + checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.2.6": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 + languageName: node + linkType: hard + +"graphemer@npm:^1.4.0": + version: 1.4.0 + resolution: "graphemer@npm:1.4.0" + checksum: bab8f0be9b568857c7bec9fda95a89f87b783546d02951c40c33f84d05bb7da3fd10f863a9beb901463669b6583173a8c8cc6d6b306ea2b9b9d5d3d943c3a673 + languageName: node + linkType: hard + +"has-flag@npm:^3.0.0": + version: 3.0.0 + resolution: "has-flag@npm:3.0.0" + checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad + languageName: node + linkType: hard + +"has-unicode@npm:^2.0.1": + version: 2.0.1 + resolution: "has-unicode@npm:2.0.1" + checksum: 1eab07a7436512db0be40a710b29b5dc21fa04880b7f63c9980b706683127e3c1b57cb80ea96d47991bdae2dfe479604f6a1ba410106ee1046a41d1bd0814400 + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.1.1": + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236 + languageName: node + linkType: hard + +"http-proxy-agent@npm:^5.0.0": + version: 5.0.0 + resolution: "http-proxy-agent@npm:5.0.0" + dependencies: + "@tootallnate/once": 2 + agent-base: 6 + debug: 4 + checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^5.0.0": + version: 5.0.1 + resolution: "https-proxy-agent@npm:5.0.1" + dependencies: + agent-base: 6 + debug: 4 + checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 + languageName: node + linkType: hard + +"humanize-ms@npm:^1.2.1": + version: 1.2.1 + resolution: "humanize-ms@npm:1.2.1" + dependencies: + ms: ^2.0.0 + checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16 + languageName: node + linkType: hard + +"iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: ">= 2.1.2 < 3.0.0" + checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf + languageName: node + linkType: hard + +"ignore-by-default@npm:^1.0.1": + version: 1.0.1 + resolution: "ignore-by-default@npm:1.0.1" + checksum: 441509147b3615e0365e407a3c18e189f78c07af08564176c680be1fabc94b6c789cad1342ad887175d4ecd5225de86f73d376cec8e06b42fd9b429505ffcf8a + languageName: node + linkType: hard + +"ignore@npm:^5.2.0, ignore@npm:^5.2.4": + version: 5.2.4 + resolution: "ignore@npm:5.2.4" + checksum: 3d4c309c6006e2621659311783eaea7ebcd41fe4ca1d78c91c473157ad6666a57a2df790fe0d07a12300d9aac2888204d7be8d59f9aaf665b1c7fcdb432517ef + languageName: node + linkType: hard + +"import-fresh@npm:^3.2.1": + version: 3.3.0 + resolution: "import-fresh@npm:3.3.0" + dependencies: + parent-module: ^1.0.0 + resolve-from: ^4.0.0 + checksum: 2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 + languageName: node + linkType: hard + +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: ^1.3.0 + wrappy: 1 + checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd + languageName: node + linkType: hard + +"inherits@npm:2, inherits@npm:^2.0.3": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 + languageName: node + linkType: hard + +"ip@npm:^2.0.0": + version: 2.0.0 + resolution: "ip@npm:2.0.0" + checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349 + languageName: node + linkType: hard + +"is-arrayish@npm:^0.3.1": + version: 0.3.2 + resolution: "is-arrayish@npm:0.3.2" + checksum: 977e64f54d91c8f169b59afcd80ff19227e9f5c791fa28fa2e5bce355cbaf6c2c356711b734656e80c9dd4a854dd7efcf7894402f1031dfc5de5d620775b4d5f + languageName: node + linkType: hard + +"is-binary-path@npm:~2.1.0": + version: 2.1.0 + resolution: "is-binary-path@npm:2.1.0" + dependencies: + binary-extensions: ^2.0.0 + checksum: 84192eb88cff70d320426f35ecd63c3d6d495da9d805b19bc65b518984b7c0760280e57dbf119b7e9be6b161784a5a673ab2c6abe83abb5198a432232ad5b35c + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 + languageName: node + linkType: hard + +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: ^2.1.1 + checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 + languageName: node + linkType: hard + +"is-lambda@npm:^1.0.1": + version: 1.0.1 + resolution: "is-lambda@npm:1.0.1" + checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35 + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a + languageName: node + linkType: hard + +"is-path-inside@npm:^3.0.3": + version: 3.0.3 + resolution: "is-path-inside@npm:3.0.3" + checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 + languageName: node + linkType: hard + +"is-stream@npm:^2.0.0": + version: 2.0.1 + resolution: "is-stream@npm:2.0.1" + checksum: b8e05ccdf96ac330ea83c12450304d4a591f9958c11fd17bed240af8d5ffe08aedafa4c0f4cfccd4d28dc9d4d129daca1023633d5c11601a6cbc77521f6fae66 + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 + languageName: node + linkType: hard + +"isows@npm:1.0.3": + version: 1.0.3 + resolution: "isows@npm:1.0.3" + peerDependencies: + ws: "*" + checksum: 9cacd5cf59f67deb51e825580cd445ab1725ecb05a67c704050383fb772856f3cd5e7da8ad08f5a3bd2823680d77d099459d0c6a7037972a74d6429af61af440 + languageName: node + linkType: hard + +"jackspeak@npm:^2.3.5": + version: 2.3.6 + resolution: "jackspeak@npm:2.3.6" + dependencies: + "@isaacs/cliui": ^8.0.2 + "@pkgjs/parseargs": ^0.11.0 + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: 57d43ad11eadc98cdfe7496612f6bbb5255ea69fe51ea431162db302c2a11011642f50cfad57288bd0aea78384a0612b16e131944ad8ecd09d619041c8531b54 + languageName: node + linkType: hard + +"js-yaml@npm:^4.1.0": + version: 4.1.0 + resolution: "js-yaml@npm:4.1.0" + dependencies: + argparse: ^2.0.1 + bin: + js-yaml: bin/js-yaml.js + checksum: c7830dfd456c3ef2c6e355cc5a92e6700ceafa1d14bba54497b34a99f0376cecbb3e9ac14d3e5849b426d5a5140709a66237a8c991c675431271c4ce5504151a + languageName: node + linkType: hard + +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 9026b03edc2847eefa2e37646c579300a1f3a4586cfb62bf857832b60c852042d0d6ae55d1afb8926163fa54c2b01d83ae24705f34990348bdac6273a29d4581 + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 7486074d3ba247769fda17d5181b345c9fb7d12e0da98b22d1d71a5db9698d8b4bd900a3ec1a4ffdd60846fc2556274a5c894d0c48795f14cb03aeae7b55260b + languageName: node + linkType: hard + +"json-stable-stringify-without-jsonify@npm:^1.0.1": + version: 1.0.1 + resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" + checksum: cff44156ddce9c67c44386ad5cddf91925fe06b1d217f2da9c4910d01f358c6e3989c4d5a02683c7a5667f9727ff05831f7aa8ae66c8ff691c556f0884d49215 + languageName: node + linkType: hard + +"keyv@npm:^4.5.3": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" + dependencies: + json-buffer: 3.0.1 + checksum: 74a24395b1c34bd44ad5cb2b49140d087553e170625240b86755a6604cd65aa16efdbdeae5cdb17ba1284a0fbb25ad06263755dbc71b8d8b06f74232ce3cdd72 + languageName: node + linkType: hard + +"kuler@npm:^2.0.0": + version: 2.0.0 + resolution: "kuler@npm:2.0.0" + checksum: 9e10b5a1659f9ed8761d38df3c35effabffbd19fc6107324095238e4ef0ff044392cae9ac64a1c2dda26e532426485342226b93806bd97504b174b0dcf04ed81 + languageName: node + linkType: hard + +"levn@npm:^0.4.1": + version: 0.4.1 + resolution: "levn@npm:0.4.1" + dependencies: + prelude-ls: ^1.2.1 + type-check: ~0.4.0 + checksum: 12c5021c859bd0f5248561bf139121f0358285ec545ebf48bb3d346820d5c61a4309535c7f387ed7d84361cf821e124ce346c6b7cef8ee09a67c1473b46d0fc4 + languageName: node + linkType: hard + +"locate-path@npm:^6.0.0": + version: 6.0.0 + resolution: "locate-path@npm:6.0.0" + dependencies: + p-locate: ^5.0.0 + checksum: 72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a + languageName: node + linkType: hard + +"lodash.merge@npm:^4.6.2": + version: 4.6.2 + resolution: "lodash.merge@npm:4.6.2" + checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005 + languageName: node + linkType: hard + +"logform@npm:^2.3.2, logform@npm:^2.4.0": + version: 2.6.0 + resolution: "logform@npm:2.6.0" + dependencies: + "@colors/colors": 1.6.0 + "@types/triple-beam": ^1.3.2 + fecha: ^4.2.0 + ms: ^2.1.1 + safe-stable-stringify: ^2.3.1 + triple-beam: ^1.3.0 + checksum: b9ea74bb75e55379ad0eb3e4d65ae6e8d02bc45b431c218162878bf663997ab9258a73104c2b30e09dd2db288bb83c8bf8748e46689d75f5e7e34cf69378d6df + languageName: node + linkType: hard + +"lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" + dependencies: + yallist: ^4.0.0 + checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 + languageName: node + linkType: hard + +"lru-cache@npm:^7.7.1": + version: 7.18.3 + resolution: "lru-cache@npm:7.18.3" + checksum: e550d772384709deea3f141af34b6d4fa392e2e418c1498c078de0ee63670f1f46f5eee746e8ef7e69e1c895af0d4224e62ee33e66a543a14763b0f2e74c1356 + languageName: node + linkType: hard + +"lru-cache@npm:^9.1.1 || ^10.0.0": + version: 10.0.1 + resolution: "lru-cache@npm:10.0.1" + checksum: 06f8d0e1ceabd76bb6f644a26dbb0b4c471b79c7b514c13c6856113879b3bf369eb7b497dad4ff2b7e2636db202412394865b33c332100876d838ad1372f0181 + languageName: node + linkType: hard + +"make-error@npm:^1.1.1": + version: 1.3.6 + resolution: "make-error@npm:1.3.6" + checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 + languageName: node + linkType: hard + +"make-fetch-happen@npm:^11.0.3": + version: 11.1.1 + resolution: "make-fetch-happen@npm:11.1.1" + dependencies: + agentkeepalive: ^4.2.1 + cacache: ^17.0.0 + http-cache-semantics: ^4.1.1 + http-proxy-agent: ^5.0.0 + https-proxy-agent: ^5.0.0 + is-lambda: ^1.0.1 + lru-cache: ^7.7.1 + minipass: ^5.0.0 + minipass-fetch: ^3.0.0 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + negotiator: ^0.6.3 + promise-retry: ^2.0.1 + socks-proxy-agent: ^7.0.0 + ssri: ^10.0.0 + checksum: 7268bf274a0f6dcf0343829489a4506603ff34bd0649c12058753900b0eb29191dce5dba12680719a5d0a983d3e57810f594a12f3c18494e93a1fbc6348a4540 + languageName: node + linkType: hard + +"merge2@npm:^1.3.0, merge2@npm:^1.4.1": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 + languageName: node + linkType: hard + +"micromatch@npm:^4.0.4": + version: 4.0.5 + resolution: "micromatch@npm:4.0.5" + dependencies: + braces: ^3.0.2 + picomatch: ^2.3.1 + checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc + languageName: node + linkType: hard + +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f + languageName: node + linkType: hard + +"mime-types@npm:^2.1.12": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: 1.52.0 + checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836 + languageName: node + linkType: hard + +"minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: ^1.1.7 + checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a + languageName: node + linkType: hard + +"minimatch@npm:^9.0.1": + version: 9.0.3 + resolution: "minimatch@npm:9.0.3" + dependencies: + brace-expansion: ^2.0.1 + checksum: 253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5 + languageName: node + linkType: hard + +"minipass-collect@npm:^1.0.2": + version: 1.0.2 + resolution: "minipass-collect@npm:1.0.2" + dependencies: + minipass: ^3.0.0 + checksum: 14df761028f3e47293aee72888f2657695ec66bd7d09cae7ad558da30415fdc4752bbfee66287dcc6fd5e6a2fa3466d6c484dc1cbd986525d9393b9523d97f10 + languageName: node + linkType: hard + +"minipass-fetch@npm:^3.0.0": + version: 3.0.4 + resolution: "minipass-fetch@npm:3.0.4" + dependencies: + encoding: ^0.1.13 + minipass: ^7.0.3 + minipass-sized: ^1.0.3 + minizlib: ^2.1.2 + dependenciesMeta: + encoding: + optional: true + checksum: af7aad15d5c128ab1ebe52e043bdf7d62c3c6f0cecb9285b40d7b395e1375b45dcdfd40e63e93d26a0e8249c9efd5c325c65575aceee192883970ff8cb11364a + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" + dependencies: + minipass: ^3.0.0 + checksum: 56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: ^3.0.0 + checksum: b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b + languageName: node + linkType: hard + +"minipass-sized@npm:^1.0.3": + version: 1.0.3 + resolution: "minipass-sized@npm:1.0.3" + dependencies: + minipass: ^3.0.0 + checksum: 79076749fcacf21b5d16dd596d32c3b6bf4d6e62abb43868fac21674078505c8b15eaca4e47ed844985a4514854f917d78f588fcd029693709417d8f98b2bd60 + languageName: node + linkType: hard + +"minipass@npm:^3.0.0": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: ^4.0.0 + checksum: a30d083c8054cee83cdcdc97f97e4641a3f58ae743970457b1489ce38ee1167b3aaf7d815cd39ec7a99b9c40397fd4f686e83750e73e652b21cb516f6d845e48 + languageName: node + linkType: hard + +"minipass@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass@npm:5.0.0" + checksum: 425dab288738853fded43da3314a0b5c035844d6f3097a8e3b5b29b328da8f3c1af6fc70618b32c29ff906284cf6406b6841376f21caaadd0793c1d5a6a620ea + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.3": + version: 7.0.4 + resolution: "minipass@npm:7.0.4" + checksum: 87585e258b9488caf2e7acea242fd7856bbe9a2c84a7807643513a338d66f368c7d518200ad7b70a508664d408aa000517647b2930c259a8b1f9f0984f344a21 + languageName: node + linkType: hard + +"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": + version: 2.1.2 + resolution: "minizlib@npm:2.1.2" + dependencies: + minipass: ^3.0.0 + yallist: ^4.0.0 + checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3 + languageName: node + linkType: hard + +"mkdirp@npm:^1.0.3": + version: 1.0.4 + resolution: "mkdirp@npm:1.0.4" + bin: + mkdirp: bin/cmd.js + checksum: a96865108c6c3b1b8e1d5e9f11843de1e077e57737602de1b82030815f311be11f96f09cce59bd5b903d0b29834733e5313f9301e3ed6d6f6fba2eae0df4298f + languageName: node + linkType: hard + +"ms@npm:2.1.2": + version: 2.1.2 + resolution: "ms@npm:2.1.2" + checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f + languageName: node + linkType: hard + +"ms@npm:^2.0.0, ms@npm:^2.1.1": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d + languageName: node + linkType: hard + +"natural-compare@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare@npm:1.4.0" + checksum: 23ad088b08f898fc9b53011d7bb78ec48e79de7627e01ab5518e806033861bef68d5b0cd0e2205c2f36690ac9571ff6bcb05eb777ced2eeda8d4ac5b44592c3d + languageName: node + linkType: hard + +"negotiator@npm:^0.6.3": + version: 0.6.3 + resolution: "negotiator@npm:0.6.3" + checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 9.4.0 + resolution: "node-gyp@npm:9.4.0" + dependencies: + env-paths: ^2.2.0 + exponential-backoff: ^3.1.1 + glob: ^7.1.4 + graceful-fs: ^4.2.6 + make-fetch-happen: ^11.0.3 + nopt: ^6.0.0 + npmlog: ^6.0.0 + rimraf: ^3.0.2 + semver: ^7.3.5 + tar: ^6.1.2 + which: ^2.0.2 + bin: + node-gyp: bin/node-gyp.js + checksum: 78b404e2e0639d64e145845f7f5a3cb20c0520cdaf6dda2f6e025e9b644077202ea7de1232396ba5bde3fee84cdc79604feebe6ba3ec84d464c85d407bb5da99 + languageName: node + linkType: hard + +"nodemon@npm:^3.0.1": + version: 3.0.1 + resolution: "nodemon@npm:3.0.1" + dependencies: + chokidar: ^3.5.2 + debug: ^3.2.7 + ignore-by-default: ^1.0.1 + minimatch: ^3.1.2 + pstree.remy: ^1.1.8 + semver: ^7.5.3 + simple-update-notifier: ^2.0.0 + supports-color: ^5.5.0 + touch: ^3.1.0 + undefsafe: ^2.0.5 + bin: + nodemon: bin/nodemon.js + checksum: 6a5d81855760d6617049eccce10ccf02bddb482dab13ceea5280ae595ec7004eee13e7b934368e3f46c37fe4d970342a8c38c99cae7e93e4d7a3ed1c1ecb6acf + languageName: node + linkType: hard + +"nopt@npm:^6.0.0": + version: 6.0.0 + resolution: "nopt@npm:6.0.0" + dependencies: + abbrev: ^1.0.0 + bin: + nopt: bin/nopt.js + checksum: 82149371f8be0c4b9ec2f863cc6509a7fd0fa729929c009f3a58e4eb0c9e4cae9920e8f1f8eb46e7d032fec8fb01bede7f0f41a67eb3553b7b8e14fa53de1dac + languageName: node + linkType: hard + +"nopt@npm:~1.0.10": + version: 1.0.10 + resolution: "nopt@npm:1.0.10" + dependencies: + abbrev: 1 + bin: + nopt: ./bin/nopt.js + checksum: f62575aceaa3be43f365bf37a596b89bbac2e796b001b6d2e2a85c2140a4e378ff919e2753ccba959c4fd344776fc88c29b393bc167fa939fb1513f126f4cd45 + languageName: node + linkType: hard + +"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 + languageName: node + linkType: hard + +"npmlog@npm:^6.0.0": + version: 6.0.2 + resolution: "npmlog@npm:6.0.2" + dependencies: + are-we-there-yet: ^3.0.0 + console-control-strings: ^1.1.0 + gauge: ^4.0.3 + set-blocking: ^2.0.0 + checksum: ae238cd264a1c3f22091cdd9e2b106f684297d3c184f1146984ecbe18aaa86343953f26b9520dedd1b1372bc0316905b736c1932d778dbeb1fcf5a1001390e2a + languageName: node + linkType: hard + +"once@npm:^1.3.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: 1 + checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 + languageName: node + linkType: hard + +"one-time@npm:^1.0.0": + version: 1.0.0 + resolution: "one-time@npm:1.0.0" + dependencies: + fn.name: 1.x.x + checksum: fd008d7e992bdec1c67f53a2f9b46381ee12a9b8c309f88b21f0223546003fb47e8ad7c1fd5843751920a8d276c63bd4b45670ef80c61fb3e07dbccc962b5c7d + languageName: node + linkType: hard + +"optionator@npm:^0.9.3": + version: 0.9.3 + resolution: "optionator@npm:0.9.3" + 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 + checksum: 09281999441f2fe9c33a5eeab76700795365a061563d66b098923eb719251a42bdbe432790d35064d0816ead9296dbeb1ad51a733edf4167c96bd5d0882e428a + languageName: node + linkType: hard + +"p-limit@npm:^3.0.2": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" + dependencies: + yocto-queue: ^0.1.0 + checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 + languageName: node + linkType: hard + +"p-locate@npm:^5.0.0": + version: 5.0.0 + resolution: "p-locate@npm:5.0.0" + dependencies: + p-limit: ^3.0.2 + checksum: 1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3 + languageName: node + linkType: hard + +"p-map@npm:^4.0.0": + version: 4.0.0 + resolution: "p-map@npm:4.0.0" + dependencies: + aggregate-error: ^3.0.0 + checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c + languageName: node + linkType: hard + +"parent-module@npm:^1.0.0": + version: 1.0.1 + resolution: "parent-module@npm:1.0.1" + dependencies: + callsites: ^3.0.0 + checksum: 6ba8b255145cae9470cf5551eb74be2d22281587af787a2626683a6c20fbb464978784661478dd2a3f1dad74d1e802d403e1b03c1a31fab310259eec8ac560ff + languageName: node + linkType: hard + +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 + languageName: node + linkType: hard + +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 + languageName: node + linkType: hard + +"path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 + languageName: node + linkType: hard + +"path-scurry@npm:^1.10.1": + version: 1.10.1 + resolution: "path-scurry@npm:1.10.1" + dependencies: + lru-cache: ^9.1.1 || ^10.0.0 + minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 + checksum: e2557cff3a8fb8bc07afdd6ab163a92587884f9969b05bbbaf6fe7379348bfb09af9ed292af12ed32398b15fb443e81692047b786d1eeb6d898a51eb17ed7d90 + languageName: node + linkType: hard + +"path-type@npm:^4.0.0": + version: 4.0.0 + resolution: "path-type@npm:4.0.0" + checksum: 5b1e2daa247062061325b8fdbfd1fb56dde0a448fb1455453276ea18c60685bdad23a445dc148cf87bc216be1573357509b7d4060494a6fd768c7efad833ee45 + languageName: node + linkType: hard + +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf + languageName: node + linkType: hard + +"prelude-ls@npm:^1.2.1": + version: 1.2.1 + resolution: "prelude-ls@npm:1.2.1" + checksum: cd192ec0d0a8e4c6da3bb80e4f62afe336df3f76271ac6deb0e6a36187133b6073a19e9727a1ff108cd8b9982e4768850d413baa71214dd80c7979617dca827a + languageName: node + linkType: hard + +"prettier@npm:^3.0.3": + version: 3.0.3 + resolution: "prettier@npm:3.0.3" + bin: + prettier: bin/prettier.cjs + checksum: e10b9af02b281f6c617362ebd2571b1d7fc9fb8a3bd17e371754428cda992e5e8d8b7a046e8f7d3e2da1dcd21aa001e2e3c797402ebb6111b5cd19609dd228e0 + languageName: node + linkType: hard + +"promise-retry@npm:^2.0.1": + version: 2.0.1 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: ^2.0.2 + retry: ^0.12.0 + checksum: f96a3f6d90b92b568a26f71e966cbbc0f63ab85ea6ff6c81284dc869b41510e6cdef99b6b65f9030f0db422bf7c96652a3fff9f2e8fb4a0f069d8f4430359429 + languageName: node + linkType: hard + +"proxy-from-env@npm:^1.1.0": + version: 1.1.0 + resolution: "proxy-from-env@npm:1.1.0" + checksum: ed7fcc2ba0a33404958e34d95d18638249a68c430e30fcb6c478497d72739ba64ce9810a24f53a7d921d0c065e5b78e3822759800698167256b04659366ca4d4 + languageName: node + linkType: hard + +"pstree.remy@npm:^1.1.8": + version: 1.1.8 + resolution: "pstree.remy@npm:1.1.8" + checksum: 5cb53698d6bb34dfb278c8a26957964aecfff3e161af5fbf7cee00bbe9d8547c7aced4bd9cb193bce15fb56e9e4220fc02a5bf9c14345ffb13a36b858701ec2d + languageName: node + linkType: hard + +"punycode@npm:^2.1.0": + version: 2.3.0 + resolution: "punycode@npm:2.3.0" + checksum: 39f760e09a2a3bbfe8f5287cf733ecdad69d6af2fe6f97ca95f24b8921858b91e9ea3c9eeec6e08cede96181b3bb33f95c6ffd8c77e63986508aa2e8159fa200 + languageName: node + linkType: hard + +"queue-microtask@npm:^1.2.2": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 + languageName: node + linkType: hard + +"readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" + dependencies: + inherits: ^2.0.3 + string_decoder: ^1.1.1 + util-deprecate: ^1.0.1 + checksum: bdcbe6c22e846b6af075e32cf8f4751c2576238c5043169a1c221c92ee2878458a816a4ea33f4c67623c0b6827c8a400409bfb3cf0bf3381392d0b1dfb52ac8d + languageName: node + linkType: hard + +"readdirp@npm:~3.6.0": + version: 3.6.0 + resolution: "readdirp@npm:3.6.0" + dependencies: + picomatch: ^2.2.1 + checksum: 1ced032e6e45670b6d7352d71d21ce7edf7b9b928494dcaba6f11fba63180d9da6cd7061ebc34175ffda6ff529f481818c962952004d273178acd70f7059b320 + languageName: node + linkType: hard + +"reporter@workspace:.": + version: 0.0.0-use.local + resolution: "reporter@workspace:." + dependencies: + "@types/node": ^20.8.6 + "@types/node-cron": ^3.0.9 + "@typescript-eslint/eslint-plugin": ^6.7.5 + "@typescript-eslint/parser": ^6.7.5 + axios: ^1.5.1 + dotenv: ^16.3.1 + eslint: ^8.51.0 + eslint-config-prettier: ^9.0.0 + nodemon: ^3.0.1 + prettier: ^3.0.3 + ts-node: ^10.9.1 + typescript: ^5.2.2 + viem: ^1.16.5 + winston: ^3.11.0 + languageName: unknown + linkType: soft + +"resolve-from@npm:^4.0.0": + version: 4.0.0 + resolution: "resolve-from@npm:4.0.0" + checksum: f4ba0b8494846a5066328ad33ef8ac173801a51739eb4d63408c847da9a2e1c1de1e6cbbf72699211f3d13f8fc1325648b169bd15eb7da35688e30a5fb0e4a7f + languageName: node + linkType: hard + +"retry@npm:^0.12.0": + version: 0.12.0 + resolution: "retry@npm:0.12.0" + checksum: 623bd7d2e5119467ba66202d733ec3c2e2e26568074923bc0585b6b99db14f357e79bdedb63cab56cec47491c4a0da7e6021a7465ca6dc4f481d3898fdd3158c + languageName: node + linkType: hard + +"reusify@npm:^1.0.4": + version: 1.0.4 + resolution: "reusify@npm:1.0.4" + checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc + languageName: node + linkType: hard + +"rimraf@npm:^3.0.2": + version: 3.0.2 + resolution: "rimraf@npm:3.0.2" + dependencies: + glob: ^7.1.3 + bin: + rimraf: bin.js + checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 + languageName: node + linkType: hard + +"run-parallel@npm:^1.1.9": + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" + dependencies: + queue-microtask: ^1.2.2 + checksum: cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d + languageName: node + linkType: hard + +"safe-buffer@npm:~5.2.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 + languageName: node + linkType: hard + +"safe-stable-stringify@npm:^2.3.1": + version: 2.4.3 + resolution: "safe-stable-stringify@npm:2.4.3" + checksum: 3aeb64449706ee1f5ad2459fc99648b131d48e7a1fbb608d7c628020177512dc9d94108a5cb61bbc953985d313d0afea6566d243237743e02870490afef04b43 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 + languageName: node + linkType: hard + +"semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4": + version: 7.5.4 + resolution: "semver@npm:7.5.4" + dependencies: + lru-cache: ^6.0.0 + bin: + semver: bin/semver.js + checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 + languageName: node + linkType: hard + +"set-blocking@npm:^2.0.0": + version: 2.0.0 + resolution: "set-blocking@npm:2.0.0" + checksum: 6e65a05f7cf7ebdf8b7c75b101e18c0b7e3dff4940d480efed8aad3a36a4005140b660fa1d804cb8bce911cac290441dc728084a30504d3516ac2ff7ad607b02 + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: ^3.0.0 + checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 + languageName: node + linkType: hard + +"signal-exit@npm:^3.0.7": + version: 3.0.7 + resolution: "signal-exit@npm:3.0.7" + checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 + languageName: node + linkType: hard + +"signal-exit@npm:^4.0.1": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: 64c757b498cb8629ffa5f75485340594d2f8189e9b08700e69199069c8e3070fb3e255f7ab873c05dc0b3cec412aea7402e10a5990cb6a050bd33ba062a6c549 + languageName: node + linkType: hard + +"simple-swizzle@npm:^0.2.2": + version: 0.2.2 + resolution: "simple-swizzle@npm:0.2.2" + dependencies: + is-arrayish: ^0.3.1 + checksum: a7f3f2ab5c76c4472d5c578df892e857323e452d9f392e1b5cf74b74db66e6294a1e1b8b390b519fa1b96b5b613f2a37db6cffef52c3f1f8f3c5ea64eb2d54c0 + languageName: node + linkType: hard + +"simple-update-notifier@npm:^2.0.0": + version: 2.0.0 + resolution: "simple-update-notifier@npm:2.0.0" + dependencies: + semver: ^7.5.3 + checksum: 9ba00d38ce6a29682f64a46213834e4eb01634c2f52c813a9a7b8873ca49cdbb703696f3290f3b27dc067de6d9418b0b84bef22c3eb074acf352529b2d6c27fd + languageName: node + linkType: hard + +"slash@npm:^3.0.0": + version: 3.0.0 + resolution: "slash@npm:3.0.0" + checksum: 94a93fff615f25a999ad4b83c9d5e257a7280c90a32a7cb8b4a87996e4babf322e469c42b7f649fd5796edd8687652f3fb452a86dc97a816f01113183393f11c + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^7.0.0": + version: 7.0.0 + resolution: "socks-proxy-agent@npm:7.0.0" + dependencies: + agent-base: ^6.0.2 + debug: ^4.3.3 + socks: ^2.6.2 + checksum: 720554370154cbc979e2e9ce6a6ec6ced205d02757d8f5d93fe95adae454fc187a5cbfc6b022afab850a5ce9b4c7d73e0f98e381879cf45f66317a4895953846 + languageName: node + linkType: hard + +"socks@npm:^2.6.2": + version: 2.7.1 + resolution: "socks@npm:2.7.1" + dependencies: + ip: ^2.0.0 + smart-buffer: ^4.2.0 + checksum: 259d9e3e8e1c9809a7f5c32238c3d4d2a36b39b83851d0f573bfde5f21c4b1288417ce1af06af1452569cd1eb0841169afd4998f0e04ba04656f6b7f0e46d748 + languageName: node + linkType: hard + +"ssri@npm:^10.0.0": + version: 10.0.5 + resolution: "ssri@npm:10.0.5" + dependencies: + minipass: ^7.0.3 + checksum: 0a31b65f21872dea1ed3f7c200d7bc1c1b91c15e419deca14f282508ba917cbb342c08a6814c7f68ca4ca4116dd1a85da2bbf39227480e50125a1ceffeecb750 + languageName: node + linkType: hard + +"stack-trace@npm:0.0.x": + version: 0.0.10 + resolution: "stack-trace@npm:0.0.10" + checksum: 473036ad32f8c00e889613153d6454f9be0536d430eb2358ca51cad6b95cea08a3cc33cc0e34de66b0dad221582b08ed2e61ef8e13f4087ab690f388362d6610 + languageName: node + linkType: hard + +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.3": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: ^8.0.0 + is-fullwidth-code-point: ^3.0.0 + strip-ansi: ^6.0.1 + checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb + languageName: node + linkType: hard + +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: ^0.2.0 + emoji-regex: ^9.2.2 + strip-ansi: ^7.0.1 + checksum: 7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 + languageName: node + linkType: hard + +"string_decoder@npm:^1.1.1": + version: 1.3.0 + resolution: "string_decoder@npm:1.3.0" + dependencies: + safe-buffer: ~5.2.0 + checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 + languageName: node + linkType: hard + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: ^5.0.1 + checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c + languageName: node + linkType: hard + +"strip-ansi@npm:^7.0.1": + version: 7.1.0 + resolution: "strip-ansi@npm:7.1.0" + dependencies: + ansi-regex: ^6.0.1 + checksum: 859c73fcf27869c22a4e4d8c6acfe690064659e84bef9458aa6d13719d09ca88dcfd40cbf31fd0be63518ea1a643fe070b4827d353e09533a5b0b9fd4553d64d + languageName: node + linkType: hard + +"strip-json-comments@npm:^3.1.1": + version: 3.1.1 + resolution: "strip-json-comments@npm:3.1.1" + checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 + languageName: node + linkType: hard + +"supports-color@npm:^5.5.0": + version: 5.5.0 + resolution: "supports-color@npm:5.5.0" + dependencies: + has-flag: ^3.0.0 + checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac + languageName: node + linkType: hard + +"supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: ^4.0.0 + checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a + languageName: node + linkType: hard + +"tar@npm:^6.1.11, tar@npm:^6.1.2": + version: 6.2.0 + resolution: "tar@npm:6.2.0" + dependencies: + chownr: ^2.0.0 + fs-minipass: ^2.0.0 + minipass: ^5.0.0 + minizlib: ^2.1.1 + mkdirp: ^1.0.3 + yallist: ^4.0.0 + checksum: db4d9fe74a2082c3a5016630092c54c8375ff3b280186938cfd104f2e089c4fd9bad58688ef6be9cf186a889671bf355c7cda38f09bbf60604b281715ca57f5c + languageName: node + linkType: hard + +"text-hex@npm:1.0.x": + version: 1.0.0 + resolution: "text-hex@npm:1.0.0" + checksum: 1138f68adc97bf4381a302a24e2352f04992b7b1316c5003767e9b0d3367ffd0dc73d65001ea02b07cd0ecc2a9d186de0cf02f3c2d880b8a522d4ccb9342244a + languageName: node + linkType: hard + +"text-table@npm:^0.2.0": + version: 0.2.0 + resolution: "text-table@npm:0.2.0" + checksum: b6937a38c80c7f84d9c11dd75e49d5c44f71d95e810a3250bd1f1797fc7117c57698204adf676b71497acc205d769d65c16ae8fa10afad832ae1322630aef10a + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: ^7.0.0 + checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed + languageName: node + linkType: hard + +"touch@npm:^3.1.0": + version: 3.1.0 + resolution: "touch@npm:3.1.0" + dependencies: + nopt: ~1.0.10 + bin: + nodetouch: ./bin/nodetouch.js + checksum: e0be589cb5b0e6dbfce6e7e077d4a0d5f0aba558ef769c6d9c33f635e00d73d5be49da6f8631db302ee073919d82b5b7f56da2987feb28765c95a7673af68647 + languageName: node + linkType: hard + +"triple-beam@npm:^1.3.0": + version: 1.4.1 + resolution: "triple-beam@npm:1.4.1" + checksum: 2e881a3e8e076b6f2b85b9ec9dd4a900d3f5016e6d21183ed98e78f9abcc0149e7d54d79a3f432b23afde46b0885bdcdcbff789f39bc75de796316961ec07f61 + languageName: node + linkType: hard + +"ts-api-utils@npm:^1.0.1": + version: 1.0.3 + resolution: "ts-api-utils@npm:1.0.3" + peerDependencies: + typescript: ">=4.2.0" + checksum: 441cc4489d65fd515ae6b0f4eb8690057add6f3b6a63a36073753547fb6ce0c9ea0e0530220a0b282b0eec535f52c4dfc315d35f8a4c9a91c0def0707a714ca6 + languageName: node + linkType: hard + +"ts-node@npm:^10.9.1": + version: 10.9.1 + resolution: "ts-node@npm:10.9.1" + dependencies: + "@cspotcode/source-map-support": ^0.8.0 + "@tsconfig/node10": ^1.0.7 + "@tsconfig/node12": ^1.0.7 + "@tsconfig/node14": ^1.0.0 + "@tsconfig/node16": ^1.0.2 + acorn: ^8.4.1 + acorn-walk: ^8.1.1 + arg: ^4.1.0 + create-require: ^1.1.0 + diff: ^4.0.1 + make-error: ^1.1.1 + v8-compile-cache-lib: ^3.0.1 + yn: 3.1.1 + peerDependencies: + "@swc/core": ">=1.2.50" + "@swc/wasm": ">=1.2.50" + "@types/node": "*" + typescript: ">=2.7" + peerDependenciesMeta: + "@swc/core": + optional: true + "@swc/wasm": + optional: true + bin: + ts-node: dist/bin.js + ts-node-cwd: dist/bin-cwd.js + ts-node-esm: dist/bin-esm.js + ts-node-script: dist/bin-script.js + ts-node-transpile-only: dist/bin-transpile.js + ts-script: dist/bin-script-deprecated.js + checksum: 090adff1302ab20bd3486e6b4799e90f97726ed39e02b39e566f8ab674fd5bd5f727f43615debbfc580d33c6d9d1c6b1b3ce7d8e3cca3e20530a145ffa232c35 + languageName: node + linkType: hard + +"type-check@npm:^0.4.0, type-check@npm:~0.4.0": + version: 0.4.0 + resolution: "type-check@npm:0.4.0" + dependencies: + prelude-ls: ^1.2.1 + checksum: ec688ebfc9c45d0c30412e41ca9c0cdbd704580eb3a9ccf07b9b576094d7b86a012baebc95681999dd38f4f444afd28504cb3a89f2ef16b31d4ab61a0739025a + languageName: node + linkType: hard + +"type-fest@npm:^0.20.2": + version: 0.20.2 + resolution: "type-fest@npm:0.20.2" + checksum: 4fb3272df21ad1c552486f8a2f8e115c09a521ad7a8db3d56d53718d0c907b62c6e9141ba5f584af3f6830d0872c521357e512381f24f7c44acae583ad517d73 + languageName: node + linkType: hard + +"typescript@npm:^5.2.2": + version: 5.2.2 + resolution: "typescript@npm:5.2.2" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 7912821dac4d962d315c36800fe387cdc0a6298dba7ec171b350b4a6e988b51d7b8f051317786db1094bd7431d526b648aba7da8236607febb26cf5b871d2d3c + languageName: node + linkType: hard + +"typescript@patch:typescript@^5.2.2#~builtin": + version: 5.2.2 + resolution: "typescript@patch:typescript@npm%3A5.2.2#~builtin::version=5.2.2&hash=7ad353" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 07106822b4305de3f22835cbba949a2b35451cad50888759b6818421290ff95d522b38ef7919e70fb381c5fe9c1c643d7dea22c8b31652a717ddbd57b7f4d554 + languageName: node + linkType: hard + +"undefsafe@npm:^2.0.5": + version: 2.0.5 + resolution: "undefsafe@npm:2.0.5" + checksum: f42ab3b5770fedd4ada175fc1b2eb775b78f609156f7c389106aafd231bfc210813ee49f54483d7191d7b76e483bc7f537b5d92d19ded27156baf57592eb02cc + languageName: node + linkType: hard + +"undici-types@npm:~5.25.1": + version: 5.25.3 + resolution: "undici-types@npm:5.25.3" + checksum: ec9d2cc36520cbd9fbe3b3b6c682a87fe5be214699e1f57d1e3d9a2cb5be422e62735f06e0067dc325fd3dd7404c697e4d479f9147dc8a804e049e29f357f2ff + languageName: node + linkType: hard + +"unique-filename@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-filename@npm:3.0.0" + dependencies: + unique-slug: ^4.0.0 + checksum: 8e2f59b356cb2e54aab14ff98a51ac6c45781d15ceaab6d4f1c2228b780193dc70fae4463ce9e1df4479cb9d3304d7c2043a3fb905bdeca71cc7e8ce27e063df + languageName: node + linkType: hard + +"unique-slug@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-slug@npm:4.0.0" + dependencies: + imurmurhash: ^0.1.4 + checksum: 0884b58365af59f89739e6f71e3feacb5b1b41f2df2d842d0757933620e6de08eff347d27e9d499b43c40476cbaf7988638d3acb2ffbcb9d35fd035591adfd15 + languageName: node + linkType: hard + +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: ^2.1.0 + checksum: 7167432de6817fe8e9e0c9684f1d2de2bb688c94388f7569f7dbdb1587c9f4ca2a77962f134ec90be0cc4d004c939ff0d05acc9f34a0db39a3c797dada262633 + languageName: node + linkType: hard + +"util-deprecate@npm:^1.0.1": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 + languageName: node + linkType: hard + +"v8-compile-cache-lib@npm:^3.0.1": + version: 3.0.1 + resolution: "v8-compile-cache-lib@npm:3.0.1" + checksum: 78089ad549e21bcdbfca10c08850022b22024cdcc2da9b168bcf5a73a6ed7bf01a9cebb9eac28e03cd23a684d81e0502797e88f3ccd27a32aeab1cfc44c39da0 + languageName: node + linkType: hard + +"viem@npm:^1.16.5": + version: 1.17.1 + resolution: "viem@npm:1.17.1" + dependencies: + "@adraffy/ens-normalize": 1.9.4 + "@noble/curves": 1.2.0 + "@noble/hashes": 1.3.2 + "@scure/bip32": 1.3.2 + "@scure/bip39": 1.2.1 + abitype: 0.9.8 + isows: 1.0.3 + ws: 8.13.0 + peerDependencies: + typescript: ">=5.0.4" + peerDependenciesMeta: + typescript: + optional: true + checksum: 040225bbc4714c2ebaaa9593cc1abad3367ed6c6413b9c3b8cc4dd6478ff788abd7d81afd396facdc468f6c8e7a7411c55234f25ea7cc8f0004923535f5f5411 + languageName: node + linkType: hard + +"which@npm:^2.0.1, which@npm:^2.0.2": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: ^2.0.0 + bin: + node-which: ./bin/node-which + checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 + languageName: node + linkType: hard + +"wide-align@npm:^1.1.5": + version: 1.1.5 + resolution: "wide-align@npm:1.1.5" + dependencies: + string-width: ^1.0.2 || 2 || 3 || 4 + checksum: d5fc37cd561f9daee3c80e03b92ed3e84d80dde3365a8767263d03dacfc8fa06b065ffe1df00d8c2a09f731482fcacae745abfbb478d4af36d0a891fad4834d3 + languageName: node + linkType: hard + +"winston-transport@npm:^4.5.0": + version: 4.6.0 + resolution: "winston-transport@npm:4.6.0" + dependencies: + logform: ^2.3.2 + readable-stream: ^3.6.0 + triple-beam: ^1.3.0 + checksum: 19f06ebdbb57cb14cdd48a23145d418d3bbe538851053303f84f04a8a849bb530b78b1495a175059c1299f92945dc61d5421c4914fee32d9a41bc397d84f26d7 + languageName: node + linkType: hard + +"winston@npm:^3.11.0": + version: 3.11.0 + resolution: "winston@npm:3.11.0" + dependencies: + "@colors/colors": ^1.6.0 + "@dabh/diagnostics": ^2.0.2 + async: ^3.2.3 + is-stream: ^2.0.0 + logform: ^2.4.0 + one-time: ^1.0.0 + readable-stream: ^3.4.0 + safe-stable-stringify: ^2.3.1 + stack-trace: 0.0.x + triple-beam: ^1.3.0 + winston-transport: ^4.5.0 + checksum: ca4454070f7a71b19f53c8c1765c59a013dab220edb49161b2e81917751d3e9edc3382430e4fb050feda04fb8463290ecab7cbc9240ec8d3d3b32a121849bbb0 + languageName: node + linkType: hard + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: ^4.0.0 + string-width: ^4.1.0 + strip-ansi: ^6.0.0 + checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: ^6.1.0 + string-width: ^5.0.1 + strip-ansi: ^7.0.1 + checksum: 371733296dc2d616900ce15a0049dca0ef67597d6394c57347ba334393599e800bab03c41d4d45221b6bc967b8c453ec3ae4749eff3894202d16800fdfe0e238 + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 + languageName: node + linkType: hard + +"ws@npm:8.13.0": + version: 8.13.0 + resolution: "ws@npm:8.13.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 53e991bbf928faf5dc6efac9b8eb9ab6497c69feeb94f963d648b7a3530a720b19ec2e0ec037344257e05a4f35bd9ad04d9de6f289615ffb133282031b18c61c + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 + languageName: node + linkType: hard + +"yn@npm:3.1.1": + version: 3.1.1 + resolution: "yn@npm:3.1.1" + checksum: 2c487b0e149e746ef48cda9f8bad10fc83693cd69d7f9dcd8be4214e985de33a29c9e24f3c0d6bcf2288427040a8947406ab27f7af67ee9456e6b84854f02dd6 + languageName: node + linkType: hard + +"yocto-queue@npm:^0.1.0": + version: 0.1.0 + resolution: "yocto-queue@npm:0.1.0" + checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 + languageName: node + linkType: hard From 5d1cac5d50444958aee01bd2e4d63b0e0c089866 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 26 Oct 2023 19:06:54 +0200 Subject: [PATCH 021/297] refactor(reporter): rn some vars --- .../reporter/src/controllers/TelepathyReporterController.ts | 6 +++--- packages/reporter/src/index.ts | 2 +- packages/reporter/src/settings/index.ts | 2 +- packages/reporter/src/types/index.ts | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/reporter/src/controllers/TelepathyReporterController.ts b/packages/reporter/src/controllers/TelepathyReporterController.ts index 9e8b2960..d3166440 100644 --- a/packages/reporter/src/controllers/TelepathyReporterController.ts +++ b/packages/reporter/src/controllers/TelepathyReporterController.ts @@ -13,7 +13,7 @@ class TelepathyReporterController extends BaseController { lightClientAddresses: { [chainName: string]: `0x${string}` } private _baseProofUrl: string - private _intervalFetchBlocksMs: number + private _intervalFetchHeadUpdates: number private _intervals: ReturnType | undefined constructor(_configs: TelepathyReporterControllerConfigs) { @@ -21,7 +21,7 @@ class TelepathyReporterController extends BaseController { this.lightClientAddresses = _configs.lightClientAddresses this.blockBuffer = _configs.blockBuffer - this._intervalFetchBlocksMs = _configs.intervalFetchBlocksMs + this._intervalFetchHeadUpdates = _configs.intervalFetchHeadUpdates this._baseProofUrl = _configs.baseProofUrl this.lastProcessedBlock = 0n @@ -31,7 +31,7 @@ class TelepathyReporterController extends BaseController { this.fetchHeadUpdates() this._intervals = setInterval(() => { this.fetchHeadUpdates() - }, this._intervalFetchBlocksMs) + }, this._intervalFetchHeadUpdates) } stop() { diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index b0efa0c7..a1d7d341 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -57,7 +57,7 @@ const main = () => { baseProofUrl: settings.reporterControllers.TelepathyReporterController.baseProofUrl, lightClientAddresses: { [gnosis.name]: settings.contractAddresses.Gnosis.TelepathyLightClient }, blockBuffer: settings.reporterControllers.TelepathyReporterController.blockBuffer, - intervalFetchBlocksMs: settings.reporterControllers.TelepathyReporterController.intervalFetchBlocksMs, + intervalFetchHeadUpdates: settings.reporterControllers.TelepathyReporterController.intervalFetchHeadUpdates, }) const blocksListener = new BlocksListener({ diff --git a/packages/reporter/src/settings/index.ts b/packages/reporter/src/settings/index.ts index 6e71e696..fc0aeeba 100644 --- a/packages/reporter/src/settings/index.ts +++ b/packages/reporter/src/settings/index.ts @@ -37,7 +37,7 @@ export const settings = { TelepathyReporterController: { baseProofUrl: process.env.TELEPATHY_PROOF_API_URL as string, blockBuffer: Number(process.env.TELEPATHY_BLOCK_BUFFER), - intervalFetchBlocksMs: Number(process.env.TELEPATHY_TIME_FETCH_BLOCK_MS), + intervalFetchHeadUpdates: Number(process.env.TELEPATHY_INTERVAL_FETCH_HEAD_UPDATES), }, }, } diff --git a/packages/reporter/src/types/index.ts b/packages/reporter/src/types/index.ts index 5110faba..50909db2 100644 --- a/packages/reporter/src/types/index.ts +++ b/packages/reporter/src/types/index.ts @@ -16,7 +16,7 @@ interface TelepathyReporterControllerConfigs extends BaseControllerConfigs { lightClientAddresses: { [chainName: string]: `0x${string}` } baseProofUrl: string blockBuffer: number - intervalFetchBlocksMs: number + intervalFetchHeadUpdates: number } interface AMBReporterControllerConfigs extends BaseControllerConfigs { From c2e7dff27073a4977bd749a9ecc50cc8e0e2752c Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Fri, 27 Oct 2023 06:18:46 +0200 Subject: [PATCH 022/297] chore(reporter): fixes compile erros --- packages/reporter/package.json | 2 +- packages/reporter/tsconfig.json | 16 ++++++++++++---- packages/reporter/yarn.lock | 20 ++++++++++---------- 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/packages/reporter/package.json b/packages/reporter/package.json index 9cd4848c..b1f02948 100644 --- a/packages/reporter/package.json +++ b/packages/reporter/package.json @@ -19,7 +19,7 @@ "winston": "^3.11.0" }, "devDependencies": { - "@types/node": "^20.8.6", + "@types/node": "^20.8.9", "@types/node-cron": "^3.0.9", "@typescript-eslint/eslint-plugin": "^6.7.5", "@typescript-eslint/parser": "^6.7.5", diff --git a/packages/reporter/tsconfig.json b/packages/reporter/tsconfig.json index acfb993d..1a5a671e 100644 --- a/packages/reporter/tsconfig.json +++ b/packages/reporter/tsconfig.json @@ -6,7 +6,11 @@ "esModuleInterop": true, "experimentalDecorators": true, "forceConsistentCasingInFileNames": true, - "lib": ["es6", "ESNext"], + "lib": [ + "es6", + "ESNext", + "DOM" + ], "module": "commonjs", "moduleResolution": "node", "noImplicitAny": true, @@ -17,6 +21,10 @@ "strict": true, "target": "ESNext" }, - "exclude": ["node_modules"], - "include": ["./src/**/*"] -} + "exclude": [ + "node_modules" + ], + "include": [ + "./src/**/*" + ] +} \ No newline at end of file diff --git a/packages/reporter/yarn.lock b/packages/reporter/yarn.lock index db593311..4d057942 100644 --- a/packages/reporter/yarn.lock +++ b/packages/reporter/yarn.lock @@ -287,12 +287,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^20.8.6": - version: 20.8.6 - resolution: "@types/node@npm:20.8.6" +"@types/node@npm:^20.8.9": + version: 20.8.9 + resolution: "@types/node@npm:20.8.9" dependencies: - undici-types: ~5.25.1 - checksum: ccfb7ac482c5a96edeb239893c5c099f5257fcc2ed9ae62fefdfbc782b79e16dbc2af9a85b379665237bf759904b44ca2be68e75d239e0297882aad42f61905c + undici-types: ~5.26.4 + checksum: 0c05f3502a9507ff27e91dd6fd574fa6f391b3fafedcfe8e0c8d33351fb22d02c0121f854e5b6b3ecb9a8a468407ddf6e7ac0029fb236d4c7e1361ffc758a01f languageName: node linkType: hard @@ -2200,7 +2200,7 @@ __metadata: version: 0.0.0-use.local resolution: "reporter@workspace:." dependencies: - "@types/node": ^20.8.6 + "@types/node": ^20.8.9 "@types/node-cron": ^3.0.9 "@typescript-eslint/eslint-plugin": ^6.7.5 "@typescript-eslint/parser": ^6.7.5 @@ -2615,10 +2615,10 @@ __metadata: languageName: node linkType: hard -"undici-types@npm:~5.25.1": - version: 5.25.3 - resolution: "undici-types@npm:5.25.3" - checksum: ec9d2cc36520cbd9fbe3b3b6c682a87fe5be214699e1f57d1e3d9a2cb5be422e62735f06e0067dc325fd3dd7404c697e4d479f9147dc8a804e049e29f357f2ff +"undici-types@npm:~5.26.4": + version: 5.26.5 + resolution: "undici-types@npm:5.26.5" + checksum: 3192ef6f3fd5df652f2dc1cd782b49d6ff14dc98e5dced492aa8a8c65425227da5da6aafe22523c67f035a272c599bb89cfe803c1db6311e44bed3042fc25487 languageName: node linkType: hard From 40dca77e138342d361185a9fcfc21fa55ac5022d Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Fri, 27 Oct 2023 06:38:40 +0200 Subject: [PATCH 023/297] chore(reporter): rm package-lock.json --- packages/reporter/package-lock.json | 3638 --------------------------- 1 file changed, 3638 deletions(-) delete mode 100644 packages/reporter/package-lock.json diff --git a/packages/reporter/package-lock.json b/packages/reporter/package-lock.json deleted file mode 100644 index af58acd8..00000000 --- a/packages/reporter/package-lock.json +++ /dev/null @@ -1,3638 +0,0 @@ -{ - "name": "reporter", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "reporter", - "dependencies": { - "axios": "^1.5.1", - "dotenv": "^16.3.1", - "viem": "^1.16.5", - "winston": "^3.11.0" - }, - "devDependencies": { - "@types/node": "^20.8.6", - "@types/node-cron": "^3.0.9", - "@typescript-eslint/eslint-plugin": "^6.7.5", - "@typescript-eslint/parser": "^6.7.5", - "eslint": "^8.51.0", - "eslint-config-prettier": "^9.0.0", - "nodemon": "^3.0.1", - "prettier": "^3.0.3", - "ts-node": "^10.9.1", - "typescript": "^5.2.2" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@adraffy/ens-normalize": { - "version": "1.9.4", - "license": "MIT" - }, - "node_modules/@colors/colors": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", - "dependencies": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.9.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "8.51.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.11", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@noble/curves": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.3.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/hashes": { - "version": "1.3.2", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@scure/base": { - "version": "1.1.3", - "license": "MIT", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip32": { - "version": "1.3.2", - "license": "MIT", - "dependencies": { - "@noble/curves": "~1.2.0", - "@noble/hashes": "~1.3.2", - "@scure/base": "~1.1.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip39": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "@noble/hashes": "~1.3.0", - "@scure/base": "~1.1.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.13", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.8.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.6.tgz", - "integrity": "sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ==", - "dev": true, - "dependencies": { - "undici-types": "~5.25.1" - } - }, - "node_modules/@types/node-cron": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@types/node-cron/-/node-cron-3.0.9.tgz", - "integrity": "sha512-P10Vf+oagnMbefD31nqjS/dpBM34qzfdpvIgVZwtwsNb0Hg2lDaPFeGcyGUJIqh3zHlDMwYXGeunGgMnswgnPg==", - "dev": true - }, - "node_modules/@types/semver": { - "version": "7.5.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/triple-beam": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.4.tgz", - "integrity": "sha512-HlJjF3wxV4R2VQkFpKe0YqJLilYNgtRtsqqZtby7RkVsSs+i+vbyzjtUwpFEdUCKcrGzCiEJE7F/0mKjh0sunA==" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.7.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.7.5", - "@typescript-eslint/type-utils": "6.7.5", - "@typescript-eslint/utils": "6.7.5", - "@typescript-eslint/visitor-keys": "6.7.5", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.7.5", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "6.7.5", - "@typescript-eslint/types": "6.7.5", - "@typescript-eslint/typescript-estree": "6.7.5", - "@typescript-eslint/visitor-keys": "6.7.5", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "6.7.5", - "@typescript-eslint/visitor-keys": "6.7.5" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.7.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "6.7.5", - "@typescript-eslint/utils": "6.7.5", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.7.5", - "dev": true, - "license": "MIT", - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.7.5", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "6.7.5", - "@typescript-eslint/visitor-keys": "6.7.5", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "6.7.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.7.5", - "@typescript-eslint/types": "6.7.5", - "@typescript-eslint/typescript-estree": "6.7.5", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "6.7.5", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/abbrev": { - "version": "1.1.1", - "dev": true, - "license": "ISC" - }, - "node_modules/abitype": { - "version": "0.9.8", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wagmi-dev" - } - ], - "license": "MIT", - "peerDependencies": { - "typescript": ">=5.0.4", - "zod": "^3 >=3.19.1" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - }, - "zod": { - "optional": true - } - } - }, - "node_modules/acorn": { - "version": "8.10.0", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "dev": true, - "license": "MIT", - "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" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/array-union": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "license": "MIT" - }, - "node_modules/axios": { - "version": "1.5.1", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "license": "MIT" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/color/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/colorspace": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", - "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/create-require": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dotenv": { - "version": "16.3.1", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" - } - }, - "node_modules/enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.51.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.51.0", - "@humanwhocodes/config-array": "^0.11.11", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "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" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.0.0", - "dev": true, - "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.1", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.15.0", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fecha": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", - "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.9", - "dev": true, - "license": "ISC" - }, - "node_modules/fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" - }, - "node_modules/follow-redirects": { - "version": "1.15.3", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", - "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" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "version": "13.23.0", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graphemer": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ignore": { - "version": "5.2.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "dev": true, - "license": "ISC" - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "license": "ISC" - }, - "node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/isows": { - "version": "1.0.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wagmi-dev" - } - ], - "license": "MIT", - "peerDependencies": { - "ws": "*" - } - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/keyv": { - "version": "4.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" - }, - "node_modules/levn": { - "version": "0.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "dev": true, - "license": "MIT" - }, - "node_modules/logform": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", - "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==", - "dependencies": { - "@colors/colors": "1.6.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "dev": true, - "license": "ISC" - }, - "node_modules/merge2": { - "version": "1.4.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/nodemon": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^3.5.2", - "debug": "^3.2.7", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^7.5.3", - "simple-update-notifier": "^2.0.0", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" - } - }, - "node_modules/nodemon/node_modules/debug": { - "version": "3.2.7", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/nodemon/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/nopt": { - "version": "1.0.10", - "dev": true, - "license": "MIT", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "dependencies": { - "fn.name": "1.x.x" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "dev": true, - "license": "MIT" - }, - "node_modules/punycode": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-stable-stringify": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", - "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-update-notifier": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "engines": { - "node": "*" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-color/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" - }, - "node_modules/text-table": { - "version": "0.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/touch": { - "version": "3.1.0", - "dev": true, - "license": "ISC", - "dependencies": { - "nopt": "~1.0.10" - }, - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, - "node_modules/triple-beam": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", - "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/ts-api-utils": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16.13.0" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-node": { - "version": "10.9.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.2.2", - "devOptional": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undefsafe": { - "version": "2.0.5", - "dev": true, - "license": "MIT" - }, - "node_modules/undici-types": { - "version": "5.25.3", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", - "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==", - "dev": true - }, - "node_modules/uri-js": { - "version": "4.4.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/viem": { - "version": "1.16.5", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wagmi-dev" - } - ], - "license": "MIT", - "dependencies": { - "@adraffy/ens-normalize": "1.9.4", - "@noble/curves": "1.2.0", - "@noble/hashes": "1.3.2", - "@scure/bip32": "1.3.2", - "@scure/bip39": "1.2.1", - "abitype": "0.9.8", - "isows": "1.0.3", - "ws": "8.13.0" - }, - "peerDependencies": { - "typescript": ">=5.0.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/which": { - "version": "2.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/winston": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.11.0.tgz", - "integrity": "sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g==", - "dependencies": { - "@colors/colors": "^1.6.0", - "@dabh/diagnostics": "^2.0.2", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.4.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.5.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/winston-transport": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.6.0.tgz", - "integrity": "sha512-wbBA9PbPAHxKiygo7ub7BYRiKxms0tpfU2ljtWzb3SjRjv5yl6Ozuy/TkXf00HTAt+Uylo3gSkNwzc4ME0wiIg==", - "dependencies": { - "logform": "^2.3.2", - "readable-stream": "^3.6.0", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "dev": true, - "license": "ISC" - }, - "node_modules/ws": { - "version": "8.13.0", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/yn": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "dev": true - }, - "@adraffy/ens-normalize": { - "version": "1.9.4" - }, - "@colors/colors": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==" - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - } - }, - "@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", - "requires": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "@eslint-community/eslint-utils": { - "version": "4.4.0", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" - } - }, - "@eslint-community/regexpp": { - "version": "4.9.1", - "dev": true - }, - "@eslint/eslintrc": { - "version": "2.1.2", - "dev": true, - "requires": { - "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": { - "version": "8.51.0", - "dev": true - }, - "@humanwhocodes/config-array": { - "version": "0.11.11", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "dev": true - }, - "@jridgewell/resolve-uri": { - "version": "3.1.1", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@noble/curves": { - "version": "1.2.0", - "requires": { - "@noble/hashes": "1.3.2" - } - }, - "@noble/hashes": { - "version": "1.3.2" - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@scure/base": { - "version": "1.1.3" - }, - "@scure/bip32": { - "version": "1.3.2", - "requires": { - "@noble/curves": "~1.2.0", - "@noble/hashes": "~1.3.2", - "@scure/base": "~1.1.2" - } - }, - "@scure/bip39": { - "version": "1.2.1", - "requires": { - "@noble/hashes": "~1.3.0", - "@scure/base": "~1.1.0" - } - }, - "@tsconfig/node10": { - "version": "1.0.9", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.4", - "dev": true - }, - "@types/json-schema": { - "version": "7.0.13", - "dev": true - }, - "@types/node": { - "version": "20.8.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.6.tgz", - "integrity": "sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ==", - "dev": true, - "requires": { - "undici-types": "~5.25.1" - } - }, - "@types/node-cron": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@types/node-cron/-/node-cron-3.0.9.tgz", - "integrity": "sha512-P10Vf+oagnMbefD31nqjS/dpBM34qzfdpvIgVZwtwsNb0Hg2lDaPFeGcyGUJIqh3zHlDMwYXGeunGgMnswgnPg==", - "dev": true - }, - "@types/semver": { - "version": "7.5.3", - "dev": true - }, - "@types/triple-beam": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.4.tgz", - "integrity": "sha512-HlJjF3wxV4R2VQkFpKe0YqJLilYNgtRtsqqZtby7RkVsSs+i+vbyzjtUwpFEdUCKcrGzCiEJE7F/0mKjh0sunA==" - }, - "@typescript-eslint/eslint-plugin": { - "version": "6.7.5", - "dev": true, - "requires": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.7.5", - "@typescript-eslint/type-utils": "6.7.5", - "@typescript-eslint/utils": "6.7.5", - "@typescript-eslint/visitor-keys": "6.7.5", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - } - }, - "@typescript-eslint/parser": { - "version": "6.7.5", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "6.7.5", - "@typescript-eslint/types": "6.7.5", - "@typescript-eslint/typescript-estree": "6.7.5", - "@typescript-eslint/visitor-keys": "6.7.5", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "6.7.5", - "dev": true, - "requires": { - "@typescript-eslint/types": "6.7.5", - "@typescript-eslint/visitor-keys": "6.7.5" - } - }, - "@typescript-eslint/type-utils": { - "version": "6.7.5", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "6.7.5", - "@typescript-eslint/utils": "6.7.5", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - } - }, - "@typescript-eslint/types": { - "version": "6.7.5", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "6.7.5", - "dev": true, - "requires": { - "@typescript-eslint/types": "6.7.5", - "@typescript-eslint/visitor-keys": "6.7.5", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - } - }, - "@typescript-eslint/utils": { - "version": "6.7.5", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.7.5", - "@typescript-eslint/types": "6.7.5", - "@typescript-eslint/typescript-estree": "6.7.5", - "semver": "^7.5.4" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "6.7.5", - "dev": true, - "requires": { - "@typescript-eslint/types": "6.7.5", - "eslint-visitor-keys": "^3.4.1" - } - }, - "abbrev": { - "version": "1.1.1", - "dev": true - }, - "abitype": { - "version": "0.9.8", - "requires": {} - }, - "acorn": { - "version": "8.10.0", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "8.2.0", - "dev": true - }, - "ajv": { - "version": "6.12.6", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "5.0.1", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.3", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "4.1.3", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "dev": true - }, - "async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" - }, - "asynckit": { - "version": "0.4.0" - }, - "axios": { - "version": "1.5.1", - "requires": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "supports-color": { - "version": "7.2.0", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "chokidar": { - "version": "3.5.3", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "requires": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - }, - "dependencies": { - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - } - } - }, - "color-convert": { - "version": "2.0.1", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4" - }, - "color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "colorspace": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", - "requires": { - "color": "^3.1.3", - "text-hex": "1.0.x" - } - }, - "combined-stream": { - "version": "1.0.8", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "dev": true - }, - "create-require": { - "version": "1.1.1", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debug": { - "version": "4.3.4", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "deep-is": { - "version": "0.1.4", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0" - }, - "diff": { - "version": "4.0.2", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dotenv": { - "version": "16.3.1" - }, - "enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" - }, - "escape-string-regexp": { - "version": "4.0.0", - "dev": true - }, - "eslint": { - "version": "8.51.0", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.51.0", - "@humanwhocodes/config-array": "^0.11.11", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "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" - }, - "dependencies": { - "glob-parent": { - "version": "6.0.2", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - } - } - }, - "eslint-config-prettier": { - "version": "9.0.0", - "dev": true, - "requires": {} - }, - "eslint-scope": { - "version": "7.2.2", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-visitor-keys": { - "version": "3.4.3", - "dev": true - }, - "espree": { - "version": "9.6.1", - "dev": true, - "requires": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - } - }, - "esquery": { - "version": "1.5.0", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "dev": true - }, - "fast-glob": { - "version": "3.3.1", - "dev": true, - "requires": { - "@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": { - "version": "2.1.0", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "dev": true - }, - "fastq": { - "version": "1.15.0", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fecha": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", - "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" - }, - "file-entry-cache": { - "version": "6.0.1", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "5.0.0", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.1.1", - "dev": true, - "requires": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.9", - "dev": true - }, - "fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" - }, - "follow-redirects": { - "version": "1.15.3" - }, - "form-data": { - "version": "4.0.0", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fs.realpath": { - "version": "1.0.0", - "dev": true - }, - "glob": { - "version": "7.2.3", - "dev": true, - "requires": { - "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-parent": { - "version": "5.1.2", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "13.23.0", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.1.0", - "dev": true, - "requires": { - "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" - } - }, - "graphemer": { - "version": "1.4.0", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "dev": true - }, - "ignore": { - "version": "5.2.4", - "dev": true - }, - "ignore-by-default": { - "version": "1.0.1", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4" - }, - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "is-binary-path": { - "version": "2.1.0", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" - }, - "isexe": { - "version": "2.0.0", - "dev": true - }, - "isows": { - "version": "1.0.3", - "requires": {} - }, - "js-yaml": { - "version": "4.1.0", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "json-buffer": { - "version": "3.0.1", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "dev": true - }, - "keyv": { - "version": "4.5.4", - "dev": true, - "requires": { - "json-buffer": "3.0.1" - } - }, - "kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" - }, - "levn": { - "version": "0.4.1", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "locate-path": { - "version": "6.0.0", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash.merge": { - "version": "4.6.2", - "dev": true - }, - "logform": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", - "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==", - "requires": { - "@colors/colors": "1.6.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "make-error": { - "version": "1.3.6", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime-db": { - "version": "1.52.0" - }, - "mime-types": { - "version": "2.1.35", - "requires": { - "mime-db": "1.52.0" - } - }, - "minimatch": { - "version": "3.1.2", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "ms": { - "version": "2.1.2" - }, - "natural-compare": { - "version": "1.4.0", - "dev": true - }, - "nodemon": { - "version": "3.0.1", - "dev": true, - "requires": { - "chokidar": "^3.5.2", - "debug": "^3.2.7", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^7.5.3", - "simple-update-notifier": "^2.0.0", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "dev": true - } - } - }, - "nopt": { - "version": "1.0.10", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-path": { - "version": "3.0.0", - "dev": true - }, - "once": { - "version": "1.4.0", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "requires": { - "fn.name": "1.x.x" - } - }, - "optionator": { - "version": "0.9.3", - "dev": true, - "requires": { - "@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" - } - }, - "p-limit": { - "version": "3.1.0", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "parent-module": { - "version": "1.0.1", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "path-exists": { - "version": "4.0.0", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "dev": true - }, - "prettier": { - "version": "3.0.3", - "dev": true - }, - "proxy-from-env": { - "version": "1.1.0" - }, - "pstree.remy": { - "version": "1.1.8", - "dev": true - }, - "punycode": { - "version": "2.3.0", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "dev": true - }, - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "resolve-from": { - "version": "4.0.0", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safe-stable-stringify": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", - "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==" - }, - "semver": { - "version": "7.5.4", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "shebang-command": { - "version": "2.0.0", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "dev": true - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "requires": { - "is-arrayish": "^0.3.1" - } - }, - "simple-update-notifier": { - "version": "2.0.0", - "dev": true, - "requires": { - "semver": "^7.5.3" - } - }, - "slash": { - "version": "3.0.0", - "dev": true - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==" - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "strip-ansi": { - "version": "6.0.1", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - }, - "dependencies": { - "has-flag": { - "version": "3.0.0", - "dev": true - } - } - }, - "text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" - }, - "text-table": { - "version": "0.2.0", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "touch": { - "version": "3.1.0", - "dev": true, - "requires": { - "nopt": "~1.0.10" - } - }, - "triple-beam": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", - "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==" - }, - "ts-api-utils": { - "version": "1.0.3", - "dev": true, - "requires": {} - }, - "ts-node": { - "version": "10.9.1", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - } - }, - "type-check": { - "version": "0.4.0", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "dev": true - }, - "typescript": { - "version": "5.2.2", - "devOptional": true - }, - "undefsafe": { - "version": "2.0.5", - "dev": true - }, - "undici-types": { - "version": "5.25.3", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", - "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==", - "dev": true - }, - "uri-js": { - "version": "4.4.1", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "dev": true - }, - "viem": { - "version": "1.16.5", - "requires": { - "@adraffy/ens-normalize": "1.9.4", - "@noble/curves": "1.2.0", - "@noble/hashes": "1.3.2", - "@scure/bip32": "1.3.2", - "@scure/bip39": "1.2.1", - "abitype": "0.9.8", - "isows": "1.0.3", - "ws": "8.13.0" - } - }, - "which": { - "version": "2.0.2", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "winston": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.11.0.tgz", - "integrity": "sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g==", - "requires": { - "@colors/colors": "^1.6.0", - "@dabh/diagnostics": "^2.0.2", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.4.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.5.0" - } - }, - "winston-transport": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.6.0.tgz", - "integrity": "sha512-wbBA9PbPAHxKiygo7ub7BYRiKxms0tpfU2ljtWzb3SjRjv5yl6Ozuy/TkXf00HTAt+Uylo3gSkNwzc4ME0wiIg==", - "requires": { - "logform": "^2.3.2", - "readable-stream": "^3.6.0", - "triple-beam": "^1.3.0" - } - }, - "wrappy": { - "version": "1.0.2", - "dev": true - }, - "ws": { - "version": "8.13.0", - "requires": {} - }, - "yallist": { - "version": "4.0.0", - "dev": true - }, - "yn": { - "version": "3.1.1", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "dev": true - } - } -} From bc7b6f642bf51d5c07d34d2483c729948b19ef87 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Fri, 27 Oct 2023 07:01:18 +0200 Subject: [PATCH 024/297] feat(reporter): <- dockerizes it --- packages/reporter/.dockerignore | 7 ++++ packages/reporter/Dockerfile | 13 ++++++++ packages/reporter/README.md | 57 +++++++++++++++++++++++++++++---- 3 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 packages/reporter/.dockerignore create mode 100644 packages/reporter/Dockerfile diff --git a/packages/reporter/.dockerignore b/packages/reporter/.dockerignore new file mode 100644 index 00000000..5f7b077a --- /dev/null +++ b/packages/reporter/.dockerignore @@ -0,0 +1,7 @@ +node_modules +npm - debug.log +Dockerfile + .git + .gitignore + .yarn +logs diff --git a/packages/reporter/Dockerfile b/packages/reporter/Dockerfile new file mode 100644 index 00000000..58daafc7 --- /dev/null +++ b/packages/reporter/Dockerfile @@ -0,0 +1,13 @@ +FROM node:alpine + +WORKDIR /usr/src/app + +COPY package.json yarn.lock .env ./ + +RUN yarn install + +ADD . /usr/src/app + +RUN yarn compile + +CMD ["node", "dist/index.js"] \ No newline at end of file diff --git a/packages/reporter/README.md b/packages/reporter/README.md index 0999ad8d..6bd47687 100644 --- a/packages/reporter/README.md +++ b/packages/reporter/README.md @@ -2,14 +2,17 @@ Script to call Header Reporter contracts of different oracle from source chain to destination chain. -## Run the script +  -1. Configure the correct node version by running `nvm use` -2. Installing packages by running `npm install` -3. Create `.env` file and define the configuration to run. -4. run `ts-node src/index.ts` +--- -## Configuration +  + +## Getting Started + +These instructions will cover the usage information and how to run the code using Docker. + +### Create the .env file Configure the mode you want to run by editing the variable in `.env` @@ -32,7 +35,47 @@ Configure the mode you want to run by editing the variable in `.env` 11. `SOURCE_CHAIN`: source chain `chainId`. 12. `DESTINATION_CHAINS`: destination chain `chainIds` separated by a comma. -## Adding a new controller +### Building the Docker Image + +To build the Docker image, run the following command from the root of the project: + +```sh +docker build -t reporter . +``` + +### Running the reporter + +After building the image, you can run it using the following command: + +```sh +docker run -d -p reporter +``` + +### Viewing Logs + +To view the logs from the running container, use: + +```sh +docker logs -f [CONTAINER_ID or CONTAINER_NAME] +``` + +You can find the `CONTAINER_ID` or `CONTAINER_NAME` using `docker ps`. + +### Stopping the reporter + +To stop the running container: + +```sh +docker stop [CONTAINER_ID or CONTAINER_NAME] +``` + +  + +--- + +  + +## How to add a new controller 1. Add a new file under `/controllers`, create the constructor and `onBlocks` function to call block header reporter contract periodically. From 06b07b1089670dee20b1d795587ceb7399a9d63a Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Fri, 27 Oct 2023 14:04:13 +0800 Subject: [PATCH 025/297] fix: update .env.example --- packages/reporter/.env.example | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index ffad1105..e53d710f 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -19,5 +19,5 @@ TIME_FETCH_BLOCKS_MS=60000 #in ms, frequency to call _fetchBlocks for non-Light BLOCK_BUFFER=10 QUERY_BLOCK_LENGTH=200 -SOURCE_CHAIN=5 -DESTINATION_CHAINS=100 \ No newline at end of file +SOURCE_CHAIN_ID=5 +DESTINATION_CHAIN_IDS=100 \ No newline at end of file From d0a0972853e5aff26f544ee627323e5f85c1aeb2 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Fri, 27 Oct 2023 09:05:56 +0200 Subject: [PATCH 026/297] feat(reporter): handles concurrency for sending a transaction and rn BlocksListener into Coordinator --- packages/reporter/package.json | 1 + packages/reporter/src/BlockListener.ts | 64 ----------- packages/reporter/src/Coordinator.ts | 103 ++++++++++++++++++ .../src/controllers/AMBReporterController.ts | 10 +- .../src/controllers/BaseController.ts | 20 +++- .../controllers/SygmaReporterController.ts | 11 +- .../TelepathyReporterController.ts | 31 ++---- packages/reporter/src/index.ts | 30 +++-- packages/reporter/src/settings/index.ts | 7 +- packages/reporter/src/types/index.ts | 47 -------- packages/reporter/tsconfig.json | 16 +-- packages/reporter/yarn.lock | 17 +++ 12 files changed, 186 insertions(+), 171 deletions(-) delete mode 100644 packages/reporter/src/BlockListener.ts create mode 100644 packages/reporter/src/Coordinator.ts delete mode 100644 packages/reporter/src/types/index.ts diff --git a/packages/reporter/package.json b/packages/reporter/package.json index b1f02948..cb529b7f 100644 --- a/packages/reporter/package.json +++ b/packages/reporter/package.json @@ -13,6 +13,7 @@ }, "packageManager": "yarn@3.2.1", "dependencies": { + "async-mutex": "^0.4.0", "axios": "^1.5.1", "dotenv": "^16.3.1", "viem": "^1.16.5", diff --git a/packages/reporter/src/BlockListener.ts b/packages/reporter/src/BlockListener.ts deleted file mode 100644 index f4332a90..00000000 --- a/packages/reporter/src/BlockListener.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { Chain } from "viem" -import winston from "winston" - -import Multiclient from "./MultiClient" - -import { BlockListenerConfigs } from "./types/index" - -class BlocksListener { - controllers: any[] - logger: winston.Logger - intervalFetchBlocksMs: number - multiclient: Multiclient - intervals: ReturnType | undefined - sourceChain: Chain - queryBlockLength: number - blockBuffer: number - - constructor(_configs: BlockListenerConfigs) { - if (_configs.queryBlockLength > 256 - _configs.blockBuffer) { - throw new Error(`Please choose a block length less than ${256 - _configs.blockBuffer}!`) - } - - this.controllers = _configs.controllers - this.intervalFetchBlocksMs = _configs.intervalFetchBlocksMs - this.logger = _configs.logger.child({ service: "BlocksListener" }) - this.multiclient = _configs.multiclient - this.sourceChain = _configs.sourceChain - this.queryBlockLength = _configs.queryBlockLength - this.blockBuffer = _configs.blockBuffer - this.intervalFetchBlocksMs = _configs.intervalFetchBlocksMs - } - - start() { - this.fetchBlocks() - this.intervals = setInterval(() => { - this.fetchBlocks() - }, this.intervalFetchBlocksMs) - } - - stop() { - clearInterval(this.intervals) - } - - async fetchBlocks() { - try { - const client = this.multiclient.getClientByChain(this.sourceChain) - - const currentBlockNumber = await client.getBlockNumber() - const startBlock = currentBlockNumber - BigInt(this.queryBlockLength) - const endBlock = currentBlockNumber - BigInt(this.blockBuffer) - - const blocks = Array.from( - { length: Number(this.queryBlockLength - this.blockBuffer + 1) }, - (_, _index) => startBlock + BigInt(_index), - ) - this.logger.info(`New blocks detected on ${this.sourceChain.name}: [${startBlock},${endBlock}]`) - this.controllers.map((_controller: any) => _controller.onBlocks(blocks)) - } catch (_err) { - this.logger.error(`Error from block listener ${_err}`) - } - } -} - -export default BlocksListener diff --git a/packages/reporter/src/Coordinator.ts b/packages/reporter/src/Coordinator.ts new file mode 100644 index 00000000..72dc9d57 --- /dev/null +++ b/packages/reporter/src/Coordinator.ts @@ -0,0 +1,103 @@ +import { Chain } from "viem" +import winston from "winston" +import { Mutex } from "async-mutex" + +import Multiclient from "./MultiClient" +import BaseController from "./controllers/BaseController" + +interface BlockListenerConfigs { + controllers: any[] + logger: winston.Logger + intervalFetchBlocksMs: number + intervalsUpdateLightClients: { [controllerName: string]: number } + multiclient: Multiclient + sourceChain: Chain + queryBlockLength: number + blockBuffer: number +} + +class Coordinator { + controllers: BaseController[] + logger: winston.Logger + multiclient: Multiclient + intervals: ReturnType[] + sourceChain: Chain + private _queryBlockLength: number + private _blockBuffer: number + private _intervalFetchBlocksMs: number + private _intervalsUpdateLightClients: { [controllerName: string]: number } + private _mutex: Mutex + + constructor(_configs: BlockListenerConfigs) { + if (_configs.queryBlockLength > 256 - _configs.blockBuffer) { + throw new Error(`Please choose a block length less than ${256 - _configs.blockBuffer}!`) + } + + this.controllers = _configs.controllers + this.logger = _configs.logger.child({ service: "Coordinator" }) + this.multiclient = _configs.multiclient + this.sourceChain = _configs.sourceChain + this._queryBlockLength = _configs.queryBlockLength + this._blockBuffer = _configs.blockBuffer + this._intervalFetchBlocksMs = _configs.intervalFetchBlocksMs + this._intervalsUpdateLightClients = _configs.intervalsUpdateLightClients + + this.intervals = [] + this._mutex = new Mutex() + } + + start() { + this.fetchBlocks() + this.intervals.push( + setInterval(() => { + this.fetchBlocks() + }, this._intervalFetchBlocksMs), + ) + + const lgControllers = this.controllers.filter((_controller) => _controller.type === "lightClient") + lgControllers.forEach((_controller) => this.updateLightClientReporterController(_controller)) + + this.intervals.push( + ...lgControllers.map((_controller) => { + return setInterval(() => { + this.updateLightClientReporterController(_controller) + }, this._intervalsUpdateLightClients[_controller.name]) + }), + ) + } + + stop() { + this.intervals.forEach(clearInterval) + } + + async fetchBlocks() { + try { + const client = this.multiclient.getClientByChain(this.sourceChain) + + const currentBlockNumber = await client.getBlockNumber() + const startBlock = currentBlockNumber - BigInt(this._queryBlockLength) + const endBlock = currentBlockNumber - BigInt(this._blockBuffer) + + const blocks = Array.from( + { length: Number(this._queryBlockLength - this._blockBuffer + 1) }, + (_, _index) => startBlock + BigInt(_index), + ) + this.logger.info(`New blocks detected on ${this.sourceChain.name}: [${startBlock},${endBlock}]`) + for (const controller of this.controllers.filter((_controller) => _controller.type === "classic")) { + const release = await this._mutex.acquire() + await controller.onBlocks(blocks) + release() + } + } catch (_err) { + this.logger.error(`Error from block listener ${_err}`) + } + } + + async updateLightClientReporterController(_controller: BaseController) { + const release = await this._mutex.acquire() + await _controller.update() + release() + } +} + +export default Coordinator diff --git a/packages/reporter/src/controllers/AMBReporterController.ts b/packages/reporter/src/controllers/AMBReporterController.ts index 00329307..d861805f 100644 --- a/packages/reporter/src/controllers/AMBReporterController.ts +++ b/packages/reporter/src/controllers/AMBReporterController.ts @@ -1,9 +1,13 @@ import ABI from "../ABIs/AMBReporterContractABI.json" -import { AMBReporterControllerConfigs } from "../types/index" - import BaseController from "./BaseController" +import { BaseControllerConfigs } from "./BaseController" + +interface AMBReporterControllerConfigs extends BaseControllerConfigs { + reportHeadersGas: number +} + class AMBReporterController extends BaseController { private _reportHeadersGas: number @@ -30,7 +34,7 @@ class AMBReporterController extends BaseController { }) const txHash = await client.writeContract(request) - this.logger.info(`tx sent on ${chain.name}: ${txHash}`) + this.logger.info(`headers reporter from ${this.sourceChain.name} to ${chain.name}: ${txHash}`) } } catch (_error) { this.logger.error(_error) diff --git a/packages/reporter/src/controllers/BaseController.ts b/packages/reporter/src/controllers/BaseController.ts index a5405a6a..1810032c 100644 --- a/packages/reporter/src/controllers/BaseController.ts +++ b/packages/reporter/src/controllers/BaseController.ts @@ -3,13 +3,24 @@ import winston from "winston" import Multiclient from "../MultiClient" -import { BaseControllerConfigs } from "../types" +export type ControllerType = "classic" | "lightClient" + +export type BaseControllerConfigs = { + type: ControllerType + sourceChain: Chain + destinationChains: Chain[] + reporterAddress?: string + adapterAddresses: { [chainName: string]: `0x${string}` } + logger: winston.Logger + multiClient: Multiclient +} class BaseController { name: string + type: ControllerType sourceChain: Chain destinationChains: Chain[] - reporterAddress?: string + reporterAddress?: `0x${string}` adapterAddresses: { [chainName: string]: `0x${string}` } logger: winston.Logger multiClient: Multiclient @@ -20,10 +31,15 @@ class BaseController { this.reporterAddress = configs.reporterAddress as `0x${string}` this.adapterAddresses = configs.adapterAddresses this.multiClient = configs.multiClient + this.type = configs.type this.name = name this.logger = configs.logger.child({ service: this.name }) } + + onBlocks(_blockNumbers: bigint[]) {} + + update() {} } export default BaseController diff --git a/packages/reporter/src/controllers/SygmaReporterController.ts b/packages/reporter/src/controllers/SygmaReporterController.ts index ec2fe288..be1ba6ec 100644 --- a/packages/reporter/src/controllers/SygmaReporterController.ts +++ b/packages/reporter/src/controllers/SygmaReporterController.ts @@ -3,7 +3,12 @@ import { parseEther } from "viem" import ABI from "../ABIs/SygmaReporterContractABI.json" import BaseController from "./BaseController" -import { SygmaReporterControllerConfigs } from "../types/index" +import { BaseControllerConfigs } from "./BaseController" + +interface SygmaReporterControllerConfigs extends BaseControllerConfigs { + reportHeadersToDomainMsgValue: string + domainIds: { [chainName: string]: number } +} class SygmaReporterController extends BaseController { private _domainIds: { [chainName: string]: number } @@ -38,8 +43,8 @@ class SygmaReporterController extends BaseController { ], value: parseEther(this._reportHeadersToDomainMsgValue), }) - const txhash = await client.writeContract(request) - this.logger.info(`tx sent on ${chain.name}: ${txhash}`) + const txHash = await client.writeContract(request) + this.logger.info(`headers reporter from ${this.sourceChain.name} to ${chain.name}: ${txHash}`) } } catch (_error) { this.logger.error(_error) diff --git a/packages/reporter/src/controllers/TelepathyReporterController.ts b/packages/reporter/src/controllers/TelepathyReporterController.ts index d3166440..e4384201 100644 --- a/packages/reporter/src/controllers/TelepathyReporterController.ts +++ b/packages/reporter/src/controllers/TelepathyReporterController.ts @@ -5,47 +5,35 @@ import LightClientContractABI from "../ABIs/TelepathyContractABI.json" import AdapterContractABI from "../ABIs/TelepathyAdapterABI.json" import BaseController from "./BaseController" -import { TelepathyReporterControllerConfigs } from "../types/index" +import { BaseControllerConfigs } from "./BaseController" + +interface TelepathyReporterControllerConfigs extends BaseControllerConfigs { + lightClientAddresses: { [chainName: string]: `0x${string}` } + baseProofUrl: string +} class TelepathyReporterController extends BaseController { lastProcessedBlock: bigint - blockBuffer: number lightClientAddresses: { [chainName: string]: `0x${string}` } - private _baseProofUrl: string - private _intervalFetchHeadUpdates: number - private _intervals: ReturnType | undefined constructor(_configs: TelepathyReporterControllerConfigs) { super(_configs, "TelepathyReporterController") this.lightClientAddresses = _configs.lightClientAddresses - this.blockBuffer = _configs.blockBuffer - this._intervalFetchHeadUpdates = _configs.intervalFetchHeadUpdates this._baseProofUrl = _configs.baseProofUrl this.lastProcessedBlock = 0n } - start() { - this.fetchHeadUpdates() - this._intervals = setInterval(() => { - this.fetchHeadUpdates() - }, this._intervalFetchHeadUpdates) - } - - stop() { - clearInterval(this._intervals) - } - - async fetchHeadUpdates() { + async update() { try { for (const chain of this.destinationChains) { const client = this.multiClient.getClientByChain(chain) const currentBlockNumber = await client.getBlockNumber() - const fromBlock = this.lastProcessedBlock + 1n - const toBlock = currentBlockNumber - BigInt(this.blockBuffer) + const fromBlock = this.lastProcessedBlock === 0n ? currentBlockNumber : this.lastProcessedBlock + 1n + const toBlock = currentBlockNumber this.logger.info(`getting HeadUpdate events in [${fromBlock},${toBlock}] on ${chain.name} ...`) @@ -58,6 +46,7 @@ class TelepathyReporterController extends BaseController { }) if (logs.length == 0) { + this.logger.info("No HeadUpdate events. Skipping ...") continue } diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index a1d7d341..668918e9 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -1,12 +1,12 @@ import * as chains from "viem/chains" -import { gnosis } from "viem/chains" +import { gnosis, goerli } from "viem/chains" import { Chain } from "viem" import Multiclient from "./MultiClient" import AMBReporterController from "./controllers/AMBReporterController" import SygmaReporterController from "./controllers/SygmaReporterController" import TelepathyReporterController from "./controllers/TelepathyReporterController" -import BlocksListener from "./BlockListener" +import Coordinator from "./Coordinator" import { settings } from "./settings/index" import logger from "./utils/logger" @@ -22,12 +22,13 @@ const main = () => { chains: [sourceChain, ...destinationChains], privateKey: process.env.PRIVATE_KEY as `0x${string}`, rpcUrls: { - goerli: settings.rpcUrls.Gnosis, - gnosis: settings.rpcUrls.Goerli, + [goerli.name]: settings.rpcUrls.Goerli, + [gnosis.name]: settings.rpcUrls.Gnosis, }, }) const ambReporterController = new AMBReporterController({ + type: "classic", sourceChain, destinationChains, logger, @@ -38,6 +39,7 @@ const main = () => { }) const sygmaReporterController = new SygmaReporterController({ + type: "classic", sourceChain, destinationChains, logger, @@ -49,6 +51,7 @@ const main = () => { }) const telepathyReporterController = new TelepathyReporterController({ + type: "lightClient", sourceChain, destinationChains, logger, @@ -56,27 +59,22 @@ const main = () => { adapterAddresses: { [gnosis.name]: settings.contractAddresses.Gnosis.SygmaAdapter }, baseProofUrl: settings.reporterControllers.TelepathyReporterController.baseProofUrl, lightClientAddresses: { [gnosis.name]: settings.contractAddresses.Gnosis.TelepathyLightClient }, - blockBuffer: settings.reporterControllers.TelepathyReporterController.blockBuffer, - intervalFetchHeadUpdates: settings.reporterControllers.TelepathyReporterController.intervalFetchHeadUpdates, }) - const blocksListener = new BlocksListener({ - controllers: [ambReporterController, sygmaReporterController].filter( + const coordinator = new Coordinator({ + controllers: [ambReporterController, sygmaReporterController, telepathyReporterController].filter( (_controller) => controllersEnabled?.includes(_controller.name), ), - intervalFetchBlocksMs: settings.BlockListener.intervalFetchBlocksMs, + intervalFetchBlocksMs: settings.Coordinator.intervalFetchBlocksMs, logger, multiclient: multiClient, sourceChain, - queryBlockLength: settings.BlockListener.queryBlockLength, - blockBuffer: settings.BlockListener.blockBuffer, + queryBlockLength: settings.Coordinator.queryBlockLength, + blockBuffer: settings.Coordinator.blockBuffer, + intervalsUpdateLightClients: settings.Coordinator.intervalsUpdateLightClients, }) - blocksListener.start() - - if (controllersEnabled?.includes(telepathyReporterController.name)) { - telepathyReporterController.start() - } + coordinator.start() } main() diff --git a/packages/reporter/src/settings/index.ts b/packages/reporter/src/settings/index.ts index fc0aeeba..04837828 100644 --- a/packages/reporter/src/settings/index.ts +++ b/packages/reporter/src/settings/index.ts @@ -2,10 +2,13 @@ import "dotenv/config" import { gnosis, mainnet, goerli } from "viem/chains" export const settings = { - BlockListener: { + Coordinator: { blockBuffer: Number(process.env.BLOCK_BUFFER), queryBlockLength: Number(process.env.QUERY_BLOCK_LENGTH), intervalFetchBlocksMs: Number(process.env.TIME_FETCH_BLOCKS_MS), + intervalsUpdateLightClients: { + TelepathyReporterController: Number(process.env.TELEPATHY_INTERVAL_FETCH_HEAD_UPDATES), + }, }, rpcUrls: { [gnosis.name]: process.env.GNOSIS_RPC_URL as string, @@ -36,8 +39,6 @@ export const settings = { }, TelepathyReporterController: { baseProofUrl: process.env.TELEPATHY_PROOF_API_URL as string, - blockBuffer: Number(process.env.TELEPATHY_BLOCK_BUFFER), - intervalFetchHeadUpdates: Number(process.env.TELEPATHY_INTERVAL_FETCH_HEAD_UPDATES), }, }, } diff --git a/packages/reporter/src/types/index.ts b/packages/reporter/src/types/index.ts deleted file mode 100644 index 50909db2..00000000 --- a/packages/reporter/src/types/index.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { Chain } from "viem" -import winston = require("winston") - -import Multiclient from "../MultiClient" - -type BaseControllerConfigs = { - sourceChain: Chain - destinationChains: Chain[] - reporterAddress?: string - adapterAddresses: { [chainName: string]: `0x${string}` } - logger: winston.Logger - multiClient: Multiclient -} - -interface TelepathyReporterControllerConfigs extends BaseControllerConfigs { - lightClientAddresses: { [chainName: string]: `0x${string}` } - baseProofUrl: string - blockBuffer: number - intervalFetchHeadUpdates: number -} - -interface AMBReporterControllerConfigs extends BaseControllerConfigs { - reportHeadersGas: number -} - -interface SygmaReporterControllerConfigs extends BaseControllerConfigs { - reportHeadersToDomainMsgValue: string - domainIds: { [chainName: string]: number } -} - -interface BlockListenerConfigs { - controllers: any[] - logger: winston.Logger - intervalFetchBlocksMs: number - multiclient: Multiclient - sourceChain: Chain - queryBlockLength: number - blockBuffer: number -} - -export { - AMBReporterControllerConfigs, - BaseControllerConfigs, - BlockListenerConfigs, - SygmaReporterControllerConfigs, - TelepathyReporterControllerConfigs, -} diff --git a/packages/reporter/tsconfig.json b/packages/reporter/tsconfig.json index 1a5a671e..c5ce31cd 100644 --- a/packages/reporter/tsconfig.json +++ b/packages/reporter/tsconfig.json @@ -6,11 +6,7 @@ "esModuleInterop": true, "experimentalDecorators": true, "forceConsistentCasingInFileNames": true, - "lib": [ - "es6", - "ESNext", - "DOM" - ], + "lib": ["es6", "ESNext", "DOM"], "module": "commonjs", "moduleResolution": "node", "noImplicitAny": true, @@ -21,10 +17,6 @@ "strict": true, "target": "ESNext" }, - "exclude": [ - "node_modules" - ], - "include": [ - "./src/**/*" - ] -} \ No newline at end of file + "exclude": ["node_modules"], + "include": ["./src/**/*"] +} diff --git a/packages/reporter/yarn.lock b/packages/reporter/yarn.lock index 4d057942..fa27ca5b 100644 --- a/packages/reporter/yarn.lock +++ b/packages/reporter/yarn.lock @@ -604,6 +604,15 @@ __metadata: languageName: node linkType: hard +"async-mutex@npm:^0.4.0": + version: 0.4.0 + resolution: "async-mutex@npm:0.4.0" + dependencies: + tslib: ^2.4.0 + checksum: 813a71728b35a4fbfd64dba719f04726d9133c67b577fcd951b7028c4a675a13ee34e69beb82d621f87bf81f5d4f135c4c44be0448550c7db728547244ef71fc + languageName: node + linkType: hard + "async@npm:^3.2.3": version: 3.2.4 resolution: "async@npm:3.2.4" @@ -2204,6 +2213,7 @@ __metadata: "@types/node-cron": ^3.0.9 "@typescript-eslint/eslint-plugin": ^6.7.5 "@typescript-eslint/parser": ^6.7.5 + async-mutex: ^0.4.0 axios: ^1.5.1 dotenv: ^16.3.1 eslint: ^8.51.0 @@ -2572,6 +2582,13 @@ __metadata: languageName: node linkType: hard +"tslib@npm:^2.4.0": + version: 2.6.2 + resolution: "tslib@npm:2.6.2" + checksum: 329ea56123005922f39642318e3d1f0f8265d1e7fcb92c633e0809521da75eeaca28d2cf96d7248229deb40e5c19adf408259f4b9640afd20d13aecc1430f3ad + languageName: node + linkType: hard + "type-check@npm:^0.4.0, type-check@npm:~0.4.0": version: 0.4.0 resolution: "type-check@npm:0.4.0" From baecfdce29827917eeb54c27a288e0debff15e8e Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Mon, 30 Oct 2023 15:09:10 +0800 Subject: [PATCH 027/297] fix: update .env.example --- packages/reporter/.env.example | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index e53d710f..66a8d86f 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -12,6 +12,7 @@ SYGMA_REPORT_HEADERS_TO_DOMAIN_MSG_VALUE=0.0001 TELEPATHY_PROOF_API_URL=https://api.telepathy.xyz/api/hashi/ TELEPATHY_BLOCK_BUFFER=10 TELEPATHY_TIME_FETCH_BLOCK_MS=200000 +TELEPATHY_INTERVAL_FETCH_HEAD_UPDATES=10000 TIME_FETCH_BLOCKS_MS=60000 #in ms, frequency to call _fetchBlocks for non-Light Client based controllers From 2ba2c56f5b101d3a1d1aa8d3ca815c2282a9c6b6 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Mon, 30 Oct 2023 16:19:21 +0800 Subject: [PATCH 028/297] fix: TelepathyReporterCntroller logic --- .../reporter/src/controllers/TelepathyReporterController.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/reporter/src/controllers/TelepathyReporterController.ts b/packages/reporter/src/controllers/TelepathyReporterController.ts index e4384201..d555dccf 100644 --- a/packages/reporter/src/controllers/TelepathyReporterController.ts +++ b/packages/reporter/src/controllers/TelepathyReporterController.ts @@ -34,7 +34,6 @@ class TelepathyReporterController extends BaseController { const currentBlockNumber = await client.getBlockNumber() const fromBlock = this.lastProcessedBlock === 0n ? currentBlockNumber : this.lastProcessedBlock + 1n const toBlock = currentBlockNumber - this.logger.info(`getting HeadUpdate events in [${fromBlock},${toBlock}] on ${chain.name} ...`) const logs = await client.getContractEvents({ @@ -47,10 +46,11 @@ class TelepathyReporterController extends BaseController { if (logs.length == 0) { this.logger.info("No HeadUpdate events. Skipping ...") + this.lastProcessedBlock = toBlock continue } - this.logger.error(`detected ${logs.length} HeadUpdate events. Processing them ...`) + this.logger.info(`detected ${logs.length} HeadUpdate events. Processing them ...`) logs.forEach(async (_log: any) => { const slotValue = _log.topics[1] this.logger.info(`fetching proof for slot ${slotValue} on ${chain.name} ...`) From 742c4c80f2c5f4349b943aced7305419f494cd60 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Fri, 10 Nov 2023 17:57:05 +0100 Subject: [PATCH 029/297] feat(reporter): adds more settings and limit AMBReporterController to just send 1 block in order to spend less in gas --- packages/reporter/.env.example | 37 +++++++++++++------ packages/reporter/README.md | 21 +---------- .../src/controllers/AMBReporterController.ts | 10 ++--- packages/reporter/src/index.ts | 27 ++++++++++++-- packages/reporter/src/settings/index.ts | 37 +++++++++++++++++-- 5 files changed, 87 insertions(+), 45 deletions(-) diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index 66a8d86f..15f947e6 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -1,24 +1,39 @@ PRIVATE_KEY= -REPORTERS_ENABLED=AMBReporterController,TelepathyReporterController,SygmaReporterController +REPORTERS_ENABLED2=AMBReporterController,TelepathyReporterController,SygmaReporterController +REPORTERS_ENABLED=AMBReporterController,SygmaReporterController,TelepathyReporterController +GNOSIS_RPC_URL=https://rpc.ankr.com/gnosis +MAINNET_RPC_URL= GOERLI_RPC_URL= -GNOSIS_RPC_URL=https://rpc.gnosischain.com +POLYGON_RPC_URL= +OPTIMISM_RPC_URL=https://optimism.llamarpc.com +ARBITRUM_RPC_URL=https://arbitrum.llamarpc.com - -AMB_REPORTER_HEADERS_GAS=30000 +AMB_REPORTER_HEADERS_GAS=300000 SYGMA_REPORT_HEADERS_TO_DOMAIN_MSG_VALUE=0.0001 -TELEPATHY_PROOF_API_URL=https://api.telepathy.xyz/api/hashi/ +TELEPATHY_PROOF_API_URL= TELEPATHY_BLOCK_BUFFER=10 -TELEPATHY_TIME_FETCH_BLOCK_MS=200000 -TELEPATHY_INTERVAL_FETCH_HEAD_UPDATES=10000 - -TIME_FETCH_BLOCKS_MS=60000 #in ms, frequency to call _fetchBlocks for non-Light Client based controllers +TELEPATHY_INTERVAL_FETCH_HEAD_UPDATES=30000 -## Block Listener Configs for non-Light CLient based controllers +TIME_FETCH_BLOCKS_MS=3600000 BLOCK_BUFFER=10 QUERY_BLOCK_LENGTH=200 SOURCE_CHAIN_ID=5 -DESTINATION_CHAIN_IDS=100 \ No newline at end of file +DESTINATION_CHAIN_IDS=100 + +AMB_ADAPTER=0x4efB95c26bB2ebD3281749A5eAA388bc302b4445 +SYMGA_ADAPTER=0x9AD7a6f4FDA8247cC0bF5932B68c5b619937dB15 +GNOSIS_TELEPATHY_ADAPTER=0xDeF29f44f8315d0079A25EF03cfB0b0D8CdA3cF8 +MAINNET_AMB_REPORTER=0x6be796cb66CdB3566b8AbebA2C516CbDF93fE831 +MAINNET_HEADER_REPORTER=0x11378C54aA4e2Daf4603f9be86ae0Cb70786682a +POLYGON_TELEPATHY_ADAPTER=0x04413A4795dD1f5347eAD1CD7C76Bd9E5e48b461 +POLYGON_AXELAR_ADAPTER=0x4694E10017Ed7E0E87bfE386e5f051a7C64286A2 +BSC_TELEPATHY_ADAPTER=0x2E5685F20f42cC3b01e4A9ADE49F6848E242f022 +BSC_AXELAR_ADAPTER=0x856dcc80f75a9737D9D498266E1Af013668316Fb +OPTIMISM_TELEPATHY_ADAPTER=0x856dcc80f75a9737D9D498266E1Af013668316Fb +OPTIMISM_AXELAR_ADAPTER=0x6E9ce437c46e7fA4F0888c21AAC0d9099Ad133ea +ARBITRUM_TELEPATHY_ADAPTER=0x2E5685F20f42cC3b01e4A9ADE49F6848E242f022 +ARBITRUM_AXELAR_ADAPTER=0x6E9ce437c46e7fA4F0888c21AAC0d9099Ad133ea \ No newline at end of file diff --git a/packages/reporter/README.md b/packages/reporter/README.md index 6bd47687..9cb4ab9a 100644 --- a/packages/reporter/README.md +++ b/packages/reporter/README.md @@ -14,26 +14,7 @@ These instructions will cover the usage information and how to run the code usin ### Create the .env file -Configure the mode you want to run by editing the variable in `.env` - -1. `REPORTERS_ENABLED` (name of reporter,separated by ',', with no space between): to enable the controller, i.e. - amb,sygma -2. `AMB_REPORTER_HEADERS_GAS` (number): gas used in AMB reporter to pass block header. -3. `SYGMA_REPORT_HEADERS_TO_DOMAIN_MSG_VALUE` (number): amount of ethers sent when bridging block header from sygma, - similar to reportHeadersGas fee, i.e. 0.001 (ethers). -4. `TIME_FETCH_BLOCKS_MS` (number): block reporter restart period (in ms), i.e. 60000 (ms). -5. `BLOCK_BUFFER` (number): the amount of blocks from source chain away from the latest block, in case the node provider - is not sync up with the latest block, i.e. 10 (blocks). -6. `QUERY_BLOCK_LENGTH` (number): the amount of block headers from source chain to send to destination chain, should be - less than 256 due to the limitation of Solidity - [blockhash()](https://docs.soliditylang.org/en/v0.8.21/units-and-global-variables.html#block-and-transaction-properties). -7. `TELEPATHY_PROOF_API_URL` (string): url of telepathy proof api -8. `TELEPATHY_QUERY_BLOCK_LENGTH` (number): block range to query on `HeadUpdate` event, i.e. 1000 (blocks) -9. `TELEPATHY_BLOCK_BUFFER` (number): amount of blocks away from the latest block in destination chain, in case the node - provider is not sync up with the latest block, i.e. 10 (blocks). -10. `TELEPATHY_TIME_FETCH_BLOCK_MS`: interval time for which the controller looks for new `HeadUpdate` events. -11. `SOURCE_CHAIN`: source chain `chainId`. -12. `DESTINATION_CHAINS`: destination chain `chainIds` separated by a comma. +Configure the mode you want to run by editing the variable in `.env` by checking `.env.example` ### Building the Docker Image diff --git a/packages/reporter/src/controllers/AMBReporterController.ts b/packages/reporter/src/controllers/AMBReporterController.ts index d861805f..5d025fa0 100644 --- a/packages/reporter/src/controllers/AMBReporterController.ts +++ b/packages/reporter/src/controllers/AMBReporterController.ts @@ -21,16 +21,14 @@ class AMBReporterController extends BaseController { const client = this.multiClient.getClientByChain(this.sourceChain) for (const chain of this.destinationChains) { - this.logger.info( - `reporting block headers of blocks [${_blockNumbers[0]},${_blockNumbers[_blockNumbers.length - 1]}] on ${ - chain.name - } ...`, - ) + const blockNumber = _blockNumbers[_blockNumbers.length - 1] + + this.logger.info(`reporting block header for block ${blockNumber} on ${chain.name} ...`) const { request } = await client.simulateContract({ address: this.reporterAddress as `0x${string}`, abi: ABI, functionName: "reportHeaders", - args: [_blockNumbers, this.adapterAddresses[chain.name], this._reportHeadersGas], + args: [[blockNumber], this.adapterAddresses[chain.name], this._reportHeadersGas], }) const txHash = await client.writeContract(request) diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 668918e9..d6d314a1 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -1,5 +1,5 @@ import * as chains from "viem/chains" -import { gnosis, goerli } from "viem/chains" +import { gnosis, mainnet, goerli, polygon, optimism, bsc, arbitrum } from "viem/chains" import { Chain } from "viem" import Multiclient from "./MultiClient" @@ -24,6 +24,11 @@ const main = () => { rpcUrls: { [goerli.name]: settings.rpcUrls.Goerli, [gnosis.name]: settings.rpcUrls.Gnosis, + [mainnet.name]: settings.rpcUrls.Ethereum, + [arbitrum.name]: settings.rpcUrls["Arbitrum One"], + [optimism.name]: settings.rpcUrls["OP Mainnet"], + [bsc.name]: settings.rpcUrls["BNB Smart Chain"], + [polygon.name]: settings.rpcUrls.Polygon, }, }) @@ -34,7 +39,9 @@ const main = () => { logger, multiClient, reporterAddress: settings.contractAddresses.Goerli.AMBReporter, - adapterAddresses: { [gnosis.name]: settings.contractAddresses.Gnosis.AMBAdapter }, + adapterAddresses: { + [gnosis.name]: settings.contractAddresses.Gnosis.AMBAdapter, + }, reportHeadersGas: settings.reporterControllers.AMBReporterController.reportHeadersGas, }) @@ -56,9 +63,21 @@ const main = () => { destinationChains, logger, multiClient, - adapterAddresses: { [gnosis.name]: settings.contractAddresses.Gnosis.SygmaAdapter }, + adapterAddresses: { + [gnosis.name]: settings.contractAddresses.Gnosis.TelepathyAdapter, + [arbitrum.name]: settings.contractAddresses["Arbitrum One"].TelepathyAdapter, + [optimism.name]: settings.contractAddresses["OP Mainnet"].TelepathyAdapter, + [bsc.name]: settings.contractAddresses["BNB Smart Chain"].TelepathyAdapter, + [polygon.name]: settings.contractAddresses.Polygon.TelepathyAdapter, + }, baseProofUrl: settings.reporterControllers.TelepathyReporterController.baseProofUrl, - lightClientAddresses: { [gnosis.name]: settings.contractAddresses.Gnosis.TelepathyLightClient }, + lightClientAddresses: { + [gnosis.name]: settings.contractAddresses.Gnosis.TelepathyLightClient, + [arbitrum.name]: settings.contractAddresses["Arbitrum One"].TelepathyLightClient, + [optimism.name]: settings.contractAddresses["OP Mainnet"].TelepathyLightClient, + [bsc.name]: settings.contractAddresses["BNB Smart Chain"].TelepathyLightClient, + [polygon.name]: settings.contractAddresses.Polygon.TelepathyLightClient, + }, }) const coordinator = new Coordinator({ diff --git a/packages/reporter/src/settings/index.ts b/packages/reporter/src/settings/index.ts index 04837828..7c52d8aa 100644 --- a/packages/reporter/src/settings/index.ts +++ b/packages/reporter/src/settings/index.ts @@ -1,5 +1,5 @@ import "dotenv/config" -import { gnosis, mainnet, goerli } from "viem/chains" +import { gnosis, mainnet, goerli, polygon, optimism, bsc, arbitrum } from "viem/chains" export const settings = { Coordinator: { @@ -13,18 +13,47 @@ export const settings = { rpcUrls: { [gnosis.name]: process.env.GNOSIS_RPC_URL as string, [goerli.name]: process.env.GOERLI_RPC_URL as string, + [mainnet.name]: process.env.MAINNET_RPC_URL as string, + [polygon.name]: process.env.POLYGON_RPC_URL as string, + [optimism.name]: process.env.OPTIMISM_RPC_URL as string, + [bsc.name]: process.env.BSC_RPC_URL as string, + [arbitrum.name]: process.env.ARBITRUM_RPC_URL as string, }, contractAddresses: { + [mainnet.name]: { + AMBReporter: process.env.MAINNET_AMB_REPORTER as `0x${string}`, + AxelarReporter: process.env.MAINNET_HEADER_REPORTER as `0x${string}`, + }, [gnosis.name]: { - AMBAdapter: "0x01268DB05965CeAc2a89566c42CD550ED7eE5ECD" as `0x${string}`, - SygmaAdapter: "0x9AD7a6f4FDA8247cC0bF5932B68c5b619937dB15" as `0x${string}`, - TelapathyAdapter: "0x2f1E51a2763FB67fe09971Fd8d849716137A3357" as `0x${string}`, + AMBAdapter: process.env.GNOSIS_AMB_ADAPTER as `0x${string}`, + SygmaAdapter: process.env.GNOSIS_SYGMA_ADAPTER as `0x${string}`, + TelepathyAdapter: process.env.GNOSIS_TELEPATHY_ADAPTER as `0x${string}`, TelepathyLightClient: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, }, [goerli.name]: { AMBReporter: "0xedc0b1d3de4496e0d917af42f29cb71eb2982319" as `0x${string}`, SygmaReporter: "0x2f96d347c932ac73b56e9352ecc0707e25173d88" as `0x${string}`, }, + [polygon.name]: { + TelepathyAdapter: process.env.POLYGON_TELEPATHY_ADAPTER as `0x${string}`, + TelepathyLightClient: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, + AxelarAdapter: process.env.POLYGON_AXELAR_ADAPTER as `0x${string}`, + }, + [bsc.name]: { + TelepathyAdapter: process.env.BSC_TELEPATHY_ADAPTER as `0x${string}`, + TelepathyLightClient: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, + AxelarAdapter: process.env.BSC_AXELAR_ADAPTER as `0x${string}`, + }, + [optimism.name]: { + TelepathyAdapter: process.env.OPTIMISM_TELEPATHY_ADAPTER as `0x${string}`, + TelepathyLightClient: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, + AxelarAdapter: process.env.OPTIMISM_AXELAR_ADAPTER as `0x${string}`, + }, + [arbitrum.name]: { + TelepathyAdapter: process.env.ARBITRUM_TELEPATHY_ADAPTER as `0x${string}`, + TelepathyLightClient: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, + AxelarAdapter: process.env.ARBITRUM_AXELAR_ADAPTER as `0x${string}`, + }, }, reporterControllers: { AMBReporterController: { From 86d0ac90ad4956304bdd6e22c143433b1dd199ce Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Tue, 14 Nov 2023 19:52:32 +0800 Subject: [PATCH 030/297] fix: wrong transaction nonce error for Telepathy --- .../src/controllers/AMBReporterController.ts | 6 ++++- .../TelepathyReporterController.ts | 23 ++++++++++++++----- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/packages/reporter/src/controllers/AMBReporterController.ts b/packages/reporter/src/controllers/AMBReporterController.ts index 5d025fa0..8a0bf3b2 100644 --- a/packages/reporter/src/controllers/AMBReporterController.ts +++ b/packages/reporter/src/controllers/AMBReporterController.ts @@ -23,7 +23,11 @@ class AMBReporterController extends BaseController { for (const chain of this.destinationChains) { const blockNumber = _blockNumbers[_blockNumbers.length - 1] - this.logger.info(`reporting block header for block ${blockNumber} on ${chain.name} ...`) + this.logger.info( + `reporting block header for block from ${_blockNumbers[0]} to ${_blockNumbers[_blockNumbers.length - 1]} on ${ + chain.name + } ...`, + ) const { request } = await client.simulateContract({ address: this.reporterAddress as `0x${string}`, abi: ABI, diff --git a/packages/reporter/src/controllers/TelepathyReporterController.ts b/packages/reporter/src/controllers/TelepathyReporterController.ts index d555dccf..ac3612a0 100644 --- a/packages/reporter/src/controllers/TelepathyReporterController.ts +++ b/packages/reporter/src/controllers/TelepathyReporterController.ts @@ -1,5 +1,6 @@ import axios from "axios" import { hexToNumber } from "viem" +import { Mutex } from "async-mutex" import LightClientContractABI from "../ABIs/TelepathyContractABI.json" import AdapterContractABI from "../ABIs/TelepathyAdapterABI.json" @@ -23,21 +24,26 @@ class TelepathyReporterController extends BaseController { this.lightClientAddresses = _configs.lightClientAddresses this._baseProofUrl = _configs.baseProofUrl - this.lastProcessedBlock = 0n + this.lastProcessedBlock = 30946038n } async update() { try { + let mutex = new Mutex() for (const chain of this.destinationChains) { const client = this.multiClient.getClientByChain(chain) const currentBlockNumber = await client.getBlockNumber() const fromBlock = this.lastProcessedBlock === 0n ? currentBlockNumber : this.lastProcessedBlock + 1n const toBlock = currentBlockNumber - this.logger.info(`getting HeadUpdate events in [${fromBlock},${toBlock}] on ${chain.name} ...`) + this.logger.info( + `getting HeadUpdate events in [${fromBlock},${toBlock}] on ${chain.name} , on contract ${ + this.lightClientAddresses[chain.name] + }...`, + ) const logs = await client.getContractEvents({ - address: this.lightClientAddresses[chain.name.toLocaleLowerCase()] as `0x${string}`, + address: this.lightClientAddresses[chain.name] as `0x${string}`, abi: LightClientContractABI, eventName: "HeadUpdate", fromBlock, @@ -57,17 +63,22 @@ class TelepathyReporterController extends BaseController { const response = await axios.post(`${this._baseProofUrl}${this.sourceChain.id}/${hexToNumber(slotValue!)}`) const { chainId, slot, blockNumber, blockNumberProof, blockHash, blockHashProof } = response.data.result - this.logger.info(`calling storeBlockHeader for block number ${blockNumber} ...`) + this.logger.info( + `calling storeBlockHeader for block number ${blockNumber} on contract ${ + this.adapterAddresses[chain.name] + } ...`, + ) const { request } = await client.simulateContract({ - address: this.adapterAddresses[chain.name.toLocaleLowerCase()] as `0x${string}`, + address: this.adapterAddresses[chain.name] as `0x${string}`, abi: AdapterContractABI, functionName: "storeBlockHeader", args: [chainId, slot, blockNumber, blockNumberProof, blockHash, blockHashProof], }) - + const release = await mutex.acquire() const txHash = await client.writeContract(request) this.logger.info(`tx sent on ${chain.name}: ${txHash}`) + release() }) this.lastProcessedBlock = toBlock } From acfb23285118dd0bc4dcaa1d726bdb6d18bfb8ba Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Fri, 24 Nov 2023 06:05:14 +0100 Subject: [PATCH 031/297] feat(reporter): adds WormholeReporterController --- packages/reporter/.env.example | 14 +- packages/reporter/src/ABIs/WormholeABI.json | 9 + .../reporter/src/ABIs/WormholeAdapterABI.json | 347 ++++++++++++++++++ .../src/ABIs/WormhomeHeaderReporterABI.json | 63 ++++ .../controllers/WormholeReporterController.ts | 97 +++++ packages/reporter/src/index.ts | 31 +- packages/reporter/src/settings/index.ts | 17 +- packages/reporter/src/utils/sleep.ts | 8 + 8 files changed, 578 insertions(+), 8 deletions(-) create mode 100644 packages/reporter/src/ABIs/WormholeABI.json create mode 100644 packages/reporter/src/ABIs/WormholeAdapterABI.json create mode 100644 packages/reporter/src/ABIs/WormhomeHeaderReporterABI.json create mode 100644 packages/reporter/src/controllers/WormholeReporterController.ts create mode 100644 packages/reporter/src/utils/sleep.ts diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index 15f947e6..f6317d52 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -1,7 +1,6 @@ PRIVATE_KEY= -REPORTERS_ENABLED2=AMBReporterController,TelepathyReporterController,SygmaReporterController -REPORTERS_ENABLED=AMBReporterController,SygmaReporterController,TelepathyReporterController +REPORTERS_ENABLED=AMBReporterController,SygmaReporterController,TelepathyReporterController,WormholeReporterController GNOSIS_RPC_URL=https://rpc.ankr.com/gnosis MAINNET_RPC_URL= @@ -17,6 +16,8 @@ TELEPATHY_PROOF_API_URL= TELEPATHY_BLOCK_BUFFER=10 TELEPATHY_INTERVAL_FETCH_HEAD_UPDATES=30000 +WORMHOLE_SCAN_BASE_URL=https://api.wormholescan.io + TIME_FETCH_BLOCKS_MS=3600000 BLOCK_BUFFER=10 QUERY_BLOCK_LENGTH=200 @@ -36,4 +37,11 @@ BSC_AXELAR_ADAPTER=0x856dcc80f75a9737D9D498266E1Af013668316Fb OPTIMISM_TELEPATHY_ADAPTER=0x856dcc80f75a9737D9D498266E1Af013668316Fb OPTIMISM_AXELAR_ADAPTER=0x6E9ce437c46e7fA4F0888c21AAC0d9099Ad133ea ARBITRUM_TELEPATHY_ADAPTER=0x2E5685F20f42cC3b01e4A9ADE49F6848E242f022 -ARBITRUM_AXELAR_ADAPTER=0x6E9ce437c46e7fA4F0888c21AAC0d9099Ad133ea \ No newline at end of file +ARBITRUM_AXELAR_ADAPTER=0x6E9ce437c46e7fA4F0888c21AAC0d9099Ad133ea +GNOSIS_WORMHOLE_ADAPTER=0x8EA3F385be8FCB98eB4dBfad2D00846860Bf648D +POLYGON_WORMHOLE_ADAPTER=0xb7806ea66c1bb9FfeB41Dc303601a469ddf3b9C2 +BSC_WORMHOLE_ADAPTER=0x11378C54aA4e2Daf4603f9be86ae0Cb70786682a +OPTIMISM_WORMHOLE_ADAPTER=0x1fF52708D610b1D17F0830f036e992677CDc508A +AVALANCHE_WORMHOLE_ADAPTER=0x6E9ce437c46e7fA4F0888c21AAC0d9099Ad133ea +MAINNET_WORMHOLE_HEADER_REPORTER=0xDeF29f44f8315d0079A25EF03cfB0b0D8CdA3cF8 +MAINNET_WORMHOLE_ADDRESS=0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B \ No newline at end of file diff --git a/packages/reporter/src/ABIs/WormholeABI.json b/packages/reporter/src/ABIs/WormholeABI.json new file mode 100644 index 00000000..d1b59b6a --- /dev/null +++ b/packages/reporter/src/ABIs/WormholeABI.json @@ -0,0 +1,9 @@ +[ + { + "inputs": [{ "internalType": "address", "name": "emitter", "type": "address" }], + "name": "nextSequence", + "outputs": [{ "internalType": "uint64", "name": "", "type": "uint64" }], + "stateMutability": "view", + "type": "function" + } +] diff --git a/packages/reporter/src/ABIs/WormholeAdapterABI.json b/packages/reporter/src/ABIs/WormholeAdapterABI.json new file mode 100644 index 00000000..636a5b1c --- /dev/null +++ b/packages/reporter/src/ABIs/WormholeAdapterABI.json @@ -0,0 +1,347 @@ +[ + { + "inputs": [ + { + "internalType": "contract IWormhole", + "name": "wormhole_", + "type": "address" + }, + { + "internalType": "address", + "name": "reporter_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "sourceChainId_", + "type": "uint256" + }, + { + "internalType": "uint16", + "name": "wormholeSourceChainId_", + "type": "uint16" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "reportedBlockHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "storedBlockHash", + "type": "bytes32" + } + ], + "name": "ConflictingBlockHeader", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "length", + "type": "uint256" + } + ], + "name": "InvalidBlockHeaderLength", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidBlockHeaderRLP", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "emitter", + "type": "address" + }, + { + "internalType": "uint16", + "name": "chainId", + "type": "uint16" + } + ], + "name": "InvalidEmitterChainId", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "emitter", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint8", + "name": "version", + "type": "uint8" + }, + { + "internalType": "uint32", + "name": "timestamp", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "nonce", + "type": "uint32" + }, + { + "internalType": "uint16", + "name": "emitterChainId", + "type": "uint16" + }, + { + "internalType": "bytes32", + "name": "emitterAddress", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "sequence", + "type": "uint64" + }, + { + "internalType": "uint8", + "name": "consistencyLevel", + "type": "uint8" + }, + { + "internalType": "bytes", + "name": "payload", + "type": "bytes" + }, + { + "internalType": "uint32", + "name": "guardianSetIndex", + "type": "uint32" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "guardianIndex", + "type": "uint8" + } + ], + "internalType": "struct Signature[]", + "name": "signatures", + "type": "tuple[]" + }, + { + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + } + ], + "internalType": "struct VM", + "name": "vm", + "type": "tuple" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "InvalidMessage", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "emitter", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "reporter", + "type": "bytes32" + } + ], + "name": "InvalidReporter", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "hashes", + "type": "bytes32" + } + ], + "name": "HashStored", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "domain", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "getHashFromOracle", + "outputs": [ + { + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "hashes", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "bytes[]", + "name": "blockHeaders", + "type": "bytes[]" + } + ], + "name": "proveAncestralBlockHashes", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "reporter", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "sourceChainId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "encodedVM", + "type": "bytes" + } + ], + "name": "storeHashesByEncodedVM", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "wormhole", + "outputs": [ + { + "internalType": "contract IWormhole", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "wormholeSourceChainId", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/packages/reporter/src/ABIs/WormhomeHeaderReporterABI.json b/packages/reporter/src/ABIs/WormhomeHeaderReporterABI.json new file mode 100644 index 00000000..0e80a16f --- /dev/null +++ b/packages/reporter/src/ABIs/WormhomeHeaderReporterABI.json @@ -0,0 +1,63 @@ +[ + { + "inputs": [ + { + "internalType": "contract IWormhole", + "name": "wormhole_", + "type": "address" + }, + { + "internalType": "contract IHeaderStorage", + "name": "headerStorage_", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "headerStorage", + "outputs": [ + { + "internalType": "contract IHeaderStorage", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "blockNumbers", + "type": "uint256[]" + } + ], + "name": "reportHeaders", + "outputs": [ + { + "internalType": "uint64", + "name": "sequence", + "type": "uint64" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "wormhole", + "outputs": [ + { + "internalType": "contract IWormhole", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/packages/reporter/src/controllers/WormholeReporterController.ts b/packages/reporter/src/controllers/WormholeReporterController.ts new file mode 100644 index 00000000..ccd3f261 --- /dev/null +++ b/packages/reporter/src/controllers/WormholeReporterController.ts @@ -0,0 +1,97 @@ +import axios, { AxiosInstance } from "axios" +import HeaderReporterABI from "../ABIs/WormhomeHeaderReporterABI.json" +import AdapterABI from "../ABIs/WormholeAdapterABI.json" +import WormholeABI from "../ABIs/WormholeABI.json" +import { Mutex } from "async-mutex" + +import BaseController from "./BaseController" +import sleep from "../utils/sleep" + +import { BaseControllerConfigs } from "./BaseController" + +interface WormholeReporterControllerConfigs extends BaseControllerConfigs { + wormholeScanBaseUrl: string + wormholeAddress: `0x${string}` + wormholeChainIds: { [chainName: string]: number } +} + +class WormholeReporterController extends BaseController { + private _wormholeAddress: `0x${string}` + private _wormholeScanClient: AxiosInstance + private _wormholeChainIds: { [chainName: string]: number } + private _mutex: Mutex + + constructor(_configs: WormholeReporterControllerConfigs) { + super(_configs, "WormholeReporterController") + this._wormholeScanClient = axios.create({ baseURL: _configs.wormholeScanBaseUrl }) + this._mutex = new Mutex() + this._wormholeAddress = _configs.wormholeAddress + this._wormholeChainIds = _configs.wormholeChainIds + } + + async onBlocks(_blockNumbers: bigint[]) { + const release = await this._mutex.acquire() + try { + const wormholeChainId = this._wormholeChainIds[this.sourceChain.name] + const client = this.multiClient.getClientByChain(this.sourceChain) + const blockNumber = _blockNumbers[_blockNumbers.length - 1] + + const nextSequence = await client.readContract({ + address: this._wormholeAddress as `0x${string}`, + abi: WormholeABI, + functionName: "nextSequence", + args: [this.reporterAddress], + }) + + this.logger.info(`reporting block header for block ${blockNumber} ...`) + const { request } = await client.simulateContract({ + address: this.reporterAddress as `0x${string}`, + abi: HeaderReporterABI, + functionName: "reportHeaders", + args: [[blockNumber]], + }) + + let txHash = await client.writeContract(request) + this.logger.info(`header reported from ${this.sourceChain.name} to Wormhole Network: ${txHash}`) + + let vaaBytes = null + while (true) { + try { + this.logger.info("Waiting for signed VAA ...") + const { data } = await this._wormholeScanClient.get( + `v1/signed_vaa/${wormholeChainId}/000000000000000000000000${this.reporterAddress?.slice( + wormholeChainId, + )}/${Number(nextSequence)}`, + ) + vaaBytes = "0x" + Buffer.from(data.vaaBytes, "base64").toString("hex") + this.logger.info("Signed VAA available! Proceeding ...") + break + } catch (_err) { + this.logger.info("VAA not available yet ...") + } + await sleep(20000) + } + + for (const chain of this.destinationChains) { + const destinationChainClient = this.multiClient.getClientByChain(chain) + + this.logger.info(`Storing header on ${chain.name} ...`) + const { request } = await destinationChainClient.simulateContract({ + address: this.adapterAddresses[chain.name], + abi: AdapterABI, + functionName: "storeHashesByEncodedVM", + args: [vaaBytes], + }) + + txHash = await destinationChainClient.writeContract(request) + this.logger.info(`Header stored on ${chain.name}: ${txHash}!`) + } + } catch (_error) { + this.logger.error(_error) + } finally { + release() + } + } +} + +export default WormholeReporterController diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index d6d314a1..e4a3c506 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -1,11 +1,12 @@ import * as chains from "viem/chains" -import { gnosis, mainnet, goerli, polygon, optimism, bsc, arbitrum } from "viem/chains" +import { avalanche, gnosis, mainnet, goerli, polygon, optimism, bsc, arbitrum } from "viem/chains" import { Chain } from "viem" import Multiclient from "./MultiClient" import AMBReporterController from "./controllers/AMBReporterController" import SygmaReporterController from "./controllers/SygmaReporterController" import TelepathyReporterController from "./controllers/TelepathyReporterController" +import WormholeReporterController from "./controllers/WormholeReporterController" import Coordinator from "./Coordinator" import { settings } from "./settings/index" import logger from "./utils/logger" @@ -80,10 +81,32 @@ const main = () => { }, }) + const wormholeReporterController = new WormholeReporterController({ + type: "classic", + sourceChain, + destinationChains, + logger, + multiClient, + reporterAddress: settings.contractAddresses.Ethereum.WormholeHeaderReporter, + adapterAddresses: { + [gnosis.name]: settings.contractAddresses.Gnosis.WormholeAdapter, + [optimism.name]: settings.contractAddresses["OP Mainnet"].WormholeAdapter, + [bsc.name]: settings.contractAddresses["BNB Smart Chain"].WormholeAdapter, + [polygon.name]: settings.contractAddresses.Polygon.WormholeAdapter, + [avalanche.name]: settings.contractAddresses.Avalanche.WormholeAdapter, + }, + wormholeScanBaseUrl: settings.reporterControllers.WormholeReporterController.wormholeScanBaseUrl, + wormholeAddress: (settings.contractAddresses as any)[sourceChain.name].Wormhole, + wormholeChainIds: settings.reporterControllers.WormholeReporterController.wormholeChainIds, + }) + const coordinator = new Coordinator({ - controllers: [ambReporterController, sygmaReporterController, telepathyReporterController].filter( - (_controller) => controllersEnabled?.includes(_controller.name), - ), + controllers: [ + ambReporterController, + sygmaReporterController, + telepathyReporterController, + wormholeReporterController, + ].filter((_controller) => controllersEnabled?.includes(_controller.name)), intervalFetchBlocksMs: settings.Coordinator.intervalFetchBlocksMs, logger, multiclient: multiClient, diff --git a/packages/reporter/src/settings/index.ts b/packages/reporter/src/settings/index.ts index 7c52d8aa..363ca956 100644 --- a/packages/reporter/src/settings/index.ts +++ b/packages/reporter/src/settings/index.ts @@ -1,5 +1,5 @@ import "dotenv/config" -import { gnosis, mainnet, goerli, polygon, optimism, bsc, arbitrum } from "viem/chains" +import { gnosis, mainnet, goerli, polygon, optimism, bsc, arbitrum, avalanche } from "viem/chains" export const settings = { Coordinator: { @@ -23,12 +23,15 @@ export const settings = { [mainnet.name]: { AMBReporter: process.env.MAINNET_AMB_REPORTER as `0x${string}`, AxelarReporter: process.env.MAINNET_HEADER_REPORTER as `0x${string}`, + WormholeHeaderReporter: process.env.MAINNET_WORMHOLE_HEADER_REPORTER as `0x${string}`, + Wormhole: process.env.MAINNET_WORMHOLE_ADDRESS as `0x${string}`, }, [gnosis.name]: { AMBAdapter: process.env.GNOSIS_AMB_ADAPTER as `0x${string}`, SygmaAdapter: process.env.GNOSIS_SYGMA_ADAPTER as `0x${string}`, TelepathyAdapter: process.env.GNOSIS_TELEPATHY_ADAPTER as `0x${string}`, TelepathyLightClient: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, + WormholeAdapter: process.env.GNOSIS_WORMHOLE_ADAPTER as `0x${string}`, }, [goerli.name]: { AMBReporter: "0xedc0b1d3de4496e0d917af42f29cb71eb2982319" as `0x${string}`, @@ -38,22 +41,28 @@ export const settings = { TelepathyAdapter: process.env.POLYGON_TELEPATHY_ADAPTER as `0x${string}`, TelepathyLightClient: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, AxelarAdapter: process.env.POLYGON_AXELAR_ADAPTER as `0x${string}`, + WormholeAdapter: process.env.POLYGON_WORMHOLE_ADAPTER as `0x${string}`, }, [bsc.name]: { TelepathyAdapter: process.env.BSC_TELEPATHY_ADAPTER as `0x${string}`, TelepathyLightClient: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, AxelarAdapter: process.env.BSC_AXELAR_ADAPTER as `0x${string}`, + WormholeAdapter: process.env.BSC_WORMHOLE_ADAPTER as `0x${string}`, }, [optimism.name]: { TelepathyAdapter: process.env.OPTIMISM_TELEPATHY_ADAPTER as `0x${string}`, TelepathyLightClient: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, AxelarAdapter: process.env.OPTIMISM_AXELAR_ADAPTER as `0x${string}`, + WormholeAdapter: process.env.OPTIMISM_WORMHOLE_ADAPTER as `0x${string}`, }, [arbitrum.name]: { TelepathyAdapter: process.env.ARBITRUM_TELEPATHY_ADAPTER as `0x${string}`, TelepathyLightClient: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, AxelarAdapter: process.env.ARBITRUM_AXELAR_ADAPTER as `0x${string}`, }, + [avalanche.name]: { + WormholeAdapter: process.env.AVALANCHE_WORMHOLE_ADAPTER as `0x${string}`, + }, }, reporterControllers: { AMBReporterController: { @@ -69,5 +78,11 @@ export const settings = { TelepathyReporterController: { baseProofUrl: process.env.TELEPATHY_PROOF_API_URL as string, }, + WormholeReporterController: { + wormholeScanBaseUrl: process.env.WORMHOLE_SCAN_BASE_URL as string, + wormholeChainIds: { + [mainnet.name]: 2, + }, + }, }, } diff --git a/packages/reporter/src/utils/sleep.ts b/packages/reporter/src/utils/sleep.ts new file mode 100644 index 00000000..6232eca8 --- /dev/null +++ b/packages/reporter/src/utils/sleep.ts @@ -0,0 +1,8 @@ +const sleep = (_ms: number) => + new Promise((_resolve) => + setTimeout(() => { + _resolve() + }, _ms), + ) + +export default sleep From d08d9c10ef5d5099fa5140c5cc4b0331a20f405c Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Fri, 24 Nov 2023 13:31:17 +0100 Subject: [PATCH 032/297] feat(reporter): adds OptimismReporterController --- packages/reporter/.env.example | 6 ++- ...CrossDomainMessengerHeaderReporterABI.json | 20 ++++++++++ packages/reporter/src/Coordinator.ts | 4 +- .../src/controllers/AMBReporterController.ts | 3 +- .../src/controllers/BaseController.ts | 8 ++-- .../controllers/OptimismReporterController.ts | 37 +++++++++++++++++++ .../controllers/SygmaReporterController.ts | 4 +- .../TelepathyReporterController.ts | 4 +- .../controllers/WormholeReporterController.ts | 9 +++-- packages/reporter/src/index.ts | 14 +++++++ packages/reporter/src/settings/index.ts | 3 ++ 11 files changed, 96 insertions(+), 16 deletions(-) create mode 100644 packages/reporter/src/ABIs/L1CrossDomainMessengerHeaderReporterABI.json create mode 100644 packages/reporter/src/controllers/OptimismReporterController.ts diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index f6317d52..ae91b001 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -1,6 +1,6 @@ PRIVATE_KEY= -REPORTERS_ENABLED=AMBReporterController,SygmaReporterController,TelepathyReporterController,WormholeReporterController +REPORTERS_ENABLED=AMBReporterController,SygmaReporterController,TelepathyReporterController,WormholeReporterController,OptimismReporterController GNOSIS_RPC_URL=https://rpc.ankr.com/gnosis MAINNET_RPC_URL= @@ -44,4 +44,6 @@ BSC_WORMHOLE_ADAPTER=0x11378C54aA4e2Daf4603f9be86ae0Cb70786682a OPTIMISM_WORMHOLE_ADAPTER=0x1fF52708D610b1D17F0830f036e992677CDc508A AVALANCHE_WORMHOLE_ADAPTER=0x6E9ce437c46e7fA4F0888c21AAC0d9099Ad133ea MAINNET_WORMHOLE_HEADER_REPORTER=0xDeF29f44f8315d0079A25EF03cfB0b0D8CdA3cF8 -MAINNET_WORMHOLE_ADDRESS=0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B \ No newline at end of file +MAINNET_WORMHOLE_ADDRESS=0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B +MAINNET_L1_CROSS_DOMAIN_MESSENGER_HEADER_REPORTER_ADDRESS=0xbA5B3f0643582E75AF252e7631dE62c046970167 +OPTIMISM_L2_CROSS_DOMAIN_MESSENGER_ADAPTER_ADDRESS=0xe58E7bF7aCD1396D8F9eAF44DB3D4Fd055DCDb51 \ No newline at end of file diff --git a/packages/reporter/src/ABIs/L1CrossDomainMessengerHeaderReporterABI.json b/packages/reporter/src/ABIs/L1CrossDomainMessengerHeaderReporterABI.json new file mode 100644 index 00000000..f3e794f6 --- /dev/null +++ b/packages/reporter/src/ABIs/L1CrossDomainMessengerHeaderReporterABI.json @@ -0,0 +1,20 @@ +[ + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "blockNumbers", + "type": "uint256[]" + }, + { + "internalType": "address", + "name": "adapter", + "type": "address" + } + ], + "name": "reportHeaders", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } +] diff --git a/packages/reporter/src/Coordinator.ts b/packages/reporter/src/Coordinator.ts index 72dc9d57..65abf2e3 100644 --- a/packages/reporter/src/Coordinator.ts +++ b/packages/reporter/src/Coordinator.ts @@ -83,7 +83,9 @@ class Coordinator { (_, _index) => startBlock + BigInt(_index), ) this.logger.info(`New blocks detected on ${this.sourceChain.name}: [${startBlock},${endBlock}]`) - for (const controller of this.controllers.filter((_controller) => _controller.type === "classic")) { + for (const controller of this.controllers.filter( + (_controller) => _controller.type === "classic" || _controller.type === "native", + )) { const release = await this._mutex.acquire() await controller.onBlocks(blocks) release() diff --git a/packages/reporter/src/controllers/AMBReporterController.ts b/packages/reporter/src/controllers/AMBReporterController.ts index 8a0bf3b2..ef143435 100644 --- a/packages/reporter/src/controllers/AMBReporterController.ts +++ b/packages/reporter/src/controllers/AMBReporterController.ts @@ -1,3 +1,4 @@ +import { Chain } from "viem" import ABI from "../ABIs/AMBReporterContractABI.json" import BaseController from "./BaseController" @@ -20,7 +21,7 @@ class AMBReporterController extends BaseController { try { const client = this.multiClient.getClientByChain(this.sourceChain) - for (const chain of this.destinationChains) { + for (const chain of this.destinationChains as Chain[]) { const blockNumber = _blockNumbers[_blockNumbers.length - 1] this.logger.info( diff --git a/packages/reporter/src/controllers/BaseController.ts b/packages/reporter/src/controllers/BaseController.ts index 1810032c..4aa84866 100644 --- a/packages/reporter/src/controllers/BaseController.ts +++ b/packages/reporter/src/controllers/BaseController.ts @@ -3,13 +3,13 @@ import winston from "winston" import Multiclient from "../MultiClient" -export type ControllerType = "classic" | "lightClient" +export type ControllerType = "classic" | "lightClient" | "native" export type BaseControllerConfigs = { type: ControllerType sourceChain: Chain - destinationChains: Chain[] - reporterAddress?: string + destinationChains?: Chain[] + reporterAddress?: `0x${string}` adapterAddresses: { [chainName: string]: `0x${string}` } logger: winston.Logger multiClient: Multiclient @@ -19,7 +19,7 @@ class BaseController { name: string type: ControllerType sourceChain: Chain - destinationChains: Chain[] + destinationChains?: Chain[] reporterAddress?: `0x${string}` adapterAddresses: { [chainName: string]: `0x${string}` } logger: winston.Logger diff --git a/packages/reporter/src/controllers/OptimismReporterController.ts b/packages/reporter/src/controllers/OptimismReporterController.ts new file mode 100644 index 00000000..64d4cbdb --- /dev/null +++ b/packages/reporter/src/controllers/OptimismReporterController.ts @@ -0,0 +1,37 @@ +import { optimism } from "viem/chains" + +import ABI from "../ABIs/L1CrossDomainMessengerHeaderReporterABI.json" +import BaseController from "./BaseController" + +import { BaseControllerConfigs } from "./BaseController" + +interface OptimismReporterControllerConfigs extends BaseControllerConfigs {} + +class OptimismReporterController extends BaseController { + constructor(_configs: OptimismReporterControllerConfigs) { + super(_configs, "OptimismReporterController") + } + + async onBlocks(_blockNumbers: bigint[]) { + try { + const client = this.multiClient.getClientByChain(this.sourceChain) + const blockNumber = _blockNumbers[_blockNumbers.length - 1] + + this.logger.info(`reporting block header for block ${blockNumber} on ${optimism.name} ...`) + const { request } = await client.simulateContract({ + address: this.reporterAddress as `0x${string}`, + abi: ABI, + functionName: "reportHeaders", + args: [[blockNumber], this.adapterAddresses[optimism.name]], + gas: 300000n, // NOTE: if we don't put the gas here, the tx fails because of out of gas + }) + + const txHash = await client.writeContract(request) + this.logger.info(`headers reporter from ${this.sourceChain.name} to ${optimism.name}: ${txHash}`) + } catch (_error) { + this.logger.error(_error) + } + } +} + +export default OptimismReporterController diff --git a/packages/reporter/src/controllers/SygmaReporterController.ts b/packages/reporter/src/controllers/SygmaReporterController.ts index be1ba6ec..dbfa26db 100644 --- a/packages/reporter/src/controllers/SygmaReporterController.ts +++ b/packages/reporter/src/controllers/SygmaReporterController.ts @@ -1,4 +1,4 @@ -import { parseEther } from "viem" +import { Chain, parseEther } from "viem" import ABI from "../ABIs/SygmaReporterContractABI.json" import BaseController from "./BaseController" @@ -24,7 +24,7 @@ class SygmaReporterController extends BaseController { try { const client = this.multiClient.getClientByChain(this.sourceChain) - for (const chain of this.destinationChains) { + for (const chain of this.destinationChains as Chain[]) { this.logger.info( `reporting block headers of blocks [${_blockNumbers[0]},${_blockNumbers[_blockNumbers.length - 1]}] on ${ chain.name diff --git a/packages/reporter/src/controllers/TelepathyReporterController.ts b/packages/reporter/src/controllers/TelepathyReporterController.ts index ac3612a0..5cde600d 100644 --- a/packages/reporter/src/controllers/TelepathyReporterController.ts +++ b/packages/reporter/src/controllers/TelepathyReporterController.ts @@ -1,5 +1,5 @@ import axios from "axios" -import { hexToNumber } from "viem" +import { Chain, hexToNumber } from "viem" import { Mutex } from "async-mutex" import LightClientContractABI from "../ABIs/TelepathyContractABI.json" @@ -30,7 +30,7 @@ class TelepathyReporterController extends BaseController { async update() { try { let mutex = new Mutex() - for (const chain of this.destinationChains) { + for (const chain of this.destinationChains as Chain[]) { const client = this.multiClient.getClientByChain(chain) const currentBlockNumber = await client.getBlockNumber() diff --git a/packages/reporter/src/controllers/WormholeReporterController.ts b/packages/reporter/src/controllers/WormholeReporterController.ts index ccd3f261..d320b6a4 100644 --- a/packages/reporter/src/controllers/WormholeReporterController.ts +++ b/packages/reporter/src/controllers/WormholeReporterController.ts @@ -1,11 +1,12 @@ import axios, { AxiosInstance } from "axios" -import HeaderReporterABI from "../ABIs/WormhomeHeaderReporterABI.json" -import AdapterABI from "../ABIs/WormholeAdapterABI.json" -import WormholeABI from "../ABIs/WormholeABI.json" import { Mutex } from "async-mutex" +import { Chain } from "viem" import BaseController from "./BaseController" import sleep from "../utils/sleep" +import HeaderReporterABI from "../ABIs/WormhomeHeaderReporterABI.json" +import AdapterABI from "../ABIs/WormholeAdapterABI.json" +import WormholeABI from "../ABIs/WormholeABI.json" import { BaseControllerConfigs } from "./BaseController" @@ -72,7 +73,7 @@ class WormholeReporterController extends BaseController { await sleep(20000) } - for (const chain of this.destinationChains) { + for (const chain of this.destinationChains as Chain[]) { const destinationChainClient = this.multiClient.getClientByChain(chain) this.logger.info(`Storing header on ${chain.name} ...`) diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index e4a3c506..fdc254eb 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -4,6 +4,7 @@ import { Chain } from "viem" import Multiclient from "./MultiClient" import AMBReporterController from "./controllers/AMBReporterController" +import OptimismReporterController from "./controllers/OptimismReporterController" import SygmaReporterController from "./controllers/SygmaReporterController" import TelepathyReporterController from "./controllers/TelepathyReporterController" import WormholeReporterController from "./controllers/WormholeReporterController" @@ -100,12 +101,25 @@ const main = () => { wormholeChainIds: settings.reporterControllers.WormholeReporterController.wormholeChainIds, }) + // TODO: add check to prevent to always run OptimismReporterController even when destinationChains does not include optimism + const optimismReporterController = new OptimismReporterController({ + type: "native", + sourceChain, + logger, + multiClient, + reporterAddress: settings.contractAddresses.Ethereum.L1CrossDomainMessengerHeaderReporter, + adapterAddresses: { + [optimism.name]: settings.contractAddresses["OP Mainnet"].L2CrossDomainMessengerAdapter, + }, + }) + const coordinator = new Coordinator({ controllers: [ ambReporterController, sygmaReporterController, telepathyReporterController, wormholeReporterController, + optimismReporterController, ].filter((_controller) => controllersEnabled?.includes(_controller.name)), intervalFetchBlocksMs: settings.Coordinator.intervalFetchBlocksMs, logger, diff --git a/packages/reporter/src/settings/index.ts b/packages/reporter/src/settings/index.ts index 363ca956..e2c107d6 100644 --- a/packages/reporter/src/settings/index.ts +++ b/packages/reporter/src/settings/index.ts @@ -25,6 +25,8 @@ export const settings = { AxelarReporter: process.env.MAINNET_HEADER_REPORTER as `0x${string}`, WormholeHeaderReporter: process.env.MAINNET_WORMHOLE_HEADER_REPORTER as `0x${string}`, Wormhole: process.env.MAINNET_WORMHOLE_ADDRESS as `0x${string}`, + L1CrossDomainMessengerHeaderReporter: process.env + .MAINNET_L1_CROSS_DOMAIN_MESSENGER_HEADER_REPORTER_ADDRESS as `0x${string}`, }, [gnosis.name]: { AMBAdapter: process.env.GNOSIS_AMB_ADAPTER as `0x${string}`, @@ -54,6 +56,7 @@ export const settings = { TelepathyLightClient: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, AxelarAdapter: process.env.OPTIMISM_AXELAR_ADAPTER as `0x${string}`, WormholeAdapter: process.env.OPTIMISM_WORMHOLE_ADAPTER as `0x${string}`, + L2CrossDomainMessengerAdapter: process.env.OPTIMISM_L2_CROSS_DOMAIN_MESSENGER_ADAPTER_ADDRESS as `0x${string}`, }, [arbitrum.name]: { TelepathyAdapter: process.env.ARBITRUM_TELEPATHY_ADAPTER as `0x${string}`, From ae7a3f6fe7eb54af02be9b8a3e169f8d2e2420c7 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Fri, 24 Nov 2023 16:45:11 +0100 Subject: [PATCH 033/297] feat(reporter): adds AxelarReporterController --- packages/reporter/.env.example | 10 ++--- .../src/ABIs/AxelarHeaderReporter.json | 20 +++++++++ .../controllers/AxelarReporterController.ts | 42 +++++++++++++++++++ .../controllers/SygmaReporterController.ts | 2 + .../controllers/WormholeReporterController.ts | 2 + packages/reporter/src/index.ts | 16 ++++++- packages/reporter/src/settings/index.ts | 7 +--- 7 files changed, 87 insertions(+), 12 deletions(-) create mode 100644 packages/reporter/src/ABIs/AxelarHeaderReporter.json create mode 100644 packages/reporter/src/controllers/AxelarReporterController.ts diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index ae91b001..44068632 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -1,6 +1,6 @@ PRIVATE_KEY= -REPORTERS_ENABLED=AMBReporterController,SygmaReporterController,TelepathyReporterController,WormholeReporterController,OptimismReporterController +REPORTERS_ENABLED=AMBReporterController,SygmaReporterController,TelepathyReporterController,WormholeReporterController,OptimismReporterController,AxelarReporterController GNOSIS_RPC_URL=https://rpc.ankr.com/gnosis MAINNET_RPC_URL= @@ -31,13 +31,9 @@ GNOSIS_TELEPATHY_ADAPTER=0xDeF29f44f8315d0079A25EF03cfB0b0D8CdA3cF8 MAINNET_AMB_REPORTER=0x6be796cb66CdB3566b8AbebA2C516CbDF93fE831 MAINNET_HEADER_REPORTER=0x11378C54aA4e2Daf4603f9be86ae0Cb70786682a POLYGON_TELEPATHY_ADAPTER=0x04413A4795dD1f5347eAD1CD7C76Bd9E5e48b461 -POLYGON_AXELAR_ADAPTER=0x4694E10017Ed7E0E87bfE386e5f051a7C64286A2 BSC_TELEPATHY_ADAPTER=0x2E5685F20f42cC3b01e4A9ADE49F6848E242f022 -BSC_AXELAR_ADAPTER=0x856dcc80f75a9737D9D498266E1Af013668316Fb OPTIMISM_TELEPATHY_ADAPTER=0x856dcc80f75a9737D9D498266E1Af013668316Fb -OPTIMISM_AXELAR_ADAPTER=0x6E9ce437c46e7fA4F0888c21AAC0d9099Ad133ea ARBITRUM_TELEPATHY_ADAPTER=0x2E5685F20f42cC3b01e4A9ADE49F6848E242f022 -ARBITRUM_AXELAR_ADAPTER=0x6E9ce437c46e7fA4F0888c21AAC0d9099Ad133ea GNOSIS_WORMHOLE_ADAPTER=0x8EA3F385be8FCB98eB4dBfad2D00846860Bf648D POLYGON_WORMHOLE_ADAPTER=0xb7806ea66c1bb9FfeB41Dc303601a469ddf3b9C2 BSC_WORMHOLE_ADAPTER=0x11378C54aA4e2Daf4603f9be86ae0Cb70786682a @@ -46,4 +42,6 @@ AVALANCHE_WORMHOLE_ADAPTER=0x6E9ce437c46e7fA4F0888c21AAC0d9099Ad133ea MAINNET_WORMHOLE_HEADER_REPORTER=0xDeF29f44f8315d0079A25EF03cfB0b0D8CdA3cF8 MAINNET_WORMHOLE_ADDRESS=0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B MAINNET_L1_CROSS_DOMAIN_MESSENGER_HEADER_REPORTER_ADDRESS=0xbA5B3f0643582E75AF252e7631dE62c046970167 -OPTIMISM_L2_CROSS_DOMAIN_MESSENGER_ADAPTER_ADDRESS=0xe58E7bF7aCD1396D8F9eAF44DB3D4Fd055DCDb51 \ No newline at end of file +OPTIMISM_L2_CROSS_DOMAIN_MESSENGER_ADAPTER_ADDRESS=0xe58E7bF7aCD1396D8F9eAF44DB3D4Fd055DCDb51 +MAINNET_AXELAR_HEADER_REPORTER_BSC= +BSC_AXELAR_ADAPTER_MAINNET= \ No newline at end of file diff --git a/packages/reporter/src/ABIs/AxelarHeaderReporter.json b/packages/reporter/src/ABIs/AxelarHeaderReporter.json new file mode 100644 index 00000000..f3e794f6 --- /dev/null +++ b/packages/reporter/src/ABIs/AxelarHeaderReporter.json @@ -0,0 +1,20 @@ +[ + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "blockNumbers", + "type": "uint256[]" + }, + { + "internalType": "address", + "name": "adapter", + "type": "address" + } + ], + "name": "reportHeaders", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } +] diff --git a/packages/reporter/src/controllers/AxelarReporterController.ts b/packages/reporter/src/controllers/AxelarReporterController.ts new file mode 100644 index 00000000..d1cab795 --- /dev/null +++ b/packages/reporter/src/controllers/AxelarReporterController.ts @@ -0,0 +1,42 @@ +import { Chain, formatEther } from "viem" +import ABI from "../ABIs/AxelarHeaderReporter.json" + +import BaseController from "./BaseController" + +import { BaseControllerConfigs } from "./BaseController" + +interface AxelaReporterControllerConfigs extends BaseControllerConfigs {} + +class AxelarReporterController extends BaseController { + constructor(_configs: AxelaReporterControllerConfigs) { + super(_configs, "AxelarReporterController") + } + + async onBlocks(_blockNumbers: bigint[]) { + try { + const client = this.multiClient.getClientByChain(this.sourceChain) + + for (const chain of this.destinationChains as Chain[]) { + if (!this.adapterAddresses[chain.name]) continue + + const blockNumber = _blockNumbers[_blockNumbers.length - 1] + + this.logger.info(`reporting block header for block ${blockNumber} on ${chain.name} ...`) + const { request } = await client.simulateContract({ + address: this.reporterAddress as `0x${string}`, + abi: ABI, + functionName: "reportHeaders", + args: [[blockNumber], this.adapterAddresses[chain.name]], + value: BigInt(0.0001 * 10 ** 18), + }) + + const txHash = await client.writeContract(request) + this.logger.info(`headers reporter from ${this.sourceChain.name} to ${chain.name}: ${txHash}`) + } + } catch (_error) { + this.logger.error(_error) + } + } +} + +export default AxelarReporterController diff --git a/packages/reporter/src/controllers/SygmaReporterController.ts b/packages/reporter/src/controllers/SygmaReporterController.ts index dbfa26db..0156fce2 100644 --- a/packages/reporter/src/controllers/SygmaReporterController.ts +++ b/packages/reporter/src/controllers/SygmaReporterController.ts @@ -25,6 +25,8 @@ class SygmaReporterController extends BaseController { const client = this.multiClient.getClientByChain(this.sourceChain) for (const chain of this.destinationChains as Chain[]) { + if (!this.adapterAddresses[chain.name]) continue + this.logger.info( `reporting block headers of blocks [${_blockNumbers[0]},${_blockNumbers[_blockNumbers.length - 1]}] on ${ chain.name diff --git a/packages/reporter/src/controllers/WormholeReporterController.ts b/packages/reporter/src/controllers/WormholeReporterController.ts index d320b6a4..5f378a55 100644 --- a/packages/reporter/src/controllers/WormholeReporterController.ts +++ b/packages/reporter/src/controllers/WormholeReporterController.ts @@ -74,6 +74,8 @@ class WormholeReporterController extends BaseController { } for (const chain of this.destinationChains as Chain[]) { + if (!this.adapterAddresses[chain.name]) continue + const destinationChainClient = this.multiClient.getClientByChain(chain) this.logger.info(`Storing header on ${chain.name} ...`) diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index fdc254eb..f78a0734 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -4,6 +4,7 @@ import { Chain } from "viem" import Multiclient from "./MultiClient" import AMBReporterController from "./controllers/AMBReporterController" +import AxelarReporterController from "./controllers/AxelarReporterController" import OptimismReporterController from "./controllers/OptimismReporterController" import SygmaReporterController from "./controllers/SygmaReporterController" import TelepathyReporterController from "./controllers/TelepathyReporterController" @@ -37,7 +38,7 @@ const main = () => { const ambReporterController = new AMBReporterController({ type: "classic", sourceChain, - destinationChains, + destinationChains: destinationChains.filter(({ name }) => name === gnosis.name), logger, multiClient, reporterAddress: settings.contractAddresses.Goerli.AMBReporter, @@ -113,6 +114,18 @@ const main = () => { }, }) + const axelarReporterControllerMainnetBsc = new AxelarReporterController({ + type: "classic", + sourceChain, + destinationChains, + logger, + multiClient, + reporterAddress: settings.contractAddresses.Ethereum.AxelarReporterBsc, + adapterAddresses: { + [bsc.name]: settings.contractAddresses["BNB Smart Chain"].AxelarAdapterMainnet, + }, + }) + const coordinator = new Coordinator({ controllers: [ ambReporterController, @@ -120,6 +133,7 @@ const main = () => { telepathyReporterController, wormholeReporterController, optimismReporterController, + axelarReporterControllerMainnetBsc, ].filter((_controller) => controllersEnabled?.includes(_controller.name)), intervalFetchBlocksMs: settings.Coordinator.intervalFetchBlocksMs, logger, diff --git a/packages/reporter/src/settings/index.ts b/packages/reporter/src/settings/index.ts index e2c107d6..433a8679 100644 --- a/packages/reporter/src/settings/index.ts +++ b/packages/reporter/src/settings/index.ts @@ -22,7 +22,7 @@ export const settings = { contractAddresses: { [mainnet.name]: { AMBReporter: process.env.MAINNET_AMB_REPORTER as `0x${string}`, - AxelarReporter: process.env.MAINNET_HEADER_REPORTER as `0x${string}`, + AxelarReporterBsc: process.env.MAINNET_AXELAR_HEADER_REPORTER_BSC as `0x${string}`, WormholeHeaderReporter: process.env.MAINNET_WORMHOLE_HEADER_REPORTER as `0x${string}`, Wormhole: process.env.MAINNET_WORMHOLE_ADDRESS as `0x${string}`, L1CrossDomainMessengerHeaderReporter: process.env @@ -42,26 +42,23 @@ export const settings = { [polygon.name]: { TelepathyAdapter: process.env.POLYGON_TELEPATHY_ADAPTER as `0x${string}`, TelepathyLightClient: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, - AxelarAdapter: process.env.POLYGON_AXELAR_ADAPTER as `0x${string}`, WormholeAdapter: process.env.POLYGON_WORMHOLE_ADAPTER as `0x${string}`, }, [bsc.name]: { TelepathyAdapter: process.env.BSC_TELEPATHY_ADAPTER as `0x${string}`, TelepathyLightClient: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, - AxelarAdapter: process.env.BSC_AXELAR_ADAPTER as `0x${string}`, + AxelarAdapterMainnet: process.env.BSC_AXELAR_ADAPTER_MAINNET as `0x${string}`, WormholeAdapter: process.env.BSC_WORMHOLE_ADAPTER as `0x${string}`, }, [optimism.name]: { TelepathyAdapter: process.env.OPTIMISM_TELEPATHY_ADAPTER as `0x${string}`, TelepathyLightClient: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, - AxelarAdapter: process.env.OPTIMISM_AXELAR_ADAPTER as `0x${string}`, WormholeAdapter: process.env.OPTIMISM_WORMHOLE_ADAPTER as `0x${string}`, L2CrossDomainMessengerAdapter: process.env.OPTIMISM_L2_CROSS_DOMAIN_MESSENGER_ADAPTER_ADDRESS as `0x${string}`, }, [arbitrum.name]: { TelepathyAdapter: process.env.ARBITRUM_TELEPATHY_ADAPTER as `0x${string}`, TelepathyLightClient: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, - AxelarAdapter: process.env.ARBITRUM_AXELAR_ADAPTER as `0x${string}`, }, [avalanche.name]: { WormholeAdapter: process.env.AVALANCHE_WORMHOLE_ADAPTER as `0x${string}`, From 3e27cfdc5b2f980e607030f520cf9e196fbce57f Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 27 Nov 2023 08:15:56 +0100 Subject: [PATCH 034/297] refactor(reporter): adds reporterAddresses within BaseController --- packages/reporter/.env.example | 4 +- ...rter.json => AxelarHeaderReporterABI.json} | 0 .../controllers/AxelarReporterController.ts | 8 +- .../src/controllers/BaseController.ts | 5 +- packages/reporter/src/index.ts | 63 ++++++----- packages/reporter/src/settings/index.ts | 100 ++++++++++++------ 6 files changed, 115 insertions(+), 65 deletions(-) rename packages/reporter/src/ABIs/{AxelarHeaderReporter.json => AxelarHeaderReporterABI.json} (100%) diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index 44068632..c2a2721f 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -43,5 +43,5 @@ MAINNET_WORMHOLE_HEADER_REPORTER=0xDeF29f44f8315d0079A25EF03cfB0b0D8CdA3cF8 MAINNET_WORMHOLE_ADDRESS=0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B MAINNET_L1_CROSS_DOMAIN_MESSENGER_HEADER_REPORTER_ADDRESS=0xbA5B3f0643582E75AF252e7631dE62c046970167 OPTIMISM_L2_CROSS_DOMAIN_MESSENGER_ADAPTER_ADDRESS=0xe58E7bF7aCD1396D8F9eAF44DB3D4Fd055DCDb51 -MAINNET_AXELAR_HEADER_REPORTER_BSC= -BSC_AXELAR_ADAPTER_MAINNET= \ No newline at end of file +MAINNET_AXELAR_HEADER_REPORTER_BSC=0xBfd877753F8B4f4117a08aD54DcBE69cF3165d81 +BSC_AXELAR_ADAPTER_MAINNET=0xb7806ea66c1bb9FfeB41Dc303601a469ddf3b9C2 \ No newline at end of file diff --git a/packages/reporter/src/ABIs/AxelarHeaderReporter.json b/packages/reporter/src/ABIs/AxelarHeaderReporterABI.json similarity index 100% rename from packages/reporter/src/ABIs/AxelarHeaderReporter.json rename to packages/reporter/src/ABIs/AxelarHeaderReporterABI.json diff --git a/packages/reporter/src/controllers/AxelarReporterController.ts b/packages/reporter/src/controllers/AxelarReporterController.ts index d1cab795..b5a577be 100644 --- a/packages/reporter/src/controllers/AxelarReporterController.ts +++ b/packages/reporter/src/controllers/AxelarReporterController.ts @@ -1,14 +1,14 @@ import { Chain, formatEther } from "viem" -import ABI from "../ABIs/AxelarHeaderReporter.json" +import ABI from "../ABIs/AxelarHeaderReporterABI.json" import BaseController from "./BaseController" import { BaseControllerConfigs } from "./BaseController" -interface AxelaReporterControllerConfigs extends BaseControllerConfigs {} +interface AxelarReporterControllerConfigs extends BaseControllerConfigs {} class AxelarReporterController extends BaseController { - constructor(_configs: AxelaReporterControllerConfigs) { + constructor(_configs: AxelarReporterControllerConfigs) { super(_configs, "AxelarReporterController") } @@ -23,7 +23,7 @@ class AxelarReporterController extends BaseController { this.logger.info(`reporting block header for block ${blockNumber} on ${chain.name} ...`) const { request } = await client.simulateContract({ - address: this.reporterAddress as `0x${string}`, + address: this.reporterAddresses[chain.name], abi: ABI, functionName: "reportHeaders", args: [[blockNumber], this.adapterAddresses[chain.name]], diff --git a/packages/reporter/src/controllers/BaseController.ts b/packages/reporter/src/controllers/BaseController.ts index 4aa84866..60465898 100644 --- a/packages/reporter/src/controllers/BaseController.ts +++ b/packages/reporter/src/controllers/BaseController.ts @@ -10,6 +10,7 @@ export type BaseControllerConfigs = { sourceChain: Chain destinationChains?: Chain[] reporterAddress?: `0x${string}` + reporterAddresses?: { [chainName: string]: `0x${string}` } adapterAddresses: { [chainName: string]: `0x${string}` } logger: winston.Logger multiClient: Multiclient @@ -21,6 +22,7 @@ class BaseController { sourceChain: Chain destinationChains?: Chain[] reporterAddress?: `0x${string}` + reporterAddresses: { [chainName: string]: `0x${string}` } adapterAddresses: { [chainName: string]: `0x${string}` } logger: winston.Logger multiClient: Multiclient @@ -28,7 +30,8 @@ class BaseController { constructor(configs: BaseControllerConfigs, name: string) { this.sourceChain = configs.sourceChain this.destinationChains = configs.destinationChains - this.reporterAddress = configs.reporterAddress as `0x${string}` + this.reporterAddress = configs.reporterAddress + this.reporterAddresses = configs.reporterAddresses || {} this.adapterAddresses = configs.adapterAddresses this.multiClient = configs.multiClient this.type = configs.type diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index f78a0734..0bf8e1ab 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -6,7 +6,7 @@ import Multiclient from "./MultiClient" import AMBReporterController from "./controllers/AMBReporterController" import AxelarReporterController from "./controllers/AxelarReporterController" import OptimismReporterController from "./controllers/OptimismReporterController" -import SygmaReporterController from "./controllers/SygmaReporterController" +// import SygmaReporterController from "./controllers/SygmaReporterController" import TelepathyReporterController from "./controllers/TelepathyReporterController" import WormholeReporterController from "./controllers/WormholeReporterController" import Coordinator from "./Coordinator" @@ -21,6 +21,9 @@ const main = () => { const sourceChain = Object.values(chains).find((_chain) => _chain.id === sourceChainId) as Chain const destinationChains = Object.values(chains).filter((_chain) => destinationChainIds?.includes(_chain.id)) + const unidirectionalAdaptersAddresses = settings.contractAddresses.adapterAddresses.unidirectional as any + const unidirectionalReportersAddresses = settings.contractAddresses.reporterAddresses.unidirectional as any + const multiClient = new Multiclient({ chains: [sourceChain, ...destinationChains], privateKey: process.env.PRIVATE_KEY as `0x${string}`, @@ -41,14 +44,14 @@ const main = () => { destinationChains: destinationChains.filter(({ name }) => name === gnosis.name), logger, multiClient, - reporterAddress: settings.contractAddresses.Goerli.AMBReporter, + reporterAddress: unidirectionalReportersAddresses[sourceChain.name].Gnosis.AMBReporter, adapterAddresses: { - [gnosis.name]: settings.contractAddresses.Gnosis.AMBAdapter, + [gnosis.name]: unidirectionalAdaptersAddresses[sourceChain.name].Gnosis.AMBAdapter, }, reportHeadersGas: settings.reporterControllers.AMBReporterController.reportHeadersGas, }) - const sygmaReporterController = new SygmaReporterController({ + /*const sygmaReporterController = new SygmaReporterController({ type: "classic", sourceChain, destinationChains, @@ -58,7 +61,7 @@ const main = () => { adapterAddresses: { [gnosis.name]: settings.contractAddresses.Gnosis.SygmaAdapter }, reportHeadersToDomainMsgValue: settings.reporterControllers.SygmaReporterController.reportHeadersToDomainMsgValue, domainIds: settings.reporterControllers.SygmaReporterController.domainIds, - }) + })*/ const telepathyReporterController = new TelepathyReporterController({ type: "lightClient", @@ -67,19 +70,19 @@ const main = () => { logger, multiClient, adapterAddresses: { - [gnosis.name]: settings.contractAddresses.Gnosis.TelepathyAdapter, - [arbitrum.name]: settings.contractAddresses["Arbitrum One"].TelepathyAdapter, - [optimism.name]: settings.contractAddresses["OP Mainnet"].TelepathyAdapter, - [bsc.name]: settings.contractAddresses["BNB Smart Chain"].TelepathyAdapter, - [polygon.name]: settings.contractAddresses.Polygon.TelepathyAdapter, + [gnosis.name]: unidirectionalAdaptersAddresses[sourceChain.name].Gnosis.TelepathyAdapter, + [arbitrum.name]: unidirectionalAdaptersAddresses[sourceChain.name]["Arbitrum One"].TelepathyAdapter, + [optimism.name]: unidirectionalAdaptersAddresses[sourceChain.name]["OP Mainnet"].TelepathyAdapter, + [bsc.name]: unidirectionalAdaptersAddresses[sourceChain.name]["BNB Smart Chain"].TelepathyAdapter, + [polygon.name]: unidirectionalAdaptersAddresses[sourceChain.name].Polygon.TelepathyAdapter, }, baseProofUrl: settings.reporterControllers.TelepathyReporterController.baseProofUrl, lightClientAddresses: { - [gnosis.name]: settings.contractAddresses.Gnosis.TelepathyLightClient, - [arbitrum.name]: settings.contractAddresses["Arbitrum One"].TelepathyLightClient, - [optimism.name]: settings.contractAddresses["OP Mainnet"].TelepathyLightClient, - [bsc.name]: settings.contractAddresses["BNB Smart Chain"].TelepathyLightClient, - [polygon.name]: settings.contractAddresses.Polygon.TelepathyLightClient, + [gnosis.name]: settings.contractAddresses.Gnosis.TelepathyLightClientMainnet, + [arbitrum.name]: settings.contractAddresses["Arbitrum One"].TelepathyLightClientMainnet, + [optimism.name]: settings.contractAddresses["OP Mainnet"].TelepathyLightClientMainnet, + [bsc.name]: settings.contractAddresses["BNB Smart Chain"].TelepathyLightClientMainnet, + [polygon.name]: settings.contractAddresses.Polygon.TelepathyLightClientMainnet, }, }) @@ -89,13 +92,13 @@ const main = () => { destinationChains, logger, multiClient, - reporterAddress: settings.contractAddresses.Ethereum.WormholeHeaderReporter, + reporterAddress: (settings.contractAddresses.reporterAddresses as any)[sourceChain.name].WormholeHeaderReporter, adapterAddresses: { - [gnosis.name]: settings.contractAddresses.Gnosis.WormholeAdapter, - [optimism.name]: settings.contractAddresses["OP Mainnet"].WormholeAdapter, - [bsc.name]: settings.contractAddresses["BNB Smart Chain"].WormholeAdapter, - [polygon.name]: settings.contractAddresses.Polygon.WormholeAdapter, - [avalanche.name]: settings.contractAddresses.Avalanche.WormholeAdapter, + [gnosis.name]: (settings.contractAddresses.adapterAddresses as any).Gnosis.WormholeAdapter, + [optimism.name]: (settings.contractAddresses.adapterAddresses as any)["OP Mainnet"].WormholeAdapter, + [bsc.name]: (settings.contractAddresses.adapterAddresses as any)["BNB Smart Chain"].WormholeAdapter, + [polygon.name]: (settings.contractAddresses.adapterAddresses as any).Polygon.WormholeAdapter, + [avalanche.name]: (settings.contractAddresses.adapterAddresses as any).Avalanche.WormholeAdapter, }, wormholeScanBaseUrl: settings.reporterControllers.WormholeReporterController.wormholeScanBaseUrl, wormholeAddress: (settings.contractAddresses as any)[sourceChain.name].Wormhole, @@ -108,32 +111,36 @@ const main = () => { sourceChain, logger, multiClient, - reporterAddress: settings.contractAddresses.Ethereum.L1CrossDomainMessengerHeaderReporter, + reporterAddress: + settings.contractAddresses.reporterAddresses.unidirectional.Ethereum["OP Mainnet"].L1CrossDomainMessengerHeaderReporter, adapterAddresses: { - [optimism.name]: settings.contractAddresses["OP Mainnet"].L2CrossDomainMessengerAdapter, + [optimism.name]: + settings.contractAddresses.adapterAddresses.unidirectional.Ethereum["OP Mainnet"].L2CrossDomainMessengerAdapter, }, }) - const axelarReporterControllerMainnetBsc = new AxelarReporterController({ + const axelarReporterController = new AxelarReporterController({ type: "classic", sourceChain, destinationChains, logger, multiClient, - reporterAddress: settings.contractAddresses.Ethereum.AxelarReporterBsc, + reporterAddresses: { + [bsc.name]: unidirectionalReportersAddresses[sourceChain.name][bsc.name].AxelarReporter, + }, adapterAddresses: { - [bsc.name]: settings.contractAddresses["BNB Smart Chain"].AxelarAdapterMainnet, + [bsc.name]: unidirectionalAdaptersAddresses[sourceChain.name][bsc.name].AxelarAdapter, }, }) const coordinator = new Coordinator({ controllers: [ ambReporterController, - sygmaReporterController, + // sygmaReporterController, telepathyReporterController, wormholeReporterController, optimismReporterController, - axelarReporterControllerMainnetBsc, + axelarReporterController, ].filter((_controller) => controllersEnabled?.includes(_controller.name)), intervalFetchBlocksMs: settings.Coordinator.intervalFetchBlocksMs, logger, diff --git a/packages/reporter/src/settings/index.ts b/packages/reporter/src/settings/index.ts index 433a8679..5f71a0d1 100644 --- a/packages/reporter/src/settings/index.ts +++ b/packages/reporter/src/settings/index.ts @@ -20,48 +20,88 @@ export const settings = { [arbitrum.name]: process.env.ARBITRUM_RPC_URL as string, }, contractAddresses: { + adapterAddresses: { + unidirectional: { + [mainnet.name]: { + [bsc.name]: { + AxelarAdapter: process.env.BSC_AXELAR_ADAPTER_MAINNET as `0x${string}`, + TelepathyAdapter: process.env.BSC_TELEPATHY_ADAPTER as `0x${string}`, + }, + [gnosis.name]: { + TelepathyAdapter: process.env.GNOSIS_TELEPATHY_ADAPTER as `0x${string}`, + AMBAdapter: process.env.GNOSIS_AMB_ADAPTER as `0x${string}`, + // SygmaAdapter: process.env.GNOSIS_SYGMA_ADAPTER as `0x${string}`, + }, + [polygon.name]: { + TelepathyAdapter: process.env.POLYGON_TELEPATHY_ADAPTER as `0x${string}`, + }, + [optimism.name]: { + TelepathyAdapter: process.env.OPTIMISM_TELEPATHY_ADAPTER as `0x${string}`, + L2CrossDomainMessengerAdapter: process.env + .OPTIMISM_L2_CROSS_DOMAIN_MESSENGER_ADAPTER_ADDRESS as `0x${string}`, + }, + [arbitrum.name]: { + TelepathyAdapter: process.env.ARBITRUM_TELEPATHY_ADAPTER as `0x${string}`, + }, + /*[goerli.name]: { + AMBReporter: "0xedc0b1d3de4496e0d917af42f29cb71eb2982319" as `0x${string}`, + SygmaReporter: "0x2f96d347c932ac73b56e9352ecc0707e25173d88" as `0x${string}`, + },*/ + }, + }, + [gnosis.name]: { + WormholeAdapter: process.env.GNOSIS_WORMHOLE_ADAPTER as `0x${string}`, + }, + [polygon.name]: { + WormholeAdapter: process.env.POLYGON_WORMHOLE_ADAPTER as `0x${string}`, + }, + [bsc.name]: { + WormholeAdapter: process.env.BSC_WORMHOLE_ADAPTER as `0x${string}`, + }, + [optimism.name]: { + WormholeAdapter: process.env.OPTIMISM_WORMHOLE_ADAPTER as `0x${string}`, + }, + [avalanche.name]: { + WormholeAdapter: process.env.AVALANCHE_WORMHOLE_ADAPTER as `0x${string}`, + }, + }, + reporterAddresses: { + unidirectional: { + [mainnet.name]: { + [bsc.name]: { + AxelarReporter: process.env.MAINNET_AXELAR_HEADER_REPORTER_BSC as `0x${string}`, + }, + [gnosis.name]: { + AMBReporter: process.env.MAINNET_AMB_REPORTER as `0x${string}`, + }, + [optimism.name]: { + L1CrossDomainMessengerHeaderReporter: process.env + .MAINNET_L1_CROSS_DOMAIN_MESSENGER_HEADER_REPORTER_ADDRESS as `0x${string}`, + }, + }, + }, + + [mainnet.name]: { + WormholeHeaderReporter: process.env.MAINNET_WORMHOLE_HEADER_REPORTER as `0x${string}`, + } + }, [mainnet.name]: { - AMBReporter: process.env.MAINNET_AMB_REPORTER as `0x${string}`, - AxelarReporterBsc: process.env.MAINNET_AXELAR_HEADER_REPORTER_BSC as `0x${string}`, - WormholeHeaderReporter: process.env.MAINNET_WORMHOLE_HEADER_REPORTER as `0x${string}`, Wormhole: process.env.MAINNET_WORMHOLE_ADDRESS as `0x${string}`, - L1CrossDomainMessengerHeaderReporter: process.env - .MAINNET_L1_CROSS_DOMAIN_MESSENGER_HEADER_REPORTER_ADDRESS as `0x${string}`, }, [gnosis.name]: { - AMBAdapter: process.env.GNOSIS_AMB_ADAPTER as `0x${string}`, - SygmaAdapter: process.env.GNOSIS_SYGMA_ADAPTER as `0x${string}`, - TelepathyAdapter: process.env.GNOSIS_TELEPATHY_ADAPTER as `0x${string}`, - TelepathyLightClient: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, - WormholeAdapter: process.env.GNOSIS_WORMHOLE_ADAPTER as `0x${string}`, - }, - [goerli.name]: { - AMBReporter: "0xedc0b1d3de4496e0d917af42f29cb71eb2982319" as `0x${string}`, - SygmaReporter: "0x2f96d347c932ac73b56e9352ecc0707e25173d88" as `0x${string}`, + TelepathyLightClientMainnet: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, }, [polygon.name]: { - TelepathyAdapter: process.env.POLYGON_TELEPATHY_ADAPTER as `0x${string}`, - TelepathyLightClient: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, - WormholeAdapter: process.env.POLYGON_WORMHOLE_ADAPTER as `0x${string}`, + TelepathyLightClientMainnet: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, }, [bsc.name]: { - TelepathyAdapter: process.env.BSC_TELEPATHY_ADAPTER as `0x${string}`, - TelepathyLightClient: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, - AxelarAdapterMainnet: process.env.BSC_AXELAR_ADAPTER_MAINNET as `0x${string}`, - WormholeAdapter: process.env.BSC_WORMHOLE_ADAPTER as `0x${string}`, + TelepathyLightClientMainnet: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, }, [optimism.name]: { - TelepathyAdapter: process.env.OPTIMISM_TELEPATHY_ADAPTER as `0x${string}`, - TelepathyLightClient: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, - WormholeAdapter: process.env.OPTIMISM_WORMHOLE_ADAPTER as `0x${string}`, - L2CrossDomainMessengerAdapter: process.env.OPTIMISM_L2_CROSS_DOMAIN_MESSENGER_ADAPTER_ADDRESS as `0x${string}`, + TelepathyLightClientMainnet: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, }, [arbitrum.name]: { - TelepathyAdapter: process.env.ARBITRUM_TELEPATHY_ADAPTER as `0x${string}`, - TelepathyLightClient: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, - }, - [avalanche.name]: { - WormholeAdapter: process.env.AVALANCHE_WORMHOLE_ADAPTER as `0x${string}`, + TelepathyLightClientMainnet: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, }, }, reporterControllers: { From e4a95a3dbfb4d1cb9c93af3f79e7fdffb3f960ec Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 27 Nov 2023 13:12:41 +0100 Subject: [PATCH 035/297] feat(reporter): adds ConnextReporterController --- .../src/ABIs/ConnextHeaderReporterABI.json | 20 +++++++++ .../controllers/ConnextReporterController.ts | 41 +++++++++++++++++++ packages/reporter/src/index.ts | 16 ++++++++ packages/reporter/src/settings/index.ts | 2 + 4 files changed, 79 insertions(+) create mode 100644 packages/reporter/src/ABIs/ConnextHeaderReporterABI.json create mode 100644 packages/reporter/src/controllers/ConnextReporterController.ts diff --git a/packages/reporter/src/ABIs/ConnextHeaderReporterABI.json b/packages/reporter/src/ABIs/ConnextHeaderReporterABI.json new file mode 100644 index 00000000..f3e794f6 --- /dev/null +++ b/packages/reporter/src/ABIs/ConnextHeaderReporterABI.json @@ -0,0 +1,20 @@ +[ + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "blockNumbers", + "type": "uint256[]" + }, + { + "internalType": "address", + "name": "adapter", + "type": "address" + } + ], + "name": "reportHeaders", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } +] diff --git a/packages/reporter/src/controllers/ConnextReporterController.ts b/packages/reporter/src/controllers/ConnextReporterController.ts new file mode 100644 index 00000000..3804f89f --- /dev/null +++ b/packages/reporter/src/controllers/ConnextReporterController.ts @@ -0,0 +1,41 @@ +import { Chain, formatEther } from "viem" +import ABI from "../ABIs/ConnextHeaderReporterABI.json" + +import BaseController from "./BaseController" + +import { BaseControllerConfigs } from "./BaseController" + +interface ConnextReporterControllerConfigs extends BaseControllerConfigs {} + +class ConnextReporterController extends BaseController { + constructor(_configs: ConnextReporterControllerConfigs) { + super(_configs, "ConnextReporterController") + } + + async onBlocks(_blockNumbers: bigint[]) { + try { + const client = this.multiClient.getClientByChain(this.sourceChain) + + for (const chain of this.destinationChains as Chain[]) { + if (!this.adapterAddresses[chain.name]) continue + + const blockNumber = _blockNumbers[_blockNumbers.length - 1] + + this.logger.info(`reporting block header for block ${blockNumber} on ${chain.name} ...`) + const { request } = await client.simulateContract({ + address: this.reporterAddresses[chain.name], + abi: ABI, + functionName: "reportHeaders", + args: [[blockNumber], this.adapterAddresses[chain.name]], + }) + + const txHash = await client.writeContract(request) + this.logger.info(`headers reporter from ${this.sourceChain.name} to ${chain.name}: ${txHash}`) + } + } catch (_error) { + this.logger.error(_error) + } + } +} + +export default ConnextReporterController diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 0bf8e1ab..67670f3f 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -5,6 +5,7 @@ import { Chain } from "viem" import Multiclient from "./MultiClient" import AMBReporterController from "./controllers/AMBReporterController" import AxelarReporterController from "./controllers/AxelarReporterController" +import ConnextReporterController from "./controllers/ConnextReporterController" import OptimismReporterController from "./controllers/OptimismReporterController" // import SygmaReporterController from "./controllers/SygmaReporterController" import TelepathyReporterController from "./controllers/TelepathyReporterController" @@ -133,6 +134,20 @@ const main = () => { }, }) + const connextReporterController = new ConnextReporterController({ + type: "classic", + sourceChain, + destinationChains, + logger, + multiClient, + reporterAddresses: { + [gnosis.name]: unidirectionalReportersAddresses[sourceChain.name][gnosis.name].ConnextReporter + }, + adapterAddresses: { + [gnosis.name]: unidirectionalAdaptersAddresses[sourceChain.name][gnosis.name].ConnextAdapter + }, + }) + const coordinator = new Coordinator({ controllers: [ ambReporterController, @@ -141,6 +156,7 @@ const main = () => { wormholeReporterController, optimismReporterController, axelarReporterController, + connextReporterController ].filter((_controller) => controllersEnabled?.includes(_controller.name)), intervalFetchBlocksMs: settings.Coordinator.intervalFetchBlocksMs, logger, diff --git a/packages/reporter/src/settings/index.ts b/packages/reporter/src/settings/index.ts index 5f71a0d1..758a619b 100644 --- a/packages/reporter/src/settings/index.ts +++ b/packages/reporter/src/settings/index.ts @@ -30,6 +30,7 @@ export const settings = { [gnosis.name]: { TelepathyAdapter: process.env.GNOSIS_TELEPATHY_ADAPTER as `0x${string}`, AMBAdapter: process.env.GNOSIS_AMB_ADAPTER as `0x${string}`, + ConnextAdapter: process.env.GNOSIS_CONNEXT_ADAPTER_MAINNET as `0x${string}`, // SygmaAdapter: process.env.GNOSIS_SYGMA_ADAPTER as `0x${string}`, }, [polygon.name]: { @@ -73,6 +74,7 @@ export const settings = { }, [gnosis.name]: { AMBReporter: process.env.MAINNET_AMB_REPORTER as `0x${string}`, + ConnextReporter: process.env.MAINNET_REPORTER_GNOSIS as `0x${string}`, }, [optimism.name]: { L1CrossDomainMessengerHeaderReporter: process.env From 94cd1c48680253a11f7c454e0ec946710e28c149 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 27 Nov 2023 18:31:26 +0100 Subject: [PATCH 036/297] feat(reporter): adds StandardReporterController and adds support to celer --- packages/reporter/.env.example | 8 +++- .../src/ABIs/ConnextHeaderReporterABI.json | 20 --------- ....json => StandardReporterContractABI.json} | 0 .../controllers/ConnextReporterController.ts | 41 ------------------- ...oller.ts => StandardReporterController.ts} | 21 ++++++---- .../controllers/SygmaReporterController.ts | 8 ++-- packages/reporter/src/index.ts | 40 +++++++++++++----- packages/reporter/src/settings/index.ts | 20 +++++++-- 8 files changed, 70 insertions(+), 88 deletions(-) delete mode 100644 packages/reporter/src/ABIs/ConnextHeaderReporterABI.json rename packages/reporter/src/ABIs/{AxelarHeaderReporterABI.json => StandardReporterContractABI.json} (100%) delete mode 100644 packages/reporter/src/controllers/ConnextReporterController.ts rename packages/reporter/src/controllers/{AxelarReporterController.ts => StandardReporterController.ts} (66%) diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index c2a2721f..a16a2c43 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -10,7 +10,9 @@ OPTIMISM_RPC_URL=https://optimism.llamarpc.com ARBITRUM_RPC_URL=https://arbitrum.llamarpc.com AMB_REPORTER_HEADERS_GAS=300000 +AXELAR_REPORT_HEADERS_VALUE=0.0001 SYGMA_REPORT_HEADERS_TO_DOMAIN_MSG_VALUE=0.0001 +CELER_REPORT_HEADERS_VALUE=0.0001 TELEPATHY_PROOF_API_URL= TELEPATHY_BLOCK_BUFFER=10 @@ -43,5 +45,7 @@ MAINNET_WORMHOLE_HEADER_REPORTER=0xDeF29f44f8315d0079A25EF03cfB0b0D8CdA3cF8 MAINNET_WORMHOLE_ADDRESS=0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B MAINNET_L1_CROSS_DOMAIN_MESSENGER_HEADER_REPORTER_ADDRESS=0xbA5B3f0643582E75AF252e7631dE62c046970167 OPTIMISM_L2_CROSS_DOMAIN_MESSENGER_ADAPTER_ADDRESS=0xe58E7bF7aCD1396D8F9eAF44DB3D4Fd055DCDb51 -MAINNET_AXELAR_HEADER_REPORTER_BSC=0xBfd877753F8B4f4117a08aD54DcBE69cF3165d81 -BSC_AXELAR_ADAPTER_MAINNET=0xb7806ea66c1bb9FfeB41Dc303601a469ddf3b9C2 \ No newline at end of file +MAINNET_AXELAR_REPORTER_BSC=0xBfd877753F8B4f4117a08aD54DcBE69cF3165d81 +BSC_AXELAR_ADAPTER_MAINNET=0xb7806ea66c1bb9FfeB41Dc303601a469ddf3b9C2 +POLYGON_CELER_ADAPTER_MAINNET= +MAINNET_CELER_REPORTER_POLYGON= \ No newline at end of file diff --git a/packages/reporter/src/ABIs/ConnextHeaderReporterABI.json b/packages/reporter/src/ABIs/ConnextHeaderReporterABI.json deleted file mode 100644 index f3e794f6..00000000 --- a/packages/reporter/src/ABIs/ConnextHeaderReporterABI.json +++ /dev/null @@ -1,20 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "uint256[]", - "name": "blockNumbers", - "type": "uint256[]" - }, - { - "internalType": "address", - "name": "adapter", - "type": "address" - } - ], - "name": "reportHeaders", - "outputs": [], - "stateMutability": "payable", - "type": "function" - } -] diff --git a/packages/reporter/src/ABIs/AxelarHeaderReporterABI.json b/packages/reporter/src/ABIs/StandardReporterContractABI.json similarity index 100% rename from packages/reporter/src/ABIs/AxelarHeaderReporterABI.json rename to packages/reporter/src/ABIs/StandardReporterContractABI.json diff --git a/packages/reporter/src/controllers/ConnextReporterController.ts b/packages/reporter/src/controllers/ConnextReporterController.ts deleted file mode 100644 index 3804f89f..00000000 --- a/packages/reporter/src/controllers/ConnextReporterController.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Chain, formatEther } from "viem" -import ABI from "../ABIs/ConnextHeaderReporterABI.json" - -import BaseController from "./BaseController" - -import { BaseControllerConfigs } from "./BaseController" - -interface ConnextReporterControllerConfigs extends BaseControllerConfigs {} - -class ConnextReporterController extends BaseController { - constructor(_configs: ConnextReporterControllerConfigs) { - super(_configs, "ConnextReporterController") - } - - async onBlocks(_blockNumbers: bigint[]) { - try { - const client = this.multiClient.getClientByChain(this.sourceChain) - - for (const chain of this.destinationChains as Chain[]) { - if (!this.adapterAddresses[chain.name]) continue - - const blockNumber = _blockNumbers[_blockNumbers.length - 1] - - this.logger.info(`reporting block header for block ${blockNumber} on ${chain.name} ...`) - const { request } = await client.simulateContract({ - address: this.reporterAddresses[chain.name], - abi: ABI, - functionName: "reportHeaders", - args: [[blockNumber], this.adapterAddresses[chain.name]], - }) - - const txHash = await client.writeContract(request) - this.logger.info(`headers reporter from ${this.sourceChain.name} to ${chain.name}: ${txHash}`) - } - } catch (_error) { - this.logger.error(_error) - } - } -} - -export default ConnextReporterController diff --git a/packages/reporter/src/controllers/AxelarReporterController.ts b/packages/reporter/src/controllers/StandardReporterController.ts similarity index 66% rename from packages/reporter/src/controllers/AxelarReporterController.ts rename to packages/reporter/src/controllers/StandardReporterController.ts index b5a577be..648a2e8f 100644 --- a/packages/reporter/src/controllers/AxelarReporterController.ts +++ b/packages/reporter/src/controllers/StandardReporterController.ts @@ -1,15 +1,22 @@ import { Chain, formatEther } from "viem" -import ABI from "../ABIs/AxelarHeaderReporterABI.json" +import ABI from "../ABIs/StandardReporterContractABI.json" import BaseController from "./BaseController" import { BaseControllerConfigs } from "./BaseController" -interface AxelarReporterControllerConfigs extends BaseControllerConfigs {} +interface StandardReporterControllerConfigs extends BaseControllerConfigs { + name: string + reportHeadersValue?: bigint +} + +class StandardReporterController extends BaseController { + private _reportHeadersValue: bigint + + constructor(_configs: StandardReporterControllerConfigs) { + super(_configs, _configs.name) -class AxelarReporterController extends BaseController { - constructor(_configs: AxelarReporterControllerConfigs) { - super(_configs, "AxelarReporterController") + this._reportHeadersValue = _configs.reportHeadersValue || BigInt(0) } async onBlocks(_blockNumbers: bigint[]) { @@ -27,7 +34,7 @@ class AxelarReporterController extends BaseController { abi: ABI, functionName: "reportHeaders", args: [[blockNumber], this.adapterAddresses[chain.name]], - value: BigInt(0.0001 * 10 ** 18), + value: this._reportHeadersValue, }) const txHash = await client.writeContract(request) @@ -39,4 +46,4 @@ class AxelarReporterController extends BaseController { } } -export default AxelarReporterController +export default StandardReporterController diff --git a/packages/reporter/src/controllers/SygmaReporterController.ts b/packages/reporter/src/controllers/SygmaReporterController.ts index 0156fce2..a84e8bf8 100644 --- a/packages/reporter/src/controllers/SygmaReporterController.ts +++ b/packages/reporter/src/controllers/SygmaReporterController.ts @@ -6,18 +6,18 @@ import BaseController from "./BaseController" import { BaseControllerConfigs } from "./BaseController" interface SygmaReporterControllerConfigs extends BaseControllerConfigs { - reportHeadersToDomainMsgValue: string + reportHeadersToDomainValue: bigint domainIds: { [chainName: string]: number } } class SygmaReporterController extends BaseController { private _domainIds: { [chainName: string]: number } - private _reportHeadersToDomainMsgValue: string + private _reportHeadersToDomainValue: bigint constructor(_configs: SygmaReporterControllerConfigs) { super(_configs, "SygmaReporterController") this._domainIds = _configs.domainIds - this._reportHeadersToDomainMsgValue = _configs.reportHeadersToDomainMsgValue + this._reportHeadersToDomainValue = _configs.reportHeadersToDomainValue } async onBlocks(_blockNumbers: bigint[]) { @@ -43,7 +43,7 @@ class SygmaReporterController extends BaseController { this._domainIds[chain.name as keyof typeof this._domainIds], "0x", ], - value: parseEther(this._reportHeadersToDomainMsgValue), + value: this._reportHeadersToDomainValue, }) const txHash = await client.writeContract(request) this.logger.info(`headers reporter from ${this.sourceChain.name} to ${chain.name}: ${txHash}`) diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 67670f3f..19889817 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -4,10 +4,9 @@ import { Chain } from "viem" import Multiclient from "./MultiClient" import AMBReporterController from "./controllers/AMBReporterController" -import AxelarReporterController from "./controllers/AxelarReporterController" -import ConnextReporterController from "./controllers/ConnextReporterController" import OptimismReporterController from "./controllers/OptimismReporterController" // import SygmaReporterController from "./controllers/SygmaReporterController" +import StandardReporterController from "./controllers/StandardReporterController" import TelepathyReporterController from "./controllers/TelepathyReporterController" import WormholeReporterController from "./controllers/WormholeReporterController" import Coordinator from "./Coordinator" @@ -60,7 +59,7 @@ const main = () => { multiClient, reporterAddress: settings.contractAddresses.Goerli.SygmaReporter, adapterAddresses: { [gnosis.name]: settings.contractAddresses.Gnosis.SygmaAdapter }, - reportHeadersToDomainMsgValue: settings.reporterControllers.SygmaReporterController.reportHeadersToDomainMsgValue, + reportHeadersToDomainValue: settings.reporterControllers.SygmaReporterController.reportHeadersToDomainValue, domainIds: settings.reporterControllers.SygmaReporterController.domainIds, })*/ @@ -113,14 +112,16 @@ const main = () => { logger, multiClient, reporterAddress: - settings.contractAddresses.reporterAddresses.unidirectional.Ethereum["OP Mainnet"].L1CrossDomainMessengerHeaderReporter, + settings.contractAddresses.reporterAddresses.unidirectional.Ethereum["OP Mainnet"] + .L1CrossDomainMessengerHeaderReporter, adapterAddresses: { [optimism.name]: settings.contractAddresses.adapterAddresses.unidirectional.Ethereum["OP Mainnet"].L2CrossDomainMessengerAdapter, }, }) - const axelarReporterController = new AxelarReporterController({ + const axelarReporterController = new StandardReporterController({ + name: "AxelarReporterController", type: "classic", sourceChain, destinationChains, @@ -132,31 +133,50 @@ const main = () => { adapterAddresses: { [bsc.name]: unidirectionalAdaptersAddresses[sourceChain.name][bsc.name].AxelarAdapter, }, + reportHeadersValue: settings.reporterControllers.AxelarReporterController.reportHeadersValue, }) - const connextReporterController = new ConnextReporterController({ + const connextReporterController = new StandardReporterController({ + name: "ConnextReporterController", type: "classic", sourceChain, destinationChains, logger, multiClient, reporterAddresses: { - [gnosis.name]: unidirectionalReportersAddresses[sourceChain.name][gnosis.name].ConnextReporter + [gnosis.name]: unidirectionalReportersAddresses[sourceChain.name][gnosis.name].ConnextReporter, }, adapterAddresses: { - [gnosis.name]: unidirectionalAdaptersAddresses[sourceChain.name][gnosis.name].ConnextAdapter + [gnosis.name]: unidirectionalAdaptersAddresses[sourceChain.name][gnosis.name].ConnextAdapter, }, }) + const celerReporterController = new StandardReporterController({ + name: "CelerReporterController", + type: "classic", + sourceChain, + destinationChains, + logger, + multiClient, + reporterAddresses: { + [polygon.name]: unidirectionalReportersAddresses[sourceChain.name][polygon.name].CelerReporter, + }, + adapterAddresses: { + [polygon.name]: unidirectionalAdaptersAddresses[sourceChain.name][polygon.name].CelerAdapter, + }, + reportHeadersValue: settings.reporterControllers.AxelarReporterController.reportHeadersValue, + }) + const coordinator = new Coordinator({ controllers: [ ambReporterController, - // sygmaReporterController, + // sygmaReporterController, telepathyReporterController, wormholeReporterController, optimismReporterController, axelarReporterController, - connextReporterController + connextReporterController, + celerReporterController, ].filter((_controller) => controllersEnabled?.includes(_controller.name)), intervalFetchBlocksMs: settings.Coordinator.intervalFetchBlocksMs, logger, diff --git a/packages/reporter/src/settings/index.ts b/packages/reporter/src/settings/index.ts index 758a619b..7d780185 100644 --- a/packages/reporter/src/settings/index.ts +++ b/packages/reporter/src/settings/index.ts @@ -1,4 +1,5 @@ import "dotenv/config" +import { parseEther } from "viem" import { gnosis, mainnet, goerli, polygon, optimism, bsc, arbitrum, avalanche } from "viem/chains" export const settings = { @@ -44,6 +45,9 @@ export const settings = { [arbitrum.name]: { TelepathyAdapter: process.env.ARBITRUM_TELEPATHY_ADAPTER as `0x${string}`, }, + [polygon.name]: { + CelerAdapter: process.env.POLYGON_CELER_ADAPTER_MAINNET as `0x${string}`, + }, /*[goerli.name]: { AMBReporter: "0xedc0b1d3de4496e0d917af42f29cb71eb2982319" as `0x${string}`, SygmaReporter: "0x2f96d347c932ac73b56e9352ecc0707e25173d88" as `0x${string}`, @@ -70,7 +74,7 @@ export const settings = { unidirectional: { [mainnet.name]: { [bsc.name]: { - AxelarReporter: process.env.MAINNET_AXELAR_HEADER_REPORTER_BSC as `0x${string}`, + AxelarReporter: process.env.MAINNET_AXELAR_REPORTER_BSC as `0x${string}`, }, [gnosis.name]: { AMBReporter: process.env.MAINNET_AMB_REPORTER as `0x${string}`, @@ -80,12 +84,14 @@ export const settings = { L1CrossDomainMessengerHeaderReporter: process.env .MAINNET_L1_CROSS_DOMAIN_MESSENGER_HEADER_REPORTER_ADDRESS as `0x${string}`, }, + [polygon.name]: { + CelerAdapter: process.env.MAINNET_CELER_REPORTER_POLYGON as `0x${string}`, + }, }, }, - [mainnet.name]: { WormholeHeaderReporter: process.env.MAINNET_WORMHOLE_HEADER_REPORTER as `0x${string}`, - } + }, }, [mainnet.name]: { Wormhole: process.env.MAINNET_WORMHOLE_ADDRESS as `0x${string}`, @@ -107,11 +113,17 @@ export const settings = { }, }, reporterControllers: { + AxelarReporterController: { + reportHeadersValue: parseEther(process.env.AXELAR_REPORT_HEADERS_VALUE as string), + }, AMBReporterController: { reportHeadersGas: Number(process.env.AMB_REPORTER_HEADERS_GAS), }, + CelerReporterController: { + reportHeadersValue: parseEther(process.env.CELER_REPORT_HEADERS_VALUE as string), + }, SygmaReporterController: { - reportHeadersToDomainMsgValue: process.env.SYGMA_REPORT_HEADERS_TO_DOMAIN_MSG_VALUE as string, + reportHeadersToDomainValue: parseEther(process.env.SYGMA_REPORT_HEADERS_TO_DOMAIN_MSG_VALUE as string), domainIds: { [gnosis.name]: 101, [mainnet.name]: 1, From ec2db7081d5e0a3fef9f914a27008521cb94d987 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 27 Nov 2023 18:56:03 +0100 Subject: [PATCH 037/297] fix(reporter): fixes wrong param --- packages/reporter/src/index.ts | 2 +- packages/reporter/src/settings/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 19889817..14dd177c 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -164,7 +164,7 @@ const main = () => { adapterAddresses: { [polygon.name]: unidirectionalAdaptersAddresses[sourceChain.name][polygon.name].CelerAdapter, }, - reportHeadersValue: settings.reporterControllers.AxelarReporterController.reportHeadersValue, + reportHeadersValue: settings.reporterControllers.CelerReporterController.reportHeadersValue, }) const coordinator = new Coordinator({ diff --git a/packages/reporter/src/settings/index.ts b/packages/reporter/src/settings/index.ts index 7d780185..d9712d50 100644 --- a/packages/reporter/src/settings/index.ts +++ b/packages/reporter/src/settings/index.ts @@ -85,7 +85,7 @@ export const settings = { .MAINNET_L1_CROSS_DOMAIN_MESSENGER_HEADER_REPORTER_ADDRESS as `0x${string}`, }, [polygon.name]: { - CelerAdapter: process.env.MAINNET_CELER_REPORTER_POLYGON as `0x${string}`, + CelerReporter: process.env.MAINNET_CELER_REPORTER_POLYGON as `0x${string}`, }, }, }, From 7fc61c0b41e840cfe4811977d9fb742f09a040b2 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 28 Nov 2023 13:00:17 +0100 Subject: [PATCH 038/297] feat(reporter): adds support for ccip, hyperlane and l0 --- packages/reporter/.env.example | 15 +++- packages/reporter/src/index.ts | 104 +++++++++++++++++------- packages/reporter/src/settings/index.ts | 45 +++++++++- 3 files changed, 130 insertions(+), 34 deletions(-) diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index a16a2c43..ed93fd2a 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -1,6 +1,6 @@ PRIVATE_KEY= -REPORTERS_ENABLED=AMBReporterController,SygmaReporterController,TelepathyReporterController,WormholeReporterController,OptimismReporterController,AxelarReporterController +REPORTERS_ENABLED=AMBReporterController,SygmaReporterController,TelepathyReporterController,WormholeReporterController,OptimismReporterController,AxelarReporterController,LayerZeroReporterController GNOSIS_RPC_URL=https://rpc.ankr.com/gnosis MAINNET_RPC_URL= @@ -8,11 +8,14 @@ GOERLI_RPC_URL= POLYGON_RPC_URL= OPTIMISM_RPC_URL=https://optimism.llamarpc.com ARBITRUM_RPC_URL=https://arbitrum.llamarpc.com +SEPOLIA_RPC_URL= AMB_REPORTER_HEADERS_GAS=300000 AXELAR_REPORT_HEADERS_VALUE=0.0001 SYGMA_REPORT_HEADERS_TO_DOMAIN_MSG_VALUE=0.0001 CELER_REPORT_HEADERS_VALUE=0.0001 +LAYER_ZERO_REPORT_HEADERS_VALUE=0.0007 +CCIP_REPORT_HEADERS_VALUE=0.0002 TELEPATHY_PROOF_API_URL= TELEPATHY_BLOCK_BUFFER=10 @@ -47,5 +50,11 @@ MAINNET_L1_CROSS_DOMAIN_MESSENGER_HEADER_REPORTER_ADDRESS=0xbA5B3f0643582E75AF25 OPTIMISM_L2_CROSS_DOMAIN_MESSENGER_ADAPTER_ADDRESS=0xe58E7bF7aCD1396D8F9eAF44DB3D4Fd055DCDb51 MAINNET_AXELAR_REPORTER_BSC=0xBfd877753F8B4f4117a08aD54DcBE69cF3165d81 BSC_AXELAR_ADAPTER_MAINNET=0xb7806ea66c1bb9FfeB41Dc303601a469ddf3b9C2 -POLYGON_CELER_ADAPTER_MAINNET= -MAINNET_CELER_REPORTER_POLYGON= \ No newline at end of file +POLYGON_CELER_ADAPTER_MAINNET=0x1fF52708D610b1D17F0830f036e992677CDc508A +MAINNET_CELER_REPORTER_POLYGON=0x52258b83051B7031483740aC9EcAa07926392ea0 +AVALANCHE_LAYER_ZERO_ADAPTER_MAINNET=0x11378C54aA4e2Daf4603f9be86ae0Cb70786682a +MAINNET_LAYER_ZERO_REPORTER_AVALANCHE=0x16B43E348e0A19E9196ae79D172aDC52B3Aa3E20 +OPTIMISM_GOERLI_CCIP_ADAPTER_SEPOLIA=0x520185210Aa645220a49afD9C33d28b73494e14d +SEPOLIA_CCIP_REPORTER_OPTIMISM_GOERLI=0xF3D2877866cd8E6771843b96B66aFcE425B2353C +BSC_TESTNET_CCIP_ADAPTER_SEPOLIA=0xB6133Ab655B990E80Af3E948852C8ec2a46651A5 +SEPOLIA_CCIP_REPORTER_BSC_TESTNET=0x855A2814E0DFf8327f1a52aCC9537772B829e226 \ No newline at end of file diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 14dd177c..3a704d3f 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -1,5 +1,5 @@ import * as chains from "viem/chains" -import { avalanche, gnosis, mainnet, goerli, polygon, optimism, bsc, arbitrum } from "viem/chains" +import { arbitrum, avalanche, bsc, bscTestnet, gnosis, optimism, optimismGoerli, polygon } from "viem/chains" import { Chain } from "viem" import Multiclient from "./MultiClient" @@ -27,15 +27,7 @@ const main = () => { const multiClient = new Multiclient({ chains: [sourceChain, ...destinationChains], privateKey: process.env.PRIVATE_KEY as `0x${string}`, - rpcUrls: { - [goerli.name]: settings.rpcUrls.Goerli, - [gnosis.name]: settings.rpcUrls.Gnosis, - [mainnet.name]: settings.rpcUrls.Ethereum, - [arbitrum.name]: settings.rpcUrls["Arbitrum One"], - [optimism.name]: settings.rpcUrls["OP Mainnet"], - [bsc.name]: settings.rpcUrls["BNB Smart Chain"], - [polygon.name]: settings.rpcUrls.Polygon, - }, + rpcUrls: settings.rpcUrls, }) const ambReporterController = new AMBReporterController({ @@ -44,9 +36,9 @@ const main = () => { destinationChains: destinationChains.filter(({ name }) => name === gnosis.name), logger, multiClient, - reporterAddress: unidirectionalReportersAddresses[sourceChain.name].Gnosis.AMBReporter, + reporterAddress: unidirectionalReportersAddresses[sourceChain.name]?.Gnosis?.AMBReporter, adapterAddresses: { - [gnosis.name]: unidirectionalAdaptersAddresses[sourceChain.name].Gnosis.AMBAdapter, + [gnosis.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.Gnosis?.AMBAdapter, }, reportHeadersGas: settings.reporterControllers.AMBReporterController.reportHeadersGas, }) @@ -70,11 +62,11 @@ const main = () => { logger, multiClient, adapterAddresses: { - [gnosis.name]: unidirectionalAdaptersAddresses[sourceChain.name].Gnosis.TelepathyAdapter, - [arbitrum.name]: unidirectionalAdaptersAddresses[sourceChain.name]["Arbitrum One"].TelepathyAdapter, - [optimism.name]: unidirectionalAdaptersAddresses[sourceChain.name]["OP Mainnet"].TelepathyAdapter, - [bsc.name]: unidirectionalAdaptersAddresses[sourceChain.name]["BNB Smart Chain"].TelepathyAdapter, - [polygon.name]: unidirectionalAdaptersAddresses[sourceChain.name].Polygon.TelepathyAdapter, + [gnosis.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.Gnosis?.TelepathyAdapter, + [arbitrum.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.["Arbitrum One"]?.TelepathyAdapter, + [optimism.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.["OP Mainnet"]?.TelepathyAdapter, + [bsc.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.["BNB Smart Chain"]?.TelepathyAdapter, + [polygon.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.Polygon?.TelepathyAdapter, }, baseProofUrl: settings.reporterControllers.TelepathyReporterController.baseProofUrl, lightClientAddresses: { @@ -92,16 +84,16 @@ const main = () => { destinationChains, logger, multiClient, - reporterAddress: (settings.contractAddresses.reporterAddresses as any)[sourceChain.name].WormholeHeaderReporter, + reporterAddress: (settings.contractAddresses.reporterAddresses as any)[sourceChain.name]?.WormholeHeaderReporter, adapterAddresses: { - [gnosis.name]: (settings.contractAddresses.adapterAddresses as any).Gnosis.WormholeAdapter, - [optimism.name]: (settings.contractAddresses.adapterAddresses as any)["OP Mainnet"].WormholeAdapter, - [bsc.name]: (settings.contractAddresses.adapterAddresses as any)["BNB Smart Chain"].WormholeAdapter, - [polygon.name]: (settings.contractAddresses.adapterAddresses as any).Polygon.WormholeAdapter, - [avalanche.name]: (settings.contractAddresses.adapterAddresses as any).Avalanche.WormholeAdapter, + [gnosis.name]: (settings.contractAddresses.adapterAddresses as any)?.Gnosis?.WormholeAdapter, + [optimism.name]: (settings.contractAddresses.adapterAddresses as any)["OP Mainnet"]?.WormholeAdapter, + [bsc.name]: (settings.contractAddresses.adapterAddresses as any)["BNB Smart Chain"]?.WormholeAdapter, + [polygon.name]: (settings.contractAddresses.adapterAddresses as any)?.Polygon.WormholeAdapter, + [avalanche.name]: (settings.contractAddresses.adapterAddresses as any)?.Avalanche.WormholeAdapter, }, wormholeScanBaseUrl: settings.reporterControllers.WormholeReporterController.wormholeScanBaseUrl, - wormholeAddress: (settings.contractAddresses as any)[sourceChain.name].Wormhole, + wormholeAddress: (settings.contractAddresses as any)[sourceChain.name]?.Wormhole, wormholeChainIds: settings.reporterControllers.WormholeReporterController.wormholeChainIds, }) @@ -128,10 +120,10 @@ const main = () => { logger, multiClient, reporterAddresses: { - [bsc.name]: unidirectionalReportersAddresses[sourceChain.name][bsc.name].AxelarReporter, + [bsc.name]: unidirectionalReportersAddresses[sourceChain.name]?.[bsc.name]?.AxelarReporter, }, adapterAddresses: { - [bsc.name]: unidirectionalAdaptersAddresses[sourceChain.name][bsc.name].AxelarAdapter, + [bsc.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[bsc.name]?.AxelarAdapter, }, reportHeadersValue: settings.reporterControllers.AxelarReporterController.reportHeadersValue, }) @@ -144,10 +136,10 @@ const main = () => { logger, multiClient, reporterAddresses: { - [gnosis.name]: unidirectionalReportersAddresses[sourceChain.name][gnosis.name].ConnextReporter, + [gnosis.name]: unidirectionalReportersAddresses[sourceChain.name]?.[gnosis.name]?.ConnextReporter, }, adapterAddresses: { - [gnosis.name]: unidirectionalAdaptersAddresses[sourceChain.name][gnosis.name].ConnextAdapter, + [gnosis.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[gnosis.name]?.ConnextAdapter, }, }) @@ -159,14 +151,63 @@ const main = () => { logger, multiClient, reporterAddresses: { - [polygon.name]: unidirectionalReportersAddresses[sourceChain.name][polygon.name].CelerReporter, + [polygon.name]: unidirectionalReportersAddresses[sourceChain.name]?.[polygon.name]?.CelerReporter, }, adapterAddresses: { - [polygon.name]: unidirectionalAdaptersAddresses[sourceChain.name][polygon.name].CelerAdapter, + [polygon.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[polygon.name]?.CelerAdapter, }, reportHeadersValue: settings.reporterControllers.CelerReporterController.reportHeadersValue, }) + const layerZeroReporterController = new StandardReporterController({ + name: "LayerZeroReporterController", + type: "classic", + sourceChain, + destinationChains, + logger, + multiClient, + reporterAddresses: { + [avalanche.name]: unidirectionalReportersAddresses[sourceChain.name]?.[avalanche.name]?.LayerZeroReporter, + }, + adapterAddresses: { + [avalanche.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[avalanche.name]?.LayerZeroAdapter, + }, + reportHeadersValue: settings.reporterControllers.LayerZeroReporterController.reportHeadersValue, + }) + + const hyperlaneReporterController = new StandardReporterController({ + name: "HyperlaneReporterController", + type: "classic", + sourceChain, + destinationChains, + logger, + multiClient, + reporterAddresses: { + [bsc.name]: unidirectionalReportersAddresses[sourceChain.name]?.[bsc.name]?.HyperlaneReporter, + }, + adapterAddresses: { + [bsc.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[bsc.name]?.HyperlaneAdapter, + }, + }) + + const ccipReporterController = new StandardReporterController({ + name: "CCIPReporterController", + type: "classic", + sourceChain, + destinationChains, + logger, + multiClient, + reporterAddresses: { + [optimismGoerli.name]: unidirectionalReportersAddresses[sourceChain.name]?.[optimismGoerli.name]?.CCIPReporter, + [bscTestnet.name]: unidirectionalReportersAddresses[sourceChain.name]?.[bscTestnet.name]?.CCIPReporter, + }, + adapterAddresses: { + [optimismGoerli.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[optimismGoerli.name]?.CCIPAdapter, + [bscTestnet.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[bscTestnet.name]?.CCIPAdapter, + }, + reportHeadersValue: settings.reporterControllers.CCIPReporterController.reportHeadersValue, + }) + const coordinator = new Coordinator({ controllers: [ ambReporterController, @@ -177,6 +218,9 @@ const main = () => { axelarReporterController, connextReporterController, celerReporterController, + layerZeroReporterController, + hyperlaneReporterController, + ccipReporterController, ].filter((_controller) => controllersEnabled?.includes(_controller.name)), intervalFetchBlocksMs: settings.Coordinator.intervalFetchBlocksMs, logger, diff --git a/packages/reporter/src/settings/index.ts b/packages/reporter/src/settings/index.ts index d9712d50..cc882f9f 100644 --- a/packages/reporter/src/settings/index.ts +++ b/packages/reporter/src/settings/index.ts @@ -1,6 +1,18 @@ import "dotenv/config" import { parseEther } from "viem" -import { gnosis, mainnet, goerli, polygon, optimism, bsc, arbitrum, avalanche } from "viem/chains" +import { + arbitrum, + avalanche, + bsc, + bscTestnet, + gnosis, + goerli, + mainnet, + optimism, + optimismGoerli, + polygon, + sepolia, +} from "viem/chains" export const settings = { Coordinator: { @@ -19,6 +31,7 @@ export const settings = { [optimism.name]: process.env.OPTIMISM_RPC_URL as string, [bsc.name]: process.env.BSC_RPC_URL as string, [arbitrum.name]: process.env.ARBITRUM_RPC_URL as string, + [sepolia.name]: process.env.SEPOLIA_RPC_URL as string, }, contractAddresses: { adapterAddresses: { @@ -27,6 +40,7 @@ export const settings = { [bsc.name]: { AxelarAdapter: process.env.BSC_AXELAR_ADAPTER_MAINNET as `0x${string}`, TelepathyAdapter: process.env.BSC_TELEPATHY_ADAPTER as `0x${string}`, + HyperlaneAdapter: process.env.BSC_HYPERLANE_ADAPTER as `0x${string}`, }, [gnosis.name]: { TelepathyAdapter: process.env.GNOSIS_TELEPATHY_ADAPTER as `0x${string}`, @@ -48,11 +62,22 @@ export const settings = { [polygon.name]: { CelerAdapter: process.env.POLYGON_CELER_ADAPTER_MAINNET as `0x${string}`, }, + [avalanche.name]: { + LayerZeroAdapter: process.env.AVALANCHE_LAYER_ZERO_ADAPTER_MAINNET as `0x${string}`, + }, /*[goerli.name]: { AMBReporter: "0xedc0b1d3de4496e0d917af42f29cb71eb2982319" as `0x${string}`, SygmaReporter: "0x2f96d347c932ac73b56e9352ecc0707e25173d88" as `0x${string}`, },*/ }, + [sepolia.name]: { + [optimismGoerli.name]: { + CCIPAdapter: process.env.OPTIMISM_GOERLI_CCIP_ADAPTER_SEPOLIA as `0x${string}`, + }, + [bscTestnet.name]: { + CCIPAdapter: process.env.BSC_TESTNET_CCIP_ADAPTER_SEPOLIA as `0x${string}`, + }, + }, }, [gnosis.name]: { WormholeAdapter: process.env.GNOSIS_WORMHOLE_ADAPTER as `0x${string}`, @@ -75,6 +100,7 @@ export const settings = { [mainnet.name]: { [bsc.name]: { AxelarReporter: process.env.MAINNET_AXELAR_REPORTER_BSC as `0x${string}`, + HyperlaneReporter: process.env.MAINNET_HYPERLANE_REPORTER_BSC as `0x${string}`, }, [gnosis.name]: { AMBReporter: process.env.MAINNET_AMB_REPORTER as `0x${string}`, @@ -87,6 +113,17 @@ export const settings = { [polygon.name]: { CelerReporter: process.env.MAINNET_CELER_REPORTER_POLYGON as `0x${string}`, }, + [avalanche.name]: { + LayerZeroReporter: process.env.MAINNET_LAYER_ZERO_REPORTER_AVALANCHE as `0x${string}`, + }, + }, + [sepolia.name]: { + [optimismGoerli.name]: { + CCIPReporter: process.env.SEPOLIA_CCIP_REPORTER_OPTIMISM_GOERLI as `0x${string}`, + }, + [bscTestnet.name]: { + CCIPReporter: process.env.SEPOLIA_CCIP_REPORTER_BSC_TESTNET as `0x${string}`, + }, }, }, [mainnet.name]: { @@ -122,6 +159,12 @@ export const settings = { CelerReporterController: { reportHeadersValue: parseEther(process.env.CELER_REPORT_HEADERS_VALUE as string), }, + CCIPReporterController: { + reportHeadersValue: parseEther(process.env.CCIP_REPORT_HEADERS_VALUE as string), + }, + LayerZeroReporterController: { + reportHeadersValue: parseEther(process.env.LAYER_ZERO_REPORT_HEADERS_VALUE as string), + }, SygmaReporterController: { reportHeadersToDomainValue: parseEther(process.env.SYGMA_REPORT_HEADERS_TO_DOMAIN_MSG_VALUE as string), domainIds: { From 25f3abf69ea4aff913a506cf5208c95e4e0c74e2 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 29 Nov 2023 07:34:44 +0100 Subject: [PATCH 039/297] fix(reporter): fixes lastProcessedBlock within TelepathyReporterController --- .../reporter/src/controllers/TelepathyReporterController.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/reporter/src/controllers/TelepathyReporterController.ts b/packages/reporter/src/controllers/TelepathyReporterController.ts index 5cde600d..06cfeb3e 100644 --- a/packages/reporter/src/controllers/TelepathyReporterController.ts +++ b/packages/reporter/src/controllers/TelepathyReporterController.ts @@ -24,7 +24,7 @@ class TelepathyReporterController extends BaseController { this.lightClientAddresses = _configs.lightClientAddresses this._baseProofUrl = _configs.baseProofUrl - this.lastProcessedBlock = 30946038n + this.lastProcessedBlock = 0n } async update() { From c2812c7ae10ce03dd70039f08dc6e18f1c6504a0 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 29 Nov 2023 13:00:37 +0100 Subject: [PATCH 040/297] feat(reporter): adds new l0 and ccip adapters and adds support for zetachain --- packages/reporter/.env.example | 12 ++++++++-- packages/reporter/src/index.ts | 22 +++++++++++++++++ packages/reporter/src/settings/index.ts | 32 ++++++++++++++++++++----- 3 files changed, 58 insertions(+), 8 deletions(-) diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index ed93fd2a..7cb6e65f 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -1,6 +1,6 @@ PRIVATE_KEY= -REPORTERS_ENABLED=AMBReporterController,SygmaReporterController,TelepathyReporterController,WormholeReporterController,OptimismReporterController,AxelarReporterController,LayerZeroReporterController +REPORTERS_ENABLED=AMBReporterController,SygmaReporterController,TelepathyReporterController,WormholeReporterController,OptimismReporterController,AxelarReporterController,ConnextReporterController,CelerReporterController,LayerZeroReporterController,CCIPReporterController,ZetaReporterController GNOSIS_RPC_URL=https://rpc.ankr.com/gnosis MAINNET_RPC_URL= @@ -16,6 +16,8 @@ SYGMA_REPORT_HEADERS_TO_DOMAIN_MSG_VALUE=0.0001 CELER_REPORT_HEADERS_VALUE=0.0001 LAYER_ZERO_REPORT_HEADERS_VALUE=0.0007 CCIP_REPORT_HEADERS_VALUE=0.0002 +CONNEXT_REPORT_HEADERS_VALUE=0.00003 +ZETA_CHAIN_REPORT_HEADERS_VALUE=0.001 TELEPATHY_PROOF_API_URL= TELEPATHY_BLOCK_BUFFER=10 @@ -57,4 +59,10 @@ MAINNET_LAYER_ZERO_REPORTER_AVALANCHE=0x16B43E348e0A19E9196ae79D172aDC52B3Aa3E20 OPTIMISM_GOERLI_CCIP_ADAPTER_SEPOLIA=0x520185210Aa645220a49afD9C33d28b73494e14d SEPOLIA_CCIP_REPORTER_OPTIMISM_GOERLI=0xF3D2877866cd8E6771843b96B66aFcE425B2353C BSC_TESTNET_CCIP_ADAPTER_SEPOLIA=0xB6133Ab655B990E80Af3E948852C8ec2a46651A5 -SEPOLIA_CCIP_REPORTER_BSC_TESTNET=0x855A2814E0DFf8327f1a52aCC9537772B829e226 \ No newline at end of file +SEPOLIA_CCIP_REPORTER_BSC_TESTNET=0x855A2814E0DFf8327f1a52aCC9537772B829e226 +MAINNET_LAYER_ZERO_REPORTER_BSC=0x6E8793E22480e9Bfd6031E2230e68e1822193717 +BSC_LAYER_ZERO_ADAPTER_MAINNET=0xaC3c8D19A64B98d62ED16FFf8a4229E8ED36A469 +GOERLI_ZETA_REPORTER_BSC_TESTNET=0x9a9fc484D3F83B489bc58c2A3EeeA8331F21796B +BSC_TESTNET_ZETA_ADAPTER_GOERLI=0x2829D554678a767c5B091D28A0A294dB7643ec05 +MAINNET_CCIP_REPORTER_AVALANCHE=0xeEFD0D67E4eF9330870961C38a3e25ECE369B141 +AVALANCHE_CCIP_ADAPTER_MAINNET=0x04413A4795dD1f5347eAD1CD7C76Bd9E5e48b461 \ No newline at end of file diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 3a704d3f..129a1764 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -141,6 +141,7 @@ const main = () => { adapterAddresses: { [gnosis.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[gnosis.name]?.ConnextAdapter, }, + reportHeadersValue: settings.reporterControllers.ConnextReporterController.reportHeadersValue, }) const celerReporterController = new StandardReporterController({ @@ -168,9 +169,11 @@ const main = () => { multiClient, reporterAddresses: { [avalanche.name]: unidirectionalReportersAddresses[sourceChain.name]?.[avalanche.name]?.LayerZeroReporter, + [bsc.name]: unidirectionalReportersAddresses[sourceChain.name]?.[bsc.name]?.LayerZeroReporter, }, adapterAddresses: { [avalanche.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[avalanche.name]?.LayerZeroAdapter, + [bsc.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[bsc.name]?.LayerZeroAdapter, }, reportHeadersValue: settings.reporterControllers.LayerZeroReporterController.reportHeadersValue, }) @@ -200,14 +203,32 @@ const main = () => { reporterAddresses: { [optimismGoerli.name]: unidirectionalReportersAddresses[sourceChain.name]?.[optimismGoerli.name]?.CCIPReporter, [bscTestnet.name]: unidirectionalReportersAddresses[sourceChain.name]?.[bscTestnet.name]?.CCIPReporter, + [avalanche.name]: unidirectionalReportersAddresses[sourceChain.name]?.[avalanche.name]?.CCIPReporter, }, adapterAddresses: { [optimismGoerli.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[optimismGoerli.name]?.CCIPAdapter, [bscTestnet.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[bscTestnet.name]?.CCIPAdapter, + [avalanche.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[avalanche.name]?.CCIPAdapter, }, reportHeadersValue: settings.reporterControllers.CCIPReporterController.reportHeadersValue, }) + const zetaReporterController = new StandardReporterController({ + name: "ZetaReporterController", + type: "classic", + sourceChain, + destinationChains, + logger, + multiClient, + reporterAddresses: { + [bscTestnet.name]: unidirectionalReportersAddresses[sourceChain.name]?.[bscTestnet.name]?.ZetaChainReporter, + }, + adapterAddresses: { + [bscTestnet.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[bscTestnet.name]?.ZetaChainAdapter, + }, + reportHeadersValue: settings.reporterControllers.ZetaReporterController.reportHeadersValue, + }) + const coordinator = new Coordinator({ controllers: [ ambReporterController, @@ -221,6 +242,7 @@ const main = () => { layerZeroReporterController, hyperlaneReporterController, ccipReporterController, + zetaReporterController, ].filter((_controller) => controllersEnabled?.includes(_controller.name)), intervalFetchBlocksMs: settings.Coordinator.intervalFetchBlocksMs, logger, diff --git a/packages/reporter/src/settings/index.ts b/packages/reporter/src/settings/index.ts index cc882f9f..bf70a5f3 100644 --- a/packages/reporter/src/settings/index.ts +++ b/packages/reporter/src/settings/index.ts @@ -41,6 +41,7 @@ export const settings = { AxelarAdapter: process.env.BSC_AXELAR_ADAPTER_MAINNET as `0x${string}`, TelepathyAdapter: process.env.BSC_TELEPATHY_ADAPTER as `0x${string}`, HyperlaneAdapter: process.env.BSC_HYPERLANE_ADAPTER as `0x${string}`, + LayerZeroAdapter: process.env.BSC_LAYER_ZERO_ADAPTER_MAINNET as `0x${string}`, }, [gnosis.name]: { TelepathyAdapter: process.env.GNOSIS_TELEPATHY_ADAPTER as `0x${string}`, @@ -64,6 +65,7 @@ export const settings = { }, [avalanche.name]: { LayerZeroAdapter: process.env.AVALANCHE_LAYER_ZERO_ADAPTER_MAINNET as `0x${string}`, + CCIPAdapter: process.env.AVALANCHE_CCIP_ADAPTER_MAINNET as `0x${string}`, }, /*[goerli.name]: { AMBReporter: "0xedc0b1d3de4496e0d917af42f29cb71eb2982319" as `0x${string}`, @@ -78,6 +80,11 @@ export const settings = { CCIPAdapter: process.env.BSC_TESTNET_CCIP_ADAPTER_SEPOLIA as `0x${string}`, }, }, + [goerli.name]: { + [bscTestnet.name]: { + ZetaChainAdapter: process.env.BSC_TESTNET_ZETA_ADAPTER_GOERLI as `0x${string}`, + }, + }, }, [gnosis.name]: { WormholeAdapter: process.env.GNOSIS_WORMHOLE_ADAPTER as `0x${string}`, @@ -101,6 +108,7 @@ export const settings = { [bsc.name]: { AxelarReporter: process.env.MAINNET_AXELAR_REPORTER_BSC as `0x${string}`, HyperlaneReporter: process.env.MAINNET_HYPERLANE_REPORTER_BSC as `0x${string}`, + LayerZeroReporter: process.env.MAINNET_LAYER_ZERO_REPORTER_BSC as `0x${string}`, }, [gnosis.name]: { AMBReporter: process.env.MAINNET_AMB_REPORTER as `0x${string}`, @@ -115,6 +123,7 @@ export const settings = { }, [avalanche.name]: { LayerZeroReporter: process.env.MAINNET_LAYER_ZERO_REPORTER_AVALANCHE as `0x${string}`, + CCIPReporter: process.env.MAINNET_CCIP_REPORTER_AVALANCHE as `0x${string}`, }, }, [sepolia.name]: { @@ -125,6 +134,11 @@ export const settings = { CCIPReporter: process.env.SEPOLIA_CCIP_REPORTER_BSC_TESTNET as `0x${string}`, }, }, + [goerli.name]: { + [bscTestnet.name]: { + ZetaChainReporter: process.env.GOERLI_ZETA_REPORTER_BSC_TESTNET as `0x${string}`, + }, + }, }, [mainnet.name]: { WormholeHeaderReporter: process.env.MAINNET_WORMHOLE_HEADER_REPORTER as `0x${string}`, @@ -150,36 +164,42 @@ export const settings = { }, }, reporterControllers: { + AMBReporterController: { + reportHeadersGas: Number(process.env.AMB_REPORTER_HEADERS_GAS), + }, AxelarReporterController: { reportHeadersValue: parseEther(process.env.AXELAR_REPORT_HEADERS_VALUE as string), }, - AMBReporterController: { - reportHeadersGas: Number(process.env.AMB_REPORTER_HEADERS_GAS), + CCIPReporterController: { + reportHeadersValue: parseEther(process.env.CCIP_REPORT_HEADERS_VALUE as string), }, CelerReporterController: { reportHeadersValue: parseEther(process.env.CELER_REPORT_HEADERS_VALUE as string), }, - CCIPReporterController: { - reportHeadersValue: parseEther(process.env.CCIP_REPORT_HEADERS_VALUE as string), + ConnextReporterController: { + reportHeadersValue: parseEther(process.env.CONNEXT_REPORT_HEADERS_VALUE as string), }, LayerZeroReporterController: { reportHeadersValue: parseEther(process.env.LAYER_ZERO_REPORT_HEADERS_VALUE as string), }, SygmaReporterController: { - reportHeadersToDomainValue: parseEther(process.env.SYGMA_REPORT_HEADERS_TO_DOMAIN_MSG_VALUE as string), domainIds: { [gnosis.name]: 101, [mainnet.name]: 1, }, + reportHeadersToDomainValue: parseEther(process.env.SYGMA_REPORT_HEADERS_TO_DOMAIN_MSG_VALUE as string), }, TelepathyReporterController: { baseProofUrl: process.env.TELEPATHY_PROOF_API_URL as string, }, WormholeReporterController: { - wormholeScanBaseUrl: process.env.WORMHOLE_SCAN_BASE_URL as string, wormholeChainIds: { [mainnet.name]: 2, }, + wormholeScanBaseUrl: process.env.WORMHOLE_SCAN_BASE_URL as string, + }, + ZetaReporterController: { + reportHeadersValue: parseEther(process.env.ZETA_CHAIN_REPORT_HEADERS_VALUE as string), }, }, } From 6eb858640b11dc0e9b5a33d68fa71febde7512ef Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Fri, 1 Dec 2023 12:25:15 +0100 Subject: [PATCH 041/297] feat(reporter): enabled SygmaReporterController --- packages/reporter/.env.example | 5 +++-- .../controllers/StandardReporterController.ts | 3 +-- .../src/controllers/SygmaReporterController.ts | 15 ++++----------- packages/reporter/src/index.ts | 17 ++++++++++------- packages/reporter/src/settings/index.ts | 8 ++++---- 5 files changed, 22 insertions(+), 26 deletions(-) diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index 7cb6e65f..427fbb48 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -12,7 +12,6 @@ SEPOLIA_RPC_URL= AMB_REPORTER_HEADERS_GAS=300000 AXELAR_REPORT_HEADERS_VALUE=0.0001 -SYGMA_REPORT_HEADERS_TO_DOMAIN_MSG_VALUE=0.0001 CELER_REPORT_HEADERS_VALUE=0.0001 LAYER_ZERO_REPORT_HEADERS_VALUE=0.0007 CCIP_REPORT_HEADERS_VALUE=0.0002 @@ -65,4 +64,6 @@ BSC_LAYER_ZERO_ADAPTER_MAINNET=0xaC3c8D19A64B98d62ED16FFf8a4229E8ED36A469 GOERLI_ZETA_REPORTER_BSC_TESTNET=0x9a9fc484D3F83B489bc58c2A3EeeA8331F21796B BSC_TESTNET_ZETA_ADAPTER_GOERLI=0x2829D554678a767c5B091D28A0A294dB7643ec05 MAINNET_CCIP_REPORTER_AVALANCHE=0xeEFD0D67E4eF9330870961C38a3e25ECE369B141 -AVALANCHE_CCIP_ADAPTER_MAINNET=0x04413A4795dD1f5347eAD1CD7C76Bd9E5e48b461 \ No newline at end of file +AVALANCHE_CCIP_ADAPTER_MAINNET=0x04413A4795dD1f5347eAD1CD7C76Bd9E5e48b461 +GNOSIS_SYGMA_ADAPTER=0x483285D0e24401D0C5DB6cF1FAC4f79f412079C0 +MAINNET_SYGMA_REPORTER_GNOSIS=0x973bB99db211755b80c9087fe436fBb81A45AD5E \ No newline at end of file diff --git a/packages/reporter/src/controllers/StandardReporterController.ts b/packages/reporter/src/controllers/StandardReporterController.ts index 648a2e8f..9e6b81a3 100644 --- a/packages/reporter/src/controllers/StandardReporterController.ts +++ b/packages/reporter/src/controllers/StandardReporterController.ts @@ -22,12 +22,11 @@ class StandardReporterController extends BaseController { async onBlocks(_blockNumbers: bigint[]) { try { const client = this.multiClient.getClientByChain(this.sourceChain) + const blockNumber = _blockNumbers[_blockNumbers.length - 1] for (const chain of this.destinationChains as Chain[]) { if (!this.adapterAddresses[chain.name]) continue - const blockNumber = _blockNumbers[_blockNumbers.length - 1] - this.logger.info(`reporting block header for block ${blockNumber} on ${chain.name} ...`) const { request } = await client.simulateContract({ address: this.reporterAddresses[chain.name], diff --git a/packages/reporter/src/controllers/SygmaReporterController.ts b/packages/reporter/src/controllers/SygmaReporterController.ts index a84e8bf8..699acdcc 100644 --- a/packages/reporter/src/controllers/SygmaReporterController.ts +++ b/packages/reporter/src/controllers/SygmaReporterController.ts @@ -6,44 +6,37 @@ import BaseController from "./BaseController" import { BaseControllerConfigs } from "./BaseController" interface SygmaReporterControllerConfigs extends BaseControllerConfigs { - reportHeadersToDomainValue: bigint domainIds: { [chainName: string]: number } } class SygmaReporterController extends BaseController { private _domainIds: { [chainName: string]: number } - private _reportHeadersToDomainValue: bigint constructor(_configs: SygmaReporterControllerConfigs) { super(_configs, "SygmaReporterController") this._domainIds = _configs.domainIds - this._reportHeadersToDomainValue = _configs.reportHeadersToDomainValue } async onBlocks(_blockNumbers: bigint[]) { try { const client = this.multiClient.getClientByChain(this.sourceChain) + const blockNumber = _blockNumbers[_blockNumbers.length - 1] for (const chain of this.destinationChains as Chain[]) { if (!this.adapterAddresses[chain.name]) continue - this.logger.info( - `reporting block headers of blocks [${_blockNumbers[0]},${_blockNumbers[_blockNumbers.length - 1]}] on ${ - chain.name - } ...`, - ) + this.logger.info(`reporting block header for block ${blockNumber} on ${chain.name} ...`) const { request } = await client.simulateContract({ - address: this.reporterAddress as `0x${string}`, + address: this.reporterAddresses[chain.name], abi: ABI, functionName: "reportHeadersToDomain", args: [ - _blockNumbers, + [blockNumber], this.adapterAddresses[chain.name], this._domainIds[chain.name as keyof typeof this._domainIds], "0x", ], - value: this._reportHeadersToDomainValue, }) const txHash = await client.writeContract(request) this.logger.info(`headers reporter from ${this.sourceChain.name} to ${chain.name}: ${txHash}`) diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 129a1764..e57156a1 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -5,7 +5,7 @@ import { Chain } from "viem" import Multiclient from "./MultiClient" import AMBReporterController from "./controllers/AMBReporterController" import OptimismReporterController from "./controllers/OptimismReporterController" -// import SygmaReporterController from "./controllers/SygmaReporterController" +import SygmaReporterController from "./controllers/SygmaReporterController" import StandardReporterController from "./controllers/StandardReporterController" import TelepathyReporterController from "./controllers/TelepathyReporterController" import WormholeReporterController from "./controllers/WormholeReporterController" @@ -43,17 +43,20 @@ const main = () => { reportHeadersGas: settings.reporterControllers.AMBReporterController.reportHeadersGas, }) - /*const sygmaReporterController = new SygmaReporterController({ + const sygmaReporterController = new SygmaReporterController({ type: "classic", sourceChain, destinationChains, logger, multiClient, - reporterAddress: settings.contractAddresses.Goerli.SygmaReporter, - adapterAddresses: { [gnosis.name]: settings.contractAddresses.Gnosis.SygmaAdapter }, - reportHeadersToDomainValue: settings.reporterControllers.SygmaReporterController.reportHeadersToDomainValue, + reporterAddresses: { + [gnosis.name]: unidirectionalReportersAddresses[sourceChain.name]?.[gnosis.name]?.SygmaReporter, + }, + adapterAddresses: { + [gnosis.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.Gnosis?.SygmaAdapter, + }, domainIds: settings.reporterControllers.SygmaReporterController.domainIds, - })*/ + }) const telepathyReporterController = new TelepathyReporterController({ type: "lightClient", @@ -232,7 +235,7 @@ const main = () => { const coordinator = new Coordinator({ controllers: [ ambReporterController, - // sygmaReporterController, + sygmaReporterController, telepathyReporterController, wormholeReporterController, optimismReporterController, diff --git a/packages/reporter/src/settings/index.ts b/packages/reporter/src/settings/index.ts index bf70a5f3..856fd325 100644 --- a/packages/reporter/src/settings/index.ts +++ b/packages/reporter/src/settings/index.ts @@ -47,7 +47,7 @@ export const settings = { TelepathyAdapter: process.env.GNOSIS_TELEPATHY_ADAPTER as `0x${string}`, AMBAdapter: process.env.GNOSIS_AMB_ADAPTER as `0x${string}`, ConnextAdapter: process.env.GNOSIS_CONNEXT_ADAPTER_MAINNET as `0x${string}`, - // SygmaAdapter: process.env.GNOSIS_SYGMA_ADAPTER as `0x${string}`, + SygmaAdapter: process.env.GNOSIS_SYGMA_ADAPTER as `0x${string}`, // this works with many chains }, [polygon.name]: { TelepathyAdapter: process.env.POLYGON_TELEPATHY_ADAPTER as `0x${string}`, @@ -112,7 +112,8 @@ export const settings = { }, [gnosis.name]: { AMBReporter: process.env.MAINNET_AMB_REPORTER as `0x${string}`, - ConnextReporter: process.env.MAINNET_REPORTER_GNOSIS as `0x${string}`, + ConnextReporter: process.env.MAINNET_CONNEXT_REPORTER_GNOSIS as `0x${string}`, + SygmaReporter: process.env.MAINNET_SYGMA_REPORTER_GNOSIS as `0x${string}`, }, [optimism.name]: { L1CrossDomainMessengerHeaderReporter: process.env @@ -184,10 +185,9 @@ export const settings = { }, SygmaReporterController: { domainIds: { - [gnosis.name]: 101, + [gnosis.name]: 6, [mainnet.name]: 1, }, - reportHeadersToDomainValue: parseEther(process.env.SYGMA_REPORT_HEADERS_TO_DOMAIN_MSG_VALUE as string), }, TelepathyReporterController: { baseProofUrl: process.env.TELEPATHY_PROOF_API_URL as string, From e49c49f2234974c75671b41a0184eecf666d95ea Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 7 Dec 2023 19:32:48 +0100 Subject: [PATCH 042/297] feat(reporter): adds ElectronReporterController and changes tsconfig.json --- packages/reporter/.env.example | 10 +- packages/reporter/nodemon.json | 2 +- packages/reporter/package.json | 8 + .../reporter/src/ABIs/ElectronAdapterABI.json | 311 +++++++++++ .../src/ABIs/ElectronLightClientABI.json | 15 + .../reporter/src/ABIs/HeaderStorageABI.json | 56 ++ packages/reporter/src/Coordinator.ts | 4 +- .../src/controllers/AMBReporterController.ts | 6 +- .../src/controllers/BaseController.ts | 2 +- .../controllers/ElectronReporterController.ts | 177 ++++++ .../controllers/OptimismReporterController.ts | 6 +- .../controllers/StandardReporterController.ts | 6 +- .../controllers/SygmaReporterController.ts | 6 +- .../TelepathyReporterController.ts | 8 +- .../controllers/WormholeReporterController.ts | 12 +- packages/reporter/src/index.ts | 71 ++- packages/reporter/src/settings/index.ts | 72 ++- packages/reporter/src/utils/proofs.ts | 152 ++++++ packages/reporter/tsconfig.json | 5 +- packages/reporter/yarn.lock | 415 +++++++++++++- yarn.lock | 505 +++++++++--------- 21 files changed, 1516 insertions(+), 333 deletions(-) create mode 100644 packages/reporter/src/ABIs/ElectronAdapterABI.json create mode 100644 packages/reporter/src/ABIs/ElectronLightClientABI.json create mode 100644 packages/reporter/src/ABIs/HeaderStorageABI.json create mode 100644 packages/reporter/src/controllers/ElectronReporterController.ts create mode 100644 packages/reporter/src/utils/proofs.ts diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index 427fbb48..552241eb 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -9,6 +9,7 @@ POLYGON_RPC_URL= OPTIMISM_RPC_URL=https://optimism.llamarpc.com ARBITRUM_RPC_URL=https://arbitrum.llamarpc.com SEPOLIA_RPC_URL= +GOERLI_BEACON_API_URL= AMB_REPORTER_HEADERS_GAS=300000 AXELAR_REPORT_HEADERS_VALUE=0.0001 @@ -20,7 +21,8 @@ ZETA_CHAIN_REPORT_HEADERS_VALUE=0.001 TELEPATHY_PROOF_API_URL= TELEPATHY_BLOCK_BUFFER=10 -TELEPATHY_INTERVAL_FETCH_HEAD_UPDATES=30000 +TELEPATHY_INTERVAL_UPDATE=30000 +ELECTRON_INTERVAL_UPDATE=30000 WORMHOLE_SCAN_BASE_URL=https://api.wormholescan.io @@ -66,4 +68,8 @@ BSC_TESTNET_ZETA_ADAPTER_GOERLI=0x2829D554678a767c5B091D28A0A294dB7643ec05 MAINNET_CCIP_REPORTER_AVALANCHE=0xeEFD0D67E4eF9330870961C38a3e25ECE369B141 AVALANCHE_CCIP_ADAPTER_MAINNET=0x04413A4795dD1f5347eAD1CD7C76Bd9E5e48b461 GNOSIS_SYGMA_ADAPTER=0x483285D0e24401D0C5DB6cF1FAC4f79f412079C0 -MAINNET_SYGMA_REPORTER_GNOSIS=0x973bB99db211755b80c9087fe436fBb81A45AD5E \ No newline at end of file +MAINNET_SYGMA_REPORTER_GNOSIS=0x973bB99db211755b80c9087fe436fBb81A45AD5E +MAINNET_HEADER_STORAGE=0x22F1fc71A505c0b2bf4D5075801cc5E0ec84B09e +GOERLI_HEADER_STORAGE=0x4cD014AC64AAa899b46BF3a477B68bb67e33eDC4 +CHIADO_ELECTRON_ADAPTER_GOERLI=0x66fBC348aef3797fb885f8073173E5064bf7ABBb +CHIADO_ELECTRON_LIGHT_CLIENT_GOERLI=0xc01707bD835f6108785DF081C943C7C108FC3D89 \ No newline at end of file diff --git a/packages/reporter/nodemon.json b/packages/reporter/nodemon.json index 58b690d4..06dbc7b5 100644 --- a/packages/reporter/nodemon.json +++ b/packages/reporter/nodemon.json @@ -2,5 +2,5 @@ "watch": ["src"], "ext": "ts,json", "ignore": ["src/**/*.spec.ts"], - "exec": "ts-node ./src/index.ts" + "exec": "ts-node --esm ./src/index.ts" } diff --git a/packages/reporter/package.json b/packages/reporter/package.json index cb529b7f..02b1c133 100644 --- a/packages/reporter/package.json +++ b/packages/reporter/package.json @@ -4,6 +4,7 @@ "name": "gnosis", "url": "https://github.com/gnosis" }, + "type": "module", "scripts": { "compile": "tsc", "lint": "eslint --ignore-path ./.eslintignore --ext .js,.ts .", @@ -13,6 +14,13 @@ }, "packageManager": "yarn@3.2.1", "dependencies": { + "@chainsafe/persistent-merkle-tree": "^0.6.1", + "@chainsafe/ssz": "^0.14.0", + "@ethereumjs/rlp": "^5.0.1", + "@ethereumjs/trie": "^6.0.1", + "@ethereumjs/util": "^9.0.1", + "@ethereumjs/vm": "^7.1.0", + "@lodestar/types": "^1.12.0", "async-mutex": "^0.4.0", "axios": "^1.5.1", "dotenv": "^16.3.1", diff --git a/packages/reporter/src/ABIs/ElectronAdapterABI.json b/packages/reporter/src/ABIs/ElectronAdapterABI.json new file mode 100644 index 00000000..f42cd269 --- /dev/null +++ b/packages/reporter/src/ABIs/ElectronAdapterABI.json @@ -0,0 +1,311 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "_lightClientAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_eventSourceAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_chainIdSource", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "reportedBlockHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "storedBlockHash", + "type": "bytes32" + } + ], + "name": "ConflictingBlockHeader", + "type": "error" + }, + { + "inputs": [], + "name": "ErrorParseReceipt", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "length", + "type": "uint256" + } + ], + "name": "InvalidBlockHeaderLength", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidBlockHeaderRLP", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidEventSignature", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidEventSource", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidReceiptsRoot", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "slot", + "type": "uint256" + } + ], + "name": "MissingHeaderOnLC", + "type": "error" + }, + { + "inputs": [], + "name": "UnsupportedTxType", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "hashes", + "type": "bytes32" + } + ], + "name": "HashStored", + "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": [], + "name": "EVENT_SIG_HASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "chainIdSource", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "eventSource", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "domain", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "getHashFromOracle", + "outputs": [ + { + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "hashes", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lightClient", + "outputs": [ + { + "internalType": "contract ILightClient", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "bytes[]", + "name": "blockHeaders", + "type": "bytes[]" + } + ], + "name": "proveAncestralBlockHashes", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "lightclientAddress", + "type": "address" + } + ], + "name": "setLightClientAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_metadata", + "type": "bytes" + } + ], + "name": "storeHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] diff --git a/packages/reporter/src/ABIs/ElectronLightClientABI.json b/packages/reporter/src/ABIs/ElectronLightClientABI.json new file mode 100644 index 00000000..24ee582b --- /dev/null +++ b/packages/reporter/src/ABIs/ElectronLightClientABI.json @@ -0,0 +1,15 @@ +[ + { + "inputs": [], + "name": "head", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/packages/reporter/src/ABIs/HeaderStorageABI.json b/packages/reporter/src/ABIs/HeaderStorageABI.json new file mode 100644 index 00000000..94234d20 --- /dev/null +++ b/packages/reporter/src/ABIs/HeaderStorageABI.json @@ -0,0 +1,56 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "emitter", + "type": "address" + }, + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + } + ], + "name": "HeaderOutOfRange", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "blockHeader", + "type": "bytes32" + } + ], + "name": "HeaderStored", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + } + ], + "name": "storeBlockHeader", + "outputs": [ + { + "internalType": "bytes32", + "name": "blockHeader", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } +] diff --git a/packages/reporter/src/Coordinator.ts b/packages/reporter/src/Coordinator.ts index 65abf2e3..aa97f878 100644 --- a/packages/reporter/src/Coordinator.ts +++ b/packages/reporter/src/Coordinator.ts @@ -2,8 +2,8 @@ import { Chain } from "viem" import winston from "winston" import { Mutex } from "async-mutex" -import Multiclient from "./MultiClient" -import BaseController from "./controllers/BaseController" +import Multiclient from "./MultiClient.js" +import BaseController from "./controllers/BaseController.js" interface BlockListenerConfigs { controllers: any[] diff --git a/packages/reporter/src/controllers/AMBReporterController.ts b/packages/reporter/src/controllers/AMBReporterController.ts index ef143435..7eaf8947 100644 --- a/packages/reporter/src/controllers/AMBReporterController.ts +++ b/packages/reporter/src/controllers/AMBReporterController.ts @@ -1,9 +1,9 @@ import { Chain } from "viem" -import ABI from "../ABIs/AMBReporterContractABI.json" +import ABI from "../ABIs/AMBReporterContractABI.json" assert { type: "json" } -import BaseController from "./BaseController" +import BaseController from "./BaseController.js" -import { BaseControllerConfigs } from "./BaseController" +import { BaseControllerConfigs } from "./BaseController.js" interface AMBReporterControllerConfigs extends BaseControllerConfigs { reportHeadersGas: number diff --git a/packages/reporter/src/controllers/BaseController.ts b/packages/reporter/src/controllers/BaseController.ts index 60465898..0964dddc 100644 --- a/packages/reporter/src/controllers/BaseController.ts +++ b/packages/reporter/src/controllers/BaseController.ts @@ -1,7 +1,7 @@ import { Chain } from "viem" import winston from "winston" -import Multiclient from "../MultiClient" +import Multiclient from "../MultiClient.js" export type ControllerType = "classic" | "lightClient" | "native" diff --git a/packages/reporter/src/controllers/ElectronReporterController.ts b/packages/reporter/src/controllers/ElectronReporterController.ts new file mode 100644 index 00000000..0c06ceef --- /dev/null +++ b/packages/reporter/src/controllers/ElectronReporterController.ts @@ -0,0 +1,177 @@ +import axios from "axios" +import { RLP } from "@ethereumjs/rlp" +import { bytesToHex } from "@ethereumjs/util" +import { Chain, encodeAbiParameters } from "viem" +import { Mutex } from "async-mutex" + +import { getReceiptsRootProof, getReceiptProof } from "../utils/proofs.js" +import HeaderStorageABI from "../ABIs/HeaderStorageABI.json" assert { type: "json" } +import AdapterContractABI from "../ABIs/ElectronAdapterABI.json" assert { type: "json" } +import ElectronLightClientABI from "../ABIs/ElectronLightClientABI.json" assert { type: "json" } +import BaseController from "./BaseController.js" +import { BaseControllerConfigs } from "./BaseController.js" +import sleep from "../utils/sleep.js" + +const EXPECTED_TOPIC = "0xf7df17dce0093aedfcbae24b4f04e823f9e863c97986ab1ba6c5267ace49ddea" //HeaderStored(uint256,bytes32) + +interface TelepathyReporterControllerConfigs extends BaseControllerConfigs { + headerStorageAddress: `0x${string}` + lightClientAddresses: { [chainName: string]: `0x${string}` } + beaconchaBaseUrl: string + beaconApiBaseUrl: string +} + +class ElectronReporterController extends BaseController { + headerStorageAddress: `0x${string}` + lastProcessedBlock: bigint + lightClientAddresses: { [chainName: string]: `0x${string}` } + private _mutex: Mutex + private _beaconchaBaseUrl: string + private _beaconApiBaseUrl: string + + constructor(_configs: TelepathyReporterControllerConfigs) { + super(_configs, "ElectronReporterController") + + this.headerStorageAddress = _configs.headerStorageAddress + this.lightClientAddresses = _configs.lightClientAddresses + this._beaconchaBaseUrl = _configs.beaconchaBaseUrl + this._beaconApiBaseUrl = _configs.beaconApiBaseUrl + this.lastProcessedBlock = 0n + this._mutex = new Mutex() + } + + async update() { + const release = await this._mutex.acquire() + try { + if (!this.headerStorageAddress || this.destinationChains?.length === 0) { + release() + return + } + + const sourceClient = this.multiClient.getClientByChain(this.sourceChain) + const blockNumber = await sourceClient.getBlockNumber() + + this.logger.info(`storing a block header for block ${blockNumber - 1n} on ${this.sourceChain.name} ...`) + const { request } = await sourceClient.simulateContract({ + address: this.headerStorageAddress as `0x${string}`, + abi: HeaderStorageABI, + functionName: "storeBlockHeader", + args: [blockNumber - 1n], + }) + + const hash = await sourceClient.writeContract(request) + this.logger.info( + `header reported from ${this.sourceChain.name} to ${ + this.destinationChains![0].name + }: ${hash} Waiting for the receipt ...`, + ) + const receipt = await sourceClient.waitForTransactionReceipt({ hash }) + + this.logger.info("Calculating receipt proof ...") + const { receiptProof, receiptsRoot } = await getReceiptProof(hash, sourceClient) + + this.logger.info("Getting log index ...") + const logIndex = receipt.logs.findIndex( + ({ address, topics }) => + address.toLowerCase() === this.headerStorageAddress.toLowerCase() && topics[0] === EXPECTED_TOPIC, + ) + + this.logger.info("Getting transaction slot ...") + let transactionSlot + while (true) { + try { + this.logger.info("Waiting for finality ...") + const { + data: { data }, + } = await axios.get(`${this._beaconchaBaseUrl}/api/v1/execution/block/${receipt.blockNumber}`) + const [ + { + posConsensus: { slot, finalized }, + }, + ] = data + if (finalized) { + transactionSlot = slot + break + } + await sleep(10000) + } catch (_err) { + await sleep(10000) + } + } + + const proof = { + lcSlotTxSlotPack: "0x" as `0x${string}`, + logIndex: BigInt(logIndex), + receiptProof: receiptProof.map((_el) => bytesToHex(_el)) as `0x${string}`[], + receiptsRoot, + receiptsRootProof: [] as string[], + txIndexRLP: ("0x" + Buffer.from(RLP.encode(receipt.transactionIndex)).toString("hex")) as `0x${string}`, + } + + for (const chain of this.destinationChains as Chain[]) { + const destinationClient = this.multiClient.getClientByChain(chain) + const lightClientSlot: bigint = (await destinationClient.readContract({ + address: this.lightClientAddresses[chain.name], + abi: ElectronLightClientABI, + functionName: "head", + args: [], + })) as bigint + + // TODO: check that head is greater than transactionSlot + + proof.lcSlotTxSlotPack = encodeAbiParameters( + [{ type: "uint64" }, { type: "uint64" }], + [lightClientSlot, transactionSlot], + ) + + this.logger.info("Calculating receipts root proof ...") + const { receiptsRootProof } = await getReceiptsRootProof( + Number(lightClientSlot), + Number(transactionSlot), + axios.create({ + baseURL: this._beaconApiBaseUrl, + responseType: "json", + headers: { "Content-Type": "application/json" }, + }), + ) + proof.receiptsRootProof = receiptsRootProof + + const encodedProof = encodeAbiParameters( + [ + { type: "bytes" }, + { type: "bytes32[]" }, + { type: "bytes32" }, + { type: "bytes[]" }, + { type: "bytes" }, + { type: "uint256" }, + ], + [ + proof.lcSlotTxSlotPack, + proof.receiptsRootProof as `0x${string}`[], + proof.receiptsRoot, + proof.receiptProof, + proof.txIndexRLP, + proof.logIndex, + ], + ) + + this.logger.info(`Storing block header for ${blockNumber} on contract ${chain.name} ...`) + const { request } = await destinationClient.simulateContract({ + address: this.adapterAddresses[chain.name], + abi: AdapterContractABI, + functionName: "storeHash", + args: [encodedProof], + }) + const txHash = await destinationClient.writeContract(request) + this.logger.info(`tx sent on ${chain.name}: ${txHash}`) + } + this.lastProcessedBlock = blockNumber + } catch (_error) { + this.logger.error(_error) + } finally { + release() + } + } +} + +export default ElectronReporterController diff --git a/packages/reporter/src/controllers/OptimismReporterController.ts b/packages/reporter/src/controllers/OptimismReporterController.ts index 64d4cbdb..8ac1c9e8 100644 --- a/packages/reporter/src/controllers/OptimismReporterController.ts +++ b/packages/reporter/src/controllers/OptimismReporterController.ts @@ -1,9 +1,9 @@ import { optimism } from "viem/chains" -import ABI from "../ABIs/L1CrossDomainMessengerHeaderReporterABI.json" -import BaseController from "./BaseController" +import ABI from "../ABIs/L1CrossDomainMessengerHeaderReporterABI.json" assert { type: "json" } +import BaseController from "./BaseController.js" -import { BaseControllerConfigs } from "./BaseController" +import { BaseControllerConfigs } from "./BaseController.js" interface OptimismReporterControllerConfigs extends BaseControllerConfigs {} diff --git a/packages/reporter/src/controllers/StandardReporterController.ts b/packages/reporter/src/controllers/StandardReporterController.ts index 9e6b81a3..8920beea 100644 --- a/packages/reporter/src/controllers/StandardReporterController.ts +++ b/packages/reporter/src/controllers/StandardReporterController.ts @@ -1,9 +1,9 @@ import { Chain, formatEther } from "viem" -import ABI from "../ABIs/StandardReporterContractABI.json" +import ABI from "../ABIs/StandardReporterContractABI.json" assert { type: "json" } -import BaseController from "./BaseController" +import BaseController from "./BaseController.js" -import { BaseControllerConfigs } from "./BaseController" +import { BaseControllerConfigs } from "./BaseController.js" interface StandardReporterControllerConfigs extends BaseControllerConfigs { name: string diff --git a/packages/reporter/src/controllers/SygmaReporterController.ts b/packages/reporter/src/controllers/SygmaReporterController.ts index 699acdcc..bbd3a4d0 100644 --- a/packages/reporter/src/controllers/SygmaReporterController.ts +++ b/packages/reporter/src/controllers/SygmaReporterController.ts @@ -1,9 +1,9 @@ import { Chain, parseEther } from "viem" -import ABI from "../ABIs/SygmaReporterContractABI.json" -import BaseController from "./BaseController" +import ABI from "../ABIs/SygmaReporterContractABI.json" assert { type: "json" } +import BaseController from "./BaseController.js" -import { BaseControllerConfigs } from "./BaseController" +import { BaseControllerConfigs } from "./BaseController.js" interface SygmaReporterControllerConfigs extends BaseControllerConfigs { domainIds: { [chainName: string]: number } diff --git a/packages/reporter/src/controllers/TelepathyReporterController.ts b/packages/reporter/src/controllers/TelepathyReporterController.ts index 06cfeb3e..c3a09de1 100644 --- a/packages/reporter/src/controllers/TelepathyReporterController.ts +++ b/packages/reporter/src/controllers/TelepathyReporterController.ts @@ -2,11 +2,11 @@ import axios from "axios" import { Chain, hexToNumber } from "viem" import { Mutex } from "async-mutex" -import LightClientContractABI from "../ABIs/TelepathyContractABI.json" -import AdapterContractABI from "../ABIs/TelepathyAdapterABI.json" -import BaseController from "./BaseController" +import LightClientContractABI from "../ABIs/TelepathyContractABI.json" assert { type: "json" } +import AdapterContractABI from "../ABIs/TelepathyAdapterABI.json" assert { type: "json" } +import BaseController from "./BaseController.js" -import { BaseControllerConfigs } from "./BaseController" +import { BaseControllerConfigs } from "./BaseController.js" interface TelepathyReporterControllerConfigs extends BaseControllerConfigs { lightClientAddresses: { [chainName: string]: `0x${string}` } diff --git a/packages/reporter/src/controllers/WormholeReporterController.ts b/packages/reporter/src/controllers/WormholeReporterController.ts index 5f378a55..56584eb4 100644 --- a/packages/reporter/src/controllers/WormholeReporterController.ts +++ b/packages/reporter/src/controllers/WormholeReporterController.ts @@ -2,13 +2,13 @@ import axios, { AxiosInstance } from "axios" import { Mutex } from "async-mutex" import { Chain } from "viem" -import BaseController from "./BaseController" -import sleep from "../utils/sleep" -import HeaderReporterABI from "../ABIs/WormhomeHeaderReporterABI.json" -import AdapterABI from "../ABIs/WormholeAdapterABI.json" -import WormholeABI from "../ABIs/WormholeABI.json" +import BaseController from "./BaseController.js" +import sleep from "../utils/sleep.js" +import HeaderReporterABI from "../ABIs/WormhomeHeaderReporterABI.json" assert { type: "json" } +import AdapterABI from "../ABIs/WormholeAdapterABI.json" assert { type: "json" } +import WormholeABI from "../ABIs/WormholeABI.json" assert { type: "json" } -import { BaseControllerConfigs } from "./BaseController" +import { BaseControllerConfigs } from "./BaseController.js" interface WormholeReporterControllerConfigs extends BaseControllerConfigs { wormholeScanBaseUrl: string diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index e57156a1..774e0ab1 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -1,28 +1,41 @@ -import * as chains from "viem/chains" -import { arbitrum, avalanche, bsc, bscTestnet, gnosis, optimism, optimismGoerli, polygon } from "viem/chains" +import { + arbitrum, + avalanche, + bsc, + bscTestnet, + gnosis, + gnosisChiado, + goerli, + optimism, + optimismGoerli, + polygon, +} from "viem/chains" import { Chain } from "viem" -import Multiclient from "./MultiClient" -import AMBReporterController from "./controllers/AMBReporterController" -import OptimismReporterController from "./controllers/OptimismReporterController" -import SygmaReporterController from "./controllers/SygmaReporterController" -import StandardReporterController from "./controllers/StandardReporterController" -import TelepathyReporterController from "./controllers/TelepathyReporterController" -import WormholeReporterController from "./controllers/WormholeReporterController" -import Coordinator from "./Coordinator" -import { settings } from "./settings/index" -import logger from "./utils/logger" +import Multiclient from "./MultiClient.js" +import AMBReporterController from "./controllers/AMBReporterController.js" +import ElectronReporterController from "./controllers/ElectronReporterController.js" +import OptimismReporterController from "./controllers/OptimismReporterController.js" +import SygmaReporterController from "./controllers/SygmaReporterController.js" +import StandardReporterController from "./controllers/StandardReporterController.js" +import TelepathyReporterController from "./controllers/TelepathyReporterController.js" +import WormholeReporterController from "./controllers/WormholeReporterController.js" +import Coordinator from "./Coordinator.js" +import { settings } from "./settings/index.js" +import logger from "./utils/logger.js" const main = () => { const controllersEnabled = process.env.REPORTERS_ENABLED?.split(",") const sourceChainId = Number(process.env.SOURCE_CHAIN_ID) const destinationChainIds = process.env.DESTINATION_CHAIN_IDS?.split(",").map((_chainId) => Number(_chainId)) - const sourceChain = Object.values(chains).find((_chain) => _chain.id === sourceChainId) as Chain - const destinationChains = Object.values(chains).filter((_chain) => destinationChainIds?.includes(_chain.id)) + const chains = [arbitrum, avalanche, bsc, bscTestnet, gnosis, gnosisChiado, goerli, optimism, optimismGoerli, polygon] + const sourceChain: Chain = Object.values(chains).find((_chain) => _chain.id === sourceChainId) as Chain + const destinationChains: Chain[] = Object.values(chains).filter((_chain) => destinationChainIds?.includes(_chain.id)) const unidirectionalAdaptersAddresses = settings.contractAddresses.adapterAddresses.unidirectional as any const unidirectionalReportersAddresses = settings.contractAddresses.reporterAddresses.unidirectional as any + const lightClientAddresses = settings.contractAddresses.lightClientAddresses as any const multiClient = new Multiclient({ chains: [sourceChain, ...destinationChains], @@ -73,11 +86,11 @@ const main = () => { }, baseProofUrl: settings.reporterControllers.TelepathyReporterController.baseProofUrl, lightClientAddresses: { - [gnosis.name]: settings.contractAddresses.Gnosis.TelepathyLightClientMainnet, - [arbitrum.name]: settings.contractAddresses["Arbitrum One"].TelepathyLightClientMainnet, - [optimism.name]: settings.contractAddresses["OP Mainnet"].TelepathyLightClientMainnet, - [bsc.name]: settings.contractAddresses["BNB Smart Chain"].TelepathyLightClientMainnet, - [polygon.name]: settings.contractAddresses.Polygon.TelepathyLightClientMainnet, + [gnosis.name]: lightClientAddresses.Gnosis?.[sourceChain.name]?.TelepathyLightClient, + [arbitrum.name]: lightClientAddresses["Arbitrum One"]?.[sourceChain.name]?.TelepathyLightClient, + [optimism.name]: lightClientAddresses["OP Mainnet"]?.[sourceChain.name]?.TelepathyLightClient, + [bsc.name]: lightClientAddresses["BNB Smart Chain"]?.[sourceChain.name]?.TelepathyLightClient, + [polygon.name]: lightClientAddresses.Polygon?.[sourceChain.name]?.TelepathyLightClient, }, }) @@ -232,6 +245,25 @@ const main = () => { reportHeadersValue: settings.reporterControllers.ZetaReporterController.reportHeadersValue, }) + const electronReporterController = new ElectronReporterController({ + type: "lightClient", + sourceChain, + destinationChains, + logger, + multiClient, + adapterAddresses: { + [gnosisChiado.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.["Gnosis Chiado"]?.ElectronAdapter, + }, + headerStorageAddress: (settings.contractAddresses as any)[sourceChain.name].HeaderStorage, + lightClientAddresses: { + [gnosisChiado.name]: lightClientAddresses["Gnosis Chiado"]?.[sourceChain.name]?.ElectronLightClient, + }, + beaconchaBaseUrl: (settings.reporterControllers.ElectronReporterController.beaconchaBaseUrls as any)[ + sourceChain.name + ], + beaconApiBaseUrl: (settings.beaconApiUrls as any)[sourceChain.name], + }) + const coordinator = new Coordinator({ controllers: [ ambReporterController, @@ -246,6 +278,7 @@ const main = () => { hyperlaneReporterController, ccipReporterController, zetaReporterController, + electronReporterController, ].filter((_controller) => controllersEnabled?.includes(_controller.name)), intervalFetchBlocksMs: settings.Coordinator.intervalFetchBlocksMs, logger, diff --git a/packages/reporter/src/settings/index.ts b/packages/reporter/src/settings/index.ts index 856fd325..bfa0f700 100644 --- a/packages/reporter/src/settings/index.ts +++ b/packages/reporter/src/settings/index.ts @@ -6,6 +6,7 @@ import { bsc, bscTestnet, gnosis, + gnosisChiado, goerli, mainnet, optimism, @@ -20,7 +21,8 @@ export const settings = { queryBlockLength: Number(process.env.QUERY_BLOCK_LENGTH), intervalFetchBlocksMs: Number(process.env.TIME_FETCH_BLOCKS_MS), intervalsUpdateLightClients: { - TelepathyReporterController: Number(process.env.TELEPATHY_INTERVAL_FETCH_HEAD_UPDATES), + TelepathyReporterController: Number(process.env.TELEPATHY_INTERVAL_UPDATE), + ElectronReporterController: Number(process.env.ELECTRON_INTERVAL_UPDATE), }, }, rpcUrls: { @@ -33,6 +35,9 @@ export const settings = { [arbitrum.name]: process.env.ARBITRUM_RPC_URL as string, [sepolia.name]: process.env.SEPOLIA_RPC_URL as string, }, + beaconApiUrls: { + [goerli.name]: process.env.GOERLI_BEACON_API_URL as string, + }, contractAddresses: { adapterAddresses: { unidirectional: { @@ -51,6 +56,7 @@ export const settings = { }, [polygon.name]: { TelepathyAdapter: process.env.POLYGON_TELEPATHY_ADAPTER as `0x${string}`, + CelerAdapter: process.env.POLYGON_CELER_ADAPTER_MAINNET as `0x${string}`, }, [optimism.name]: { TelepathyAdapter: process.env.OPTIMISM_TELEPATHY_ADAPTER as `0x${string}`, @@ -60,9 +66,6 @@ export const settings = { [arbitrum.name]: { TelepathyAdapter: process.env.ARBITRUM_TELEPATHY_ADAPTER as `0x${string}`, }, - [polygon.name]: { - CelerAdapter: process.env.POLYGON_CELER_ADAPTER_MAINNET as `0x${string}`, - }, [avalanche.name]: { LayerZeroAdapter: process.env.AVALANCHE_LAYER_ZERO_ADAPTER_MAINNET as `0x${string}`, CCIPAdapter: process.env.AVALANCHE_CCIP_ADAPTER_MAINNET as `0x${string}`, @@ -84,6 +87,9 @@ export const settings = { [bscTestnet.name]: { ZetaChainAdapter: process.env.BSC_TESTNET_ZETA_ADAPTER_GOERLI as `0x${string}`, }, + [gnosisChiado.name]: { + ElectronAdapter: process.env.CHIADO_ELECTRON_ADAPTER_GOERLI as `0x${string}`, + }, }, }, [gnosis.name]: { @@ -145,23 +151,44 @@ export const settings = { WormholeHeaderReporter: process.env.MAINNET_WORMHOLE_HEADER_REPORTER as `0x${string}`, }, }, - [mainnet.name]: { - Wormhole: process.env.MAINNET_WORMHOLE_ADDRESS as `0x${string}`, - }, - [gnosis.name]: { - TelepathyLightClientMainnet: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, - }, - [polygon.name]: { - TelepathyLightClientMainnet: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, - }, - [bsc.name]: { - TelepathyLightClientMainnet: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, + lightClientAddresses: { + [gnosisChiado.name]: { + [goerli.name]: { + ElectronLightClient: process.env.CHIADO_ELECTRON_LIGHT_CLIENT_GOERLI as `0x${string}`, + }, + }, + [gnosis.name]: { + [mainnet.name]: { + TelepathyLightClient: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, + }, + }, + [polygon.name]: { + [mainnet.name]: { + TelepathyLightClient: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, + }, + }, + [bsc.name]: { + [mainnet.name]: { + TelepathyLightClient: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, + }, + }, + [optimism.name]: { + [mainnet.name]: { + TelepathyLightClient: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, + }, + }, + [arbitrum.name]: { + [mainnet.name]: { + TelepathyLightClient: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, + }, + }, }, - [optimism.name]: { - TelepathyLightClientMainnet: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, + [goerli.name]: { + HeaderStorage: process.env.GOERLI_HEADER_STORAGE as `0x${string}`, }, - [arbitrum.name]: { - TelepathyLightClientMainnet: "0x34b5378DE786389a477b40dD710812c250185f83" as `0x${string}`, + [mainnet.name]: { + Wormhole: process.env.MAINNET_WORMHOLE_ADDRESS as `0x${string}`, + HeaderStorage: process.env.MAINNET_HEADER_STORAGE as `0x${string}`, }, }, reporterControllers: { @@ -180,6 +207,11 @@ export const settings = { ConnextReporterController: { reportHeadersValue: parseEther(process.env.CONNEXT_REPORT_HEADERS_VALUE as string), }, + ElectronReporterController: { + beaconchaBaseUrls: { + [goerli.name]: "https://goerli.beaconcha.in", + }, + }, LayerZeroReporterController: { reportHeadersValue: parseEther(process.env.LAYER_ZERO_REPORT_HEADERS_VALUE as string), }, @@ -196,7 +228,7 @@ export const settings = { wormholeChainIds: { [mainnet.name]: 2, }, - wormholeScanBaseUrl: process.env.WORMHOLE_SCAN_BASE_URL as string, + wormholeScanBaseUrl: "https://api.wormholescan.io", }, ZetaReporterController: { reportHeadersValue: parseEther(process.env.ZETA_CHAIN_REPORT_HEADERS_VALUE as string), diff --git a/packages/reporter/src/utils/proofs.ts b/packages/reporter/src/utils/proofs.ts new file mode 100644 index 00000000..3fa41b00 --- /dev/null +++ b/packages/reporter/src/utils/proofs.ts @@ -0,0 +1,152 @@ +import { AxiosInstance } from "axios" +import { capella, ssz, phase0 } from "@lodestar/types" +import { ProofType, createProof, SingleProof } from "@chainsafe/persistent-merkle-tree" +import { TransactionType } from "@ethereumjs/tx" +import { hexToBytes, concatBytes, bigIntToBytes, intToBytes } from "@ethereumjs/util" +import { TxReceipt, PostByzantiumTxReceipt, PreByzantiumTxReceipt } from "@ethereumjs/vm" +import { toHexString, fromHexString } from "@chainsafe/ssz" +import { RLP } from "@ethereumjs/rlp" +import { WalletClient, PublicClient, TransactionReceipt, Log } from "viem" +import { Trie } from "@ethereumjs/trie" +import fs from "fs" + +const SLOTS_PER_HISTORICAL_ROOT = 8192 + +export type BeaconId = number | Uint8Array | string + +export const toStringFromBeaconId = (identifier: BeaconId) => { + if (identifier instanceof Uint8Array) { + return toHexString(identifier) + } + return identifier.toString() +} + +export const getState = async (_stateId: BeaconId, _client: AxiosInstance): Promise => { + const { data } = await _client.get(`/eth/v2/debug/beacon/states/${toStringFromBeaconId(_stateId)}`) + return ssz.capella.BeaconState.fromJson(data.data) as capella.BeaconState +} + +export const getHeader = async (_blockId: BeaconId, _client: AxiosInstance): Promise => { + const { data } = await _client.get(`/eth/v1/beacon/headers/${toStringFromBeaconId(_blockId)}`) + const header = ssz.phase0.BeaconBlockHeader.fromJson(data.data.header.message) + return header +} + +export const getReceiptsRootProof = async (_srcBlockId: BeaconId, _targetBlockId: BeaconId, _client: AxiosInstance) => { + const srcState = await getState(toStringFromBeaconId(_srcBlockId), _client) + const targetState = await getState(toStringFromBeaconId(_targetBlockId), _client) + + const srcView = ssz.capella.BeaconState.toView(srcState as capella.BeaconState) + const targetView = ssz.capella.BeaconState.toView(targetState as capella.BeaconState) + const srcSlot = srcState.slot + const targetSlot = targetState.slot + + const srcHeader = await getHeader(_srcBlockId, _client) + const srcHeaderView = ssz.phase0.BeaconBlockHeader.toView(srcHeader as phase0.BeaconBlockHeader) + + let receiptsRootProof + let receiptsRoot + if (srcSlot == targetSlot) { + const receiptGindex = ssz.capella.BeaconState.getPathInfo(["latestExecutionPayloadHeader", "receiptsRoot"]).gindex + const receiptProof = createProof(targetView.node, { + type: ProofType.single, + gindex: receiptGindex, + }) as SingleProof + receiptsRootProof = receiptProof.witnesses.map(toHexString) + receiptsRoot = toHexString(receiptProof.leaf) + } else if (srcSlot - targetSlot < 8192) { + const headerGindex = ssz.phase0.BeaconBlockHeader.getPathInfo(["stateRoot"]).gindex + const headerProof = createProof(srcHeaderView.node, { + type: ProofType.single, + gindex: headerGindex, + }) as SingleProof + + const stateRootGindex = ssz.capella.BeaconState.getPathInfo([ + "stateRoots", + targetSlot % SLOTS_PER_HISTORICAL_ROOT, + ]).gindex + const proof = createProof(srcView.node, { + type: ProofType.single, + gindex: stateRootGindex, + }) as SingleProof + + const receiptGindex = ssz.capella.BeaconState.getPathInfo(["latestExecutionPayloadHeader", "receiptsRoot"]).gindex + const receiptProof = createProof(targetView.node, { + type: ProofType.single, + gindex: receiptGindex, + }) as SingleProof + receiptsRootProof = receiptProof.witnesses.concat(proof.witnesses).concat(headerProof.witnesses).map(toHexString) + receiptsRoot = toHexString(receiptProof.leaf) + } else { + throw Error("slots are too far") + } + return { receiptsRootProof, receiptsRoot } +} + +// copied from here: https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/runBlock.ts +export const encodeReceipt = (receipt: TxReceipt, txType: TransactionType) => { + const encoded = RLP.encode([ + (receipt as PreByzantiumTxReceipt).stateRoot ?? + ((receipt as PostByzantiumTxReceipt).status === 0 ? Uint8Array.from([]) : hexToBytes("0x01")), + bigIntToBytes(receipt.cumulativeBlockGasUsed), + receipt.bitvector, + receipt.logs, + ]) + + if (txType === TransactionType.Legacy) { + return encoded + } + + // Serialize receipt according to EIP-2718: + // `typed-receipt = tx-type || receipt-data` + return concatBytes(intToBytes(txType), encoded) +} + +export const getReceiptProof = async (_hash: `0x${string}`, _client: PublicClient & WalletClient) => { + const receipt = await _client.getTransactionReceipt({ hash: _hash }) + const block = await _client.getBlock({ blockNumber: receipt.blockNumber }) + const receipts = [] as TransactionReceipt[] + for (const hash of block.transactions) { + receipts.push(await _client.getTransactionReceipt({ hash })) + } + + const trie = new Trie() + const encodedReceipts = receipts.map((_receipt) => { + let type = 0 + if (_receipt.type == "eip2930") { + type = 1 + } else if (_receipt.type == "eip1559") { + type = 2 + } else if (_receipt.type != "legacy") { + throw Error(`Unknown receipt type ${_receipt.type}`) + } + + return encodeReceipt( + { + bitvector: fromHexString(_receipt.logsBloom), + cumulativeBlockGasUsed: BigInt(_receipt.cumulativeGasUsed), + logs: _receipt.logs.map((_log: Log) => { + return [ + fromHexString(_log.address), + _log.topics.map((_topic: `0x${string}`) => fromHexString(_topic)), + fromHexString(_log.data), + ] + }), + status: _receipt.status === "success" ? 1 : 0, + } as TxReceipt, + type, + ) + }) + + await Promise.all( + receipts.map((_receipt, _index) => trie.put(RLP.encode(_receipt.transactionIndex), encodedReceipts[_index])), + ) + const receiptKey = RLP.encode(receipt.transactionIndex) + + const root = toHexString(trie.root()) + if (root !== block.receiptsRoot) { + throw Error("The trie.root() and block.receiptsRoot do not match") + } + + return { receiptProof: await trie.createProof(receiptKey), receiptsRoot: block.receiptsRoot } +} diff --git a/packages/reporter/tsconfig.json b/packages/reporter/tsconfig.json index c5ce31cd..22729817 100644 --- a/packages/reporter/tsconfig.json +++ b/packages/reporter/tsconfig.json @@ -7,15 +7,14 @@ "experimentalDecorators": true, "forceConsistentCasingInFileNames": true, "lib": ["es6", "ESNext", "DOM"], - "module": "commonjs", - "moduleResolution": "node", + "module": "NodeNext", "noImplicitAny": true, "outDir": "./dist", "removeComments": true, "resolveJsonModule": true, "sourceMap": true, "strict": true, - "target": "ESNext" + "target": "ES2020" }, "exclude": ["node_modules"], "include": ["./src/**/*"] diff --git a/packages/reporter/yarn.lock b/packages/reporter/yarn.lock index fa27ca5b..a76b4abf 100644 --- a/packages/reporter/yarn.lock +++ b/packages/reporter/yarn.lock @@ -12,6 +12,13 @@ __metadata: languageName: node linkType: hard +"@adraffy/ens-normalize@npm:1.10.0": + version: 1.10.0 + resolution: "@adraffy/ens-normalize@npm:1.10.0" + checksum: af0540f963a2632da2bbc37e36ea6593dcfc607b937857133791781e246d47f870d5e3d21fa70d5cfe94e772c284588c81ea3f5b7f4ea8fbb824369444e4dbcb + languageName: node + linkType: hard + "@adraffy/ens-normalize@npm:1.9.4": version: 1.9.4 resolution: "@adraffy/ens-normalize@npm:1.9.4" @@ -19,6 +26,33 @@ __metadata: languageName: node linkType: hard +"@chainsafe/as-sha256@npm:^0.4.1": + version: 0.4.1 + resolution: "@chainsafe/as-sha256@npm:0.4.1" + checksum: 6d86975e648ecdafd366802278ac15b392b252e967f3681412ec48b5a3518b936cc5e977517499882b084991446d25787d98f8f585891943688cc81549a44e9a + languageName: node + linkType: hard + +"@chainsafe/persistent-merkle-tree@npm:^0.6.1": + version: 0.6.1 + resolution: "@chainsafe/persistent-merkle-tree@npm:0.6.1" + dependencies: + "@chainsafe/as-sha256": ^0.4.1 + "@noble/hashes": ^1.3.0 + checksum: 74614b8d40970dc930d5bf741619498b0bbbde5ff24ce45fce6ad122143aa77bf57249a28175b1b972cf56bff57d529a4258b7222ab4e60c1261119b5986c51b + languageName: node + linkType: hard + +"@chainsafe/ssz@npm:^0.14.0": + version: 0.14.0 + resolution: "@chainsafe/ssz@npm:0.14.0" + dependencies: + "@chainsafe/as-sha256": ^0.4.1 + "@chainsafe/persistent-merkle-tree": ^0.6.1 + checksum: fffec7b8966edb24a146b3c4ada23c9d9b2159c60327eaba2174c7175355f8c750646816a187b439da861fc3cdad5e93a9c0387c1758a3e97d7b4d79a36480c9 + languageName: node + linkType: hard + "@colors/colors@npm:1.6.0, @colors/colors@npm:^1.6.0": version: 1.6.0 resolution: "@colors/colors@npm:1.6.0" @@ -88,6 +122,168 @@ __metadata: languageName: node linkType: hard +"@ethereumjs/block@npm:^5.0.1": + version: 5.0.1 + resolution: "@ethereumjs/block@npm:5.0.1" + dependencies: + "@ethereumjs/common": ^4.1.0 + "@ethereumjs/rlp": ^5.0.1 + "@ethereumjs/trie": ^6.0.1 + "@ethereumjs/tx": ^5.1.0 + "@ethereumjs/util": ^9.0.1 + ethereum-cryptography: ^2.1.2 + checksum: 6bee1189bf097b8a7ea328cdef50ffce352698f4bac4e594b0d721ee715626947e3863e7a546a55ec88547dd50c57447ecbb44b4e0fee746290745ac081566c0 + languageName: node + linkType: hard + +"@ethereumjs/blockchain@npm:^7.0.1": + version: 7.0.1 + resolution: "@ethereumjs/blockchain@npm:7.0.1" + dependencies: + "@ethereumjs/block": ^5.0.1 + "@ethereumjs/common": ^4.1.0 + "@ethereumjs/ethash": ^3.0.1 + "@ethereumjs/rlp": ^5.0.1 + "@ethereumjs/trie": ^6.0.1 + "@ethereumjs/tx": ^5.1.0 + "@ethereumjs/util": ^9.0.1 + debug: ^4.3.3 + ethereum-cryptography: ^2.1.2 + lru-cache: ^10.0.0 + checksum: 54c3019f66528e8549aa48ebe9e700017551c74491cd168353a43af25493e2cddd6f995575bfbcedb31f4b3a55f76f76c5393687495851b57a2024edad01ffa4 + languageName: node + linkType: hard + +"@ethereumjs/common@npm:^4.1.0": + version: 4.1.0 + resolution: "@ethereumjs/common@npm:4.1.0" + dependencies: + "@ethereumjs/util": ^9.0.1 + crc: ^4.3.2 + checksum: 8494e6d179fe3949d8d8285badfb7be9ade71864e477da5dbf432ecc8046a58a0db73e99b5543c807fdc1b3f5959ed9c85ba99536b2f4753e08eaeb096af4beb + languageName: node + linkType: hard + +"@ethereumjs/ethash@npm:^3.0.1": + version: 3.0.1 + resolution: "@ethereumjs/ethash@npm:3.0.1" + dependencies: + "@ethereumjs/block": ^5.0.1 + "@ethereumjs/rlp": ^5.0.1 + "@ethereumjs/util": ^9.0.1 + bigint-crypto-utils: ^3.2.2 + ethereum-cryptography: ^2.1.2 + checksum: 9d613e1bb3c58a4f33b99588cdeeae79c4481f4a368e98bbbf8249883fdc0f66806b7644b4e4420b096711da859982ca5764a9076df3f767f5e73cc291ca81c5 + languageName: node + linkType: hard + +"@ethereumjs/evm@npm:^2.1.0": + version: 2.1.0 + resolution: "@ethereumjs/evm@npm:2.1.0" + dependencies: + "@ethereumjs/common": ^4.1.0 + "@ethereumjs/statemanager": ^2.1.0 + "@ethereumjs/tx": ^5.1.0 + "@ethereumjs/util": ^9.0.1 + "@types/debug": ^4.1.9 + debug: ^4.3.3 + ethereum-cryptography: ^2.1.2 + rustbn-wasm: ^0.2.0 + checksum: 27561150def4e23d91ed6443e0354a7d93f6e94aaefc60fb34016f71e49806012425e3b2b8b76eeef40fc5a1b2b95438e3d7827b8b1b4c8af3766af28877fdf1 + languageName: node + linkType: hard + +"@ethereumjs/rlp@npm:^5.0.1": + version: 5.0.1 + resolution: "@ethereumjs/rlp@npm:5.0.1" + bin: + rlp: bin/rlp.cjs + checksum: eddff08718c3b8312007ef51a951dff6b2c1152f9f9ea6fb9eec65d50caf3fa53f5894d79d6d450eef70a5ef3b0688be044912096aa8d263345a0d9debb4d477 + languageName: node + linkType: hard + +"@ethereumjs/statemanager@npm:^2.1.0": + version: 2.1.0 + resolution: "@ethereumjs/statemanager@npm:2.1.0" + dependencies: + "@ethereumjs/common": ^4.1.0 + "@ethereumjs/rlp": ^5.0.1 + "@ethereumjs/trie": ^6.0.1 + "@ethereumjs/util": ^9.0.1 + debug: ^4.3.3 + ethereum-cryptography: ^2.1.2 + ethers: ^6.4.0 + js-sdsl: ^4.1.4 + lru-cache: ^10.0.0 + checksum: 07e1b5b9d00851328c2ebf12df3ea0440012b9fcdcb8ce3f5301c74dd71d6192cdee197c2c040b11a6e95b466f255f532c4dc337f95585eaadc0e3919245190c + languageName: node + linkType: hard + +"@ethereumjs/trie@npm:^6.0.1": + version: 6.0.1 + resolution: "@ethereumjs/trie@npm:6.0.1" + dependencies: + "@ethereumjs/rlp": ^5.0.1 + "@ethereumjs/util": ^9.0.1 + "@types/readable-stream": ^2.3.13 + ethereum-cryptography: ^2.1.2 + lru-cache: ^10.0.0 + readable-stream: ^3.6.0 + checksum: 6773fc54f2dbdab2afa230cd9ebca16a14f774c7bc5c51c2ee0d51cd6a14cabbceac87a3d1100adf5b8e19a28c7ac4056f1879274a6ec5c22c3f40e2068e060d + languageName: node + linkType: hard + +"@ethereumjs/tx@npm:^5.1.0": + version: 5.1.0 + resolution: "@ethereumjs/tx@npm:5.1.0" + dependencies: + "@ethereumjs/common": ^4.1.0 + "@ethereumjs/rlp": ^5.0.1 + "@ethereumjs/util": ^9.0.1 + ethereum-cryptography: ^2.1.2 + peerDependencies: + c-kzg: ^2.1.2 + peerDependenciesMeta: + c-kzg: + optional: true + checksum: fd17b337f7a64a6a29b1d279c52ac5bfb9655cda06858b198b85a306cc978d25b871acc4ec57e0c29bab50a7c9600d934837fb62052cbde7dc88223be7ebc740 + languageName: node + linkType: hard + +"@ethereumjs/util@npm:^9.0.1": + version: 9.0.1 + resolution: "@ethereumjs/util@npm:9.0.1" + dependencies: + "@ethereumjs/rlp": ^5.0.1 + ethereum-cryptography: ^2.1.2 + peerDependencies: + c-kzg: ^2.1.2 + peerDependenciesMeta: + c-kzg: + optional: true + checksum: 3569dcc0106f5e962e62811be66b5f49529c9d1a29671908568528b2b45d6cae03cb497fc755a1ae4144170f749133308494be42255ac98b61c930d143ed26f4 + languageName: node + linkType: hard + +"@ethereumjs/vm@npm:^7.1.0": + version: 7.1.0 + resolution: "@ethereumjs/vm@npm:7.1.0" + dependencies: + "@ethereumjs/block": ^5.0.1 + "@ethereumjs/blockchain": ^7.0.1 + "@ethereumjs/common": ^4.1.0 + "@ethereumjs/evm": ^2.1.0 + "@ethereumjs/rlp": ^5.0.1 + "@ethereumjs/statemanager": ^2.1.0 + "@ethereumjs/trie": ^6.0.1 + "@ethereumjs/tx": ^5.1.0 + "@ethereumjs/util": ^9.0.1 + debug: ^4.3.3 + ethereum-cryptography: ^2.1.2 + checksum: 03ef823f33b92057b64884a9c96893517d3bc24c6fae1251373c2247be48cdc05b4d88c5fdbd23701944af185c13c751c1b7aa430dabfc32b1cc08a135dfc9d2 + languageName: node + linkType: hard + "@humanwhocodes/config-array@npm:^0.11.13": version: 0.11.13 resolution: "@humanwhocodes/config-array@npm:0.11.13" @@ -151,6 +347,32 @@ __metadata: languageName: node linkType: hard +"@lodestar/params@npm:^1.12.0": + version: 1.12.0 + resolution: "@lodestar/params@npm:1.12.0" + checksum: 572a75b14163b0b742f7e75692e995b1cd4b01420e9a59305d124b941660185bf70315779f62a135ddc17ed7db7109a5a564588187c3ebe3fbbee0107a7c2ea8 + languageName: node + linkType: hard + +"@lodestar/types@npm:^1.12.0": + version: 1.12.0 + resolution: "@lodestar/types@npm:1.12.0" + dependencies: + "@chainsafe/ssz": ^0.14.0 + "@lodestar/params": ^1.12.0 + checksum: ebba20b637ae4ace22ffacadf2b0a7c0dd72701354042ff7508630f82657942672c6247899ecbe618cc4cc74af6dd2b6e87b0aff18735698a591e21f5f819761 + languageName: node + linkType: hard + +"@noble/curves@npm:1.1.0, @noble/curves@npm:~1.1.0": + version: 1.1.0 + resolution: "@noble/curves@npm:1.1.0" + dependencies: + "@noble/hashes": 1.3.1 + checksum: 2658cdd3f84f71079b4e3516c47559d22cf4b55c23ac8ee9d2b1f8e5b72916d9689e59820e0f9d9cb4a46a8423af5b56dc6bb7782405c88be06a015180508db5 + languageName: node + linkType: hard + "@noble/curves@npm:1.2.0, @noble/curves@npm:~1.2.0": version: 1.2.0 resolution: "@noble/curves@npm:1.2.0" @@ -160,7 +382,14 @@ __metadata: languageName: node linkType: hard -"@noble/hashes@npm:1.3.2, @noble/hashes@npm:~1.3.0, @noble/hashes@npm:~1.3.2": +"@noble/hashes@npm:1.3.1": + version: 1.3.1 + resolution: "@noble/hashes@npm:1.3.1" + checksum: 7fdefc0f7a0c1ec27acc6ff88841793e3f93ec4ce6b8a6a12bfc0dd70ae6b7c4c82fe305fdfeda1735d5ad4a9eebe761e6693b3d355689c559e91242f4bc95b1 + languageName: node + linkType: hard + +"@noble/hashes@npm:1.3.2, @noble/hashes@npm:^1.3.0, @noble/hashes@npm:~1.3.0, @noble/hashes@npm:~1.3.1, @noble/hashes@npm:~1.3.2": version: 1.3.2 resolution: "@noble/hashes@npm:1.3.2" checksum: fe23536b436539d13f90e4b9be843cc63b1b17666a07634a2b1259dded6f490be3d050249e6af98076ea8f2ea0d56f578773c2197f2aa0eeaa5fba5bc18ba474 @@ -210,13 +439,24 @@ __metadata: languageName: node linkType: hard -"@scure/base@npm:~1.1.0, @scure/base@npm:~1.1.2": +"@scure/base@npm:^1.1.1, @scure/base@npm:~1.1.0, @scure/base@npm:~1.1.2": version: 1.1.3 resolution: "@scure/base@npm:1.1.3" checksum: 1606ab8a4db898cb3a1ada16c15437c3bce4e25854fadc8eb03ae93cbbbac1ed90655af4b0be3da37e12056fef11c0374499f69b9e658c9e5b7b3e06353c630c languageName: node linkType: hard +"@scure/bip32@npm:1.3.1": + version: 1.3.1 + resolution: "@scure/bip32@npm:1.3.1" + dependencies: + "@noble/curves": ~1.1.0 + "@noble/hashes": ~1.3.1 + "@scure/base": ~1.1.0 + checksum: 394d65f77a40651eba21a5096da0f4233c3b50d422864751d373fcf142eeedb94a1149f9ab1dbb078086dab2d0bc27e2b1afec8321bf22d4403c7df2fea5bfe2 + languageName: node + linkType: hard + "@scure/bip32@npm:1.3.2": version: 1.3.2 resolution: "@scure/bip32@npm:1.3.2" @@ -273,6 +513,15 @@ __metadata: languageName: node linkType: hard +"@types/debug@npm:^4.1.9": + version: 4.1.12 + resolution: "@types/debug@npm:4.1.12" + dependencies: + "@types/ms": "*" + checksum: 47876a852de8240bfdaf7481357af2b88cb660d30c72e73789abf00c499d6bc7cd5e52f41c915d1b9cd8ec9fef5b05688d7b7aef17f7f272c2d04679508d1053 + languageName: node + linkType: hard + "@types/json-schema@npm:^7.0.12": version: 7.0.14 resolution: "@types/json-schema@npm:7.0.14" @@ -280,6 +529,13 @@ __metadata: languageName: node linkType: hard +"@types/ms@npm:*": + version: 0.7.34 + resolution: "@types/ms@npm:0.7.34" + checksum: f38d36e7b6edecd9badc9cf50474159e9da5fa6965a75186cceaf883278611b9df6669dc3a3cc122b7938d317b68a9e3d573d316fcb35d1be47ec9e468c6bd8a + languageName: node + linkType: hard + "@types/node-cron@npm:^3.0.9": version: 3.0.9 resolution: "@types/node-cron@npm:3.0.9" @@ -287,6 +543,22 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:*": + version: 20.10.3 + resolution: "@types/node@npm:20.10.3" + dependencies: + undici-types: ~5.26.4 + checksum: 34a329494f0ea239af05eeb6f00f396963725b3eb9a2f79c5e6a6d37e823f2ab85e1079c2ee56723a37d8b89e7bbe2bd050c97144e5bb06dab93fd1cace65c97 + languageName: node + linkType: hard + +"@types/node@npm:18.15.13": + version: 18.15.13 + resolution: "@types/node@npm:18.15.13" + checksum: 79cc5a2b5f98e8973061a4260a781425efd39161a0e117a69cd089603964816c1a14025e1387b4590c8e82d05133b7b4154fa53a7dffb3877890a66145e76515 + languageName: node + linkType: hard + "@types/node@npm:^20.8.9": version: 20.8.9 resolution: "@types/node@npm:20.8.9" @@ -296,6 +568,16 @@ __metadata: languageName: node linkType: hard +"@types/readable-stream@npm:^2.3.13": + version: 2.3.15 + resolution: "@types/readable-stream@npm:2.3.15" + dependencies: + "@types/node": "*" + safe-buffer: ~5.1.1 + checksum: ec36f525cad09b6c65a1dafcb5ad99b9e2ed824ec49b7aa23180ac427e5d35b8a0706193ecd79ab4253a283ad485ba03d5917a98daaaa144f0ea34f4823e9d82 + languageName: node + linkType: hard + "@types/semver@npm:^7.5.0": version: 7.5.4 resolution: "@types/semver@npm:7.5.4" @@ -486,6 +768,13 @@ __metadata: languageName: node linkType: hard +"aes-js@npm:4.0.0-beta.5": + version: 4.0.0-beta.5 + resolution: "aes-js@npm:4.0.0-beta.5" + checksum: cc2ea969d77df939c32057f7e361b6530aa6cb93cb10617a17a45cd164e6d761002f031ff6330af3e67e58b1f0a3a8fd0b63a720afd591a653b02f649470e15b + languageName: node + linkType: hard + "agent-base@npm:6, agent-base@npm:^6.0.2": version: 6.0.2 resolution: "agent-base@npm:6.0.2" @@ -613,6 +902,15 @@ __metadata: languageName: node linkType: hard +"async-retry@npm:^1.3.3": + version: 1.3.3 + resolution: "async-retry@npm:1.3.3" + dependencies: + retry: 0.13.1 + checksum: 38a7152ff7265a9321ea214b9c69e8224ab1febbdec98efbbde6e562f17ff68405569b796b1c5271f354aef8783665d29953f051f68c1fc45306e61aec82fdc4 + languageName: node + linkType: hard + "async@npm:^3.2.3": version: 3.2.4 resolution: "async@npm:3.2.4" @@ -645,6 +943,13 @@ __metadata: languageName: node linkType: hard +"bigint-crypto-utils@npm:^3.2.2": + version: 3.3.0 + resolution: "bigint-crypto-utils@npm:3.3.0" + checksum: 9598ce57b23f776c8936d44114c9f051e62b5fa654915b664784cbcbacc5aa0485f4479571c51ff58008abb1210c0d6a234853742f07cf84bda890f2a1e01000 + languageName: node + linkType: hard + "binary-extensions@npm:^2.0.0": version: 2.2.0 resolution: "binary-extensions@npm:2.2.0" @@ -844,6 +1149,18 @@ __metadata: languageName: node linkType: hard +"crc@npm:^4.3.2": + version: 4.3.2 + resolution: "crc@npm:4.3.2" + peerDependencies: + buffer: ">=6.0.3" + peerDependenciesMeta: + buffer: + optional: true + checksum: 8231cc25331727083ffd22da3575110fc49b4dc8725de973bd43261d4426aba134ed3a75cc247f7c5e97a6e171f87dffc3325b82890e86d032de2e6bcef09c32 + languageName: node + linkType: hard + "create-require@npm:^1.1.0": version: 1.1.1 resolution: "create-require@npm:1.1.1" @@ -1113,6 +1430,33 @@ __metadata: languageName: node linkType: hard +"ethereum-cryptography@npm:^2.1.2": + version: 2.1.2 + resolution: "ethereum-cryptography@npm:2.1.2" + dependencies: + "@noble/curves": 1.1.0 + "@noble/hashes": 1.3.1 + "@scure/bip32": 1.3.1 + "@scure/bip39": 1.2.1 + checksum: 2e8f7b8cc90232ae838ab6a8167708e8362621404d26e79b5d9e762c7b53d699f7520aff358d9254de658fcd54d2d0af168ff909943259ed27dc4cef2736410c + languageName: node + linkType: hard + +"ethers@npm:^6.4.0": + version: 6.9.0 + resolution: "ethers@npm:6.9.0" + dependencies: + "@adraffy/ens-normalize": 1.10.0 + "@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 + checksum: e7b3b912b92b818fe65a192b32f4dd87ce0b71f4ffc194b4b3764b4b17d3b6ed953b667293e4c9276f785fa8c8659934c513843350317c61178af8e6165afbdd + languageName: node + linkType: hard + "exponential-backoff@npm:^3.1.1": version: 3.1.1 resolution: "exponential-backoff@npm:3.1.1" @@ -1623,6 +1967,13 @@ __metadata: languageName: node linkType: hard +"js-sdsl@npm:^4.1.4": + version: 4.4.2 + resolution: "js-sdsl@npm:4.4.2" + checksum: ba705adc1788bf3c6f6c8e5077824f2bb4f0acab5a984420ce5cc492c7fff3daddc26335ad2c9a67d4f5e3241ec790f9e5b72a625adcf20cf321d2fd85e62b8b + languageName: node + linkType: hard + "js-yaml@npm:^4.1.0": version: 4.1.0 resolution: "js-yaml@npm:4.1.0" @@ -1711,6 +2062,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^10.0.0": + version: 10.1.0 + resolution: "lru-cache@npm:10.1.0" + checksum: 58056d33e2500fbedce92f8c542e7c11b50d7d086578f14b7074d8c241422004af0718e08a6eaae8705cee09c77e39a61c1c79e9370ba689b7010c152e6a76ab + languageName: node + linkType: hard + "lru-cache@npm:^6.0.0": version: 6.0.0 resolution: "lru-cache@npm:6.0.0" @@ -2209,11 +2567,19 @@ __metadata: version: 0.0.0-use.local resolution: "reporter@workspace:." dependencies: + "@chainsafe/persistent-merkle-tree": ^0.6.1 + "@chainsafe/ssz": ^0.14.0 + "@ethereumjs/rlp": ^5.0.1 + "@ethereumjs/trie": ^6.0.1 + "@ethereumjs/util": ^9.0.1 + "@ethereumjs/vm": ^7.1.0 + "@lodestar/types": ^1.12.0 "@types/node": ^20.8.9 "@types/node-cron": ^3.0.9 "@typescript-eslint/eslint-plugin": ^6.7.5 "@typescript-eslint/parser": ^6.7.5 async-mutex: ^0.4.0 + async-retry: ^1.3.3 axios: ^1.5.1 dotenv: ^16.3.1 eslint: ^8.51.0 @@ -2234,6 +2600,13 @@ __metadata: languageName: node linkType: hard +"retry@npm:0.13.1": + version: 0.13.1 + resolution: "retry@npm:0.13.1" + checksum: 47c4d5be674f7c13eee4cfe927345023972197dbbdfba5d3af7e461d13b44de1bfd663bfc80d2f601f8ef3fc8164c16dd99655a221921954a65d044a2fc1233b + languageName: node + linkType: hard + "retry@npm:^0.12.0": version: 0.12.0 resolution: "retry@npm:0.12.0" @@ -2268,6 +2641,22 @@ __metadata: languageName: node linkType: hard +"rustbn-wasm@npm:^0.2.0": + version: 0.2.0 + resolution: "rustbn-wasm@npm:0.2.0" + dependencies: + "@scure/base": ^1.1.1 + checksum: 9cf89ce88a9d161bce8ea2516b3037fe97e1debb2e9b86d6f3cd133e2c120c844644d37c61c27ae00475e49595a397e61559431875a61c5c52a04c40ba658872 + languageName: node + linkType: hard + +"safe-buffer@npm:~5.1.1": + version: 5.1.2 + resolution: "safe-buffer@npm:5.1.2" + checksum: f2f1f7943ca44a594893a852894055cf619c1fbcb611237fc39e461ae751187e7baf4dc391a72125e0ac4fb2d8c5c0b3c71529622e6a58f46b960211e704903c + languageName: node + linkType: hard + "safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" @@ -2582,6 +2971,13 @@ __metadata: languageName: node linkType: hard +"tslib@npm:2.4.0": + version: 2.4.0 + resolution: "tslib@npm:2.4.0" + checksum: 8c4aa6a3c5a754bf76aefc38026134180c053b7bd2f81338cb5e5ebf96fefa0f417bff221592bf801077f5bf990562f6264fecbc42cd3309b33872cb6fc3b113 + languageName: node + linkType: hard + "tslib@npm:^2.4.0": version: 2.6.2 resolution: "tslib@npm:2.6.2" @@ -2795,6 +3191,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:8.5.0": + version: 8.5.0 + resolution: "ws@npm:8.5.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 76f2f90e40344bf18fd544194e7067812fb1372b2a37865678d8f12afe4b478ff2ebc0c7c0aff82cd5e6b66fc43d889eec0f1865c2365d8f7a66d92da7744a77 + languageName: node + linkType: hard + "yallist@npm:^4.0.0": version: 4.0.0 resolution: "yallist@npm:4.0.0" diff --git a/yarn.lock b/yarn.lock index e0311ba7..5064f157 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6,41 +6,42 @@ __metadata: cacheKey: 8 "@babel/code-frame@npm:^7.0.0": - version: 7.21.4 - resolution: "@babel/code-frame@npm:7.21.4" + version: 7.23.5 + resolution: "@babel/code-frame@npm:7.23.5" dependencies: - "@babel/highlight": ^7.18.6 - checksum: e5390e6ec1ac58dcef01d4f18eaf1fd2f1325528661ff6d4a5de8979588b9f5a8e852a54a91b923846f7a5c681b217f0a45c2524eb9560553160cd963b7d592c + "@babel/highlight": ^7.23.4 + chalk: ^2.4.2 + checksum: d90981fdf56a2824a9b14d19a4c0e8db93633fd488c772624b4e83e0ceac6039a27cd298a247c3214faa952bf803ba23696172ae7e7235f3b97f43ba278c569a languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.18.6": - version: 7.19.1 - resolution: "@babel/helper-validator-identifier@npm:7.19.1" - checksum: 0eca5e86a729162af569b46c6c41a63e18b43dbe09fda1d2a3c8924f7d617116af39cac5e4cd5d431bb760b4dca3c0970e0c444789b1db42bcf1fa41fbad0a3a +"@babel/helper-validator-identifier@npm:^7.22.20": + version: 7.22.20 + resolution: "@babel/helper-validator-identifier@npm:7.22.20" + checksum: 136412784d9428266bcdd4d91c32bcf9ff0e8d25534a9d94b044f77fe76bc50f941a90319b05aafd1ec04f7d127cd57a179a3716009ff7f3412ef835ada95bdc languageName: node linkType: hard -"@babel/highlight@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/highlight@npm:7.18.6" +"@babel/highlight@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/highlight@npm:7.23.4" dependencies: - "@babel/helper-validator-identifier": ^7.18.6 - chalk: ^2.0.0 + "@babel/helper-validator-identifier": ^7.22.20 + chalk: ^2.4.2 js-tokens: ^4.0.0 - checksum: 92d8ee61549de5ff5120e945e774728e5ccd57fd3b2ed6eace020ec744823d4a98e242be1453d21764a30a14769ecd62170fba28539b211799bbaf232bbb2789 + checksum: 643acecdc235f87d925979a979b539a5d7d1f31ae7db8d89047269082694122d11aa85351304c9c978ceeb6d250591ccadb06c366f358ccee08bb9c122476b89 languageName: node linkType: hard "@commitlint/cli@npm:^17.5.1": - version: 17.5.1 - resolution: "@commitlint/cli@npm:17.5.1" - dependencies: - "@commitlint/format": ^17.4.4 - "@commitlint/lint": ^17.4.4 - "@commitlint/load": ^17.5.0 - "@commitlint/read": ^17.5.1 - "@commitlint/types": ^17.4.4 + version: 17.8.1 + resolution: "@commitlint/cli@npm:17.8.1" + dependencies: + "@commitlint/format": ^17.8.1 + "@commitlint/lint": ^17.8.1 + "@commitlint/load": ^17.8.1 + "@commitlint/read": ^17.8.1 + "@commitlint/types": ^17.8.1 execa: ^5.0.0 lodash.isfunction: ^3.0.9 resolve-from: 5.0.0 @@ -48,91 +49,91 @@ __metadata: yargs: ^17.0.0 bin: commitlint: cli.js - checksum: 2bdd26b3215796dccb16b0d7459d3b0db7f6324800aa73b97a8cdf79b77f3691d85ee88f37fa6cf20c97ac664f31dcb6ad7aef1da3c3b32d7bb12f18d49a37f2 + checksum: 293d5868e2f586a9ac5364c40eeb0fe2131ea689312c43d43ababe6f2415c998619c5070cf89e7298125a1d96b9e5912b85f51db75aedbfb189d67554f911dbf languageName: node linkType: hard "@commitlint/config-conventional@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/config-conventional@npm:17.4.4" + version: 17.8.1 + resolution: "@commitlint/config-conventional@npm:17.8.1" dependencies: - conventional-changelog-conventionalcommits: ^5.0.0 - checksum: 679d92509fe6e53ee0cc4202f8069d88360c4f9dbd7ab74114bb28278a196da517ef711dfe69893033a66e54ffc29e8df2ccf63cfd746a89c82a053949473c4b + conventional-changelog-conventionalcommits: ^6.1.0 + checksum: ce8ace1a13f3a797ed699ffa13dc46273a27e1dc3ae8a9d01492c0637a8592e4ed24bb32d9a43f8745a8690a52d77ea4a950d039977b0dbcbf834f8cbacf5def languageName: node linkType: hard -"@commitlint/config-validator@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/config-validator@npm:17.4.4" +"@commitlint/config-validator@npm:^17.8.1": + version: 17.8.1 + resolution: "@commitlint/config-validator@npm:17.8.1" dependencies: - "@commitlint/types": ^17.4.4 + "@commitlint/types": ^17.8.1 ajv: ^8.11.0 - checksum: 71ee818608ed5c74832cdd63531c0f61b21758fba9f8b876205485ece4f047c9582bc3f323a20a5de700e3451296614d15448437270a82194eff7d71317b47ff + checksum: 487051cc36a82ba50f217dfd26721f4fa26d8c4206ee5cb0debd2793aa950280f3ca5bd1a8738e9c71ca8508b58548918b43169c21219ca4cb67f5dcd1e49d9f languageName: node linkType: hard -"@commitlint/ensure@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/ensure@npm:17.4.4" +"@commitlint/ensure@npm:^17.8.1": + version: 17.8.1 + resolution: "@commitlint/ensure@npm:17.8.1" dependencies: - "@commitlint/types": ^17.4.4 + "@commitlint/types": ^17.8.1 lodash.camelcase: ^4.3.0 lodash.kebabcase: ^4.1.1 lodash.snakecase: ^4.1.1 lodash.startcase: ^4.4.0 lodash.upperfirst: ^4.3.1 - checksum: c21c189f22d8d3265e93256d101b72ef7cbdf8660438081799b9a4a8bd47d33133f250bbed858ab9bcc0d249d1c95ac58eddd9e5b46314d64ff049d0479d0d71 + checksum: a4a5d3071df0e52dad0293c649c236f070c4fcd3380f11747a6f9b06b036adea281e557d117156e31313fbe18a7d71bf06e05e92776adbde7867190e1735bc43 languageName: node linkType: hard -"@commitlint/execute-rule@npm:^17.4.0": - version: 17.4.0 - resolution: "@commitlint/execute-rule@npm:17.4.0" - checksum: 17d8e56ab00bd45fdecb0ed33186d2020ce261250d6a516204b6509610b75af8c930e7226b1111af3de298db32a7e4d0ba2c9cc7ed67db5ba5159eeed634f067 +"@commitlint/execute-rule@npm:^17.8.1": + version: 17.8.1 + resolution: "@commitlint/execute-rule@npm:17.8.1" + checksum: 73354b5605931a71f727ee0262a5509277e92f134e2d704d44eafe4da7acb1cd2c7d084dcf8096cc0ac7ce83b023cc0ae8f79b17487b132ccc2e0b3920105a11 languageName: node linkType: hard -"@commitlint/format@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/format@npm:17.4.4" +"@commitlint/format@npm:^17.8.1": + version: 17.8.1 + resolution: "@commitlint/format@npm:17.8.1" dependencies: - "@commitlint/types": ^17.4.4 + "@commitlint/types": ^17.8.1 chalk: ^4.1.0 - checksum: 832d9641129f2da8d32389b4a47db59d41eb1adfab742723972cad64b833c4af9e253f96757b27664fedae61644dd4c01d21f775773b45b604bd7f93b23a27d2 + checksum: 0481e4d49196c942d7723a1abd352c3c884ceb9f434fb4e64bfab71bc264e9b7c643a81069f20d2a035fca70261a472508d73b1a60fe378c60534ca6301408b6 languageName: node linkType: hard -"@commitlint/is-ignored@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/is-ignored@npm:17.4.4" +"@commitlint/is-ignored@npm:^17.8.1": + version: 17.8.1 + resolution: "@commitlint/is-ignored@npm:17.8.1" dependencies: - "@commitlint/types": ^17.4.4 - semver: 7.3.8 - checksum: 716631ecd6aece8642d76c1a99e1cdc24bad79f22199d1d4bad73d9b12edb3578ed7d6f23947ca28d4bb637e08a1738e55dd693c165a2d395c10560a988ffc05 + "@commitlint/types": ^17.8.1 + semver: 7.5.4 + checksum: 26eb2f1a84a774625f3f6fe4fa978c57d81028ee6a6925ab3fb02981ac395f9584ab4a71af59c3f2ac84a06c775e3f52683c033c565d86271a7aa99c2eb6025c languageName: node linkType: hard -"@commitlint/lint@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/lint@npm:17.4.4" +"@commitlint/lint@npm:^17.8.1": + version: 17.8.1 + resolution: "@commitlint/lint@npm:17.8.1" dependencies: - "@commitlint/is-ignored": ^17.4.4 - "@commitlint/parse": ^17.4.4 - "@commitlint/rules": ^17.4.4 - "@commitlint/types": ^17.4.4 - checksum: bf04a9f9a1435e0d3cd03c58b6bf924613d0278b66b0a5d0e18eb96c7af9eeb02871e739a4d7d9312b2b4178f6f8ae9a49ba74382b4e28f623e1bf0af7067946 + "@commitlint/is-ignored": ^17.8.1 + "@commitlint/parse": ^17.8.1 + "@commitlint/rules": ^17.8.1 + "@commitlint/types": ^17.8.1 + checksum: 025712ad928098b3f94d8dc38566785f6c3eeba799725dbd935c5514141ea77b01e036fed1dbbf60cc954736f706ddbb85339751c43f16f5f3f94170d1decb2a languageName: node linkType: hard -"@commitlint/load@npm:^17.5.0": - version: 17.5.0 - resolution: "@commitlint/load@npm:17.5.0" +"@commitlint/load@npm:^17.8.1": + version: 17.8.1 + resolution: "@commitlint/load@npm:17.8.1" dependencies: - "@commitlint/config-validator": ^17.4.4 - "@commitlint/execute-rule": ^17.4.0 - "@commitlint/resolve-extends": ^17.4.4 - "@commitlint/types": ^17.4.4 - "@types/node": "*" + "@commitlint/config-validator": ^17.8.1 + "@commitlint/execute-rule": ^17.8.1 + "@commitlint/resolve-extends": ^17.8.1 + "@commitlint/types": ^17.8.1 + "@types/node": 20.5.1 chalk: ^4.1.0 cosmiconfig: ^8.0.0 cosmiconfig-typescript-loader: ^4.0.0 @@ -141,91 +142,91 @@ __metadata: lodash.uniq: ^4.5.0 resolve-from: ^5.0.0 ts-node: ^10.8.1 - typescript: ^4.6.4 || ^5.0.0 - checksum: c039114b0ad67bb9d8b05ec635d847bd5ab760528f0fb203411f433585bdab5472f4f5c7856dfc417cf64c05576f54c1afc4997a813f529304e0156bfc1d6cc8 + typescript: ^4.6.4 || ^5.2.2 + checksum: 5a9a9f0d4621a4cc61c965c3adc88d04ccac40640b022bb3bbad70ed4435bb0c103647a2e29e37fc3d68021dae041c937bee611fe2e5461bebe997640f4f626b languageName: node linkType: hard -"@commitlint/message@npm:^17.4.2": - version: 17.4.2 - resolution: "@commitlint/message@npm:17.4.2" - checksum: 55b6cfeb57f7c9f913e18821aa4d972a6b6faa78c62741390996151f99554396f6df68ccfee86c163d24d8c27a4dbbcb50ef03c2972ab0a7a21d89daa2f9a519 +"@commitlint/message@npm:^17.8.1": + version: 17.8.1 + resolution: "@commitlint/message@npm:17.8.1" + checksum: ee3ca9bf02828ea322becba47c67f7585aa3fd22b197eab69679961e67e3c7bdf56f6ef41cb3b831b521af7dabd305eb5d7ee053c8294531cc8ca64dbbff82fc languageName: node linkType: hard -"@commitlint/parse@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/parse@npm:17.4.4" +"@commitlint/parse@npm:^17.8.1": + version: 17.8.1 + resolution: "@commitlint/parse@npm:17.8.1" dependencies: - "@commitlint/types": ^17.4.4 - conventional-changelog-angular: ^5.0.11 - conventional-commits-parser: ^3.2.2 - checksum: 2a6e5b0a5cdea21c879a3919a0227c0d7f3fa1f343808bcb09e3e7f25b0dc494dcca8af32982e7a65640b53c3e6cf138ebf685b657dd55173160bc0fa4e58916 + "@commitlint/types": ^17.8.1 + conventional-changelog-angular: ^6.0.0 + conventional-commits-parser: ^4.0.0 + checksum: 5322ae049b43a329761063b6e698714593d84d874147ced6290c8d88a9ebea2ba8c660a5815392a731377ac26fbf6b215bb9b87d84d8b49cb47fa1c62d228b24 languageName: node linkType: hard -"@commitlint/read@npm:^17.5.1": - version: 17.5.1 - resolution: "@commitlint/read@npm:17.5.1" +"@commitlint/read@npm:^17.8.1": + version: 17.8.1 + resolution: "@commitlint/read@npm:17.8.1" dependencies: - "@commitlint/top-level": ^17.4.0 - "@commitlint/types": ^17.4.4 + "@commitlint/top-level": ^17.8.1 + "@commitlint/types": ^17.8.1 fs-extra: ^11.0.0 git-raw-commits: ^2.0.11 minimist: ^1.2.6 - checksum: 62ee4f7a47b22a8571ae313bca36b418805a248f4986557f38f06317c44b6d18072889f95e7bc22bbb33a2f2b08236f74596ff28e3dbd0894249477a9df367c3 + checksum: 122f1842cb8b87b2c447383095420d077dcae6fbb4f871f8b05fa088f99d95d18a8c6675be2eb3e67bf7ff47a9990764261e3eebc5e474404f14e3379f48df42 languageName: node linkType: hard -"@commitlint/resolve-extends@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/resolve-extends@npm:17.4.4" +"@commitlint/resolve-extends@npm:^17.8.1": + version: 17.8.1 + resolution: "@commitlint/resolve-extends@npm:17.8.1" dependencies: - "@commitlint/config-validator": ^17.4.4 - "@commitlint/types": ^17.4.4 + "@commitlint/config-validator": ^17.8.1 + "@commitlint/types": ^17.8.1 import-fresh: ^3.0.0 lodash.mergewith: ^4.6.2 resolve-from: ^5.0.0 resolve-global: ^1.0.0 - checksum: d7bf1ff1ad3db8750421b252d79cf7b96cf07d72cad8cc3f73c1363a8e68c0afde611d38ae6f213bbb54e3248160c6b9425578f3d0f8f790e84aea811d748b3e + checksum: c6fb7d3f263b876ff805396abad27bc514b1a69dcc634903c28782f4f3932eddc37221daa3264a45a5b82d28aa17a57c7bab4830c6efae741cc875f137366608 languageName: node linkType: hard -"@commitlint/rules@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/rules@npm:17.4.4" +"@commitlint/rules@npm:^17.8.1": + version: 17.8.1 + resolution: "@commitlint/rules@npm:17.8.1" dependencies: - "@commitlint/ensure": ^17.4.4 - "@commitlint/message": ^17.4.2 - "@commitlint/to-lines": ^17.4.0 - "@commitlint/types": ^17.4.4 + "@commitlint/ensure": ^17.8.1 + "@commitlint/message": ^17.8.1 + "@commitlint/to-lines": ^17.8.1 + "@commitlint/types": ^17.8.1 execa: ^5.0.0 - checksum: f36525f6e234df6a17d47457b733a1fc10e3e01db1aa6fb45b18cbaf74b7915f634ab65f73d2412787137c366046f8264126c2f21ad9023ac6b68ec8b1cee8f4 + checksum: b284514a4b8dad6bcbbc91c7548d69d0bbe9fcbdb241c15f5f9da413e8577c19d11190f1d709b38487c49dc874359bd9d0b72ab39f91cce06191e4ddaf8ec84d languageName: node linkType: hard -"@commitlint/to-lines@npm:^17.4.0": - version: 17.4.0 - resolution: "@commitlint/to-lines@npm:17.4.0" - checksum: 841f90f606238e145ab4ba02940662d511fc04fe553619900152a8542170fe664031b95d820ffaeb8864d4851344278e662ef29637d763fc19fd828e0f8d139b +"@commitlint/to-lines@npm:^17.8.1": + version: 17.8.1 + resolution: "@commitlint/to-lines@npm:17.8.1" + checksum: ff175c202c89537301f32b6e13ebe6919ac782a6e109cb5f6136566d71555a54f6574caf4d674d3409d32fdea1b4a28518837632ca05c7557d4f18f339574e62 languageName: node linkType: hard -"@commitlint/top-level@npm:^17.4.0": - version: 17.4.0 - resolution: "@commitlint/top-level@npm:17.4.0" +"@commitlint/top-level@npm:^17.8.1": + version: 17.8.1 + resolution: "@commitlint/top-level@npm:17.8.1" dependencies: find-up: ^5.0.0 - checksum: 14cd77e982d2dd7989718dafdbf7a2168a5fb387005e0686c2dfa9ffc36bb9a749e5d80a151884459e4d8c88564339688dca26e9c711abe043beeb3f30c3dfd6 + checksum: 25c8a6f4026c705a5ad4d9358eae7558734f549623da1c5f44cba8d6bc495f20d3ad05418febb8dca4f6b63f40bf44763007a14ab7209c435566843be114e7fc languageName: node linkType: hard -"@commitlint/types@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/types@npm:17.4.4" +"@commitlint/types@npm:^17.8.1": + version: 17.8.1 + resolution: "@commitlint/types@npm:17.8.1" dependencies: chalk: ^4.1.0 - checksum: 03c52429052d161710896d198000196bd2e60be0fd71459b22133dd83dee43e8d05ea8ee703c8369823bc40f77a54881b80d8aa4368ac52aea7f30fb234b73d2 + checksum: a4cfa8c417aa0209694b96da04330282e41150caae1e1d0cec596ea34e3ce15afb84b3263abe5b89758ec1f3f71a9de0ee2d593df66db17b283127dd5e7cd6ac languageName: node linkType: hard @@ -239,16 +240,16 @@ __metadata: linkType: hard "@jridgewell/resolve-uri@npm:^3.0.3": - version: 3.1.0 - resolution: "@jridgewell/resolve-uri@npm:3.1.0" - checksum: b5ceaaf9a110fcb2780d1d8f8d4a0bfd216702f31c988d8042e5f8fbe353c55d9b0f55a1733afdc64806f8e79c485d2464680ac48a0d9fcadb9548ee6b81d267 + version: 3.1.1 + resolution: "@jridgewell/resolve-uri@npm:3.1.1" + checksum: f5b441fe7900eab4f9155b3b93f9800a916257f4e8563afbcd3b5a5337b55e52bd8ae6735453b1b745457d9f6cdb16d74cd6220bbdd98cf153239e13f6cbb653 languageName: node linkType: hard "@jridgewell/sourcemap-codec@npm:^1.4.10": - version: 1.4.14 - resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" - checksum: 61100637b6d173d3ba786a5dff019e1a74b1f394f323c1fee337ff390239f053b87266c7a948777f4b1ee68c01a8ad0ab61e5ff4abb5a012a0b091bec391ab97 + version: 1.4.15 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" + checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 languageName: node linkType: hard @@ -262,12 +263,12 @@ __metadata: languageName: node linkType: hard -"@solidity-parser/parser@npm:^0.16.0": - version: 0.16.0 - resolution: "@solidity-parser/parser@npm:0.16.0" +"@solidity-parser/parser@npm:^0.16.2": + version: 0.16.2 + resolution: "@solidity-parser/parser@npm:0.16.2" dependencies: antlr4ts: ^0.5.0-alpha.4 - checksum: 6ccbdab334331a58fde2a739cff76d5a99d836186b7899e8e027266f2af2a4bddc77c9c2abd01307cea6c470345d48edc470049e9672143b73f4aff3c8976183 + checksum: 109f7bec5de943c63e444fdde179d9bba6a592c18c836f585753798f428424cfcca72c715e7a345e4b79b83d6548543c9e56cb4b263e9b1e8352af2efcfd224a languageName: node linkType: hard @@ -293,34 +294,34 @@ __metadata: linkType: hard "@tsconfig/node16@npm:^1.0.2": - version: 1.0.3 - resolution: "@tsconfig/node16@npm:1.0.3" - checksum: 3a8b657dd047495b7ad23437d6afd20297ce90380ff0bdee93fc7d39a900dbd8d9e26e53ff6b465e7967ce2adf0b218782590ce9013285121e6a5928fbd6819f + version: 1.0.4 + resolution: "@tsconfig/node16@npm:1.0.4" + checksum: 202319785901f942a6e1e476b872d421baec20cf09f4b266a1854060efbf78cde16a4d256e8bc949d31e6cd9a90f1e8ef8fb06af96a65e98338a2b6b0de0a0ff languageName: node linkType: hard "@types/minimist@npm:^1.2.0": - version: 1.2.2 - resolution: "@types/minimist@npm:1.2.2" - checksum: b8da83c66eb4aac0440e64674b19564d9d86c80ae273144db9681e5eeff66f238ade9515f5006ffbfa955ceff8b89ad2bd8ec577d7caee74ba101431fb07045d + version: 1.2.5 + resolution: "@types/minimist@npm:1.2.5" + checksum: 477047b606005058ab0263c4f58097136268007f320003c348794f74adedc3166ffc47c80ec3e94687787f2ab7f4e72c468223946e79892cf0fd9e25e9970a90 languageName: node linkType: hard -"@types/node@npm:*": - version: 18.15.11 - resolution: "@types/node@npm:18.15.11" - checksum: 977b4ad04708897ff0eb049ecf82246d210939c82461922d20f7d2dcfd81bbc661582ba3af28869210f7e8b1934529dcd46bff7d448551400f9d48b9d3bddec3 +"@types/node@npm:20.5.1": + version: 20.5.1 + resolution: "@types/node@npm:20.5.1" + checksum: 3dbe611cd67afa987102c8558ee70f848949c5dcfee5f60abc073e55c0d7b048e391bf06bb1e0dc052cb7210ca97136ac496cbaf6e89123c989de6bd125fde82 languageName: node linkType: hard "@types/normalize-package-data@npm:^2.4.0": - version: 2.4.1 - resolution: "@types/normalize-package-data@npm:2.4.1" - checksum: e87bccbf11f95035c89a132b52b79ce69a1e3652fe55962363063c9c0dae0fe2477ebc585e03a9652adc6f381d24ba5589cc5e51849df4ced3d3e004a7d40ed5 + version: 2.4.4 + resolution: "@types/normalize-package-data@npm:2.4.4" + checksum: 65dff72b543997b7be8b0265eca7ace0e34b75c3e5fee31de11179d08fa7124a7a5587265d53d0409532ecb7f7fba662c2012807963e1f9b059653ec2c83ee05 languageName: node linkType: hard -"JSONStream@npm:^1.0.4": +"JSONStream@npm:^1.3.5": version: 1.3.5 resolution: "JSONStream@npm:1.3.5" dependencies: @@ -333,18 +334,18 @@ __metadata: linkType: hard "acorn-walk@npm:^8.1.1": - version: 8.2.0 - resolution: "acorn-walk@npm:8.2.0" - checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1 + version: 8.3.1 + resolution: "acorn-walk@npm:8.3.1" + checksum: 5c8926ddb5400bc825b6baca782931f9df4ace603ba1a517f5243290fd9cdb089d52877840687b5d5c939591ebc314e2e63721514feaa37c6829c828f2b940ce languageName: node linkType: hard "acorn@npm:^8.4.1": - version: 8.8.2 - resolution: "acorn@npm:8.8.2" + version: 8.11.2 + resolution: "acorn@npm:8.11.2" bin: acorn: bin/acorn - checksum: f790b99a1bf63ef160c967e23c46feea7787e531292bb827126334612c234ed489a0dc2c7ba33156416f0ffa8d25bf2b0fdb7f35c2ba60eb3e960572bece4001 + checksum: 818450408684da89423e3daae24e4dc9b68692db8ab49ea4569c7c5abb7a3f23669438bf129cc81dfdada95e1c9b944ee1bfca2c57a05a4dc73834a612fbf6a7 languageName: node linkType: hard @@ -454,7 +455,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^2.0.0": +"chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" dependencies: @@ -528,64 +529,64 @@ __metadata: languageName: node linkType: hard -"conventional-changelog-angular@npm:^5.0.11": - version: 5.0.13 - resolution: "conventional-changelog-angular@npm:5.0.13" +"conventional-changelog-angular@npm:^6.0.0": + version: 6.0.0 + resolution: "conventional-changelog-angular@npm:6.0.0" dependencies: compare-func: ^2.0.0 - q: ^1.5.1 - checksum: 6ed4972fce25a50f9f038c749cc9db501363131b0fb2efc1fccecba14e4b1c80651d0d758d4c350a609f32010c66fa343eefd49c02e79e911884be28f53f3f90 + checksum: ddc59ead53a45b817d83208200967f5340866782b8362d5e2e34105fdfa3d3a31585ebbdec7750bdb9de53da869f847e8ca96634a9801f51e27ecf4e7ffe2bad languageName: node linkType: hard -"conventional-changelog-conventionalcommits@npm:^5.0.0": - version: 5.0.0 - resolution: "conventional-changelog-conventionalcommits@npm:5.0.0" +"conventional-changelog-conventionalcommits@npm:^6.1.0": + version: 6.1.0 + resolution: "conventional-changelog-conventionalcommits@npm:6.1.0" dependencies: compare-func: ^2.0.0 - lodash: ^4.17.15 - q: ^1.5.1 - checksum: b67d12e4e0fdde5baa32c3d77af472de38646a18657b26f5543eecce041a318103092fbfcef247e2319a16957c9ac78c6ea78acc11a5db6acf74be79a28c561f + checksum: 4383a35cdf72f5964e194a1146e7f78276e301f73bd993b71627bb93586b6470d411b9613507ceb37e0fed0b023199c95e941541fa47172b4e6a7916fc3a53ff languageName: node linkType: hard -"conventional-commits-parser@npm:^3.2.2": - version: 3.2.4 - resolution: "conventional-commits-parser@npm:3.2.4" +"conventional-commits-parser@npm:^4.0.0": + version: 4.0.0 + resolution: "conventional-commits-parser@npm:4.0.0" dependencies: - JSONStream: ^1.0.4 + JSONStream: ^1.3.5 is-text-path: ^1.0.1 - lodash: ^4.17.15 - meow: ^8.0.0 - split2: ^3.0.0 - through2: ^4.0.0 + meow: ^8.1.2 + split2: ^3.2.2 bin: conventional-commits-parser: cli.js - checksum: 1627ff203bc9586d89e47a7fe63acecf339aba74903b9114e23d28094f79d4e2d6389bf146ae561461dcba8fc42e7bc228165d2b173f15756c43f1d32bc50bfd + checksum: 12d95b5ba8e0710a6d3cd2e01f01dd7818fdf0bb2b33f4b75444e2c9aee49598776b0706a528ed49e83aec5f1896c32cbc7f8e6589f61a15187293707448f928 languageName: node linkType: hard "cosmiconfig-typescript-loader@npm:^4.0.0": - version: 4.3.0 - resolution: "cosmiconfig-typescript-loader@npm:4.3.0" + version: 4.4.0 + resolution: "cosmiconfig-typescript-loader@npm:4.4.0" peerDependencies: "@types/node": "*" cosmiconfig: ">=7" ts-node: ">=10" - typescript: ">=3" - checksum: ea61dfd8e112cf2bb18df0ef89280bd3ae3dd5b997b4a9fc22bbabdc02513aadfbc6d4e15e922b6a9a5d987e9dad42286fa38caf77a9b8dcdbe7d4ce1c9db4fb + typescript: ">=4" + checksum: d6ba546de333f9440226ab2384a7b5355d8d2e278a9ca9d838664181bc27719764af10c69eec6f07189e63121e6d654235c374bd7dc455ac8dfdef3aad6657fd languageName: node linkType: hard "cosmiconfig@npm:^8.0.0": - version: 8.1.3 - resolution: "cosmiconfig@npm:8.1.3" + version: 8.3.6 + resolution: "cosmiconfig@npm:8.3.6" dependencies: - import-fresh: ^3.2.1 + import-fresh: ^3.3.0 js-yaml: ^4.1.0 - parse-json: ^5.0.0 + parse-json: ^5.2.0 path-type: ^4.0.0 - checksum: b3d277bc3a8a9e649bf4c3fc9740f4c52bf07387481302aa79839f595045368903bf26ea24a8f7f7b8b180bf46037b027c5cb63b1391ab099f3f78814a147b2b + peerDependencies: + typescript: ">=4.9.5" + peerDependenciesMeta: + typescript: + optional: true + checksum: dc339ebea427898c9e03bf01b56ba7afbac07fc7d2a2d5a15d6e9c14de98275a9565da949375aee1809591c152c0a3877bb86dbeaf74d5bd5aaa79955ad9e7a0 languageName: node linkType: hard @@ -722,20 +723,20 @@ __metadata: linkType: hard "fs-extra@npm:^11.0.0": - version: 11.1.1 - resolution: "fs-extra@npm:11.1.1" + version: 11.2.0 + resolution: "fs-extra@npm:11.2.0" dependencies: graceful-fs: ^4.2.0 jsonfile: ^6.0.1 universalify: ^2.0.0 - checksum: fb883c68245b2d777fbc1f2082c9efb084eaa2bbf9fddaa366130d196c03608eebef7fb490541276429ee1ca99f317e2d73e96f5ca0999eefedf5a624ae1edfd + checksum: b12e42fa40ba47104202f57b8480dd098aa931c2724565e5e70779ab87605665594e76ee5fb00545f772ab9ace167fe06d2ab009c416dc8c842c5ae6df7aa7e8 languageName: node linkType: hard -"function-bind@npm:^1.1.1": - version: 1.1.1 - resolution: "function-bind@npm:1.1.1" - checksum: b32fbaebb3f8ec4969f033073b43f5c8befbb58f1a79e12f1d7490358150359ebd92f49e72ff0144f65f2c48ea2a605bff2d07965f548f6474fd8efd95bf361a +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 2b0ff4ce708d99715ad14a6d1f894e2a83242e4a52ccfcefaee5e40050562e5f6dafc1adbb4ce2d4ab47279a45dc736ab91ea5042d843c3c092820dfe032efb1 languageName: node linkType: hard @@ -805,15 +806,6 @@ __metadata: languageName: node linkType: hard -"has@npm:^1.0.3": - version: 1.0.3 - resolution: "has@npm:1.0.3" - dependencies: - function-bind: ^1.1.1 - checksum: b9ad53d53be4af90ce5d1c38331e712522417d017d5ef1ebd0507e07c2fbad8686fffb8e12ddecd4c39ca9b9b47431afbb975b8abf7f3c3b82c98e9aad052792 - languageName: node - linkType: hard - "hashi@workspace:.": version: 0.0.0-use.local resolution: "hashi@workspace:." @@ -826,6 +818,15 @@ __metadata: languageName: unknown linkType: soft +"hasown@npm:^2.0.0": + version: 2.0.0 + resolution: "hasown@npm:2.0.0" + dependencies: + function-bind: ^1.1.2 + checksum: 6151c75ca12554565098641c98a40f4cc86b85b0fd5b6fe92360967e4605a4f9610f7757260b4e8098dd1c2ce7f4b095f2006fe72a570e3b6d2d28de0298c176 + languageName: node + linkType: hard + "hosted-git-info@npm:^2.1.4": version: 2.8.9 resolution: "hosted-git-info@npm:2.8.9" @@ -858,7 +859,7 @@ __metadata: languageName: node linkType: hard -"import-fresh@npm:^3.0.0, import-fresh@npm:^3.2.1": +"import-fresh@npm:^3.0.0, import-fresh@npm:^3.3.0": version: 3.3.0 resolution: "import-fresh@npm:3.3.0" dependencies: @@ -896,12 +897,12 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.5.0, is-core-module@npm:^2.9.0": - version: 2.11.0 - resolution: "is-core-module@npm:2.11.0" +"is-core-module@npm:^2.13.0, is-core-module@npm:^2.5.0": + version: 2.13.1 + resolution: "is-core-module@npm:2.13.1" dependencies: - has: ^1.0.3 - checksum: f96fd490c6b48eb4f6d10ba815c6ef13f410b0ba6f7eb8577af51697de523e5f2cd9de1c441b51d27251bf0e4aebc936545e33a5d26d5d51f28d25698d4a8bab + hasown: ^2.0.0 + checksum: 256559ee8a9488af90e4bad16f5583c6d59e92f0742e9e8bb4331e758521ee86b810b93bae44f390766ffbc518a0488b18d9dab7da9a5ff997d499efc9403f7c languageName: node linkType: hard @@ -1140,7 +1141,7 @@ __metadata: languageName: node linkType: hard -"meow@npm:^8.0.0": +"meow@npm:^8.0.0, meow@npm:^8.1.2": version: 8.1.2 resolution: "meow@npm:8.1.2" dependencies: @@ -1292,7 +1293,7 @@ __metadata: languageName: node linkType: hard -"parse-json@npm:^5.0.0": +"parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": version: 5.2.0 resolution: "parse-json@npm:5.2.0" dependencies: @@ -1333,38 +1334,31 @@ __metadata: linkType: hard "prettier-plugin-solidity@npm:^1.0.0": - version: 1.1.3 - resolution: "prettier-plugin-solidity@npm:1.1.3" + version: 1.2.0 + resolution: "prettier-plugin-solidity@npm:1.2.0" dependencies: - "@solidity-parser/parser": ^0.16.0 - semver: ^7.3.8 + "@solidity-parser/parser": ^0.16.2 + semver: ^7.5.4 solidity-comments-extractor: ^0.0.7 peerDependencies: - prettier: ">=2.3.0 || >=3.0.0-alpha.0" - checksum: d5aadfa411a4d983a2bd204048726fd91fbcaffbfa26d818ef0d6001fb65f82d0eae082e935e96c79e65e09ed979b186311ddb8c38be2f0ce5dd5f5265df77fe + prettier: ">=2.3.0" + checksum: 96dc9751a7393dfbfb1fcc08d662fd8e69df9ddf51ad70172e6915e86a61491f93f3051ea716deb50ae6023f50b64aa064ffef81224405fba92566124250edb2 languageName: node linkType: hard "prettier@npm:^2.8.7": - version: 2.8.7 - resolution: "prettier@npm:2.8.7" + version: 2.8.8 + resolution: "prettier@npm:2.8.8" bin: prettier: bin-prettier.js - checksum: fdc8f2616f099f5f0d685907f4449a70595a0fc1d081a88919604375989e0d5e9168d6121d8cc6861f21990b31665828e00472544d785d5940ea08a17660c3a6 + checksum: b49e409431bf129dd89238d64299ba80717b57ff5a6d1c1a8b1a28b590d998a34e083fa13573bc732bb8d2305becb4c9a4407f8486c81fa7d55100eb08263cf8 languageName: node linkType: hard "punycode@npm:^2.1.0": - version: 2.3.0 - resolution: "punycode@npm:2.3.0" - checksum: 39f760e09a2a3bbfe8f5287cf733ecdad69d6af2fe6f97ca95f24b8921858b91e9ea3c9eeec6e08cede96181b3bb33f95c6ffd8c77e63986508aa2e8159fa200 - languageName: node - linkType: hard - -"q@npm:^1.5.1": - version: 1.5.1 - resolution: "q@npm:1.5.1" - checksum: 147baa93c805bc1200ed698bdf9c72e9e42c05f96d007e33a558b5fdfd63e5ea130e99313f28efc1783e90e6bdb4e48b67a36fcc026b7b09202437ae88a1fb12 + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: bb0a0ceedca4c3c57a9b981b90601579058903c62be23c5e8e843d2c2d4148a3ecf029d5133486fb0e1822b098ba8bba09e89d6b21742d02fa26bda6441a6fb2 languageName: node linkType: hard @@ -1457,28 +1451,28 @@ __metadata: linkType: hard "resolve@npm:^1.10.0": - version: 1.22.1 - resolution: "resolve@npm:1.22.1" + version: 1.22.8 + resolution: "resolve@npm:1.22.8" dependencies: - is-core-module: ^2.9.0 + is-core-module: ^2.13.0 path-parse: ^1.0.7 supports-preserve-symlinks-flag: ^1.0.0 bin: resolve: bin/resolve - checksum: 07af5fc1e81aa1d866cbc9e9460fbb67318a10fa3c4deadc35c3ad8a898ee9a71a86a65e4755ac3195e0ea0cfbe201eb323ebe655ce90526fd61917313a34e4e + checksum: f8a26958aa572c9b064562750b52131a37c29d072478ea32e129063e2da7f83e31f7f11e7087a18225a8561cfe8d2f0df9dbea7c9d331a897571c0a2527dbb4c languageName: node linkType: hard "resolve@patch:resolve@^1.10.0#~builtin": - version: 1.22.1 - resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=07638b" + version: 1.22.8 + resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin::version=1.22.8&hash=07638b" dependencies: - is-core-module: ^2.9.0 + is-core-module: ^2.13.0 path-parse: ^1.0.7 supports-preserve-symlinks-flag: ^1.0.0 bin: resolve: bin/resolve - checksum: 5656f4d0bedcf8eb52685c1abdf8fbe73a1603bb1160a24d716e27a57f6cecbe2432ff9c89c2bd57542c3a7b9d14b1882b73bfe2e9d7849c9a4c0b8b39f02b8b + checksum: 5479b7d431cacd5185f8db64bfcb7286ae5e31eb299f4c4f404ad8aa6098b77599563ac4257cb2c37a42f59dfc06a1bec2bcf283bb448f319e37f0feb9a09847 languageName: node linkType: hard @@ -1490,33 +1484,22 @@ __metadata: linkType: hard "semver@npm:2 || 3 || 4 || 5": - version: 5.7.1 - resolution: "semver@npm:5.7.1" + version: 5.7.2 + resolution: "semver@npm:5.7.2" bin: - semver: ./bin/semver - checksum: 57fd0acfd0bac382ee87cd52cd0aaa5af086a7dc8d60379dfe65fea491fb2489b6016400813930ecd61fd0952dae75c115287a1b16c234b1550887117744dfaf + semver: bin/semver + checksum: fb4ab5e0dd1c22ce0c937ea390b4a822147a9c53dbd2a9a0132f12fe382902beef4fbf12cf51bb955248d8d15874ce8cd89532569756384f994309825f10b686 languageName: node linkType: hard -"semver@npm:7.3.8, semver@npm:^7.3.4": - version: 7.3.8 - resolution: "semver@npm:7.3.8" +"semver@npm:7.5.4, semver@npm:^7.3.4, semver@npm:^7.5.4": + version: 7.5.4 + resolution: "semver@npm:7.5.4" dependencies: lru-cache: ^6.0.0 bin: semver: bin/semver.js - checksum: ba9c7cbbf2b7884696523450a61fee1a09930d888b7a8d7579025ad93d459b2d1949ee5bbfeb188b2be5f4ac163544c5e98491ad6152df34154feebc2cc337c1 - languageName: node - linkType: hard - -"semver@npm:^7.3.8": - version: 7.5.0 - resolution: "semver@npm:7.5.0" - dependencies: - lru-cache: ^6.0.0 - bin: - semver: bin/semver.js - checksum: 2d266937756689a76f124ffb4c1ea3e1bbb2b263219f90ada8a11aebebe1280b13bb76cca2ca96bdee3dbc554cbc0b24752eb895b2a51577aa644427e9229f2b + checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 languageName: node linkType: hard @@ -1595,13 +1578,13 @@ __metadata: linkType: hard "spdx-license-ids@npm:^3.0.0": - version: 3.0.13 - resolution: "spdx-license-ids@npm:3.0.13" - checksum: 3469d85c65f3245a279fa11afc250c3dca96e9e847f2f79d57f466940c5bb8495da08a542646086d499b7f24a74b8d0b42f3fc0f95d50ff99af1f599f6360ad7 + version: 3.0.16 + resolution: "spdx-license-ids@npm:3.0.16" + checksum: 5cdaa85aaa24bd02f9353a2e357b4df0a4f205cb35655f3fd0a5674a4fb77081f28ffd425379214bc3be2c2b7593ce1215df6bcc75884aeee0a9811207feabe2 languageName: node linkType: hard -"split2@npm:^3.0.0": +"split2@npm:^3.0.0, split2@npm:^3.2.2": version: 3.2.2 resolution: "split2@npm:3.2.2" dependencies: @@ -1769,30 +1752,30 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^4.6.4 || ^5.0.0": - version: 5.0.3 - resolution: "typescript@npm:5.0.3" +"typescript@npm:^4.6.4 || ^5.2.2": + version: 5.3.3 + resolution: "typescript@npm:5.3.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 3cce0576d218cb4277ff8b6adfef1a706e9114a98b4261a38ad658a7642f1b274a8396394f6cbff8c0ba852996d7ed2e233e9b8431d5d55ac7c2f6fea645af02 + checksum: 2007ccb6e51bbbf6fde0a78099efe04dc1c3dfbdff04ca3b6a8bc717991862b39fd6126c0c3ebf2d2d98ac5e960bcaa873826bb2bb241f14277034148f41f6a2 languageName: node linkType: hard -"typescript@patch:typescript@^4.6.4 || ^5.0.0#~builtin": - version: 5.0.3 - resolution: "typescript@patch:typescript@npm%3A5.0.3#~builtin::version=5.0.3&hash=7ad353" +"typescript@patch:typescript@^4.6.4 || ^5.2.2#~builtin": + version: 5.3.3 + resolution: "typescript@patch:typescript@npm%3A5.3.3#~builtin::version=5.3.3&hash=7ad353" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 9ec0a8eed38d46cc2c8794555b7674e413604c56c159f71b8ff21ce7f17334a44127a68724cb2ef8221ff3b19369f8f05654e8a5266621d7d962aeed889bd630 + checksum: f61375590b3162599f0f0d5b8737877ac0a7bc52761dbb585d67e7b8753a3a4c42d9a554c4cc929f591ffcf3a2b0602f65ae3ce74714fd5652623a816862b610 languageName: node linkType: hard "universalify@npm:^2.0.0": - version: 2.0.0 - resolution: "universalify@npm:2.0.0" - checksum: 2406a4edf4a8830aa6813278bab1f953a8e40f2f63a37873ffa9a3bc8f9745d06cc8e88f3572cb899b7e509013f7f6fcc3e37e8a6d914167a5381d8440518c44 + version: 2.0.1 + resolution: "universalify@npm:2.0.1" + checksum: ecd8469fe0db28e7de9e5289d32bd1b6ba8f7183db34f3bfc4ca53c49891c2d6aa05f3fb3936a81285a905cc509fb641a0c3fc131ec786167eff41236ae32e60 languageName: node linkType: hard @@ -1880,8 +1863,8 @@ __metadata: linkType: hard "yargs@npm:^17.0.0": - version: 17.7.1 - resolution: "yargs@npm:17.7.1" + version: 17.7.2 + resolution: "yargs@npm:17.7.2" dependencies: cliui: ^8.0.1 escalade: ^3.1.1 @@ -1890,7 +1873,7 @@ __metadata: string-width: ^4.2.3 y18n: ^5.0.5 yargs-parser: ^21.1.1 - checksum: 3d8a43c336a4942bc68080768664aca85c7bd406f018bad362fd255c41c8f4e650277f42fd65d543fce99e084124ddafee7bbfc1a5c6a8fda4cec78609dcf8d4 + checksum: 73b572e863aa4a8cbef323dd911d79d193b772defd5a51aab0aca2d446655216f5002c42c5306033968193bdbf892a7a4c110b0d77954a7fdf563e653967b56a languageName: node linkType: hard From 11e7a86e460f6f41c796d473c6d9597e8161c178 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 7 Dec 2023 19:39:37 +0100 Subject: [PATCH 043/297] refactor(reporter): rm fs --- packages/reporter/src/utils/proofs.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/reporter/src/utils/proofs.ts b/packages/reporter/src/utils/proofs.ts index 3fa41b00..d1fdda7a 100644 --- a/packages/reporter/src/utils/proofs.ts +++ b/packages/reporter/src/utils/proofs.ts @@ -8,7 +8,6 @@ import { toHexString, fromHexString } from "@chainsafe/ssz" import { RLP } from "@ethereumjs/rlp" import { WalletClient, PublicClient, TransactionReceipt, Log } from "viem" import { Trie } from "@ethereumjs/trie" -import fs from "fs" const SLOTS_PER_HISTORICAL_ROOT = 8192 From 5993963229831d9b2083edcd70085876421174f6 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 7 Dec 2023 19:42:45 +0100 Subject: [PATCH 044/297] refactor(reporter): refactors getHeader --- packages/reporter/src/utils/proofs.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/reporter/src/utils/proofs.ts b/packages/reporter/src/utils/proofs.ts index d1fdda7a..77c17251 100644 --- a/packages/reporter/src/utils/proofs.ts +++ b/packages/reporter/src/utils/proofs.ts @@ -27,8 +27,7 @@ export const getState = async (_stateId: BeaconId, _client: AxiosInstance): Prom export const getHeader = async (_blockId: BeaconId, _client: AxiosInstance): Promise => { const { data } = await _client.get(`/eth/v1/beacon/headers/${toStringFromBeaconId(_blockId)}`) - const header = ssz.phase0.BeaconBlockHeader.fromJson(data.data.header.message) - return header + return ssz.phase0.BeaconBlockHeader.fromJson(data.data.header.message) } export const getReceiptsRootProof = async (_srcBlockId: BeaconId, _targetBlockId: BeaconId, _client: AxiosInstance) => { From dfde4baa5a4fd25768aa537c21513f4a8e96e229 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 22 Jan 2024 16:15:33 +0100 Subject: [PATCH 045/297] chore(evm): rm NaiveTokenBridge and zodiac --- .../evm/contracts/test/NaiveTokenBridge.sol | 129 -------------- packages/evm/contracts/zodiac/HashiModule.sol | 104 ------------ .../evm/contracts/zodiac/test/TestAvatar.sol | 34 ---- .../evm/contracts/zodiac/test/TestFactory.sol | 4 - .../evm/test/test/00_NaiveTokenBridge.spec.ts | 159 ------------------ 5 files changed, 430 deletions(-) delete mode 100644 packages/evm/contracts/test/NaiveTokenBridge.sol delete mode 100644 packages/evm/contracts/zodiac/HashiModule.sol delete mode 100644 packages/evm/contracts/zodiac/test/TestAvatar.sol delete mode 100644 packages/evm/contracts/zodiac/test/TestFactory.sol delete mode 100644 packages/evm/test/test/00_NaiveTokenBridge.spec.ts diff --git a/packages/evm/contracts/test/NaiveTokenBridge.sol b/packages/evm/contracts/test/NaiveTokenBridge.sol deleted file mode 100644 index 152b341a..00000000 --- a/packages/evm/contracts/test/NaiveTokenBridge.sol +++ /dev/null @@ -1,129 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; -import { ERC20Upgradeable } from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; -import { SafeERC20Upgradeable } from "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; -import { AddressUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; -import { LocalToken } from "./LocalToken.sol"; -import { Yaho, Message } from "../Yaho.sol"; -import { Yaru } from "../Yaru.sol"; - -contract NaiveTokenBridge is OwnableUpgradeable { - using SafeERC20Upgradeable for ERC20Upgradeable; - - Yaho public yaho; - Yaru public yaru; - uint256 public destinationChain; - address public twin; - mapping(address => address) public tokenTwins; - - event TokensBridged(address emitter, address token, address receiver, uint256 amount); - event TokensReleased(address emitter, address token, address receiver, uint256 amount); - - error InsuffientTokenBalance(address emitter, address sender, address token, uint256 amount); - error InvalidCaller(address emitter, address caller); - error InvalidSender(address emitter, address sender); - - constructor(address _owner, Yaho _yaho, Yaru _yaru, uint256 _destinationChain) { - initialize(_owner, _yaho, _yaru, _destinationChain); - } - - function initialize(address _owner, Yaho _yaho, Yaru _yaru, uint256 _destinationChain) public initializer { - yaho = _yaho; - yaru = _yaru; - destinationChain = _destinationChain; - __Ownable_init(); - transferOwnership(_owner); - } - - function setTwin(address _twin) public onlyOwner { - twin = _twin; - } - - modifier onlyValid() { - if (msg.sender != address(yaru)) revert InvalidCaller(address(this), msg.sender); - if (yaru.sender() != twin) revert InvalidSender(address(this), yaru.sender()); - _; - } - - /// calls yaho.dispatchMessage with a payload to trigger twin.releaseTokens - function bridgeTokens(address token, address receiver, uint256 amount) external returns (bytes32 messageId) { - if (ERC20Upgradeable(token).allowance(msg.sender, address(this)) < amount) - revert InsuffientTokenBalance(address(this), msg.sender, token, amount); - - ERC20Upgradeable(token).transferFrom(msg.sender, address(this), amount); - - address tokenTwin = tokenTwins[token]; - bytes memory data; - if (tokenTwin != address(0)) { - LocalToken(token).burn(amount); - data = abi.encodeCall(NaiveTokenBridge.releaseTokens, (tokenTwin, receiver, amount)); - } else { - data = abi.encodeCall( - NaiveTokenBridge.mintTokens, - (token, receiver, amount, ERC20Upgradeable(token).name(), ERC20Upgradeable(token).symbol()) - ); - } - - Message[] memory messages = new Message[](1); - messages[0] = Message({ to: twin, toChainId: destinationChain, data: data }); - bytes32[] memory messageIds = new bytes32[](1); - messageIds = yaho.dispatchMessages(messages); - messageId = messageIds[0]; - - emit TokensBridged(address(this), token, receiver, amount); - } - - /// called by yaru.executeMessages, only callable by yaru and if yaru.sender == twin - function releaseTokens(address token, address receiver, uint256 amount) external onlyValid { - ERC20Upgradeable(token).transfer(receiver, amount); - emit TokensReleased(address(this), token, receiver, amount); - } - - function mintTokens( - address token, - address receiver, - uint256 amount, - string memory name, - string memory symbol - ) external onlyValid { - address calculatedAddress = calculateTokenTwinAddress( - address(this), - token, - ERC20Upgradeable(token).name(), - ERC20Upgradeable(token).symbol() - ); - - /// if no code is deployed at address, deploy new token. - if (!AddressUpgradeable.isContract(calculatedAddress)) { - address localToken = address(new LocalToken{ salt: keccak256(abi.encode(token)) }(name, symbol)); - tokenTwins[calculatedAddress] = token; - require(localToken == calculatedAddress, "not equal"); - } - LocalToken(calculatedAddress).mint(receiver, amount); - emit TokensReleased(address(this), token, receiver, amount); - } - - function calculateTokenTwinAddress( - address creator, - address token, - string memory name, - string memory symbol - ) public pure returns (address calculatedAddress) { - calculatedAddress = address( - uint160( - uint256( - keccak256( - abi.encodePacked( - bytes1(0xff), - creator, - keccak256(abi.encode(token)), - keccak256(abi.encodePacked(type(LocalToken).creationCode, abi.encode(name, symbol))) - ) - ) - ) - ) - ); - } -} diff --git a/packages/evm/contracts/zodiac/HashiModule.sol b/packages/evm/contracts/zodiac/HashiModule.sol deleted file mode 100644 index 80220c8f..00000000 --- a/packages/evm/contracts/zodiac/HashiModule.sol +++ /dev/null @@ -1,104 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { Yaru } from "../Yaru.sol"; -import { Module, Enum } from "@gnosis.pm/zodiac/contracts/core/Module.sol"; - -contract HashiModule is Module { - event HashiModuleSetup(address indexed initiator, address indexed owner, address indexed avatar, address target); - event YaruSet(address emitter, address yaru); - event ChainIdSet(address emitter, uint256 chainId); - event ControllerSet(address emitter, address controller); - - error AvatarCannotBeZero(address emitter); - error TargetCannotBeZero(address emitter); - error UnauthorizedChainId(address emitter, uint256 chainId); - error UnauthorizedYaru(address emitter, address yaru); - error UnauthorizedController(address emitter, address sender); - error DuplicateYaru(address emitter, address yaru); - error DuplicateChainId(address emitter, uint256 chainId); - error DuplicateController(address emitter, address controller); - error ModuleTransactionFailed(address emitter); - - Yaru public yaru; - address public controller; - uint256 public chainId; - - /// @param _owner Address of the owner - /// @param _avatar Address of the avatar (e.g. a Safe) - /// @param _target Address of the contract that will call exec function - /// @param _yaru Address of the Yaru contract - /// @param _controller Address of the authorized controller contract on the other side of the bridge - /// @param _chainId Address of the authorized chainId from which owner can initiate transactions - constructor(address _owner, address _avatar, address _target, Yaru _yaru, address _controller, uint256 _chainId) { - bytes memory initParams = abi.encode(_owner, _avatar, _target, _yaru, _controller, _chainId); - setUp(initParams); - } - - function setUp(bytes memory initParams) public override initializer { - (address _owner, address _avatar, address _target, Yaru _yaru, address _controller, uint256 _chainId) = abi - .decode(initParams, (address, address, address, Yaru, address, uint256)); - __Ownable_init(); - - if (_avatar == address(0)) revert AvatarCannotBeZero(address(this)); - if (_target == address(0)) revert TargetCannotBeZero(address(this)); - avatar = _avatar; - target = _target; - yaru = _yaru; - controller = _controller; - chainId = _chainId; - - transferOwnership(_owner); - - emit HashiModuleSetup(msg.sender, _owner, _avatar, _target); - } - - /// @dev Check that the yaru, chainId, and owner are valid - modifier onlyValid() { - if (msg.sender != address(yaru)) revert UnauthorizedYaru(address(this), msg.sender); - if (yaru.chainId() != chainId) revert UnauthorizedChainId(address(this), yaru.chainId()); - if (yaru.sender() != controller) revert UnauthorizedController(address(this), yaru.sender()); - _; - } - - /// @dev Set the Yaru contract address - /// @param _yaru Address of the Yaru contract - /// @notice This can only be called by the owner - function setYaru(address _yaru) public onlyOwner { - if (_yaru == address(yaru)) revert DuplicateYaru(address(this), _yaru); - yaru = Yaru(_yaru); - emit YaruSet(address(this), _yaru); - } - - /// @dev Set the approved chainId - /// @param _chainId ID of the approved network - /// @notice This can only be called by the owner - function setChainId(uint256 _chainId) public onlyOwner { - if (_chainId == chainId) revert DuplicateChainId(address(this), _chainId); - chainId = _chainId; - emit ChainIdSet(address(this), _chainId); - } - - /// @dev Set the controller address - /// @param _controller Set the address of controller on the other side of the bridge - /// @notice This can only be called by the owner - function setController(address _controller) public onlyOwner { - if (_controller == controller) revert DuplicateController(address(this), _controller); - controller = _controller; - emit ControllerSet(address(this), _controller); - } - - /// @dev Executes a transaction initated by the Yaru - /// @param to Target of the transaction that should be executed - /// @param value Wei value of the transaction that should be executed - /// @param data Data of the transaction that should be executed - /// @param operation Operation (Call or Delegatecall) of the transaction that should be executed - function executeTransaction( - address to, - uint256 value, - bytes memory data, - Enum.Operation operation - ) public onlyValid { - if (!exec(to, value, data, operation)) revert ModuleTransactionFailed(address(this)); - } -} diff --git a/packages/evm/contracts/zodiac/test/TestAvatar.sol b/packages/evm/contracts/zodiac/test/TestAvatar.sol deleted file mode 100644 index 07815d32..00000000 --- a/packages/evm/contracts/zodiac/test/TestAvatar.sol +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -contract TestAvatar { - address public module; - - receive() external payable {} - - function setModule(address _module) external { - module = _module; - } - - function exec(address payable to, uint256 value, bytes calldata data) external { - bool success; - bytes memory response; - (success, response) = to.call{ value: value }(data); - if (!success) { - assembly { - revert(add(response, 0x20), mload(response)) - } - } - } - - function execTransactionFromModule( - address payable to, - uint256 value, - bytes calldata data, - uint8 operation - ) external returns (bool success) { - require(msg.sender == module, "Not authorized"); - if (operation == 1) (success, ) = to.delegatecall(data); - else (success, ) = to.call{ value: value }(data); - } -} diff --git a/packages/evm/contracts/zodiac/test/TestFactory.sol b/packages/evm/contracts/zodiac/test/TestFactory.sol deleted file mode 100644 index 4b07d374..00000000 --- a/packages/evm/contracts/zodiac/test/TestFactory.sol +++ /dev/null @@ -1,4 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { ModuleProxyFactory } from "@gnosis.pm/zodiac/contracts/factory/ModuleProxyFactory.sol"; diff --git a/packages/evm/test/test/00_NaiveTokenBridge.spec.ts b/packages/evm/test/test/00_NaiveTokenBridge.spec.ts deleted file mode 100644 index 313a507f..00000000 --- a/packages/evm/test/test/00_NaiveTokenBridge.spec.ts +++ /dev/null @@ -1,159 +0,0 @@ -import { expect } from "chai" -import { ethers, network } from "hardhat" - -const DOMAIN_ID = network.config.chainId -const BYTES32_DOMAIN_ID = "0x0000000000000000000000000000000000000000000000000000000000007A69" -const AMOUNT = 500 - -const setup = async () => { - const [wallet] = await ethers.getSigners() - - // deploy hashi - const Hashi = await ethers.getContractFactory("Hashi") - const hashi = await Hashi.deploy() - - // deploy ShoyuBashi - const ShoyuBashi = await ethers.getContractFactory("ShoyuBashi") - const shoyuBashi = ShoyuBashi.deploy(wallet.address, hashi.address) - - // deploy Yaho - const Yaho = await ethers.getContractFactory("Yaho") - const yaho = await Yaho.deploy() - - // deploy AMB - const AMB = await ethers.getContractFactory("MockAMB") - const amb = await AMB.deploy() - - // deploy Yaru - const Yaru = await ethers.getContractFactory("Yaru") - const yaru = await Yaru.deploy(hashi.address, yaho.address, DOMAIN_ID) - - // deploy Oracle Adapter - const AMBMessageRelay = await ethers.getContractFactory("AMBMessageRelay") - const ambMessageRelay = await AMBMessageRelay.deploy(amb.address, yaho.address) - const AMBAdapter = await ethers.getContractFactory("AMBAdapter") - const ambAdapter = await AMBAdapter.deploy(amb.address, ambMessageRelay.address, BYTES32_DOMAIN_ID) - - // deploy NaiveTokenBridges - const NaiveTokenBridge = await ethers.getContractFactory("NaiveTokenBridge") - const tokenBridgeOne = await NaiveTokenBridge.deploy(wallet.address, yaho.address, yaru.address, DOMAIN_ID) - const tokenBridgeTwo = await NaiveTokenBridge.deploy(wallet.address, yaho.address, yaru.address, DOMAIN_ID) - await tokenBridgeOne.setTwin(tokenBridgeTwo.address) - await tokenBridgeTwo.setTwin(tokenBridgeOne.address) - - // deploy token - const ERC20Token = await ethers.getContractFactory("LocalToken") - const erc20Token = await ERC20Token.deploy("Token", "TKN") - await erc20Token.mint(wallet.address, AMOUNT) - - return { - amb, - wallet, - hashi, - shoyuBashi, - yaho, - yaru, - tokenBridgeOne, - tokenBridgeTwo, - erc20Token, - ambMessageRelay, - ambAdapter, - } -} - -describe("Naive Token Bridge", function () { - describe("End-to-end", function () { - it("Bridges canonical tokens to mint new local tokens", async function () { - const { tokenBridgeOne, tokenBridgeTwo, erc20Token, wallet, yaho, yaru, ambMessageRelay, ambAdapter } = - await setup() - const predictedAddress = await tokenBridgeOne.calculateTokenTwinAddress( - tokenBridgeTwo.address, - erc20Token.address, - await erc20Token.name(), - await erc20Token.symbol(), - ) - - await erc20Token.approve(tokenBridgeOne.address, await erc20Token.balanceOf(wallet.address)) - - const messageId = await tokenBridgeOne.callStatic.bridgeTokens(erc20Token.address, wallet.address, AMOUNT) - await tokenBridgeOne.bridgeTokens(erc20Token.address, wallet.address, AMOUNT) - await yaho.relayMessagesToAdapters([messageId], [ambMessageRelay.address], [ambAdapter.address]) - - const call = await tokenBridgeTwo.populateTransaction.mintTokens( - erc20Token.address, - wallet.address, - AMOUNT, - await erc20Token.name(), - await erc20Token.symbol(), - ) - const message = { - to: tokenBridgeTwo.address, - toChainId: DOMAIN_ID, - data: call.data, - } - - await yaru.executeMessages([message], [messageId], [tokenBridgeOne.address], [ambAdapter.address]) - - const twinToken = await ethers.getContractAt("LocalToken", predictedAddress) - expect(await erc20Token.balanceOf(wallet.address)).to.equal(0) - expect(await erc20Token.balanceOf(tokenBridgeOne.address)).to.equal(AMOUNT) - expect(await twinToken.balanceOf(wallet.address)).to.equal(AMOUNT) - }) - - it("Burns local tokens to release canonical tokens", async function () { - const { tokenBridgeOne, tokenBridgeTwo, erc20Token, wallet, yaho, yaru, ambMessageRelay, ambAdapter } = - await setup() - const predictedAddress = await tokenBridgeOne.calculateTokenTwinAddress( - tokenBridgeTwo.address, - erc20Token.address, - await erc20Token.name(), - await erc20Token.symbol(), - ) - - await erc20Token.approve(tokenBridgeOne.address, await erc20Token.balanceOf(wallet.address)) - - const messageIdOne = await tokenBridgeOne.callStatic.bridgeTokens(erc20Token.address, wallet.address, AMOUNT) - await tokenBridgeOne.bridgeTokens(erc20Token.address, wallet.address, AMOUNT) - await yaho.relayMessagesToAdapters([messageIdOne], [ambMessageRelay.address], [ambAdapter.address]) - - const callOne = await tokenBridgeTwo.populateTransaction.mintTokens( - erc20Token.address, - wallet.address, - AMOUNT, - await erc20Token.name(), - await erc20Token.symbol(), - ) - const messageOne = { - to: tokenBridgeTwo.address, - toChainId: DOMAIN_ID, - data: callOne.data, - } - - await yaru.executeMessages([messageOne], [messageIdOne], [tokenBridgeOne.address], [ambAdapter.address]) - - const twinToken = await ethers.getContractAt("LocalToken", predictedAddress) - expect(await twinToken.balanceOf(wallet.address)).to.equal(AMOUNT) - - await twinToken.approve(tokenBridgeTwo.address, twinToken.balanceOf(wallet.address)) - - const messageIdTwo = await tokenBridgeTwo.callStatic.bridgeTokens(twinToken.address, wallet.address, AMOUNT) - await tokenBridgeTwo.bridgeTokens(twinToken.address, wallet.address, AMOUNT) - - await yaho.relayMessagesToAdapters([messageIdTwo], [ambMessageRelay.address], [ambAdapter.address]) - - const callTwo = await tokenBridgeOne.populateTransaction.releaseTokens(erc20Token.address, wallet.address, AMOUNT) - const messageTwo = { - to: tokenBridgeOne.address, - toChainId: DOMAIN_ID, - data: callTwo.data, - } - - await yaru.executeMessages([messageTwo], [messageIdTwo], [tokenBridgeTwo.address], [ambAdapter.address]) - - expect(await twinToken.totalSupply()).to.equal(0) - expect(await erc20Token.totalSupply()).to.equal(AMOUNT) - expect(await erc20Token.balanceOf(tokenBridgeOne.address)).to.equal(0) - expect(await erc20Token.balanceOf(wallet.address)).to.equal(AMOUNT) - }) - }) -}) From 652e508c312baaf33345a3ccabace820e869aab0 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 23 Jan 2024 15:58:50 +0100 Subject: [PATCH 046/297] feat(evm): changes Message struct --- packages/evm/contracts/interfaces/IMessage.sol | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/evm/contracts/interfaces/IMessage.sol b/packages/evm/contracts/interfaces/IMessage.sol index ba87b8ce..8d36be62 100644 --- a/packages/evm/contracts/interfaces/IMessage.sol +++ b/packages/evm/contracts/interfaces/IMessage.sol @@ -1,8 +1,15 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; +import { IOracleAdapter } from "./IOracleAdapter.sol"; + struct Message { - address to; + bytes32 salt; uint256 toChainId; + uint256 threshold; + address sender; + address receiver; bytes data; + address[] reporters; + IOracleAdapter[] adapters; } From 7c30db019405a3bf81b2ca00839ef4203b68551a Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 23 Jan 2024 16:00:35 +0100 Subject: [PATCH 047/297] feat(evm): adapts Yaho based on new Message struct --- packages/evm/contracts/Yaho.sol | 254 ++++++++++++++---- .../interfaces/IMessageDispatcher.sol | 16 -- .../interfaces/IMessageHashCalculator.sol | 8 + .../interfaces/IMessageIdCalculator.sol | 10 + .../evm/contracts/interfaces/IReporter.sol | 20 ++ packages/evm/contracts/interfaces/IYaho.sol | 58 ++-- .../contracts/utils/MessageHashCalculator.sol | 20 +- .../contracts/utils/MessageIdCalculator.sol | 15 ++ 8 files changed, 296 insertions(+), 105 deletions(-) delete mode 100644 packages/evm/contracts/interfaces/IMessageDispatcher.sol create mode 100644 packages/evm/contracts/interfaces/IMessageHashCalculator.sol create mode 100644 packages/evm/contracts/interfaces/IMessageIdCalculator.sol create mode 100644 packages/evm/contracts/interfaces/IReporter.sol create mode 100644 packages/evm/contracts/utils/MessageIdCalculator.sol diff --git a/packages/evm/contracts/Yaho.sol b/packages/evm/contracts/Yaho.sol index 2c812047..30f7f986 100644 --- a/packages/evm/contracts/Yaho.sol +++ b/packages/evm/contracts/Yaho.sol @@ -1,72 +1,212 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; -import { IMessageRelay } from "./interfaces/IMessageRelay.sol"; -import { Message } from "./interfaces/IMessageDispatcher.sol"; -import { IYaho } from "./interfaces/IYaho.sol"; +import { MessageIdCalculator } from "./utils/MessageIdCalculator.sol"; import { MessageHashCalculator } from "./utils/MessageHashCalculator.sol"; +import { IYaho } from "./interfaces/IYaho.sol"; +import { IReporter } from "./interfaces/IReporter.sol"; +import { Message } from "./interfaces/IMessage.sol"; +import { IOracleAdapter } from "./interfaces/IOracleAdapter.sol"; -contract Yaho is IYaho, MessageHashCalculator { - mapping(uint256 => bytes32) public hashes; - uint256 private count; +contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { + mapping(uint256 => bytes32) private _pendingMessageHashes; - /// @dev Dispatches a batch of messages, putting their into storage and emitting their contents as an event. - /// @param messages An array of Messages to be dispatched. - /// @return messageIds An array of message IDs corresponding to the dispatched messages. - function dispatchMessages(Message[] memory messages) public payable returns (bytes32[] memory) { - if (messages.length == 0) revert NoMessagesGiven(address(this)); - bytes32[] memory messageIds = new bytes32[](messages.length); - for (uint256 i = 0; i < messages.length; i++) { - uint256 id = count; - hashes[id] = calculateHash(block.chainid, id, address(this), msg.sender, messages[i]); - messageIds[i] = bytes32(id); - emit MessageDispatched(bytes32(id), msg.sender, messages[i].toChainId, messages[i].to, messages[i].data); - count++; - } - return messageIds; + /// @inheritdoc IYaho + function dispatchMessage( + uint256 toChainId, + uint256 threshold, + address receiver, + bytes calldata data, + address[] calldata reporters, + IOracleAdapter[] calldata adapters + ) external returns (uint256) { + _checkReportersAndAdapters(threshold, reporters, adapters); + (uint256 messageId, ) = _dispatchMessage(toChainId, threshold, receiver, data, reporters, adapters); + return messageId; } - /// @dev Relays hashes of the given messageIds to the given adapters. - /// @param messageIds Array of IDs of the message hashes to relay to the given adapters. - /// @param adapters Array of relay adapter addresses to which hashes should be relayed. - /// @param destinationAdapters Array of oracle adapter addresses to receive hashes. - /// @return adapterReciepts Reciepts from each of the relay adapters. - function relayMessagesToAdapters( - uint256[] memory messageIds, - address[] memory adapters, - address[] memory destinationAdapters - ) external payable returns (bytes32[] memory) { - if (messageIds.length == 0) revert NoMessageIdsGiven(address(this)); - if (adapters.length == 0) revert NoAdaptersGiven(address(this)); - if (adapters.length != destinationAdapters.length) revert UnequalArrayLengths(address(this)); - bytes32[] memory adapterReciepts = new bytes32[](adapters.length); - for (uint256 i = 0; i < adapters.length; i++) { - adapterReciepts[i] = IMessageRelay(adapters[i]).relayMessages(messageIds, destinationAdapters[i]); - } - return adapterReciepts; + /// @inheritdoc IYaho + function dispatchMessageToAdapters( + uint256 toChainId, + uint256 threshold, + address receiver, + bytes calldata data, + address[] calldata reporters, + IOracleAdapter[] calldata adapters + ) external returns (uint256, bytes32[] memory) { + _checkReportersAndAdapters(threshold, reporters, adapters); + (uint256 messageId, bytes32 messageHash) = _dispatchMessage( + toChainId, + threshold, + receiver, + data, + reporters, + adapters + ); + bytes32[] memory reportersReceipts = _dispatchMessageToAdapters( + toChainId, + messageId, + messageHash, + reporters, + adapters + ); + return (messageId, reportersReceipts); } - /// @dev Dispatches an array of messages and relays their hashes to an array of relay adapters. - /// @param messages An array of Messages to be dispatched. - /// @param adapters Array of relay adapter addresses to which hashes should be relayed. - /// @param destinationAdapters Array of oracle adapter addresses to receive hashes. - /// @return messageIds An array of message IDs corresponding to the dispatched messages. - /// @return adapterReciepts Reciepts from each of the relay adapters. + /// @inheritdoc IYaho function dispatchMessagesToAdapters( - Message[] memory messages, - address[] memory adapters, - address[] memory destinationAdapters - ) external payable returns (bytes32[] memory messageIds, bytes32[] memory) { - if (adapters.length == 0) revert NoAdaptersGiven(address(this)); - messageIds = dispatchMessages(messages); - uint256[] memory uintIds = new uint256[](messageIds.length); - for (uint256 i = 0; i < messageIds.length; i++) { - uintIds[i] = uint256(messageIds[i]); + uint256 toChainId, + uint256[] calldata thresholds, + address[] calldata receivers, + bytes[] calldata data, + address[] calldata reporters, + IOracleAdapter[] calldata adapters + ) external payable returns (uint256[] memory, bytes32[] memory) { + if (thresholds.length != receivers.length) revert UnequalArrayLengths(thresholds.length, receivers.length); + if (thresholds.length != data.length) revert UnequalArrayLengths(thresholds.length, data.length); + + uint256[] memory messageIds = new uint256[](receivers.length); + bytes32[] memory messageHashes = new bytes32[](receivers.length); + for (uint256 i = 0; i < receivers.length; ) { + _checkReportersAndAdapters(thresholds[i], reporters, adapters); + + (messageIds[i], messageHashes[i]) = _dispatchMessage( + toChainId, + thresholds[i], + receivers[i], + data[i], + reporters, + adapters + ); + unchecked { + ++i; + } } - bytes32[] memory adapterReciepts = new bytes32[](adapters.length); - for (uint256 i = 0; i < adapters.length; i++) { - adapterReciepts[i] = IMessageRelay(adapters[i]).relayMessages(uintIds, destinationAdapters[i]); + + bytes32[] memory reportersReceipts = new bytes32[](reporters.length); + reportersReceipts = _dispatchMessagesToAdapters(toChainId, messageIds, messageHashes, reporters, adapters); + return (messageIds, reportersReceipts); + } + + /// @inheritdoc IYaho + function getPendingMessageHash(uint256 messageId) external view returns (bytes32) { + return _pendingMessageHashes[messageId]; + } + + /// @inheritdoc IYaho + function relayMessagesToAdapters(Message[] calldata messages) external payable returns (bytes32[] memory) { + if (messages.length == 0) revert NoMessagesGiven(); + + // NOTE: In order to be able to aggregate messages within the reporter, + // it's mandatory that all messages have the same toChainId, reporters and adapters. + bytes32 expectedParams = keccak256( + abi.encode(messages[0].toChainId, messages[0].reporters, messages[0].adapters) + ); + + bytes32[] memory messageHashes = new bytes32[](messages.length); + uint256[] memory messageIds = new uint256[](messages.length); + for (uint256 i = 0; i < messages.length; i++) { + Message memory message = messages[i]; + if ( + i > 0 && expectedParams != keccak256(abi.encode(message.toChainId, message.reporters, message.adapters)) + ) revert InvalidMessage(message); + uint256 messageId = calculateMessageId(block.chainid, address(this), calculateMessageHash(message)); + bytes32 messageHash = _pendingMessageHashes[messageId]; + if (messageHash == bytes32(0)) revert MessageHashNotFound(messageId); + messageHashes[i] = messageHash; + messageIds[i] = messageId; } - return (messageIds, adapterReciepts); + + return + _dispatchMessagesToAdapters( + messages[0].toChainId, + messageIds, + messageHashes, + messages[0].reporters, + messages[0].adapters + ); + } + + function _checkReportersAndAdapters( + uint256 threshold, + address[] calldata reporters, + IOracleAdapter[] calldata adapters + ) internal pure { + if (reporters.length == 0) revert NoReportersGiven(); + if (adapters.length == 0) revert NoAdaptersGiven(); + if (reporters.length != adapters.length) revert UnequalArrayLengths(reporters.length, adapters.length); + if (threshold > reporters.length || threshold == 0) revert InvalidThreshold(threshold, reporters.length); + } + + function _dispatchMessage( + uint256 toChainId, + uint256 threshold, + address receiver, + bytes calldata data, + address[] calldata reporters, + IOracleAdapter[] calldata adapters + ) internal returns (uint256, bytes32) { + address sender = msg.sender; + Message memory message = Message( + keccak256(abi.encode(blockhash(block.number - 1), gasleft())), + toChainId, + threshold, + sender, + receiver, + data, + reporters, + adapters + ); + bytes32 messageHash = calculateMessageHash(message); + uint256 messageId = calculateMessageId(block.chainid, address(this), messageHash); + _pendingMessageHashes[messageId] = messageHash; + emit MessageDispatched(messageId, message); + return (messageId, messageHash); + } + + function _dispatchMessageToAdapters( + uint256 toChainId, + uint256 messageId, + bytes32 messageHash, + address[] memory reporters, + IOracleAdapter[] memory adapters + ) internal returns (bytes32[] memory) { + uint256[] memory messageIds = new uint256[](1); + bytes32[] memory messageHashes = new bytes32[](1); + messageIds[0] = messageId; + messageHashes[0] = messageHash; + return _dispatchMessagesToAdapters(toChainId, messageIds, messageHashes, reporters, adapters); + } + + function _dispatchMessagesToAdapters( + uint256 toChainId, + uint256[] memory messageIds, + bytes32[] memory messageHashes, + address[] memory reporters, + IOracleAdapter[] memory adapters + ) internal returns (bytes32[] memory) { + bytes32[] memory reportersReceipts = new bytes32[](reporters.length); + + for (uint256 i = 0; i < reporters.length; ) { + reportersReceipts[i] = IReporter(reporters[i]).dispatchMessages( + toChainId, + adapters[i], + messageIds, + messageHashes + ); + + for (uint256 j = 0; j < messageIds.length; ) { + delete _pendingMessageHashes[messageIds[j]]; + unchecked { + ++j; + } + } + + unchecked { + ++i; + } + } + + return reportersReceipts; } } diff --git a/packages/evm/contracts/interfaces/IMessageDispatcher.sol b/packages/evm/contracts/interfaces/IMessageDispatcher.sol deleted file mode 100644 index d81a6d74..00000000 --- a/packages/evm/contracts/interfaces/IMessageDispatcher.sol +++ /dev/null @@ -1,16 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { Message } from "./IMessage.sol"; - -interface IMessageDispatcher { - event MessageDispatched( - bytes32 indexed messageId, - address indexed from, - uint256 indexed toChainId, - address to, - bytes data - ); - - function dispatchMessages(Message[] memory messages) external payable returns (bytes32[] memory messageIds); -} diff --git a/packages/evm/contracts/interfaces/IMessageHashCalculator.sol b/packages/evm/contracts/interfaces/IMessageHashCalculator.sol new file mode 100644 index 00000000..9644137d --- /dev/null +++ b/packages/evm/contracts/interfaces/IMessageHashCalculator.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity ^0.8.17; + +import { Message } from "./IMessage.sol"; + +interface IMessageHashCalculator { + function calculateMessageHash(Message memory message) external pure returns (bytes32); +} diff --git a/packages/evm/contracts/interfaces/IMessageIdCalculator.sol b/packages/evm/contracts/interfaces/IMessageIdCalculator.sol new file mode 100644 index 00000000..7d3c515b --- /dev/null +++ b/packages/evm/contracts/interfaces/IMessageIdCalculator.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity ^0.8.17; + +interface IMessageIdCalculator { + function calculateMessageId( + uint256 fromChainId, + address dispatcherAddress, + bytes32 messageHash + ) external pure returns (uint256); +} diff --git a/packages/evm/contracts/interfaces/IReporter.sol b/packages/evm/contracts/interfaces/IReporter.sol new file mode 100644 index 00000000..d81ffeac --- /dev/null +++ b/packages/evm/contracts/interfaces/IReporter.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity ^0.8.17; + +import { IOracleAdapter } from "./IOracleAdapter.sol"; + +interface IReporter { + function dispatchBlocks( + uint256 toChainId, + IOracleAdapter adapter, + uint256[] memory blockNumbers, + bytes32[] memory blockHeaders + ) external returns (bytes32); + + function dispatchMessages( + uint256 toChainId, + IOracleAdapter adapter, + uint256[] memory messageIds, + bytes32[] memory messageHashes + ) external returns (bytes32); +} diff --git a/packages/evm/contracts/interfaces/IYaho.sol b/packages/evm/contracts/interfaces/IYaho.sol index 9cf6f502..0b079596 100644 --- a/packages/evm/contracts/interfaces/IYaho.sol +++ b/packages/evm/contracts/interfaces/IYaho.sol @@ -1,27 +1,51 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; -import { IMessageDispatcher, Message } from "./IMessageDispatcher.sol"; +import { IMessageHashCalculator } from "./IMessageHashCalculator.sol"; +import { IMessageIdCalculator } from "./IMessageIdCalculator.sol"; +import { Message } from "./IMessage.sol"; +import { IOracleAdapter } from "./IOracleAdapter.sol"; -interface IYaho is IMessageDispatcher { - error NoMessagesGiven(address emitter); - error NoMessageIdsGiven(address emitter); - error NoAdaptersGiven(address emitter); - error UnequalArrayLengths(address emitter); +interface IYaho is IMessageHashCalculator, IMessageIdCalculator { + error NoMessagesGiven(); + error NoMessageIdsGiven(); + error NoReportersGiven(); + error NoAdaptersGiven(); + error UnequalArrayLengths(uint256 arrayOne, uint256 arrayTwo); + error MessageHashNotFound(uint256 messageId); + error InvalidMessage(Message message); + error InvalidThreshold(uint256 threshold, uint256 maxThreshold); - function dispatchMessages(Message[] memory messages) external payable returns (bytes32[] memory); + event MessageDispatched(uint256 indexed messageId, Message message); - function relayMessagesToAdapters( - uint256[] memory messageIds, - address[] memory adapters, - address[] memory destinationAdapters - ) external payable returns (bytes32[] memory); + function dispatchMessage( + uint256 toChainId, + uint256 threshold, + address receiver, + bytes calldata data, + address[] calldata reporters, + IOracleAdapter[] calldata adapters + ) external returns (uint256); + + function dispatchMessageToAdapters( + uint256 toChainId, + uint256 threshold, + address receiver, + bytes calldata data, + address[] calldata reporters, + IOracleAdapter[] calldata adapters + ) external returns (uint256, bytes32[] memory); function dispatchMessagesToAdapters( - Message[] memory messages, - address[] memory adapters, - address[] memory destinationAdapters - ) external payable returns (bytes32[] memory messageIds, bytes32[] memory); + uint256 toChainId, + uint256[] calldata thresholds, + address[] calldata receivers, + bytes[] calldata data, + address[] calldata reporters, + IOracleAdapter[] calldata adapters + ) external payable returns (uint256[] memory, bytes32[] memory); + + function getPendingMessageHash(uint256 messageId) external view returns (bytes32); - function hashes(uint256) external view returns (bytes32); + function relayMessagesToAdapters(Message[] calldata messages) external payable returns (bytes32[] memory); } diff --git a/packages/evm/contracts/utils/MessageHashCalculator.sol b/packages/evm/contracts/utils/MessageHashCalculator.sol index 29aacf39..630ecba6 100644 --- a/packages/evm/contracts/utils/MessageHashCalculator.sol +++ b/packages/evm/contracts/utils/MessageHashCalculator.sol @@ -1,22 +1,12 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; +import { IMessageHashCalculator } from "../interfaces/IMessageHashCalculator.sol"; import { Message } from "../interfaces/IMessage.sol"; -contract MessageHashCalculator { - /// @dev Calculates the ID of a given message. - /// @param chainId ID of the chain on which the message was/will be dispatched. - /// @param id ID of the message that was/will be dispatched. - /// @param origin Contract that did/will dispatch the given message. - /// @param sender Sender of the message that was/will be dispatched. - /// @param message Message that was/will be dispatched. - function calculateHash( - uint256 chainId, - uint256 id, - address origin, - address sender, - Message memory message - ) public pure returns (bytes32 calculatedHash) { - calculatedHash = keccak256(abi.encode(chainId, id, origin, sender, message)); +contract MessageHashCalculator is IMessageHashCalculator { + /// @inheritdoc IMessageHashCalculator + function calculateMessageHash(Message memory message) public pure returns (bytes32) { + return keccak256(abi.encode(message)); } } diff --git a/packages/evm/contracts/utils/MessageIdCalculator.sol b/packages/evm/contracts/utils/MessageIdCalculator.sol new file mode 100644 index 00000000..9c816b4c --- /dev/null +++ b/packages/evm/contracts/utils/MessageIdCalculator.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity ^0.8.17; + +import { IMessageIdCalculator } from "../interfaces/IMessageIdCalculator.sol"; + +contract MessageIdCalculator is IMessageIdCalculator { + /// @inheritdoc IMessageIdCalculator + function calculateMessageId( + uint256 fromChainId, + address dispatcherAddress, + bytes32 messageHash + ) public pure returns (uint256) { + return uint256(keccak256(abi.encode(fromChainId, dispatcherAddress, messageHash))); + } +} From c235c9239bd2e07a323e3e71c5df47f12c1d2d64 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 23 Jan 2024 16:02:01 +0100 Subject: [PATCH 048/297] feat(evm): adds tests for Yaho --- packages/evm/contracts/test/MockReporter.sol | 42 ++ packages/evm/test/04_Yaho.spec.ts | 516 +++++++++++++++---- packages/evm/test/utils/Message.ts | 58 +++ packages/evm/test/utils/constants.ts | 8 + packages/evm/test/utils/index.ts | 3 + 5 files changed, 519 insertions(+), 108 deletions(-) create mode 100644 packages/evm/contracts/test/MockReporter.sol create mode 100644 packages/evm/test/utils/Message.ts create mode 100644 packages/evm/test/utils/constants.ts create mode 100644 packages/evm/test/utils/index.ts diff --git a/packages/evm/contracts/test/MockReporter.sol b/packages/evm/contracts/test/MockReporter.sol new file mode 100644 index 00000000..a2ad50b7 --- /dev/null +++ b/packages/evm/contracts/test/MockReporter.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity ^0.8.17; + +import { IReporter } from "../interfaces/IReporter.sol"; +import { IOracleAdapter } from "../interfaces/IOracleAdapter.sol"; + +contract MockReporter is IReporter { + address public immutable YAHO; + + error NotYaho(); + + event MessageReported(uint256 toChainId, IOracleAdapter adapter, uint256 messageId, bytes32 messageHash); + + modifier onlyYaho() { + if (msg.sender != YAHO) revert NotYaho(); + _; + } + + constructor(address yaho) { + YAHO = yaho; + } + + function dispatchBlocks( + uint256 toChainId, + IOracleAdapter adapter, + uint256[] memory blockNumbers, + bytes32[] memory blockHeaders + ) external returns (bytes32) {} + + function dispatchMessages( + uint256 toChainId, + IOracleAdapter adapter, + uint256[] memory messageIds, + bytes32[] memory messageHashes + ) external onlyYaho returns (bytes32) { + // _sendPayload(abi.encode(messageIds, messageHashes)); + for (uint256 i = 0; i < messageIds.length; i++) { + emit MessageReported(toChainId, adapter, messageIds[i], messageHashes[i]); + } + return (bytes32(0)); + } +} diff --git a/packages/evm/test/04_Yaho.spec.ts b/packages/evm/test/04_Yaho.spec.ts index 8a5931ab..a616588c 100644 --- a/packages/evm/test/04_Yaho.spec.ts +++ b/packages/evm/test/04_Yaho.spec.ts @@ -1,127 +1,427 @@ +import { anyValue } from "@nomicfoundation/hardhat-chai-matchers/withArgs" +import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/dist/src/signer-with-address" import { expect } from "chai" +import { Contract } from "ethers" import { ethers } from "hardhat" -const ID_ZERO = "0x0000000000000000000000000000000000000000000000000000000000000000" -const ID_ONE = "0x0000000000000000000000000000000000000000000000000000000000000001" -const ID_TWO = "0x0000000000000000000000000000000000000000000000000000000000000002" - -const MESSAGE_1 = { - to: "0x0000000000000000000000000000000000000001", - toChainId: 1, - data: 0x01, -} -const MESSAGE_2 = { - to: "0x0000000000000000000000000000000000000002", - toChainId: 2, - data: 0x02, -} - -const setup = async () => { - const [wallet] = await ethers.getSigners() - const Yaho = await ethers.getContractFactory("Yaho") - const yaho = await Yaho.deploy() - const MessageRelay = await ethers.getContractFactory("MockMessageRelay") - const messageRelay = await MessageRelay.deploy() - - return { - wallet, - yaho, - messageRelay, - } -} - -describe("Yaho", function () { - describe("Deploy", function () { - it("Successfully deploys contract", async function () { - const { yaho } = await setup() - expect(await yaho.deployed()) +import { toBytes32 } from "./utils" +import Message from "./utils/Message" +import { Chains } from "./utils/constants" + +let reporter1: Contract, + reporter2: Contract, + owner: SignerWithAddress, + yaho: Contract, + receiver1: SignerWithAddress, + receiver2: SignerWithAddress, + adapter1: SignerWithAddress, + adapter2: SignerWithAddress + +describe("Yaho", () => { + beforeEach(async () => { + const Yaho = await ethers.getContractFactory("Yaho") + const Reporter = await ethers.getContractFactory("MockReporter") + + const signers = await ethers.getSigners() + owner = signers[0] + receiver1 = await signers[1] + receiver2 = await signers[2] + adapter1 = await signers[3] + adapter2 = await signers[4] + + yaho = await Yaho.deploy() + reporter1 = await Reporter.deploy(yaho.address) + reporter2 = await Reporter.deploy(yaho.address) + }) + + describe("dispatchMessage", () => { + it("should dispatch a single message without calling the reporter contracts", async () => { + const threshold = 2 + const tx = await yaho.dispatchMessage( + Chains.Gnosis, + threshold, + receiver1.address, + "0x01", + [reporter1.address, reporter2.address], + [adapter1.address, adapter2.address], + ) + const [message] = Message.fromReceipt(await tx.wait(1)) + await expect(tx).to.emit(yaho, "MessageDispatched").withArgs(message.id, anyValue) // FIXME: https://github.com/NomicFoundation/hardhat/issues/3833 + expect(await yaho.getPendingMessageHash(message.id)).to.be.eq( + await yaho.calculateMessageHash(message.serialize()), + ) + }) + + it("should fail to dispatch a single message because reporters array size does not match the adapter one", async () => { + const threshold = 2 + await expect( + yaho.dispatchMessage( + Chains.Gnosis, + threshold, + receiver1.address, + "0x01", + [reporter1.address], + [adapter1.address, adapter2.address], + ), + ) + .to.be.revertedWithCustomError(yaho, "UnequalArrayLengths") + .withArgs(1, 2) + }) + + it("should fail to dispatch a single message because no reporters are given", async () => { + const threshold = 2 + await expect( + yaho.dispatchMessage( + Chains.Gnosis, + threshold, + receiver1.address, + "0x01", + [], + [adapter1.address, adapter2.address], + ), + ).to.be.revertedWithCustomError(yaho, "NoReportersGiven") + }) + + it("should fail to dispatch a single message because no adapters are given", async () => { + const threshold = 2 + await expect( + yaho.dispatchMessage( + Chains.Gnosis, + threshold, + receiver1.address, + "0x01", + [reporter1.address, reporter2.address], + [], + ), + ).to.be.revertedWithCustomError(yaho, "NoAdaptersGiven") + }) + + it("should fail to dispatch a single message because the threshold cannot be 0", async () => { + const threshold = 0 + await expect( + yaho.dispatchMessage( + Chains.Gnosis, + threshold, + receiver1.address, + "0x01", + [reporter1.address, reporter2.address], + [adapter1.address, adapter2.address], + ), + ) + .to.be.revertedWithCustomError(yaho, "InvalidThreshold") + .withArgs(0, 2) + }) + + it("should fail to dispatch a single message because the threshold cannot be greather than reporters or adapters array's sizes", async () => { + const threshold = 3 + await expect( + yaho.dispatchMessage( + Chains.Gnosis, + threshold, + receiver1.address, + "0x01", + [reporter1.address, reporter2.address], + [adapter1.address, adapter2.address], + ), + ) + .to.be.revertedWithCustomError(yaho, "InvalidThreshold") + .withArgs(3, 2) }) }) - describe("dispatchMessages()", function () { - it("reverts if no messages are given", async function () { - const { yaho } = await setup() - await expect(yaho.dispatchMessages([])).to.be.revertedWithCustomError(yaho, "NoMessagesGiven") - }) - it("creates a unique ID for each dispatched message", async function () { - const { yaho } = await setup() - await yaho.dispatchMessages([MESSAGE_1, MESSAGE_2]) - const hash0 = await yaho.hashes(0) - const hash1 = await yaho.hashes(1) - expect(hash0).not.to.equal(hash1) - }) - it("creates a unique hashes for duplicate messaged", async function () { - const { yaho } = await setup() - await yaho.dispatchMessages([MESSAGE_1, MESSAGE_1]) - const hash0 = await yaho.hashes(0) - const hash1 = await yaho.hashes(1) - expect(hash0).not.to.equal(hash1) - }) - it("stores hash for each dispatched message", async function () { - const { yaho } = await setup() - await yaho.dispatchMessages([MESSAGE_1, MESSAGE_2]) - const hash0 = await yaho.hashes(0) - const hash1 = await yaho.hashes(1) - expect(hash0).not.to.equal(hash1) - }) - it("emits MessageDispatched() when a message is dispatched", async function () { - const { yaho } = await setup() - const tx = await yaho.dispatchMessages([MESSAGE_1, MESSAGE_2]) - await expect(tx).to.emit(yaho, "MessageDispatched") + describe("dispatchMessageToAdapters", () => { + it("should dispatch a single message and call the reporter contracts", async () => { + const threshold = 2 + const toChainId = Chains.Gnosis + const tx = await yaho.dispatchMessageToAdapters( + toChainId, + threshold, + receiver1.address, + "0x01", + [reporter1.address, reporter2.address], + [adapter1.address, adapter2.address], + ) + const [message] = Message.fromReceipt(await tx.wait(1)) + await expect(tx) + .to.emit(yaho, "MessageDispatched") + .withArgs(message.id, anyValue) // FIXME: https://github.com/NomicFoundation/hardhat/issues/3833 + .and.to.emit(reporter1, "MessageReported") + .withArgs(toChainId, adapter1.address, message.id, await yaho.calculateMessageHash(message.serialize())) + .and.to.emit(reporter2, "MessageReported") + .withArgs(toChainId, adapter2.address, message.id, await yaho.calculateMessageHash(message.serialize())) + expect(await yaho.getPendingMessageHash(message.id)).to.be.eq(toBytes32(0)) + }) + + it("should fail to dispatch a single message because no reporters are given", async () => { + const threshold = 2 + await expect( + yaho.dispatchMessageToAdapters( + Chains.Gnosis, + threshold, + receiver1.address, + "0x01", + [], + [adapter1.address, adapter2.address], + ), + ).to.be.revertedWithCustomError(yaho, "NoReportersGiven") + }) + + it("should fail to dispatch a single message because no adapters are given", async () => { + const threshold = 2 + await expect( + yaho.dispatchMessageToAdapters( + Chains.Gnosis, + threshold, + receiver1.address, + "0x01", + [reporter1.address, reporter2.address], + [], + ), + ).to.be.revertedWithCustomError(yaho, "NoAdaptersGiven") + }) + + it("should fail to dispatch a single message because the threshold cannot be 0", async () => { + const threshold = 0 + await expect( + yaho.dispatchMessageToAdapters( + Chains.Gnosis, + threshold, + receiver1.address, + "0x01", + [reporter1.address, reporter2.address], + [adapter1.address, adapter2.address], + ), + ) + .to.be.revertedWithCustomError(yaho, "InvalidThreshold") + .withArgs(0, 2) + }) + + it("should fail to dispatch a single message because the threshold cannot be greather than reporters or adapters array's sizes", async () => { + const threshold = 3 + await expect( + yaho.dispatchMessageToAdapters( + Chains.Gnosis, + threshold, + receiver1.address, + "0x01", + [reporter1.address, reporter2.address], + [adapter1.address, adapter2.address], + ), + ) + .to.be.revertedWithCustomError(yaho, "InvalidThreshold") + .withArgs(3, 2) }) }) - describe("relayMessagesToAdapters()", function () { - it("reverts if no message IDs are given", async function () { - const { yaho, messageRelay } = await setup() - await yaho.dispatchMessages([MESSAGE_1, MESSAGE_2]) - await expect(yaho.relayMessagesToAdapters([], [messageRelay.address], [yaho.address, yaho.address])) - .to.be.revertedWithCustomError(yaho, "NoMessageIdsGiven") - .withArgs(yaho.address) - }) - it("reverts if no adapters are given", async function () { - const { yaho } = await setup() - await yaho.dispatchMessages([MESSAGE_1, MESSAGE_2]) - await expect(yaho.relayMessagesToAdapters([ID_ZERO], [], [yaho.address, yaho.address])) - .to.be.revertedWithCustomError(yaho, "NoAdaptersGiven") - .withArgs(yaho.address) - }) - it("relays dispatched message to the given adapters", async function () { - const { yaho, messageRelay } = await setup() - await yaho.dispatchMessages([MESSAGE_1, MESSAGE_2]) - const receipts = await yaho.callStatic.relayMessagesToAdapters( - [ID_ZERO, ID_ONE], - [messageRelay.address, messageRelay.address], - [yaho.address, yaho.address], + describe("dispatchMessagesToAdapters", () => { + it("should dispatch 2 messages and call the reporter contracts", async () => { + const threshold = 2 + const toChainId = Chains.Gnosis + const tx = await yaho.dispatchMessagesToAdapters( + toChainId, + [threshold, threshold], + [receiver1.address, receiver2.address], + ["0x01", "0x02"], + [reporter1.address, reporter2.address], + [adapter1.address, adapter2.address], + ) + const [message1, message2] = Message.fromReceipt(await tx.wait(1)) + await expect(tx) + .to.emit(yaho, "MessageDispatched") + .withArgs(message1.id, anyValue) // FIXME: https://github.com/NomicFoundation/hardhat/issues/3833 + .and.to.emit(reporter1, "MessageReported") + .withArgs(toChainId, adapter1.address, message1.id, await yaho.calculateMessageHash(message1.serialize())) + .and.to.emit(reporter1, "MessageReported") + .withArgs(toChainId, adapter1.address, message2.id, await yaho.calculateMessageHash(message2.serialize())) + .and.to.emit(reporter2, "MessageReported") + .withArgs(toChainId, adapter2.address, message1.id, await yaho.calculateMessageHash(message1.serialize())) + .and.to.emit(reporter2, "MessageReported") + .withArgs(toChainId, adapter2.address, message2.id, await yaho.calculateMessageHash(message2.serialize())) + expect(await yaho.getPendingMessageHash(message1.id)).to.be.eq(toBytes32(0)) + expect(await yaho.getPendingMessageHash(message2.id)).to.be.eq(toBytes32(0)) + }) + + it("should fail dispatch 2 messages because thresholds array size does not match te receivers one", async () => { + const threshold = 2 + const toChainId = Chains.Gnosis + await expect( + yaho.dispatchMessagesToAdapters( + toChainId, + [threshold], + [receiver1.address, receiver2.address], + ["0x01", "0x02"], + [reporter1.address, reporter2.address], + [adapter1.address, adapter2.address], + ), + ) + .to.be.revertedWithCustomError(yaho, "UnequalArrayLengths") + .withArgs(1, 2) + }) + + it("should fail dispatch 2 messages because thresholds array size does not match te data one", async () => { + const threshold = 2 + const toChainId = Chains.Gnosis + await expect( + yaho.dispatchMessagesToAdapters( + toChainId, + [threshold, threshold], + [receiver1.address, receiver2.address], + ["0x01"], + [reporter1.address, reporter2.address], + [adapter1.address, adapter2.address], + ), ) - expect(receipts[0]).to.equal(ID_ZERO) - expect(receipts[1]).to.equal(ID_ONE) + .to.be.revertedWithCustomError(yaho, "UnequalArrayLengths") + .withArgs(2, 1) + }) + + it("should fail to dispatch 2 messages because no reporters are given", async () => { + const threshold = 2 + await expect( + yaho.dispatchMessagesToAdapters( + Chains.Gnosis, + [threshold, threshold], + [receiver1.address, receiver2.address], + ["0x01", "0x02"], + [], + [adapter1.address, adapter2.address], + ), + ).to.be.revertedWithCustomError(yaho, "NoReportersGiven") + }) + + it("should fail to dispatch 2 messages because no adapters are given", async () => { + const threshold = 2 + await expect( + yaho.dispatchMessagesToAdapters( + Chains.Gnosis, + [threshold, threshold], + [receiver1.address, receiver2.address], + ["0x01", "0x02"], + [reporter1.address, reporter2.address], + [], + ), + ).to.be.revertedWithCustomError(yaho, "NoAdaptersGiven") + }) + + it("should fail to dispatch a single message because the threshold cannot be 0", async () => { + const threshold = 0 + await expect( + yaho.dispatchMessagesToAdapters( + Chains.Gnosis, + [threshold, threshold], + [receiver1.address, receiver2.address], + ["0x01", "0x02"], + [reporter1.address, reporter2.address], + [adapter1.address, adapter2.address], + ), + ) + .to.be.revertedWithCustomError(yaho, "InvalidThreshold") + .withArgs(0, 2) + }) + + it("should fail to dispatch a single message because the threshold cannot be greather than reporters or adapters array's sizes", async () => { + const threshold = 3 + await expect( + yaho.dispatchMessagesToAdapters( + Chains.Gnosis, + [threshold, threshold], + [receiver1.address, receiver2.address], + ["0x01", "0x02"], + [reporter1.address, reporter2.address], + [adapter1.address, adapter2.address], + ), + ) + .to.be.revertedWithCustomError(yaho, "InvalidThreshold") + .withArgs(3, 2) }) }) - describe("dispatchMessagesToAdapters()", function () { - it("reverts if no adapters are given", async function () { - const { yaho } = await setup() - await expect(yaho.dispatchMessagesToAdapters([MESSAGE_1, MESSAGE_2], [], [yaho.address, yaho.address])) - .to.be.revertedWithCustomError(yaho, "NoAdaptersGiven") - .withArgs(yaho.address) - }) - it("dispatches messages and relays to the given adapters", async function () { - const { yaho, messageRelay } = await setup() - expect( - await yaho.dispatchMessagesToAdapters( - [MESSAGE_1, MESSAGE_2], - [messageRelay.address, messageRelay.address], - [yaho.address, yaho.address], + describe("relayMessagesToAdapters", () => { + it("should not relay messages that don't have the same toChainId", async () => { + const [tx1, tx2] = await Promise.all([ + yaho.dispatchMessage( + Chains.Mainnet, + 2, + receiver1.address, + "0x01", + [reporter1.address, reporter2.address], + [adapter1.address, adapter2.address], + ), + yaho.dispatchMessage( + Chains.Gnosis, + 2, + receiver1.address, + "0x01", + [reporter1.address, reporter2.address], + [adapter1.address, adapter2.address], + ), + ]) + const [message1] = Message.fromReceipt(await tx1.wait(1)) + const [message2] = Message.fromReceipt(await tx2.wait(1)) + await expect(yaho.relayMessagesToAdapters([message1, message2])) + .to.be.revertedWithCustomError(yaho, "InvalidMessage") + .withArgs(message2.serialize()) + }) + + it("should not relay messages that don't have the same adapters", async () => { + const [tx1, tx2] = await Promise.all([ + yaho.dispatchMessage(Chains.Mainnet, 1, receiver1.address, "0x01", [reporter1.address], [adapter1.address]), + yaho.dispatchMessage( + Chains.Gnosis, + 2, + receiver1.address, + "0x01", + [reporter1.address, reporter2.address], + [adapter1.address, adapter2.address], + ), + ]) + const [message1] = Message.fromReceipt(await tx1.wait(1)) + const [message2] = Message.fromReceipt(await tx2.wait(1)) + await expect(yaho.relayMessagesToAdapters([message1, message2])) + .to.be.revertedWithCustomError(yaho, "InvalidMessage") + .withArgs(message2.serialize()) + }) + + it("should not relay messages that don't have the same adapters", async () => { + const toChainId = Chains.Gnosis + const threshold = 2 + const [tx1, tx2] = await Promise.all([ + yaho.dispatchMessage( + toChainId, + threshold, + receiver1.address, + "0x01", + [reporter1.address, reporter2.address], + [adapter1.address, adapter2.address], + ), + yaho.dispatchMessage( + toChainId, + threshold, + receiver2.address, + "0x02", + [reporter1.address, reporter2.address], + [adapter1.address, adapter2.address], ), + ]) + const [message1] = Message.fromReceipt(await tx1.wait(1)) + const [message2] = Message.fromReceipt(await tx2.wait(1)) + expect(await yaho.getPendingMessageHash(message1.id)).to.be.eq( + await yaho.calculateMessageHash(message1.serialize()), ) - const [messageIds, receipts] = await yaho.callStatic.dispatchMessagesToAdapters( - [MESSAGE_1, MESSAGE_2], - [messageRelay.address, messageRelay.address], - [yaho.address, yaho.address], + expect(await yaho.getPendingMessageHash(message2.id)).to.be.eq( + await yaho.calculateMessageHash(message2.serialize()), ) - expect(messageIds[0]).to.equal(ID_TWO) - expect(receipts[0]).to.equal(ID_TWO) + await expect(yaho.relayMessagesToAdapters([message1, message2])) + .to.emit(reporter1, "MessageReported") + .withArgs(toChainId, adapter1.address, message1.id, await yaho.calculateMessageHash(message1.serialize())) + .and.to.emit(reporter1, "MessageReported") + .withArgs(toChainId, adapter1.address, message2.id, await yaho.calculateMessageHash(message2.serialize())) + .and.to.emit(reporter2, "MessageReported") + .withArgs(toChainId, adapter2.address, message1.id, await yaho.calculateMessageHash(message1.serialize())) + .and.to.emit(reporter2, "MessageReported") + .withArgs(toChainId, adapter2.address, message2.id, await yaho.calculateMessageHash(message2.serialize())) + expect(await yaho.getPendingMessageHash(message1.id)).to.be.eq(toBytes32(0)) + expect(await yaho.getPendingMessageHash(message2.id)).to.be.eq(toBytes32(0)) }) }) }) diff --git a/packages/evm/test/utils/Message.ts b/packages/evm/test/utils/Message.ts new file mode 100644 index 00000000..bf0043d0 --- /dev/null +++ b/packages/evm/test/utils/Message.ts @@ -0,0 +1,58 @@ +import { anyValue } from "@nomicfoundation/hardhat-chai-matchers/withArgs" +import { ContractReceipt } from "ethers" + +type Configs = { + data: string + sender: `0x${string}` + threshold: number + id: string + receiver: `0x${string}` + toChainId: number + salt: string + reporters: `0x${string}`[] + adapters: `0x${string}`[] +} + +class Message { + public data: string + public sender: `0x${string}` + public threshold: number + public id: string + public receiver: `0x${string}` + public toChainId: number + public salt: string + public reporters: `0x${string}`[] + public adapters: `0x${string}`[] + + constructor({ data, sender, threshold, id, receiver, toChainId, salt, reporters, adapters }: Configs) { + this.id = id + this.sender = sender + this.toChainId = toChainId + this.receiver = receiver + this.data = data + this.salt = salt + this.reporters = reporters + this.adapters = adapters + this.threshold = threshold + } + + static fromReceipt(_receipt: ContractReceipt) { + const events = _receipt.events.filter(({ event }) => event === "MessageDispatched") + return events.map(({ args: { messageId, message } }) => new Message({ id: messageId, ...message })) + } + + serialize() { + return [ + this.salt, + this.toChainId, + this.threshold, + this.sender, + this.receiver, + this.data, + this.reporters, + this.adapters, + ] + } +} + +export default Message diff --git a/packages/evm/test/utils/constants.ts b/packages/evm/test/utils/constants.ts new file mode 100644 index 00000000..8e5c81c2 --- /dev/null +++ b/packages/evm/test/utils/constants.ts @@ -0,0 +1,8 @@ +export const Chains = { + Gnosis: 100, + Goerli: 5, + Hardhat: 31337, + Mainnet: 1, +} + +export const ZERO_ADDRESS = "0x0000000000000000000000000000000000000000" diff --git a/packages/evm/test/utils/index.ts b/packages/evm/test/utils/index.ts new file mode 100644 index 00000000..145d8a25 --- /dev/null +++ b/packages/evm/test/utils/index.ts @@ -0,0 +1,3 @@ +import { ethers } from "hardhat" + +export const toBytes32 = (_n: number) => ethers.utils.hexZeroPad(ethers.utils.hexlify(_n), 32) From 7fc0ff566f0e6483585f2673b6dbc5ba72863185 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 23 Jan 2024 16:05:14 +0100 Subject: [PATCH 049/297] feat(evm): adds checkHashWithThresholdFromOracles to Hashi and normalizes all other fxs --- packages/evm/contracts/Hashi.sol | 102 ++++++++++++------- packages/evm/contracts/interfaces/IHashi.sol | 49 ++++++++- packages/evm/test/01_Hashi.spec.ts | 35 ++++++- 3 files changed, 142 insertions(+), 44 deletions(-) diff --git a/packages/evm/contracts/Hashi.sol b/packages/evm/contracts/Hashi.sol index 6a072307..623f8aa7 100644 --- a/packages/evm/contracts/Hashi.sol +++ b/packages/evm/contracts/Hashi.sol @@ -34,61 +34,89 @@ pragma solidity ^0.8.17; import { IOracleAdapter } from "./interfaces/IOracleAdapter.sol"; +import { IHashi } from "./interfaces/IHashi.sol"; -contract Hashi { - error NoOracleAdaptersGiven(address emitter); - error OracleDidNotReport(address emitter, IOracleAdapter oracleAdapter); - error OraclesDisagree(address emitter, IOracleAdapter oracleOne, IOracleAdapter oracleTwo); - - /// @dev Returns the hash reported by a given oracle for a given ID. - /// @param oracleAdapter Address of the oracle adapter to query. - /// @param domain Id of the domain to query. - /// @param id ID for which to return a hash. - /// @return hash Hash reported by the given oracle adapter for the given ID number. - function getHashFromOracle( - IOracleAdapter oracleAdapter, +contract Hashi is IHashi { + /// @inheritdoc IHashi + function checkHashWithThresholdFromOracles( uint256 domain, - uint256 id - ) public view returns (bytes32 hash) { - hash = oracleAdapter.getHashFromOracle(domain, id); + uint256 id, + uint256 threshold, + IOracleAdapter[] calldata oracleAdapters + ) external view returns (bool) { + if (oracleAdapters.length < threshold) return false; + + bytes32[] memory hashes = new bytes32[](oracleAdapters.length); + for (uint256 i = 0; i < oracleAdapters.length; ) { + try oracleAdapters[i].getHashFromOracle(domain, id) returns (bytes32 hash) { + hashes[i] = hash; + } catch {} + unchecked { + ++i; + } + } + + for (uint256 i = 0; i < hashes.length; ) { + bytes32 baseHash = hashes[i]; + if (baseHash == bytes32(0)) { + unchecked { + ++i; + } + continue; + } + + uint256 num = 0; + for (uint256 j = 0; j < hashes.length; ) { + if (baseHash == hashes[j]) { + unchecked { + ++num; + } + if (num == threshold) return true; + } + unchecked { + ++j; + } + } + + unchecked { + ++i; + } + } + return false; } - /// @dev Returns the hash for a given ID reported by a given set of oracles. - /// @param oracleAdapters Array of address for the oracle adapters to query. - /// @param domain ID of the domain to query. - /// @param id ID for which to return hashs. - /// @return hashes Array of hash reported by the given oracle adapters for the given ID. + /// @inheritdoc IHashi + function getHashFromOracle(uint256 domain, uint256 id, IOracleAdapter oracleAdapter) public view returns (bytes32) { + return oracleAdapter.getHashFromOracle(domain, id); + } + + /// @inheritdoc IHashi function getHashesFromOracles( - IOracleAdapter[] memory oracleAdapters, uint256 domain, - uint256 id + uint256 id, + IOracleAdapter[] calldata oracleAdapters ) public view returns (bytes32[] memory) { - if (oracleAdapters.length == 0) revert NoOracleAdaptersGiven(address(this)); + if (oracleAdapters.length == 0) revert NoOracleAdaptersGiven(); bytes32[] memory hashes = new bytes32[](oracleAdapters.length); for (uint256 i = 0; i < oracleAdapters.length; i++) { - hashes[i] = getHashFromOracle(oracleAdapters[i], domain, id); + hashes[i] = getHashFromOracle(domain, id, oracleAdapters[i]); } return hashes; } - /// @dev Returns the hash unanimously agreed upon by a given set of oracles. - /// @param domain ID of the domain to query. - /// @param id ID for which to return hash. - /// @param oracleAdapters Array of address for the oracle adapters to query. - /// @return hash Hash agreed on by the given set of oracle adapters. - /// @notice MUST revert if oracles disagree on the hash or if an oracle does not report. + /// @inheritdoc IHashi function getHash( uint256 domain, uint256 id, - IOracleAdapter[] memory oracleAdapters - ) public view returns (bytes32 hash) { - if (oracleAdapters.length == 0) revert NoOracleAdaptersGiven(address(this)); - bytes32[] memory hashes = getHashesFromOracles(oracleAdapters, domain, id); + IOracleAdapter[] calldata oracleAdapters + ) external view returns (bytes32 hash) { + if (oracleAdapters.length == 0) revert NoOracleAdaptersGiven(); + bytes32[] memory hashes = getHashesFromOracles(domain, id, oracleAdapters); hash = hashes[0]; - if (hash == bytes32(0)) revert OracleDidNotReport(address(this), oracleAdapters[0]); + if (hash == bytes32(0)) revert OracleDidNotReport(oracleAdapters[0]); for (uint256 i = 1; i < hashes.length; i++) { - if (hashes[i] == bytes32(0)) revert OracleDidNotReport(address(this), oracleAdapters[i]); - if (hash != hashes[i]) revert OraclesDisagree(address(this), oracleAdapters[i - 1], oracleAdapters[i]); + if (hashes[i] == bytes32(0)) revert OracleDidNotReport(oracleAdapters[i]); + if (hash != hashes[i]) revert OraclesDisagree(oracleAdapters[i - 1], oracleAdapters[i]); } } } diff --git a/packages/evm/contracts/interfaces/IHashi.sol b/packages/evm/contracts/interfaces/IHashi.sol index 0c313b2a..7d8eb62a 100644 --- a/packages/evm/contracts/interfaces/IHashi.sol +++ b/packages/evm/contracts/interfaces/IHashi.sol @@ -4,9 +4,54 @@ pragma solidity ^0.8.17; import { IOracleAdapter } from "./IOracleAdapter.sol"; interface IHashi { + error NoOracleAdaptersGiven(); + error OracleDidNotReport(IOracleAdapter oracleAdapter); + error OraclesDisagree(IOracleAdapter oracleOne, IOracleAdapter oracleTwo); + + /// @dev Checks whether threshold is reached for a message given a set of oracleAdapters + /// @param domain ID of the domain to query. + /// @param id ID for which to return hash. + /// @param threshold to use. + /// @param oracleAdapters Array of address for the oracle adapters to query. + /// @return a boolean indicating if a threshold for a given message has been reached. + function checkHashWithThresholdFromOracles( + uint256 domain, + uint256 id, + uint256 threshold, + IOracleAdapter[] calldata oracleAdapters + ) external view returns (bool); + + /// @dev Returns the hash reported by a given oracle for a given ID. + /// @param domain Id of the domain to query. + /// @param id ID for which to return a hash. + /// @param oracleAdapter Address of the oracle adapter to query. + /// @return hash Hash reported by the given oracle adapter for the given ID number. + function getHashFromOracle( + uint256 domain, + uint256 id, + IOracleAdapter oracleAdapter + ) external view returns (bytes32); + + /// @dev Returns the hash for a given ID reported by a given set of oracles. + /// @param domain ID of the domain to query. + /// @param id ID for which to return hashs. + /// @param oracleAdapters Array of address for the oracle adapters to query. + /// @return hashes Array of hash reported by the given oracle adapters for the given ID. + function getHashesFromOracles( + uint256 domain, + uint256 id, + IOracleAdapter[] calldata oracleAdapters + ) external view returns (bytes32[] memory); + + /// @dev Returns the hash unanimously agreed upon by a given set of oracles. + /// @param domain ID of the domain to query. + /// @param id ID for which to return hash. + /// @param oracleAdapters Array of address for the oracle adapters to query. + /// @return hash Hash agreed on by the given set of oracle adapters. + /// @notice MUST revert if oracles disagree on the hash or if an oracle does not report. function getHash( uint256 domain, uint256 id, - IOracleAdapter[] memory oracleAdapters - ) external view returns (bytes32 hash); + IOracleAdapter[] calldata oracleAdapters + ) external view returns (bytes32); } diff --git a/packages/evm/test/01_Hashi.spec.ts b/packages/evm/test/01_Hashi.spec.ts index 0991dbe1..55b5a9d3 100644 --- a/packages/evm/test/01_Hashi.spec.ts +++ b/packages/evm/test/01_Hashi.spec.ts @@ -39,15 +39,15 @@ describe("Hashi", function () { describe("getHashFromOracle()", function () { it("Returns correct hash", async function () { const { hashi, mockOracleAdapter } = await setup() - expect(await hashi.getHashFromOracle(mockOracleAdapter.address, DOMAIN_ID, 0)).to.equal(HASH_ZERO) - expect(await hashi.getHashFromOracle(mockOracleAdapter.address, DOMAIN_ID, 1)).to.equal(HASH_GOOD) + expect(await hashi.getHashFromOracle(DOMAIN_ID, 0, mockOracleAdapter.address)).to.equal(HASH_ZERO) + expect(await hashi.getHashFromOracle(DOMAIN_ID, 1, mockOracleAdapter.address)).to.equal(HASH_GOOD) }) }) describe("getHashesFromOracles()", function () { it("Reverts if oracleAdapters length is zero", async function () { const { hashi } = await setup() - await expect(hashi.getHashesFromOracles([], DOMAIN_ID, 1)).to.revertedWithCustomError( + await expect(hashi.getHashesFromOracles(DOMAIN_ID, 1, [])).to.revertedWithCustomError( hashi, "NoOracleAdaptersGiven", ) @@ -55,14 +55,14 @@ describe("Hashi", function () { it("Returns correct hashs from each oracle", async function () { const { hashi, mockOracleAdapter, badMockOracleAdapter } = await setup() const oracles = [mockOracleAdapter.address, badMockOracleAdapter.address] - const returnData = await hashi.getHashesFromOracles(oracles, DOMAIN_ID, 1) + const returnData = await hashi.getHashesFromOracles(DOMAIN_ID, 1, oracles) expect(returnData[0]).to.equal(HASH_GOOD) expect(returnData[1]).to.equal(HASH_BAD) }) it("Returns Bytes(0) for non-reporting oracles", async function () { const { hashi, mockOracleAdapter, nonReportingMockOracleAdapter } = await setup() const oracles = [mockOracleAdapter.address, nonReportingMockOracleAdapter.address] - const returnData = await hashi.getHashesFromOracles(oracles, DOMAIN_ID, 1) + const returnData = await hashi.getHashesFromOracles(DOMAIN_ID, 1, oracles) expect(returnData[0]).to.equal(HASH_GOOD) expect(returnData[1]).to.equal(HASH_ZERO) }) @@ -104,4 +104,29 @@ describe("Hashi", function () { expect(await hashi.getHash(DOMAIN_ID, 1, [mockOracleAdapter.address])).to.equal(HASH_GOOD) }) }) + + describe("checkHashWithThresholdFromOracles()", function () { + it("should return false if the threshold is not reached", async () => { + const { hashi, mockOracleAdapter, badMockOracleAdapter, nonReportingMockOracleAdapter } = await setup() + const id = 3 + const threshold = 3 + const oracles = [mockOracleAdapter, badMockOracleAdapter, nonReportingMockOracleAdapter].map( + ({ address }) => address, + ) + await mockOracleAdapter.setHashes(DOMAIN_ID, [id], [HASH_GOOD]) + expect(await hashi.checkHashWithThresholdFromOracles(DOMAIN_ID, id, threshold, oracles)).to.be.eq(false) + }) + it("should return true if the threshold is reached", async () => { + const { hashi, mockOracleAdapter, badMockOracleAdapter, nonReportingMockOracleAdapter } = await setup() + const id = 3 + const threshold = 3 + const oracles = [mockOracleAdapter, badMockOracleAdapter, nonReportingMockOracleAdapter].map( + ({ address }) => address, + ) + await mockOracleAdapter.setHashes(DOMAIN_ID, [id], [HASH_GOOD]) + await badMockOracleAdapter.setHashes(DOMAIN_ID, [id], [HASH_GOOD]) + await nonReportingMockOracleAdapter.setHashes(DOMAIN_ID, [id], [HASH_GOOD]) + expect(await hashi.checkHashWithThresholdFromOracles(DOMAIN_ID, id, threshold, oracles)).to.be.eq(true) + }) + }) }) From 177fe7656e5c5f9dd2614605935d3bd2c28cfacd Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 23 Jan 2024 16:06:41 +0100 Subject: [PATCH 050/297] feat(evm): adapts Yaru based on new Message struct --- packages/evm/contracts/Yaru.sol | 100 ++++++++---------- packages/evm/contracts/interfaces/IJushin.sol | 11 ++ .../contracts/interfaces/IMessageExecutor.sol | 6 -- packages/evm/contracts/interfaces/IYaru.sol | 17 +++ 4 files changed, 71 insertions(+), 63 deletions(-) create mode 100644 packages/evm/contracts/interfaces/IJushin.sol delete mode 100644 packages/evm/contracts/interfaces/IMessageExecutor.sol create mode 100644 packages/evm/contracts/interfaces/IYaru.sol diff --git a/packages/evm/contracts/Yaru.sol b/packages/evm/contracts/Yaru.sol index f6a22e53..6f879171 100644 --- a/packages/evm/contracts/Yaru.sol +++ b/packages/evm/contracts/Yaru.sol @@ -1,78 +1,64 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; +import { ReentrancyGuard } from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; +import { IYaru } from "./interfaces/IYaru.sol"; import { IHashi, IOracleAdapter } from "./interfaces/IHashi.sol"; import { Message } from "./interfaces/IMessage.sol"; -import { IMessageExecutor } from "./interfaces/IMessageExecutor.sol"; +import { MessageIdCalculator } from "./utils/MessageIdCalculator.sol"; import { MessageHashCalculator } from "./utils/MessageHashCalculator.sol"; +import { IJushin } from "./interfaces/IJushin.sol"; -contract Yaru is IMessageExecutor, MessageHashCalculator { - IHashi public immutable hashi; - address public immutable yaho; - uint256 public immutable chainId; - mapping(uint256 => bool) public executed; - address public sender; - IOracleAdapter[] private _adapters; +contract Yaru is IYaru, MessageIdCalculator, MessageHashCalculator, ReentrancyGuard { + address public immutable HASHI; + address public immutable YAHO; + uint256 public immutable SOURCE_CHAIN_ID; - error ReentranceNotAllowed(address); - error UnequalArrayLengths(address emitter); - error AlreadyExecuted(address emitter, uint256 id); - error InvalidSender(address emitter, address sender); - error HashMismatch(address emitter, uint256 id, bytes32 reportedHash, bytes32 calculatedHash); - error CallFailed(address emitter, uint256 id); + mapping(uint256 => bool) public executed; - /// @param _hashi Address of the Hashi contract. - /// @param _yaho Address of the Yaho contract - constructor(IHashi _hashi, address _yaho, uint256 _chainId) { - hashi = _hashi; - yaho = _yaho; - chainId = _chainId; + constructor(address hashi, address yaho_, uint256 sourceChainId) { + HASHI = hashi; + YAHO = yaho_; + SOURCE_CHAIN_ID = sourceChainId; } - /// @dev Executes messages validated by a given set of oracle adapters - /// @param messages Array of messages to execute. - /// @param messageIds Array of corresponding messageIds to query for hashes from the given oracle adapters. - /// @param senders Array of addresses that sent the corresponding messages. - /// @param oracleAdapters Array of oracle adapters to query. - /// @return returnDatas Array of data returned from each executed message. - function executeMessages( - Message[] memory messages, - uint256[] memory messageIds, - address[] memory senders, - IOracleAdapter[] memory oracleAdapters - ) public returns (bytes[] memory) { - if (sender != address(0)) revert ReentranceNotAllowed(address(0)); - if (messages.length != senders.length || messages.length != messageIds.length) - revert UnequalArrayLengths(address(this)); - for (uint256 i = 0; i < oracleAdapters.length; i++) _adapters.push(oracleAdapters[i]); + /// @inheritdoc IYaru + function executeMessages(Message[] calldata messages) external nonReentrant returns (bytes[] memory) { bytes[] memory returnDatas = new bytes[](messages.length); - for (uint256 i = 0; i < messages.length; i++) { - uint256 id = messageIds[i]; + for (uint256 i = 0; i < messages.length; ) { + Message memory message = messages[i]; - if (executed[id]) revert AlreadyExecuted(address(this), id); - if (senders[i] == address(0)) revert InvalidSender(address(this), senders[i]); + bytes32 messageHash = calculateMessageHash(message); + uint256 messageId = calculateMessageId(SOURCE_CHAIN_ID, YAHO, messageHash); - executed[id] = true; + if (message.toChainId != block.chainid) revert InvalidToChainId(message.toChainId, block.chainid); - Message memory message = messages[i]; - sender = senders[i]; - bytes32 reportedHash = hashi.getHash(chainId, id, oracleAdapters); - bytes32 calculatedHash = calculateHash(chainId, id, yaho, sender, message); - if (reportedHash != calculatedHash) revert HashMismatch(address(this), id, reportedHash, calculatedHash); + if (executed[messageId]) revert MessageIdAlreadyExecuted(messageId); + executed[messageId] = true; - (bool success, bytes memory returnData) = address(message.to).call(message.data); - if (!success) revert CallFailed(address(this), id); + if ( + !IHashi(HASHI).checkHashWithThresholdFromOracles( + SOURCE_CHAIN_ID, + messageId, + message.threshold, + message.adapters + ) + ) revert ThresholdNotMet(); - delete sender; - returnDatas[i] = returnData; - emit MessageIdExecuted(message.toChainId, bytes32(id)); + try IJushin(message.receiver).onMessage(SOURCE_CHAIN_ID, messageId, message.sender, message.data) returns ( + bytes memory returnData + ) { + returnDatas[i] = returnData; + } catch { + revert CallFailed(); + } + + emit MessageExecuted(messageId, message); + + unchecked { + ++i; + } } - delete _adapters; return returnDatas; } - - /// @dev Returns the current array of adapters. - function adapters() external view returns (IOracleAdapter[] memory) { - return _adapters; - } } diff --git a/packages/evm/contracts/interfaces/IJushin.sol b/packages/evm/contracts/interfaces/IJushin.sol new file mode 100644 index 00000000..38aa4f54 --- /dev/null +++ b/packages/evm/contracts/interfaces/IJushin.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity ^0.8.17; + +interface IJushin { + function onMessage( + uint256 fromChainId, + uint256 messageId, + address sender, + bytes calldata data + ) external returns (bytes memory); +} diff --git a/packages/evm/contracts/interfaces/IMessageExecutor.sol b/packages/evm/contracts/interfaces/IMessageExecutor.sol deleted file mode 100644 index 035490aa..00000000 --- a/packages/evm/contracts/interfaces/IMessageExecutor.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -interface IMessageExecutor { - event MessageIdExecuted(uint256 indexed fromChainId, bytes32 indexed messageId); -} diff --git a/packages/evm/contracts/interfaces/IYaru.sol b/packages/evm/contracts/interfaces/IYaru.sol new file mode 100644 index 00000000..08add12b --- /dev/null +++ b/packages/evm/contracts/interfaces/IYaru.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity ^0.8.17; + +import { Message } from "./IMessage.sol"; +import { IMessageHashCalculator } from "./IMessageHashCalculator.sol"; +import { IMessageIdCalculator } from "./IMessageIdCalculator.sol"; + +interface IYaru is IMessageHashCalculator, IMessageIdCalculator { + error InvalidToChainId(uint256 chainId, uint256 expectedChainId); + error MessageIdAlreadyExecuted(uint256 messageId); + error CallFailed(); + error ThresholdNotMet(); + + event MessageExecuted(uint256 indexed messageId, Message message); + + function executeMessages(Message[] calldata messages) external returns (bytes[] memory); +} From 51622697677f5ba31cf3b2d1e827e8b0c5eba921 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 23 Jan 2024 16:07:47 +0100 Subject: [PATCH 051/297] feat(evm): adds tests for Yaru --- .../evm/contracts/test/MockOracleAdapter.sol | 6 +- packages/evm/contracts/test/PingPong.sol | 17 +- packages/evm/test/05_Yaru.spec.ts | 310 +++++++++--------- 3 files changed, 172 insertions(+), 161 deletions(-) diff --git a/packages/evm/contracts/test/MockOracleAdapter.sol b/packages/evm/contracts/test/MockOracleAdapter.sol index f43074f8..b61bf748 100644 --- a/packages/evm/contracts/test/MockOracleAdapter.sol +++ b/packages/evm/contracts/test/MockOracleAdapter.sol @@ -7,10 +7,10 @@ import { BlockHashOracleAdapter } from "../adapters/BlockHashOracleAdapter.sol"; contract MockOracleAdapter is OracleAdapter, BlockHashOracleAdapter { error LengthMismatch(address emitter); - function setHashes(uint256 domain, uint256[] memory ids, bytes32[] memory _hashes) external { - if (ids.length != _hashes.length) revert LengthMismatch(address(this)); + function setHashes(uint256 domain, uint256[] memory ids, bytes32[] memory hashes) external { + if (ids.length != hashes.length) revert LengthMismatch(address(this)); for (uint256 i = 0; i < ids.length; i++) { - _storeHash(domain, ids[i], _hashes[i]); + _storeHash(domain, ids[i], hashes[i]); } } } diff --git a/packages/evm/contracts/test/PingPong.sol b/packages/evm/contracts/test/PingPong.sol index 7c113f12..ab54c1c5 100644 --- a/packages/evm/contracts/test/PingPong.sol +++ b/packages/evm/contracts/test/PingPong.sol @@ -1,14 +1,21 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; -contract PingPong { - event Pong(string pong); +import { IJushin } from "../interfaces/IJushin.sol"; +contract PingPong is IJushin { uint256 public count; - function ping() public returns (string memory pong) { + event Pong(uint256 count); + + function ping() external { + count++; + emit Pong(count); + } + + function onMessage(uint256, uint256, address, bytes calldata) external returns (bytes memory) { count++; - pong = "pong"; - emit Pong(pong); + emit Pong(count); + return abi.encode(0); } } diff --git a/packages/evm/test/05_Yaru.spec.ts b/packages/evm/test/05_Yaru.spec.ts index d5e07224..2c768c59 100644 --- a/packages/evm/test/05_Yaru.spec.ts +++ b/packages/evm/test/05_Yaru.spec.ts @@ -1,174 +1,178 @@ +import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/dist/src/signer-with-address" import { expect } from "chai" -import { ethers, network } from "hardhat" +import { Contract } from "ethers" +import { ethers } from "hardhat" -const DOMAIN_ID = network.config.chainId -const ID_ZERO = 0 -const ID_ONE = 1 -const ID_TWO = 2 +import Message from "./utils/Message" +import { Chains } from "./utils/constants" -const setup = async () => { - const [wallet] = await ethers.getSigners() - const Hashi = await ethers.getContractFactory("Hashi") - const hashi = await Hashi.deploy() - const Yaru = await ethers.getContractFactory("Yaru") - const Yaho = await ethers.getContractFactory("Yaho") - const yaho = await Yaho.deploy() - const yaru = await Yaru.deploy(hashi.address, yaho.address, DOMAIN_ID) - const OracleAdapter = await ethers.getContractFactory("MockOracleAdapter") - const oracleAdapter = await OracleAdapter.deploy() - const PingPong = await ethers.getContractFactory("PingPong") - const pingPong = await PingPong.deploy() +let reporter1: Contract, + reporter2: Contract, + reporter3: Contract, + reporter4: Contract, + owner: SignerWithAddress, + yaho: Contract, + yaru: Contract, + hashi: Contract, + adapter1: Contract, + adapter2: Contract, + adapter3: Contract, + adapter4: Contract, + pingPong1: Contract, + pingPong2: Contract - const message_1 = { - to: pingPong.address, - toChainId: DOMAIN_ID, - data: pingPong.interface.getSighash("ping"), - } - const message_2 = { - to: "0x0000000000000000000000000000000000000002", - toChainId: DOMAIN_ID, - data: 0x02, - } - const hash_one = await yaho.calculateHash(DOMAIN_ID, ID_ZERO, yaho.address, wallet.address, message_1) - const hash_two = await yaho.calculateHash(DOMAIN_ID, ID_ONE, yaho.address, wallet.address, message_2) - const failMessage = { - to: hashi.address, - toChainId: 1, - data: 0x1111111111, - } - const hash_fail = await yaho.calculateHash(DOMAIN_ID, ID_TWO, yaho.address, wallet.address, failMessage) - await oracleAdapter.setHashes(DOMAIN_ID, [ID_ZERO, ID_ONE, ID_TWO], [hash_one, hash_two, hash_fail]) +describe("Yaru", () => { + beforeEach(async () => { + const Yaru = await ethers.getContractFactory("Yaru") + const Yaho = await ethers.getContractFactory("Yaho") + const Hashi = await ethers.getContractFactory("Hashi") + const Reporter = await ethers.getContractFactory("MockReporter") + const Adapter = await ethers.getContractFactory("MockOracleAdapter") + const PingPong = await ethers.getContractFactory("PingPong") - return { - wallet, - hashi, - yaru, - oracleAdapter, - yaho, - hash_one, - hash_two, - failMessage, - hash_fail, - pingPong, - message_1, - message_2, - } -} + const signers = await ethers.getSigners() + owner = signers[0] -describe("Yaru", function () { - describe("constructor()", function () { - it("Successfully deploys contract", async function () { - const { yaru } = await setup() - expect(await yaru.deployed()) - }) - - it("Sets hashi address", async function () { - const { yaru, hashi } = await setup() - expect(await yaru.hashi()).to.equal(hashi.address) - }) - - it("Sets yaho address", async function () { - const { yaru, yaho } = await setup() - expect(await yaru.yaho()).to.equal(yaho.address) - }) + hashi = await Hashi.deploy() + yaho = await Yaho.deploy() + yaru = await Yaru.deploy(hashi.address, yaho.address, Chains.Hardhat) + reporter1 = await Reporter.deploy(yaho.address) + reporter2 = await Reporter.deploy(yaho.address) + reporter3 = await Reporter.deploy(yaho.address) + reporter4 = await Reporter.deploy(yaho.address) + adapter1 = await Adapter.deploy() + adapter2 = await Adapter.deploy() + adapter3 = await Adapter.deploy() + adapter4 = await Adapter.deploy() + pingPong1 = await PingPong.deploy() + pingPong2 = await PingPong.deploy() }) - describe("calculateHash()", function () { - it("calculates correct hash of the given message", async function () { - const { yaru, wallet, hash_one, message_1, yaho } = await setup() - const calculatedHash = await yaru.calculateHash(DOMAIN_ID, 0, yaho.address, wallet.address, message_1) - expect(calculatedHash).to.equal(hash_one) - }) - }) - - describe("executeMessages()", function () { - it("reverts if messages, messageIds, or senders are unequal lengths", async function () { - const { yaru, wallet, oracleAdapter, message_1, message_2 } = await setup() - - await expect( - yaru.executeMessages( - [message_1, message_2], - [ID_ZERO], - [wallet.address, wallet.address], - [oracleAdapter.address], - ), - ) - .to.be.revertedWithCustomError(yaru, "UnequalArrayLengths") - .withArgs(yaru.address) - await expect( - yaru.executeMessages([message_1], [ID_ZERO, ID_ONE], [wallet.address, wallet.address], [oracleAdapter.address]), + describe("executeMessages", async () => { + it("should not be able to execute a message if the chain id is invalid", async () => { + const threshold = 2 + const invalidChainId = Chains.Mainnet + const tx = await yaho.dispatchMessageToAdapters( + invalidChainId, + threshold, + pingPong1.address, + "0x01", + [reporter1.address, reporter2.address], + [adapter1.address, adapter2.address], ) - .to.be.revertedWithCustomError(yaru, "UnequalArrayLengths") - .withArgs(yaru.address) - await expect( - yaru.executeMessages([message_1, message_2], [ID_ZERO, ID_ONE], [wallet.address], [oracleAdapter.address]), - ) - .to.be.revertedWithCustomError(yaru, "UnequalArrayLengths") - .withArgs(yaru.address) - }) - it("reverts if reported hash does not match calculated hash", async function () { - const { yaru, wallet, oracleAdapter, message_1, message_2 } = await setup() - await expect( - yaru.executeMessages( - [message_1, message_2], - [ID_ZERO, ID_TWO], - [wallet.address, wallet.address], - [oracleAdapter.address], - ), - ).to.be.revertedWithCustomError(yaru, "HashMismatch") - await expect( - yaru.executeMessages([message_1], [ID_TWO], [wallet.address], [oracleAdapter.address]), - ).to.be.revertedWithCustomError(yaru, "HashMismatch") - }) - it("reverts if call fails", async function () { - const { yaru, wallet, oracleAdapter, failMessage } = await setup() - await expect( - yaru.executeMessages([failMessage], [ID_TWO], [wallet.address], [oracleAdapter.address]), - ).to.be.revertedWithCustomError(yaru, "CallFailed") - }) - it("executes a message", async function () { - const { yaru, wallet, oracleAdapter, message_1, message_2 } = await setup() - expect(await yaru.executeMessages([message_1], [ID_ZERO], [wallet.address], [oracleAdapter.address])) + const messages = Message.fromReceipt(await tx.wait(1)) + await expect(yaru.executeMessages(messages)) + .to.be.revertedWithCustomError(yaru, "InvalidToChainId") + .withArgs(invalidChainId, Chains.Hardhat) }) - it("executes multiple messages", async function () { - const { yaru, wallet, oracleAdapter, message_1, message_2 } = await setup() - expect( - await yaru.executeMessages( - [message_1, message_2], - [ID_ZERO, ID_ONE], - [wallet.address, wallet.address], - [oracleAdapter.address], - ), + + it("should not be able to execute a message belonging to a different message id (aka DoS attack)", async () => { + const threshold = 2 + const tx = await yaho.dispatchMessageToAdapters( + Chains.Hardhat, + threshold, + pingPong1.address, + "0x01", + [reporter1.address, reporter2.address], + [adapter1.address, adapter2.address], ) - }) - it("reverts if transaction was already executed", async function () { - const { yaru, wallet, oracleAdapter, message_1 } = await setup() - await expect(yaru.executeMessages([message_1], [ID_ZERO], [wallet.address], [oracleAdapter.address])) - await expect( - yaru.executeMessages([message_1], [ID_ZERO], [wallet.address], [oracleAdapter.address]), - ).to.be.revertedWithCustomError(yaru, "AlreadyExecuted") + // This implementation guards against a potential DoS attack where an attacker might exploit a known `messageId` of a valid message. + // In such an attack, the attacker could attempt to execute a different message using the same `messageId`. + // However, since the `messageId` is derived from the message content, any change in the message content results in a different `messageId`. + // Therefore, reusing a `messageId` for a different message is not feasible. + // This change effectively prevents an attacker from executing unauthorized messages by leveraging previously known or valid `messageIds`, + // enhancing the overall security of the system against message replay or substitution attacks. + const [message] = Message.fromReceipt(await tx.wait(1)) + message.data = "0x02" + const hash = await yaho.calculateMessageHash(message.serialize()) + await adapter1.setHashes(Chains.Hardhat, [message.id], [hash]) + await adapter2.setHashes(Chains.Hardhat, [message.id], [hash]) + await expect(yaru.executeMessages([message])).to.be.revertedWithCustomError(yaru, "ThresholdNotMet") }) - it("emits MessageIDExecuted", async function () { - const { yaru, wallet, oracleAdapter, message_1 } = await setup() - await expect(yaru.executeMessages([message_1], [ID_ZERO], [wallet.address], [oracleAdapter.address])) - .to.emit(yaru, "MessageIdExecuted") - .withArgs(DOMAIN_ID, "0x0000000000000000000000000000000000000000000000000000000000000000") + it("should not be able to execute a message if the threshold isn't reached", async () => { + const threshold = 3 + const tx = await yaho.dispatchMessageToAdapters( + Chains.Hardhat, + threshold, + pingPong1.address, + "0x01", + [reporter1.address, reporter2.address, reporter3.address], + [adapter1.address, adapter2.address, reporter3.address], + ) + const [message] = Message.fromReceipt(await tx.wait(1)) + const hash = await yaho.calculateMessageHash(message.serialize()) + await adapter1.setHashes(Chains.Hardhat, [message.id], [hash]) + await adapter2.setHashes(Chains.Hardhat, [message.id], [hash]) + await expect(yaru.executeMessages([message])).to.be.revertedWithCustomError(yaru, "ThresholdNotMet") }) - it("returns returnDatas[] from executedMessages", async function () { - const { yaru, wallet, oracleAdapter, message_1 } = await setup() - const response = await yaru.callStatic.executeMessages( - [message_1], - [ID_ZERO], - [wallet.address], - [oracleAdapter.address], + it(`should be not able to execute an already execute message`, async () => { + const threshold = 2 + const tx = await yaho.dispatchMessageToAdapters( + Chains.Hardhat, + threshold, + pingPong1.address, + "0x01", + [reporter1.address, reporter2.address], + [adapter1.address, adapter2.address], ) - const output = await ethers.utils.defaultAbiCoder.decode(["string"], response[0]) - - expect(output[0]).to.equal("pong") + const [message] = Message.fromReceipt(await tx.wait(1)) + const hash = await yaho.calculateMessageHash(message.serialize()) + await adapter1.setHashes(Chains.Hardhat, [message.id], [hash]) + await adapter2.setHashes(Chains.Hardhat, [message.id], [hash]) + await yaru.executeMessages([message]) + expect(yaru.executeMessages([message])) + .to.be.revertedWithCustomError(yaru, "MessageIdAlreadyExecuted") + .withArgs(message.id) }) + + for (let threshold = 1; threshold <= 4; threshold++) { + it(`should be able to execute 2 messages when the threshold is ${threshold}/4 and the messages reported are ${threshold}`, async () => { + const tx = await yaho.dispatchMessagesToAdapters( + Chains.Hardhat, + [threshold, threshold], + [pingPong1.address, pingPong2.address], + ["0x01", "0x02"], + [reporter1.address, reporter2.address, reporter3.address, reporter4.address], + [adapter1.address, adapter2.address, adapter3.address, adapter4.address], + ) + const [message1, message2] = Message.fromReceipt(await tx.wait(1)) + const hash1 = await yaho.calculateMessageHash(message1.serialize()) + const hash2 = await yaho.calculateMessageHash(message2.serialize()) + const adapters = [adapter1, adapter2, adapter3, adapter4] + for (let i = 0; i < threshold; i++) { + await adapters[i].setHashes(Chains.Hardhat, [message1.id], [hash1]) + await adapters[i].setHashes(Chains.Hardhat, [message2.id], [hash2]) + } + await expect(yaru.executeMessages([message1, message2])) + .to.emit(pingPong1, "Pong") + .and.to.emit(pingPong2, "Pong") + }) + + it(`should be able to execute 2 messages when the threshold is ${threshold}/4 are 4`, async () => { + const tx = await yaho.dispatchMessagesToAdapters( + Chains.Hardhat, + [threshold, threshold], + [pingPong1.address, pingPong2.address], + ["0x01", "0x02"], + [reporter1.address, reporter2.address, reporter3.address, reporter4.address], + [adapter1.address, adapter2.address, adapter3.address, adapter4.address], + ) + const [message1, message2] = Message.fromReceipt(await tx.wait(1)) + const hash1 = await yaho.calculateMessageHash(message1.serialize()) + const hash2 = await yaho.calculateMessageHash(message2.serialize()) + const adapters = [adapter1, adapter2, adapter3, adapter4] + for (let i = 0; i < threshold; i++) { + await adapters[i].setHashes(Chains.Hardhat, [message1.id], [hash1]) + await adapters[i].setHashes(Chains.Hardhat, [message2.id], [hash2]) + } + await expect(yaru.executeMessages([message1, message2])) + .to.emit(pingPong1, "Pong") + .and.to.emit(pingPong2, "Pong") + }) + } }) }) From 59780e0d83fbfcaf97b852ef30aa8773139343c1 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 23 Jan 2024 16:11:16 +0100 Subject: [PATCH 052/297] chore(evm): rm not used stuff --- packages/evm/contracts/test/LocalToken.sol | 25 -- .../evm/test/06_HashiZodiacModule.spec.ts | 280 ------------------ 2 files changed, 305 deletions(-) delete mode 100644 packages/evm/contracts/test/LocalToken.sol delete mode 100644 packages/evm/test/06_HashiZodiacModule.spec.ts diff --git a/packages/evm/contracts/test/LocalToken.sol b/packages/evm/contracts/test/LocalToken.sol deleted file mode 100644 index b7fc7311..00000000 --- a/packages/evm/contracts/test/LocalToken.sol +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.9; - -/* solhint-disable-next-line max-line-length */ -import { ERC20BurnableUpgradeable } from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20BurnableUpgradeable.sol"; -import { ERC20Upgradeable } from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; -import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; -import { Initializable } from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; - -contract LocalToken is Initializable, ERC20Upgradeable, ERC20BurnableUpgradeable, OwnableUpgradeable { - /// @custom:oz-upgrades-unsafe-allow constructor - constructor(string memory _name, string memory _symbol) { - initialize(_name, _symbol); - } - - function initialize(string memory _name, string memory _symbol) public initializer { - __ERC20_init(_name, _symbol); - __ERC20Burnable_init(); - __Ownable_init(); - } - - function mint(address to, uint256 amount) public onlyOwner { - _mint(to, amount); - } -} diff --git a/packages/evm/test/06_HashiZodiacModule.spec.ts b/packages/evm/test/06_HashiZodiacModule.spec.ts deleted file mode 100644 index 6219d108..00000000 --- a/packages/evm/test/06_HashiZodiacModule.spec.ts +++ /dev/null @@ -1,280 +0,0 @@ -/* -Note that these E2E tests simulate cross-chain interactions but, -for the sake of convenience, use only one network as both the origin and destination chain. - -*/ -import { expect } from "chai" -import { ethers, network } from "hardhat" - -const DOMAIN_ID = network.config.chainId -const BYTES32_DOMAIN_ID = "0x0000000000000000000000000000000000000000000000000000000000007A69" -const ADDRESS_ONE = "0x0000000000000000000000000000000000000001" - -const ID_ZERO = 0 -const ID_ONE = 1 -const ID_TWO = 2 - -const baseSetup = async () => { - const [wallet] = await ethers.getSigners() - - // deploy hashi - const Hashi = await ethers.getContractFactory("Hashi") - const hashi = await Hashi.deploy() - - // deploy ShoyuBashi - const ShoyuBashi = await ethers.getContractFactory("ShoyuBashi") - const shoyuBashi = ShoyuBashi.deploy(wallet.address, hashi.address) - - // deploy Yaho - const Yaho = await ethers.getContractFactory("Yaho") - const yaho = await Yaho.deploy() - - // deploy AMB - const AMB = await ethers.getContractFactory("MockAMB") - const amb = await AMB.deploy() - - // deploy and initialize badAMB - // const Mock = await ethers.getContractFactory("Mock") - // const badMock = await Mock.deploy() - // const badAmb = await ethers.getContractAt("IAMB", badMock.address) - // await badMock.givenMethodReturnUint(badAmb.interface.getSighash("messageSourceChainId"), 2) - // await badMock.givenMethodReturnAddress(badAmb.interface.getSighash("messageSender"), ADDRESS_ONE) - - // deploy Yaru - const Yaru = await ethers.getContractFactory("Yaru") - const yaru = await Yaru.deploy(hashi.address, yaho.address, DOMAIN_ID) - - // deploy Oracle Adapter - const AMBMessageRelay = await ethers.getContractFactory("AMBMessageRelay") - const ambMessageRelay = await AMBMessageRelay.deploy(amb.address, yaho.address) - const AMBAdapter = await ethers.getContractFactory("AMBAdapter") - const ambAdapter = await AMBAdapter.deploy(amb.address, ambMessageRelay.address, BYTES32_DOMAIN_ID) - - // deploy avatar - const Avatar = await ethers.getContractFactory("TestAvatar") - const avatar = await Avatar.deploy() - - // const deploy PingPong test contract - const PingPong = await ethers.getContractFactory("PingPong") - const pingPong = await PingPong.deploy() - - return { - avatar, - amb, - ambMessageRelay, - ambAdapter, - wallet, - hashi, - shoyuBashi, - yaho, - yaru, - pingPong, - } -} - -const setupTestWithTestAvatar = async () => { - const base = await baseSetup() - const Module = await ethers.getContractFactory("HashiModule") - const provider = await ethers.getDefaultProvider() - const network = await provider.getNetwork() - const module = await Module.deploy( - base.avatar.address, - base.avatar.address, - base.avatar.address, - base.yaru.address, - base.wallet.address, - DOMAIN_ID, - ) - await base.avatar.setModule(module.address) - return { ...base, Module, module, network } -} - -describe("HashiModule", function () { - describe("setUp()", function () { - it("reverts if avatar is address zero", async () => { - const { Module } = await setupTestWithTestAvatar() - await expect( - Module.deploy( - ethers.constants.AddressZero, - ethers.constants.AddressZero, - ethers.constants.AddressZero, - ethers.constants.AddressZero, - ethers.constants.AddressZero, - DOMAIN_ID, - ), - ).to.be.revertedWithCustomError(Module, "AvatarCannotBeZero") - }) - it("reverts if target is address zero", async () => { - const Module = await ethers.getContractFactory("HashiModule") - await expect( - Module.deploy(ADDRESS_ONE, ADDRESS_ONE, ethers.constants.AddressZero, ADDRESS_ONE, ADDRESS_ONE, DOMAIN_ID), - ).to.be.revertedWithCustomError(Module, "TargetCannotBeZero") - }) - it("should emit SetUp event", async () => { - const { wallet } = await setupTestWithTestAvatar() - const Module = await ethers.getContractFactory("HashiModule") - const module = await Module.deploy(ADDRESS_ONE, ADDRESS_ONE, ADDRESS_ONE, ADDRESS_ONE, ADDRESS_ONE, DOMAIN_ID) - await module.deployed() - await expect(module.deployTransaction) - .to.emit(module, "HashiModuleSetup") - .withArgs(wallet.address, ADDRESS_ONE, ADDRESS_ONE, ADDRESS_ONE) - }) - }) - describe("setYaru()", function () { - it("reverts if not authorized", async () => { - const { module } = await setupTestWithTestAvatar() - await expect(module.setYaru(module.address)).to.be.revertedWith("Ownable: caller is not the owner") - }) - it("reverts if already set to input address", async () => { - const { module, avatar, yaru } = await setupTestWithTestAvatar() - const calldata = module.interface.encodeFunctionData("setYaru", [yaru.address]) - await expect(avatar.exec(module.address, 0, calldata)).to.be.revertedWithCustomError(module, "DuplicateYaru") - }) - it("updates Yaru address", async () => { - const { module, avatar } = await setupTestWithTestAvatar() - const calldata = module.interface.encodeFunctionData("setYaru", [avatar.address]) - expect(await avatar.exec(module.address, 0, calldata)) - }) - it("emits YaruSet event", async () => { - const { module, avatar } = await setupTestWithTestAvatar() - const calldata = module.interface.encodeFunctionData("setYaru", [avatar.address]) - await expect(avatar.exec(module.address, 0, calldata)) - .to.emit(module, "YaruSet") - .withArgs(module.address, avatar.address) - }) - }) - describe("setChainId()", function () { - it("reverts if not authorized", async () => { - const { module } = await setupTestWithTestAvatar() - await expect(module.setChainId(1)).to.be.revertedWith("Ownable: caller is not the owner") - }) - it("reverts if already set to input id", async () => { - const { module, avatar } = await setupTestWithTestAvatar() - const calldata = module.interface.encodeFunctionData("setChainId", [DOMAIN_ID]) - await expect(avatar.exec(module.address, 0, calldata)).to.be.revertedWithCustomError(module, "DuplicateChainId") - }) - it("updates chainId", async () => { - const { module, avatar } = await setupTestWithTestAvatar() - const calldata = module.interface.encodeFunctionData("setYaru", [avatar.address]) - expect(await avatar.exec(module.address, 0, calldata)) - }) - it("emits ChainIdSet event", async () => { - const { module, avatar } = await setupTestWithTestAvatar() - const calldata = module.interface.encodeFunctionData("setYaru", [avatar.address]) - await expect(avatar.exec(module.address, 0, calldata)) - .to.emit(module, "YaruSet") - .withArgs(module.address, avatar.address) - }) - }) - describe("setController()", function () { - it("reverts if not authorized", async () => { - const { module } = await setupTestWithTestAvatar() - await expect(module.setController(ADDRESS_ONE)).to.be.revertedWith("Ownable: caller is not the owner") - }) - it("reverts if already set to input address", async () => { - const { module, avatar, wallet } = await setupTestWithTestAvatar() - const calldata = module.interface.encodeFunctionData("setController", [wallet.address]) - await expect(avatar.exec(module.address, 0, calldata)).to.be.revertedWithCustomError( - module, - "DuplicateController", - ) - }) - it("updates controller", async () => { - const { module, avatar } = await setupTestWithTestAvatar() - const calldata = module.interface.encodeFunctionData("setController", [ADDRESS_ONE]) - expect(await avatar.exec(module.address, 0, calldata)) - }) - it("emits ControllerSet event", async () => { - const { module, avatar } = await setupTestWithTestAvatar() - const calldata = module.interface.encodeFunctionData("setController", [ADDRESS_ONE]) - await expect(avatar.exec(module.address, 0, calldata)) - .to.emit(module, "ControllerSet") - .withArgs(module.address, ADDRESS_ONE) - }) - }) - describe("executeTrasnaction()", function () { - it("reverts if hashi is unauthorized", async () => { - const { module, wallet } = await setupTestWithTestAvatar() - await expect(module.executeTransaction(ADDRESS_ONE, 0, "0x", 0)) - .to.be.revertedWithCustomError(module, "UnauthorizedYaru") - .withArgs(module.address, wallet.address) - }) - it("reverts if messageSender is unauthorized", async () => { - const { avatar, pingPong, yaho, ambMessageRelay, ambAdapter, module, wallet, yaru } = - await setupTestWithTestAvatar() - - // change controller to ADDRESS_ONE so it's different to sender - const controllerCalldata = module.interface.encodeFunctionData("setController", [ADDRESS_ONE]) - expect(await avatar.exec(module.address, 0, controllerCalldata)) - - const calldata = await pingPong.interface.encodeFunctionData("ping", []) - const tx = await module.interface.encodeFunctionData("executeTransaction", [pingPong.address, 0, calldata, 0]) - const message = { - to: module.address, - toChainId: DOMAIN_ID, - data: tx, - } - - // dispatch message - await yaho.dispatchMessagesToAdapters([message], [ambMessageRelay.address], [ambAdapter.address]) - // execute messages - await expect(yaru.executeMessages([message], [ID_ZERO], [wallet.address], [ambAdapter.address])).to.be.reverted - }) - it("reverts if chainId is incorrect", async () => { - const { avatar, pingPong, yaho, ambMessageRelay, ambAdapter, module, wallet, yaru } = - await setupTestWithTestAvatar() - - // change chainId to something random so the transaction fails - const controllerCalldata = module.interface.encodeFunctionData("setChainId", [123]) - expect(await avatar.exec(module.address, 0, controllerCalldata)) - - const calldata = await pingPong.interface.encodeFunctionData("ping", []) - const tx = await module.interface.encodeFunctionData("executeTransaction", [pingPong.address, 0, calldata, 0]) - const message = { - to: module.address, - toChainId: DOMAIN_ID, - data: tx, - } - - // dispatch message - await yaho.dispatchMessagesToAdapters([message], [ambMessageRelay.address], [ambAdapter.address]) - // execute messages - await expect(yaru.executeMessages([message], [ID_ZERO], [wallet.address], [ambAdapter.address])).to.be.reverted - }) - it("reverts if module transaction fails", async () => { - const { pingPong, yaho, ambMessageRelay, ambAdapter, module, wallet, yaru } = await setupTestWithTestAvatar() - - // invalid function selector for pingPong - const calldata = "0x12345678" - const tx = await module.interface.encodeFunctionData("executeTransaction", [pingPong.address, 0, calldata, 0]) - const message = { - to: module.address, - toChainId: DOMAIN_ID, - data: tx, - } - - // dispatch message - await yaho.dispatchMessagesToAdapters([message], [ambMessageRelay.address], [ambAdapter.address]) - - await expect(yaru.executeMessages([message], [ID_ZERO], [wallet.address], [ambAdapter.address])).to.be.reverted - }) - it("executes a transaction", async () => { - const { pingPong, yaho, ambMessageRelay, ambAdapter, module, wallet, yaru } = await setupTestWithTestAvatar() - const calldata = await pingPong.interface.encodeFunctionData("ping", []) - const tx = await module.interface.encodeFunctionData("executeTransaction", [pingPong.address, 0, calldata, 0]) - const message = { - to: module.address, - toChainId: DOMAIN_ID, - data: tx, - } - const pingCount = await pingPong.count() - - // dispatch message - await yaho.dispatchMessagesToAdapters([message], [ambMessageRelay.address], [ambAdapter.address]) - // execute messages - await yaru.executeMessages([message], [ID_ZERO], [wallet.address], [ambAdapter.address]) - - expect(await pingPong.count()).to.equal(pingCount + 1) - }) - }) -}) From 48e40951f88015dc168ff99e9bed2b9c6011a0cd Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 23 Jan 2024 16:26:01 +0100 Subject: [PATCH 053/297] refactor(evm): changes reporters type within Message struct --- packages/evm/contracts/Yaho.sol | 16 ++++++++-------- packages/evm/contracts/interfaces/IMessage.sol | 3 ++- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/evm/contracts/Yaho.sol b/packages/evm/contracts/Yaho.sol index 30f7f986..e9644da5 100644 --- a/packages/evm/contracts/Yaho.sol +++ b/packages/evm/contracts/Yaho.sol @@ -17,7 +17,7 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { uint256 threshold, address receiver, bytes calldata data, - address[] calldata reporters, + IReporter[] calldata reporters, IOracleAdapter[] calldata adapters ) external returns (uint256) { _checkReportersAndAdapters(threshold, reporters, adapters); @@ -31,7 +31,7 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { uint256 threshold, address receiver, bytes calldata data, - address[] calldata reporters, + IReporter[] calldata reporters, IOracleAdapter[] calldata adapters ) external returns (uint256, bytes32[] memory) { _checkReportersAndAdapters(threshold, reporters, adapters); @@ -59,7 +59,7 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { uint256[] calldata thresholds, address[] calldata receivers, bytes[] calldata data, - address[] calldata reporters, + IReporter[] calldata reporters, IOracleAdapter[] calldata adapters ) external payable returns (uint256[] memory, bytes32[] memory) { if (thresholds.length != receivers.length) revert UnequalArrayLengths(thresholds.length, receivers.length); @@ -129,7 +129,7 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { function _checkReportersAndAdapters( uint256 threshold, - address[] calldata reporters, + IReporter[] calldata reporters, IOracleAdapter[] calldata adapters ) internal pure { if (reporters.length == 0) revert NoReportersGiven(); @@ -143,7 +143,7 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { uint256 threshold, address receiver, bytes calldata data, - address[] calldata reporters, + IReporter[] calldata reporters, IOracleAdapter[] calldata adapters ) internal returns (uint256, bytes32) { address sender = msg.sender; @@ -168,7 +168,7 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { uint256 toChainId, uint256 messageId, bytes32 messageHash, - address[] memory reporters, + IReporter[] memory reporters, IOracleAdapter[] memory adapters ) internal returns (bytes32[] memory) { uint256[] memory messageIds = new uint256[](1); @@ -182,13 +182,13 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { uint256 toChainId, uint256[] memory messageIds, bytes32[] memory messageHashes, - address[] memory reporters, + IReporter[] memory reporters, IOracleAdapter[] memory adapters ) internal returns (bytes32[] memory) { bytes32[] memory reportersReceipts = new bytes32[](reporters.length); for (uint256 i = 0; i < reporters.length; ) { - reportersReceipts[i] = IReporter(reporters[i]).dispatchMessages( + reportersReceipts[i] = reporters[i].dispatchMessages( toChainId, adapters[i], messageIds, diff --git a/packages/evm/contracts/interfaces/IMessage.sol b/packages/evm/contracts/interfaces/IMessage.sol index 8d36be62..d3a06144 100644 --- a/packages/evm/contracts/interfaces/IMessage.sol +++ b/packages/evm/contracts/interfaces/IMessage.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; +import { IReporter } from "./IReporter.sol"; import { IOracleAdapter } from "./IOracleAdapter.sol"; struct Message { @@ -10,6 +11,6 @@ struct Message { address sender; address receiver; bytes data; - address[] reporters; + IReporter[] reporters; IOracleAdapter[] adapters; } From 081ce8b5c2e3441a9a27f59defd763b52c0a3b78 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 23 Jan 2024 16:26:44 +0100 Subject: [PATCH 054/297] refactor(evm): changes reporters type within IYaho --- packages/evm/contracts/interfaces/IYaho.sol | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/evm/contracts/interfaces/IYaho.sol b/packages/evm/contracts/interfaces/IYaho.sol index 0b079596..08338e86 100644 --- a/packages/evm/contracts/interfaces/IYaho.sol +++ b/packages/evm/contracts/interfaces/IYaho.sol @@ -4,6 +4,7 @@ pragma solidity ^0.8.17; import { IMessageHashCalculator } from "./IMessageHashCalculator.sol"; import { IMessageIdCalculator } from "./IMessageIdCalculator.sol"; import { Message } from "./IMessage.sol"; +import { IReporter } from "./IReporter.sol"; import { IOracleAdapter } from "./IOracleAdapter.sol"; interface IYaho is IMessageHashCalculator, IMessageIdCalculator { @@ -23,7 +24,7 @@ interface IYaho is IMessageHashCalculator, IMessageIdCalculator { uint256 threshold, address receiver, bytes calldata data, - address[] calldata reporters, + IReporter[] calldata reporters, IOracleAdapter[] calldata adapters ) external returns (uint256); @@ -32,7 +33,7 @@ interface IYaho is IMessageHashCalculator, IMessageIdCalculator { uint256 threshold, address receiver, bytes calldata data, - address[] calldata reporters, + IReporter[] calldata reporters, IOracleAdapter[] calldata adapters ) external returns (uint256, bytes32[] memory); @@ -41,7 +42,7 @@ interface IYaho is IMessageHashCalculator, IMessageIdCalculator { uint256[] calldata thresholds, address[] calldata receivers, bytes[] calldata data, - address[] calldata reporters, + IReporter[] calldata reporters, IOracleAdapter[] calldata adapters ) external payable returns (uint256[] memory, bytes32[] memory); From 749ba23b2c6be17e256fb1cd02a49631806183f1 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 23 Jan 2024 17:41:43 +0100 Subject: [PATCH 055/297] feat(evm): adds a test for Yaru --- packages/evm/test/05_Yaru.spec.ts | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/packages/evm/test/05_Yaru.spec.ts b/packages/evm/test/05_Yaru.spec.ts index 2c768c59..24a97a08 100644 --- a/packages/evm/test/05_Yaru.spec.ts +++ b/packages/evm/test/05_Yaru.spec.ts @@ -109,7 +109,7 @@ describe("Yaru", () => { await expect(yaru.executeMessages([message])).to.be.revertedWithCustomError(yaru, "ThresholdNotMet") }) - it(`should be not able to execute an already execute message`, async () => { + it(`should not be able to execute an already execute message`, async () => { const threshold = 2 const tx = await yaho.dispatchMessageToAdapters( Chains.Hardhat, @@ -129,6 +129,24 @@ describe("Yaru", () => { .withArgs(message.id) }) + it(`should not be able to execute a message using different adapters`, async () => { + const threshold = 2 + const tx = await yaho.dispatchMessageToAdapters( + Chains.Hardhat, + threshold, + pingPong1.address, + "0x01", + [reporter1.address, reporter2.address], + [adapter1.address, adapter2.address], + ) + const [message] = Message.fromReceipt(await tx.wait(1)) + const hash = await yaho.calculateMessageHash(message.serialize()) + await adapter1.setHashes(Chains.Hardhat, [message.id], [hash]) + await adapter2.setHashes(Chains.Hardhat, [message.id], [hash]) + message.adapters = [adapter3.address as `0x${string}`, adapter4.address as `0x${string}`] + expect(yaru.executeMessages([message])).to.be.revertedWithCustomError(yaru, "ThresholdNotMet") + }) + for (let threshold = 1; threshold <= 4; threshold++) { it(`should be able to execute 2 messages when the threshold is ${threshold}/4 and the messages reported are ${threshold}`, async () => { const tx = await yaho.dispatchMessagesToAdapters( From 11cddd9d1aefe3fc176626ec7f84ad56f0de2556 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 23 Jan 2024 17:58:49 +0100 Subject: [PATCH 056/297] refactor(evm): adds fx descriptions within IHashi --- packages/evm/contracts/interfaces/IHashi.sol | 55 ++++++++++++-------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/packages/evm/contracts/interfaces/IHashi.sol b/packages/evm/contracts/interfaces/IHashi.sol index 7d8eb62a..2f352c22 100644 --- a/packages/evm/contracts/interfaces/IHashi.sol +++ b/packages/evm/contracts/interfaces/IHashi.sol @@ -3,17 +3,22 @@ pragma solidity ^0.8.17; import { IOracleAdapter } from "./IOracleAdapter.sol"; +/** + * @title IHashi + */ interface IHashi { error NoOracleAdaptersGiven(); error OracleDidNotReport(IOracleAdapter oracleAdapter); error OraclesDisagree(IOracleAdapter oracleOne, IOracleAdapter oracleTwo); - /// @dev Checks whether threshold is reached for a message given a set of oracleAdapters - /// @param domain ID of the domain to query. - /// @param id ID for which to return hash. - /// @param threshold to use. - /// @param oracleAdapters Array of address for the oracle adapters to query. - /// @return a boolean indicating if a threshold for a given message has been reached. + /** + * @dev Checks whether the threshold is reached for a message given a set of oracleAdapters. + * @param domain - ID of the domain to query. + * @param id - ID for which to return hash. + * @param threshold - Threshold to use. + * @param oracleAdapters - Array of addresses for the oracle adapters to query. + * @return result A boolean indicating if a threshold for a given message has been reached. + */ function checkHashWithThresholdFromOracles( uint256 domain, uint256 id, @@ -21,34 +26,40 @@ interface IHashi { IOracleAdapter[] calldata oracleAdapters ) external view returns (bool); - /// @dev Returns the hash reported by a given oracle for a given ID. - /// @param domain Id of the domain to query. - /// @param id ID for which to return a hash. - /// @param oracleAdapter Address of the oracle adapter to query. - /// @return hash Hash reported by the given oracle adapter for the given ID number. + /** + * @dev Returns the hash reported by a given oracle for a given ID. + * @param domain - ID of the domain to query. + * @param id - ID for which to return a hash. + * @param oracleAdapter - Address of the oracle adapter to query. + * @return hash reported by the given oracle adapter for the given ID. + */ function getHashFromOracle( uint256 domain, uint256 id, IOracleAdapter oracleAdapter ) external view returns (bytes32); - /// @dev Returns the hash for a given ID reported by a given set of oracles. - /// @param domain ID of the domain to query. - /// @param id ID for which to return hashs. - /// @param oracleAdapters Array of address for the oracle adapters to query. - /// @return hashes Array of hash reported by the given oracle adapters for the given ID. + /** + * @dev Returns the hashes for a given ID reported by a given set of oracles. + * @param domain - The ID of the domain to query. + * @param id - The ID for which to return hashes. + * @param oracleAdapters - An array of addresses for the oracle adapters to query. + * @return hashes An array of hashes reported by the given oracle adapters for the specified ID. + */ function getHashesFromOracles( uint256 domain, uint256 id, IOracleAdapter[] calldata oracleAdapters ) external view returns (bytes32[] memory); - /// @dev Returns the hash unanimously agreed upon by a given set of oracles. - /// @param domain ID of the domain to query. - /// @param id ID for which to return hash. - /// @param oracleAdapters Array of address for the oracle adapters to query. - /// @return hash Hash agreed on by the given set of oracle adapters. - /// @notice MUST revert if oracles disagree on the hash or if an oracle does not report. + /** + * @dev Returns the hash unanimously agreed upon by a given set of oracles. + * @param domain - The ID of the domain to query. + * @param id - The ID for which to return a hash. + * @param oracleAdapters - An array of addresses for the oracle adapters to query. + * @return hash agreed on by the given set of oracle adapters. + * @notice MUST revert if oracles disagree on the hash or if an oracle does not report. + */ function getHash( uint256 domain, uint256 id, From 3d8adecda8e036785bbba0606f8b43ced9b49cc3 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 23 Jan 2024 18:46:30 +0100 Subject: [PATCH 057/297] refactor(evm): adds fx descriptions for the interfaces --- packages/evm/contracts/interfaces/IJushin.sol | 11 +++++ .../interfaces/IMessageHashCalculator.sol | 8 ++++ .../interfaces/IMessageIdCalculator.sol | 11 +++++ packages/evm/contracts/interfaces/IYaho.sol | 43 ++++++++++++++++++- packages/evm/contracts/interfaces/IYaru.sol | 8 ++++ 5 files changed, 80 insertions(+), 1 deletion(-) diff --git a/packages/evm/contracts/interfaces/IJushin.sol b/packages/evm/contracts/interfaces/IJushin.sol index 38aa4f54..355aacc2 100644 --- a/packages/evm/contracts/interfaces/IJushin.sol +++ b/packages/evm/contracts/interfaces/IJushin.sol @@ -1,7 +1,18 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; +/** + * @title IJushin + */ interface IJushin { + /** + * @dev Handles the incoming message from a specified chain. + * @param fromChainId - The ID of the origin chain from which the message originates. + * @param messageId - The unique identifier of the message. + * @param sender - The address of the sender of the message on the origin chain. + * @param data - The data contained in the message, in bytes. + * @return result bytes at the user's choice + */ function onMessage( uint256 fromChainId, uint256 messageId, diff --git a/packages/evm/contracts/interfaces/IMessageHashCalculator.sol b/packages/evm/contracts/interfaces/IMessageHashCalculator.sol index 9644137d..97ba8d81 100644 --- a/packages/evm/contracts/interfaces/IMessageHashCalculator.sol +++ b/packages/evm/contracts/interfaces/IMessageHashCalculator.sol @@ -3,6 +3,14 @@ pragma solidity ^0.8.17; import { Message } from "./IMessage.sol"; +/** + * @title IMessageHashCalculator + */ interface IMessageHashCalculator { + /** + * @dev Calculates and returns the hash of a given message. + * @param message - The `Message` structure containing various fields to be hashed. + * @return hash The keccak256 hash of the message, represented as a 32-byte hexadecimal string. + */ function calculateMessageHash(Message memory message) external pure returns (bytes32); } diff --git a/packages/evm/contracts/interfaces/IMessageIdCalculator.sol b/packages/evm/contracts/interfaces/IMessageIdCalculator.sol index 7d3c515b..18265740 100644 --- a/packages/evm/contracts/interfaces/IMessageIdCalculator.sol +++ b/packages/evm/contracts/interfaces/IMessageIdCalculator.sol @@ -1,7 +1,18 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; +/** + * @title IMessageIdCalculator + */ interface IMessageIdCalculator { + /** + * @dev Calculates and returns a unique identifier (ID) for a message. + * + * @param fromChainId - The ID of the chain from which the message originates. + * @param dispatcherAddress - The address of the dispatcher sending the message. + * @param messageHash - The keccak256 hash of the message, represented as a 32-byte hexadecimal string. + * @return messageId The unique identifier for the message, calculated based on the input parameters. + */ function calculateMessageId( uint256 fromChainId, address dispatcherAddress, diff --git a/packages/evm/contracts/interfaces/IYaho.sol b/packages/evm/contracts/interfaces/IYaho.sol index 08338e86..18280d6c 100644 --- a/packages/evm/contracts/interfaces/IYaho.sol +++ b/packages/evm/contracts/interfaces/IYaho.sol @@ -19,6 +19,16 @@ interface IYaho is IMessageHashCalculator, IMessageIdCalculator { event MessageDispatched(uint256 indexed messageId, Message message); + /** + * @dev Dispatches a message to a specified chain with a set of validation parameters without calling the reporters. It just write in storage a commitment of message. In order to dispatch it to the reporters, you must then invoke `relayMessagesToAdapters` + * @param toChainId - The ID of the target chain to which the message is being sent. + * @param threshold - The minimum number of adapters required to have stored the same message. + * @param receiver - The address of the receiver on the destination chain. + * @param data - The data being sent in the message, represented as a byte array. + * @param reporters - An array of `IReporter` contracts (not actively used in this step). + * @param adapters - An array of `IOracleAdapter` contracts (for later validation use). + * @return messageId A unique identifier for the dispatched message, used for tracking and subsequent validation. + */ function dispatchMessage( uint256 toChainId, uint256 threshold, @@ -28,6 +38,16 @@ interface IYaho is IMessageHashCalculator, IMessageIdCalculator { IOracleAdapter[] calldata adapters ) external returns (uint256); + /** + * @dev Dispatches a message to a specified chain with a set of validation parameters and calls the reporters. + * @param toChainId - The ID of the target chain to which the message is being sent. + * @param threshold - The minimum number of adapters required to have stored the same message. + * @param receiver - The address of the receiver on the destination chain. + * @param data - The data being sent in the message, represented as a byte array. + * @param reporters - An array of `IReporter` contracts (not actively used in this step). + * @param adapters - An array of `IOracleAdapter` contracts (for later validation use). + * @return (messageId, result) A unique identifier for the dispatched message and an array of byte arrays, where each element is the result of dispatching a respective message to the corresponding Reporter. + */ function dispatchMessageToAdapters( uint256 toChainId, uint256 threshold, @@ -35,8 +55,18 @@ interface IYaho is IMessageHashCalculator, IMessageIdCalculator { bytes calldata data, IReporter[] calldata reporters, IOracleAdapter[] calldata adapters - ) external returns (uint256, bytes32[] memory); + ) external payable returns (uint256, bytes32[] memory); + /** + * @dev Dispatches an array of messages to specified chains and calls the reporters. + * @param toChainId - The ID of the destination chain for all messages. + * @param thresholds - An array of minimum validation thresholds required for each message. + * @param receivers - An array of addresses for the receivers on the destination chain, one for each message. + * @param data - An array of data payloads for each message, represented as byte arrays. + * @param reporters - An array of `IReporter` contracts for reporting the status of each message. + * @param adapters - An array of `IOracleAdapter` contracts used for the validation of each message. + * @return (messageIds, result) An array of unique identifiers for the dispatched messages and an array of bytes32 arrays, where each element is the result of dispatching a respective message to the corresponding Reporter. + */ function dispatchMessagesToAdapters( uint256 toChainId, uint256[] calldata thresholds, @@ -46,7 +76,18 @@ interface IYaho is IMessageHashCalculator, IMessageIdCalculator { IOracleAdapter[] calldata adapters ) external payable returns (uint256[] memory, bytes32[] memory); + /** + * @dev Retrieves the hash of a pending message that was dispatched via `dispatchMessage` but has not yet been relayed to adapters using `relayingMessagesToAdapters`. + * @param messageId - The unique identifier of the message for which the hash is being retrieved. + * @return messageHash The hash of the pending message if it exists. + */ function getPendingMessageHash(uint256 messageId) external view returns (bytes32); + /** + * @dev Relays an array of messages to their respective oracle adapters. In order to be able to aggregate messages within the reporter, it's mandatory that all messages have the same toChainId, reporters and adapters. + * + * @param messages - An array of `Message` structures to be relayed to the oracle adapters. + * @return result An array of bytes32 arrays, where each element is the result of dispatching a respective all messages to the corresponding Reporter. + */ function relayMessagesToAdapters(Message[] calldata messages) external payable returns (bytes32[] memory); } diff --git a/packages/evm/contracts/interfaces/IYaru.sol b/packages/evm/contracts/interfaces/IYaru.sol index 08add12b..eaa7c7c0 100644 --- a/packages/evm/contracts/interfaces/IYaru.sol +++ b/packages/evm/contracts/interfaces/IYaru.sol @@ -5,6 +5,9 @@ import { Message } from "./IMessage.sol"; import { IMessageHashCalculator } from "./IMessageHashCalculator.sol"; import { IMessageIdCalculator } from "./IMessageIdCalculator.sol"; +/** + * @title IYaru + */ interface IYaru is IMessageHashCalculator, IMessageIdCalculator { error InvalidToChainId(uint256 chainId, uint256 expectedChainId); error MessageIdAlreadyExecuted(uint256 messageId); @@ -13,5 +16,10 @@ interface IYaru is IMessageHashCalculator, IMessageIdCalculator { event MessageExecuted(uint256 indexed messageId, Message message); + /** + * @dev Executes a batch of messages and returns the results if the threshold for a single message has been reached + * @param messages - An array of `Message` structures + * @return result An array of byte arrays, where each byte array is the result of executing a respective message from the input. + */ function executeMessages(Message[] calldata messages) external returns (bytes[] memory); } From 7effd4031d4d7ea361972289590b40978dbe70e3 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 23 Jan 2024 18:47:29 +0100 Subject: [PATCH 058/297] chore(evm): adds missing payable and rm a comment within Yaho --- packages/evm/contracts/Yaho.sol | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/packages/evm/contracts/Yaho.sol b/packages/evm/contracts/Yaho.sol index e9644da5..65407b00 100644 --- a/packages/evm/contracts/Yaho.sol +++ b/packages/evm/contracts/Yaho.sol @@ -33,7 +33,7 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { bytes calldata data, IReporter[] calldata reporters, IOracleAdapter[] calldata adapters - ) external returns (uint256, bytes32[] memory) { + ) external payable returns (uint256, bytes32[] memory) { _checkReportersAndAdapters(threshold, reporters, adapters); (uint256 messageId, bytes32 messageHash) = _dispatchMessage( toChainId, @@ -97,8 +97,6 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { function relayMessagesToAdapters(Message[] calldata messages) external payable returns (bytes32[] memory) { if (messages.length == 0) revert NoMessagesGiven(); - // NOTE: In order to be able to aggregate messages within the reporter, - // it's mandatory that all messages have the same toChainId, reporters and adapters. bytes32 expectedParams = keccak256( abi.encode(messages[0].toChainId, messages[0].reporters, messages[0].adapters) ); @@ -188,12 +186,7 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { bytes32[] memory reportersReceipts = new bytes32[](reporters.length); for (uint256 i = 0; i < reporters.length; ) { - reportersReceipts[i] = reporters[i].dispatchMessages( - toChainId, - adapters[i], - messageIds, - messageHashes - ); + reportersReceipts[i] = reporters[i].dispatchMessages(toChainId, adapters[i], messageIds, messageHashes); for (uint256 j = 0; j < messageIds.length; ) { delete _pendingMessageHashes[messageIds[j]]; From c3e0c5b534cd836e089cb9840b64d82b6407e7d7 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 24 Jan 2024 07:18:53 +0100 Subject: [PATCH 059/297] feat(evm): adds Reporter --- packages/evm/contracts/adapters/Reporter.sol | 60 +++++++++++++++++++ .../evm/contracts/interfaces/IReporter.sol | 22 +++++-- 2 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 packages/evm/contracts/adapters/Reporter.sol diff --git a/packages/evm/contracts/adapters/Reporter.sol b/packages/evm/contracts/adapters/Reporter.sol new file mode 100644 index 00000000..8a780b8e --- /dev/null +++ b/packages/evm/contracts/adapters/Reporter.sol @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity ^0.8.17; + +import { IHeaderStorage } from "../interfaces/IHeaderStorage.sol"; +import { IReporter } from "../interfaces/IReporter.sol"; +import { IOracleAdapter } from "../interfaces/IOracleAdapter.sol"; + +abstract contract Reporter is IReporter { + address public immutable HEADER_STORAGE; + address public immutable YAHO; + + modifier onlyYaho() { + if (msg.sender != YAHO) revert NotYaho(msg.sender, YAHO); + _; + } + + constructor(address headerStorage, address yaho) { + HEADER_STORAGE = headerStorage; + YAHO = yaho; + } + + /// @inheritdoc IReporter + function dispatchBlocks( + uint256 toChainId, + IOracleAdapter adapter, + uint256[] memory blockNumbers + ) external payable returns (bytes32) { + bytes32[] memory blockHeaders = IHeaderStorage(HEADER_STORAGE).storeBlockHeaders(blockNumbers); + for (uint256 i = 0; i < blockNumbers.length; ) { + emit BlockDispatched(toChainId, adapter, blockNumbers[i], blockHeaders[i]); + unchecked { + ++i; + } + } + return _sendPayload(toChainId, address(adapter), blockNumbers, blockHeaders); + } + + /// @inheritdoc IReporter + function dispatchMessages( + uint256 toChainId, + IOracleAdapter adapter, + uint256[] memory messageIds, + bytes32[] memory messageHashes + ) external payable onlyYaho returns (bytes32) { + for (uint256 i = 0; i < messageIds.length; ) { + emit MessageDispatched(toChainId, adapter, messageIds[i], messageHashes[i]); + unchecked { + ++i; + } + } + return _sendPayload(toChainId, address(adapter), messageIds, messageHashes); + } + + function _sendPayload( + uint256 toChainId, + address adapter, + uint256[] memory messageIds, + bytes32[] memory messageHashes + ) internal virtual returns (bytes32); +} diff --git a/packages/evm/contracts/interfaces/IReporter.sol b/packages/evm/contracts/interfaces/IReporter.sol index d81ffeac..c9cfbacf 100644 --- a/packages/evm/contracts/interfaces/IReporter.sol +++ b/packages/evm/contracts/interfaces/IReporter.sol @@ -4,17 +4,31 @@ pragma solidity ^0.8.17; import { IOracleAdapter } from "./IOracleAdapter.sol"; interface IReporter { + event BlockDispatched( + uint256 indexed toChainId, + IOracleAdapter adapter, + uint256 indexed blockNumber, + bytes32 blockHeader + ); + event MessageDispatched( + uint256 indexed toChainId, + IOracleAdapter adapter, + uint256 indexed messageId, + bytes32 messageHash + ); + + error NotYaho(address sender, address expectedYaho); + function dispatchBlocks( uint256 toChainId, IOracleAdapter adapter, - uint256[] memory blockNumbers, - bytes32[] memory blockHeaders - ) external returns (bytes32); + uint256[] memory blockNumbers + ) external payable returns (bytes32); function dispatchMessages( uint256 toChainId, IOracleAdapter adapter, uint256[] memory messageIds, bytes32[] memory messageHashes - ) external returns (bytes32); + ) external payable returns (bytes32); } From 2e1354c107ad2485739c3bffa1e1b776a321667f Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 24 Jan 2024 07:20:29 +0100 Subject: [PATCH 060/297] feat(evm): adds tests for Reporter and aligns the Yaho and Yaru ones --- packages/evm/contracts/test/MockReporter.sol | 39 ++--------- packages/evm/test/04_Yaho.spec.ts | 29 ++++---- packages/evm/test/05_Yaru.spec.ts | 16 ++--- packages/evm/test/adapters/Reporter.spec.ts | 69 ++++++++++++++++++++ 4 files changed, 95 insertions(+), 58 deletions(-) create mode 100644 packages/evm/test/adapters/Reporter.spec.ts diff --git a/packages/evm/contracts/test/MockReporter.sol b/packages/evm/contracts/test/MockReporter.sol index a2ad50b7..6a6ca232 100644 --- a/packages/evm/contracts/test/MockReporter.sol +++ b/packages/evm/contracts/test/MockReporter.sol @@ -1,42 +1,11 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; -import { IReporter } from "../interfaces/IReporter.sol"; +import { Reporter } from "../adapters/Reporter.sol"; import { IOracleAdapter } from "../interfaces/IOracleAdapter.sol"; -contract MockReporter is IReporter { - address public immutable YAHO; +contract MockReporter is Reporter { + constructor(address headerStorage, address yaho) Reporter(headerStorage, yaho) {} - error NotYaho(); - - event MessageReported(uint256 toChainId, IOracleAdapter adapter, uint256 messageId, bytes32 messageHash); - - modifier onlyYaho() { - if (msg.sender != YAHO) revert NotYaho(); - _; - } - - constructor(address yaho) { - YAHO = yaho; - } - - function dispatchBlocks( - uint256 toChainId, - IOracleAdapter adapter, - uint256[] memory blockNumbers, - bytes32[] memory blockHeaders - ) external returns (bytes32) {} - - function dispatchMessages( - uint256 toChainId, - IOracleAdapter adapter, - uint256[] memory messageIds, - bytes32[] memory messageHashes - ) external onlyYaho returns (bytes32) { - // _sendPayload(abi.encode(messageIds, messageHashes)); - for (uint256 i = 0; i < messageIds.length; i++) { - emit MessageReported(toChainId, adapter, messageIds[i], messageHashes[i]); - } - return (bytes32(0)); - } + function _sendPayload(uint256, address, uint256[] memory, bytes32[] memory) internal override returns (bytes32) {} } diff --git a/packages/evm/test/04_Yaho.spec.ts b/packages/evm/test/04_Yaho.spec.ts index a616588c..695f8256 100644 --- a/packages/evm/test/04_Yaho.spec.ts +++ b/packages/evm/test/04_Yaho.spec.ts @@ -10,7 +10,7 @@ import { Chains } from "./utils/constants" let reporter1: Contract, reporter2: Contract, - owner: SignerWithAddress, + headerStorage: Contract, yaho: Contract, receiver1: SignerWithAddress, receiver2: SignerWithAddress, @@ -21,17 +21,18 @@ describe("Yaho", () => { beforeEach(async () => { const Yaho = await ethers.getContractFactory("Yaho") const Reporter = await ethers.getContractFactory("MockReporter") + const HeaderStorage = await ethers.getContractFactory("HeaderStorage") const signers = await ethers.getSigners() - owner = signers[0] receiver1 = await signers[1] receiver2 = await signers[2] adapter1 = await signers[3] adapter2 = await signers[4] + headerStorage = await HeaderStorage.deploy() yaho = await Yaho.deploy() - reporter1 = await Reporter.deploy(yaho.address) - reporter2 = await Reporter.deploy(yaho.address) + reporter1 = await Reporter.deploy(headerStorage.address, yaho.address) + reporter2 = await Reporter.deploy(headerStorage.address, yaho.address) }) describe("dispatchMessage", () => { @@ -145,9 +146,9 @@ describe("Yaho", () => { await expect(tx) .to.emit(yaho, "MessageDispatched") .withArgs(message.id, anyValue) // FIXME: https://github.com/NomicFoundation/hardhat/issues/3833 - .and.to.emit(reporter1, "MessageReported") + .and.to.emit(reporter1, "MessageDispatched") .withArgs(toChainId, adapter1.address, message.id, await yaho.calculateMessageHash(message.serialize())) - .and.to.emit(reporter2, "MessageReported") + .and.to.emit(reporter2, "MessageDispatched") .withArgs(toChainId, adapter2.address, message.id, await yaho.calculateMessageHash(message.serialize())) expect(await yaho.getPendingMessageHash(message.id)).to.be.eq(toBytes32(0)) }) @@ -229,13 +230,13 @@ describe("Yaho", () => { await expect(tx) .to.emit(yaho, "MessageDispatched") .withArgs(message1.id, anyValue) // FIXME: https://github.com/NomicFoundation/hardhat/issues/3833 - .and.to.emit(reporter1, "MessageReported") + .and.to.emit(reporter1, "MessageDispatched") .withArgs(toChainId, adapter1.address, message1.id, await yaho.calculateMessageHash(message1.serialize())) - .and.to.emit(reporter1, "MessageReported") + .and.to.emit(reporter1, "MessageDispatched") .withArgs(toChainId, adapter1.address, message2.id, await yaho.calculateMessageHash(message2.serialize())) - .and.to.emit(reporter2, "MessageReported") + .and.to.emit(reporter2, "MessageDispatched") .withArgs(toChainId, adapter2.address, message1.id, await yaho.calculateMessageHash(message1.serialize())) - .and.to.emit(reporter2, "MessageReported") + .and.to.emit(reporter2, "MessageDispatched") .withArgs(toChainId, adapter2.address, message2.id, await yaho.calculateMessageHash(message2.serialize())) expect(await yaho.getPendingMessageHash(message1.id)).to.be.eq(toBytes32(0)) expect(await yaho.getPendingMessageHash(message2.id)).to.be.eq(toBytes32(0)) @@ -412,13 +413,13 @@ describe("Yaho", () => { await yaho.calculateMessageHash(message2.serialize()), ) await expect(yaho.relayMessagesToAdapters([message1, message2])) - .to.emit(reporter1, "MessageReported") + .to.emit(reporter1, "MessageDispatched") .withArgs(toChainId, adapter1.address, message1.id, await yaho.calculateMessageHash(message1.serialize())) - .and.to.emit(reporter1, "MessageReported") + .and.to.emit(reporter1, "MessageDispatched") .withArgs(toChainId, adapter1.address, message2.id, await yaho.calculateMessageHash(message2.serialize())) - .and.to.emit(reporter2, "MessageReported") + .and.to.emit(reporter2, "MessageDispatched") .withArgs(toChainId, adapter2.address, message1.id, await yaho.calculateMessageHash(message1.serialize())) - .and.to.emit(reporter2, "MessageReported") + .and.to.emit(reporter2, "MessageDispatched") .withArgs(toChainId, adapter2.address, message2.id, await yaho.calculateMessageHash(message2.serialize())) expect(await yaho.getPendingMessageHash(message1.id)).to.be.eq(toBytes32(0)) expect(await yaho.getPendingMessageHash(message2.id)).to.be.eq(toBytes32(0)) diff --git a/packages/evm/test/05_Yaru.spec.ts b/packages/evm/test/05_Yaru.spec.ts index 24a97a08..eea6007a 100644 --- a/packages/evm/test/05_Yaru.spec.ts +++ b/packages/evm/test/05_Yaru.spec.ts @@ -1,4 +1,3 @@ -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/dist/src/signer-with-address" import { expect } from "chai" import { Contract } from "ethers" import { ethers } from "hardhat" @@ -10,7 +9,7 @@ let reporter1: Contract, reporter2: Contract, reporter3: Contract, reporter4: Contract, - owner: SignerWithAddress, + headerStorage: Contract, yaho: Contract, yaru: Contract, hashi: Contract, @@ -29,17 +28,16 @@ describe("Yaru", () => { const Reporter = await ethers.getContractFactory("MockReporter") const Adapter = await ethers.getContractFactory("MockOracleAdapter") const PingPong = await ethers.getContractFactory("PingPong") - - const signers = await ethers.getSigners() - owner = signers[0] + const HeaderStorage = await ethers.getContractFactory("HeaderStorage") hashi = await Hashi.deploy() yaho = await Yaho.deploy() + headerStorage = await HeaderStorage.deploy() yaru = await Yaru.deploy(hashi.address, yaho.address, Chains.Hardhat) - reporter1 = await Reporter.deploy(yaho.address) - reporter2 = await Reporter.deploy(yaho.address) - reporter3 = await Reporter.deploy(yaho.address) - reporter4 = await Reporter.deploy(yaho.address) + reporter1 = await Reporter.deploy(headerStorage.address, yaho.address) + reporter2 = await Reporter.deploy(headerStorage.address, yaho.address) + reporter3 = await Reporter.deploy(headerStorage.address, yaho.address) + reporter4 = await Reporter.deploy(headerStorage.address, yaho.address) adapter1 = await Adapter.deploy() adapter2 = await Adapter.deploy() adapter3 = await Adapter.deploy() diff --git a/packages/evm/test/adapters/Reporter.spec.ts b/packages/evm/test/adapters/Reporter.spec.ts new file mode 100644 index 00000000..0466af3f --- /dev/null +++ b/packages/evm/test/adapters/Reporter.spec.ts @@ -0,0 +1,69 @@ +import { anyValue } from "@nomicfoundation/hardhat-chai-matchers/withArgs" +import { mine } from "@nomicfoundation/hardhat-network-helpers" +import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/dist/src/signer-with-address" +import { expect } from "chai" +import { Contract } from "ethers" +import { ethers, network } from "hardhat" + +import { toBytes32 } from "../utils" +import { Chains } from "../utils/constants" + +let reporter: Contract, + headerStorage: Contract, + fakeYaho: SignerWithAddress, + fakeAdapter: SignerWithAddress, + user: SignerWithAddress + +describe("Yaho", () => { + beforeEach(async () => { + await network.provider.request({ method: "hardhat_reset", params: [] }) + + const HeaderStorage = await ethers.getContractFactory("HeaderStorage") + const Reporter = await ethers.getContractFactory("MockReporter") + + const signers = await ethers.getSigners() + user = signers[0] + fakeAdapter = signers[1] + fakeYaho = signers[2] + + headerStorage = await HeaderStorage.deploy() + reporter = await Reporter.deploy(headerStorage.address, fakeYaho.address) + }) + + describe("dispatchBlocks", () => { + it("should be able to dispatch 2 blocks", async () => { + const toChainId = Chains.Gnosis + const blockNumbers = [998, 999] + await mine(1000) + await expect(reporter.dispatchBlocks(toChainId, fakeAdapter.address, blockNumbers)) + .to.emit(reporter, "BlockDispatched") + .withArgs(toChainId, fakeAdapter.address, blockNumbers[0], anyValue) + .and.to.emit(reporter, "BlockDispatched") + .withArgs(toChainId, fakeAdapter.address, blockNumbers[1], anyValue) + }) + }) + + describe("dispatchMessages", () => { + it("should not be able to call dispatchMessages if it's not yaho", async () => { + const toChainId = Chains.Gnosis + const messageIds = [1, 2] + const messageHashes = [toBytes32(1), toBytes32(2)] + await expect(reporter.dispatchMessages(toChainId, fakeAdapter.address, messageIds, messageHashes)) + .to.be.revertedWithCustomError(reporter, "NotYaho") + .withArgs(user.address, fakeYaho.address) + }) + + it("should be able to dispatch 2 messages", async () => { + const toChainId = Chains.Gnosis + const messageIds = [1, 2] + const messageHashes = [toBytes32(1), toBytes32(2)] + await expect( + reporter.connect(fakeYaho).dispatchMessages(toChainId, fakeAdapter.address, messageIds, messageHashes), + ) + .to.emit(reporter, "MessageDispatched") + .withArgs(toChainId, fakeAdapter.address, messageIds[0], messageHashes[0]) + .and.to.emit(reporter, "MessageDispatched") + .withArgs(toChainId, fakeAdapter.address, messageIds[1], messageHashes[1]) + }) + }) +}) From 3fa6771057ebaf98141f473d263e56604d6ad9eb Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 24 Jan 2024 07:43:20 +0100 Subject: [PATCH 061/297] refactor(evm): changes OracleAdapter comments --- packages/evm/contracts/adapters/OracleAdapter.sol | 10 +--------- .../evm/contracts/interfaces/IOracleAdapter.sol | 15 +++++++++------ 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/packages/evm/contracts/adapters/OracleAdapter.sol b/packages/evm/contracts/adapters/OracleAdapter.sol index 2e6d454c..7efc9aaa 100644 --- a/packages/evm/contracts/adapters/OracleAdapter.sol +++ b/packages/evm/contracts/adapters/OracleAdapter.sol @@ -6,19 +6,11 @@ import { IOracleAdapter } from "../interfaces/IOracleAdapter.sol"; abstract contract OracleAdapter is IOracleAdapter { mapping(uint256 => mapping(uint256 => bytes32)) public hashes; - /// @dev Returns the hash for a given domain and ID, as reported by the oracle. - /// @param domain Identifier for the domain to query. - /// @param id Identifier for the ID to query. - /// @return hash Bytes32 hash reported by the oracle for the given ID on the given domain. - /// @notice MUST return bytes32(0) if the oracle has not yet reported a hash for the given ID. + /// @inheritdoc IOracleAdapter function getHashFromOracle(uint256 domain, uint256 id) external view returns (bytes32 hash) { hash = hashes[domain][id]; } - /// @dev Stores a hash for a given domain and ID. - /// @param domain Identifier for the domain. - /// @param id Identifier for the ID of the hash. - /// @param hash Bytes32 hash value to store. function _storeHash(uint256 domain, uint256 id, bytes32 hash) internal { bytes32 currentHash = hashes[domain][id]; if (currentHash != hash) { diff --git a/packages/evm/contracts/interfaces/IOracleAdapter.sol b/packages/evm/contracts/interfaces/IOracleAdapter.sol index e67f93d9..2ac03a07 100644 --- a/packages/evm/contracts/interfaces/IOracleAdapter.sol +++ b/packages/evm/contracts/interfaces/IOracleAdapter.sol @@ -8,10 +8,13 @@ interface IOracleAdapter { error InvalidBlockHeaderRLP(); error ConflictingBlockHeader(uint256 blockNumber, bytes32 reportedBlockHash, bytes32 storedBlockHash); - /// @dev Returns the hash for a given ID, as reported by the oracle. - /// @param domain Identifier for the domain to query. - /// @param id Identifier for the ID to query. - /// @return hash Bytes32 hash reported by the oracle for the given ID on the given domain. - /// @notice MUST return bytes32(0) if the oracle has not yet reported a hash for the given ID. - function getHashFromOracle(uint256 domain, uint256 id) external view returns (bytes32 hash); + /** + * @dev Returns the hash for a given domain and ID, as reported by the oracle + * + * @param domain - The identifier for the domain to query. + * @param id - The identifier for which the hash is being queried. + * @return hash The bytes32 hash reported by the oracle for the given ID on the specified domain. + * @notice This function will return a default value of bytes32(0) if the oracle has not yet reported a hash for the given ID. + */ + function getHashFromOracle(uint256 domain, uint256 id) external view returns (bytes32); } From 4dd300895035ba7469dd81e3a1918a6527cd7020 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 24 Jan 2024 07:44:04 +0100 Subject: [PATCH 062/297] chore(evm): rm AMBHeaderReporter and AMBMessageRelayer --- .../adapters/AMB/AMBHeaderReporter.sol | 35 ---------- .../adapters/AMB/AMBMessageRelayer.sol | 30 -------- .../adapters/AMB/02_AMBHeaderReporter.spec.ts | 65 ------------------ .../adapters/AMB/03_AMBMessageRelay.spec.ts | 68 ------------------- 4 files changed, 198 deletions(-) delete mode 100644 packages/evm/contracts/adapters/AMB/AMBHeaderReporter.sol delete mode 100644 packages/evm/contracts/adapters/AMB/AMBMessageRelayer.sol delete mode 100644 packages/evm/test/adapters/AMB/02_AMBHeaderReporter.spec.ts delete mode 100644 packages/evm/test/adapters/AMB/03_AMBMessageRelay.spec.ts diff --git a/packages/evm/contracts/adapters/AMB/AMBHeaderReporter.sol b/packages/evm/contracts/adapters/AMB/AMBHeaderReporter.sol deleted file mode 100644 index 773df949..00000000 --- a/packages/evm/contracts/adapters/AMB/AMBHeaderReporter.sol +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { HeaderStorage } from "../../utils/HeaderStorage.sol"; -import { IAMB } from "./IAMB.sol"; -import { AMBAdapter } from "./AMBAdapter.sol"; - -contract AMBHeaderReporter { - IAMB public immutable amb; - HeaderStorage public immutable headerStorage; - - event HeaderReported(address indexed emitter, uint256 indexed blockNumber, bytes32 indexed blockHeader); - - constructor(IAMB _amb, HeaderStorage _headerStorage) { - amb = _amb; - headerStorage = _headerStorage; - } - - /// @dev Reports the given block headers to the oracleAdapter via the AMB. - /// @param blockNumbers Uint256 array of block number to pass over the AMB. - /// @param ambAdapter Address of the oracle adapter to pass the header to over the AMB. - /// @param receipt Bytes32 receipt for the transaction. - function reportHeaders( - uint256[] memory blockNumbers, - address ambAdapter, - uint256 gas - ) public returns (bytes32 receipt) { - bytes32[] memory blockHeaders = headerStorage.storeBlockHeaders(blockNumbers); - bytes memory data = abi.encodeCall(AMBAdapter.storeHashes, (blockNumbers, blockHeaders)); - receipt = amb.requireToPassMessage(ambAdapter, data, gas); - for (uint256 i = 0; i < blockNumbers.length; i++) { - emit HeaderReported(address(this), blockNumbers[i], blockHeaders[i]); - } - } -} diff --git a/packages/evm/contracts/adapters/AMB/AMBMessageRelayer.sol b/packages/evm/contracts/adapters/AMB/AMBMessageRelayer.sol deleted file mode 100644 index a2a4ed79..00000000 --- a/packages/evm/contracts/adapters/AMB/AMBMessageRelayer.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { IMessageRelay } from "../../interfaces/IMessageRelay.sol"; -import { IAMB } from "./IAMB.sol"; -import { Yaho } from "../../Yaho.sol"; -import { AMBAdapter } from "./AMBAdapter.sol"; - -contract AMBMessageRelay is IMessageRelay { - IAMB public immutable amb; - Yaho public immutable yaho; - - event MessageRelayed(address indexed emitter, uint256 indexed messageId); - - constructor(IAMB _amb, Yaho _yaho) { - amb = _amb; - yaho = _yaho; - } - - function relayMessages(uint256[] memory messageIds, address ambAdapter) public payable returns (bytes32 receipt) { - bytes32[] memory hashes = new bytes32[](messageIds.length); - for (uint256 i = 0; i < messageIds.length; i++) { - uint256 id = messageIds[i]; - hashes[i] = yaho.hashes(id); - emit MessageRelayed(address(this), messageIds[i]); - } - bytes memory data = abi.encodeCall(AMBAdapter.storeHashes, (messageIds, hashes)); - receipt = amb.requireToPassMessage(ambAdapter, data, 0); - } -} diff --git a/packages/evm/test/adapters/AMB/02_AMBHeaderReporter.spec.ts b/packages/evm/test/adapters/AMB/02_AMBHeaderReporter.spec.ts deleted file mode 100644 index 3070ed4a..00000000 --- a/packages/evm/test/adapters/AMB/02_AMBHeaderReporter.spec.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { mine } from "@nomicfoundation/hardhat-network-helpers" -import { expect } from "chai" -import { ethers, network } from "hardhat" - -const GAS = 1000000 -const DOMAIN_ID = "0x0000000000000000000000000000000000000000000000000000000000007a69" - -const setup = async () => { - await network.provider.request({ method: "hardhat_reset", params: [] }) - const [wallet] = await ethers.getSigners() - const HeaderStorage = await ethers.getContractFactory("HeaderStorage") - const headerStorage = await HeaderStorage.deploy() - const AMB = await ethers.getContractFactory("MockAMB") - const amb = await AMB.deploy() - const AMBHeaderReporter = await ethers.getContractFactory("AMBHeaderReporter") - const ambHeaderReporter = await AMBHeaderReporter.deploy(amb.address, headerStorage.address) - const AMBAdapter = await ethers.getContractFactory("AMBAdapter") - const ambAdapter = await AMBAdapter.deploy(amb.address, ambHeaderReporter.address, DOMAIN_ID) - await mine(1000) - return { - wallet, - headerStorage, - ambHeaderReporter, - ambAdapter, - } -} - -describe("AMBHeaderReporter", function () { - describe("Deploy", function () { - it("Successfully deploys contract", async function () { - const { ambHeaderReporter } = await setup() - expect(await ambHeaderReporter.deployed()) - }) - }) - - describe("reportHeaders()", function () { - it("Reports headers to AMB", async function () { - const { ambHeaderReporter, ambAdapter } = await setup() - const block = await ethers.provider._getBlock(999) - const block2 = await ethers.provider._getBlock(998) - await expect(ambHeaderReporter.reportHeaders([999, 998], ambAdapter.address, GAS)) - .to.emit(ambHeaderReporter, "HeaderReported") - .withArgs(ambHeaderReporter.address, 999, block.hash) - expect(await ambAdapter.getHashFromOracle(DOMAIN_ID, 999)).to.equal(block.hash) - expect(await ambAdapter.getHashFromOracle(DOMAIN_ID, 998)).to.equal(block2.hash) - }) - it("Reports headers to AMB", async function () { - const { ambHeaderReporter, ambAdapter } = await setup() - const block = await ethers.provider._getBlock(999) - const block2 = await ethers.provider._getBlock(998) - const receipt = await ambHeaderReporter.reportHeaders([999, 998], ambAdapter.address, GAS) - await expect(receipt) - .to.emit(ambHeaderReporter, "HeaderReported") - .withArgs(ambHeaderReporter.address, 999, block.hash) - await expect(receipt) - .to.emit(ambHeaderReporter, "HeaderReported") - .withArgs(ambHeaderReporter.address, 998, block2.hash) - }) - it("Returns receipt", async function () { - const { ambHeaderReporter, ambAdapter } = await setup() - const receipt = await ambHeaderReporter.callStatic.reportHeaders([999], ambAdapter.address, GAS) - expect(receipt).is.not.null - }) - }) -}) diff --git a/packages/evm/test/adapters/AMB/03_AMBMessageRelay.spec.ts b/packages/evm/test/adapters/AMB/03_AMBMessageRelay.spec.ts deleted file mode 100644 index bf9218e9..00000000 --- a/packages/evm/test/adapters/AMB/03_AMBMessageRelay.spec.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { expect } from "chai" -import { ethers, network } from "hardhat" - -const DOMAIN_ID = "0x0000000000000000000000000000000000000000000000000000000000007a69" - -const setup = async () => { - await network.provider.request({ method: "hardhat_reset", params: [] }) - const [wallet] = await ethers.getSigners() - const Yaho = await ethers.getContractFactory("Yaho") - const yaho = await Yaho.deploy() - const AMB = await ethers.getContractFactory("MockAMB") - const amb = await AMB.deploy() - const AMBMessageRelay = await ethers.getContractFactory("AMBMessageRelay") - const ambMessageRelay = await AMBMessageRelay.deploy(amb.address, yaho.address) - const AMBAdapter = await ethers.getContractFactory("AMBAdapter") - const ambAdapter = await AMBAdapter.deploy(amb.address, ambMessageRelay.address, DOMAIN_ID) - const PingPong = await ethers.getContractFactory("PingPong") - const pingPong = await PingPong.deploy() - const message_1 = { - to: pingPong.address, - toChainId: 1, - data: pingPong.interface.getSighash("ping"), - } - - await yaho.dispatchMessages([message_1, message_1]) - - return { - amb, - wallet, - yaho, - ambMessageRelay, - ambAdapter, - message_1, - pingPong, - } -} - -describe("AMBMessageRelayer", function () { - describe("Deploy", function () { - it("Successfully deploys contract", async function () { - const { ambMessageRelay } = await setup() - expect(await ambMessageRelay.deployed()) - }) - }) - - describe("relayMessages()", function () { - it("Relays message hashes over AMB", async function () { - const { ambMessageRelay, ambAdapter } = await setup() - const receipt = await ambMessageRelay.relayMessages([0, 1], ambAdapter.address) - await expect(receipt).to.emit(ambMessageRelay, "MessageRelayed").withArgs(ambMessageRelay.address, 0) - }) - it("Reports headers to AMB", async function () { - const { ambMessageRelay, amb, ambAdapter, message_1, yaho, wallet } = await setup() - const receipt = await ambMessageRelay.relayMessages([0, 1], ambAdapter.address) - await expect(receipt).to.emit(ambMessageRelay, "MessageRelayed").withArgs(ambMessageRelay.address, 0) - await expect(receipt).to.emit(ambMessageRelay, "MessageRelayed").withArgs(ambMessageRelay.address, 1) - const hash0 = await yaho.calculateHash(network.config.chainId, 0, yaho.address, wallet.address, message_1) - const hash1 = await yaho.calculateHash(network.config.chainId, 1, yaho.address, wallet.address, message_1) - const tx = await ambAdapter.populateTransaction.storeHashes([0, 1], [hash0, hash1]) - await expect(receipt).to.emit(amb, "MessagePassed").withArgs(ambMessageRelay.address, tx.data) - }) - it("Returns receipt", async function () { - const { ambMessageRelay, ambAdapter } = await setup() - const receipt = await ambMessageRelay.callStatic.relayMessages([0, 1], ambAdapter.address) - expect(receipt).is.not.null - }) - }) -}) From 503e3795cd849d4804d110c248dffb62e913ddd8 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 24 Jan 2024 07:45:21 +0100 Subject: [PATCH 063/297] feat(evm): adds AMBReporter --- .../contracts/adapters/AMB/AMBReporter.sol | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 packages/evm/contracts/adapters/AMB/AMBReporter.sol diff --git a/packages/evm/contracts/adapters/AMB/AMBReporter.sol b/packages/evm/contracts/adapters/AMB/AMBReporter.sol new file mode 100644 index 00000000..3c207dc8 --- /dev/null +++ b/packages/evm/contracts/adapters/AMB/AMBReporter.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity ^0.8.17; + +import { Reporter } from "../Reporter.sol"; +import { AMBAdapter } from "./AMBAdapter.sol"; +import { IOracleAdapter } from "../../interfaces/IOracleAdapter.sol"; +import { IAMB } from "./IAMB.sol"; + +contract AMBReporter is Reporter { + address public immutable AMB; + uint256 public immutable GAS; + uint256 public immutable TO_CHAIN_ID; + + error InvalidToChainId(uint256 chainId, uint256 expectedChainId); + + constructor( + address headerStorage, + address yaho, + address amb, + uint256 toChainId, + uint256 gas + ) Reporter(headerStorage, yaho) { + AMB = amb; + TO_CHAIN_ID = toChainId; + GAS = gas; + } + + function _sendPayload( + uint256 toChainId, + address adapter, + uint256[] memory ids, + bytes32[] memory hashes + ) internal override returns (bytes32) { + if (toChainId != TO_CHAIN_ID) revert InvalidToChainId(toChainId, TO_CHAIN_ID); + bytes memory payload = abi.encodeCall(AMBAdapter.storeHashes, (ids, hashes)); + return IAMB(AMB).requireToPassMessage(adapter, payload, GAS); + } +} From 33b730f8b83f9e5a66b32b79f030c5a952d639a1 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 24 Jan 2024 11:58:16 +0100 Subject: [PATCH 064/297] feat(evm): improve AMBAdapter --- .../evm/contracts/adapters/AMB/AMBAdapter.sol | 40 +++++++++---------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/packages/evm/contracts/adapters/AMB/AMBAdapter.sol b/packages/evm/contracts/adapters/AMB/AMBAdapter.sol index 4b0fe473..8256f0ab 100644 --- a/packages/evm/contracts/adapters/AMB/AMBAdapter.sol +++ b/packages/evm/contracts/adapters/AMB/AMBAdapter.sol @@ -6,38 +6,34 @@ import { OracleAdapter } from "../OracleAdapter.sol"; import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; contract AMBAdapter is OracleAdapter, BlockHashOracleAdapter { - IAMB public amb; - address public reporter; - bytes32 public chainId; + IAMB public immutable AMB; + address public immutable REPORTER; + bytes32 public immutable SOURCE_CHAIN_ID; - error ArrayLengthMissmatch(address emitter); - error UnauthorizedAMB(address emitter, address sender); - error UnauthorizedChainId(address emitter, bytes32 chainId); - error UnauthorizedHashReporter(address emitter, address reporter); + error ArrayLengthMissmatch(); + error UnauthorizedAMB(address sender, address expectedSender); + error UnauthorizedChainId(bytes32 sourceChainId, bytes32 expectedSourceChainId); + error UnauthorizedHashReporter(address reporter, address expectedReporter); - constructor(IAMB _amb, address _reporter, bytes32 _chainId) { - amb = _amb; - reporter = _reporter; - chainId = _chainId; + constructor(IAMB amb, address reporter, bytes32 sourceChainId) { + AMB = amb; + REPORTER = reporter; + SOURCE_CHAIN_ID = sourceChainId; } - /// @dev Check that the amb, chainId, and owner are valid. modifier onlyValid() { - if (msg.sender != address(amb)) revert UnauthorizedAMB(address(this), msg.sender); - if (amb.messageSourceChainId() != chainId) revert UnauthorizedChainId(address(this), chainId); - if (amb.messageSender() != reporter) revert UnauthorizedHashReporter(address(this), reporter); + bytes32 ambSourceChainId = AMB.messageSourceChainId(); + address ambMessageSender = AMB.messageSender(); + if (msg.sender != address(AMB)) revert UnauthorizedAMB(msg.sender, address(AMB)); + if (ambSourceChainId != SOURCE_CHAIN_ID) revert UnauthorizedChainId(ambSourceChainId, SOURCE_CHAIN_ID); + if (ambMessageSender != REPORTER) revert UnauthorizedHashReporter(ambMessageSender, REPORTER); _; } - /// @dev Stores the hashes for a given array of idss. - /// @param ids Array of ids number for which to set the hashes. - /// @param _hashes Array of hashes to set for the given ids. - /// @notice Only callable by `amb` with a message passed from `reporter. - /// @notice Will revert if given array lengths do not match. function storeHashes(uint256[] memory ids, bytes32[] memory _hashes) public onlyValid { - if (ids.length != _hashes.length) revert ArrayLengthMissmatch(address(this)); + if (ids.length != _hashes.length) revert ArrayLengthMissmatch(); for (uint256 i = 0; i < ids.length; i++) { - _storeHash(uint256(chainId), ids[i], _hashes[i]); + _storeHash(uint256(SOURCE_CHAIN_ID), ids[i], _hashes[i]); } } } From 9b71c67c6de0d9fb8d75afd9f24f8e572b70a0bf Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 24 Jan 2024 14:13:48 +0100 Subject: [PATCH 065/297] feat(evm): adds storeHashes within OracleAdapter --- packages/evm/contracts/adapters/OracleAdapter.sol | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/evm/contracts/adapters/OracleAdapter.sol b/packages/evm/contracts/adapters/OracleAdapter.sol index 7efc9aaa..8cc60d4b 100644 --- a/packages/evm/contracts/adapters/OracleAdapter.sol +++ b/packages/evm/contracts/adapters/OracleAdapter.sol @@ -11,6 +11,15 @@ abstract contract OracleAdapter is IOracleAdapter { hash = hashes[domain][id]; } + function _storeHashes(uint256 domain, uint256[] memory ids, bytes32[] memory hashes_) internal { + for (uint256 i = 0; i < ids.length; ) { + _storeHash(domain, ids[i], hashes_[i]); + unchecked { + ++i; + } + } + } + function _storeHash(uint256 domain, uint256 id, bytes32 hash) internal { bytes32 currentHash = hashes[domain][id]; if (currentHash != hash) { From 4c09010abf248e154c4138fed47b6aa5717d157c Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 24 Jan 2024 14:14:48 +0100 Subject: [PATCH 066/297] refactor(evm): rn _sendPayload into _dispatch and adds missing PROVIDER --- packages/evm/contracts/adapters/AMB/AMBAdapter.sol | 2 ++ packages/evm/contracts/adapters/AMB/AMBReporter.sol | 4 +++- packages/evm/contracts/adapters/Reporter.sol | 6 +++--- packages/evm/contracts/test/MockReporter.sol | 2 +- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/evm/contracts/adapters/AMB/AMBAdapter.sol b/packages/evm/contracts/adapters/AMB/AMBAdapter.sol index 8256f0ab..7b7e05ba 100644 --- a/packages/evm/contracts/adapters/AMB/AMBAdapter.sol +++ b/packages/evm/contracts/adapters/AMB/AMBAdapter.sol @@ -6,6 +6,8 @@ import { OracleAdapter } from "../OracleAdapter.sol"; import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; contract AMBAdapter is OracleAdapter, BlockHashOracleAdapter { + string public constant PROVIDER = "amb"; + IAMB public immutable AMB; address public immutable REPORTER; bytes32 public immutable SOURCE_CHAIN_ID; diff --git a/packages/evm/contracts/adapters/AMB/AMBReporter.sol b/packages/evm/contracts/adapters/AMB/AMBReporter.sol index 3c207dc8..6380b9ca 100644 --- a/packages/evm/contracts/adapters/AMB/AMBReporter.sol +++ b/packages/evm/contracts/adapters/AMB/AMBReporter.sol @@ -7,6 +7,8 @@ import { IOracleAdapter } from "../../interfaces/IOracleAdapter.sol"; import { IAMB } from "./IAMB.sol"; contract AMBReporter is Reporter { + string public constant PROVIDER = "amb"; + address public immutable AMB; uint256 public immutable GAS; uint256 public immutable TO_CHAIN_ID; @@ -25,7 +27,7 @@ contract AMBReporter is Reporter { GAS = gas; } - function _sendPayload( + function _dispatch( uint256 toChainId, address adapter, uint256[] memory ids, diff --git a/packages/evm/contracts/adapters/Reporter.sol b/packages/evm/contracts/adapters/Reporter.sol index 8a780b8e..f31991ee 100644 --- a/packages/evm/contracts/adapters/Reporter.sol +++ b/packages/evm/contracts/adapters/Reporter.sol @@ -32,7 +32,7 @@ abstract contract Reporter is IReporter { ++i; } } - return _sendPayload(toChainId, address(adapter), blockNumbers, blockHeaders); + return _dispatch(toChainId, address(adapter), blockNumbers, blockHeaders); } /// @inheritdoc IReporter @@ -48,10 +48,10 @@ abstract contract Reporter is IReporter { ++i; } } - return _sendPayload(toChainId, address(adapter), messageIds, messageHashes); + return _dispatch(toChainId, address(adapter), messageIds, messageHashes); } - function _sendPayload( + function _dispatch( uint256 toChainId, address adapter, uint256[] memory messageIds, diff --git a/packages/evm/contracts/test/MockReporter.sol b/packages/evm/contracts/test/MockReporter.sol index 6a6ca232..44491b2b 100644 --- a/packages/evm/contracts/test/MockReporter.sol +++ b/packages/evm/contracts/test/MockReporter.sol @@ -7,5 +7,5 @@ import { IOracleAdapter } from "../interfaces/IOracleAdapter.sol"; contract MockReporter is Reporter { constructor(address headerStorage, address yaho) Reporter(headerStorage, yaho) {} - function _sendPayload(uint256, address, uint256[] memory, bytes32[] memory) internal override returns (bytes32) {} + function _dispatch(uint256, address, uint256[] memory, bytes32[] memory) internal override returns (bytes32) {} } From 113c3daa88a8e5e182e38d4c0beb64d6a99021d3 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 24 Jan 2024 14:25:55 +0100 Subject: [PATCH 067/297] refactor(evm): rm OracleAdapter from AMBAdapter --- packages/evm/contracts/adapters/AMB/AMBAdapter.sol | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/evm/contracts/adapters/AMB/AMBAdapter.sol b/packages/evm/contracts/adapters/AMB/AMBAdapter.sol index 7b7e05ba..3a5b8e92 100644 --- a/packages/evm/contracts/adapters/AMB/AMBAdapter.sol +++ b/packages/evm/contracts/adapters/AMB/AMBAdapter.sol @@ -2,10 +2,9 @@ pragma solidity ^0.8.17; import { IAMB } from "./IAMB.sol"; -import { OracleAdapter } from "../OracleAdapter.sol"; import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; -contract AMBAdapter is OracleAdapter, BlockHashOracleAdapter { +contract AMBAdapter is BlockHashOracleAdapter { string public constant PROVIDER = "amb"; IAMB public immutable AMB; From 65a191a4478312bfd249818db30c87f5a480ed7a Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 24 Jan 2024 14:28:10 +0100 Subject: [PATCH 068/297] refactor(evm): normalizes comments within BlockHashOracleAdapter --- .../evm/contracts/adapters/BlockHashOracleAdapter.sol | 9 +++------ .../contracts/interfaces/IBlockHashOracleAdapter.sol | 10 ++++++---- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/packages/evm/contracts/adapters/BlockHashOracleAdapter.sol b/packages/evm/contracts/adapters/BlockHashOracleAdapter.sol index c324de4e..d9bd7c3f 100644 --- a/packages/evm/contracts/adapters/BlockHashOracleAdapter.sol +++ b/packages/evm/contracts/adapters/BlockHashOracleAdapter.sol @@ -2,16 +2,13 @@ pragma solidity ^0.8.17; import { RLPReader } from "solidity-rlp/contracts/RLPReader.sol"; - import { OracleAdapter } from "./OracleAdapter.sol"; +import { IBlockHashOracleAdapter } from "../interfaces/IBlockHashOracleAdapter.sol"; -abstract contract BlockHashOracleAdapter is OracleAdapter { +abstract contract BlockHashOracleAdapter is IBlockHashOracleAdapter, OracleAdapter { using RLPReader for RLPReader.RLPItem; - /// @dev Proves and stores valid ancestral block hashes for a given chain ID. - /// @param chainId The ID of the chain to prove block hashes for. - /// @param blockHeaders The RLP encoded block headers to prove the hashes for. - /// @notice Block headers should be ordered by descending block number and should start with a known block header. + /// @inheritdoc IBlockHashOracleAdapter function proveAncestralBlockHashes(uint256 chainId, bytes[] memory blockHeaders) external { for (uint256 i = 0; i < blockHeaders.length; i++) { RLPReader.RLPItem memory blockHeaderRLP = RLPReader.toRlpItem(blockHeaders[i]); diff --git a/packages/evm/contracts/interfaces/IBlockHashOracleAdapter.sol b/packages/evm/contracts/interfaces/IBlockHashOracleAdapter.sol index 9bf8154a..7aab4116 100644 --- a/packages/evm/contracts/interfaces/IBlockHashOracleAdapter.sol +++ b/packages/evm/contracts/interfaces/IBlockHashOracleAdapter.sol @@ -4,9 +4,11 @@ pragma solidity ^0.8.17; import { IOracleAdapter } from "./IOracleAdapter.sol"; interface IBlockHashOracleAdapter is IOracleAdapter { - /// @dev Proves and stores valid ancestral block hashes for a given chain ID. - /// @param chainId The ID of the chain to prove block hashes for. - /// @param blockHeaders The RLP encoded block headers to prove the hashes for. - /// @notice Block headers should be ordered by descending block number and should start with a known block header. + /** + * @dev Proves and stores valid ancestral block hashes for a given chain ID. + * @param chainId - The ID of the chain for which the block hashes are to be proven and stored. + * @param blockHeaders - The RLP encoded block headers. These headers are used to prove and subsequently store the hashes. + * @notice The block headers should be ordered by descending block number. The sequence should start with a block header that is already known and verified. + */ function proveAncestralBlockHashes(uint256 chainId, bytes[] memory blockHeaders) external; } From e61e8b0d8cae7cc55f23b6ffc83ff82fb72de011 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 24 Jan 2024 14:32:45 +0100 Subject: [PATCH 069/297] refactor(evm): refactors Axelar adapter --- .../adapters/Axelar/AxelarAdapter.sol | 40 +++++++++---------- .../adapters/Axelar/AxelarHeaderReporter.sol | 19 --------- .../adapters/Axelar/AxelarMessageRelay.sol | 19 --------- .../adapters/Axelar/AxelarReporter.sol | 40 +++++++++++++++---- 4 files changed, 50 insertions(+), 68 deletions(-) delete mode 100644 packages/evm/contracts/adapters/Axelar/AxelarHeaderReporter.sol delete mode 100644 packages/evm/contracts/adapters/Axelar/AxelarMessageRelay.sol diff --git a/packages/evm/contracts/adapters/Axelar/AxelarAdapter.sol b/packages/evm/contracts/adapters/Axelar/AxelarAdapter.sol index 61ae424c..8f6417f9 100644 --- a/packages/evm/contracts/adapters/Axelar/AxelarAdapter.sol +++ b/packages/evm/contracts/adapters/Axelar/AxelarAdapter.sol @@ -1,30 +1,25 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { AxelarExecutable } from "@axelar-network/axelar-gmp-sdk-solidity/contracts/executable/AxelarExecutable.sol"; -import { HeaderOracleAdapter } from "../HeaderOracleAdapter.sol"; +import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; -contract AxelarAdapter is HeaderOracleAdapter, AxelarExecutable { +contract AxelarAdapter is BlockHashOracleAdapter, Ownable, AxelarExecutable { string public constant PROVIDER = "axelar"; - string public AXELAR_REPORTER_CHAIN; // Immutable - bytes32 public immutable AXELAR_REPORTER_CHAIN_HASH; - string public AXELAR_REPORTER_ADDRESS; // Immutable - bytes32 public immutable AXELAR_REPORTER_ADDRESS_HASH; + + mapping(bytes32 => bytes32) public enabledReporters; + mapping(bytes32 => uint256) public chainNameIds; error UnauthorizedAxelarReceive(); error ExecutionWithTokenNotSupported(); - constructor( - uint256 reporterChain, - address reporterAddress, - address axelarGateway, - string memory axelarReporterChain, - string memory axelarReporterAddress - ) HeaderOracleAdapter(reporterChain, reporterAddress) AxelarExecutable(axelarGateway) { - AXELAR_REPORTER_CHAIN = axelarReporterChain; - AXELAR_REPORTER_CHAIN_HASH = keccak256(bytes(axelarReporterChain)); - AXELAR_REPORTER_ADDRESS = axelarReporterAddress; - AXELAR_REPORTER_ADDRESS_HASH = keccak256(bytes(axelarReporterAddress)); + constructor(address axelarGateway) AxelarExecutable(axelarGateway) {} + + function addChain(string calldata chainName, string calldata sourceAddress, uint256 chainId) external onlyOwner { + bytes32 chainNameHash = keccak256(bytes(chainName)); + enabledReporters[chainNameHash] = keccak256(bytes(sourceAddress)); + chainNameIds[chainNameHash] = chainId; } function _execute( @@ -32,13 +27,14 @@ contract AxelarAdapter is HeaderOracleAdapter, AxelarExecutable { string calldata sourceAddress, bytes calldata payload ) internal override { - if ( - keccak256(bytes(sourceChain)) != AXELAR_REPORTER_CHAIN_HASH || - keccak256(bytes(sourceAddress)) != AXELAR_REPORTER_ADDRESS_HASH - ) { + bytes32 chainNameHash = keccak256(bytes(sourceChain)); + bytes32 expectedSourceAddressHash = enabledReporters[chainNameHash]; + uint256 sourceChainId = chainNameIds[chainNameHash]; + if (expectedSourceAddressHash != keccak256(bytes(sourceAddress)) || sourceChainId == 0) { revert UnauthorizedAxelarReceive(); } - _receivePayload(payload); + (uint256[] memory ids, bytes32[] memory hashes) = abi.decode(payload, (uint256[], bytes32[])); + _storeHashes(sourceChainId, ids, hashes); } function _executeWithToken( diff --git a/packages/evm/contracts/adapters/Axelar/AxelarHeaderReporter.sol b/packages/evm/contracts/adapters/Axelar/AxelarHeaderReporter.sol deleted file mode 100644 index aebf04ae..00000000 --- a/packages/evm/contracts/adapters/Axelar/AxelarHeaderReporter.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { HeaderReporter } from "../HeaderReporter.sol"; -import { AxelarReporter } from "./AxelarReporter.sol"; - -contract AxelarHeaderReporter is HeaderReporter, AxelarReporter { - constructor( - address headerStorage, - uint256 adapterChain, - address axelarGateway, - address axelarGasService, - string memory axelarAdapterChain - ) HeaderReporter(headerStorage, adapterChain) AxelarReporter(axelarGateway, axelarGasService, axelarAdapterChain) {} // solhint-disable no-empty-blocks - - function _sendPayload(bytes memory payload, address adapter) internal override { - _axelarSend(payload, adapter); - } -} diff --git a/packages/evm/contracts/adapters/Axelar/AxelarMessageRelay.sol b/packages/evm/contracts/adapters/Axelar/AxelarMessageRelay.sol deleted file mode 100644 index 82044c6c..00000000 --- a/packages/evm/contracts/adapters/Axelar/AxelarMessageRelay.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { MessageRelay } from "../MessageRelay.sol"; -import { AxelarReporter } from "./AxelarReporter.sol"; - -contract AxelarMessageRelay is MessageRelay, AxelarReporter { - constructor( - address yaho, - uint256 adapterChain, - address axelarGateway, - address axelarGasService, - string memory axelarAdapterChain - ) MessageRelay(yaho, adapterChain) AxelarReporter(axelarGateway, axelarGasService, axelarAdapterChain) {} // solhint-disable no-empty-blocks - - function _sendPayload(bytes memory payload, address adapter) internal override { - _axelarSend(payload, adapter); - } -} diff --git a/packages/evm/contracts/adapters/Axelar/AxelarReporter.sol b/packages/evm/contracts/adapters/Axelar/AxelarReporter.sol index 5f7a3c04..859d9a6f 100644 --- a/packages/evm/contracts/adapters/Axelar/AxelarReporter.sol +++ b/packages/evm/contracts/adapters/Axelar/AxelarReporter.sol @@ -1,37 +1,61 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; +import { Strings } from "@openzeppelin/contracts/utils/Strings.sol"; import { IAxelarGateway } from "@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGateway.sol"; import { IAxelarGasService } from "@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGasService.sol"; -import { Strings } from "@openzeppelin/contracts/utils/Strings.sol"; +import { Reporter } from "../Reporter.sol"; -abstract contract AxelarReporter { +contract AxelarReporter is Reporter, Ownable { using Strings for uint256; string public constant PROVIDER = "axelar"; + bytes32 private constant NULL_STRING = keccak256(""); IAxelarGateway public immutable AXELAR_GATEWAY; IAxelarGasService public immutable AXELAR_GAS_SERVICE; - string public AXELAR_ADAPTER_CHAIN; // Immutable - constructor(address axelarGateway, address axelarGasService, string memory axelarAdapterChain) { + mapping(uint256 => string) public chainIdNames; + + error ChainIdNotSupported(uint256 chainId); + + constructor( + address headerStorage, + address yaho, + address axelarGateway, + address axelarGasService + ) Reporter(headerStorage, yaho) { AXELAR_GATEWAY = IAxelarGateway(axelarGateway); AXELAR_GAS_SERVICE = IAxelarGasService(axelarGasService); - AXELAR_ADAPTER_CHAIN = axelarAdapterChain; } - function _axelarSend(bytes memory payload, address adapter) internal { + function addChain(uint256 chainId, string calldata chainName) external onlyOwner { + chainIdNames[chainId] = chainName; + } + + function _dispatch( + uint256 toChainId, + address adapter, + uint256[] memory ids, + bytes32[] memory hashes + ) internal override returns (bytes32) { + string memory chainName = chainIdNames[toChainId]; + if (keccak256(abi.encode(chainName)) == NULL_STRING) revert ChainIdNotSupported(toChainId); + string memory sAdapter = uint256(uint160(adapter)).toHexString(20); + bytes memory payload = abi.encode(ids, hashes); if (msg.value > 0) { AXELAR_GAS_SERVICE.payNativeGasForContractCall{ value: msg.value }( address(this), - AXELAR_ADAPTER_CHAIN, + chainName, sAdapter, payload, msg.sender ); } - AXELAR_GATEWAY.callContract(AXELAR_ADAPTER_CHAIN, sAdapter, payload); + AXELAR_GATEWAY.callContract(chainName, sAdapter, payload); + return bytes32(0); } } From 59accd7671177153936307f8121cf3d8d8adf714 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 24 Jan 2024 15:09:32 +0100 Subject: [PATCH 070/297] refactor(evm): rn Axelar adapter/reporter fxs --- .../evm/contracts/adapters/Axelar/AxelarAdapter.sol | 11 +++++++++-- .../evm/contracts/adapters/Axelar/AxelarReporter.sol | 5 ++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/packages/evm/contracts/adapters/Axelar/AxelarAdapter.sol b/packages/evm/contracts/adapters/Axelar/AxelarAdapter.sol index 8f6417f9..bd8358bb 100644 --- a/packages/evm/contracts/adapters/Axelar/AxelarAdapter.sol +++ b/packages/evm/contracts/adapters/Axelar/AxelarAdapter.sol @@ -14,12 +14,19 @@ contract AxelarAdapter is BlockHashOracleAdapter, Ownable, AxelarExecutable { error UnauthorizedAxelarReceive(); error ExecutionWithTokenNotSupported(); + event ReporterForChainSet(uint256 indexed chainId, string name, address indexed reporter); + constructor(address axelarGateway) AxelarExecutable(axelarGateway) {} - function addChain(string calldata chainName, string calldata sourceAddress, uint256 chainId) external onlyOwner { + function setReporterForChain( + uint256 chainId, + string calldata chainName, + string calldata reporter + ) external onlyOwner { bytes32 chainNameHash = keccak256(bytes(chainName)); - enabledReporters[chainNameHash] = keccak256(bytes(sourceAddress)); + enabledReporters[chainNameHash] = keccak256(bytes(reporter)); chainNameIds[chainNameHash] = chainId; + emit ReporterForChainSet(chainId, chainName, reporter); } function _execute( diff --git a/packages/evm/contracts/adapters/Axelar/AxelarReporter.sol b/packages/evm/contracts/adapters/Axelar/AxelarReporter.sol index 859d9a6f..b6dcc292 100644 --- a/packages/evm/contracts/adapters/Axelar/AxelarReporter.sol +++ b/packages/evm/contracts/adapters/Axelar/AxelarReporter.sol @@ -19,6 +19,8 @@ contract AxelarReporter is Reporter, Ownable { error ChainIdNotSupported(uint256 chainId); + event ChainNameSet(uint256 indexed chainId, string indexed chainName); + constructor( address headerStorage, address yaho, @@ -29,8 +31,9 @@ contract AxelarReporter is Reporter, Ownable { AXELAR_GAS_SERVICE = IAxelarGasService(axelarGasService); } - function addChain(uint256 chainId, string calldata chainName) external onlyOwner { + function setChainNameByChainId(uint256 chainId, string calldata chainName) external onlyOwner { chainIdNames[chainId] = chainName; + emit ChainNameSet(chainId, chainName); } function _dispatch( From 2129df099885aca01dbfc8cdbb44b435c5cee1bf Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 24 Jan 2024 15:17:14 +0100 Subject: [PATCH 071/297] refactor(evm): rn fx and event within AxelarAdapter --- packages/evm/contracts/adapters/Axelar/AxelarAdapter.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/evm/contracts/adapters/Axelar/AxelarAdapter.sol b/packages/evm/contracts/adapters/Axelar/AxelarAdapter.sol index bd8358bb..ebc96f3e 100644 --- a/packages/evm/contracts/adapters/Axelar/AxelarAdapter.sol +++ b/packages/evm/contracts/adapters/Axelar/AxelarAdapter.sol @@ -14,11 +14,11 @@ contract AxelarAdapter is BlockHashOracleAdapter, Ownable, AxelarExecutable { error UnauthorizedAxelarReceive(); error ExecutionWithTokenNotSupported(); - event ReporterForChainSet(uint256 indexed chainId, string name, address indexed reporter); + event ReporterSet(uint256 indexed chainId, string name, string indexed reporter); constructor(address axelarGateway) AxelarExecutable(axelarGateway) {} - function setReporterForChain( + function setReporterByChain( uint256 chainId, string calldata chainName, string calldata reporter @@ -26,7 +26,7 @@ contract AxelarAdapter is BlockHashOracleAdapter, Ownable, AxelarExecutable { bytes32 chainNameHash = keccak256(bytes(chainName)); enabledReporters[chainNameHash] = keccak256(bytes(reporter)); chainNameIds[chainNameHash] = chainId; - emit ReporterForChainSet(chainId, chainName, reporter); + emit ReporterSet(chainId, chainName, reporter); } function _execute( From 1021b5bad2a3919412f65def3ba2ada89b7634b3 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 24 Jan 2024 15:19:52 +0100 Subject: [PATCH 072/297] refactor(evm): refactors Celer Adapter and adds Reporter --- .../contracts/adapters/Celer/CelerAdapter.sol | 31 ++++++++++--------- .../adapters/Celer/CelerHeaderReporter.sol | 18 ----------- .../adapters/Celer/CelerMessageRelay.sol | 18 ----------- .../adapters/Celer/CelerReporter.sol | 18 +++++++---- 4 files changed, 29 insertions(+), 56 deletions(-) delete mode 100644 packages/evm/contracts/adapters/Celer/CelerHeaderReporter.sol delete mode 100644 packages/evm/contracts/adapters/Celer/CelerMessageRelay.sol diff --git a/packages/evm/contracts/adapters/Celer/CelerAdapter.sol b/packages/evm/contracts/adapters/Celer/CelerAdapter.sol index a6c8a309..fa0d6f5f 100644 --- a/packages/evm/contracts/adapters/Celer/CelerAdapter.sol +++ b/packages/evm/contracts/adapters/Celer/CelerAdapter.sol @@ -1,24 +1,22 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { IMessageReceiverApp } from "./interfaces/IMessageReceiverApp.sol"; -import { HeaderOracleAdapter } from "../HeaderOracleAdapter.sol"; +import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; -contract CelerAdapter is HeaderOracleAdapter, IMessageReceiverApp { +contract CelerAdapter is BlockHashOracleAdapter, Ownable, IMessageReceiverApp { string public constant PROVIDER = "celer"; address public immutable CELER_BUS; - uint32 public immutable CELER_REPORTER_CHAIN; + + mapping(uint64 => address) public enabledReporters; error UnauthorizedCelerReceive(); - constructor( - uint256 reporterChain, - address reporterAddress, - address celerBus, - uint32 celerReporterChain - ) HeaderOracleAdapter(reporterChain, reporterAddress) { + event ReporterSet(uint64 indexed chainId, address indexed reporter); + + constructor(address celerBus) { CELER_BUS = celerBus; - CELER_REPORTER_CHAIN = celerReporterChain; } function executeMessage( @@ -27,10 +25,15 @@ contract CelerAdapter is HeaderOracleAdapter, IMessageReceiverApp { bytes calldata message, address /* executor */ ) external payable returns (ExecutionStatus) { - if (msg.sender != CELER_BUS || srcChainId != CELER_REPORTER_CHAIN || sender != REPORTER_ADDRESS) - revert UnauthorizedCelerReceive(); - - _receivePayload(message); + address expectedReporter = enabledReporters[srcChainId]; + if (msg.sender != CELER_BUS || sender != expectedReporter) revert UnauthorizedCelerReceive(); + (uint256[] memory ids, bytes32[] memory hashes) = abi.decode(message, (uint256[], bytes32[])); + _storeHashes(srcChainId, ids, hashes); return ExecutionStatus.Success; } + + function setReporterByChainId(uint64 chainId, address reporter) external onlyOwner { + enabledReporters[chainId] = reporter; + emit ReporterSet(chainId, reporter); + } } diff --git a/packages/evm/contracts/adapters/Celer/CelerHeaderReporter.sol b/packages/evm/contracts/adapters/Celer/CelerHeaderReporter.sol deleted file mode 100644 index d4e8cb1e..00000000 --- a/packages/evm/contracts/adapters/Celer/CelerHeaderReporter.sol +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { HeaderReporter } from "../HeaderReporter.sol"; -import { CelerReporter } from "./CelerReporter.sol"; - -contract CelerHeaderReporter is HeaderReporter, CelerReporter { - constructor( - address headerStorage, - uint256 adapterChain, - address celerBus, - uint32 celerAdapterChain - ) HeaderReporter(headerStorage, adapterChain) CelerReporter(celerBus, celerAdapterChain) {} // solhint-disable no-empty-blocks - - function _sendPayload(bytes memory payload, address adapter) internal virtual override { - _celerSend(payload, adapter); - } -} diff --git a/packages/evm/contracts/adapters/Celer/CelerMessageRelay.sol b/packages/evm/contracts/adapters/Celer/CelerMessageRelay.sol deleted file mode 100644 index f46eaa30..00000000 --- a/packages/evm/contracts/adapters/Celer/CelerMessageRelay.sol +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { MessageRelay } from "../MessageRelay.sol"; -import { CelerReporter } from "./CelerReporter.sol"; - -contract CelerMessageRelay is MessageRelay, CelerReporter { - constructor( - address yaho, - uint256 adapterChain, - address celerBus, - uint32 celerAdapterChain - ) MessageRelay(yaho, adapterChain) CelerReporter(celerBus, celerAdapterChain) {} // solhint-disable no-empty-blocks - - function _sendPayload(bytes memory payload, address adapter) internal virtual override { - _celerSend(payload, adapter); - } -} diff --git a/packages/evm/contracts/adapters/Celer/CelerReporter.sol b/packages/evm/contracts/adapters/Celer/CelerReporter.sol index 1ca6f7bf..93cfda79 100644 --- a/packages/evm/contracts/adapters/Celer/CelerReporter.sol +++ b/packages/evm/contracts/adapters/Celer/CelerReporter.sol @@ -1,19 +1,25 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; +import { Reporter } from "../Reporter.sol"; import { IMessageBus } from "./interfaces/IMessageBus.sol"; -abstract contract CelerReporter { +contract CelerReporter is Reporter { string public constant PROVIDER = "celer"; IMessageBus public immutable CELER_BUS; - uint64 public immutable CELER_ADAPTER_CHAIN; - constructor(address celerBus, uint32 celerAdapterChain) { + constructor(address headerStorage, address yaho, address celerBus) Reporter(headerStorage, yaho) { CELER_BUS = IMessageBus(celerBus); - CELER_ADAPTER_CHAIN = celerAdapterChain; } - function _celerSend(bytes memory payload, address adapter) internal { - CELER_BUS.sendMessage{ value: msg.value }(adapter, CELER_ADAPTER_CHAIN, payload); + function _dispatch( + uint256 toChainId, + address adapter, + uint256[] memory ids, + bytes32[] memory hashes + ) internal override returns (bytes32) { + bytes memory payload = abi.encode(ids, hashes); + CELER_BUS.sendMessage{ value: msg.value }(adapter, toChainId, payload); + return bytes32(0); } } From ff28b1d989dfebd5661133b6fba242606edf486a Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 24 Jan 2024 16:11:16 +0100 Subject: [PATCH 073/297] feat(evm): adds CCIPReporter and refactors CCIPAdapter --- .../adapters/Chainlink/CCIPAdapter.sol | 36 ++++++++++--------- .../adapters/Chainlink/CCIPHeaderReporter.sol | 18 ---------- .../adapters/Chainlink/CCIPMessageRelay.sol | 18 ---------- .../adapters/Chainlink/CCIPReporter.sol | 33 +++++++++++++---- 4 files changed, 47 insertions(+), 58 deletions(-) delete mode 100644 packages/evm/contracts/adapters/Chainlink/CCIPHeaderReporter.sol delete mode 100644 packages/evm/contracts/adapters/Chainlink/CCIPMessageRelay.sol diff --git a/packages/evm/contracts/adapters/Chainlink/CCIPAdapter.sol b/packages/evm/contracts/adapters/Chainlink/CCIPAdapter.sol index a7a4f9c0..f28f793a 100644 --- a/packages/evm/contracts/adapters/Chainlink/CCIPAdapter.sol +++ b/packages/evm/contracts/adapters/Chainlink/CCIPAdapter.sol @@ -1,31 +1,35 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { CCIPReceiver } from "@chainlink/contracts-ccip/src/v0.8/ccip/applications/CCIPReceiver.sol"; import { Client } from "@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Client.sol"; -import { HeaderOracleAdapter } from "../HeaderOracleAdapter.sol"; +import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; -contract CCIPAdapter is HeaderOracleAdapter, CCIPReceiver { +contract CCIPAdapter is BlockHashOracleAdapter, Ownable, CCIPReceiver { string public constant PROVIDER = "ccip"; - uint64 public immutable CCIP_REPORTER_CHAIN; + + mapping(uint64 => address) public enabledReporters; + mapping(uint64 => uint256) public chainSelectorIds; error UnauthorizedCCIPReceive(); - constructor( - uint256 reporterChain, - address reporterAddress, - address ccipRouter, - uint64 ccipReporterChain - ) HeaderOracleAdapter(reporterChain, reporterAddress) CCIPReceiver(ccipRouter) { - CCIP_REPORTER_CHAIN = ccipReporterChain; + event ReporterSet(uint256 indexed chainId, uint64 indexed chainSelector, address indexed reporter); + + constructor(address ccipRouter) CCIPReceiver(ccipRouter) {} + + function setReporterByChain(uint256 chainId, uint64 chainSelector, address reporter) external onlyOwner { + enabledReporters[chainSelector] = reporter; + chainSelectorIds[chainSelector] = chainId; + emit ReporterSet(chainId, chainSelector, reporter); } function _ccipReceive(Client.Any2EVMMessage memory message) internal override { - // Validity of `msg.sender` is ensured by `CCIPReceiver` prior this internal function invocation - if ( - message.sourceChainSelector != CCIP_REPORTER_CHAIN || - abi.decode(message.sender, (address)) != REPORTER_ADDRESS - ) revert UnauthorizedCCIPReceive(); - _receivePayload(message.data); + // NOTE: validity of `msg.sender` is ensured by `CCIPReceiver` prior this internal function invocation + address sender = abi.decode(message.sender, (address)); + if (enabledReporters[message.sourceChainSelector] != sender) revert UnauthorizedCCIPReceive(); + uint256 sourceChainId = chainSelectorIds[message.sourceChainSelector]; + (uint256[] memory ids, bytes32[] memory hashes) = abi.decode(message.data, (uint256[], bytes32[])); + _storeHashes(sourceChainId, ids, hashes); } } diff --git a/packages/evm/contracts/adapters/Chainlink/CCIPHeaderReporter.sol b/packages/evm/contracts/adapters/Chainlink/CCIPHeaderReporter.sol deleted file mode 100644 index b5671bf0..00000000 --- a/packages/evm/contracts/adapters/Chainlink/CCIPHeaderReporter.sol +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { HeaderReporter } from "../HeaderReporter.sol"; -import { CCIPReporter } from "./CCIPReporter.sol"; - -contract CCIPHeaderReporter is HeaderReporter, CCIPReporter { - constructor( - address headerStorage, - uint64 adapterChain, - address ccipRouter, - uint64 ccipAdapterChain - ) HeaderReporter(headerStorage, adapterChain) CCIPReporter(ccipRouter, ccipAdapterChain) {} // solhint-disable no-empty-blocks - - function _sendPayload(bytes memory payload, address adapter) internal override { - _ccipSend(payload, adapter); - } -} diff --git a/packages/evm/contracts/adapters/Chainlink/CCIPMessageRelay.sol b/packages/evm/contracts/adapters/Chainlink/CCIPMessageRelay.sol deleted file mode 100644 index 382aeba7..00000000 --- a/packages/evm/contracts/adapters/Chainlink/CCIPMessageRelay.sol +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { MessageRelay } from "../MessageRelay.sol"; -import { CCIPReporter } from "./CCIPReporter.sol"; - -contract CCIPMessageRelay is MessageRelay, CCIPReporter { - constructor( - address yaho, - uint64 adapterChain, - address ccipRouter, - uint64 ccipAdapterChain - ) MessageRelay(yaho, adapterChain) CCIPReporter(ccipRouter, ccipAdapterChain) {} // solhint-disable no-empty-blocks - - function _sendPayload(bytes memory payload, address adapter) internal override { - _ccipSend(payload, adapter); - } -} diff --git a/packages/evm/contracts/adapters/Chainlink/CCIPReporter.sol b/packages/evm/contracts/adapters/Chainlink/CCIPReporter.sol index 22544602..4f869c8f 100644 --- a/packages/evm/contracts/adapters/Chainlink/CCIPReporter.sol +++ b/packages/evm/contracts/adapters/Chainlink/CCIPReporter.sol @@ -1,20 +1,40 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { IRouterClient } from "@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IRouterClient.sol"; import { Client } from "@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Client.sol"; +import { Reporter } from "../Reporter.sol"; -abstract contract CCIPReporter { +contract CCIPReporter is Reporter, Ownable { string public constant PROVIDER = "ccip"; + IRouterClient public immutable CCIP_ROUTER; - uint64 public immutable CCIP_ADAPTER_CHAIN; - constructor(address ccipRouter, uint64 ccipAdapterChain) { + mapping(uint256 => uint64) public chainIdSelectors; + + error ChainSelectorNotAvailable(); + + event ChainSelectorSet(uint256 indexed chainId, uint64 indexed chainSelector); + + constructor(address headerStorage, address yaho, address ccipRouter) Reporter(headerStorage, yaho) { CCIP_ROUTER = IRouterClient(ccipRouter); - CCIP_ADAPTER_CHAIN = ccipAdapterChain; } - function _ccipSend(bytes memory payload, address adapter) internal { + function setChainSelectorByChainId(uint256 chainId, uint64 chainSelector) external onlyOwner { + chainIdSelectors[chainId] = chainSelector; + emit ChainSelectorSet(chainId, chainSelector); + } + + function _dispatch( + uint256 toChainId, + address adapter, + uint256[] memory ids, + bytes32[] memory hashes + ) internal override returns (bytes32) { + uint64 chainSelector = chainIdSelectors[toChainId]; + if (chainSelector == 0) revert ChainSelectorNotAvailable(); + bytes memory payload = abi.encode(ids, hashes); Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ receiver: abi.encode(adapter), data: payload, @@ -22,6 +42,7 @@ abstract contract CCIPReporter { extraArgs: Client._argsToBytes(Client.EVMExtraArgsV1({ gasLimit: 200_000, strict: false })), feeToken: address(0) // Pay fees with native }); - CCIP_ROUTER.ccipSend{ value: msg.value }(CCIP_ADAPTER_CHAIN, message); + CCIP_ROUTER.ccipSend{ value: msg.value }(chainSelector, message); + return bytes32(0); } } From 6dbcf7bb837dbd50ace22cd893aafe59af03b015 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 24 Jan 2024 16:22:30 +0100 Subject: [PATCH 074/297] refactor(evm): rn vars --- packages/evm/contracts/adapters/Axelar/AxelarAdapter.sol | 6 +++--- packages/evm/contracts/adapters/Axelar/AxelarReporter.sol | 6 +++--- packages/evm/contracts/adapters/Chainlink/CCIPAdapter.sol | 6 +++--- packages/evm/contracts/adapters/Chainlink/CCIPReporter.sol | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/evm/contracts/adapters/Axelar/AxelarAdapter.sol b/packages/evm/contracts/adapters/Axelar/AxelarAdapter.sol index ebc96f3e..951d7c85 100644 --- a/packages/evm/contracts/adapters/Axelar/AxelarAdapter.sol +++ b/packages/evm/contracts/adapters/Axelar/AxelarAdapter.sol @@ -9,7 +9,7 @@ contract AxelarAdapter is BlockHashOracleAdapter, Ownable, AxelarExecutable { string public constant PROVIDER = "axelar"; mapping(bytes32 => bytes32) public enabledReporters; - mapping(bytes32 => uint256) public chainNameIds; + mapping(bytes32 => uint256) public chainIds; error UnauthorizedAxelarReceive(); error ExecutionWithTokenNotSupported(); @@ -25,7 +25,7 @@ contract AxelarAdapter is BlockHashOracleAdapter, Ownable, AxelarExecutable { ) external onlyOwner { bytes32 chainNameHash = keccak256(bytes(chainName)); enabledReporters[chainNameHash] = keccak256(bytes(reporter)); - chainNameIds[chainNameHash] = chainId; + chainIds[chainNameHash] = chainId; emit ReporterSet(chainId, chainName, reporter); } @@ -36,7 +36,7 @@ contract AxelarAdapter is BlockHashOracleAdapter, Ownable, AxelarExecutable { ) internal override { bytes32 chainNameHash = keccak256(bytes(sourceChain)); bytes32 expectedSourceAddressHash = enabledReporters[chainNameHash]; - uint256 sourceChainId = chainNameIds[chainNameHash]; + uint256 sourceChainId = chainIds[chainNameHash]; if (expectedSourceAddressHash != keccak256(bytes(sourceAddress)) || sourceChainId == 0) { revert UnauthorizedAxelarReceive(); } diff --git a/packages/evm/contracts/adapters/Axelar/AxelarReporter.sol b/packages/evm/contracts/adapters/Axelar/AxelarReporter.sol index b6dcc292..87a31647 100644 --- a/packages/evm/contracts/adapters/Axelar/AxelarReporter.sol +++ b/packages/evm/contracts/adapters/Axelar/AxelarReporter.sol @@ -15,7 +15,7 @@ contract AxelarReporter is Reporter, Ownable { IAxelarGateway public immutable AXELAR_GATEWAY; IAxelarGasService public immutable AXELAR_GAS_SERVICE; - mapping(uint256 => string) public chainIdNames; + mapping(uint256 => string) public chainNames; error ChainIdNotSupported(uint256 chainId); @@ -32,7 +32,7 @@ contract AxelarReporter is Reporter, Ownable { } function setChainNameByChainId(uint256 chainId, string calldata chainName) external onlyOwner { - chainIdNames[chainId] = chainName; + chainNames[chainId] = chainName; emit ChainNameSet(chainId, chainName); } @@ -42,7 +42,7 @@ contract AxelarReporter is Reporter, Ownable { uint256[] memory ids, bytes32[] memory hashes ) internal override returns (bytes32) { - string memory chainName = chainIdNames[toChainId]; + string memory chainName = chainNames[toChainId]; if (keccak256(abi.encode(chainName)) == NULL_STRING) revert ChainIdNotSupported(toChainId); string memory sAdapter = uint256(uint160(adapter)).toHexString(20); diff --git a/packages/evm/contracts/adapters/Chainlink/CCIPAdapter.sol b/packages/evm/contracts/adapters/Chainlink/CCIPAdapter.sol index f28f793a..a31cc642 100644 --- a/packages/evm/contracts/adapters/Chainlink/CCIPAdapter.sol +++ b/packages/evm/contracts/adapters/Chainlink/CCIPAdapter.sol @@ -10,7 +10,7 @@ contract CCIPAdapter is BlockHashOracleAdapter, Ownable, CCIPReceiver { string public constant PROVIDER = "ccip"; mapping(uint64 => address) public enabledReporters; - mapping(uint64 => uint256) public chainSelectorIds; + mapping(uint64 => uint256) public chainIds; error UnauthorizedCCIPReceive(); @@ -20,7 +20,7 @@ contract CCIPAdapter is BlockHashOracleAdapter, Ownable, CCIPReceiver { function setReporterByChain(uint256 chainId, uint64 chainSelector, address reporter) external onlyOwner { enabledReporters[chainSelector] = reporter; - chainSelectorIds[chainSelector] = chainId; + chainIds[chainSelector] = chainId; emit ReporterSet(chainId, chainSelector, reporter); } @@ -28,7 +28,7 @@ contract CCIPAdapter is BlockHashOracleAdapter, Ownable, CCIPReceiver { // NOTE: validity of `msg.sender` is ensured by `CCIPReceiver` prior this internal function invocation address sender = abi.decode(message.sender, (address)); if (enabledReporters[message.sourceChainSelector] != sender) revert UnauthorizedCCIPReceive(); - uint256 sourceChainId = chainSelectorIds[message.sourceChainSelector]; + uint256 sourceChainId = chainIds[message.sourceChainSelector]; (uint256[] memory ids, bytes32[] memory hashes) = abi.decode(message.data, (uint256[], bytes32[])); _storeHashes(sourceChainId, ids, hashes); } diff --git a/packages/evm/contracts/adapters/Chainlink/CCIPReporter.sol b/packages/evm/contracts/adapters/Chainlink/CCIPReporter.sol index 4f869c8f..07a6e736 100644 --- a/packages/evm/contracts/adapters/Chainlink/CCIPReporter.sol +++ b/packages/evm/contracts/adapters/Chainlink/CCIPReporter.sol @@ -11,7 +11,7 @@ contract CCIPReporter is Reporter, Ownable { IRouterClient public immutable CCIP_ROUTER; - mapping(uint256 => uint64) public chainIdSelectors; + mapping(uint256 => uint64) public chainSelectors; error ChainSelectorNotAvailable(); @@ -22,7 +22,7 @@ contract CCIPReporter is Reporter, Ownable { } function setChainSelectorByChainId(uint256 chainId, uint64 chainSelector) external onlyOwner { - chainIdSelectors[chainId] = chainSelector; + chainSelectors[chainId] = chainSelector; emit ChainSelectorSet(chainId, chainSelector); } @@ -32,7 +32,7 @@ contract CCIPReporter is Reporter, Ownable { uint256[] memory ids, bytes32[] memory hashes ) internal override returns (bytes32) { - uint64 chainSelector = chainIdSelectors[toChainId]; + uint64 chainSelector = chainSelectors[toChainId]; if (chainSelector == 0) revert ChainSelectorNotAvailable(); bytes memory payload = abi.encode(ids, hashes); Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ From dd8d57a705f51d9212a307e6fa8a36e60af45fb3 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 24 Jan 2024 16:41:40 +0100 Subject: [PATCH 075/297] feat(evm): adds ConnextReporter and refactors ConnextAdapter --- .../adapters/Connext/ConnextAdapter.sol | 32 +++++++++++-------- .../Connext/ConnextHeaderReporter.sol | 18 ----------- .../adapters/Connext/ConnextMessageRelay.sol | 18 ----------- .../adapters/Connext/ConnextReporter.sol | 32 +++++++++++++++---- 4 files changed, 45 insertions(+), 55 deletions(-) delete mode 100644 packages/evm/contracts/adapters/Connext/ConnextHeaderReporter.sol delete mode 100644 packages/evm/contracts/adapters/Connext/ConnextMessageRelay.sol diff --git a/packages/evm/contracts/adapters/Connext/ConnextAdapter.sol b/packages/evm/contracts/adapters/Connext/ConnextAdapter.sol index 7dc046cb..88ed9ac2 100644 --- a/packages/evm/contracts/adapters/Connext/ConnextAdapter.sol +++ b/packages/evm/contracts/adapters/Connext/ConnextAdapter.sol @@ -1,24 +1,29 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { IXReceiver } from "@connext/interfaces/core/IXReceiver.sol"; -import { HeaderOracleAdapter } from "../HeaderOracleAdapter.sol"; +import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; -contract ConnextAdapter is HeaderOracleAdapter, IXReceiver { +contract ConnextAdapter is BlockHashOracleAdapter, Ownable, IXReceiver { string public constant PROVIDER = "connext"; address public immutable CONNEXT; - uint32 public immutable CONNEXT_REPORTER_CHAIN; + + mapping(uint64 => address) public enabledReporters; + mapping(uint64 => uint256) public chainIds; error UnauthorizedConnextReceive(); - constructor( - uint256 reporterChain, - address reporterAddress, - address connext, - uint32 connextReporterChain - ) HeaderOracleAdapter(reporterChain, reporterAddress) { + event ReporterSet(uint256 indexed chainId, uint32 indexed domainId, address indexed reporter); + + constructor(address connext) { CONNEXT = connext; - CONNEXT_REPORTER_CHAIN = connextReporterChain; + } + + function setReporterByChain(uint256 chainId, uint32 domainId, address reporter) external onlyOwner { + enabledReporters[domainId] = reporter; + chainIds[domainId] = chainId; + emit ReporterSet(chainId, domainId, reporter); } function xReceive( @@ -29,9 +34,10 @@ contract ConnextAdapter is HeaderOracleAdapter, IXReceiver { uint32 origin, bytes memory callData ) external returns (bytes memory) { - if (msg.sender != CONNEXT || origin != CONNEXT_REPORTER_CHAIN || originSender != REPORTER_ADDRESS) - revert UnauthorizedConnextReceive(); - _receivePayload(callData); + if (msg.sender != CONNEXT || enabledReporters[origin] != originSender) revert UnauthorizedConnextReceive(); + uint256 sourceChainId = chainIds[origin]; + (uint256[] memory ids, bytes32[] memory hashes) = abi.decode(callData, (uint256[], bytes32[])); + _storeHashes(sourceChainId, ids, hashes); return ""; } } diff --git a/packages/evm/contracts/adapters/Connext/ConnextHeaderReporter.sol b/packages/evm/contracts/adapters/Connext/ConnextHeaderReporter.sol deleted file mode 100644 index 1e1eecdd..00000000 --- a/packages/evm/contracts/adapters/Connext/ConnextHeaderReporter.sol +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { HeaderReporter } from "../HeaderReporter.sol"; -import { ConnextReporter } from "./ConnextReporter.sol"; - -contract ConnextHeaderReporter is HeaderReporter, ConnextReporter { - constructor( - address headerStorage, - uint256 adapterChain, - address connext, - uint32 connextAdapterChain - ) HeaderReporter(headerStorage, adapterChain) ConnextReporter(connext, connextAdapterChain) {} // solhint-disable no-empty-blocks - - function _sendPayload(bytes memory payload, address adapter) internal override { - _connextSend(payload, adapter); - } -} diff --git a/packages/evm/contracts/adapters/Connext/ConnextMessageRelay.sol b/packages/evm/contracts/adapters/Connext/ConnextMessageRelay.sol deleted file mode 100644 index 219e866f..00000000 --- a/packages/evm/contracts/adapters/Connext/ConnextMessageRelay.sol +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { MessageRelay } from "../MessageRelay.sol"; -import { ConnextReporter } from "./ConnextReporter.sol"; - -contract ConnextMessageRelay is MessageRelay, ConnextReporter { - constructor( - address yaho, - uint256 adapterChain, - address connext, - uint32 connextAdapterChain - ) MessageRelay(yaho, adapterChain) ConnextReporter(connext, connextAdapterChain) {} // solhint-disable no-empty-blocks - - function _sendPayload(bytes memory payload, address adapter) internal override { - _connextSend(payload, adapter); - } -} diff --git a/packages/evm/contracts/adapters/Connext/ConnextReporter.sol b/packages/evm/contracts/adapters/Connext/ConnextReporter.sol index 540dbb68..65dea8c2 100644 --- a/packages/evm/contracts/adapters/Connext/ConnextReporter.sol +++ b/packages/evm/contracts/adapters/Connext/ConnextReporter.sol @@ -1,23 +1,41 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { IConnext } from "@connext/interfaces/core/IConnext.sol"; +import { Reporter } from "../Reporter.sol"; -abstract contract ConnextReporter { +contract ConnextReporter is Reporter, Ownable { string public constant PROVIDER = "connext"; IConnext public immutable CONNEXT; - uint32 public immutable CONNEXT_ADAPTER_CHAIN; + mapping(uint256 => uint32) public domainIds; event ConnextTransfer(bytes32 transferId); - constructor(address connext, uint32 connextAdapterChain) { + error DomainIdNotAvailable(); + + event DomainIdSet(uint256 indexed chainId, uint32 indexed domainId); + + constructor(address headerStorage, address yaho, address connext) Reporter(headerStorage, yaho) { CONNEXT = IConnext(connext); - CONNEXT_ADAPTER_CHAIN = connextAdapterChain; } - function _connextSend(bytes memory payload, address adapter) internal { + function setDomainIdByChainId(uint256 chainId, uint32 domainId) external onlyOwner { + domainIds[chainId] = domainId; + emit DomainIdSet(chainId, domainId); + } + + function _dispatch( + uint256 toChainId, + address adapter, + uint256[] memory ids, + bytes32[] memory hashes + ) internal override returns (bytes32) { + uint32 domainId = domainIds[toChainId]; + if (domainId == 0) revert DomainIdNotAvailable(); + bytes memory payload = abi.encode(ids, hashes); bytes32 transferId = CONNEXT.xcall{ value: msg.value }( - CONNEXT_ADAPTER_CHAIN, // _destination: Domain ID of the destination chain + domainId, // _destination: Domain ID of the destination chain adapter, // _to: address of the target contract address(0), // _asset: use address zero for 0-value transfers msg.sender, // _delegate: address that can revert or forceLocal on destination @@ -26,5 +44,7 @@ abstract contract ConnextReporter { payload // _callData: the encoded calldata to send ); emit ConnextTransfer(transferId); + + return bytes32(0); } } From f424603df42a5c89988235622ddd245ecd267597 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 24 Jan 2024 16:45:13 +0100 Subject: [PATCH 076/297] refactor(evm): mv event position within ConnextReporter --- packages/evm/contracts/adapters/Connext/ConnextReporter.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/evm/contracts/adapters/Connext/ConnextReporter.sol b/packages/evm/contracts/adapters/Connext/ConnextReporter.sol index 65dea8c2..337451f1 100644 --- a/packages/evm/contracts/adapters/Connext/ConnextReporter.sol +++ b/packages/evm/contracts/adapters/Connext/ConnextReporter.sol @@ -10,11 +10,11 @@ contract ConnextReporter is Reporter, Ownable { IConnext public immutable CONNEXT; mapping(uint256 => uint32) public domainIds; - event ConnextTransfer(bytes32 transferId); error DomainIdNotAvailable(); event DomainIdSet(uint256 indexed chainId, uint32 indexed domainId); + event ConnextTransfer(bytes32 transferId); constructor(address headerStorage, address yaho, address connext) Reporter(headerStorage, yaho) { CONNEXT = IConnext(connext); From 0df3a609750f2539d1d50da654bf8918eb85533c Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 24 Jan 2024 17:09:16 +0100 Subject: [PATCH 077/297] refactor(evm): changes mapping key types within ConnextAdapter --- packages/evm/contracts/adapters/Connext/ConnextAdapter.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/evm/contracts/adapters/Connext/ConnextAdapter.sol b/packages/evm/contracts/adapters/Connext/ConnextAdapter.sol index 88ed9ac2..b39a1d09 100644 --- a/packages/evm/contracts/adapters/Connext/ConnextAdapter.sol +++ b/packages/evm/contracts/adapters/Connext/ConnextAdapter.sol @@ -9,8 +9,8 @@ contract ConnextAdapter is BlockHashOracleAdapter, Ownable, IXReceiver { string public constant PROVIDER = "connext"; address public immutable CONNEXT; - mapping(uint64 => address) public enabledReporters; - mapping(uint64 => uint256) public chainIds; + mapping(uint32 => address) public enabledReporters; + mapping(uint32 => uint256) public chainIds; error UnauthorizedConnextReceive(); From 8f11eff150dd7ea0426080562bf2614744d9dd1e Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 24 Jan 2024 17:09:48 +0100 Subject: [PATCH 078/297] feat(evm): adds HyperlaneReporter and refactors HyperlaneAdapter --- .../adapters/Hyperlane/HyperlaneAdapter.sol | 42 +++++++++---------- .../Hyperlane/HyperlaneHeaderReporter.sol | 18 -------- .../Hyperlane/HyperlaneMessageRelay.sol | 18 -------- .../adapters/Hyperlane/HyperlaneReporter.sol | 37 +++++++++++----- 4 files changed, 47 insertions(+), 68 deletions(-) delete mode 100644 packages/evm/contracts/adapters/Hyperlane/HyperlaneHeaderReporter.sol delete mode 100644 packages/evm/contracts/adapters/Hyperlane/HyperlaneMessageRelay.sol diff --git a/packages/evm/contracts/adapters/Hyperlane/HyperlaneAdapter.sol b/packages/evm/contracts/adapters/Hyperlane/HyperlaneAdapter.sol index f581afd5..4a9a764e 100644 --- a/packages/evm/contracts/adapters/Hyperlane/HyperlaneAdapter.sol +++ b/packages/evm/contracts/adapters/Hyperlane/HyperlaneAdapter.sol @@ -1,40 +1,38 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { IMessageRecipient } from "@hyperlane-xyz/core/contracts/interfaces/IMessageRecipient.sol"; import { IInterchainSecurityModule } from "@hyperlane-xyz/core/contracts/interfaces/IInterchainSecurityModule.sol"; -import { HeaderOracleAdapter } from "../HeaderOracleAdapter.sol"; +import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; -contract HyperlaneAdapter is HeaderOracleAdapter, IMessageRecipient { +contract HyperlaneAdapter is BlockHashOracleAdapter, Ownable, IMessageRecipient { string public constant PROVIDER = "hyperlane"; + address public immutable HYPERLANE_MAILBOX; - uint32 public immutable HYPERLANE_REPORTER_CHAIN; - bytes32 public immutable HYPERLANE_REPORTER_ADDRESS; - IInterchainSecurityModule public interchainSecurityModule; + mapping(uint32 => bytes32) public enabledReporters; + mapping(uint32 => uint256) public chainIds; error UnauthorizedHyperlaneReceive(); - constructor( - uint256 reporterChain, - address reporterAddress, - address hyperlaneMailbox, - uint32 hyperlaneReporterChain, - bytes32 hyperlaneReporterAddress, - address hyperlaneISM - ) HeaderOracleAdapter(reporterChain, reporterAddress) { + event ReporterSet(uint256 indexed chainId, uint32 indexed domain, bytes32 indexed reporter); + + constructor(address hyperlaneMailbox) { HYPERLANE_MAILBOX = hyperlaneMailbox; - HYPERLANE_REPORTER_CHAIN = hyperlaneReporterChain; - HYPERLANE_REPORTER_ADDRESS = hyperlaneReporterAddress; - interchainSecurityModule = IInterchainSecurityModule(hyperlaneISM); } function handle(uint32 origin, bytes32 sender, bytes calldata message) external payable { - if ( - msg.sender != HYPERLANE_MAILBOX || - origin != HYPERLANE_REPORTER_CHAIN || - sender != HYPERLANE_REPORTER_ADDRESS - ) revert UnauthorizedHyperlaneReceive(); - _receivePayload(message); + if (msg.sender != HYPERLANE_MAILBOX || enabledReporters[origin] != sender) + revert UnauthorizedHyperlaneReceive(); + uint256 sourceChainId = chainIds[origin]; + (uint256[] memory ids, bytes32[] memory hashes) = abi.decode(message, (uint256[], bytes32[])); + _storeHashes(sourceChainId, ids, hashes); + } + + function setReporterByChain(uint256 chainId, uint32 domain, bytes32 reporter) external onlyOwner { + enabledReporters[domain] = reporter; + chainIds[domain] = chainId; + emit ReporterSet(chainId, domain, reporter); } } diff --git a/packages/evm/contracts/adapters/Hyperlane/HyperlaneHeaderReporter.sol b/packages/evm/contracts/adapters/Hyperlane/HyperlaneHeaderReporter.sol deleted file mode 100644 index ab43805a..00000000 --- a/packages/evm/contracts/adapters/Hyperlane/HyperlaneHeaderReporter.sol +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { HeaderReporter } from "../HeaderReporter.sol"; -import { HyperlaneReporter } from "./HyperlaneReporter.sol"; - -contract HyperlaneHeaderReporter is HeaderReporter, HyperlaneReporter { - constructor( - address headerStorage, - uint256 adapterChain, - address hyperlaneMailbox, - uint32 hyperlaneAdapterChain - ) HeaderReporter(headerStorage, adapterChain) HyperlaneReporter(hyperlaneMailbox, hyperlaneAdapterChain) {} // solhint-disable no-empty-blocks - - function _sendPayload(bytes memory payload, address adapter) internal override { - _hyperlaneSend(payload, adapter); - } -} diff --git a/packages/evm/contracts/adapters/Hyperlane/HyperlaneMessageRelay.sol b/packages/evm/contracts/adapters/Hyperlane/HyperlaneMessageRelay.sol deleted file mode 100644 index 6b6827cc..00000000 --- a/packages/evm/contracts/adapters/Hyperlane/HyperlaneMessageRelay.sol +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { MessageRelay } from "../MessageRelay.sol"; -import { HyperlaneReporter } from "./HyperlaneReporter.sol"; - -contract HyperlaneMessageRelay is MessageRelay, HyperlaneReporter { - constructor( - address yaho, - uint256 adapterChain, - address hyperlaneMailbox, - uint32 hyperlaneAdapterChain - ) MessageRelay(yaho, adapterChain) HyperlaneReporter(hyperlaneMailbox, hyperlaneAdapterChain) {} // solhint-disable no-empty-blocks - - function _sendPayload(bytes memory payload, address adapter) internal override { - _hyperlaneSend(payload, adapter); - } -} diff --git a/packages/evm/contracts/adapters/Hyperlane/HyperlaneReporter.sol b/packages/evm/contracts/adapters/Hyperlane/HyperlaneReporter.sol index 34e53210..84d57b07 100644 --- a/packages/evm/contracts/adapters/Hyperlane/HyperlaneReporter.sol +++ b/packages/evm/contracts/adapters/Hyperlane/HyperlaneReporter.sol @@ -1,26 +1,43 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { IMailbox } from "@hyperlane-xyz/core/contracts/interfaces/IMailbox.sol"; import { TypeCasts } from "@hyperlane-xyz/core/contracts/libs/TypeCasts.sol"; +import { Reporter } from "../Reporter.sol"; -abstract contract HyperlaneReporter { +contract HyperlaneReporter is Reporter, Ownable { using TypeCasts for address; string public constant PROVIDER = "hyperlane"; IMailbox public immutable HYPERLANE_MAILBOX; - uint32 public immutable HYPERLANE_ADAPTER_CHAIN; - constructor(address hyperlaneMailbox, uint32 hyperlaneAdapterChain) { + mapping(uint256 => uint32) public domains; + + error DomainNotAvailable(); + + event DomainSet(uint256 indexed chainId, uint32 indexed domain); + + constructor(address headerStorage, address yaho, address hyperlaneMailbox) Reporter(headerStorage, yaho) { HYPERLANE_MAILBOX = IMailbox(hyperlaneMailbox); - HYPERLANE_ADAPTER_CHAIN = hyperlaneAdapterChain; } - function _hyperlaneSend(bytes memory payload, address adapter) internal { - HYPERLANE_MAILBOX.dispatch{ value: msg.value }( - HYPERLANE_ADAPTER_CHAIN, // _destinationDomain - adapter.addressToBytes32(), // _recipientAddress - payload // _messageBody - ); + function setDomainByChainId(uint256 chainId, uint32 domain) external onlyOwner { + domains[chainId] = domain; + emit DomainSet(chainId, domain); + } + + function _dispatch( + uint256 toChainId, + address adapter, + uint256[] memory ids, + bytes32[] memory hashes + ) internal override returns (bytes32) { + uint32 destinationDomain = domains[toChainId]; + if (destinationDomain == 0) revert DomainNotAvailable(); + bytes memory payload = abi.encode(ids, hashes); + HYPERLANE_MAILBOX.dispatch{ value: msg.value }(destinationDomain, adapter.addressToBytes32(), payload); + + return bytes32(0); } } From 43bef50aa087b9bbcdaf00171ccb5969b14324ca Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 24 Jan 2024 17:42:42 +0100 Subject: [PATCH 079/297] feat(evm): adds LayerZeroReporter and refactors LayerZeroAdapter --- .../adapters/LayerZero/LayerZeroAdapter.sol | 41 ++++++++++--------- .../LayerZero/LayerZeroHeaderReporter.sol | 18 -------- .../LayerZero/LayerZeroMessageRelay.sol | 18 -------- .../adapters/LayerZero/LayerZeroReporter.sol | 36 ++++++++++++---- 4 files changed, 49 insertions(+), 64 deletions(-) delete mode 100644 packages/evm/contracts/adapters/LayerZero/LayerZeroHeaderReporter.sol delete mode 100644 packages/evm/contracts/adapters/LayerZero/LayerZeroMessageRelay.sol diff --git a/packages/evm/contracts/adapters/LayerZero/LayerZeroAdapter.sol b/packages/evm/contracts/adapters/LayerZero/LayerZeroAdapter.sol index 80ab6951..6eb47265 100644 --- a/packages/evm/contracts/adapters/LayerZero/LayerZeroAdapter.sol +++ b/packages/evm/contracts/adapters/LayerZero/LayerZeroAdapter.sol @@ -1,35 +1,36 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { ILayerZeroReceiver } from "./interfaces/ILayerZeroReceiver.sol"; -import { HeaderOracleAdapter } from "../HeaderOracleAdapter.sol"; +import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; -contract LayerZeroAdapter is HeaderOracleAdapter, ILayerZeroReceiver { +contract LayerZeroAdapter is BlockHashOracleAdapter, Ownable, ILayerZeroReceiver { string public constant PROVIDER = "layer-zero"; address public immutable LAYER_ZERO_ENDPOINT; - uint32 public immutable LAYER_ZERO_REPORTER_CHAIN; - bytes32 public immutable LAYER_ZERO_REPORTER_PATH_HASH; + + mapping(uint32 => bytes32) public enabledReportersPaths; + mapping(uint32 => uint256) public chainIds; error UnauthorizedLayerZeroReceive(); - constructor( - uint256 reporterChain, - address reporterAddress, - address lzEndpoint, - uint16 lzReporterChain - ) HeaderOracleAdapter(reporterChain, reporterAddress) { + event ReporterSet(uint256 indexed chainId, uint16 indexed endpointId, address indexed reporter); + + constructor(address lzEndpoint) { LAYER_ZERO_ENDPOINT = lzEndpoint; - LAYER_ZERO_REPORTER_CHAIN = lzReporterChain; - bytes memory path = abi.encodePacked(reporterAddress, address(this)); - LAYER_ZERO_REPORTER_PATH_HASH = keccak256(path); } - function lzReceive(uint16 srcChainId, bytes memory srcAddress, uint64 /* nonce */, bytes memory payload) external { - if ( - msg.sender != LAYER_ZERO_ENDPOINT || - srcChainId != LAYER_ZERO_REPORTER_CHAIN || - keccak256(srcAddress) != LAYER_ZERO_REPORTER_PATH_HASH - ) revert UnauthorizedLayerZeroReceive(); - _receivePayload(payload); + function lzReceive(uint16 srcEndpointId, bytes memory srcPath, uint64 /* nonce */, bytes memory payload) external { + if (msg.sender != LAYER_ZERO_ENDPOINT || enabledReportersPaths[srcEndpointId] != keccak256(srcPath)) + revert UnauthorizedLayerZeroReceive(); + uint256 sourceChainId = chainIds[srcEndpointId]; + (uint256[] memory ids, bytes32[] memory hashes) = abi.decode(payload, (uint256[], bytes32[])); + _storeHashes(sourceChainId, ids, hashes); + } + + function setReporterByChain(uint256 chainId, uint16 endpointId, address reporter) external onlyOwner { + enabledReportersPaths[endpointId] = keccak256(abi.encodePacked(reporter, address(this))); + chainIds[endpointId] = chainId; + emit ReporterSet(chainId, endpointId, reporter); } } diff --git a/packages/evm/contracts/adapters/LayerZero/LayerZeroHeaderReporter.sol b/packages/evm/contracts/adapters/LayerZero/LayerZeroHeaderReporter.sol deleted file mode 100644 index 75254dfc..00000000 --- a/packages/evm/contracts/adapters/LayerZero/LayerZeroHeaderReporter.sol +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { HeaderReporter } from "../HeaderReporter.sol"; -import { LayerZeroReporter } from "./LayerZeroReporter.sol"; - -contract LayerZeroHeaderReporter is HeaderReporter, LayerZeroReporter { - constructor( - address headerStorage, - uint256 adapterChain, - address lzEndpoint, - uint16 lzAdapterChain - ) HeaderReporter(headerStorage, adapterChain) LayerZeroReporter(lzEndpoint, lzAdapterChain) {} // solhint-disable no-empty-blocks - - function _sendPayload(bytes memory payload, address adapter) internal override { - _lzSend(payload, adapter); - } -} diff --git a/packages/evm/contracts/adapters/LayerZero/LayerZeroMessageRelay.sol b/packages/evm/contracts/adapters/LayerZero/LayerZeroMessageRelay.sol deleted file mode 100644 index 369849ab..00000000 --- a/packages/evm/contracts/adapters/LayerZero/LayerZeroMessageRelay.sol +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { MessageRelay } from "../MessageRelay.sol"; -import { LayerZeroReporter } from "./LayerZeroReporter.sol"; - -contract LayerZeroMessageRelay is MessageRelay, LayerZeroReporter { - constructor( - address yaho, - uint256 adapterChain, - address lzEndpoint, - uint16 lzAdapterChain - ) MessageRelay(yaho, adapterChain) LayerZeroReporter(lzEndpoint, lzAdapterChain) {} // solhint-disable no-empty-blocks - - function _sendPayload(bytes memory payload, address adapter) internal override { - _lzSend(payload, adapter); - } -} diff --git a/packages/evm/contracts/adapters/LayerZero/LayerZeroReporter.sol b/packages/evm/contracts/adapters/LayerZero/LayerZeroReporter.sol index f07ffb98..fd1eb5b9 100644 --- a/packages/evm/contracts/adapters/LayerZero/LayerZeroReporter.sol +++ b/packages/evm/contracts/adapters/LayerZero/LayerZeroReporter.sol @@ -1,28 +1,48 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { ILayerZeroEndpoint } from "./interfaces/ILayerZeroEndpoint.sol"; +import { Reporter } from "../Reporter.sol"; -abstract contract LayerZeroReporter { +contract LayerZeroReporter is Reporter, Ownable { string public constant PROVIDER = "layer-zero"; ILayerZeroEndpoint public immutable LAYER_ZERO_ENDPOINT; - uint16 public immutable LAYER_ZERO_ADAPTER_CHAIN; - constructor(address lzEndpoint, uint16 lzAdapterChain) { + mapping(uint256 => uint16) public endpointIds; + + error EndpointIdNotAvailable(); + + event EndpointIdSet(uint256 indexed chainId, uint16 indexed endpointId); + + constructor(address headerStorage, address yaho, address lzEndpoint) Reporter(headerStorage, yaho) { LAYER_ZERO_ENDPOINT = ILayerZeroEndpoint(lzEndpoint); - LAYER_ZERO_ADAPTER_CHAIN = lzAdapterChain; } - function _lzSend(bytes memory payload, address adapter) internal { + function setEndpointIdByChainId(uint256 chainId, uint16 endpointId) external onlyOwner { + endpointIds[chainId] = endpointId; + emit EndpointIdSet(chainId, endpointId); + } + + function _dispatch( + uint256 toChainId, + address adapter, + uint256[] memory ids, + bytes32[] memory hashes + ) internal override returns (bytes32) { + uint16 endpointId = endpointIds[toChainId]; + if (endpointId == 0) revert EndpointIdNotAvailable(); + bytes memory payload = abi.encode(ids, hashes); bytes memory path = abi.encodePacked(adapter, address(this)); // solhint-disable-next-line check-send-result LAYER_ZERO_ENDPOINT.send{ value: msg.value }( - LAYER_ZERO_ADAPTER_CHAIN, // _dstChainId: destination LayerZero chainId - path, // _destination: send to this address on the destination - payload, // _payload: bytes payload + endpointId, + path, + payload, payable(msg.sender), // _refundAddress: refund address address(0), // _zroPaymentAddress: future parameter bytes("") // _adapterParams: adapterParams (see "Advanced Features") ); + return bytes32(0); } } From 279d668e4ddc86cf3d66df979c4f57de46045c90 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 24 Jan 2024 17:47:06 +0100 Subject: [PATCH 080/297] chore(evm): rm axiom adapter --- .../evm/contracts/adapters/axiom/AxiomV02.sol | 224 ------------------ .../adapters/axiom/AxiomV02StoragePf.sol | 171 ------------- .../evm/contracts/adapters/axiom/IAxiomV0.sol | 44 ---- .../adapters/axiom/IAxiomV0StoragePf.sol | 25 -- .../evm/contracts/adapters/axiom/Ownable.sol | 83 ------- .../adapters/axiom/utils/Context.sol | 24 -- 6 files changed, 571 deletions(-) delete mode 100644 packages/evm/contracts/adapters/axiom/AxiomV02.sol delete mode 100644 packages/evm/contracts/adapters/axiom/AxiomV02StoragePf.sol delete mode 100644 packages/evm/contracts/adapters/axiom/IAxiomV0.sol delete mode 100644 packages/evm/contracts/adapters/axiom/IAxiomV0StoragePf.sol delete mode 100644 packages/evm/contracts/adapters/axiom/Ownable.sol delete mode 100644 packages/evm/contracts/adapters/axiom/utils/Context.sol diff --git a/packages/evm/contracts/adapters/axiom/AxiomV02.sol b/packages/evm/contracts/adapters/axiom/AxiomV02.sol deleted file mode 100644 index 535af775..00000000 --- a/packages/evm/contracts/adapters/axiom/AxiomV02.sol +++ /dev/null @@ -1,224 +0,0 @@ -// SPDX-License-Identifier: MIT -// WARNING! This smart contract and the associated zk-SNARK verifiers have not been audited. -// DO NOT USE THIS CONTRACT FOR PRODUCTION -pragma solidity ^0.8.12; - -import { IAxiomV0 } from "./IAxiomV0.sol"; -import { Ownable } from "./Ownable.sol"; - -uint8 constant TREE_DEPTH = 10; -uint32 constant NUM_LEAVES = 2 ** 10; - -// array indices for reading from the ZKP calldata -uint32 constant PUBLIC_BYTES_START_IDX = 4 * 3 * 32; -uint32 constant ROOT_BYTES_START_IDX = PUBLIC_BYTES_START_IDX + 5 * 32; - -// constants for batch import of historical block hashes -uint8 constant HISTORICAL_TREE_DEPTH = 17; -uint32 constant HISTORICAL_NUM_LEAVES = 2 ** 17; -uint32 constant HISTORICAL_NUM_ROOTS = 2 ** 7; // HISTORICAL_NUM_LEAVES / NUM_LEAVES - -function calcMerkleRoot(bytes32[HISTORICAL_NUM_ROOTS] calldata leaves) pure returns (bytes32) { - uint256 len = HISTORICAL_NUM_ROOTS >> 1; - bytes32[] memory roots = new bytes32[](len); - for (uint256 i = 0; i < len; i++) { - roots[i] = keccak256(abi.encodePacked(leaves[i << 1], leaves[(i << 1) | 1])); - } - while (len > 1) { - len >>= 1; - for (uint256 i = 0; i < len; i++) { - roots[i] = keccak256(abi.encodePacked(roots[i << 1], roots[(i << 1) | 1])); - } - } - return roots[0]; -} - -contract AxiomV02 is IAxiomV0, Ownable { - string public constant VERSION = "0.2"; - - /// @notice The address of the snark verifier contract. */ - address public verifierAddress; - /** @dev The address of AxiomV0 version "0.1". We will read from the storage of the old contract for old block hashes. */ - address public oldAxiomAddress; - /// @notice The block the contract was created at - uint256 public creationBlockNumber; - - // historicalRoots[startBlockNumber] is 0 unless (startBlockNumber % NUM_LEAVES == 0) - // historicalRoots[startBlockNumber] holds the hash of - // prevHash || root || numFinal - // where - // - prevHash is the parent hash of block startBlockNumber - // - root is the partial Merkle root of blockhashes of block numbers - // [startBlockNumber, startBlockNumber + NUM_LEAVES) - // where unconfirmed block hashes are 0's - // - numFinal is the number of confirmed consecutive roots in [startBlockNumber, startBlockNumber + NUM_LEAVES) - mapping(uint32 => bytes32) internal _historicalRoots; - - event UpdateSnarkVerifierAddress(address newAddress); - - /** @dev We do not re-import all historical blockhashes in this v0.2 contract, so we use the old v0.1 contract for older block numbers */ - function historicalRoots(uint32 startBlockNumber) public view returns (bytes32) { - if (startBlockNumber < creationBlockNumber) { - return IAxiomV0(oldAxiomAddress).historicalRoots(startBlockNumber); - } else { - return _historicalRoots[startBlockNumber]; - } - } - - constructor(address _oldAddress, address _verifierAddress) { - creationBlockNumber = block.number; - oldAxiomAddress = _oldAddress; - verifierAddress = _verifierAddress; - } - - function updateSnarkVerifierAddress(address _verifierAddress) external onlyOwner { - verifierAddress = _verifierAddress; - emit UpdateSnarkVerifierAddress(_verifierAddress); - } - - function verifyRaw(bytes calldata input) private returns (bool) { - (bool success, ) = verifierAddress.call(input); - return success; - } - - function getEmptyHash(uint256 depth) public pure returns (bytes32) { - // emptyHashes[idx] is the Merkle root of a tree of depth idx with 0's as leaves - bytes32[TREE_DEPTH] memory emptyHashes = [ - bytes32(0x0000000000000000000000000000000000000000000000000000000000000000), - bytes32(0xad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5), - bytes32(0xb4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30), - bytes32(0x21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85), - bytes32(0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344), - bytes32(0x0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d), - bytes32(0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968), - bytes32(0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83), - bytes32(0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af), - bytes32(0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0) - ]; - return emptyHashes[depth]; - } - - // The ZKP has block headers for [startBlockNumber, endBlockNumber] blocks. - // We extract some common information from the calldata. - function getBoundaryBlockData( - bytes calldata proofData - ) - internal - pure - returns (bytes32 prevHash, bytes32 endHash, uint32 startBlockNumber, uint32 endBlockNumber, bytes32 root) - { - prevHash = bytes32( - (uint256(bytes32(proofData[PUBLIC_BYTES_START_IDX:PUBLIC_BYTES_START_IDX + 32])) << 128) | - uint128(bytes16(proofData[PUBLIC_BYTES_START_IDX + 32 + 16:PUBLIC_BYTES_START_IDX + 2 * 32])) - ); - endHash = bytes32( - (uint256(bytes32(proofData[PUBLIC_BYTES_START_IDX + 2 * 32:PUBLIC_BYTES_START_IDX + 3 * 32])) << 128) | - uint128(bytes16(proofData[PUBLIC_BYTES_START_IDX + 3 * 32 + 16:PUBLIC_BYTES_START_IDX + 4 * 32])) - ); - startBlockNumber = uint32( - bytes4(proofData[PUBLIC_BYTES_START_IDX + 5 * 32 - 8:PUBLIC_BYTES_START_IDX + 5 * 32 - 4]) - ); - endBlockNumber = uint32(bytes4(proofData[PUBLIC_BYTES_START_IDX + 5 * 32 - 4:PUBLIC_BYTES_START_IDX + 5 * 32])); - root = bytes32( - (uint256(bytes32(proofData[ROOT_BYTES_START_IDX:ROOT_BYTES_START_IDX + 32])) << 128) | - uint128(bytes16(proofData[ROOT_BYTES_START_IDX + 48:ROOT_BYTES_START_IDX + 64])) - ); - } - - // update blocks in the "backward" direction, anchoring on a "recent" end blockhash that is within last 256 blocks - // * startBlockNumber must be a multiple of NUM_LEAVES - // * roots[idx] is the root of a Merkle tree of height 2**(TREE_DEPTH - idx) in a Merkle mountain - // range which stores block hashes in the interval [startBlockNumber, endBlockNumber] - function updateRecent(bytes calldata proofData) external { - ( - bytes32 prevHash, - bytes32 endHash, - uint32 startBlockNumber, - uint32 endBlockNumber, - bytes32 root - ) = getBoundaryBlockData(proofData); - bytes32[TREE_DEPTH] memory roots; - for (uint256 idx = 1; idx <= TREE_DEPTH; idx++) { - roots[idx - 1] = bytes32( - (uint256(bytes32(proofData[ROOT_BYTES_START_IDX + idx * 64:ROOT_BYTES_START_IDX + idx * 64 + 32])) << - 128) | - uint128( - bytes16( - proofData[ROOT_BYTES_START_IDX + idx * 64 + 16 + 32:ROOT_BYTES_START_IDX + idx * 64 + 64] - ) - ) - ); - } - - uint32 numFinal = endBlockNumber - startBlockNumber + 1; - require(numFinal <= NUM_LEAVES); // "Updating too many blocks at once"); - require(startBlockNumber % NUM_LEAVES == 0); // "startBlockNumber not a multiple of NUM_LEAVES"); - require(block.number - endBlockNumber <= 256); // "Not a recent endBlock"); - require(endBlockNumber < block.number); // "Not a recent endBlock"); - require(blockhash(endBlockNumber) == endHash); // "endHash does not match"); - require(verifyRaw(proofData)); // "ZKP does not verify"); - - if (root == bytes32(0)) { - // compute Merkle root of completed Merkle mountain range with 0s for unconfirmed blockhashes - for (uint256 round = 1; round <= TREE_DEPTH; round++) { - if (roots[TREE_DEPTH - round] != 0) { - root = keccak256(abi.encodePacked(roots[TREE_DEPTH - round], root)); - } else { - root = keccak256(abi.encodePacked(root, getEmptyHash(round - 1))); - } - } - } - _historicalRoots[startBlockNumber] = keccak256(abi.encodePacked(prevHash, root, numFinal)); - emit UpdateEvent(startBlockNumber, prevHash, root, numFinal); - } - - // update older blocks in "backwards" direction, anchoring on more recent trusted blockhash - // must be batch of NUM_LEAVES blocks - function updateOld(bytes32 nextRoot, uint32 nextNumFinal, bytes calldata proofData) external { - ( - bytes32 prevHash, - bytes32 endHash, - uint32 startBlockNumber, - uint32 endBlockNumber, - bytes32 root - ) = getBoundaryBlockData(proofData); - - require(startBlockNumber % NUM_LEAVES == 0, "aa"); // "startBlockNumber not a multiple of NUM_LEAVES"); - require(endBlockNumber - startBlockNumber == NUM_LEAVES - 1, "bb"); // "Updating with incorrect number of blocks"); - - require( - historicalRoots(endBlockNumber + 1) == keccak256(abi.encodePacked(endHash, nextRoot, nextNumFinal)), - "cc" - ); - // "endHash does not match" - require(verifyRaw(proofData)); // "ZKP does not verify") - - _historicalRoots[startBlockNumber] = keccak256(abi.encodePacked(prevHash, root, NUM_LEAVES)); - emit UpdateEvent(startBlockNumber, prevHash, root, NUM_LEAVES); - } - - function isRecentBlockHashValid(uint32 blockNumber, bytes32 claimedBlockHash) public view returns (bool) { - bytes32 blockHash = blockhash(blockNumber); - require(blockHash != 0x0); // "Must supply block hash of one of 256 most recent blocks" - return (blockHash == claimedBlockHash); - } - - function isBlockHashValid(BlockHashWitness calldata witness) public view returns (bool) { - require(witness.claimedBlockHash != 0x0); // "Claimed block hash cannot be 0" - uint32 side = witness.blockNumber % NUM_LEAVES; - uint32 startBlockNumber = witness.blockNumber - side; - bytes32 merkleRoot = historicalRoots(startBlockNumber); - require(merkleRoot != 0); // "Merkle root must be stored already" - // compute Merkle root of blockhash - bytes32 root = witness.claimedBlockHash; - for (uint8 depth = 0; depth < TREE_DEPTH; depth++) { - // 0 for left, 1 for right - if ((side >> depth) & 1 == 0) { - root = keccak256(abi.encodePacked(root, witness.merkleProof[depth])); - } else { - root = keccak256(abi.encodePacked(witness.merkleProof[depth], root)); - } - } - return (merkleRoot == keccak256(abi.encodePacked(witness.prevHash, root, witness.numFinal))); - } -} diff --git a/packages/evm/contracts/adapters/axiom/AxiomV02StoragePf.sol b/packages/evm/contracts/adapters/axiom/AxiomV02StoragePf.sol deleted file mode 100644 index 97f50fab..00000000 --- a/packages/evm/contracts/adapters/axiom/AxiomV02StoragePf.sol +++ /dev/null @@ -1,171 +0,0 @@ -// SPDX-License-Identifier: MIT -// WARNING! This smart contract and the associated zk-SNARK verifiers have not been audited. -// DO NOT USE THIS CONTRACT FOR PRODUCTION -pragma solidity ^0.8.12; - -import { IAxiomV0 } from "./IAxiomV0.sol"; -import { IAxiomV0StoragePf } from "./IAxiomV0StoragePf.sol"; -// import {Ownable} from "openzeppelin-contracts/access/Ownable.sol"; -import { Ownable } from "./Ownable.sol"; -import { IHashi } from "../../interfaces/IHashi.sol"; -import { IOracleAdapter } from "../../interfaces/IOracleAdapter.sol"; - -uint8 constant SLOT_NUMBER = 10; - -contract AxiomV02StoragePf is Ownable, IAxiomV0StoragePf { - string public constant VERSION = "0.2"; - - address private axiomAddress; // address of deployed AxiomV0 contract - address private verifierAddress; // address of deployed ZKP verifier for storage proofs - address private hashiAddress; // address of deployed Hashi contract - - address private cryptoPunk420OwnerAtBlock10Mil; // address of attested owner of CryptoPunk#420 at Block 10000000 - - // slotAttestations[keccak256(blockNumber || addr || slot || slotValue)] = true - // if and only if it has been checked that: - // at block number `blockNumber`, the account storage of `addr` has value `slotValue` at slot `slot` - mapping(bytes32 => bool) public slotAttestations; - - event UpdateAxiomAddress(address newAddress); - event UpdateSnarkVerifierAddress(address newAddress); - - constructor(address _axiomAddress, address _verifierAddress, address _hashiAddress) { - axiomAddress = _axiomAddress; - verifierAddress = _verifierAddress; - hashiAddress = _hashiAddress; - } - - function updateAxiomAddress(address _axiomAddress) external onlyOwner { - axiomAddress = _axiomAddress; - emit UpdateAxiomAddress(_axiomAddress); - } - - function updateSnarkVerifierAddress(address _verifierAddress) external onlyOwner { - verifierAddress = _verifierAddress; - emit UpdateSnarkVerifierAddress(_verifierAddress); - } - - function isSlotAttestationValid( - uint32 blockNumber, - address addr, - uint256 slot, - uint256 slotValue - ) external view returns (bool) { - return slotAttestations[keccak256(abi.encodePacked(blockNumber, addr, slot, slotValue))]; - } - - // Verify a storage proof for 10 storage slots in a single account at a single block - function attestSlots(IAxiomV0.BlockHashWitness calldata blockData, bytes calldata proof) external { - if (block.number - blockData.blockNumber <= 256) { - require( - IAxiomV0(axiomAddress).isRecentBlockHashValid(blockData.blockNumber, blockData.claimedBlockHash), - "Block hash was not validated in cache" - ); - } else { - require(IAxiomV0(axiomAddress).isBlockHashValid(blockData), "Block hash was not validated in cache"); - } - - // Extract instances from proof - uint256 _blockHash = (uint256(bytes32(proof[384:384 + 32])) << 128) | - uint128(bytes16(proof[384 + 48:384 + 64])); - uint256 _blockNumber = uint256(bytes32(proof[384 + 64:384 + 96])); - address account = address(bytes20(proof[384 + 108:384 + 128])); - - // Check block hash and block number - require(_blockHash == uint256(blockData.claimedBlockHash), "Invalid block hash in instance"); - require(_blockNumber == blockData.blockNumber, "Invalid block number in instance"); - - (bool success, ) = verifierAddress.call(proof); - if (!success) { - revert("Proof verification failed"); - } - - for (uint16 i = 0; i < SLOT_NUMBER; i++) { - uint256 slot = (uint256(bytes32(proof[384 + 128 + 128 * i:384 + 160 + 128 * i])) << 128) | - uint128(bytes16(proof[384 + 176 + 128 * i:384 + 192 + 128 * i])); - uint256 slotValue = (uint256(bytes32(proof[384 + 192 + 128 * i:384 + 224 + 128 * i])) << 128) | - uint128(bytes16(proof[384 + 240 + 128 * i:384 + 256 + 128 * i])); - slotAttestations[keccak256(abi.encodePacked(blockData.blockNumber, account, slot, slotValue))] = true; - emit SlotAttestationEvent(blockData.blockNumber, account, slot, slotValue); - } - } - - // Verify a storage proof for 10 storage slots in a single account at a single block - function attestSlotsWithHashi( - bytes calldata proof, - uint256 domain, - uint32 blockNumber, - bytes32 blockHash, - IOracleAdapter[] memory oracleAdapters - ) external { - bytes32 hashFromHashi = IHashi(hashiAddress).getHash(domain, blockNumber, oracleAdapters); - require(hashFromHashi == blockHash, "block hash mismatch with hash block hash"); - - // Extract instances from proof - uint256 _blockHash = (uint256(bytes32(proof[384:384 + 32])) << 128) | - uint128(bytes16(proof[384 + 48:384 + 64])); - uint256 _blockNumber = uint256(bytes32(proof[384 + 64:384 + 96])); - address account = address(bytes20(proof[384 + 108:384 + 128])); - - // Check block hash and block number - require(_blockHash == uint256(blockHash), "Invalid block hash in instance"); - require(_blockNumber == blockNumber, "Invalid block number in instance"); - - (bool success, ) = verifierAddress.call(proof); - if (!success) { - revert("Proof verification failed"); - } - - for (uint16 i = 0; i < SLOT_NUMBER; i++) { - uint256 slot = (uint256(bytes32(proof[384 + 128 + 128 * i:384 + 160 + 128 * i])) << 128) | - uint128(bytes16(proof[384 + 176 + 128 * i:384 + 192 + 128 * i])); - uint256 slotValue = (uint256(bytes32(proof[384 + 192 + 128 * i:384 + 224 + 128 * i])) << 128) | - uint128(bytes16(proof[384 + 240 + 128 * i:384 + 256 + 128 * i])); - bytes32 hashedVal = keccak256(abi.encodePacked(blockNumber, account, slot, slotValue)); - slotAttestations[hashedVal] = true; - emit SlotAttestationEvent(blockNumber, account, slot, slotValue); - } - } - - // Verify a storage proof for 10 storage slots in a single account at a single block - function attestCryptoPunk420AddressWithHashi( - bytes calldata proof, - uint256 domain, - uint32 blockNumber, - bytes32 blockHash, - IOracleAdapter[] memory oracleAdapters - ) external returns (address) { - bytes32 hashFromHashi = IHashi(hashiAddress).getHash(domain, blockNumber, oracleAdapters); - require(hashFromHashi == blockHash, "block hash mismatch with hash block hash"); - - // Extract instances from proof - uint256 _blockHash = (uint256(bytes32(proof[384:384 + 32])) << 128) | - uint128(bytes16(proof[384 + 48:384 + 64])); - uint256 _blockNumber = uint256(bytes32(proof[384 + 64:384 + 96])); - address account = address(bytes20(proof[384 + 108:384 + 128])); - - // Check block hash and block number - require(_blockHash == uint256(blockHash), "Invalid block hash in instance"); - require(_blockNumber == blockNumber, "Invalid block number in instance"); - - (bool success, ) = verifierAddress.call(proof); - if (!success) { - revert("Proof verification failed"); - } - - uint256 slot = (uint256(bytes32(proof[384 + 128:384 + 160])) << 128) | - uint128(bytes16(proof[384 + 176:384 + 192])); - uint256 slotValue = (uint256(bytes32(proof[384 + 192:384 + 224])) << 128) | - uint128(bytes16(proof[384 + 240:384 + 256])); - bytes32 hashedVal = keccak256(abi.encodePacked(blockNumber, account, slot, slotValue)); - slotAttestations[hashedVal] = true; - cryptoPunk420OwnerAtBlock10Mil = address(uint160(slotValue)); - // CryptoPunk#420 address at the slot for the given block - return cryptoPunk420OwnerAtBlock10Mil; - } - - // Return the stored CryptoPunk#420 owner at block 10,000,000 on Ethereum - function getCryptoPunk420OwnerAtBlock10Mil() external view returns (address) { - return cryptoPunk420OwnerAtBlock10Mil; - } -} diff --git a/packages/evm/contracts/adapters/axiom/IAxiomV0.sol b/packages/evm/contracts/adapters/axiom/IAxiomV0.sol deleted file mode 100644 index d41d7a62..00000000 --- a/packages/evm/contracts/adapters/axiom/IAxiomV0.sol +++ /dev/null @@ -1,44 +0,0 @@ -// SPDX-License-Identifier: MIT -// WARNING! This smart contract and the associated zk-SNARK verifiers have not been audited. -// DO NOT USE THIS CONTRACT FOR PRODUCTION -pragma solidity ^0.8.12; - -interface IAxiomV0 { - // historicalRoots(startBlockNumber) is 0 unless (startBlockNumber % 1024 == 0) - // historicalRoots(startBlockNumber) holds the hash of - // prevHash || root || numFinal - // where - // - prevHash is the parent hash of block startBlockNumber - // - root is the partial Merkle root of blockhashes of block numbers - // [startBlockNumber, startBlockNumber + 1024) - // where unconfirmed block hashes are 0's - // - numFinal is the number of confirmed consecutive roots in [startBlockNumber, startBlockNumber + 1024) - function historicalRoots(uint32 startBlockNumber) external view returns (bytes32); - - event UpdateEvent(uint32 startBlockNumber, bytes32 prevHash, bytes32 root, uint32 numFinal); - - struct BlockHashWitness { - uint32 blockNumber; - bytes32 claimedBlockHash; - bytes32 prevHash; - uint32 numFinal; - bytes32[10] merkleProof; - } - - // returns Merkle root of a tree of depth `depth` with 0's as leaves - function getEmptyHash(uint256 depth) external pure returns (bytes32); - - // update blocks in the "backward" direction, anchoring on a "recent" end blockhash that is within last 256 blocks - // * startBlockNumber must be a multiple of 1024 - // * roots[idx] is the root of a Merkle tree of height 2**(10 - idx) in a Merkle mountain - // range which stores block hashes in the interval [startBlockNumber, endBlockNumber] - function updateRecent(bytes calldata proofData) external; - - // update older blocks in "backwards" direction, anchoring on more recent trusted blockhash - // must be batch of 1024 blocks - function updateOld(bytes32 nextRoot, uint32 nextNumFinal, bytes calldata proofData) external; - - function isRecentBlockHashValid(uint32 blockNumber, bytes32 claimedBlockHash) external view returns (bool); - - function isBlockHashValid(BlockHashWitness calldata witness) external view returns (bool); -} diff --git a/packages/evm/contracts/adapters/axiom/IAxiomV0StoragePf.sol b/packages/evm/contracts/adapters/axiom/IAxiomV0StoragePf.sol deleted file mode 100644 index 231fa355..00000000 --- a/packages/evm/contracts/adapters/axiom/IAxiomV0StoragePf.sol +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-License-Identifier: MIT -// WARNING! This smart contract and the associated zk-SNARK verifiers have not been audited. -// DO NOT USE THIS CONTRACT FOR PRODUCTION -pragma solidity ^0.8.12; - -import "./IAxiomV0.sol"; - -interface IAxiomV0StoragePf { - // slotAttestations[keccak256(blockNumber || addr || slot || slotValue)] = true - // if and only if it has been checked that: - // at block number `blockNumber`, the account storage of `addr` has value `slotValue` at slot `slot` - function slotAttestations(bytes32 hash) external view returns (bool); - - event SlotAttestationEvent(uint32 blockNumber, address addr, uint256 slot, uint256 slotValue); - - function isSlotAttestationValid( - uint32 blockNumber, - address addr, - uint256 slot, - uint256 slotValue - ) external view returns (bool); - - // Verify a storage proof for 10 storage slots in a single account at a single block - function attestSlots(IAxiomV0.BlockHashWitness calldata blockData, bytes calldata proof) external; -} diff --git a/packages/evm/contracts/adapters/axiom/Ownable.sol b/packages/evm/contracts/adapters/axiom/Ownable.sol deleted file mode 100644 index 2e1d70be..00000000 --- a/packages/evm/contracts/adapters/axiom/Ownable.sol +++ /dev/null @@ -1,83 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) - -pragma solidity ^0.8.4; - -import { Context } from "./utils/Context.sol"; - -/** - * @dev Contract module which provides a basic access control mechanism, where - * there is an account (an owner) that can be granted exclusive access to - * specific functions. - * - * By default, the owner account will be the one that deploys the contract. This - * can later be changed with {transferOwnership}. - * - * This module is used through inheritance. It will make available the modifier - * `onlyOwner`, which can be applied to your functions to restrict their use to - * the owner. - */ -abstract contract Ownable is Context { - address private _owner; - - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); - - /** - * @dev Initializes the contract setting the deployer as the initial owner. - */ - constructor() { - _transferOwnership(_msgSender()); - } - - /** - * @dev Throws if called by any account other than the owner. - */ - modifier onlyOwner() { - _checkOwner(); - _; - } - - /** - * @dev Returns the address of the current owner. - */ - function owner() public view virtual returns (address) { - return _owner; - } - - /** - * @dev Throws if the sender is not the owner. - */ - function _checkOwner() internal view virtual { - require(owner() == _msgSender(), "Ownable: caller is not the owner"); - } - - /** - * @dev Leaves the contract without owner. It will not be possible to call - * `onlyOwner` functions anymore. Can only be called by the current owner. - * - * NOTE: Renouncing ownership will leave the contract without an owner, - * thereby removing any functionality that is only available to the owner. - */ - function renounceOwnership() public virtual onlyOwner { - _transferOwnership(address(0)); - } - - /** - * @dev Transfers ownership of the contract to a new account (`newOwner`). - * Can only be called by the current owner. - */ - function transferOwnership(address newOwner) public virtual onlyOwner { - require(newOwner != address(0), "Ownable: new owner is the zero address"); - _transferOwnership(newOwner); - } - - /** - * @dev Transfers ownership of the contract to a new account (`newOwner`). - * Internal function without access restriction. - */ - function _transferOwnership(address newOwner) internal virtual { - address oldOwner = _owner; - _owner = newOwner; - emit OwnershipTransferred(oldOwner, newOwner); - } -} diff --git a/packages/evm/contracts/adapters/axiom/utils/Context.sol b/packages/evm/contracts/adapters/axiom/utils/Context.sol deleted file mode 100644 index 84fc8427..00000000 --- a/packages/evm/contracts/adapters/axiom/utils/Context.sol +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Context.sol) - -pragma solidity ^0.8.4; - -/** - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address) { - return msg.sender; - } - - function _msgData() internal view virtual returns (bytes calldata) { - return msg.data; - } -} From 74a903a15d7dd820f807fa515ae457aa040f051e Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 24 Jan 2024 18:04:13 +0100 Subject: [PATCH 081/297] refactor(evm): adds _storeHashes within AMBAdapter --- packages/evm/contracts/adapters/AMB/AMBAdapter.sol | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/evm/contracts/adapters/AMB/AMBAdapter.sol b/packages/evm/contracts/adapters/AMB/AMBAdapter.sol index 3a5b8e92..aa532aa7 100644 --- a/packages/evm/contracts/adapters/AMB/AMBAdapter.sol +++ b/packages/evm/contracts/adapters/AMB/AMBAdapter.sol @@ -16,8 +16,8 @@ contract AMBAdapter is BlockHashOracleAdapter { error UnauthorizedChainId(bytes32 sourceChainId, bytes32 expectedSourceChainId); error UnauthorizedHashReporter(address reporter, address expectedReporter); - constructor(IAMB amb, address reporter, bytes32 sourceChainId) { - AMB = amb; + constructor(address amb, address reporter, bytes32 sourceChainId) { + AMB = IAMB(amb); REPORTER = reporter; SOURCE_CHAIN_ID = sourceChainId; } @@ -33,8 +33,6 @@ contract AMBAdapter is BlockHashOracleAdapter { function storeHashes(uint256[] memory ids, bytes32[] memory _hashes) public onlyValid { if (ids.length != _hashes.length) revert ArrayLengthMissmatch(); - for (uint256 i = 0; i < ids.length; i++) { - _storeHash(uint256(SOURCE_CHAIN_ID), ids[i], _hashes[i]); - } + _storeHashes(uint256(SOURCE_CHAIN_ID), ids, _hashes); } } From 609e597c7836490fdb108dbdc1c324c65ede121a Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 24 Jan 2024 18:04:51 +0100 Subject: [PATCH 082/297] refactor(evm): refactors Optimism Adapter and adds the Reporter --- .../L1CrossDomainMessengerHeaderReporter.sol | 33 -------------- .../L1CrossDomainMessengerMessageRelay.sol | 36 --------------- .../L1CrossDomainMessengerReporter.sol | 40 +++++++++++++++++ .../L2CrossDomainMessengerAdapter.sol | 44 ++++++++----------- .../ICrossDomainMessenger.sol | 0 5 files changed, 59 insertions(+), 94 deletions(-) delete mode 100644 packages/evm/contracts/adapters/Optimism/L1CrossDomainMessengerHeaderReporter.sol delete mode 100644 packages/evm/contracts/adapters/Optimism/L1CrossDomainMessengerMessageRelay.sol create mode 100644 packages/evm/contracts/adapters/Optimism/L1CrossDomainMessengerReporter.sol rename packages/evm/contracts/adapters/Optimism/{ => interfaces}/ICrossDomainMessenger.sol (100%) diff --git a/packages/evm/contracts/adapters/Optimism/L1CrossDomainMessengerHeaderReporter.sol b/packages/evm/contracts/adapters/Optimism/L1CrossDomainMessengerHeaderReporter.sol deleted file mode 100644 index 448308e3..00000000 --- a/packages/evm/contracts/adapters/Optimism/L1CrossDomainMessengerHeaderReporter.sol +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { ICrossDomainMessenger } from "./ICrossDomainMessenger.sol"; -import { IHeaderStorage } from "../../interfaces/IHeaderStorage.sol"; - -contract L1CrossDomainMessengerHeaderReporter { - // The first 1.92 million gas on L2 is free. See here: - // https://community.optimism.io/docs/developers/bridge/messaging/#for-l1-%E2%87%92-l2-transactions - uint32 internal constant GAS_LIMIT = 1_920_000; - - ICrossDomainMessenger public immutable l1CrossDomainMessenger; - IHeaderStorage public immutable headerStorage; - - event HeaderReported(address indexed emitter, uint256 indexed blockNumber, bytes32 indexed blockHeader); - - constructor(ICrossDomainMessenger l1CrossDomainMessenger_, IHeaderStorage headerStorage_) { - l1CrossDomainMessenger = l1CrossDomainMessenger_; - headerStorage = headerStorage_; - } - - /// @dev Reports the given block headers to the oracleAdapter via the L1CrossDomainMessenger. - /// @param blockNumbers Uint256 array of block number to pass over the L1CrossDomainMessenger. - /// @param adapter address of L2CrossDomainMessengerAdapter on the destination chain. - function reportHeaders(uint256[] memory blockNumbers, address adapter) external payable { - bytes32[] memory blockHeaders = headerStorage.storeBlockHeaders(blockNumbers); - bytes memory message = abi.encodeWithSignature("storeHashes(uint256[],bytes32[])", blockNumbers, blockHeaders); - l1CrossDomainMessenger.sendMessage(adapter, message, GAS_LIMIT); - for (uint256 i = 0; i < blockNumbers.length; i++) { - emit HeaderReported(address(this), blockNumbers[i], blockHeaders[i]); - } - } -} diff --git a/packages/evm/contracts/adapters/Optimism/L1CrossDomainMessengerMessageRelay.sol b/packages/evm/contracts/adapters/Optimism/L1CrossDomainMessengerMessageRelay.sol deleted file mode 100644 index 6bc367af..00000000 --- a/packages/evm/contracts/adapters/Optimism/L1CrossDomainMessengerMessageRelay.sol +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { ICrossDomainMessenger } from "./ICrossDomainMessenger.sol"; -import { IYaho } from "../../interfaces/IYaho.sol"; - -contract L1CrossDomainMessengerMessageRelay { - // The first 1.92 million gas on L2 is free. See here: - // https://community.optimism.io/docs/developers/bridge/messaging/#for-l1-%E2%87%92-l2-transactions - uint32 internal constant GAS_LIMIT = 1_920_000; - - ICrossDomainMessenger public immutable l1CrossDomainMessenger; - IYaho public immutable yaho; - - event MessageRelayed(address indexed emitter, uint256 indexed messageId); - - constructor(ICrossDomainMessenger l1CrossDomainMessenger_, IYaho yaho_) { - l1CrossDomainMessenger = l1CrossDomainMessenger_; - yaho = yaho_; - } - - /// @dev Reports the given messages to the adapter via the L1CrossDomainMessenger. - /// @param messageIds Uint256 array message ids to pass over the L1CrossDomainMessenger. - /// @param adapter address of L2CrossDomainMessengerAdapter on the destination chain. - function relayMessages(uint256[] memory messageIds, address adapter) external payable returns (bytes32 receipt) { - bytes32[] memory hashes = new bytes32[](messageIds.length); - for (uint256 i = 0; i < messageIds.length; i++) { - uint256 id = messageIds[i]; - hashes[i] = yaho.hashes(id); - emit MessageRelayed(address(this), messageIds[i]); - } - bytes memory message = abi.encodeWithSignature("storeHashes(uint256[],bytes32[])", messageIds, hashes); - l1CrossDomainMessenger.sendMessage{ value: msg.value }(adapter, message, GAS_LIMIT); - return keccak256(abi.encode(true)); - } -} diff --git a/packages/evm/contracts/adapters/Optimism/L1CrossDomainMessengerReporter.sol b/packages/evm/contracts/adapters/Optimism/L1CrossDomainMessengerReporter.sol new file mode 100644 index 00000000..825a9586 --- /dev/null +++ b/packages/evm/contracts/adapters/Optimism/L1CrossDomainMessengerReporter.sol @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity ^0.8.17; + +import { Reporter } from "../Reporter.sol"; +import { IOracleAdapter } from "../../interfaces/IOracleAdapter.sol"; +import { ICrossDomainMessenger } from "./interfaces/ICrossDomainMessenger.sol"; + +contract L1CrossDomainMessengerReporter is Reporter { + string public constant PROVIDER = "l1-cross-domain-messenger-reporter"; + // The first 1.92 million gas on L2 is free. See here: + // https://community.optimism.io/docs/developers/bridge/messaging/#for-l1-%E2%87%92-l2-transactions + uint32 internal constant GAS_LIMIT = 1_920_000; + + ICrossDomainMessenger public immutable L1_CROSS_DOMAIN_MESSENGER; + uint256 public immutable TO_CHAIN_ID; + + error InvalidToChainId(uint256 chainId, uint256 expectedChainId); + + constructor( + address headerStorage, + address yaho, + address l1CrossDomainMessenger, + uint256 toChainId + ) Reporter(headerStorage, yaho) { + L1_CROSS_DOMAIN_MESSENGER = ICrossDomainMessenger(l1CrossDomainMessenger); + TO_CHAIN_ID = toChainId; + } + + function _dispatch( + uint256 toChainId, + address adapter, + uint256[] memory ids, + bytes32[] memory hashes + ) internal override returns (bytes32) { + if (toChainId != TO_CHAIN_ID) revert InvalidToChainId(toChainId, TO_CHAIN_ID); + bytes memory message = abi.encodeWithSignature("storeHashes(uint256[],bytes32[])", ids, hashes); + L1_CROSS_DOMAIN_MESSENGER.sendMessage(adapter, message, GAS_LIMIT); + return bytes32(0); + } +} diff --git a/packages/evm/contracts/adapters/Optimism/L2CrossDomainMessengerAdapter.sol b/packages/evm/contracts/adapters/Optimism/L2CrossDomainMessengerAdapter.sol index 3dc33575..1008068c 100644 --- a/packages/evm/contracts/adapters/Optimism/L2CrossDomainMessengerAdapter.sol +++ b/packages/evm/contracts/adapters/Optimism/L2CrossDomainMessengerAdapter.sol @@ -1,43 +1,37 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; -import { ICrossDomainMessenger } from "./ICrossDomainMessenger.sol"; +import { ICrossDomainMessenger } from "./interfaces/ICrossDomainMessenger.sol"; import { OracleAdapter } from "../OracleAdapter.sol"; import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; contract L2CrossDomainMessengerAdapter is OracleAdapter, BlockHashOracleAdapter { - ICrossDomainMessenger public immutable l2CrossDomainMessenger; - address public immutable reporter; - uint256 public immutable chainId; + string public constant PROVIDER = "amb"; - error ArrayLengthMissmatch(address emitter); - error UnauthorizedHashReporter(address emitter, address reporter); - error UnauthorizedL2CrossDomainMessenger(address emitter, address sender); + ICrossDomainMessenger public immutable L2_CROSS_DOMAIN_MESSENGER; + address public immutable REPORTER; + uint256 public immutable SOURCE_CHAIN_ID; - constructor(ICrossDomainMessenger l2CrossDomainMessenger_, address reporter_, uint256 chainId_) { - l2CrossDomainMessenger = l2CrossDomainMessenger_; - reporter = reporter_; - chainId = chainId_; + error ArrayLengthMissmatch(); + error UnauthorizedHashReporter(address sender, address expectedSender); + error UnauthorizedL2CrossDomainMessenger(address domainMessageSender, address expectedDomainMessageSender); + + constructor(ICrossDomainMessenger l2CrossDomainMessenger_, address reporter, uint256 sourceChainId) { + L2_CROSS_DOMAIN_MESSENGER = ICrossDomainMessenger(l2CrossDomainMessenger_); + REPORTER = reporter; + SOURCE_CHAIN_ID = sourceChainId; } - /// @dev Check that the l2CrossDomainMessenger and xDomainMessageSender are valid. modifier onlyValid() { - if (msg.sender != address(l2CrossDomainMessenger)) - revert UnauthorizedL2CrossDomainMessenger(address(this), msg.sender); - if (l2CrossDomainMessenger.xDomainMessageSender() != reporter) - revert UnauthorizedHashReporter(address(this), reporter); + if (msg.sender != address(L2_CROSS_DOMAIN_MESSENGER)) + revert UnauthorizedL2CrossDomainMessenger(msg.sender, address(L2_CROSS_DOMAIN_MESSENGER)); + address xDomainMessageSender = L2_CROSS_DOMAIN_MESSENGER.xDomainMessageSender(); + if (xDomainMessageSender != REPORTER) revert UnauthorizedHashReporter(xDomainMessageSender, REPORTER); _; } - /// @dev Stores the hashes for a given array of ids. - /// @param ids Array of ids number for which to set the hashes. - /// @param hashes Array of hashes to set for the given ids. - /// @notice Only callable by `l2CrossDomainMessenger` with a message passed from `reporter`. - /// @notice Will revert if given array lengths do not match. function storeHashes(uint256[] memory ids, bytes32[] memory hashes) external onlyValid { - if (ids.length != hashes.length) revert ArrayLengthMissmatch(address(this)); - for (uint256 i = 0; i < ids.length; i++) { - _storeHash(chainId, ids[i], hashes[i]); - } + if (ids.length != hashes.length) revert ArrayLengthMissmatch(); + _storeHashes(SOURCE_CHAIN_ID, ids, hashes); } } diff --git a/packages/evm/contracts/adapters/Optimism/ICrossDomainMessenger.sol b/packages/evm/contracts/adapters/Optimism/interfaces/ICrossDomainMessenger.sol similarity index 100% rename from packages/evm/contracts/adapters/Optimism/ICrossDomainMessenger.sol rename to packages/evm/contracts/adapters/Optimism/interfaces/ICrossDomainMessenger.sol From e9bd59e3e83a6a95808662641c293e2ea89fd308 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 24 Jan 2024 18:36:16 +0100 Subject: [PATCH 083/297] refactor(evm): makes hashes private within OracleAdapter --- .../contracts/adapters/BlockHashOracleAdapter.sol | 2 +- packages/evm/contracts/adapters/OracleAdapter.sol | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/evm/contracts/adapters/BlockHashOracleAdapter.sol b/packages/evm/contracts/adapters/BlockHashOracleAdapter.sol index d9bd7c3f..ae3fe0b0 100644 --- a/packages/evm/contracts/adapters/BlockHashOracleAdapter.sol +++ b/packages/evm/contracts/adapters/BlockHashOracleAdapter.sol @@ -25,7 +25,7 @@ abstract contract BlockHashOracleAdapter is IBlockHashOracleAdapter, OracleAdapt uint256 blockNumber = uint256(blockHeaderContent[8].toUint()); bytes32 reportedBlockHash = keccak256(blockHeaders[i]); - bytes32 storedBlockHash = hashes[chainId][blockNumber]; + bytes32 storedBlockHash = getHashFromOracle(chainId, blockNumber); if (reportedBlockHash != storedBlockHash) revert ConflictingBlockHeader(blockNumber, reportedBlockHash, storedBlockHash); diff --git a/packages/evm/contracts/adapters/OracleAdapter.sol b/packages/evm/contracts/adapters/OracleAdapter.sol index 8cc60d4b..4324323f 100644 --- a/packages/evm/contracts/adapters/OracleAdapter.sol +++ b/packages/evm/contracts/adapters/OracleAdapter.sol @@ -4,16 +4,16 @@ pragma solidity ^0.8.17; import { IOracleAdapter } from "../interfaces/IOracleAdapter.sol"; abstract contract OracleAdapter is IOracleAdapter { - mapping(uint256 => mapping(uint256 => bytes32)) public hashes; + mapping(uint256 => mapping(uint256 => bytes32)) private _hashes; /// @inheritdoc IOracleAdapter - function getHashFromOracle(uint256 domain, uint256 id) external view returns (bytes32 hash) { - hash = hashes[domain][id]; + function getHashFromOracle(uint256 domain, uint256 id) public view returns (bytes32) { + return _hashes[domain][id]; } - function _storeHashes(uint256 domain, uint256[] memory ids, bytes32[] memory hashes_) internal { + function _storeHashes(uint256 domain, uint256[] memory ids, bytes32[] memory hashes) internal { for (uint256 i = 0; i < ids.length; ) { - _storeHash(domain, ids[i], hashes_[i]); + _storeHash(domain, ids[i], hashes[i]); unchecked { ++i; } @@ -21,9 +21,9 @@ abstract contract OracleAdapter is IOracleAdapter { } function _storeHash(uint256 domain, uint256 id, bytes32 hash) internal { - bytes32 currentHash = hashes[domain][id]; + bytes32 currentHash = _hashes[domain][id]; if (currentHash != hash) { - hashes[domain][id] = hash; + _hashes[domain][id] = hash; emit HashStored(id, hash); } } From 3d081a85d48e33eb4e084c0d7abeeac98201bd3a Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 24 Jan 2024 18:37:24 +0100 Subject: [PATCH 084/297] refactor(evm): rm OracleAdapter from L2CrossDomainMessengerAdapter --- .../adapters/Optimism/L2CrossDomainMessengerAdapter.sol | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/evm/contracts/adapters/Optimism/L2CrossDomainMessengerAdapter.sol b/packages/evm/contracts/adapters/Optimism/L2CrossDomainMessengerAdapter.sol index 1008068c..0b60f305 100644 --- a/packages/evm/contracts/adapters/Optimism/L2CrossDomainMessengerAdapter.sol +++ b/packages/evm/contracts/adapters/Optimism/L2CrossDomainMessengerAdapter.sol @@ -2,10 +2,9 @@ pragma solidity ^0.8.17; import { ICrossDomainMessenger } from "./interfaces/ICrossDomainMessenger.sol"; -import { OracleAdapter } from "../OracleAdapter.sol"; import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; -contract L2CrossDomainMessengerAdapter is OracleAdapter, BlockHashOracleAdapter { +contract L2CrossDomainMessengerAdapter is BlockHashOracleAdapter { string public constant PROVIDER = "amb"; ICrossDomainMessenger public immutable L2_CROSS_DOMAIN_MESSENGER; From cfdd19b7b1cb6abf4002a38d1db6e26cdf1464e9 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 24 Jan 2024 18:45:05 +0100 Subject: [PATCH 085/297] refactor(evm): normalizes optismism Reporter and Adapter PROVIDER --- .../adapters/Optimism/L1CrossDomainMessengerReporter.sol | 2 +- .../adapters/Optimism/L2CrossDomainMessengerAdapter.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/evm/contracts/adapters/Optimism/L1CrossDomainMessengerReporter.sol b/packages/evm/contracts/adapters/Optimism/L1CrossDomainMessengerReporter.sol index 825a9586..c9be745b 100644 --- a/packages/evm/contracts/adapters/Optimism/L1CrossDomainMessengerReporter.sol +++ b/packages/evm/contracts/adapters/Optimism/L1CrossDomainMessengerReporter.sol @@ -6,7 +6,7 @@ import { IOracleAdapter } from "../../interfaces/IOracleAdapter.sol"; import { ICrossDomainMessenger } from "./interfaces/ICrossDomainMessenger.sol"; contract L1CrossDomainMessengerReporter is Reporter { - string public constant PROVIDER = "l1-cross-domain-messenger-reporter"; + string public constant PROVIDER = "optimism"; // The first 1.92 million gas on L2 is free. See here: // https://community.optimism.io/docs/developers/bridge/messaging/#for-l1-%E2%87%92-l2-transactions uint32 internal constant GAS_LIMIT = 1_920_000; diff --git a/packages/evm/contracts/adapters/Optimism/L2CrossDomainMessengerAdapter.sol b/packages/evm/contracts/adapters/Optimism/L2CrossDomainMessengerAdapter.sol index 0b60f305..425bdb82 100644 --- a/packages/evm/contracts/adapters/Optimism/L2CrossDomainMessengerAdapter.sol +++ b/packages/evm/contracts/adapters/Optimism/L2CrossDomainMessengerAdapter.sol @@ -5,7 +5,7 @@ import { ICrossDomainMessenger } from "./interfaces/ICrossDomainMessenger.sol"; import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; contract L2CrossDomainMessengerAdapter is BlockHashOracleAdapter { - string public constant PROVIDER = "amb"; + string public constant PROVIDER = "optimism"; ICrossDomainMessenger public immutable L2_CROSS_DOMAIN_MESSENGER; address public immutable REPORTER; From 5b113c0a0ea78393ec32d4cf8dac80960a103521 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 24 Jan 2024 19:12:27 +0100 Subject: [PATCH 086/297] refactor(evm): refactors Wormhole Adapter and adds the Reporter --- .../adapters/Wormhole/WormholeAdapter.sol | 53 +++++++++---------- .../Wormhole/WormholeHeaderReporter.sol | 29 ---------- .../Wormhole/WormholeMessageRelay.sol | 30 ----------- .../adapters/Wormhole/WormholeReporter.sol | 29 ++++++++++ .../Wormhole/{ => interfaces}/IWormhole.sol | 0 5 files changed, 55 insertions(+), 86 deletions(-) delete mode 100644 packages/evm/contracts/adapters/Wormhole/WormholeHeaderReporter.sol delete mode 100644 packages/evm/contracts/adapters/Wormhole/WormholeMessageRelay.sol create mode 100644 packages/evm/contracts/adapters/Wormhole/WormholeReporter.sol rename packages/evm/contracts/adapters/Wormhole/{ => interfaces}/IWormhole.sol (100%) diff --git a/packages/evm/contracts/adapters/Wormhole/WormholeAdapter.sol b/packages/evm/contracts/adapters/Wormhole/WormholeAdapter.sol index c2b8be41..0cd29fba 100644 --- a/packages/evm/contracts/adapters/Wormhole/WormholeAdapter.sol +++ b/packages/evm/contracts/adapters/Wormhole/WormholeAdapter.sol @@ -1,37 +1,36 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; -import { IWormhole, VM } from "./IWormhole.sol"; -import { OracleAdapter } from "../OracleAdapter.sol"; +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; +import { IWormhole, VM } from "./interfaces/IWormhole.sol"; -contract WormholeAdapter is OracleAdapter, BlockHashOracleAdapter { - IWormhole public immutable wormhole; - bytes32 public immutable reporter; - uint16 public immutable wormholeSourceChainId; - uint256 public immutable sourceChainId; - - error InvalidMessage(address emitter, VM vm, string reason); - error InvalidEmitterChainId(address emitter, uint16 chainId); - error InvalidReporter(address emitter, bytes32 reporter); - - constructor(IWormhole wormhole_, address reporter_, uint256 sourceChainId_, uint16 wormholeSourceChainId_) { - wormhole = wormhole_; - reporter = bytes32(uint256(uint160(reporter_))); - sourceChainId = sourceChainId_; - wormholeSourceChainId = wormholeSourceChainId_; +contract WormholeAdapter is BlockHashOracleAdapter, Ownable { + IWormhole public immutable WORMHOLE; + + mapping(uint32 => bytes32) public enabledReporters; + mapping(uint32 => uint256) public chainIds; + + error InvalidMessage(VM vm, string reason); + error UnauthorizedWormholeReceive(); + + event ReporterSet(uint256 indexed chainId, uint16 indexed endpointId, address indexed reporter); + + constructor(address wormhole) { + WORMHOLE = IWormhole(wormhole); + } + + function setReporterByChain(uint256 chainId, uint16 wormholeChainId, address reporter) external onlyOwner { + enabledReporters[wormholeChainId] = bytes32(uint256(uint160(reporter))); + chainIds[wormholeChainId] = wormholeChainId; + emit ReporterSet(chainId, wormholeChainId, reporter); } - /// @dev Stores the block header for a given block. - /// @param encodedVM Encoded data reflecting the content of the Wormhole Verified Action Approval. function storeHashesByEncodedVM(bytes calldata encodedVM) external { - (VM memory vm, bool valid, string memory reason) = wormhole.parseAndVerifyVM(encodedVM); - if (!valid) revert InvalidMessage(address(this), vm, reason); - if (vm.emitterChainId != wormholeSourceChainId) revert InvalidEmitterChainId(address(this), vm.emitterChainId); - if (vm.emitterAddress != reporter) revert InvalidReporter(address(this), vm.emitterAddress); - (uint256[] memory ids, bytes32[] memory _hashes) = abi.decode(vm.payload, (uint256[], bytes32[])); - for (uint256 i = 0; i < ids.length; i++) { - _storeHash(sourceChainId, ids[i], _hashes[i]); - } + (VM memory vm, bool valid, string memory reason) = WORMHOLE.parseAndVerifyVM(encodedVM); + if (!valid) revert InvalidMessage(vm, reason); + if (enabledReporters[vm.emitterChainId] != vm.emitterAddress) revert UnauthorizedWormholeReceive(); + (uint256[] memory ids, bytes32[] memory hashes) = abi.decode(vm.payload, (uint256[], bytes32[])); + _storeHashes(chainIds[vm.emitterChainId], ids, hashes); } } diff --git a/packages/evm/contracts/adapters/Wormhole/WormholeHeaderReporter.sol b/packages/evm/contracts/adapters/Wormhole/WormholeHeaderReporter.sol deleted file mode 100644 index ecd05042..00000000 --- a/packages/evm/contracts/adapters/Wormhole/WormholeHeaderReporter.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { IHeaderStorage } from "../../interfaces/IHeaderStorage.sol"; -import { IWormhole } from "./IWormhole.sol"; - -contract WormholeHeaderReporter { - IWormhole public immutable wormhole; - IHeaderStorage public immutable headerStorage; - - constructor(IWormhole wormhole_, IHeaderStorage headerStorage_) { - wormhole = wormhole_; - headerStorage = headerStorage_; - } - - /// @dev Reports the given block header to the adapter via the Wormhole. - /// @param blockNumbers Uint256 array of block numbers to pass over the Wormhole. - /// @param sequence Uint64 value used to retrive generated VAA from the wormhole network. - function reportHeaders(uint256[] calldata blockNumbers) external returns (uint64 sequence) { - bytes32[] memory blockHeaders = new bytes32[](blockNumbers.length); - for (uint256 i = 0; i < blockNumbers.length; i++) { - blockHeaders[i] = headerStorage.storeBlockHeader(blockNumbers[i]); - } - bytes memory payload = abi.encode(blockNumbers, blockHeaders); - uint32 nonce = 0; - uint8 consistencyLevel = 201; - sequence = wormhole.publishMessage(nonce, payload, consistencyLevel); - } -} diff --git a/packages/evm/contracts/adapters/Wormhole/WormholeMessageRelay.sol b/packages/evm/contracts/adapters/Wormhole/WormholeMessageRelay.sol deleted file mode 100644 index 1be67dbd..00000000 --- a/packages/evm/contracts/adapters/Wormhole/WormholeMessageRelay.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { IYaho } from "../../interfaces/IYaho.sol"; -import { IWormhole } from "./IWormhole.sol"; - -contract WormholeMessageRelay { - IWormhole public immutable wormhole; - IYaho public immutable yaho; - - event MessageRelayed(address indexed emitter, uint256 indexed messageId); - - constructor(IWormhole wormhole_, IYaho yaho_) { - wormhole = wormhole_; - yaho = yaho_; - } - - function relayMessages(uint256[] memory messageIds, address) external payable returns (bytes32) { - bytes32[] memory hashes = new bytes32[](messageIds.length); - for (uint256 i = 0; i < messageIds.length; i++) { - hashes[i] = yaho.hashes(messageIds[i]); - emit MessageRelayed(address(this), messageIds[i]); - } - bytes memory payload = abi.encode(messageIds, hashes); - uint32 nonce = 0; - uint8 consistencyLevel = 201; - uint64 sequence = wormhole.publishMessage(nonce, payload, consistencyLevel); - return bytes32(abi.encode(sequence)); - } -} diff --git a/packages/evm/contracts/adapters/Wormhole/WormholeReporter.sol b/packages/evm/contracts/adapters/Wormhole/WormholeReporter.sol new file mode 100644 index 00000000..27572af2 --- /dev/null +++ b/packages/evm/contracts/adapters/Wormhole/WormholeReporter.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity ^0.8.17; + +import { Reporter } from "../Reporter.sol"; +import { IOracleAdapter } from "../../interfaces/IOracleAdapter.sol"; +import { IWormhole } from "./interfaces/IWormhole.sol"; + +contract WormholeReporter is Reporter { + string public constant PROVIDER = "wormhole"; + + IWormhole public immutable WOMRHOLE; + + constructor(address headerStorage, address yaho, address wormhole) Reporter(headerStorage, yaho) { + WOMRHOLE = IWormhole(wormhole); + } + + function _dispatch( + uint256, + address, + uint256[] memory ids, + bytes32[] memory hashes + ) internal override returns (bytes32) { + bytes memory payload = abi.encode(ids, hashes); + uint32 nonce = 0; + uint8 consistencyLevel = 201; + uint64 sequence = WOMRHOLE.publishMessage(nonce, payload, consistencyLevel); + return bytes32(abi.encode(sequence)); + } +} diff --git a/packages/evm/contracts/adapters/Wormhole/IWormhole.sol b/packages/evm/contracts/adapters/Wormhole/interfaces/IWormhole.sol similarity index 100% rename from packages/evm/contracts/adapters/Wormhole/IWormhole.sol rename to packages/evm/contracts/adapters/Wormhole/interfaces/IWormhole.sol From 05102e89b03849b65686a162fb36faf031dd4aa7 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 24 Jan 2024 19:41:20 +0100 Subject: [PATCH 087/297] refactor(evm): refactors ZetaChain Adapter and adds the Reporter --- .../adapters/ZetaChain/ZetaAdapter.sol | 33 ++++++++++--------- .../adapters/ZetaChain/ZetaHeaderReporter.sol | 19 ----------- .../adapters/ZetaChain/ZetaMessageRelay.sol | 19 ----------- .../adapters/ZetaChain/ZetaReporter.sol | 26 +++++++++++---- 4 files changed, 37 insertions(+), 60 deletions(-) delete mode 100644 packages/evm/contracts/adapters/ZetaChain/ZetaHeaderReporter.sol delete mode 100644 packages/evm/contracts/adapters/ZetaChain/ZetaMessageRelay.sol diff --git a/packages/evm/contracts/adapters/ZetaChain/ZetaAdapter.sol b/packages/evm/contracts/adapters/ZetaChain/ZetaAdapter.sol index 7d21960e..3fb5ca7d 100644 --- a/packages/evm/contracts/adapters/ZetaChain/ZetaAdapter.sol +++ b/packages/evm/contracts/adapters/ZetaChain/ZetaAdapter.sol @@ -1,35 +1,36 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { ZetaReceiver, ZetaInterfaces } from "./interfaces/ZetaInterfaces.sol"; -import { HeaderOracleAdapter } from "../HeaderOracleAdapter.sol"; +import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; -contract ZetaAdapter is HeaderOracleAdapter, ZetaReceiver { +contract ZetaAdapter is BlockHashOracleAdapter, Ownable, ZetaReceiver { string public constant PROVIDER = "zeta"; address public immutable ZETA_CONNECTOR; - bytes public ZETA_REPORTER_ADDRESS; // Immutable - bytes32 public immutable ZETA_REPORTER_ADDRESS_HASH; + + mapping(uint256 => bytes32) public enabledReporters; error UnauthorizedZetaChainReceive(); - constructor( - uint256 reporterChain, - address reporterAddress, - address zetaConnector, - bytes memory zetaReporterAddress - ) HeaderOracleAdapter(reporterChain, reporterAddress) { + event ReporterSet(uint256 indexed chainId, address indexed reporter); + + constructor(address zetaConnector) { ZETA_CONNECTOR = zetaConnector; - ZETA_REPORTER_ADDRESS = zetaReporterAddress; - ZETA_REPORTER_ADDRESS_HASH = keccak256(zetaReporterAddress); } function onZetaMessage(ZetaInterfaces.ZetaMessage calldata zetaMessage) external { - // Auth adapted from "ZetaInteractor" contract's "isValidMessageCall" modifier + // NOTE: auth adapted from "ZetaInteractor" contract's "isValidMessageCall" modifier if ( msg.sender != ZETA_CONNECTOR || - zetaMessage.sourceChainId != REPORTER_CHAIN || - keccak256(zetaMessage.zetaTxSenderAddress) != ZETA_REPORTER_ADDRESS_HASH + enabledReporters[zetaMessage.sourceChainId] != keccak256(zetaMessage.zetaTxSenderAddress) ) revert UnauthorizedZetaChainReceive(); - _receivePayload(zetaMessage.message); + (uint256[] memory ids, bytes32[] memory hashes) = abi.decode(zetaMessage.message, (uint256[], bytes32[])); + _storeHashes(zetaMessage.sourceChainId, ids, hashes); + } + + function setReporterByChainId(uint256 chainId, address reporter) external onlyOwner { + enabledReporters[chainId] = keccak256(abi.encodePacked(reporter)); + emit ReporterSet(chainId, reporter); } } diff --git a/packages/evm/contracts/adapters/ZetaChain/ZetaHeaderReporter.sol b/packages/evm/contracts/adapters/ZetaChain/ZetaHeaderReporter.sol deleted file mode 100644 index ba051dd1..00000000 --- a/packages/evm/contracts/adapters/ZetaChain/ZetaHeaderReporter.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { HeaderReporter } from "../HeaderReporter.sol"; -import { ZetaReporter } from "./ZetaReporter.sol"; - -contract ZetaHeaderReporter is HeaderReporter, ZetaReporter { - constructor( - address headerStorage, - uint256 adapterChain, - address zetaConnector, - address zetaToken, - address zetaConsumer - ) HeaderReporter(headerStorage, adapterChain) ZetaReporter(zetaConnector, zetaToken, zetaConsumer, adapterChain) {} // solhint-disable no-empty-blocks - - function _sendPayload(bytes memory payload, address adapter) internal override { - _zetaSend(payload, adapter); - } -} diff --git a/packages/evm/contracts/adapters/ZetaChain/ZetaMessageRelay.sol b/packages/evm/contracts/adapters/ZetaChain/ZetaMessageRelay.sol deleted file mode 100644 index 8bb624d8..00000000 --- a/packages/evm/contracts/adapters/ZetaChain/ZetaMessageRelay.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { MessageRelay } from "../MessageRelay.sol"; -import { ZetaReporter } from "./ZetaReporter.sol"; - -contract ZetaMessageRelay is MessageRelay, ZetaReporter { - constructor( - address yaho, - uint256 adapterChain, - address zetaConnector, - address zetaToken, - address zetaConsumer - ) MessageRelay(yaho, adapterChain) ZetaReporter(zetaConnector, zetaToken, zetaConsumer, adapterChain) {} // solhint-disable no-empty-blocks - - function _sendPayload(bytes memory payload, address adapter) internal override { - _zetaSend(payload, adapter); - } -} diff --git a/packages/evm/contracts/adapters/ZetaChain/ZetaReporter.sol b/packages/evm/contracts/adapters/ZetaChain/ZetaReporter.sol index bee3a574..591a005b 100644 --- a/packages/evm/contracts/adapters/ZetaChain/ZetaReporter.sol +++ b/packages/evm/contracts/adapters/ZetaChain/ZetaReporter.sol @@ -1,33 +1,45 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { SafeERC20, IERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import { ZetaConnector, ZetaTokenConsumer, ZetaInterfaces } from "./interfaces/ZetaInterfaces.sol"; +import { Reporter } from "../Reporter.sol"; -abstract contract ZetaReporter { +contract ZetaReporter is Reporter, Ownable { using SafeERC20 for IERC20; string public constant PROVIDER = "zeta"; ZetaConnector public immutable ZETA_CONNECTOR; address public immutable ZETA_TOKEN; ZetaTokenConsumer public immutable ZETA_CONSUMER; - uint256 public immutable ZETA_ADAPTER_CHAIN; - constructor(address zetaConnector, address zetaToken, address zetaConsumer, uint256 zetaAdapterChain) { + constructor( + address headerStorage, + address yaho, + address zetaConnector, + address zetaToken, + address zetaConsumer + ) Reporter(headerStorage, yaho) { ZETA_CONNECTOR = ZetaConnector(zetaConnector); ZETA_TOKEN = zetaToken; ZETA_CONSUMER = ZetaTokenConsumer(zetaConsumer); - ZETA_ADAPTER_CHAIN = zetaAdapterChain; } - function _zetaSend(bytes memory payload, address adapter) internal { + function _dispatch( + uint256 toChainId, + address adapter, + uint256[] memory ids, + bytes32[] memory hashes + ) internal override returns (bytes32) { + bytes memory payload = abi.encode(ids, hashes); uint256 zetaAmount = ZETA_CONSUMER.getZetaFromEth{ value: msg.value }(address(this), 0); IERC20(ZETA_TOKEN).safeApprove(address(ZETA_CONNECTOR), zetaAmount); // solhint-disable-next-line check-send-result ZETA_CONNECTOR.send( ZetaInterfaces.SendInput({ - destinationChainId: ZETA_ADAPTER_CHAIN, + destinationChainId: toChainId, destinationAddress: abi.encodePacked(adapter), destinationGasLimit: 200_000, message: payload, @@ -35,5 +47,7 @@ abstract contract ZetaReporter { zetaParams: abi.encode("") }) ); + + return bytes32(0); } } From 26e40a6b295de2900a9aba8210bfab43e3af45b2 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 25 Jan 2024 07:10:29 +0100 Subject: [PATCH 088/297] refactor(evm): refactors PNetwork Adapter and adds the Reporter --- .../adapters/PNetwork/PNetworkAdapter.sol | 57 +++++++++++++------ .../adapters/PNetwork/PNetworkBase.sol | 41 ------------- .../PNetwork/PNetworkHeaderReporter.sol | 22 ------- .../PNetwork/PNetworkMessageRelay.sol | 19 ------- .../adapters/PNetwork/PNetworkReporter.sol | 52 +++++++++++++---- 5 files changed, 79 insertions(+), 112 deletions(-) delete mode 100644 packages/evm/contracts/adapters/PNetwork/PNetworkBase.sol delete mode 100644 packages/evm/contracts/adapters/PNetwork/PNetworkHeaderReporter.sol delete mode 100644 packages/evm/contracts/adapters/PNetwork/PNetworkMessageRelay.sol diff --git a/packages/evm/contracts/adapters/PNetwork/PNetworkAdapter.sol b/packages/evm/contracts/adapters/PNetwork/PNetworkAdapter.sol index 96d28a3f..16f1fac3 100644 --- a/packages/evm/contracts/adapters/PNetwork/PNetworkAdapter.sol +++ b/packages/evm/contracts/adapters/PNetwork/PNetworkAdapter.sol @@ -1,24 +1,39 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; -import { HeaderOracleAdapter } from "../HeaderOracleAdapter.sol"; -import { PNetworkBase } from "./PNetworkBase.sol"; +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; +import { IERC777Recipient } from "@openzeppelin/contracts/interfaces/IERC777Recipient.sol"; +import { IERC1820RegistryUpgradeable } from "@openzeppelin/contracts-upgradeable/interfaces/IERC1820RegistryUpgradeable.sol"; +import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; + +contract PNetworkAdapter is BlockHashOracleAdapter, Ownable { + string public constant PROVIDER = "pnetwork"; + + address public immutable VAULT; + address public immutable TOKEN; + IERC1820RegistryUpgradeable private constant ERC1820 = + IERC1820RegistryUpgradeable(0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24); + bytes32 private constant TOKENS_RECIPIENT_INTERFACE_HASH = keccak256("ERC777TokensRecipient"); + + mapping(bytes4 => address) public enabledReporters; + mapping(bytes4 => uint256) public chainIds; -contract PNetworkAdapter is HeaderOracleAdapter, PNetworkBase { error InvalidSender(address sender, address expected); - error InvalidNetworkId(bytes4 networkId, bytes4 expected); + error InvalidToken(address token, address expected); error UnauthorizedPNetworkReceive(); - constructor( - uint256 reporterChain, - address reporterAddress, - address pNetworkVault, - address pNetworkToken, - bytes4 pNetworkReporterNetworkId - ) - HeaderOracleAdapter(reporterChain, reporterAddress) - PNetworkBase(pNetworkVault, pNetworkToken, pNetworkReporterNetworkId) - {} // solhint-disable no-empty-blocks + event ReporterSet(uint256 indexed chainId, bytes4 indexed networkId, address indexed reporter); + + modifier onlySupportedToken(address _tokenAddress) { + if (_tokenAddress != TOKEN) revert InvalidToken(_tokenAddress, TOKEN); + _; + } + + constructor(address pNetworkVault, address pNetworkToken) { + VAULT = pNetworkVault; + TOKEN = pNetworkToken; + ERC1820.setInterfaceImplementer(address(this), TOKENS_RECIPIENT_INTERFACE_HASH, address(this)); + } // Implement the ERC777TokensRecipient interface function tokensReceived( @@ -28,14 +43,20 @@ contract PNetworkAdapter is HeaderOracleAdapter, PNetworkBase { uint256, bytes calldata data, bytes calldata - ) external override onlySupportedToken(msg.sender) { + ) external onlySupportedToken(msg.sender) { if (from != VAULT) revert InvalidSender(from, VAULT); (, bytes memory userData, bytes4 networkId, address sender) = abi.decode( data, (bytes1, bytes, bytes4, address) ); - if (networkId != PNETWORK_REF_NETWORK_ID) revert InvalidNetworkId(networkId, PNETWORK_REF_NETWORK_ID); - if (sender != REPORTER_ADDRESS) revert UnauthorizedPNetworkReceive(); - _receivePayload(userData); + if (enabledReporters[networkId] != sender) revert UnauthorizedPNetworkReceive(); + (uint256[] memory ids, bytes32[] memory hashes) = abi.decode(userData, (uint256[], bytes32[])); + _storeHashes(chainIds[networkId], ids, hashes); + } + + function setReporterByChain(uint256 chainId, bytes4 networkId, address reporter) external onlyOwner { + enabledReporters[networkId] = reporter; + chainIds[networkId] = chainId; + emit ReporterSet(chainId, networkId, reporter); } } diff --git a/packages/evm/contracts/adapters/PNetwork/PNetworkBase.sol b/packages/evm/contracts/adapters/PNetwork/PNetworkBase.sol deleted file mode 100644 index 70c8ace2..00000000 --- a/packages/evm/contracts/adapters/PNetwork/PNetworkBase.sol +++ /dev/null @@ -1,41 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import "@openzeppelin/contracts/interfaces/IERC777Recipient.sol"; -import "@openzeppelin/contracts-upgradeable/interfaces/IERC1820RegistryUpgradeable.sol"; - -abstract contract PNetworkBase is IERC777Recipient { - address public immutable VAULT; - address public immutable TOKEN; - bytes4 public immutable PNETWORK_REF_NETWORK_ID; - IERC1820RegistryUpgradeable private constant ERC1820 = - IERC1820RegistryUpgradeable(0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24); - bytes32 private constant TOKENS_RECIPIENT_INTERFACE_HASH = keccak256("ERC777TokensRecipient"); - - error InvalidToken(address token, address expected); - error InvalidReceiver(address receiver, address expected); - - constructor(address pNetworkVault, address pNetworkToken, bytes4 pNetworkRefNetworkId) { - VAULT = pNetworkVault; - TOKEN = pNetworkToken; - PNETWORK_REF_NETWORK_ID = pNetworkRefNetworkId; - ERC1820.setInterfaceImplementer(address(this), TOKENS_RECIPIENT_INTERFACE_HASH, address(this)); - } - - // Implement the ERC777TokensRecipient interface - function tokensReceived( - address, - address, - address to, - uint256, - bytes calldata, - bytes calldata - ) external virtual onlySupportedToken(msg.sender) { - if (to != address(this)) revert InvalidReceiver(to, address(this)); - } - - modifier onlySupportedToken(address _tokenAddress) { - if (_tokenAddress != TOKEN) revert InvalidToken(_tokenAddress, TOKEN); - _; - } -} diff --git a/packages/evm/contracts/adapters/PNetwork/PNetworkHeaderReporter.sol b/packages/evm/contracts/adapters/PNetwork/PNetworkHeaderReporter.sol deleted file mode 100644 index 40e35bdb..00000000 --- a/packages/evm/contracts/adapters/PNetwork/PNetworkHeaderReporter.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { HeaderReporter } from "../HeaderReporter.sol"; -import { PNetworkReporter } from "./PNetworkReporter.sol"; - -contract PNetworkHeaderReporter is HeaderReporter, PNetworkReporter { - constructor( - address headerStorage, - uint64 adapterChain, - address pNetworkVault, - address pNetworkToken, - bytes4 pNetworkAdapterNetworkId - ) - HeaderReporter(headerStorage, adapterChain) - PNetworkReporter(pNetworkVault, pNetworkToken, pNetworkAdapterNetworkId) - {} // solhint-disable no-empty-blocks - - function _sendPayload(bytes memory payload, address adapter) internal override { - _pNetworkSend(payload, adapter); - } -} diff --git a/packages/evm/contracts/adapters/PNetwork/PNetworkMessageRelay.sol b/packages/evm/contracts/adapters/PNetwork/PNetworkMessageRelay.sol deleted file mode 100644 index 40d081d1..00000000 --- a/packages/evm/contracts/adapters/PNetwork/PNetworkMessageRelay.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { MessageRelay } from "../MessageRelay.sol"; -import { PNetworkReporter } from "./PNetworkReporter.sol"; - -contract PNetworkMessageRelay is MessageRelay, PNetworkReporter { - constructor( - address yaho, - uint64 adapterChain, - address pNetworkVault, - address pNetworktoken, - bytes4 pNetworkAdapterNetworkId - ) MessageRelay(yaho, adapterChain) PNetworkReporter(pNetworkVault, pNetworktoken, pNetworkAdapterNetworkId) {} // solhint-disable no-empty-blocks - - function _sendPayload(bytes memory payload, address adapter) internal override { - _pNetworkSend(payload, adapter); - } -} diff --git a/packages/evm/contracts/adapters/PNetwork/PNetworkReporter.sol b/packages/evm/contracts/adapters/PNetwork/PNetworkReporter.sol index 27b2bb32..27901b19 100644 --- a/packages/evm/contracts/adapters/PNetwork/PNetworkReporter.sol +++ b/packages/evm/contracts/adapters/PNetwork/PNetworkReporter.sol @@ -2,32 +2,55 @@ pragma solidity ^0.8.17; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; - +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; +import { Reporter } from "../Reporter.sol"; import { IErc20Vault } from "./interfaces/IErc20Vault.sol"; import { IPToken } from "./interfaces/IPToken.sol"; -import { PNetworkBase } from "./PNetworkBase.sol"; -abstract contract PNetworkReporter is PNetworkBase { +contract PNetworkReporter is Reporter, Ownable { + string public constant PROVIDER = "pnetwork"; uint256 private constant SWAP_AMOUNT = 1; + address public immutable VAULT; + address public immutable TOKEN; + + mapping(uint256 => bytes4) public networkIds; + + error NetworkIdNotAvailable(); + + event NetworkIdSet(uint256 indexed chainId, bytes4 indexed networkId); + constructor( + address headerStorage, + address yaho, address pNetworkVault, - address pNetworkToken, - bytes4 pNetworkAdapterNetworkId - ) PNetworkBase(pNetworkVault, pNetworkToken, pNetworkAdapterNetworkId) {} // solhint-disable no-empty-blocks + address pNetworkToken + ) Reporter(headerStorage, yaho) { + VAULT = pNetworkVault; + TOKEN = pNetworkToken; + } - function _char(bytes1 b) internal pure returns (bytes1 c) { - if (uint8(b) < 10) return bytes1(uint8(b) + 0x30); - else return bytes1(uint8(b) + 0x57); + function setNetworkIdByChainId(uint256 chainId, bytes4 networkId) external onlyOwner { + networkIds[chainId] = networkId; + emit NetworkIdSet(chainId, networkId); } - function _pNetworkSend(bytes memory payload, address adapter) internal { + function _dispatch( + uint256 toChainId, + address adapter, + uint256[] memory ids, + bytes32[] memory hashes + ) internal override returns (bytes32) { + bytes4 networkId = networkIds[toChainId]; + if (networkId == 0) revert NetworkIdNotAvailable(); + bytes memory payload = abi.encode(ids, hashes); if (VAULT != address(0)) { IERC20(TOKEN).approve(VAULT, SWAP_AMOUNT); - IErc20Vault(VAULT).pegIn(SWAP_AMOUNT, TOKEN, _toAsciiString(adapter), payload, PNETWORK_REF_NETWORK_ID); + IErc20Vault(VAULT).pegIn(SWAP_AMOUNT, TOKEN, _toAsciiString(adapter), payload, networkId); } else { - IPToken(TOKEN).redeem(SWAP_AMOUNT, payload, _toAsciiString(adapter), PNETWORK_REF_NETWORK_ID); + IPToken(TOKEN).redeem(SWAP_AMOUNT, payload, _toAsciiString(adapter), networkId); } + return bytes32(0); } function _toAsciiString(address x) internal pure returns (string memory) { @@ -41,4 +64,9 @@ abstract contract PNetworkReporter is PNetworkBase { } return string(s); } + + function _char(bytes1 b) internal pure returns (bytes1 c) { + if (uint8(b) < 10) return bytes1(uint8(b) + 0x30); + else return bytes1(uint8(b) + 0x57); + } } From 4cdd1849eceb21f422f48120a7ec774a103d939e Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 25 Jan 2024 07:48:33 +0100 Subject: [PATCH 089/297] refactor(evm): refactors Sygma Adapter and adds the Reporter --- .../contracts/adapters/Sygma/SygmaAdapter.sol | 30 ++----- .../adapters/Sygma/SygmaHeaderReporter.sol | 59 -------------- .../adapters/Sygma/SygmaMessageRelay.sol | 38 --------- .../adapters/Sygma/SygmaReporter.sol | 71 +++++++++++------ .../Sygma/test/SygmaTestContracts.sol | 78 ------------------- 5 files changed, 52 insertions(+), 224 deletions(-) delete mode 100644 packages/evm/contracts/adapters/Sygma/SygmaHeaderReporter.sol delete mode 100644 packages/evm/contracts/adapters/Sygma/SygmaMessageRelay.sol delete mode 100644 packages/evm/contracts/adapters/Sygma/test/SygmaTestContracts.sol diff --git a/packages/evm/contracts/adapters/Sygma/SygmaAdapter.sol b/packages/evm/contracts/adapters/Sygma/SygmaAdapter.sol index 451e659d..251a649f 100644 --- a/packages/evm/contracts/adapters/Sygma/SygmaAdapter.sol +++ b/packages/evm/contracts/adapters/Sygma/SygmaAdapter.sol @@ -1,11 +1,12 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; -import "@openzeppelin/contracts/access/AccessControl.sol"; -import "../OracleAdapter.sol"; +import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol"; import "../BlockHashOracleAdapter.sol"; -contract SygmaAdapter is AccessControl, OracleAdapter, BlockHashOracleAdapter { +contract SygmaAdapter is AccessControl, BlockHashOracleAdapter { + string public constant PROVIDER = "sygma"; + struct Reporter { uint128 chainID; bool enabled; @@ -21,9 +22,6 @@ contract SygmaAdapter is AccessControl, OracleAdapter, BlockHashOracleAdapter { event ReporterSet(address reporterAddress, uint256 chainID, bool enabled); - /** - @param handler Contract address of the generic handler. - */ constructor(address handler) { _handler = handler; _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); @@ -34,35 +32,17 @@ contract SygmaAdapter is AccessControl, OracleAdapter, BlockHashOracleAdapter { _; } - /** - @dev Sets parameters of a source chain hash reporter. - @param reporterAddress Hash reporter address on the source chain. - @param chainID ChainID of the source chain. - @param enabled Status of the reporter. - */ function setReporter(address reporterAddress, uint128 chainID, bool enabled) public onlyAdmin { reporters[reporterAddress] = Reporter(chainID, enabled); emit ReporterSet(reporterAddress, chainID, enabled); } - /** - @dev Stores the hashes for a given array of ids. - @param reporterAddress Hash reporter address on the source chain. - @param ids Array of block numbers for which to set the hashes. - @param hashes Array of hashes to set for the given block numbers. - @notice Only callable by `_handler` with a message passed from an authorized reporter. - @notice Will revert if array lengths do not match. - */ function storeHashes(address reporterAddress, uint256[] calldata ids, bytes32[] calldata hashes) public { if (ids.length != hashes.length) revert ArrayLengthMismatch(); if (msg.sender != _handler) revert InvalidHandler(msg.sender); - Reporter memory reporter = reporters[reporterAddress]; if (!reporter.enabled) revert InvalidReporter(reporterAddress); uint256 chainID = uint256(reporter.chainID); - - for (uint i = 0; i < ids.length; i++) { - _storeHash(chainID, ids[i], hashes[i]); - } + _storeHashes(chainID, ids, hashes); } } diff --git a/packages/evm/contracts/adapters/Sygma/SygmaHeaderReporter.sol b/packages/evm/contracts/adapters/Sygma/SygmaHeaderReporter.sol deleted file mode 100644 index f7c95f87..00000000 --- a/packages/evm/contracts/adapters/Sygma/SygmaHeaderReporter.sol +++ /dev/null @@ -1,59 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { SygmaReporter } from "./SygmaReporter.sol"; -import { HeaderStorage } from "../../utils/HeaderStorage.sol"; - -contract SygmaHeaderReporter is SygmaReporter { - HeaderStorage public immutable _headerStorage; - - event HeaderReported(address indexed emitter, uint256 indexed blockNumber, bytes32 indexed blockHeader); - - constructor( - address bridge, - HeaderStorage headerStorage, - bytes32 resourceID, - uint8 defaultDestinationDomainID, - address defaultSygmaAdapter - ) SygmaReporter(bridge, resourceID, defaultDestinationDomainID, defaultSygmaAdapter) { - _headerStorage = headerStorage; - } - - /** - @dev Reports the given block headers to the oracleAdapter via the Sygma bridge to default domain. - @param blockNumbers Uint256 array of block numbers to pass over the Sygma bridge. - @param feeData Additional data to be passed to the fee handler. - */ - function reportHeaders(uint256[] memory blockNumbers, bytes calldata feeData) public payable { - _reportHeaders(blockNumbers, _defaultSygmaAdapter, _defaultDestinationDomainID, feeData); - } - - /** - @dev Reports the given block headers to the oracleAdapter via the Sygma bridge to specified domain. - @param blockNumbers Uint256 array of block numbers to pass over the Sygma bridge. - @param sygmaAdapter Address of the Sygma adapter on the target chain. - @param destinationDomainID Destination domain ID. - @param feeData Additional data to be passed to the fee handler. - */ - function reportHeadersToDomain( - uint256[] memory blockNumbers, - address sygmaAdapter, - uint8 destinationDomainID, - bytes memory feeData - ) public payable { - _reportHeaders(blockNumbers, sygmaAdapter, destinationDomainID, feeData); - } - - function _reportHeaders( - uint256[] memory blockNumbers, - address sygmaAdapter, - uint8 destinationDomainID, - bytes memory feeData - ) internal { - bytes32[] memory blockHeaders = _headerStorage.storeBlockHeaders(blockNumbers); - _reportData(blockNumbers, blockHeaders, sygmaAdapter, destinationDomainID, feeData); - for (uint i = 0; i < blockNumbers.length; i++) { - emit HeaderReported(address(this), blockNumbers[i], blockHeaders[i]); - } - } -} diff --git a/packages/evm/contracts/adapters/Sygma/SygmaMessageRelay.sol b/packages/evm/contracts/adapters/Sygma/SygmaMessageRelay.sol deleted file mode 100644 index 74aafad2..00000000 --- a/packages/evm/contracts/adapters/Sygma/SygmaMessageRelay.sol +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { IMessageRelay } from "../../interfaces/IMessageRelay.sol"; -import { SygmaReporter } from "./SygmaReporter.sol"; -import { Yaho } from "../../Yaho.sol"; - -contract SygmaMessageRelay is SygmaReporter, IMessageRelay { - Yaho public immutable _yaho; - - event MessageRelayed(address indexed emitter, uint256 indexed messageId); - - constructor( - address bridge, - Yaho yaho, - bytes32 resourceID, - uint8 defaultDestinationDomainID, - address defaultSygmaAdapter - ) SygmaReporter(bridge, resourceID, defaultDestinationDomainID, defaultSygmaAdapter) { - _yaho = yaho; - } - - /** - @dev Relays the messages via the Sygma bridge to default domain. - @param messageIds IDs of the messages to pass over the Sygma bridge. - @param sygmaAdapter Address of the Sygma adapter on the target chain. - */ - function relayMessages(uint256[] memory messageIds, address sygmaAdapter) public payable returns (bytes32) { - bytes32[] memory hashes = new bytes32[](messageIds.length); - for (uint256 i = 0; i < messageIds.length; i++) { - uint256 id = messageIds[i]; - hashes[i] = _yaho.hashes(id); - emit MessageRelayed(address(this), messageIds[i]); - } - (uint64 depositNonce, ) = _reportData(messageIds, hashes, sygmaAdapter, _defaultDestinationDomainID, ""); - return bytes32(uint256(depositNonce)); - } -} diff --git a/packages/evm/contracts/adapters/Sygma/SygmaReporter.sol b/packages/evm/contracts/adapters/Sygma/SygmaReporter.sol index 2fcaee60..4a792cd5 100644 --- a/packages/evm/contracts/adapters/Sygma/SygmaReporter.sol +++ b/packages/evm/contracts/adapters/Sygma/SygmaReporter.sol @@ -1,29 +1,46 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; -import "./interfaces/ISygmaAdapter.sol"; -import "./interfaces/IBridge.sol"; - -contract SygmaReporter { - address public immutable _bridge; - bytes32 public immutable _resourceID; - uint8 public immutable _defaultDestinationDomainID; - address public immutable _defaultSygmaAdapter; - - constructor(address bridge, bytes32 resourceID, uint8 defaultDestinationDomainID, address defaultSygmaAdapter) { - _bridge = bridge; - _resourceID = resourceID; - _defaultDestinationDomainID = defaultDestinationDomainID; - _defaultSygmaAdapter = defaultSygmaAdapter; +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; +import { Reporter } from "../Reporter.sol"; +import { ISygmaAdapter } from "./interfaces/ISygmaAdapter.sol"; +import { IBridge } from "./interfaces/IBridge.sol"; + +contract SygmaReporter is Reporter, Ownable { + string public constant PROVIDER = "sygma"; + + IBridge public immutable BRIDGE; + + mapping(uint256 => uint8) public domainIds; + mapping(uint256 => bytes32) public resourceIds; + + error DomainIdNotAvailable(); + error ResourceIdNotAvailable(); + + event DomainIdSet(uint256 indexed chainId, uint8 indexed domainId); + event ResourceIdSet(uint256 indexed chainId, bytes32 indexed resourceId); + + constructor(address headerStorage, address yaho, address bridge) Reporter(headerStorage, yaho) { + BRIDGE = IBridge(bridge); } - function _reportData( - uint256[] memory messageIds, - bytes32[] memory hashes, - address sygmaAdapter, - uint8 destinationDomainID, - bytes memory feeData - ) internal returns (uint64 depositNonce, bytes memory handlerResponse) { + function setDomainIdAndResourceIdByChainId(uint256 chainId, uint8 domainId, bytes32 resourceId) external onlyOwner { + domainIds[chainId] = domainId; + resourceIds[chainId] = resourceId; + emit DomainIdSet(chainId, domainId); + emit ResourceIdSet(chainId, resourceId); + } + + function _dispatch( + uint256 toChainId, + address adapter, + uint256[] memory ids, + bytes32[] memory hashes + ) internal override returns (bytes32) { + uint8 domainId = domainIds[toChainId]; + if (domainId == 0) revert DomainIdNotAvailable(); + bytes32 resourceId = resourceIds[toChainId]; + if (resourceId == bytes32(0)) revert ResourceIdNotAvailable(); bytes memory depositData = abi.encodePacked( // uint256 maxFee uint256(950000), @@ -34,15 +51,21 @@ contract SygmaReporter { // uint8 len(executeContractAddress) uint8(20), // bytes executeContractAddress - sygmaAdapter, + adapter, // uint8 len(executionDataDepositor) uint8(20), // bytes executionDataDepositor address(this), // bytes executionDataDepositor + executionData - prepareDepositData(messageIds, hashes) + prepareDepositData(ids, hashes) + ); + (uint64 nonce, bytes memory handlerResponse) = BRIDGE.deposit{ value: msg.value }( + domainId, + resourceId, + depositData, + "" // feeData ); - return IBridge(_bridge).deposit{ value: msg.value }(destinationDomainID, _resourceID, depositData, feeData); + return bytes32(keccak256(abi.encode(nonce, handlerResponse))); } function slice(bytes calldata input, uint256 position) public pure returns (bytes memory) { diff --git a/packages/evm/contracts/adapters/Sygma/test/SygmaTestContracts.sol b/packages/evm/contracts/adapters/Sygma/test/SygmaTestContracts.sol deleted file mode 100644 index 4c1b7058..00000000 --- a/packages/evm/contracts/adapters/Sygma/test/SygmaTestContracts.sol +++ /dev/null @@ -1,78 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.17; - -import "../interfaces/IBridge.sol"; - -contract MockSygmaBridge { - error CallReverted(); - - event Deposit( - uint8 destinationDomainID, - bytes32 resourceID, - uint64 depositNonce, - address indexed user, - bytes data, - bytes handlerResponse - ); - - function deposit( - uint8 destinationDomainID, - bytes32 resourceID, - bytes calldata depositData, - bytes calldata feeData - ) external payable returns (uint64 depositNonce, bytes memory handlerResponse) { - emit Deposit(destinationDomainID, resourceID, 1, msg.sender, depositData, feeData); - - bool success = _executeProposal(resourceID, depositData); - - if (!success) revert CallReverted(); - - return (1, bytes("2")); - } - - function _executeProposal(bytes32 resourceID, bytes calldata data) internal returns (bool success) { - uint16 lenExecuteFuncSignature; - bytes4 executeFuncSignature; - uint8 lenExecuteContractAddress; - address executeContractAddress; - uint8 lenExecutionDataDepositor; - address executionDataDepositor; - bytes memory executionData; - - lenExecuteFuncSignature = uint16(bytes2(data[32:34])); - executeFuncSignature = bytes4(data[34:34 + lenExecuteFuncSignature]); - lenExecuteContractAddress = uint8(bytes1(data[34 + lenExecuteFuncSignature:35 + lenExecuteFuncSignature])); - executeContractAddress = address( - uint160( - bytes20(data[35 + lenExecuteFuncSignature:35 + lenExecuteFuncSignature + lenExecuteContractAddress]) - ) - ); - lenExecutionDataDepositor = uint8( - bytes1( - data[35 + lenExecuteFuncSignature + lenExecuteContractAddress:36 + - lenExecuteFuncSignature + - lenExecuteContractAddress] - ) - ); - executionDataDepositor = address( - uint160( - bytes20( - data[36 + lenExecuteFuncSignature + lenExecuteContractAddress:36 + - lenExecuteFuncSignature + - lenExecuteContractAddress + - lenExecutionDataDepositor] - ) - ) - ); - executionData = bytes( - data[36 + lenExecuteFuncSignature + lenExecuteContractAddress + lenExecutionDataDepositor:] - ); - - bytes memory callData = abi.encodePacked( - executeFuncSignature, - abi.encode(executionDataDepositor), - executionData - ); - (success, ) = executeContractAddress.call(callData); - } -} From 7db15f00370e33cdbb8a9a7f44ab86a9c365a4d0 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 25 Jan 2024 07:49:40 +0100 Subject: [PATCH 090/297] chore(test): rm AMB, PNetwork and Sygma tests --- .../test/adapters/AMB/01_AMBAdapter.spec.ts | 75 ---- .../PNetwork/01_PNetworkMessageRelay.spec.ts | 185 ---------- .../02_PNetworkHeaderReporter.spec.ts | 173 ---------- .../PNetwork/03_PNetworkAdapter.spec.ts | 320 ------------------ .../evm/test/adapters/PNetwork/utils.spec.ts | 24 -- .../adapters/Sygma/01_SygmaAdapter.spec.ts | 138 -------- .../Sygma/02_SygmaHeaderReporter.spec.ts | 131 ------- .../Sygma/03_SygmaMessageRelay.spec.ts | 120 ------- .../test/adapters/Sygma/04_Sygma_E2E.spec.ts | 116 ------- 9 files changed, 1282 deletions(-) delete mode 100644 packages/evm/test/adapters/AMB/01_AMBAdapter.spec.ts delete mode 100644 packages/evm/test/adapters/PNetwork/01_PNetworkMessageRelay.spec.ts delete mode 100644 packages/evm/test/adapters/PNetwork/02_PNetworkHeaderReporter.spec.ts delete mode 100644 packages/evm/test/adapters/PNetwork/03_PNetworkAdapter.spec.ts delete mode 100644 packages/evm/test/adapters/PNetwork/utils.spec.ts delete mode 100644 packages/evm/test/adapters/Sygma/01_SygmaAdapter.spec.ts delete mode 100644 packages/evm/test/adapters/Sygma/02_SygmaHeaderReporter.spec.ts delete mode 100644 packages/evm/test/adapters/Sygma/03_SygmaMessageRelay.spec.ts delete mode 100644 packages/evm/test/adapters/Sygma/04_Sygma_E2E.spec.ts diff --git a/packages/evm/test/adapters/AMB/01_AMBAdapter.spec.ts b/packages/evm/test/adapters/AMB/01_AMBAdapter.spec.ts deleted file mode 100644 index 16df4a81..00000000 --- a/packages/evm/test/adapters/AMB/01_AMBAdapter.spec.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { expect } from "chai" -import { ethers, network } from "hardhat" - -const GAS = 10000000 -const DOMAIN_ID = "0x0000000000000000000000000000000000000000000000000000000000007a69" -const ID_ONE = 1 -const ID_TWO = 2 -const HASH_ONE = "0x0000000000000000000000000000000000000000000000000000000000000001" -const HASH_TWO = "0x0000000000000000000000000000000000000000000000000000000000000002" - -const setup = async () => { - await network.provider.request({ method: "hardhat_reset", params: [] }) - const [wallet] = await ethers.getSigners() - const HeaderStorage = await ethers.getContractFactory("HeaderStorage") - const headerStorage = await HeaderStorage.deploy() - const AMB = await ethers.getContractFactory("MockAMB") - const amb = await AMB.deploy() - const AMBAdapter = await ethers.getContractFactory("AMBAdapter") - const ambAdapter = await AMBAdapter.deploy(amb.address, wallet.address, DOMAIN_ID) - return { - wallet, - amb, - headerStorage, - ambAdapter, - } -} - -describe("AMBAdapter", function () { - describe("Constructor", function () { - it("Successfully deploys contract with correct state", async function () { - const { amb, ambAdapter, wallet } = await setup() - expect(await ambAdapter.deployed()) - expect(await ambAdapter.amb()).to.equal(amb.address) - expect(await ambAdapter.reporter()).to.equal(wallet.address) - expect(await ambAdapter.chainId()).to.equal(DOMAIN_ID) - }) - }) - - describe("StoreHashes()", function () { - it("Stores hashes", async function () { - const { amb, ambAdapter } = await setup() - const call = await ambAdapter.populateTransaction.storeHashes([ID_ONE, ID_TWO], [HASH_ONE, HASH_TWO]) - await amb.requireToPassMessage(ambAdapter.address, call.data, GAS) - expect(await ambAdapter.getHashFromOracle(DOMAIN_ID, ID_ONE)).to.equal(HASH_ONE) - expect(await ambAdapter.getHashFromOracle(DOMAIN_ID, ID_TWO)).to.equal(HASH_TWO) - }) - it("Overwrites previous hashes", async function () { - const { amb, ambAdapter } = await setup() - let call = await ambAdapter.populateTransaction.storeHashes([ID_ONE, ID_TWO], [HASH_ONE, HASH_TWO]) - await amb.requireToPassMessage(ambAdapter.address, call.data, GAS) - expect(await ambAdapter.getHashFromOracle(DOMAIN_ID, ID_ONE)).to.equal(HASH_ONE) - expect(await ambAdapter.getHashFromOracle(DOMAIN_ID, ID_TWO)).to.equal(HASH_TWO) - call = await ambAdapter.populateTransaction.storeHashes([ID_TWO, ID_ONE], [HASH_ONE, HASH_TWO]) - await amb.requireToPassMessage(ambAdapter.address, call.data, GAS) - expect(await ambAdapter.getHashFromOracle(DOMAIN_ID, ID_ONE)).to.equal(HASH_TWO) - expect(await ambAdapter.getHashFromOracle(DOMAIN_ID, ID_TWO)).to.equal(HASH_ONE) - }) - }) - - describe("getHashFromOracle()", function () { - it("Returns 0 if no header is stored", async function () { - const { ambAdapter } = await setup() - expect(await ambAdapter.getHashFromOracle(DOMAIN_ID, ID_ONE)).to.equal( - "0x0000000000000000000000000000000000000000000000000000000000000000", - ) - }) - it("Returns stored hash", async function () { - const { amb, ambAdapter } = await setup() - const call = await ambAdapter.populateTransaction.storeHashes([ID_ONE, ID_TWO], [HASH_ONE, HASH_TWO]) - await amb.requireToPassMessage(ambAdapter.address, call.data, GAS) - expect(await ambAdapter.getHashFromOracle(DOMAIN_ID, ID_ONE)).to.equal(HASH_ONE) - expect(await ambAdapter.getHashFromOracle(DOMAIN_ID, ID_TWO)).to.equal(HASH_TWO) - }) - }) -}) diff --git a/packages/evm/test/adapters/PNetwork/01_PNetworkMessageRelay.spec.ts b/packages/evm/test/adapters/PNetwork/01_PNetworkMessageRelay.spec.ts deleted file mode 100644 index 8bb69bfa..00000000 --- a/packages/evm/test/adapters/PNetwork/01_PNetworkMessageRelay.spec.ts +++ /dev/null @@ -1,185 +0,0 @@ -import { expect } from "chai" -import { ethers } from "hardhat" - -import { ZERO_ADDRESS, deployErc1820Registry, resetNetwork } from "./utils.spec" - -const DOMAIN_ID = "0x0000000000000000000000000000000000000000000000000000000000001" - -describe("PNetworkMessageRelay", function () { - describe("Native Network", () => { - const setup = async () => { - await resetNetwork() - const [wallet] = await ethers.getSigners() - const Yaho = await ethers.getContractFactory("Yaho") - const yaho = await Yaho.deploy() - await deployErc1820Registry(wallet) - const ERC777Token = await ethers.getContractFactory("ERC777Token") - const erc777Token = await ERC777Token.deploy("ERC777 Token", "E777", []) - const anotherErc777Token = await ERC777Token.deploy("Another ERC777 Token", "A777", []) - const Vault = await ethers.getContractFactory("MockVault") - const vault = await Vault.deploy() - await vault.initialize([erc777Token.address, anotherErc777Token.address], "0x12345678") - - const PNetworkMessageRelay = await ethers.getContractFactory("PNetworkMessageRelay") - const pNetworkMessageRelay = await PNetworkMessageRelay.deploy( - yaho.address, - DOMAIN_ID, - vault.address, - erc777Token.address, - "0x005fe7f9", - ) - - await erc777Token.connect(wallet).send(pNetworkMessageRelay.address, 10000, "0x") - - const PNetworkAdapter = await ethers.getContractFactory("PNetworkAdapter") - const pNetworkAdapter = await PNetworkAdapter.deploy( - DOMAIN_ID, - pNetworkMessageRelay.address, - vault.address, - pNetworkMessageRelay.address, - "0x005fe7f9", - ) - - const PingPong = await ethers.getContractFactory("PingPong") - const pingPong = await PingPong.deploy() - const message_1 = { - to: pingPong.address, - toChainId: 1, - data: pingPong.interface.getSighash("ping"), - } - - await yaho.dispatchMessages([message_1, message_1]) - - return { - erc777Token, - anotherErc777Token, - vault, - wallet, - yaho, - pNetworkMessageRelay, - pNetworkAdapter, - message_1, - pingPong, - } - } - - describe("Deploy", function () { - it("Successfully deploys contract", async function () { - const { pNetworkMessageRelay, erc777Token, vault, yaho } = await setup() - expect(await pNetworkMessageRelay.deployed()) - expect(await pNetworkMessageRelay.TOKEN()).to.equal(erc777Token.address) - expect(await pNetworkMessageRelay.VAULT()).to.equal(vault.address) - expect(await pNetworkMessageRelay.YAHO()).to.equal(yaho.address) - }) - }) - - describe("relayMessages()", function () { - it("Relays message hashes over pNetwork", async function () { - const { pNetworkMessageRelay, pNetworkAdapter, vault, erc777Token, yaho } = await setup() - const ids = [0, 1] - const hashes = await Promise.all(ids.map(async (_id) => await yaho.hashes(_id))) - const expectedUserData = new ethers.utils.AbiCoder().encode(["uint256[]", "bytes32[]"], [ids, hashes]) - await expect(pNetworkMessageRelay.relayMessages(ids, pNetworkAdapter.address)) - .to.emit(pNetworkMessageRelay, "MessageRelayed") - .withArgs(pNetworkMessageRelay.address, 0) - .and.to.emit(vault, "PegIn") - .withArgs( - erc777Token.address, - pNetworkMessageRelay.address, - 1, - pNetworkAdapter.address.replace("0x", "").toLowerCase(), - expectedUserData, - "0x12345678", - "0x005fe7f9", - ) - }) - }) - }) - - describe("Host Network", () => { - const setup = async () => { - await resetNetwork() - const [wallet] = await ethers.getSigners() - const Yaho = await ethers.getContractFactory("Yaho") - const yaho = await Yaho.deploy() - await deployErc1820Registry(wallet) - const PToken = await ethers.getContractFactory("PToken") - const pToken = await PToken.deploy("pToken", "P", []) - const anotherPToken = await PToken.deploy("Another ERC777 Token", "A777", []) - const Vault = await ethers.getContractFactory("MockVault") - const vault = await Vault.deploy() - await vault.initialize([pToken.address, anotherPToken.address], "0x12345678") - - const PNetworkMessageRelay = await ethers.getContractFactory("PNetworkMessageRelay") - const pNetworkMessageRelay = await PNetworkMessageRelay.deploy( - yaho.address, - DOMAIN_ID, - ZERO_ADDRESS, - pToken.address, - "0x005fe7f9", - ) - - await pToken.connect(wallet).send(pNetworkMessageRelay.address, 10000, "0x") - - const PNetworkAdapter = await ethers.getContractFactory("PNetworkAdapter") - const pNetworkAdapter = await PNetworkAdapter.deploy( - DOMAIN_ID, - pNetworkMessageRelay.address, - vault.address, - pNetworkMessageRelay.address, - "0x005fe7f9", - ) - - const PingPong = await ethers.getContractFactory("PingPong") - const pingPong = await PingPong.deploy() - const message_1 = { - to: pingPong.address, - toChainId: 1, - data: pingPong.interface.getSighash("ping"), - } - - await yaho.dispatchMessages([message_1, message_1]) - - return { - pToken, - anotherPToken, - vault, - wallet, - yaho, - pNetworkMessageRelay, - pNetworkAdapter, - } - } - - describe("Deploy", function () { - it("Successfully deploys contract", async function () { - const { pNetworkMessageRelay, pToken, yaho } = await setup() - expect(await pNetworkMessageRelay.deployed()) - expect(await pNetworkMessageRelay.TOKEN()).to.equal(pToken.address) - expect(await pNetworkMessageRelay.VAULT()).to.equal(ZERO_ADDRESS) - expect(await pNetworkMessageRelay.YAHO()).to.equal(yaho.address) - }) - }) - - describe("relayMessages()", function () { - it("Relays message hashes over pNetwork", async function () { - const { pNetworkMessageRelay, pNetworkAdapter, pToken, yaho } = await setup() - const ids = [0, 1] - const hashes = await Promise.all(ids.map(async (_id) => await yaho.hashes(_id))) - const expectedUserData = new ethers.utils.AbiCoder().encode(["uint256[]", "bytes32[]"], [ids, hashes]) - await expect(pNetworkMessageRelay.relayMessages(ids, pNetworkAdapter.address)) - .to.emit(pNetworkMessageRelay, "MessageRelayed") - .withArgs(pNetworkMessageRelay.address, 0) - .and.to.emit(pToken, "Redeem") - .withArgs( - pNetworkMessageRelay.address, - 1, - pNetworkAdapter.address.replace("0x", "").toLowerCase(), - expectedUserData, - "0x87654321", - "0x005fe7f9", - ) - }) - }) - }) -}) diff --git a/packages/evm/test/adapters/PNetwork/02_PNetworkHeaderReporter.spec.ts b/packages/evm/test/adapters/PNetwork/02_PNetworkHeaderReporter.spec.ts deleted file mode 100644 index af1984cb..00000000 --- a/packages/evm/test/adapters/PNetwork/02_PNetworkHeaderReporter.spec.ts +++ /dev/null @@ -1,173 +0,0 @@ -import { expect } from "chai" -import { ethers } from "hardhat" - -import { ZERO_ADDRESS, deployErc1820Registry, resetNetwork } from "./utils.spec" - -const DOMAIN_ID = "0x0000000000000000000000000000000000000000000000000000000000001" - -describe("PNetworkHeaderReporter", function () { - describe("Native Network", () => { - const setup = async () => { - await resetNetwork() - const [wallet] = await ethers.getSigners() - const HeaderStorage = await ethers.getContractFactory("HeaderStorage") - const headerStorage = await HeaderStorage.deploy() - await deployErc1820Registry(wallet) - const ERC777Token = await ethers.getContractFactory("ERC777Token") - const erc777Token = await ERC777Token.deploy("ERC777 Token", "E777", []) - const anotherErc777Token = await ERC777Token.deploy("Another ERC777 Token", "A777", []) - const Vault = await ethers.getContractFactory("MockVault") - const vault = await Vault.deploy() - await vault.initialize([erc777Token.address, anotherErc777Token.address], "0x12345678") - - const PNetworkHeaderReporter = await ethers.getContractFactory("PNetworkHeaderReporter") - const pNetworkHeaderReporter = await PNetworkHeaderReporter.deploy( - headerStorage.address, - DOMAIN_ID, - vault.address, - erc777Token.address, - "0x005fe7f9", - ) - - await erc777Token.connect(wallet).send(pNetworkHeaderReporter.address, 10000, "0x") - - const PNetworkAdapter = await ethers.getContractFactory("PNetworkAdapter") - const pNetworkAdapter = await PNetworkAdapter.deploy( - DOMAIN_ID, - pNetworkHeaderReporter.address, - vault.address, - pNetworkHeaderReporter.address, - "0x005fe7f9", - ) - - return { - erc777Token, - anotherErc777Token, - vault, - wallet, - headerStorage, - pNetworkHeaderReporter, - pNetworkAdapter, - } - } - - describe("Deploy", function () { - it("Successfully deploys contract", async function () { - const { pNetworkHeaderReporter, erc777Token, vault, headerStorage } = await setup() - expect(await pNetworkHeaderReporter.deployed()) - expect(await pNetworkHeaderReporter.TOKEN()).to.equal(erc777Token.address) - expect(await pNetworkHeaderReporter.VAULT()).to.equal(vault.address) - expect(await pNetworkHeaderReporter.HEADER_STORAGE()).to.equal(headerStorage.address) - }) - }) - - describe("reportHeaders()", function () { - it("Reports headers over pNetwork", async function () { - const { pNetworkHeaderReporter, pNetworkAdapter, vault, erc777Token, headerStorage } = await setup() - const blockIds = [0, 1] - const blocks = await Promise.all(blockIds.map((_id) => ethers.provider._getBlock(_id))) - const hashes = blocks.map((_block) => _block.hash) - const expectedUserData = new ethers.utils.AbiCoder().encode(["uint256[]", "bytes32[]"], [blockIds, hashes]) - await expect(pNetworkHeaderReporter.reportHeaders(blockIds, pNetworkAdapter.address)) - .to.emit(pNetworkHeaderReporter, "HeaderReported") - .withArgs(pNetworkHeaderReporter.address, blockIds[0], hashes[0]) - .and.to.emit(pNetworkHeaderReporter, "HeaderReported") - .withArgs(pNetworkHeaderReporter.address, blockIds[1], hashes[1]) - .and.to.emit(vault, "PegIn") - .withArgs( - erc777Token.address, - pNetworkHeaderReporter.address, - 1, - pNetworkAdapter.address.replace("0x", "").toLowerCase(), - expectedUserData, - "0x12345678", - "0x005fe7f9", - ) - expect(await headerStorage.headers(blockIds[0])).to.equal(hashes[0]) - expect(await headerStorage.headers(blockIds[1])).to.equal(hashes[1]) - }) - }) - }) - - describe("Host Network", () => { - const setup = async () => { - await resetNetwork() - const [wallet] = await ethers.getSigners() - const HeaderStorage = await ethers.getContractFactory("HeaderStorage") - const headerStorage = await HeaderStorage.deploy() - await deployErc1820Registry(wallet) - const PToken = await ethers.getContractFactory("PToken") - const pToken = await PToken.deploy("pToken", "P", []) - const anotherPToken = await PToken.deploy("Another ERC777 Token", "A777", []) - const Vault = await ethers.getContractFactory("MockVault") - const vault = await Vault.deploy() - await vault.initialize([pToken.address, anotherPToken.address], "0x12345678") - - const PNetworkHeaderReporter = await ethers.getContractFactory("PNetworkHeaderReporter") - const pNetworkHeaderReporter = await PNetworkHeaderReporter.deploy( - headerStorage.address, - DOMAIN_ID, - ZERO_ADDRESS, - pToken.address, - "0x005fe7f9", - ) - - await pToken.connect(wallet).send(pNetworkHeaderReporter.address, 10000, "0x") - - const PNetworkAdapter = await ethers.getContractFactory("PNetworkAdapter") - const pNetworkAdapter = await PNetworkAdapter.deploy( - DOMAIN_ID, - pNetworkHeaderReporter.address, - vault.address, - pNetworkHeaderReporter.address, - "0x005fe7f9", - ) - - return { - pToken, - anotherPToken, - vault, - wallet, - headerStorage, - pNetworkHeaderReporter, - pNetworkAdapter, - } - } - - describe("Deploy", function () { - it("Successfully deploys contract", async function () { - const { pNetworkHeaderReporter, pToken, headerStorage } = await setup() - expect(await pNetworkHeaderReporter.deployed()) - expect(await pNetworkHeaderReporter.TOKEN()).to.equal(pToken.address) - expect(await pNetworkHeaderReporter.VAULT()).to.equal(ZERO_ADDRESS) - expect(await pNetworkHeaderReporter.HEADER_STORAGE()).to.equal(headerStorage.address) - }) - }) - - describe("reportHeaders()", function () { - it("Reports headers over pNetwork", async function () { - const { pNetworkHeaderReporter, pNetworkAdapter, pToken, headerStorage } = await setup() - const blockIds = [0, 1] - const blocks = await Promise.all(blockIds.map((_id) => ethers.provider._getBlock(_id))) - const hashes = blocks.map((_block) => _block.hash) - const expectedUserData = new ethers.utils.AbiCoder().encode(["uint256[]", "bytes32[]"], [blockIds, hashes]) - await expect(pNetworkHeaderReporter.reportHeaders(blockIds, pNetworkAdapter.address)) - .to.emit(pNetworkHeaderReporter, "HeaderReported") - .withArgs(pNetworkHeaderReporter.address, blockIds[0], hashes[0]) - .and.to.emit(pNetworkHeaderReporter, "HeaderReported") - .withArgs(pNetworkHeaderReporter.address, blockIds[1], hashes[1]) - .and.to.emit(pToken, "Redeem") - .withArgs( - pNetworkHeaderReporter.address, - 1, - pNetworkAdapter.address.replace("0x", "").toLowerCase(), - expectedUserData, - "0x87654321", - "0x005fe7f9", - ) - expect(await headerStorage.headers(blockIds[0])).to.equal(hashes[0]) - expect(await headerStorage.headers(blockIds[1])).to.equal(hashes[1]) - }) - }) - }) -}) diff --git a/packages/evm/test/adapters/PNetwork/03_PNetworkAdapter.spec.ts b/packages/evm/test/adapters/PNetwork/03_PNetworkAdapter.spec.ts deleted file mode 100644 index 75012675..00000000 --- a/packages/evm/test/adapters/PNetwork/03_PNetworkAdapter.spec.ts +++ /dev/null @@ -1,320 +0,0 @@ -import { expect } from "chai" -import { ethers } from "hardhat" - -import { ZERO_ADDRESS, deployErc1820Registry, resetNetwork } from "./utils.spec" - -const REPORTER_ADDRESS = "0xd5e099c71b797516c10ed0f0d895f429c2781142" -const DOMAIN_ID = "0x0000000000000000000000000000000000000000000000000000000000001" -const ID_ONE = 1 -const ID_TWO = 2 -const HASH_ZERO = "0x0000000000000000000000000000000000000000000000000000000000000000" -const HASH_ONE = "0x0000000000000000000000000000000000000000000000000000000000000001" -const HASH_TWO = "0x0000000000000000000000000000000000000000000000000000000000000002" - -const encodeToMetadata = (userData: string, originChainId: string, sender: string, version = 3) => - new ethers.utils.AbiCoder().encode( - ["bytes1", "bytes", "bytes4", "address"], - [version, userData, originChainId, sender], - ) - -describe("PNetworkAdapter", function () { - describe("Host Blockchain", () => { - const setup = async () => { - await resetNetwork() - const [wallet] = await ethers.getSigners() - await deployErc1820Registry(wallet) - const PToken = await ethers.getContractFactory("PToken") - const pToken = await PToken.deploy("pToken", "P", []) - const PNetworkAdapter = await ethers.getContractFactory("PNetworkAdapter") - const pNetworkAdapter = await PNetworkAdapter.deploy( - DOMAIN_ID, - REPORTER_ADDRESS, - ZERO_ADDRESS, - pToken.address, - "0x005fe7f9", - ) - return { - wallet, - pNetworkAdapter, - pToken, - } - } - - describe("Constructor", function () { - it("Successfully deploys contract with correct state", async function () { - const { pNetworkAdapter, pToken } = await setup() - - expect(await pNetworkAdapter.deployed()) - expect(await pNetworkAdapter.TOKEN()).to.equal(pToken.address) - expect(await pNetworkAdapter.VAULT()).to.equal(ZERO_ADDRESS) - }) - }) - - describe("StoreHashes()", function () { - it("Should store hashes", async function () { - const { pNetworkAdapter, wallet, pToken } = await setup() - - const coder = new ethers.utils.AbiCoder() - const userData = coder.encode( - ["uint256[]", "bytes32[]"], - [ - [ID_ONE, ID_TWO], - [HASH_ONE, HASH_TWO], - ], - ) - const data = encodeToMetadata(userData, "0x005fe7f9", REPORTER_ADDRESS) - await pToken.connect(wallet).mint(pNetworkAdapter.address, 1000, data, "0x") - expect(await pNetworkAdapter.getHashFromOracle(DOMAIN_ID, ID_ONE)).to.equal(HASH_ONE) - expect(await pNetworkAdapter.getHashFromOracle(DOMAIN_ID, ID_TWO)).to.equal(HASH_TWO) - }) - - it("Should not store hashes when receiving another token", async function () { - const { pNetworkAdapter, wallet, pToken } = await setup() - - const PToken = await ethers.getContractFactory("PToken") - const fakePToken = await PToken.deploy("pToken", "P", []) - - const coder = new ethers.utils.AbiCoder() - const userData = coder.encode( - ["uint256[]", "bytes32[]"], - [ - [ID_ONE, ID_TWO], - [HASH_ONE, HASH_TWO], - ], - ) - const data = encodeToMetadata(userData, "0x005fe7f9", REPORTER_ADDRESS) - await expect(fakePToken.connect(wallet).mint(pNetworkAdapter.address, 1000, data, "0x")) - .to.be.revertedWithCustomError(pNetworkAdapter, "InvalidToken") - .withArgs(fakePToken.address, pToken.address) - expect(await pNetworkAdapter.getHashFromOracle(DOMAIN_ID, ID_ONE)).to.equal(HASH_ZERO) - expect(await pNetworkAdapter.getHashFromOracle(DOMAIN_ID, ID_TWO)).to.equal(HASH_ZERO) - }) - - it("Should not store hashes when tokens are not minted", async function () { - const { pNetworkAdapter, wallet, pToken } = await setup() - - const coder = new ethers.utils.AbiCoder() - const userData = coder.encode( - ["uint256[]", "bytes32[]"], - [ - [ID_ONE, ID_TWO], - [HASH_ONE, HASH_TWO], - ], - ) - const data = encodeToMetadata(userData, "0x005fe7f9", REPORTER_ADDRESS) - await expect(pToken.connect(wallet).send(pNetworkAdapter.address, 1000, data)) - .to.be.revertedWithCustomError(pNetworkAdapter, "InvalidSender") - .withArgs(wallet.address, ZERO_ADDRESS) - expect(await pNetworkAdapter.getHashFromOracle(DOMAIN_ID, ID_ONE)).to.equal(HASH_ZERO) - expect(await pNetworkAdapter.getHashFromOracle(DOMAIN_ID, ID_TWO)).to.equal(HASH_ZERO) - }) - - it("Overwrites previous hashes", async function () { - const { pNetworkAdapter, wallet, pToken } = await setup() - const coder = new ethers.utils.AbiCoder() - let userData = coder.encode( - ["uint256[]", "bytes32[]"], - [ - [ID_ONE, ID_TWO], - [HASH_ONE, HASH_TWO], - ], - ) - let data = encodeToMetadata(userData, "0x005fe7f9", REPORTER_ADDRESS) - await pToken.connect(wallet).mint(pNetworkAdapter.address, 1000, data, "0x") - expect(await pNetworkAdapter.getHashFromOracle(DOMAIN_ID, ID_ONE)).to.equal(HASH_ONE) - expect(await pNetworkAdapter.getHashFromOracle(DOMAIN_ID, ID_TWO)).to.equal(HASH_TWO) - userData = coder.encode( - ["uint256[]", "bytes32[]"], - [ - [ID_TWO, ID_ONE], - [HASH_ONE, HASH_TWO], - ], - ) - data = encodeToMetadata(userData, "0x005fe7f9", REPORTER_ADDRESS) - await pToken.connect(wallet).mint(pNetworkAdapter.address, 1000, data, "0x") - expect(await pNetworkAdapter.getHashFromOracle(DOMAIN_ID, ID_ONE)).to.equal(HASH_TWO) - expect(await pNetworkAdapter.getHashFromOracle(DOMAIN_ID, ID_TWO)).to.equal(HASH_ONE) - }) - - it("Returns 0 if no header is stored", async function () { - const { pNetworkAdapter } = await setup() - expect(await pNetworkAdapter.getHashFromOracle(DOMAIN_ID, ID_ONE)).to.equal(HASH_ZERO) - }) - }) - }) - - describe("Native Blockchain", () => { - const setup = async () => { - await resetNetwork() - const [wallet] = await ethers.getSigners() - await deployErc1820Registry(wallet) - const ERC777Token = await ethers.getContractFactory("ERC777Token") - const erc777Token = await ERC777Token.deploy("ERC777 Token", "E777", []) - const anotherErc777Token = await ERC777Token.deploy("Another ERC777 Token", "A777", []) - const Vault = await ethers.getContractFactory("MockVault") - const vault = await Vault.deploy() - await vault.initialize([erc777Token.address, anotherErc777Token.address], "0x12345678") - - const PNetworkAdapter = await ethers.getContractFactory("PNetworkAdapter") - const pNetworkAdapter = await PNetworkAdapter.deploy( - DOMAIN_ID, - REPORTER_ADDRESS, - vault.address, - erc777Token.address, - "0x005fe7f9", - ) - - const coder = new ethers.utils.AbiCoder() - const data = coder.encode( - ["bytes32", "string", "bytes4"], - [ethers.utils.keccak256(ethers.utils.toUtf8Bytes("ERC777-pegIn")), "destination-address", "0x87654321"], - ) - await expect(erc777Token.connect(wallet).send(vault.address, 100, data)).to.emit(vault, "PegIn") - await expect(anotherErc777Token.connect(wallet).send(vault.address, 100, data)).to.emit(vault, "PegIn") - return { - wallet, - vault, - pNetworkAdapter, - erc777Token, - anotherErc777Token, - } - } - - describe("Constructor", function () { - it("Successfully deploys contract with correct state", async function () { - const { pNetworkAdapter, erc777Token, vault } = await setup() - expect(await pNetworkAdapter.deployed()) - expect(await pNetworkAdapter.TOKEN()).to.equal(erc777Token.address) - expect(await pNetworkAdapter.VAULT()).to.equal(vault.address) - }) - }) - - describe("StoreHashes()", function () { - it("Stores hashes", async function () { - const { pNetworkAdapter, wallet, vault, erc777Token } = await setup() - - const coder = new ethers.utils.AbiCoder() - const userData = coder.encode( - ["uint256[]", "bytes32[]"], - [ - [ID_ONE, ID_TWO], - [HASH_ONE, HASH_TWO], - ], - ) - const data = encodeToMetadata(userData, "0x005fe7f9", REPORTER_ADDRESS) - await vault.connect(wallet).pegOut(pNetworkAdapter.address, erc777Token.address, 100, data) - expect(await pNetworkAdapter.getHashFromOracle(DOMAIN_ID, ID_ONE)).to.equal(HASH_ONE) - expect(await pNetworkAdapter.getHashFromOracle(DOMAIN_ID, ID_TWO)).to.equal(HASH_TWO) - }) - - it("Should not store hashes when receiving another token", async function () { - const { pNetworkAdapter, wallet, vault, erc777Token, anotherErc777Token } = await setup() - - const coder = new ethers.utils.AbiCoder() - const userData = coder.encode( - ["uint256[]", "bytes32[]"], - [ - [ID_ONE, ID_TWO], - [HASH_ONE, HASH_TWO], - ], - ) - const data = encodeToMetadata(userData, "0x005fe7f9", REPORTER_ADDRESS) - await expect(vault.connect(wallet).pegOut(pNetworkAdapter.address, anotherErc777Token.address, 100, data)) - .to.be.revertedWithCustomError(pNetworkAdapter, "InvalidToken") - .withArgs(anotherErc777Token.address, erc777Token.address) - expect(await pNetworkAdapter.getHashFromOracle(DOMAIN_ID, ID_ONE)).to.equal(HASH_ZERO) - expect(await pNetworkAdapter.getHashFromOracle(DOMAIN_ID, ID_TWO)).to.equal(HASH_ZERO) - }) - - it("Should not store hashes when tokens are not sent by the vault", async function () { - const { pNetworkAdapter, wallet, erc777Token, vault } = await setup() - - const coder = new ethers.utils.AbiCoder() - const userData = coder.encode( - ["uint256[]", "bytes32[]"], - [ - [ID_ONE, ID_TWO], - [HASH_ONE, HASH_TWO], - ], - ) - const data = encodeToMetadata(userData, "0x005fe7f9", REPORTER_ADDRESS) - await expect(erc777Token.connect(wallet).send(pNetworkAdapter.address, 100, data)) - .to.be.revertedWithCustomError(pNetworkAdapter, "InvalidSender") - .withArgs(wallet.address, vault.address) - expect(await pNetworkAdapter.getHashFromOracle(DOMAIN_ID, ID_ONE)).to.equal(HASH_ZERO) - expect(await pNetworkAdapter.getHashFromOracle(DOMAIN_ID, ID_TWO)).to.equal(HASH_ZERO) - }) - - it("Should not store hashes when data is received from another chain", async function () { - const { pNetworkAdapter, wallet, vault, erc777Token } = await setup() - - const coder = new ethers.utils.AbiCoder() - const userData = coder.encode( - ["uint256[]", "bytes32[]"], - [ - [ID_ONE, ID_TWO], - [HASH_ONE, HASH_TWO], - ], - ) - const data = encodeToMetadata(userData, "0x00e4b170", REPORTER_ADDRESS) - await expect(vault.connect(wallet).pegOut(pNetworkAdapter.address, erc777Token.address, 100, data)) - .to.be.revertedWithCustomError(pNetworkAdapter, "InvalidNetworkId") - .withArgs("0x00e4b170", "0x005fe7f9") - expect(await pNetworkAdapter.getHashFromOracle(DOMAIN_ID, ID_ONE)).to.equal(HASH_ZERO) - expect(await pNetworkAdapter.getHashFromOracle(DOMAIN_ID, ID_TWO)).to.equal(HASH_ZERO) - }) - - it("Should not store hashes when data originated from another address", async function () { - const { pNetworkAdapter, wallet, vault, erc777Token } = await setup() - const WRONG_REPORTER_ADDRESS = "0xa5e099c71b797516c10ed0f0d895f429c2781142" - - const coder = new ethers.utils.AbiCoder() - const userData = coder.encode( - ["uint256[]", "bytes32[]"], - [ - [ID_ONE, ID_TWO], - [HASH_ONE, HASH_TWO], - ], - ) - const data = encodeToMetadata(userData, "0x005fe7f9", WRONG_REPORTER_ADDRESS) - await expect(vault.connect(wallet).pegOut(pNetworkAdapter.address, erc777Token.address, 100, data)) - .to.be.revertedWithCustomError(pNetworkAdapter, "UnauthorizedPNetworkReceive") - .withArgs() - expect(await pNetworkAdapter.getHashFromOracle(DOMAIN_ID, ID_ONE)).to.equal(HASH_ZERO) - expect(await pNetworkAdapter.getHashFromOracle(DOMAIN_ID, ID_TWO)).to.equal(HASH_ZERO) - }) - - it("Overwrites previous hashes", async function () { - const { pNetworkAdapter, wallet, erc777Token, vault } = await setup() - const coder = new ethers.utils.AbiCoder() - let userData = coder.encode( - ["uint256[]", "bytes32[]"], - [ - [ID_ONE, ID_TWO], - [HASH_ONE, HASH_TWO], - ], - ) - let data = encodeToMetadata(userData, "0x005fe7f9", REPORTER_ADDRESS) - await vault.connect(wallet).pegOut(pNetworkAdapter.address, erc777Token.address, 50, data) - expect(await pNetworkAdapter.getHashFromOracle(DOMAIN_ID, ID_ONE)).to.equal(HASH_ONE) - expect(await pNetworkAdapter.getHashFromOracle(DOMAIN_ID, ID_TWO)).to.equal(HASH_TWO) - userData = coder.encode( - ["uint256[]", "bytes32[]"], - [ - [ID_TWO, ID_ONE], - [HASH_ONE, HASH_TWO], - ], - ) - data = encodeToMetadata(userData, "0x005fe7f9", REPORTER_ADDRESS) - await vault.connect(wallet).pegOut(pNetworkAdapter.address, erc777Token.address, 50, data) - expect(await pNetworkAdapter.getHashFromOracle(DOMAIN_ID, ID_ONE)).to.equal(HASH_TWO) - expect(await pNetworkAdapter.getHashFromOracle(DOMAIN_ID, ID_TWO)).to.equal(HASH_ONE) - }) - - it("Returns 0 if no header is stored", async function () { - const { pNetworkAdapter } = await setup() - expect(await pNetworkAdapter.getHashFromOracle(DOMAIN_ID, ID_ONE)).to.equal(HASH_ZERO) - }) - }) - }) -}) diff --git a/packages/evm/test/adapters/PNetwork/utils.spec.ts b/packages/evm/test/adapters/PNetwork/utils.spec.ts deleted file mode 100644 index ad1cadfb..00000000 --- a/packages/evm/test/adapters/PNetwork/utils.spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers" -import { ethers, network } from "hardhat" - -const ERC1820_DEPLOYER = "0xa990077c3205cbDf861e17Fa532eeB069cE9fF96" -const ERC1820_PAYLOAD = - "0xf90a388085174876e800830c35008080b909e5608060405234801561001057600080fd5b506109c5806100206000396000f3fe608060405234801561001057600080fd5b50600436106100a5576000357c010000000000000000000000000000000000000000000000000000000090048063a41e7d5111610078578063a41e7d51146101d4578063aabbb8ca1461020a578063b705676514610236578063f712f3e814610280576100a5565b806329965a1d146100aa5780633d584063146100e25780635df8122f1461012457806365ba36c114610152575b600080fd5b6100e0600480360360608110156100c057600080fd5b50600160a060020a038135811691602081013591604090910135166102b6565b005b610108600480360360208110156100f857600080fd5b5035600160a060020a0316610570565b60408051600160a060020a039092168252519081900360200190f35b6100e06004803603604081101561013a57600080fd5b50600160a060020a03813581169160200135166105bc565b6101c26004803603602081101561016857600080fd5b81019060208101813564010000000081111561018357600080fd5b82018360208201111561019557600080fd5b803590602001918460018302840111640100000000831117156101b757600080fd5b5090925090506106b3565b60408051918252519081900360200190f35b6100e0600480360360408110156101ea57600080fd5b508035600160a060020a03169060200135600160e060020a0319166106ee565b6101086004803603604081101561022057600080fd5b50600160a060020a038135169060200135610778565b61026c6004803603604081101561024c57600080fd5b508035600160a060020a03169060200135600160e060020a0319166107ef565b604080519115158252519081900360200190f35b61026c6004803603604081101561029657600080fd5b508035600160a060020a03169060200135600160e060020a0319166108aa565b6000600160a060020a038416156102cd57836102cf565b335b9050336102db82610570565b600160a060020a031614610339576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420746865206d616e616765720000000000000000000000000000000000604482015290519081900360640190fd5b6103428361092a565b15610397576040805160e560020a62461bcd02815260206004820152601a60248201527f4d757374206e6f7420626520616e204552433136352068617368000000000000604482015290519081900360640190fd5b600160a060020a038216158015906103b85750600160a060020a0382163314155b156104ff5760405160200180807f455243313832305f4143434550545f4d4147494300000000000000000000000081525060140190506040516020818303038152906040528051906020012082600160a060020a031663249cb3fa85846040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083815260200182600160a060020a0316600160a060020a031681526020019250505060206040518083038186803b15801561047e57600080fd5b505afa158015610492573d6000803e3d6000fd5b505050506040513d60208110156104a857600080fd5b5051146104ff576040805160e560020a62461bcd02815260206004820181905260248201527f446f6573206e6f7420696d706c656d656e742074686520696e74657266616365604482015290519081900360640190fd5b600160a060020a03818116600081815260208181526040808320888452909152808220805473ffffffffffffffffffffffffffffffffffffffff19169487169485179055518692917f93baa6efbd2244243bfee6ce4cfdd1d04fc4c0e9a786abd3a41313bd352db15391a450505050565b600160a060020a03818116600090815260016020526040812054909116151561059a5750806105b7565b50600160a060020a03808216600090815260016020526040902054165b919050565b336105c683610570565b600160a060020a031614610624576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420746865206d616e616765720000000000000000000000000000000000604482015290519081900360640190fd5b81600160a060020a031681600160a060020a0316146106435780610646565b60005b600160a060020a03838116600081815260016020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169585169590951790945592519184169290917f605c2dbf762e5f7d60a546d42e7205dcb1b011ebc62a61736a57c9089d3a43509190a35050565b600082826040516020018083838082843780830192505050925050506040516020818303038152906040528051906020012090505b92915050565b6106f882826107ef565b610703576000610705565b815b600160a060020a03928316600081815260208181526040808320600160e060020a031996909616808452958252808320805473ffffffffffffffffffffffffffffffffffffffff19169590971694909417909555908152600284528181209281529190925220805460ff19166001179055565b600080600160a060020a038416156107905783610792565b335b905061079d8361092a565b156107c357826107ad82826108aa565b6107b85760006107ba565b815b925050506106e8565b600160a060020a0390811660009081526020818152604080832086845290915290205416905092915050565b6000808061081d857f01ffc9a70000000000000000000000000000000000000000000000000000000061094c565b909250905081158061082d575080155b1561083d576000925050506106e8565b61084f85600160e060020a031961094c565b909250905081158061086057508015155b15610870576000925050506106e8565b61087a858561094c565b909250905060018214801561088f5750806001145b1561089f576001925050506106e8565b506000949350505050565b600160a060020a0382166000908152600260209081526040808320600160e060020a03198516845290915281205460ff1615156108f2576108eb83836107ef565b90506106e8565b50600160a060020a03808316600081815260208181526040808320600160e060020a0319871684529091529020549091161492915050565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff161590565b6040517f01ffc9a7000000000000000000000000000000000000000000000000000000008082526004820183905260009182919060208160248189617530fa90519096909550935050505056fea165627a7a72305820377f4a2d4301ede9949f163f319021a6e9c687c292a5e2b2c4734c126b524e6c00291ba01820182018201820182018201820182018201820182018201820182018201820a01820182018201820182018201820182018201820182018201820182018201820" - -export const ZERO_ADDRESS = "0x0000000000000000000000000000000000000000" - -export const resetNetwork = async () => { - await network.provider.request({ method: "hardhat_reset", params: [] }) -} - -export const deployErc1820Registry = async (wallet: SignerWithAddress) => { - // deploy erc1820 registry - await ethers.provider.send("eth_sendTransaction", [ - { - from: wallet.address, - to: ERC1820_DEPLOYER, - value: "0x11c37937e080000", - }, - ]) - await ethers.provider.send("eth_sendRawTransaction", [ERC1820_PAYLOAD]) -} diff --git a/packages/evm/test/adapters/Sygma/01_SygmaAdapter.spec.ts b/packages/evm/test/adapters/Sygma/01_SygmaAdapter.spec.ts deleted file mode 100644 index d5ada782..00000000 --- a/packages/evm/test/adapters/Sygma/01_SygmaAdapter.spec.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { expect } from "chai" -import { ethers, network } from "hardhat" - -const DOMAIN_ID = 5 -const ID_ONE = 1 -const ID_TWO = 2 -const HASH_ONE = "0x0000000000000000000000000000000000000000000000000000000000000001" -const HASH_TWO = "0x0000000000000000000000000000000000000000000000000000000000000002" - -const setup = async () => { - await network.provider.request({ method: "hardhat_reset", params: [] }) - const signers = await ethers.getSigners() - const admin = signers[0] - const reporter = signers[1] - const handler = signers[2] - const otherAddress = signers[3] - const SygmaAdapter = await ethers.getContractFactory("SygmaAdapter") - const sygmaAdapter = await SygmaAdapter.deploy(handler.address) - return { - admin, - reporter, - handler, - otherAddress, - sygmaAdapter, - } -} - -describe("SygmaAdapter", function () { - describe("Constructor", function () { - it("Successfully deploys contract with correct state", async function () { - const { handler, sygmaAdapter } = await setup() - expect(await sygmaAdapter.deployed()) - expect(await sygmaAdapter._handler()).to.equal(handler.address) - }) - }) - - describe("setReporter()", function () { - it("Enables the reporter and sets its chainID", async function () { - const { reporter, sygmaAdapter } = await setup() - expect(await sygmaAdapter.deployed()) - await expect(sygmaAdapter.setReporter(reporter.address, DOMAIN_ID, true)) - .to.emit(sygmaAdapter, "ReporterSet") - .withArgs(reporter.address, DOMAIN_ID, true) - const result = await sygmaAdapter.reporters(reporter.address) - expect(result[0].toNumber()).to.equal(DOMAIN_ID) - expect(result[1]).to.equal(true) - }) - - it("Disables the reporter", async function () { - const { reporter, sygmaAdapter } = await setup() - expect(await sygmaAdapter.deployed()) - await expect(sygmaAdapter.setReporter(reporter.address, DOMAIN_ID, true)) - .to.emit(sygmaAdapter, "ReporterSet") - .withArgs(reporter.address, DOMAIN_ID, true) - let result = await sygmaAdapter.reporters(reporter.address) - expect(result[1]).to.equal(true) - await expect(sygmaAdapter.setReporter(reporter.address, DOMAIN_ID, false)) - .to.emit(sygmaAdapter, "ReporterSet") - .withArgs(reporter.address, DOMAIN_ID, false) - result = await sygmaAdapter.reporters(reporter.address) - expect(result[1]).to.equal(false) - }) - - it("Doesn't set the reporter if the sender is unauthorized", async function () { - const { reporter, sygmaAdapter, otherAddress } = await setup() - expect(await sygmaAdapter.deployed()) - await expect( - sygmaAdapter.connect(otherAddress).setReporter(reporter.address, DOMAIN_ID, true), - ).to.be.revertedWithCustomError(sygmaAdapter, "Unauthorized") - }) - }) - - describe("StoreHashes()", function () { - it("Stores hashes", async function () { - const { handler, reporter, sygmaAdapter } = await setup() - await expect(sygmaAdapter.setReporter(reporter.address, DOMAIN_ID, true)) - .to.emit(sygmaAdapter, "ReporterSet") - .withArgs(reporter.address, DOMAIN_ID, true) - await expect(sygmaAdapter.connect(handler).storeHashes(reporter.address, [ID_ONE, ID_TWO], [HASH_ONE, HASH_TWO])) - .to.emit(sygmaAdapter, "HashStored") - .withArgs(ID_ONE, HASH_ONE) - .and.to.emit(sygmaAdapter, "HashStored") - .withArgs(ID_TWO, HASH_TWO) - expect(await sygmaAdapter.getHashFromOracle(DOMAIN_ID, ID_ONE)).to.equal(HASH_ONE) - }) - - it("Reverts if array lengths mismatch", async function () { - const { handler, reporter, sygmaAdapter } = await setup() - await expect(sygmaAdapter.setReporter(reporter.address, DOMAIN_ID, true)) - .to.emit(sygmaAdapter, "ReporterSet") - .withArgs(reporter.address, DOMAIN_ID, true) - await expect( - sygmaAdapter.connect(handler).storeHashes(reporter.address, [ID_ONE, ID_TWO], [HASH_ONE]), - ).to.be.revertedWithCustomError(sygmaAdapter, "ArrayLengthMismatch") - }) - - it("Reverts if sender is not the authorized handler", async function () { - const { otherAddress, reporter, sygmaAdapter } = await setup() - await expect(sygmaAdapter.setReporter(reporter.address, DOMAIN_ID, true)) - .to.emit(sygmaAdapter, "ReporterSet") - .withArgs(reporter.address, DOMAIN_ID, true) - await expect( - sygmaAdapter.connect(otherAddress).storeHashes(reporter.address, [ID_ONE, ID_TWO], [HASH_ONE, HASH_TWO]), - ) - .to.be.revertedWithCustomError(sygmaAdapter, "InvalidHandler") - .withArgs(otherAddress.address) - }) - - it("Reverts if the reporter is not enabled", async function () { - const { handler, reporter, sygmaAdapter } = await setup() - await expect(sygmaAdapter.connect(handler).storeHashes(reporter.address, [ID_ONE, ID_TWO], [HASH_ONE, HASH_TWO])) - .to.be.revertedWithCustomError(sygmaAdapter, "InvalidReporter") - .withArgs(reporter.address) - }) - - it("Overwrites previous hashes", async function () { - const { handler, reporter, sygmaAdapter } = await setup() - await expect(sygmaAdapter.setReporter(reporter.address, DOMAIN_ID, true)) - .to.emit(sygmaAdapter, "ReporterSet") - .withArgs(reporter.address, DOMAIN_ID, true) - await expect(sygmaAdapter.connect(handler).storeHashes(reporter.address, [ID_ONE, ID_TWO], [HASH_ONE, HASH_TWO])) - .to.emit(sygmaAdapter, "HashStored") - .withArgs(ID_ONE, HASH_ONE) - .and.to.emit(sygmaAdapter, "HashStored") - .withArgs(ID_TWO, HASH_TWO) - expect(await sygmaAdapter.getHashFromOracle(DOMAIN_ID, ID_ONE)).to.equal(HASH_ONE) - expect(await sygmaAdapter.getHashFromOracle(DOMAIN_ID, ID_TWO)).to.equal(HASH_TWO) - - await expect(sygmaAdapter.connect(handler).storeHashes(reporter.address, [ID_ONE, ID_TWO], [HASH_TWO, HASH_ONE])) - .to.emit(sygmaAdapter, "HashStored") - .withArgs(ID_ONE, HASH_TWO) - .and.to.emit(sygmaAdapter, "HashStored") - .withArgs(ID_TWO, HASH_ONE) - expect(await sygmaAdapter.getHashFromOracle(DOMAIN_ID, ID_ONE)).to.equal(HASH_TWO) - expect(await sygmaAdapter.getHashFromOracle(DOMAIN_ID, ID_TWO)).to.equal(HASH_ONE) - }) - }) -}) diff --git a/packages/evm/test/adapters/Sygma/02_SygmaHeaderReporter.spec.ts b/packages/evm/test/adapters/Sygma/02_SygmaHeaderReporter.spec.ts deleted file mode 100644 index f41de8ce..00000000 --- a/packages/evm/test/adapters/Sygma/02_SygmaHeaderReporter.spec.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { mine } from "@nomicfoundation/hardhat-network-helpers" -import { expect } from "chai" -import { ethers, network } from "hardhat" - -const DOMAIN_ID = 5 -const resourceID = "0x0000000000000000000000000000000000000000000000000000000000000500" - -const setup = async () => { - await network.provider.request({ method: "hardhat_reset", params: [] }) - const signers = await ethers.getSigners() - const adapter = signers[1].address - const otherAddress = signers[2].address - const HeaderStorage = await ethers.getContractFactory("HeaderStorage") - const headerStorage = await HeaderStorage.deploy() - const SygmaBridge = await ethers.getContractFactory("MockSygmaBridge") - const sygmaBridge = await SygmaBridge.deploy() - const SygmaHeaderReporter = await ethers.getContractFactory("SygmaHeaderReporter") - // IBridge bridge, HeaderStorage headerStorage, bytes32 resourceID, uint8 defaultDestinationDomainID, address defaultSygmaAdapter - const sygmaHeaderReporter = await SygmaHeaderReporter.deploy( - sygmaBridge.address, - headerStorage.address, - resourceID, - DOMAIN_ID, - adapter, - ) - await mine(10) - return { - adapter, - otherAddress, - headerStorage, - sygmaBridge, - sygmaHeaderReporter, - } -} - -const prepareDepositData = async (reporterAddress: string, ids: string[], hashes: string[], adapter: string) => { - const abiCoder = ethers.utils.defaultAbiCoder - const executionData = abiCoder - .encode(["address", "uint256[]", "bytes32[]"], [ethers.constants.AddressZero, ids, hashes]) - .substring(66) - - const SygmaAdapter = await ethers.getContractFactory("SygmaAdapter") - const functionSig = SygmaAdapter.interface.getSighash("storeHashes") - - // bytes memory depositData = abi.encodePacked( - // uint256(0), - // uint16(4), - // IDepositAdapterTarget(address(0)).execute.selector, - // uint8(20), - // _targetDepositAdapter, - // uint8(20), - // _depositorAddress, - // abi.encode(depositContractCalldata) - // ); - - const depositData = - ethers.utils.hexZeroPad("0xe7ef0", 32) + - "0004" + - functionSig.substring(2) + - "14" + - adapter.toLowerCase().substring(2) + - "14" + - reporterAddress.toLowerCase().substring(2) + - executionData - return depositData -} - -describe("SygmaHeaderReporter", function () { - describe("Deploy", function () { - it("Successfully deploys contract", async function () { - const { sygmaBridge, headerStorage, adapter, sygmaHeaderReporter } = await setup() - expect(await sygmaHeaderReporter.deployed()) - expect(await sygmaHeaderReporter._bridge()).to.equal(sygmaBridge.address) - expect(await sygmaHeaderReporter._headerStorage()).to.equal(headerStorage.address) - expect(await sygmaHeaderReporter._resourceID()).to.equal(resourceID) - expect(await sygmaHeaderReporter._defaultDestinationDomainID()).to.equal(DOMAIN_ID) - expect(await sygmaHeaderReporter._defaultSygmaAdapter()).to.equal(adapter) - }) - }) - - describe("reportHeaders()", function () { - it("Reports headers to Sygma to default domain", async function () { - const { sygmaHeaderReporter, adapter, sygmaBridge, headerStorage } = await setup() - const block = await ethers.provider._getBlock(9) - const block2 = await ethers.provider._getBlock(8) - const depositData = await prepareDepositData( - sygmaHeaderReporter.address, - [9, 8], - [block.hash, block2.hash], - adapter, - ) - - await expect(sygmaHeaderReporter.reportHeaders([9, 8], "0x00")) - .to.emit(sygmaHeaderReporter, "HeaderReported") - .withArgs(sygmaHeaderReporter.address, 9, block.hash) - .and.to.emit(sygmaHeaderReporter, "HeaderReported") - .withArgs(sygmaHeaderReporter.address, 8, block2.hash) - .and.to.emit(sygmaBridge, "Deposit") - // (destinationDomainID, resourceID, 1, msg.sender, depositData, feeData); - .withArgs(DOMAIN_ID, resourceID, 1, sygmaHeaderReporter.address, depositData, "0x00") - expect(await headerStorage.headers(9)).to.equal(block.hash) - expect(await headerStorage.headers(8)).to.equal(block2.hash) - }) - }) - - describe("reportHeadersToDomain()", function () { - it("Reports headers to Sygma to specified domain", async function () { - const { sygmaHeaderReporter, otherAddress, sygmaBridge, headerStorage } = await setup() - const otherDomain = 4 - const block = await ethers.provider._getBlock(9) - const block2 = await ethers.provider._getBlock(8) - const depositData = await prepareDepositData( - sygmaHeaderReporter.address, - [9, 8], - [block.hash, block2.hash], - otherAddress, - ) - - await expect(sygmaHeaderReporter.reportHeadersToDomain([9, 8], otherAddress, otherDomain, "0x00")) - .to.emit(sygmaHeaderReporter, "HeaderReported") - .withArgs(sygmaHeaderReporter.address, 9, block.hash) - .and.to.emit(sygmaHeaderReporter, "HeaderReported") - .withArgs(sygmaHeaderReporter.address, 8, block2.hash) - .and.to.emit(sygmaBridge, "Deposit") - // (destinationDomainID, resourceID, 1, msg.sender, depositData, feeData); - .withArgs(otherDomain, resourceID, 1, sygmaHeaderReporter.address, depositData, "0x00") - expect(await headerStorage.headers(9)).to.equal(block.hash) - expect(await headerStorage.headers(8)).to.equal(block2.hash) - }) - }) -}) diff --git a/packages/evm/test/adapters/Sygma/03_SygmaMessageRelay.spec.ts b/packages/evm/test/adapters/Sygma/03_SygmaMessageRelay.spec.ts deleted file mode 100644 index bc26eacb..00000000 --- a/packages/evm/test/adapters/Sygma/03_SygmaMessageRelay.spec.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { expect } from "chai" -import { ethers, network } from "hardhat" - -const DOMAIN_ID = 5 -const resourceID = "0x0000000000000000000000000000000000000000000000000000000000000500" - -const setup = async () => { - await network.provider.request({ method: "hardhat_reset", params: [] }) - const signers = await ethers.getSigners() - const sender = signers[0].address - const otherAddress = signers[2].address - const Yaho = await ethers.getContractFactory("Yaho") - const yaho = await Yaho.deploy() - const SygmaBridge = await ethers.getContractFactory("MockSygmaBridge") - const sygmaBridge = await SygmaBridge.deploy() - const SygmaMessageRelay = await ethers.getContractFactory("SygmaMessageRelay") - const SygmaAdapter = await ethers.getContractFactory("SygmaAdapter") - const sygmaAdapter = await SygmaAdapter.deploy(sygmaBridge.address) - // IBridge bridge, HeaderStorage headerStorage, bytes32 resourceID, uint8 defaultDestinationDomainID, address defaultSygmaAdapter - const sygmaMessageRelay = await SygmaMessageRelay.deploy( - sygmaBridge.address, - yaho.address, - resourceID, - DOMAIN_ID, - sygmaAdapter.address, - ) - - await sygmaAdapter.setReporter(sygmaMessageRelay.address, DOMAIN_ID, true) - - const PingPong = await ethers.getContractFactory("PingPong") - const pingPong = await PingPong.deploy() - const message_1 = { - to: pingPong.address, - toChainId: 1, - data: pingPong.interface.getSighash("ping"), - } - await yaho.dispatchMessages([message_1, message_1]) - // await mine(10) - return { - sender, - sygmaAdapter, - otherAddress, - yaho, - sygmaBridge, - sygmaMessageRelay, - pingPong, - message_1, - } -} - -const prepareDepositData = async (reporterAddress: string, ids: string[], hashes: string[], adapter: string) => { - const abiCoder = ethers.utils.defaultAbiCoder - const executionData = abiCoder - .encode(["address", "uint256[]", "bytes32[]"], [ethers.constants.AddressZero, ids, hashes]) - .substring(66) - - const SygmaAdapter = await ethers.getContractFactory("SygmaAdapter") - const functionSig = SygmaAdapter.interface.getSighash("storeHashes") - - // bytes memory depositData = abi.encodePacked( - // uint256(0), - // uint16(4), - // IDepositAdapterTarget(address(0)).execute.selector, - // uint8(20), - // _targetDepositAdapter, - // uint8(20), - // _depositorAddress, - // abi.encode(depositContractCalldata) - // ); - - const depositData = - ethers.utils.hexZeroPad("0xe7ef0", 32) + - "0004" + - functionSig.substring(2) + - "14" + - adapter.toLowerCase().substring(2) + - "14" + - reporterAddress.toLowerCase().substring(2) + - executionData - return depositData -} - -describe("SygmaMessageRelay", function () { - describe("Deploy", function () { - it("Successfully deploys contract", async function () { - const { sygmaBridge, yaho, sygmaAdapter, sygmaMessageRelay } = await setup() - expect(await sygmaMessageRelay.deployed()) - expect(await sygmaMessageRelay._bridge()).to.equal(sygmaBridge.address) - expect(await sygmaMessageRelay._yaho()).to.equal(yaho.address) - expect(await sygmaMessageRelay._resourceID()).to.equal(resourceID) - expect(await sygmaMessageRelay._defaultDestinationDomainID()).to.equal(DOMAIN_ID) - expect(await sygmaMessageRelay._defaultSygmaAdapter()).to.equal(sygmaAdapter.address) - }) - }) - - describe("relayMessages()", function () { - it("Relays messages to Sygma to default domain", async function () { - const { sender, sygmaMessageRelay, sygmaAdapter, sygmaBridge, yaho, message_1 } = await setup() - const hash0 = await yaho.calculateHash(network.config.chainId, 0, yaho.address, sender, message_1) - const hash1 = await yaho.calculateHash(network.config.chainId, 1, yaho.address, sender, message_1) - const depositData = await prepareDepositData( - sygmaMessageRelay.address, - ["0", "1"], - [hash0, hash1], - sygmaAdapter.address, - ) - expect(await sygmaMessageRelay.callStatic.relayMessages([0, 1], sygmaAdapter.address)).to.equal( - "0x0000000000000000000000000000000000000000000000000000000000000001", - ) - await expect(sygmaMessageRelay.relayMessages([0, 1], sygmaAdapter.address)) - .to.emit(sygmaMessageRelay, "MessageRelayed") - .withArgs(sygmaMessageRelay.address, 0) - .and.to.emit(sygmaMessageRelay, "MessageRelayed") - .withArgs(sygmaMessageRelay.address, 1) - .and.to.emit(sygmaBridge, "Deposit") - // (destinationDomainID, resourceID, 1, msg.sender, depositData, feeData); - .withArgs(DOMAIN_ID, resourceID, 1, sygmaMessageRelay.address, depositData, "0x") - }) - }) -}) diff --git a/packages/evm/test/adapters/Sygma/04_Sygma_E2E.spec.ts b/packages/evm/test/adapters/Sygma/04_Sygma_E2E.spec.ts deleted file mode 100644 index 368ba917..00000000 --- a/packages/evm/test/adapters/Sygma/04_Sygma_E2E.spec.ts +++ /dev/null @@ -1,116 +0,0 @@ -/* -Note that these E2E tests simulate cross-chain interactions but, -for the sake of convenience, use only one network as both the origin and destination chain. - -*/ -import { expect } from "chai" -import { ethers, network } from "hardhat" - -// Source chain ID -const CHAIN_ID = network.config.chainId -// Destination domain ID -const DOMAIN_ID = 5 -const resourceID = "0x0000000000000000000000000000000000000000000000000000000000000500" - -const ID_ZERO = 0 - -const baseSetup = async () => { - const [wallet] = await ethers.getSigners() - - // deploy hashi - const Hashi = await ethers.getContractFactory("Hashi") - const hashi = await Hashi.deploy() - - // deploy ShoyuBashi - const ShoyuBashi = await ethers.getContractFactory("ShoyuBashi") - const shoyuBashi = ShoyuBashi.deploy(wallet.address, hashi.address) - - // deploy Yaho - const Yaho = await ethers.getContractFactory("Yaho") - const yaho = await Yaho.deploy() - - // deploy Mock Sygma Bridge - const SygmaBridge = await ethers.getContractFactory("MockSygmaBridge") - const sygmaBridge = await SygmaBridge.deploy() - - // deploy Sygma Adapter - const SygmaAdapter = await ethers.getContractFactory("SygmaAdapter") - const sygmaAdapter = await SygmaAdapter.deploy(sygmaBridge.address) - - // deploy Sygma Message Relayer - const SygmaMessageRelay = await ethers.getContractFactory("SygmaMessageRelay") - const sygmaMessageRelay = await SygmaMessageRelay.deploy( - sygmaBridge.address, - yaho.address, - resourceID, - DOMAIN_ID, - sygmaAdapter.address, - ) - - await sygmaAdapter.setReporter(sygmaMessageRelay.address, CHAIN_ID, true) - - // deploy Yaru - const Yaru = await ethers.getContractFactory("Yaru") - const yaru = await Yaru.deploy(hashi.address, yaho.address, CHAIN_ID) - - // deploy avatar - const Avatar = await ethers.getContractFactory("TestAvatar") - const avatar = await Avatar.deploy() - - // const deploy PingPong test contract - const PingPong = await ethers.getContractFactory("PingPong") - const pingPong = await PingPong.deploy() - - return { - avatar, - sygmaBridge, - sygmaMessageRelay, - sygmaAdapter, - wallet, - hashi, - shoyuBashi, - yaho, - yaru, - pingPong, - } -} - -const setupTestWithTestAvatar = async () => { - const base = await baseSetup() - const Module = await ethers.getContractFactory("HashiModule") - const provider = await ethers.getDefaultProvider() - const network = await provider.getNetwork() - const module = await Module.deploy( - base.avatar.address, - base.avatar.address, - base.avatar.address, - base.yaru.address, - base.wallet.address, - CHAIN_ID, - ) - await base.avatar.setModule(module.address) - return { ...base, Module, module, network } -} - -describe("SygmaMessageRelay End-to-End", function () { - describe("executeTransaction()", function () { - it("executes a transaction", async () => { - const { pingPong, yaho, sygmaMessageRelay, sygmaAdapter, module, wallet, yaru } = await setupTestWithTestAvatar() - const calldata = await pingPong.interface.encodeFunctionData("ping", []) - const tx = await module.interface.encodeFunctionData("executeTransaction", [pingPong.address, 0, calldata, 0]) - const message = { - to: module.address, - toChainId: DOMAIN_ID, - data: tx, - } - const pingCount = await pingPong.count() - - // dispatch message - await yaho.dispatchMessagesToAdapters([message], [sygmaMessageRelay.address], [sygmaAdapter.address]) - // execute messages - await yaru.executeMessages([message], [ID_ZERO], [wallet.address], [sygmaAdapter.address]) - - expect(await pingPong.count()).to.equal(pingCount + 1) - }) - }) -}) From 665cd462f201a36fd210333be02d92e5013651eb Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 25 Jan 2024 07:53:54 +0100 Subject: [PATCH 091/297] chore(evm): rm HeaderOracleAdapter, HeaderReporter and MessageRelay --- .../adapters/HeaderOracleAdapter.sol | 24 -------------- .../evm/contracts/adapters/HeaderReporter.sol | 31 ----------------- .../evm/contracts/adapters/MessageRelay.sol | 33 ------------------- 3 files changed, 88 deletions(-) delete mode 100644 packages/evm/contracts/adapters/HeaderOracleAdapter.sol delete mode 100644 packages/evm/contracts/adapters/HeaderReporter.sol delete mode 100644 packages/evm/contracts/adapters/MessageRelay.sol diff --git a/packages/evm/contracts/adapters/HeaderOracleAdapter.sol b/packages/evm/contracts/adapters/HeaderOracleAdapter.sol deleted file mode 100644 index a5f13631..00000000 --- a/packages/evm/contracts/adapters/HeaderOracleAdapter.sol +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { BlockHashOracleAdapter } from "./BlockHashOracleAdapter.sol"; - -abstract contract HeaderOracleAdapter is BlockHashOracleAdapter { - uint256 public immutable REPORTER_CHAIN; - address public immutable REPORTER_ADDRESS; - - /// @dev Constructs base adapter abstracted from specific message transport - /// @param reporterChain Chain ID of the reporter this adapter is served by - /// @param reporterAddress Address of the reporter this adapter is served by - constructor(uint256 reporterChain, address reporterAddress) { - REPORTER_CHAIN = reporterChain; - REPORTER_ADDRESS = reporterAddress; - } - - function _receivePayload(bytes memory payload) internal { - (uint256[] memory ids, bytes32[] memory hashes) = abi.decode(payload, (uint256[], bytes32[])); - for (uint256 i = 0; i < ids.length; i++) { - _storeHash(REPORTER_CHAIN, ids[i], hashes[i]); - } - } -} diff --git a/packages/evm/contracts/adapters/HeaderReporter.sol b/packages/evm/contracts/adapters/HeaderReporter.sol deleted file mode 100644 index c9900cd7..00000000 --- a/packages/evm/contracts/adapters/HeaderReporter.sol +++ /dev/null @@ -1,31 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { IHeaderReporter } from "../interfaces/IHeaderReporter.sol"; -import { HeaderStorage } from "../utils/HeaderStorage.sol"; - -abstract contract HeaderReporter is IHeaderReporter { - HeaderStorage public immutable HEADER_STORAGE; - uint256 public immutable ADAPTER_CHAIN; - - event HeaderReported(address indexed emitter, uint256 indexed blockNumber, bytes32 indexed blockHeader); - - /// @dev Constructs base reporter abstracted from specific message transport - /// @param headerStorage HeaderStorage contract on this chain to use for block hash obtaining - /// @param adapterChain Chain ID of the adapter that is served by this reporter - constructor(address headerStorage, uint256 adapterChain) { - HEADER_STORAGE = HeaderStorage(headerStorage); - ADAPTER_CHAIN = adapterChain; - } - - function reportHeaders(uint256[] memory blockNumbers, address adapter) external payable { - bytes32[] memory blockHeaders = HEADER_STORAGE.storeBlockHeaders(blockNumbers); - bytes memory payload = abi.encode(blockNumbers, blockHeaders); - _sendPayload(payload, adapter); - for (uint i = 0; i < blockNumbers.length; i++) { - emit HeaderReported(address(this), blockNumbers[i], blockHeaders[i]); - } - } - - function _sendPayload(bytes memory payload, address adapter) internal virtual; -} diff --git a/packages/evm/contracts/adapters/MessageRelay.sol b/packages/evm/contracts/adapters/MessageRelay.sol deleted file mode 100644 index 8aba498e..00000000 --- a/packages/evm/contracts/adapters/MessageRelay.sol +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { IMessageRelay } from "../interfaces/IMessageRelay.sol"; -import { Yaho } from "../Yaho.sol"; - -abstract contract MessageRelay is IMessageRelay { - Yaho public immutable YAHO; - uint256 public immutable ADAPTER_CHAIN; - - event MessageRelayed(address indexed emitter, uint256 indexed messageId); - - /// @dev Constructs base reporter abstracted from specific message transport - /// @param yaho Yaho contract that is served to dispatch and relay messages - /// @param adapterChain Chain ID of the adapter that is served by this reporter - constructor(address yaho, uint256 adapterChain) { - YAHO = Yaho(yaho); - ADAPTER_CHAIN = adapterChain; - } - - function relayMessages(uint256[] memory messageIds, address adapter) external payable returns (bytes32) { - bytes32[] memory hashes = new bytes32[](messageIds.length); - for (uint256 i = 0; i < messageIds.length; i++) { - hashes[i] = YAHO.hashes(messageIds[i]); - emit MessageRelayed(address(this), messageIds[i]); - } - bytes memory payload = abi.encode(messageIds, hashes); - _sendPayload(payload, adapter); - return keccak256(abi.encode(true)); - } - - function _sendPayload(bytes memory payload, address adapter) internal virtual; -} From 88a5673f1747cef9392a60c791e05221968ae79d Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 25 Jan 2024 16:09:48 +0100 Subject: [PATCH 092/297] refactor(evm): adds InvalidThreshold instead of returning false within checkHashWithThresholdFromOracles --- packages/evm/contracts/Hashi.sol | 2 +- packages/evm/contracts/interfaces/IHashi.sol | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/evm/contracts/Hashi.sol b/packages/evm/contracts/Hashi.sol index 623f8aa7..2fba698d 100644 --- a/packages/evm/contracts/Hashi.sol +++ b/packages/evm/contracts/Hashi.sol @@ -44,7 +44,7 @@ contract Hashi is IHashi { uint256 threshold, IOracleAdapter[] calldata oracleAdapters ) external view returns (bool) { - if (oracleAdapters.length < threshold) return false; + if (threshold > oracleAdapters.length) revert InvalidThreshold(threshold, oracleAdapters.length); bytes32[] memory hashes = new bytes32[](oracleAdapters.length); for (uint256 i = 0; i < oracleAdapters.length; ) { diff --git a/packages/evm/contracts/interfaces/IHashi.sol b/packages/evm/contracts/interfaces/IHashi.sol index 2f352c22..2fbfbda6 100644 --- a/packages/evm/contracts/interfaces/IHashi.sol +++ b/packages/evm/contracts/interfaces/IHashi.sol @@ -7,6 +7,7 @@ import { IOracleAdapter } from "./IOracleAdapter.sol"; * @title IHashi */ interface IHashi { + error InvalidThreshold(uint256 threshold, uint256 maxThreshold); error NoOracleAdaptersGiven(); error OracleDidNotReport(IOracleAdapter oracleAdapter); error OraclesDisagree(IOracleAdapter oracleOne, IOracleAdapter oracleTwo); From 7fbf93a11a16cc88fe9b369e048ab2149f6f075f Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 25 Jan 2024 16:13:34 +0100 Subject: [PATCH 093/297] refactor(evm): adds unchecked for reducing gas cost within Hashi --- packages/evm/contracts/Hashi.sol | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/evm/contracts/Hashi.sol b/packages/evm/contracts/Hashi.sol index 2fba698d..a092823c 100644 --- a/packages/evm/contracts/Hashi.sol +++ b/packages/evm/contracts/Hashi.sol @@ -98,8 +98,11 @@ contract Hashi is IHashi { ) public view returns (bytes32[] memory) { if (oracleAdapters.length == 0) revert NoOracleAdaptersGiven(); bytes32[] memory hashes = new bytes32[](oracleAdapters.length); - for (uint256 i = 0; i < oracleAdapters.length; i++) { + for (uint256 i = 0; i < oracleAdapters.length; ) { hashes[i] = getHashFromOracle(domain, id, oracleAdapters[i]); + unchecked { + ++i; + } } return hashes; } @@ -114,9 +117,12 @@ contract Hashi is IHashi { bytes32[] memory hashes = getHashesFromOracles(domain, id, oracleAdapters); hash = hashes[0]; if (hash == bytes32(0)) revert OracleDidNotReport(oracleAdapters[0]); - for (uint256 i = 1; i < hashes.length; i++) { + for (uint256 i = 1; i < hashes.length; ) { if (hashes[i] == bytes32(0)) revert OracleDidNotReport(oracleAdapters[i]); if (hash != hashes[i]) revert OraclesDisagree(oracleAdapters[i - 1], oracleAdapters[i]); + unchecked { + ++i; + } } } } From d56c700e461cb42ba09d6ee94d266841d66360db Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 25 Jan 2024 16:43:29 +0100 Subject: [PATCH 094/297] feat(evm): adds additional checks to checkHashWithThresholdFromOracles --- packages/evm/contracts/Hashi.sol | 4 +++- packages/evm/test/01_Hashi.spec.ts | 31 ++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/packages/evm/contracts/Hashi.sol b/packages/evm/contracts/Hashi.sol index a092823c..287d7dba 100644 --- a/packages/evm/contracts/Hashi.sol +++ b/packages/evm/contracts/Hashi.sol @@ -44,7 +44,9 @@ contract Hashi is IHashi { uint256 threshold, IOracleAdapter[] calldata oracleAdapters ) external view returns (bool) { - if (threshold > oracleAdapters.length) revert InvalidThreshold(threshold, oracleAdapters.length); + if (oracleAdapters.length == 0) revert NoOracleAdaptersGiven(); + if (threshold > oracleAdapters.length || threshold == 0) + revert InvalidThreshold(threshold, oracleAdapters.length); bytes32[] memory hashes = new bytes32[](oracleAdapters.length); for (uint256 i = 0; i < oracleAdapters.length; ) { diff --git a/packages/evm/test/01_Hashi.spec.ts b/packages/evm/test/01_Hashi.spec.ts index 55b5a9d3..8915501b 100644 --- a/packages/evm/test/01_Hashi.spec.ts +++ b/packages/evm/test/01_Hashi.spec.ts @@ -128,5 +128,36 @@ describe("Hashi", function () { await nonReportingMockOracleAdapter.setHashes(DOMAIN_ID, [id], [HASH_GOOD]) expect(await hashi.checkHashWithThresholdFromOracles(DOMAIN_ID, id, threshold, oracles)).to.be.eq(true) }) + it("should revert if the threshold > oracle adapters", async () => { + const { hashi, mockOracleAdapter, badMockOracleAdapter, nonReportingMockOracleAdapter } = await setup() + const id = 3 + const threshold = 4 + const oracles = [mockOracleAdapter, badMockOracleAdapter, nonReportingMockOracleAdapter].map( + ({ address }) => address, + ) + await expect(hashi.checkHashWithThresholdFromOracles(DOMAIN_ID, id, threshold, oracles)) + .to.be.revertedWithCustomError(hashi, "InvalidThreshold") + .withArgs(threshold, oracles.length) + }) + it("should revert false if the threshold is 0", async () => { + const { hashi, mockOracleAdapter, badMockOracleAdapter, nonReportingMockOracleAdapter } = await setup() + const id = 3 + const threshold = 0 + const oracles = [mockOracleAdapter, badMockOracleAdapter, nonReportingMockOracleAdapter].map( + ({ address }) => address, + ) + await expect(hashi.checkHashWithThresholdFromOracles(DOMAIN_ID, id, threshold, oracles)) + .to.be.revertedWithCustomError(hashi, "InvalidThreshold") + .withArgs(threshold, oracles.length) + }) + it("should revert false if we don't provide any oracle adapter", async () => { + const { hashi } = await setup() + const id = 3 + const threshold = 3 + await expect(hashi.checkHashWithThresholdFromOracles(DOMAIN_ID, id, threshold, [])).to.be.revertedWithCustomError( + hashi, + "NoOracleAdaptersGiven", + ) + }) }) }) From 3fd0802144bd08b8773b62e84554e275bbf70e6b Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 25 Jan 2024 17:18:44 +0100 Subject: [PATCH 095/297] refactor(evm): normalizes HeaderStorage --- .../contracts/interfaces/IHeaderStorage.sol | 18 ++++++++++++++--- .../evm/contracts/utils/HeaderStorage.sol | 20 +++++++++---------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/packages/evm/contracts/interfaces/IHeaderStorage.sol b/packages/evm/contracts/interfaces/IHeaderStorage.sol index c381061d..8d4221d7 100644 --- a/packages/evm/contracts/interfaces/IHeaderStorage.sol +++ b/packages/evm/contracts/interfaces/IHeaderStorage.sol @@ -2,11 +2,23 @@ pragma solidity ^0.8.17; interface IHeaderStorage { - event HeaderStored(uint256 indexed blockNumber, bytes32 indexed blockHeader); - error HeaderOutOfRange(address emitter, uint256 blockNumber); - function storeBlockHeader(uint256 blockNumber) external returns (bytes32 blockHeader); + event HeaderStored(uint256 indexed blockNumber, bytes32 indexed blockHeader); + + /** + * @dev Stores and returns the header for the given block. + * @param blockNumber - Block number. + * @return blockHeader - Block header stored. + * @notice Reverts if the given block header was not previously stored and is now out of range. + */ + function storeBlockHeader(uint256 blockNumber) external returns (bytes32); + /** + * @dev Stores and returns the header for an array of given blocks. + * @param blockNumbers - Array of block numbers. + * @return blockHeaders - Array of block headers stored. + * @notice Reverts if the given block header was not previously stored and is now out of range. + */ function storeBlockHeaders(uint256[] memory blockNumbers) external returns (bytes32[] memory); } diff --git a/packages/evm/contracts/utils/HeaderStorage.sol b/packages/evm/contracts/utils/HeaderStorage.sol index 7560a5a3..4840b207 100644 --- a/packages/evm/contracts/utils/HeaderStorage.sol +++ b/packages/evm/contracts/utils/HeaderStorage.sol @@ -6,28 +6,26 @@ import { IHeaderStorage } from "../interfaces/IHeaderStorage.sol"; contract HeaderStorage is IHeaderStorage { mapping(uint256 => bytes32) public headers; - /// @dev Stores and returns the header for the given block. - /// @param blockNumber Block number. - /// @return blockHeader Block header stored. - /// @notice Reverts if the given block header was not previously stored and is now out of range. - function storeBlockHeader(uint256 blockNumber) public returns (bytes32 blockHeader) { - blockHeader = headers[blockNumber]; + /// @inheritdoc IHeaderStorage + function storeBlockHeader(uint256 blockNumber) public returns (bytes32) { + bytes32 blockHeader = headers[blockNumber]; if (blockHeader == 0) { blockHeader = blockhash(blockNumber); if (blockHeader == 0) revert HeaderOutOfRange(address(this), blockNumber); headers[blockNumber] = blockHeader; emit HeaderStored(blockNumber, blockHeader); } + return blockHeader; } - /// @dev Stores and returns the header for an array of given blocks. - /// @param blockNumbers Array of block numbers. - /// @return Array of block headers. - /// @notice Reverts if the given block header was not previously stored and is now out of range. + /// @inheritdoc IHeaderStorage function storeBlockHeaders(uint256[] memory blockNumbers) public returns (bytes32[] memory) { bytes32[] memory blockHeaders = new bytes32[](blockNumbers.length); - for (uint256 i = 0; i < blockNumbers.length; i++) { + for (uint256 i = 0; i < blockNumbers.length;) { blockHeaders[i] = storeBlockHeader(blockNumbers[i]); + unchecked { + ++i; + } } return blockHeaders; } From cd006446c269f335e5caeb9f54c85a6824696d9b Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 25 Jan 2024 17:34:56 +0100 Subject: [PATCH 096/297] feat(evm): reduce gas cost of _dispatchMessagesToAdapters --- packages/evm/contracts/Yaho.sol | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/packages/evm/contracts/Yaho.sol b/packages/evm/contracts/Yaho.sol index 65407b00..fba81136 100644 --- a/packages/evm/contracts/Yaho.sol +++ b/packages/evm/contracts/Yaho.sol @@ -69,7 +69,6 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { bytes32[] memory messageHashes = new bytes32[](receivers.length); for (uint256 i = 0; i < receivers.length; ) { _checkReportersAndAdapters(thresholds[i], reporters, adapters); - (messageIds[i], messageHashes[i]) = _dispatchMessage( toChainId, thresholds[i], @@ -187,16 +186,15 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { for (uint256 i = 0; i < reporters.length; ) { reportersReceipts[i] = reporters[i].dispatchMessages(toChainId, adapters[i], messageIds, messageHashes); - - for (uint256 j = 0; j < messageIds.length; ) { - delete _pendingMessageHashes[messageIds[j]]; - unchecked { - ++j; - } + unchecked { + ++i; } + } + for (uint256 j = 0; j < messageIds.length; ) { + delete _pendingMessageHashes[messageIds[j]]; unchecked { - ++i; + ++j; } } From 55169ed6622c54661bf71ed2cf081f9b6b06af20 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 25 Jan 2024 17:41:11 +0100 Subject: [PATCH 097/297] refactor(evm): lints HeaderStorage --- packages/evm/contracts/utils/HeaderStorage.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/evm/contracts/utils/HeaderStorage.sol b/packages/evm/contracts/utils/HeaderStorage.sol index 4840b207..179c3dc4 100644 --- a/packages/evm/contracts/utils/HeaderStorage.sol +++ b/packages/evm/contracts/utils/HeaderStorage.sol @@ -21,7 +21,7 @@ contract HeaderStorage is IHeaderStorage { /// @inheritdoc IHeaderStorage function storeBlockHeaders(uint256[] memory blockNumbers) public returns (bytes32[] memory) { bytes32[] memory blockHeaders = new bytes32[](blockNumbers.length); - for (uint256 i = 0; i < blockNumbers.length;) { + for (uint256 i = 0; i < blockNumbers.length; ) { blockHeaders[i] = storeBlockHeader(blockNumbers[i]); unchecked { ++i; From 4e7dbb6d81d5535c4d50f28ef5bed56e3bc31f7d Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 25 Jan 2024 17:54:48 +0100 Subject: [PATCH 098/297] chore(evm): rm MessageRelay left stuff --- packages/evm/contracts/interfaces/IMessageRelay.sol | 6 ------ packages/evm/contracts/test/MockMessageRealy.sol | 13 ------------- 2 files changed, 19 deletions(-) delete mode 100644 packages/evm/contracts/interfaces/IMessageRelay.sol delete mode 100644 packages/evm/contracts/test/MockMessageRealy.sol diff --git a/packages/evm/contracts/interfaces/IMessageRelay.sol b/packages/evm/contracts/interfaces/IMessageRelay.sol deleted file mode 100644 index 8b63e8d7..00000000 --- a/packages/evm/contracts/interfaces/IMessageRelay.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -interface IMessageRelay { - function relayMessages(uint256[] memory messageIds, address adapter) external payable returns (bytes32 receipts); -} diff --git a/packages/evm/contracts/test/MockMessageRealy.sol b/packages/evm/contracts/test/MockMessageRealy.sol deleted file mode 100644 index e344a993..00000000 --- a/packages/evm/contracts/test/MockMessageRealy.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { IMessageRelay } from "../interfaces/IMessageRelay.sol"; - -contract MockMessageRelay is IMessageRelay { - uint256 public count; - - function relayMessages(uint256[] memory, address) external payable returns (bytes32 receipts) { - receipts = bytes32(count); - count++; - } -} From 1183fb104e0cfd737e35367116c29f3672c2e9a3 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 25 Jan 2024 17:56:53 +0100 Subject: [PATCH 099/297] chore(evm): rm IHeaderReporter --- packages/evm/contracts/interfaces/IHeaderReporter.sol | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 packages/evm/contracts/interfaces/IHeaderReporter.sol diff --git a/packages/evm/contracts/interfaces/IHeaderReporter.sol b/packages/evm/contracts/interfaces/IHeaderReporter.sol deleted file mode 100644 index a6fbf692..00000000 --- a/packages/evm/contracts/interfaces/IHeaderReporter.sol +++ /dev/null @@ -1,9 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -interface IHeaderReporter { - /// @dev Reports the given block hash to a different chain according to the reporter configuration. - /// @param blockNumbers Block numbers to report hashes for. - /// @param adapter Adapter contract address to report hashes for. - function reportHeaders(uint256[] memory blockNumbers, address adapter) external payable; -} From b2d232499b37a5c65a6fc3676c5685c140b2b883 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 25 Jan 2024 17:58:55 +0100 Subject: [PATCH 100/297] refactor(evm): normalizes interfaces --- .../interfaces/IBlockHashOracleAdapter.sol | 13 +++++++++---- .../contracts/interfaces/IHeaderStorage.sol | 3 +++ .../contracts/interfaces/IOracleAdapter.sol | 19 ++++++++++++------- packages/evm/contracts/interfaces/IYaho.sol | 3 +++ 4 files changed, 27 insertions(+), 11 deletions(-) diff --git a/packages/evm/contracts/interfaces/IBlockHashOracleAdapter.sol b/packages/evm/contracts/interfaces/IBlockHashOracleAdapter.sol index 9bf8154a..09fb6020 100644 --- a/packages/evm/contracts/interfaces/IBlockHashOracleAdapter.sol +++ b/packages/evm/contracts/interfaces/IBlockHashOracleAdapter.sol @@ -3,10 +3,15 @@ pragma solidity ^0.8.17; import { IOracleAdapter } from "./IOracleAdapter.sol"; +/** + * @title IBlockHashOracleAdapter + */ interface IBlockHashOracleAdapter is IOracleAdapter { - /// @dev Proves and stores valid ancestral block hashes for a given chain ID. - /// @param chainId The ID of the chain to prove block hashes for. - /// @param blockHeaders The RLP encoded block headers to prove the hashes for. - /// @notice Block headers should be ordered by descending block number and should start with a known block header. + /** + * @dev Proves and stores valid ancestral block hashes for a given chain ID. + * @param chainId - The ID of the chain to prove block hashes for. + * @param blockHeaders - The RLP encoded block headers to prove the hashes for. + * @notice Block headers should be ordered by descending block number and should start with a known block header. + */ function proveAncestralBlockHashes(uint256 chainId, bytes[] memory blockHeaders) external; } diff --git a/packages/evm/contracts/interfaces/IHeaderStorage.sol b/packages/evm/contracts/interfaces/IHeaderStorage.sol index 8d4221d7..05613f85 100644 --- a/packages/evm/contracts/interfaces/IHeaderStorage.sol +++ b/packages/evm/contracts/interfaces/IHeaderStorage.sol @@ -1,6 +1,9 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; +/** + * @title IHeaderStorage + */ interface IHeaderStorage { error HeaderOutOfRange(address emitter, uint256 blockNumber); diff --git a/packages/evm/contracts/interfaces/IOracleAdapter.sol b/packages/evm/contracts/interfaces/IOracleAdapter.sol index e67f93d9..18d1bb5a 100644 --- a/packages/evm/contracts/interfaces/IOracleAdapter.sol +++ b/packages/evm/contracts/interfaces/IOracleAdapter.sol @@ -1,17 +1,22 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; +/** + * @title IOracleAdapter + */ interface IOracleAdapter { - event HashStored(uint256 indexed id, bytes32 indexed hashes); - error InvalidBlockHeaderLength(uint256 length); error InvalidBlockHeaderRLP(); error ConflictingBlockHeader(uint256 blockNumber, bytes32 reportedBlockHash, bytes32 storedBlockHash); - /// @dev Returns the hash for a given ID, as reported by the oracle. - /// @param domain Identifier for the domain to query. - /// @param id Identifier for the ID to query. - /// @return hash Bytes32 hash reported by the oracle for the given ID on the given domain. - /// @notice MUST return bytes32(0) if the oracle has not yet reported a hash for the given ID. + event HashStored(uint256 indexed id, bytes32 indexed hashes); + + /** + * @dev Returns the hash for a given ID, as reported by the oracle. + * @param domain - Identifier for the domain to query. + * @param id - Identifier for the ID to query. + * @return hash Bytes32 hash reported by the oracle for the given ID on the given domain. + * @notice MUST return bytes32(0) if the oracle has not yet reported a hash for the given ID. + */ function getHashFromOracle(uint256 domain, uint256 id) external view returns (bytes32 hash); } diff --git a/packages/evm/contracts/interfaces/IYaho.sol b/packages/evm/contracts/interfaces/IYaho.sol index 18280d6c..2712526a 100644 --- a/packages/evm/contracts/interfaces/IYaho.sol +++ b/packages/evm/contracts/interfaces/IYaho.sol @@ -7,6 +7,9 @@ import { Message } from "./IMessage.sol"; import { IReporter } from "./IReporter.sol"; import { IOracleAdapter } from "./IOracleAdapter.sol"; +/** + * @title IYaho + */ interface IYaho is IMessageHashCalculator, IMessageIdCalculator { error NoMessagesGiven(); error NoMessageIdsGiven(); From 41dcf9f8e5789de7c646a761bf4e3a23f275881f Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 25 Jan 2024 18:03:19 +0100 Subject: [PATCH 101/297] Merge branch feat/v0.2.0 into feat/v0.2.0-adapters --- packages/evm/contracts/Hashi.sol | 14 +++++++-- packages/evm/contracts/Yaho.sol | 14 ++++----- .../interfaces/IBlockHashOracleAdapter.sol | 9 ++++-- packages/evm/contracts/interfaces/IHashi.sol | 1 + .../contracts/interfaces/IHeaderReporter.sol | 9 ------ .../contracts/interfaces/IHeaderStorage.sol | 21 +++++++++++-- .../contracts/interfaces/IMessageRelay.sol | 6 ---- .../contracts/interfaces/IOracleAdapter.sol | 20 ++++++------ packages/evm/contracts/interfaces/IYaho.sol | 3 ++ .../evm/contracts/test/MockMessageRealy.sol | 13 -------- .../evm/contracts/utils/HeaderStorage.sol | 20 ++++++------ packages/evm/test/01_Hashi.spec.ts | 31 +++++++++++++++++++ 12 files changed, 96 insertions(+), 65 deletions(-) delete mode 100644 packages/evm/contracts/interfaces/IHeaderReporter.sol delete mode 100644 packages/evm/contracts/interfaces/IMessageRelay.sol delete mode 100644 packages/evm/contracts/test/MockMessageRealy.sol diff --git a/packages/evm/contracts/Hashi.sol b/packages/evm/contracts/Hashi.sol index 623f8aa7..287d7dba 100644 --- a/packages/evm/contracts/Hashi.sol +++ b/packages/evm/contracts/Hashi.sol @@ -44,7 +44,9 @@ contract Hashi is IHashi { uint256 threshold, IOracleAdapter[] calldata oracleAdapters ) external view returns (bool) { - if (oracleAdapters.length < threshold) return false; + if (oracleAdapters.length == 0) revert NoOracleAdaptersGiven(); + if (threshold > oracleAdapters.length || threshold == 0) + revert InvalidThreshold(threshold, oracleAdapters.length); bytes32[] memory hashes = new bytes32[](oracleAdapters.length); for (uint256 i = 0; i < oracleAdapters.length; ) { @@ -98,8 +100,11 @@ contract Hashi is IHashi { ) public view returns (bytes32[] memory) { if (oracleAdapters.length == 0) revert NoOracleAdaptersGiven(); bytes32[] memory hashes = new bytes32[](oracleAdapters.length); - for (uint256 i = 0; i < oracleAdapters.length; i++) { + for (uint256 i = 0; i < oracleAdapters.length; ) { hashes[i] = getHashFromOracle(domain, id, oracleAdapters[i]); + unchecked { + ++i; + } } return hashes; } @@ -114,9 +119,12 @@ contract Hashi is IHashi { bytes32[] memory hashes = getHashesFromOracles(domain, id, oracleAdapters); hash = hashes[0]; if (hash == bytes32(0)) revert OracleDidNotReport(oracleAdapters[0]); - for (uint256 i = 1; i < hashes.length; i++) { + for (uint256 i = 1; i < hashes.length; ) { if (hashes[i] == bytes32(0)) revert OracleDidNotReport(oracleAdapters[i]); if (hash != hashes[i]) revert OraclesDisagree(oracleAdapters[i - 1], oracleAdapters[i]); + unchecked { + ++i; + } } } } diff --git a/packages/evm/contracts/Yaho.sol b/packages/evm/contracts/Yaho.sol index 65407b00..fba81136 100644 --- a/packages/evm/contracts/Yaho.sol +++ b/packages/evm/contracts/Yaho.sol @@ -69,7 +69,6 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { bytes32[] memory messageHashes = new bytes32[](receivers.length); for (uint256 i = 0; i < receivers.length; ) { _checkReportersAndAdapters(thresholds[i], reporters, adapters); - (messageIds[i], messageHashes[i]) = _dispatchMessage( toChainId, thresholds[i], @@ -187,16 +186,15 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { for (uint256 i = 0; i < reporters.length; ) { reportersReceipts[i] = reporters[i].dispatchMessages(toChainId, adapters[i], messageIds, messageHashes); - - for (uint256 j = 0; j < messageIds.length; ) { - delete _pendingMessageHashes[messageIds[j]]; - unchecked { - ++j; - } + unchecked { + ++i; } + } + for (uint256 j = 0; j < messageIds.length; ) { + delete _pendingMessageHashes[messageIds[j]]; unchecked { - ++i; + ++j; } } diff --git a/packages/evm/contracts/interfaces/IBlockHashOracleAdapter.sol b/packages/evm/contracts/interfaces/IBlockHashOracleAdapter.sol index 7aab4116..09fb6020 100644 --- a/packages/evm/contracts/interfaces/IBlockHashOracleAdapter.sol +++ b/packages/evm/contracts/interfaces/IBlockHashOracleAdapter.sol @@ -3,12 +3,15 @@ pragma solidity ^0.8.17; import { IOracleAdapter } from "./IOracleAdapter.sol"; +/** + * @title IBlockHashOracleAdapter + */ interface IBlockHashOracleAdapter is IOracleAdapter { /** * @dev Proves and stores valid ancestral block hashes for a given chain ID. - * @param chainId - The ID of the chain for which the block hashes are to be proven and stored. - * @param blockHeaders - The RLP encoded block headers. These headers are used to prove and subsequently store the hashes. - * @notice The block headers should be ordered by descending block number. The sequence should start with a block header that is already known and verified. + * @param chainId - The ID of the chain to prove block hashes for. + * @param blockHeaders - The RLP encoded block headers to prove the hashes for. + * @notice Block headers should be ordered by descending block number and should start with a known block header. */ function proveAncestralBlockHashes(uint256 chainId, bytes[] memory blockHeaders) external; } diff --git a/packages/evm/contracts/interfaces/IHashi.sol b/packages/evm/contracts/interfaces/IHashi.sol index 2f352c22..2fbfbda6 100644 --- a/packages/evm/contracts/interfaces/IHashi.sol +++ b/packages/evm/contracts/interfaces/IHashi.sol @@ -7,6 +7,7 @@ import { IOracleAdapter } from "./IOracleAdapter.sol"; * @title IHashi */ interface IHashi { + error InvalidThreshold(uint256 threshold, uint256 maxThreshold); error NoOracleAdaptersGiven(); error OracleDidNotReport(IOracleAdapter oracleAdapter); error OraclesDisagree(IOracleAdapter oracleOne, IOracleAdapter oracleTwo); diff --git a/packages/evm/contracts/interfaces/IHeaderReporter.sol b/packages/evm/contracts/interfaces/IHeaderReporter.sol deleted file mode 100644 index a6fbf692..00000000 --- a/packages/evm/contracts/interfaces/IHeaderReporter.sol +++ /dev/null @@ -1,9 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -interface IHeaderReporter { - /// @dev Reports the given block hash to a different chain according to the reporter configuration. - /// @param blockNumbers Block numbers to report hashes for. - /// @param adapter Adapter contract address to report hashes for. - function reportHeaders(uint256[] memory blockNumbers, address adapter) external payable; -} diff --git a/packages/evm/contracts/interfaces/IHeaderStorage.sol b/packages/evm/contracts/interfaces/IHeaderStorage.sol index c381061d..05613f85 100644 --- a/packages/evm/contracts/interfaces/IHeaderStorage.sol +++ b/packages/evm/contracts/interfaces/IHeaderStorage.sol @@ -1,12 +1,27 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; +/** + * @title IHeaderStorage + */ interface IHeaderStorage { - event HeaderStored(uint256 indexed blockNumber, bytes32 indexed blockHeader); - error HeaderOutOfRange(address emitter, uint256 blockNumber); - function storeBlockHeader(uint256 blockNumber) external returns (bytes32 blockHeader); + event HeaderStored(uint256 indexed blockNumber, bytes32 indexed blockHeader); + + /** + * @dev Stores and returns the header for the given block. + * @param blockNumber - Block number. + * @return blockHeader - Block header stored. + * @notice Reverts if the given block header was not previously stored and is now out of range. + */ + function storeBlockHeader(uint256 blockNumber) external returns (bytes32); + /** + * @dev Stores and returns the header for an array of given blocks. + * @param blockNumbers - Array of block numbers. + * @return blockHeaders - Array of block headers stored. + * @notice Reverts if the given block header was not previously stored and is now out of range. + */ function storeBlockHeaders(uint256[] memory blockNumbers) external returns (bytes32[] memory); } diff --git a/packages/evm/contracts/interfaces/IMessageRelay.sol b/packages/evm/contracts/interfaces/IMessageRelay.sol deleted file mode 100644 index 8b63e8d7..00000000 --- a/packages/evm/contracts/interfaces/IMessageRelay.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -interface IMessageRelay { - function relayMessages(uint256[] memory messageIds, address adapter) external payable returns (bytes32 receipts); -} diff --git a/packages/evm/contracts/interfaces/IOracleAdapter.sol b/packages/evm/contracts/interfaces/IOracleAdapter.sol index 2ac03a07..18d1bb5a 100644 --- a/packages/evm/contracts/interfaces/IOracleAdapter.sol +++ b/packages/evm/contracts/interfaces/IOracleAdapter.sol @@ -1,20 +1,22 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; +/** + * @title IOracleAdapter + */ interface IOracleAdapter { - event HashStored(uint256 indexed id, bytes32 indexed hashes); - error InvalidBlockHeaderLength(uint256 length); error InvalidBlockHeaderRLP(); error ConflictingBlockHeader(uint256 blockNumber, bytes32 reportedBlockHash, bytes32 storedBlockHash); + event HashStored(uint256 indexed id, bytes32 indexed hashes); + /** - * @dev Returns the hash for a given domain and ID, as reported by the oracle - * - * @param domain - The identifier for the domain to query. - * @param id - The identifier for which the hash is being queried. - * @return hash The bytes32 hash reported by the oracle for the given ID on the specified domain. - * @notice This function will return a default value of bytes32(0) if the oracle has not yet reported a hash for the given ID. + * @dev Returns the hash for a given ID, as reported by the oracle. + * @param domain - Identifier for the domain to query. + * @param id - Identifier for the ID to query. + * @return hash Bytes32 hash reported by the oracle for the given ID on the given domain. + * @notice MUST return bytes32(0) if the oracle has not yet reported a hash for the given ID. */ - function getHashFromOracle(uint256 domain, uint256 id) external view returns (bytes32); + function getHashFromOracle(uint256 domain, uint256 id) external view returns (bytes32 hash); } diff --git a/packages/evm/contracts/interfaces/IYaho.sol b/packages/evm/contracts/interfaces/IYaho.sol index 18280d6c..2712526a 100644 --- a/packages/evm/contracts/interfaces/IYaho.sol +++ b/packages/evm/contracts/interfaces/IYaho.sol @@ -7,6 +7,9 @@ import { Message } from "./IMessage.sol"; import { IReporter } from "./IReporter.sol"; import { IOracleAdapter } from "./IOracleAdapter.sol"; +/** + * @title IYaho + */ interface IYaho is IMessageHashCalculator, IMessageIdCalculator { error NoMessagesGiven(); error NoMessageIdsGiven(); diff --git a/packages/evm/contracts/test/MockMessageRealy.sol b/packages/evm/contracts/test/MockMessageRealy.sol deleted file mode 100644 index e344a993..00000000 --- a/packages/evm/contracts/test/MockMessageRealy.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; - -import { IMessageRelay } from "../interfaces/IMessageRelay.sol"; - -contract MockMessageRelay is IMessageRelay { - uint256 public count; - - function relayMessages(uint256[] memory, address) external payable returns (bytes32 receipts) { - receipts = bytes32(count); - count++; - } -} diff --git a/packages/evm/contracts/utils/HeaderStorage.sol b/packages/evm/contracts/utils/HeaderStorage.sol index 7560a5a3..179c3dc4 100644 --- a/packages/evm/contracts/utils/HeaderStorage.sol +++ b/packages/evm/contracts/utils/HeaderStorage.sol @@ -6,28 +6,26 @@ import { IHeaderStorage } from "../interfaces/IHeaderStorage.sol"; contract HeaderStorage is IHeaderStorage { mapping(uint256 => bytes32) public headers; - /// @dev Stores and returns the header for the given block. - /// @param blockNumber Block number. - /// @return blockHeader Block header stored. - /// @notice Reverts if the given block header was not previously stored and is now out of range. - function storeBlockHeader(uint256 blockNumber) public returns (bytes32 blockHeader) { - blockHeader = headers[blockNumber]; + /// @inheritdoc IHeaderStorage + function storeBlockHeader(uint256 blockNumber) public returns (bytes32) { + bytes32 blockHeader = headers[blockNumber]; if (blockHeader == 0) { blockHeader = blockhash(blockNumber); if (blockHeader == 0) revert HeaderOutOfRange(address(this), blockNumber); headers[blockNumber] = blockHeader; emit HeaderStored(blockNumber, blockHeader); } + return blockHeader; } - /// @dev Stores and returns the header for an array of given blocks. - /// @param blockNumbers Array of block numbers. - /// @return Array of block headers. - /// @notice Reverts if the given block header was not previously stored and is now out of range. + /// @inheritdoc IHeaderStorage function storeBlockHeaders(uint256[] memory blockNumbers) public returns (bytes32[] memory) { bytes32[] memory blockHeaders = new bytes32[](blockNumbers.length); - for (uint256 i = 0; i < blockNumbers.length; i++) { + for (uint256 i = 0; i < blockNumbers.length; ) { blockHeaders[i] = storeBlockHeader(blockNumbers[i]); + unchecked { + ++i; + } } return blockHeaders; } diff --git a/packages/evm/test/01_Hashi.spec.ts b/packages/evm/test/01_Hashi.spec.ts index 55b5a9d3..8915501b 100644 --- a/packages/evm/test/01_Hashi.spec.ts +++ b/packages/evm/test/01_Hashi.spec.ts @@ -128,5 +128,36 @@ describe("Hashi", function () { await nonReportingMockOracleAdapter.setHashes(DOMAIN_ID, [id], [HASH_GOOD]) expect(await hashi.checkHashWithThresholdFromOracles(DOMAIN_ID, id, threshold, oracles)).to.be.eq(true) }) + it("should revert if the threshold > oracle adapters", async () => { + const { hashi, mockOracleAdapter, badMockOracleAdapter, nonReportingMockOracleAdapter } = await setup() + const id = 3 + const threshold = 4 + const oracles = [mockOracleAdapter, badMockOracleAdapter, nonReportingMockOracleAdapter].map( + ({ address }) => address, + ) + await expect(hashi.checkHashWithThresholdFromOracles(DOMAIN_ID, id, threshold, oracles)) + .to.be.revertedWithCustomError(hashi, "InvalidThreshold") + .withArgs(threshold, oracles.length) + }) + it("should revert false if the threshold is 0", async () => { + const { hashi, mockOracleAdapter, badMockOracleAdapter, nonReportingMockOracleAdapter } = await setup() + const id = 3 + const threshold = 0 + const oracles = [mockOracleAdapter, badMockOracleAdapter, nonReportingMockOracleAdapter].map( + ({ address }) => address, + ) + await expect(hashi.checkHashWithThresholdFromOracles(DOMAIN_ID, id, threshold, oracles)) + .to.be.revertedWithCustomError(hashi, "InvalidThreshold") + .withArgs(threshold, oracles.length) + }) + it("should revert false if we don't provide any oracle adapter", async () => { + const { hashi } = await setup() + const id = 3 + const threshold = 3 + await expect(hashi.checkHashWithThresholdFromOracles(DOMAIN_ID, id, threshold, [])).to.be.revertedWithCustomError( + hashi, + "NoOracleAdaptersGiven", + ) + }) }) }) From eebc020d59018f19ff3165c7165b8f72d3c3e551 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Fri, 26 Jan 2024 10:54:08 +0100 Subject: [PATCH 102/297] refactor(tasks): rm deploy:HashiModule --- packages/evm/tasks/deploy/hashi.ts | 36 ++---------------------------- 1 file changed, 2 insertions(+), 34 deletions(-) diff --git a/packages/evm/tasks/deploy/hashi.ts b/packages/evm/tasks/deploy/hashi.ts index 462e25b5..8c60dc83 100644 --- a/packages/evm/tasks/deploy/hashi.ts +++ b/packages/evm/tasks/deploy/hashi.ts @@ -9,14 +9,12 @@ import type { Yaru } from "../../types/contracts/Yaru" import type { GiriGiriBashi } from "../../types/contracts/ownable/GiriGiriBashi" import type { ShoyuBashi } from "../../types/contracts/ownable/ShoyuBashi" import type { HeaderStorage } from "../../types/contracts/utils/HeaderStorage" -import type { HashiModule } from "../../types/contracts/zodiac/HashiModule" import type { Hashi__factory } from "../../types/factories/contracts/Hashi__factory" import type { Yaho__factory } from "../../types/factories/contracts/Yaho__factory" import type { Yaru__factory } from "../../types/factories/contracts/Yaru__factory" import type { GiriGiriBashi__factory } from "../../types/factories/contracts/ownable/GiriGiriBashi__factory" import type { ShoyuBashi__factory } from "../../types/factories/contracts/ownable/ShoyuBashi__factory" import type { HeaderStorage__factory } from "../../types/factories/contracts/utils/HeaderStorage__factory" -import type { HashiModule__factory } from "../../types/factories/contracts/zodiac/HashiModule__factory" task("deploy:Hashi") .addFlag("verify", "whether to verify the contract on Etherscan") @@ -98,45 +96,15 @@ task("deploy:Yaho") task("deploy:Yaru") .addParam("hashi", "address of the hashi contract") .addParam("yaho", "address of the yaho instance to receive messages from") - .addParam("chainid", "id of the chain to receive messages from", 1, types.int) + .addParam("sourceChainId", "id of the chain to receive messages from", 1, types.int) .addFlag("verify", "whether to verify the contract on Etherscan") .setAction(async function (taskArguments: TaskArguments, hre) { console.log("Deploying Yaru...") const signers: SignerWithAddress[] = await hre.ethers.getSigners() const yaruFactory: Yaru__factory = await hre.ethers.getContractFactory("Yaru") - const constructorArguments = [taskArguments.hashi, taskArguments.yaho, taskArguments.chainid] as const + const constructorArguments = [taskArguments.hashi, taskArguments.yaho, taskArguments.sourceChainId] as const const yaru: Yaru = await yaruFactory.connect(signers[0]).deploy(...constructorArguments) await yaru.deployed() console.log("yaru deployed to:", yaru.address) if (taskArguments.verify) await verify(hre, yaru, constructorArguments) }) - -task("deploy:HashiModule") - .addParam("owner", "address to set as the owner of this contract") - .addParam("avatar", "address that will execute transactions (probably a Safe)") - .addParam("target", "address that this contract will call (probably a Safe)") - .addParam("yaru", "address of the yaru instance that will call this contract") - .addParam("controller", "address of the controller that can pass messages to this contract") - .addParam("chainid", "id of the chain to receive messages from", 1, types.int) - .addFlag("verify", "whether to verify the contract on Etherscan") - .setAction(async function (taskArguments: TaskArguments, hre) { - console.log("Deploying Hashi Module...") - const signers: SignerWithAddress[] = await hre.ethers.getSigners() - const hashiModuleFactory: HashiModule__factory = ( - await hre.ethers.getContractFactory("HashiModule") - ) - const constructorArguments = [ - taskArguments.owner, - taskArguments.avatar, - taskArguments.target, - taskArguments.yaru, - taskArguments.controller, - taskArguments.chainid, - ] as const - const hashiModule: HashiModule = ( - await hashiModuleFactory.connect(signers[0]).deploy(...constructorArguments) - ) - await hashiModule.deployed() - console.log("hashi deployed to:", hashiModule.address) - if (taskArguments.verify) await verify(hre, hashiModule, constructorArguments) - }) From 544a7ab12854338dead492f911eaf0266358cadd Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Fri, 26 Jan 2024 11:06:28 +0100 Subject: [PATCH 103/297] refactor(evm): lints --- packages/evm/contracts/Hashi.sol | 2 +- packages/evm/contracts/ownable/ShoyuBashi.sol | 2 +- packages/evm/contracts/ownable/ShuSo.sol | 2 +- packages/evm/test/04_Yaho.spec.ts | 2 -- packages/evm/test/05_Yaru.spec.ts | 9 ++------- packages/evm/test/utils/Message.ts | 1 - 6 files changed, 5 insertions(+), 13 deletions(-) diff --git a/packages/evm/contracts/Hashi.sol b/packages/evm/contracts/Hashi.sol index 287d7dba..f5bde1ad 100644 --- a/packages/evm/contracts/Hashi.sol +++ b/packages/evm/contracts/Hashi.sol @@ -52,7 +52,7 @@ contract Hashi is IHashi { for (uint256 i = 0; i < oracleAdapters.length; ) { try oracleAdapters[i].getHashFromOracle(domain, id) returns (bytes32 hash) { hashes[i] = hash; - } catch {} + } catch {} // solhint-disable no-empty-blocks unchecked { ++i; } diff --git a/packages/evm/contracts/ownable/ShoyuBashi.sol b/packages/evm/contracts/ownable/ShoyuBashi.sol index 4f66afcd..34882f43 100644 --- a/packages/evm/contracts/ownable/ShoyuBashi.sol +++ b/packages/evm/contracts/ownable/ShoyuBashi.sol @@ -5,7 +5,7 @@ import { Hashi, IOracleAdapter, ShuSo, OwnableUpgradeable } from "./ShuSo.sol"; import { Domain } from "../interfaces/IDomain.sol"; contract ShoyuBashi is ShuSo { - constructor(address _owner, address _hashi) ShuSo(_owner, _hashi) {} + constructor(address _owner, address _hashi) ShuSo(_owner, _hashi) {} // solhint-disable no-empty-blocks /// @dev Sets the address of the Hashi contract. /// @param _hashi Address of the hashi contract. diff --git a/packages/evm/contracts/ownable/ShuSo.sol b/packages/evm/contracts/ownable/ShuSo.sol index 3a382b44..f65d3a33 100644 --- a/packages/evm/contracts/ownable/ShuSo.sol +++ b/packages/evm/contracts/ownable/ShuSo.sol @@ -186,7 +186,7 @@ abstract contract ShuSo is OwnableUpgradeable { for (uint i = 0; i < _adapters.length; i++) { try _adapters[i].getHashFromOracle(domain, id) returns (bytes32 currentHash) { hashes[i] = currentHash; - } catch {} + } catch {} // solhint-disable no-empty-blocks } // find a hash agreed on by a threshold of oracles diff --git a/packages/evm/test/04_Yaho.spec.ts b/packages/evm/test/04_Yaho.spec.ts index a616588c..86799ae8 100644 --- a/packages/evm/test/04_Yaho.spec.ts +++ b/packages/evm/test/04_Yaho.spec.ts @@ -10,7 +10,6 @@ import { Chains } from "./utils/constants" let reporter1: Contract, reporter2: Contract, - owner: SignerWithAddress, yaho: Contract, receiver1: SignerWithAddress, receiver2: SignerWithAddress, @@ -23,7 +22,6 @@ describe("Yaho", () => { const Reporter = await ethers.getContractFactory("MockReporter") const signers = await ethers.getSigners() - owner = signers[0] receiver1 = await signers[1] receiver2 = await signers[2] adapter1 = await signers[3] diff --git a/packages/evm/test/05_Yaru.spec.ts b/packages/evm/test/05_Yaru.spec.ts index 24a97a08..e719ec03 100644 --- a/packages/evm/test/05_Yaru.spec.ts +++ b/packages/evm/test/05_Yaru.spec.ts @@ -1,4 +1,3 @@ -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/dist/src/signer-with-address" import { expect } from "chai" import { Contract } from "ethers" import { ethers } from "hardhat" @@ -10,7 +9,6 @@ let reporter1: Contract, reporter2: Contract, reporter3: Contract, reporter4: Contract, - owner: SignerWithAddress, yaho: Contract, yaru: Contract, hashi: Contract, @@ -30,9 +28,6 @@ describe("Yaru", () => { const Adapter = await ethers.getContractFactory("MockOracleAdapter") const PingPong = await ethers.getContractFactory("PingPong") - const signers = await ethers.getSigners() - owner = signers[0] - hashi = await Hashi.deploy() yaho = await Yaho.deploy() yaru = await Yaru.deploy(hashi.address, yaho.address, Chains.Hardhat) @@ -124,7 +119,7 @@ describe("Yaru", () => { await adapter1.setHashes(Chains.Hardhat, [message.id], [hash]) await adapter2.setHashes(Chains.Hardhat, [message.id], [hash]) await yaru.executeMessages([message]) - expect(yaru.executeMessages([message])) + await expect(yaru.executeMessages([message])) .to.be.revertedWithCustomError(yaru, "MessageIdAlreadyExecuted") .withArgs(message.id) }) @@ -144,7 +139,7 @@ describe("Yaru", () => { await adapter1.setHashes(Chains.Hardhat, [message.id], [hash]) await adapter2.setHashes(Chains.Hardhat, [message.id], [hash]) message.adapters = [adapter3.address as `0x${string}`, adapter4.address as `0x${string}`] - expect(yaru.executeMessages([message])).to.be.revertedWithCustomError(yaru, "ThresholdNotMet") + await expect(yaru.executeMessages([message])).to.be.revertedWithCustomError(yaru, "ThresholdNotMet") }) for (let threshold = 1; threshold <= 4; threshold++) { diff --git a/packages/evm/test/utils/Message.ts b/packages/evm/test/utils/Message.ts index bf0043d0..f7a6c7f2 100644 --- a/packages/evm/test/utils/Message.ts +++ b/packages/evm/test/utils/Message.ts @@ -1,4 +1,3 @@ -import { anyValue } from "@nomicfoundation/hardhat-chai-matchers/withArgs" import { ContractReceipt } from "ethers" type Configs = { From 3c55b2f636463c7cc46081fadd77b1cb0583cc5e Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Fri, 26 Jan 2024 11:13:53 +0100 Subject: [PATCH 104/297] chore(evm): rn Reporter test file --- .../evm/test/adapters/{Reporter.spec.ts => 03_Reporter.spec.ts} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename packages/evm/test/adapters/{Reporter.spec.ts => 03_Reporter.spec.ts} (98%) diff --git a/packages/evm/test/adapters/Reporter.spec.ts b/packages/evm/test/adapters/03_Reporter.spec.ts similarity index 98% rename from packages/evm/test/adapters/Reporter.spec.ts rename to packages/evm/test/adapters/03_Reporter.spec.ts index 0466af3f..4e05fbde 100644 --- a/packages/evm/test/adapters/Reporter.spec.ts +++ b/packages/evm/test/adapters/03_Reporter.spec.ts @@ -14,7 +14,7 @@ let reporter: Contract, fakeAdapter: SignerWithAddress, user: SignerWithAddress -describe("Yaho", () => { +describe("Reporter", () => { beforeEach(async () => { await network.provider.request({ method: "hardhat_reset", params: [] }) From 4d17deccef76dcd0307f93c1559dae197346ab10 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 29 Jan 2024 14:00:42 +0100 Subject: [PATCH 105/297] feat(evm): adds IShuSho, IShoyuBashi and IGiriGiriBashi --- .../contracts/interfaces/IGiriGiriBashi.sol | 192 ++++++++++++++++ .../evm/contracts/interfaces/IShoyuBashi.sol | 73 ++++++ packages/evm/contracts/interfaces/IShuSho.sol | 38 ++++ .../evm/contracts/ownable/GiriGiriBashi.sol | 209 +++++------------- packages/evm/contracts/ownable/ShoyuBashi.sol | 69 ++---- packages/evm/contracts/ownable/ShuSo.sol | 204 +++++++++-------- packages/evm/test/02_ShoyuBashi.spec.ts | 8 +- packages/evm/test/03_GiriGiriBashi.spec.ts | 33 ++- 8 files changed, 497 insertions(+), 329 deletions(-) create mode 100644 packages/evm/contracts/interfaces/IGiriGiriBashi.sol create mode 100644 packages/evm/contracts/interfaces/IShoyuBashi.sol create mode 100644 packages/evm/contracts/interfaces/IShuSho.sol diff --git a/packages/evm/contracts/interfaces/IGiriGiriBashi.sol b/packages/evm/contracts/interfaces/IGiriGiriBashi.sol new file mode 100644 index 00000000..234d4dc2 --- /dev/null +++ b/packages/evm/contracts/interfaces/IGiriGiriBashi.sol @@ -0,0 +1,192 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity ^0.8.17; + +import { IHashi } from "./IHashi.sol"; +import { IOracleAdapter } from "./IOracleAdapter.sol"; +import { IShuSho } from "./IShuSho.sol"; + +/** + * @title IGiriGiriBashi + */ +interface IGiriGiriBashi is IShuSho { + struct Settings { + bool quarantined; // whether or not the adapter has has been quarantined. + uint256 minimumBond; // amount that must be bonded alongside a challenge. + uint256 startId; // earliest id that the oracle could have reported. + uint256 idDepth; // how far behind the current head can this oracle safely report. 0 equals infinite. + uint256 timeout; // grace period in which the oracle must report on an in range id after being challenged. + } + + struct Challenge { + address payable challenger; // account that raised the challenge. + uint256 timestamp; // timestamp when the challenge was created. + uint256 bond; // bond paid by the challenger. + } + + event BondRecipientSet(address payable bondRecipient); + event NewHead(uint256 domain, uint256 head); + event ChallegenRangeUpdated(uint256 domain, uint256 range); + event SettingsInitialized(uint256 domain, IOracleAdapter adapter, Settings settings); + event ChallengeCreated( + bytes32 challengeId, + uint256 indexed domain, + uint256 id, + IOracleAdapter indexed adapter, + address indexed challenger, + uint256 timestamp, + uint256 bond + ); + event ChallengeResolved( + bytes32 challengeId, + uint256 indexed domain, + uint256 id, + IOracleAdapter indexed adapter, + address indexed challenger, + uint256 bond, + bool challengeSuccessful + ); + event NoConfidenceDeclareed(uint256 domain); + + error DuplicateChallenge(bytes32 challengeId, uint256 domain, uint256 id, IOracleAdapter adapter); + error OutOfRange(IOracleAdapter adapter, uint256 id); + error AlreadyQuarantined(IOracleAdapter adapter); + error NotEnoughtValue(IOracleAdapter adapter, uint256 value); + error ChallengeNotFound(bytes32 challengeId, uint256 domain, uint256 id, IOracleAdapter adapter); + error AdapterHasNotYetTimedOut(IOracleAdapter adapter); + error UnequalArrayLengths(); + error AdapterNotQuarantined(IOracleAdapter adapter); + error CannotProveNoConfidence(uint256 domain, uint256 id, IOracleAdapter[] adapters); + error AdaptersAgreed(IOracleAdapter, IOracleAdapter); + error NoConfidenceRequired(); + error CountMustBeZero(uint256 domain); + error ChallengeRangeAlreadySet(uint256 domain); + + /** + * @dev Sets the threshold for a specific domain. + * @param domain - The Uint256 identifier for the domain. + * @param threshold - The Uint256 threshold to set for the given domain. + */ + function setThreshold(uint256 domain, uint256 threshold) external; + + /** + * @dev Sets the bond recipient address for payments. + * @param bondRecipient - The address where bond payments should be sent. + */ + function setBondRecipient(address payable bondRecipient) external; + + /** + * @dev Sets the challenge range for a specific domain. + * @param domain - The Uint256 identifier for the domain. + * @param range - The Uint256 range to set for the given domain. + */ + function setChallengeRange(uint256 domain, uint256 range) external; + + /** + * @dev Challenges the oracle adapter to provide a response. If the oracle adapter fails, it can be quarantined. + * @param domain - The Uint256 identifier for the domain. + * @param id - The Uint256 identifier for the challenge. + * @param adapter - The address of the oracle adapter to challenge. + * @notice Caller must pay a minimum bond to issue the challenge. This bond should be high enough to cover the gas costs for successfully completing the challenge. + */ + function challengeOracleAdapter(uint256 domain, uint256 id, IOracleAdapter adapter) external payable; + + /** + * @dev Resolves a challenge by comparing results from a specific oracle adapter with others. + * @param domain - The Uint256 identifier for the domain. + * @param id - The Uint256 identifier. + * @param adapter - The oracle adapter instance for comparison. + * @param adapters - An array of oracle adapter instances for comparison. + * @return A boolean indicating the success of the challenge resolution. + */ + function resolveChallenge( + uint256 domain, + uint256 id, + IOracleAdapter adapter, + IOracleAdapter[] memory adapters + ) external returns (bool); + + /** + * @dev show that enough oracles disagree that they could not make a threshold if the remainder all agree with one. + * @param domain - The Uint256 identifier for the domain. + * @param id - The Uint256 identifier. + * @param adapters - An array of oracle adapter instances. + */ + function declareNoConfidence(uint256 domain, uint256 id, IOracleAdapter[] memory adapters) external; + + /** + * @dev Replaces the quarantined oracle adapters for a given domain with new adapters and settings. + * @param domain - The Uint256 identifier for the domain. + * @param currentAdapters - An array of current oracle adapter instances to be replaced. + * @param newAdapters - An array of new oracle adapter instances to replace the current ones. + * @param settings - An array of settings corresponding to the new adapters. + */ + function replaceQuaratinedOrcales( + uint256 domain, + IOracleAdapter[] memory currentAdapters, + IOracleAdapter[] memory newAdapters, + Settings[] memory settings + ) external; + + /** + * @dev Disables a set of oracle adapters for a given domain. + * @param domain - The Uint256 identifier for the domain. + * @param adapters - An array of oracle adapter instances to be disabled. + */ + function disableOracleAdapters(uint256 domain, IOracleAdapter[] memory adapters) external; + + /** + * @dev Enables a set of oracle adapters for a given domain with specific settings. + * @param domain - The Uint256 identifier for the domain. + * @param adapters - An array of oracle adapter instances. + * @param settings - An array of settings, corresponding to each adapter. + */ + function enableOracleAdapters( + uint256 domain, + IOracleAdapter[] memory adapters, + Settings[] memory settings + ) external; + + /** + * @dev Gets the challenge ID for a given domain, ID, and oracle adapter. + * @param domain - The Uint256 identifier for the domain. + * @param id - The Uint256 identifier. + * @param adapter - The oracle adapter instance. + * @return The computed challenge ID as a bytes32 hash. + */ + function getChallengeId(uint256 domain, uint256 id, IOracleAdapter adapter) external pure returns (bytes32); + + /** + * @dev Returns the hash unanimously agreed upon by ALL of the enabled oraclesAdapters. + * @param domain - Uint256 identifier for the domain to query. + * @param id - Uint256 identifier to query. + * @return hash - Bytes32 hash agreed upon by the oracles for the given domain. + * @notice Reverts if oracles disagree. + * @notice Reverts if oracles have not yet reported the hash for the given ID. + * @notice Reverts if no oracles are set for the given domain. + */ + function getUnanimousHash(uint256 domain, uint256 id) external returns (bytes32 hash); + + /** + * @dev Returns the hash agreed upon by a threshold of the enabled oraclesAdapters. + * @param domain - Uint256 identifier for the domain to query. + * @param id - Uint256 identifier to query. + * @return hash - Bytes32 hash agreed upon by a threshold of the oracles for the given domain. + * @notice Reverts if no threshold is not reached. + * @notice Reverts if no oracles are set for the given domain. + */ + function getThresholdHash(uint256 domain, uint256 id) external returns (bytes32 hash); + + /** + * @dev Returns the hash unanimously agreed upon by all of the given oraclesAdapters. + * @param domain - Uint256 identifier for the domain to query. + * @param adapters - Array of oracle adapter addresses to query. + * @param id - Uint256 identifier to query. + * @return hash - Bytes32 hash agreed upon by the oracles for the given domain. + * @notice adapters must be in numerical order from smallest to largest and contain no duplicates. + * @notice Reverts if adapters are out of order or contain duplicates. + * @notice Reverts if oracles disagree. + * @notice Reverts if oracles have not yet reported the hash for the given ID. + * @notice Reverts if no oracles are set for the given domain. + */ + function getHash(uint256 domain, uint256 id, IOracleAdapter[] memory adapters) external returns (bytes32 hash); +} diff --git a/packages/evm/contracts/interfaces/IShoyuBashi.sol b/packages/evm/contracts/interfaces/IShoyuBashi.sol new file mode 100644 index 00000000..c8157981 --- /dev/null +++ b/packages/evm/contracts/interfaces/IShoyuBashi.sol @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity ^0.8.17; + +import { IHashi } from "./IHashi.sol"; +import { IOracleAdapter } from "./IOracleAdapter.sol"; +import { IShuSho } from "./IShuSho.sol"; + +/** + * @title IShoyuBashi + */ +interface IShoyuBashi is IShuSho { + /** + * @dev Sets the threshold of adapters required for a given domain. + * @param domain - Uint256 identifier for the domain for which to set the threshold. + * @param threshold - Uint256 threshold to set for the given domain. + * @notice Only callable by the owner of this contract. + * @notice Reverts if the threshold is already set to the given value. + */ + function setThreshold(uint256 domain, uint256 threshold) external; + + /** + * @dev Enables the given adapters for a given domain. + * @param domain - Uint256 identifier for the domain for which to set oracle adapters. + * @param adapters - Array of oracleAdapter addresses. + * @notice Reverts if adapters are out of order or contain duplicates. + * @notice Only callable by the owner of this contract. + */ + function enableOracleAdapters(uint256 domain, IOracleAdapter[] memory adapters) external; + + /** + * @dev Disables the given adapters for a given domain. + * @param domain - Uint256 identifier for the domain for which to set oracle adapters. + * @param adapters - Array of oracleAdapter addresses. + * @notice Reverts if adapters are out of order or contain duplicates. + * @notice Only callable by the owner of this contract. + */ + function disableOracleAdapters(uint256 domain, IOracleAdapter[] memory adapters) external; + + /** + * @dev Returns the hash unanimously agreed upon by ALL of the enabled oraclesAdapters. + * @param domain - Uint256 identifier for the domain to query. + * @param id - Uint256 identifier to query. + * @return Bytes32 hash agreed upon by the oracles for the given domain. + * @notice Reverts if oracles disagree. + * @notice Reverts if oracles have not yet reported the hash for the given ID. + * @notice Reverts if no oracles are set for the given domain. + */ + function getUnanimousHash(uint256 domain, uint256 id) external view returns (bytes32); + + /** + * @dev Returns the hash agreed upon by a threshold of the enabled oraclesAdapters. + * @param domain - Uint256 identifier for the domain to query. + * @param id - Uint256 identifier to query. + * @return Bytes32 hash agreed upon by a threshold of the oracles for the given domain. + * @notice Reverts if the threshold is not reached. + * @notice Reverts if no oracles are set for the given domain. + */ + function getThresholdHash(uint256 domain, uint256 id) external view returns (bytes32); + + /** + * @dev Returns the hash unanimously agreed upon by all of the given oraclesAdapters. + * @param domain - Uint256 identifier for the domain to query. + * @param adapters - Array of oracle adapter addresses to query. + * @param id - Uint256 identifier to query. + * @return Bytes32 hash agreed upon by the oracles for the given domain. + * @notice adapters must be in numerical order from smallest to largest and contain no duplicates. + * @notice Reverts if adapters are out of order or contain duplicates. + * @notice Reverts if oracles disagree. + * @notice Reverts if oracles have not yet reported the hash for the given ID. + * @notice Reverts if no oracles are set for the given domain. + */ + function getHash(uint256 domain, uint256 id, IOracleAdapter[] memory adapters) external view returns (bytes32); +} diff --git a/packages/evm/contracts/interfaces/IShuSho.sol b/packages/evm/contracts/interfaces/IShuSho.sol new file mode 100644 index 00000000..11b6e74b --- /dev/null +++ b/packages/evm/contracts/interfaces/IShuSho.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity ^0.8.17; + +import { IHashi } from "./IHashi.sol"; +import { IOracleAdapter } from "./IOracleAdapter.sol"; + +/** + * @title IShuSho + */ +interface IShuSho { + struct Link { + IOracleAdapter previous; + IOracleAdapter next; + } + + event HashiSet(IHashi indexed hashi); + event Init(address indexed owner, IHashi indexed hashi); + event OracleAdaptersEnabled(uint256 indexed domain, IOracleAdapter[] adapters); + event OracleAdaptersDisabled(uint256 indexed domain, IOracleAdapter[] adapters); + event ThresholdSet(uint256 domain, uint256 threshold); + + error AdapterNotEnabled(IOracleAdapter adapter); + error AdapterAlreadyEnabled(IOracleAdapter adapter); + error DuplicateHashiAddress(IHashi hashi); + error DuplicateOrOutOfOrderAdapters(IOracleAdapter adapterOne, IOracleAdapter adapterTwo); + error DuplicateThreashold(uint256 threshold); + error InvalidAdapter(IOracleAdapter adapter); + error NoAdaptersEnabled(uint256 domain); + error NoAdaptersGiven(); + error ThresholdNotMet(); + + /** + * @dev Checks the order and validity of oracle adapters for a given domain. + * @param domain - The Uint256 identifier for the domain. + * @param _adapters - An array of oracle adapter instances. + */ + function checkAdapterOrderAndValidity(uint256 domain, IOracleAdapter[] memory _adapters) external view; +} diff --git a/packages/evm/contracts/ownable/GiriGiriBashi.sol b/packages/evm/contracts/ownable/GiriGiriBashi.sol index 2a94cc9b..0a41ada0 100644 --- a/packages/evm/contracts/ownable/GiriGiriBashi.sol +++ b/packages/evm/contracts/ownable/GiriGiriBashi.sol @@ -1,125 +1,63 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; -import { IOracleAdapter, ShuSo, Hashi } from "./ShuSo.sol"; - -struct Settings { - bool quarantined; // whether or not the adapter has has been quarantined. - uint256 minimumBond; // amount that must be bonded alongside a challenge. - uint256 startId; // earliest id that the oracle could have reported. - uint256 idDepth; // how far behind the current head can this oracle safely report. 0 equals infinite. - uint256 timeout; // grace period in which the oracle must report on an in range id after being challenged. -} - -struct Challenge { - address payable challenger; // account that raised the challenge. - uint256 timestamp; // timestamp when the challenge was created. - uint256 bond; // bond paid by the challenger. -} +import { ShuSo } from "./ShuSo.sol"; +import { IOracleAdapter } from "../interfaces/IOracleAdapter.sol"; +import { IHashi } from "../interfaces/IHashi.sol"; +import { IGiriGiriBashi } from "../interfaces/IGiriGiriBashi.sol"; -contract GiriGiriBashi is ShuSo { +contract GiriGiriBashi is IGiriGiriBashi, ShuSo { address payable public bondRecipient; // address that bonds from unsuccessful challenges should be sent to. - mapping(uint256 => uint256) public heads; // highest Id reported. mapping(uint256 => uint256) public challengeRanges; // how far beyond the current highestId can a challenged. mapping(IOracleAdapter => Settings) public settings; mapping(bytes32 => Challenge) public challenges; // current challenges. - event BondRecipientSet(address emitter, address payable bondRecipient); - event NewHead(address emitter, uint256 domain, uint256 head); - event ChallegenRangeUpdated(address emitter, uint256 domain, uint256 range); - event SettingsInitialized(address emitter, uint256 domain, IOracleAdapter adapter, Settings settings); - event ChallengeCreated( - address emitter, - bytes32 challengeId, - uint256 indexed domain, - uint256 id, - IOracleAdapter indexed adapter, - address indexed challenger, - uint256 timestamp, - uint256 bond - ); - event ChallengeResolved( - address emitter, - bytes32 challengeId, - uint256 indexed domain, - uint256 id, - IOracleAdapter indexed adapter, - address indexed challenger, - uint256 bond, - bool challengeSuccessful - ); - event NoConfidenceDeclareed(address emitter, uint256 domain); - - error DuplicateChallenge(address emitter, bytes32 challengeId, uint256 domain, uint256 id, IOracleAdapter adapter); - error OutOfRange(address emitter, IOracleAdapter adapter, uint256 id); - error AlreadyQuarantined(address emitter, IOracleAdapter adapter); - error NotEnoughtValue(address emitter, IOracleAdapter adapter, uint256 value); - error ChallengeNotFound(address emitter, bytes32 challengeId, uint256 domain, uint256 id, IOracleAdapter adapter); - error AdapterHasNotYetTimedOut(address emitter, IOracleAdapter adapter); - error UnequalArrayLengths(address emitter); - error AdapterNotQuarantined(address emitter, IOracleAdapter adapter); - error CannotProveNoConfidence(address emitter, uint256 domain, uint256 id, IOracleAdapter[] adapters); - error AdaptersAgreed(address emitter, IOracleAdapter, IOracleAdapter); - error NoConfidenceRequired(address emitter); - error CountMustBeZero(address emitter, uint256 domain); - error ChallengeRangeAlreadySet(address emitter, uint256 domain); - constructor(address _owner, address _hashi, address payable _bondRecipient) ShuSo(_owner, _hashi) { bondRecipient = _bondRecipient; } modifier noConfidence(uint256 domain) { - if (domains[domain].threshold != type(uint256).max) revert NoConfidenceRequired(address(this)); + if (domains[domain].threshold != type(uint256).max) revert NoConfidenceRequired(); _; } modifier zeroCount(uint256 domain) { - if (domains[domain].count != 0) revert CountMustBeZero(address(this), domain); + if (domains[domain].count != 0) revert CountMustBeZero(domain); _; } - function setHashi(Hashi _hashi) public override onlyInitializing { + function setHashi(IHashi _hashi) public override onlyInitializing { _setHashi(_hashi); } + /// @inheritdoc IGiriGiriBashi function setThreshold(uint256 domain, uint256 threshold) public zeroCount(domain) { _setThreshold(domain, threshold); } + /// @inheritdoc IGiriGiriBashi function setBondRecipient(address payable _bondRecipient) public onlyOwner { bondRecipient = _bondRecipient; - emit BondRecipientSet(address(this), _bondRecipient); + emit BondRecipientSet(_bondRecipient); } + /// @inheritdoc IGiriGiriBashi function setChallengeRange(uint256 domain, uint256 range) public { - if (challengeRanges[domain] != 0) revert ChallengeRangeAlreadySet(address(this), domain); + if (challengeRanges[domain] != 0) revert ChallengeRangeAlreadySet(domain); challengeRanges[domain] = range; - emit ChallegenRangeUpdated(address(this), domain, range); + emit ChallegenRangeUpdated(domain, range); } - /// @dev Challenges the oracle adapter to provide a response. - /// If the oracle adapter fails, it can be quarantined. - /// @param domain Uint256 identifier for the domain for which to set the threshold. - /// @param id Uint256 threshold to set for the given domain. - /// @param adapter Address of the oracle adapter to challenge. - /// @notice Caller must pay a minimum bond to issue the challenge. - /// This bond should be high enough to cover the gas costs for successfully completing the challenge. + /// @inheritdoc IGiriGiriBashi function challengeOracleAdapter(uint256 domain, uint256 id, IOracleAdapter adapter) public payable { - // check if oracle is enabled, revert if false - if (adapters[domain][adapter].previous == IOracleAdapter(address(0))) - revert AdapterNotEnabled(address(this), adapter); - - // check that msg.value is => greater than minimum bond for oracle, revert if false - if (msg.value < settings[adapter].minimumBond) revert NotEnoughtValue(address(this), adapter, msg.value); - - // check if oracle is quarantined, revert if true - if (settings[adapter].quarantined) revert AlreadyQuarantined(address(this), adapter); + if (adapters[domain][adapter].previous == IOracleAdapter(address(0))) revert AdapterNotEnabled(adapter); + if (msg.value < settings[adapter].minimumBond) revert NotEnoughtValue(adapter, msg.value); + if (settings[adapter].quarantined) revert AlreadyQuarantined(adapter); - // check if challenge already exists, revert if true bytes32 challengeId = getChallengeId(domain, id, adapter); if (challenges[challengeId].challenger != address(0)) - revert DuplicateChallenge(address(this), challengeId, domain, id, adapter); + revert DuplicateChallenge(challengeId, domain, id, adapter); // check if id is lower than startId, revert if true. // check if id is less than highestId + challengeRange, revert if false @@ -131,18 +69,17 @@ contract GiriGiriBashi is ShuSo { id < settings[adapter].startId || // before start id (challengeRange != 0 && id >= head && id - head > challengeRange) || // over domain challenge range (idDepth != 0 && head > idDepth && id <= head - idDepth) // outside of adapter idDepth - ) revert OutOfRange(address(this), adapter, id); + ) revert OutOfRange(adapter, id); - // create challenge Challenge storage challenge = challenges[challengeId]; challenge.challenger = payable(msg.sender); challenge.timestamp = block.timestamp; challenge.bond = msg.value; - // emit OracleAdapterChallenged - emit ChallengeCreated(address(this), challengeId, domain, id, adapter, msg.sender, block.timestamp, msg.value); + emit ChallengeCreated(challengeId, domain, id, adapter, msg.sender, block.timestamp, msg.value); } + /// @inheritdoc IGiriGiriBashi function resolveChallenge( uint256 domain, uint256 id, @@ -152,7 +89,7 @@ contract GiriGiriBashi is ShuSo { // check if challenge exists, revert if false bytes32 challengeId = getChallengeId(domain, id, adapter); if (challenges[challengeId].challenger == address(0)) - revert ChallengeNotFound(address(this), challengeId, domain, id, adapter); + revert ChallengeNotFound(challengeId, domain, id, adapter); // check if oracle has reported Challenge storage challenge = challenges[challengeId]; @@ -163,7 +100,7 @@ contract GiriGiriBashi is ShuSo { if (reportedHash == bytes32(0)) { // check block.timestamp is greater than challenge.timestamp + adapterSettings.timeout, revert if false. if (block.timestamp < challenge.timestamp + adapterSettings.timeout) - revert AdapterHasNotYetTimedOut(address(this), adapter); + revert AdapterHasNotYetTimedOut(adapter); // quaratine oracle adapter. adapterSettings.quarantined = true; // send bond to challenger @@ -178,7 +115,7 @@ contract GiriGiriBashi is ShuSo { bondRecipient.transfer(challenge.bond); success = false; } else { - revert Hashi.OraclesDisagree(address(this), adapter, _adapters[0]); + revert IHashi.OraclesDisagree(adapter, _adapters[0]); } } else { // check if _adapters report the same header as adapter @@ -196,62 +133,37 @@ contract GiriGiriBashi is ShuSo { } } } - emit ChallengeResolved( - address(this), - challengeId, - domain, - id, - adapter, - challenge.challenger, - challenge.bond, - success - ); - // delete challenge + emit ChallengeResolved(challengeId, domain, id, adapter, challenge.challenger, challenge.bond, success); + delete challenge.challenger; delete challenge.timestamp; delete challenge.bond; } - // show that enough oracles disagree that they could not make a threshold if the remainder all agree with one. + /// @inheritdoc IGiriGiriBashi function declareNoConfidence(uint256 domain, uint256 id, IOracleAdapter[] memory _adapters) public { checkAdapterOrderAndValidity(domain, _adapters); (uint256 threshold, uint256 count) = getThresholdAndCount(domain); // check that there are enough adapters to prove no confidence uint256 confidence = (count - _adapters.length) + 1; - if (confidence >= threshold) revert CannotProveNoConfidence(address(this), domain, id, _adapters); + if (confidence >= threshold) revert CannotProveNoConfidence(domain, id, _adapters); - // get hashes bytes32[] memory hashes = new bytes32[](_adapters.length); for (uint i = 0; i < _adapters.length; i++) hashes[i] = _adapters[i].getHashFromOracle(domain, id); // prove that each member of _adapters disagrees for (uint i = 0; i < hashes.length; i++) for (uint j = 0; j < hashes.length; j++) - if (hashes[i] == hashes[j] && i != j) revert AdaptersAgreed(address(this), _adapters[i], _adapters[j]); + if (hashes[i] == hashes[j] && i != j) revert AdaptersAgreed(_adapters[i], _adapters[j]); - // set no confidence domains[domain].threshold = type(uint256).max; - - // clear state delete challengeRanges[domain]; - emit NoConfidenceDeclareed(address(this), domain); - } - - function initSettings(uint256 domain, IOracleAdapter[] memory _adapters, Settings[] memory _settings) private { - if (_adapters.length != _settings.length) revert UnequalArrayLengths(address(this)); - for (uint i = 0; i < _adapters.length; i++) { - IOracleAdapter adapter = _adapters[i]; - settings[adapter].quarantined = false; - settings[adapter].minimumBond = _settings[i].minimumBond; - settings[adapter].startId = _settings[i].startId; - settings[adapter].idDepth = _settings[i].idDepth; - settings[adapter].timeout = _settings[i].timeout; - emit SettingsInitialized(address(this), domain, adapter, _settings[i]); - } + emit NoConfidenceDeclareed(domain); } + /// @inheritdoc IGiriGiriBashi function replaceQuaratinedOrcales( uint256 domain, IOracleAdapter[] memory currentAdapters, @@ -259,21 +171,22 @@ contract GiriGiriBashi is ShuSo { Settings[] memory _settings ) public onlyOwner { if (currentAdapters.length != newAdapters.length || currentAdapters.length != _settings.length) - revert UnequalArrayLengths(address(this)); + revert UnequalArrayLengths(); for (uint i = 0; i < currentAdapters.length; i++) { - if (!settings[currentAdapters[i]].quarantined) - revert AdapterNotQuarantined(address(this), currentAdapters[i]); + if (!settings[currentAdapters[i]].quarantined) revert AdapterNotQuarantined(currentAdapters[i]); } _disableOracleAdapters(domain, currentAdapters); _enableOracleAdapters(domain, newAdapters); initSettings(domain, newAdapters, _settings); } + /// @inheritdoc IGiriGiriBashi function disableOracleAdapters(uint256 domain, IOracleAdapter[] memory _adapters) public noConfidence(domain) { _disableOracleAdapters(domain, _adapters); if (domains[domain].count == 0) domains[domain].threshold = 0; } + /// @inheritdoc IGiriGiriBashi function enableOracleAdapters( uint256 domain, IOracleAdapter[] memory _adapters, @@ -283,11 +196,7 @@ contract GiriGiriBashi is ShuSo { initSettings(domain, _adapters, _settings); } - function updateHead(uint256 domain, uint256 id) private { - if (id > heads[domain]) heads[domain] = id; - emit NewHead(address(this), domain, id); - } - + /// @inheritdoc IGiriGiriBashi function getChallengeId( uint256 domain, uint256 id, @@ -296,41 +205,39 @@ contract GiriGiriBashi is ShuSo { challengeId = keccak256(abi.encodePacked(domain, id, adapter)); } - /// @dev Returns the hash unanimously agreed upon by ALL of the enabled oraclesAdapters. - /// @param domain Uint256 identifier for the domain to query. - /// @param id Uint256 identifier to query. - /// @return hash Bytes32 hash agreed upon by the oracles for the given domain. - /// @notice Reverts if oracles disagree. - /// @notice Reverts if oracles have not yet reported the hash for the given ID. - /// @notice Reverts if no oracles are set for the given domain. + /// @inheritdoc IGiriGiriBashi function getUnanimousHash(uint256 domain, uint256 id) public returns (bytes32 hash) { hash = _getUnanimousHash(domain, id); updateHead(domain, id); } - /// @dev Returns the hash agreed upon by a threshold of the enabled oraclesAdapters. - /// @param domain Uint256 identifier for the domain to query. - /// @param id Uint256 identifier to query. - /// @return hash Bytes32 hash agreed upon by a threshold of the oracles for the given domain. - /// @notice Reverts if no threshold is not reached. - /// @notice Reverts if no oracles are set for the given domain. + /// @inheritdoc IGiriGiriBashi function getThresholdHash(uint256 domain, uint256 id) public returns (bytes32 hash) { hash = _getThresholdHash(domain, id); updateHead(domain, id); } - /// @dev Returns the hash unanimously agreed upon by all of the given oraclesAdapters.. - /// @param domain Uint256 identifier for the domain to query. - /// @param _adapters Array of oracle adapter addresses to query. - /// @param id Uint256 identifier to query. - /// @return hash Bytes32 hash agreed upon by the oracles for the given domain. - /// @notice _adapters must be in numberical order from smallest to largest and contain no duplicates. - /// @notice Reverts if _adapters are out of order or contain duplicates. - /// @notice Reverts if oracles disagree. - /// @notice Reverts if oracles have not yet reported the hash for the given ID. - /// @notice Reverts if no oracles are set for the given domain. + /// @inheritdoc IGiriGiriBashi function getHash(uint256 domain, uint256 id, IOracleAdapter[] memory _adapters) public returns (bytes32 hash) { hash = _getHash(domain, id, _adapters); updateHead(domain, id); } + + function initSettings(uint256 domain, IOracleAdapter[] memory _adapters, Settings[] memory _settings) private { + if (_adapters.length != _settings.length) revert UnequalArrayLengths(); + for (uint i = 0; i < _adapters.length; i++) { + IOracleAdapter adapter = _adapters[i]; + settings[adapter].quarantined = false; + settings[adapter].minimumBond = _settings[i].minimumBond; + settings[adapter].startId = _settings[i].startId; + settings[adapter].idDepth = _settings[i].idDepth; + settings[adapter].timeout = _settings[i].timeout; + emit SettingsInitialized(domain, adapter, _settings[i]); + } + } + + function updateHead(uint256 domain, uint256 id) private { + if (id > heads[domain]) heads[domain] = id; + emit NewHead(domain, id); + } } diff --git a/packages/evm/contracts/ownable/ShoyuBashi.sol b/packages/evm/contracts/ownable/ShoyuBashi.sol index 34882f43..d1655a44 100644 --- a/packages/evm/contracts/ownable/ShoyuBashi.sol +++ b/packages/evm/contracts/ownable/ShoyuBashi.sol @@ -1,78 +1,45 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; -import { Hashi, IOracleAdapter, ShuSo, OwnableUpgradeable } from "./ShuSo.sol"; -import { Domain } from "../interfaces/IDomain.sol"; +import { ShuSo } from "./ShuSo.sol"; +import { IOracleAdapter } from "../interfaces/IOracleAdapter.sol"; +import { IHashi } from "../interfaces/IHashi.sol"; +import { IShoyuBashi } from "../interfaces/IShoyuBashi.sol"; -contract ShoyuBashi is ShuSo { +contract ShoyuBashi is IShoyuBashi, ShuSo { constructor(address _owner, address _hashi) ShuSo(_owner, _hashi) {} // solhint-disable no-empty-blocks - /// @dev Sets the address of the Hashi contract. - /// @param _hashi Address of the hashi contract. - /// @notice Only callable by the owner of this contract. - function setHashi(Hashi _hashi) public override { + function setHashi(IHashi _hashi) public override { _setHashi(_hashi); } - /// @dev Sets the threshold of adapters required for a given domain. - /// @param domain Uint256 identifier for the domain for which to set the threshold. - /// @param threshold Uint256 threshold to set for the given domain. - /// @notice Only callable by the owner of this contract. - /// @notice Reverts if threshold is already set to the given value. + /// @inheritdoc IShoyuBashi function setThreshold(uint256 domain, uint256 threshold) public { _setThreshold(domain, threshold); } - /// @dev Enables the given adapters for a given domain. - /// @param domain Uint256 identifier for the domain for which to set oracle adapters. - /// @param _adapters Array of oracleAdapter addresses. - /// @notice Reverts if _adapters are out of order or contain duplicates. - /// @notice Only callable by the owner of this contract. + /// @inheritdoc IShoyuBashi function enableOracleAdapters(uint256 domain, IOracleAdapter[] memory _adapters) public { _enableOracleAdapters(domain, _adapters); } - /// @dev Disables the given adapters for a given domain. - /// @param domain Uint256 identifier for the domain for which to set oracle adapters. - /// @param _adapters Array of oracleAdapter addresses. - /// @notice Reverts if _adapters are out of order or contain duplicates. - /// @notice Only callable by the owner of this contract. + /// @inheritdoc IShoyuBashi function disableOracleAdapters(uint256 domain, IOracleAdapter[] memory _adapters) public { _disableOracleAdapters(domain, _adapters); } - /// @dev Returns the hash unanimously agreed upon by ALL of the enabled oraclesAdapters. - /// @param domain Uint256 identifier for the domain to query. - /// @param id Uint256 identifier to query. - /// @return hash Bytes32 hash agreed upon by the oracles for the given domain. - /// @notice Reverts if oracles disagree. - /// @notice Reverts if oracles have not yet reported the hash for the given ID. - /// @notice Reverts if no oracles are set for the given domain. - function getUnanimousHash(uint256 domain, uint256 id) public view returns (bytes32 hash) { - hash = _getUnanimousHash(domain, id); + /// @inheritdoc IShoyuBashi + function getUnanimousHash(uint256 domain, uint256 id) public view returns (bytes32) { + return _getUnanimousHash(domain, id); } - /// @dev Returns the hash agreed upon by a threshold of the enabled oraclesAdapters. - /// @param domain Uint256 identifier for the domain to query. - /// @param id Uint256 identifier to query. - /// @return hash Bytes32 hash agreed upon by a threshold of the oracles for the given domain. - /// @notice Reverts if no threshold is not reached. - /// @notice Reverts if no oracles are set for the given domain. - function getThresholdHash(uint256 domain, uint256 id) public view returns (bytes32 hash) { - hash = _getThresholdHash(domain, id); + /// @inheritdoc IShoyuBashi + function getThresholdHash(uint256 domain, uint256 id) public view returns (bytes32) { + return _getThresholdHash(domain, id); } - /// @dev Returns the hash unanimously agreed upon by all of the given oraclesAdapters.. - /// @param domain Uint256 identifier for the domain to query. - /// @param _adapters Array of oracle adapter addresses to query. - /// @param id Uint256 identifier to query. - /// @return hash Bytes32 hash agreed upon by the oracles for the given domain. - /// @notice _adapters must be in numberical order from smallest to largest and contain no duplicates. - /// @notice Reverts if _adapters are out of order or contain duplicates. - /// @notice Reverts if oracles disagree. - /// @notice Reverts if oracles have not yet reported the hash for the given ID. - /// @notice Reverts if no oracles are set for the given domain. - function getHash(uint256 domain, uint256 id, IOracleAdapter[] memory _adapters) public view returns (bytes32 hash) { - hash = _getHash(domain, id, _adapters); + /// @inheritdoc IShoyuBashi + function getHash(uint256 domain, uint256 id, IOracleAdapter[] memory _adapters) public view returns (bytes32) { + return _getHash(domain, id, _adapters); } } diff --git a/packages/evm/contracts/ownable/ShuSo.sol b/packages/evm/contracts/ownable/ShuSo.sol index f65d3a33..7e7242ea 100644 --- a/packages/evm/contracts/ownable/ShuSo.sol +++ b/packages/evm/contracts/ownable/ShuSo.sol @@ -1,90 +1,75 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; -import { Hashi, IOracleAdapter } from "../Hashi.sol"; +import { IHashi } from "../interfaces/IHashi.sol"; +import { IOracleAdapter } from "../interfaces/IOracleAdapter.sol"; import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import { Domain } from "../interfaces/IDomain.sol"; +import { IShuSho } from "../interfaces/IShuSho.sol"; -struct Link { - IOracleAdapter previous; - IOracleAdapter next; -} - -abstract contract ShuSo is OwnableUpgradeable { +abstract contract ShuSo is IShuSho, OwnableUpgradeable { IOracleAdapter internal constant LIST_END = IOracleAdapter(address(0x1)); - Hashi public hashi; + IHashi public hashi; mapping(uint256 => mapping(IOracleAdapter => Link)) public adapters; mapping(uint256 => Domain) public domains; - event HashiSet(address indexed emitter, Hashi indexed hashi); - event Init(address indexed emitter, address indexed owner, Hashi indexed hashi); - event OracleAdaptersEnabled(address indexed emitter, uint256 indexed domain, IOracleAdapter[] adapters); - event OracleAdaptersDisabled(address indexed emitter, uint256 indexed domain, IOracleAdapter[] adapters); - event ThresholdSet(address indexed emitter, uint256 domain, uint256 threshold); - - error AdapterNotEnabled(address emitter, IOracleAdapter adapter); - error AdapterAlreadyEnabled(address emitter, IOracleAdapter adapter); - error DuplicateHashiAddress(address emitter, Hashi hashi); - error DuplicateOrOutOfOrderAdapters(address emitter, IOracleAdapter adapterOne, IOracleAdapter adapterTwo); - error DuplicateThreashold(address emitter, uint256 threshold); - error InvalidAdapter(address emitter, IOracleAdapter adapter); - error NoAdaptersEnabled(address emitter, uint256 domain); - error NoAdaptersGiven(address emitter); - error ThresholdNotMet(address emitter); - constructor(address _owner, address _hashi) { bytes memory initParams = abi.encode(_owner, _hashi); init(initParams); } function init(bytes memory initParams) public initializer { - (address _owner, Hashi _hashi) = abi.decode(initParams, (address, Hashi)); + (address _owner, IHashi _hashi) = abi.decode(initParams, (address, IHashi)); __Ownable_init(); setHashi(_hashi); transferOwnership(_owner); - emit Init(address(this), _owner, _hashi); + emit Init(_owner, _hashi); } - function setHashi(Hashi _hashi) public virtual; + function setHashi(IHashi _hashi) public virtual; - /// @dev Sets the address of the Hashi contract. - /// @param _hashi Address of the hashi contract. - /// @notice Only callable by the owner of this contract. - function _setHashi(Hashi _hashi) internal onlyOwner { - if (hashi == _hashi) revert DuplicateHashiAddress(address(this), _hashi); + /** + * @dev Sets the address of the IHashi contract. + * @param _hashi - Address of the hashi contract. + * @notice Only callable by the owner of this contract. + */ + function _setHashi(IHashi _hashi) internal onlyOwner { + if (hashi == _hashi) revert DuplicateHashiAddress(_hashi); hashi = _hashi; - emit HashiSet(address(this), hashi); + emit HashiSet(hashi); } - /// @dev Sets the threshold of adapters required for a given domain. - /// @param domain Uint256 identifier for the domain for which to set the threshold. - /// @param threshold Uint256 threshold to set for the given domain. - /// @notice Only callable by the owner of this contract. - /// @notice Reverts if threshold is already set to the given value. + /** + * @dev Sets the threshold of adapters required for a given domain. + * @param domain - Uint256 identifier for the domain for which to set the threshold. + * @param threshold - Uint256 threshold to set for the given domain. + * @notice Only callable by the owner of this contract. + * @notice Reverts if threshold is already set to the given value. + */ function _setThreshold(uint256 domain, uint256 threshold) internal onlyOwner { - if (domains[domain].threshold == threshold) revert DuplicateThreashold(address(this), threshold); + if (domains[domain].threshold == threshold) revert DuplicateThreashold(threshold); domains[domain].threshold = threshold; - emit ThresholdSet(address(this), domain, threshold); + emit ThresholdSet(domain, threshold); } - /// @dev Enables the given adapters for a given domain. - /// @param domain Uint256 identifier for the domain for which to set oracle adapters. - /// @param _adapters Array of oracleAdapter addresses. - /// @notice Reverts if _adapters are out of order or contain duplicates. - /// @notice Only callable by the owner of this contract. + /** + * @dev Enables the given adapters for a given domain. + * @param domain - Uint256 identifier for the domain for which to set oracle adapters. + * @param _adapters - Array of oracleAdapter addresses. + * @notice Reverts if _adapters are out of order or contain duplicates. + * @notice Only callable by the owner of this contract. + */ function _enableOracleAdapters(uint256 domain, IOracleAdapter[] memory _adapters) internal onlyOwner { if (adapters[domain][LIST_END].next == IOracleAdapter(address(0))) { adapters[domain][LIST_END].next = LIST_END; adapters[domain][LIST_END].previous = LIST_END; } - if (_adapters.length == 0) revert NoAdaptersGiven(address(this)); + if (_adapters.length == 0) revert NoAdaptersGiven(); for (uint256 i = 0; i < _adapters.length; i++) { IOracleAdapter adapter = _adapters[i]; - if (adapter == IOracleAdapter(address(0)) || adapter == LIST_END) - revert InvalidAdapter(address(this), adapter); - if (adapters[domain][adapter].next != IOracleAdapter(address(0))) - revert AdapterAlreadyEnabled(address(this), adapter); + if (adapter == IOracleAdapter(address(0)) || adapter == LIST_END) revert InvalidAdapter(adapter); + if (adapters[domain][adapter].next != IOracleAdapter(address(0))) revert AdapterAlreadyEnabled(adapter); IOracleAdapter previous = adapters[domain][LIST_END].previous; adapters[domain][previous].next = adapter; adapters[domain][adapter].previous = previous; @@ -92,23 +77,24 @@ abstract contract ShuSo is OwnableUpgradeable { adapters[domain][adapter].next = LIST_END; domains[domain].count++; } - emit OracleAdaptersEnabled(address(this), domain, _adapters); + emit OracleAdaptersEnabled(domain, _adapters); } - /// @dev Disables the given adapters for a given domain. - /// @param domain Uint256 identifier for the domain for which to set oracle adapters. - /// @param _adapters Array of oracleAdapter addresses. - /// @notice Reverts if _adapters are out of order or contain duplicates. - /// @notice Only callable by the owner of this contract. + /** + * @dev Disables the given adapters for a given domain. + * @param domain - Uint256 identifier for the domain for which to set oracle adapters. + * @param _adapters - Array of oracleAdapter addresses. + * @notice Reverts if _adapters are out of order or contain duplicates. + * @notice Only callable by the owner of this contract. + */ function _disableOracleAdapters(uint256 domain, IOracleAdapter[] memory _adapters) internal onlyOwner { - if (domains[domain].count == 0) revert NoAdaptersEnabled(address(this), domain); - if (_adapters.length == 0) revert NoAdaptersGiven(address(this)); + if (domains[domain].count == 0) revert NoAdaptersEnabled(domain); + if (_adapters.length == 0) revert NoAdaptersGiven(); for (uint256 i = 0; i < _adapters.length; i++) { IOracleAdapter adapter = _adapters[i]; - if (adapter == IOracleAdapter(address(0)) || adapter == LIST_END) - revert InvalidAdapter(address(this), adapter); + if (adapter == IOracleAdapter(address(0)) || adapter == LIST_END) revert InvalidAdapter(adapter); Link memory current = adapters[domain][adapter]; - if (current.next == IOracleAdapter(address(0))) revert AdapterNotEnabled(address(this), adapter); + if (current.next == IOracleAdapter(address(0))) revert AdapterNotEnabled(adapter); IOracleAdapter next = current.next; IOracleAdapter previous = current.previous; adapters[domain][next].previous = previous; @@ -117,11 +103,13 @@ abstract contract ShuSo is OwnableUpgradeable { delete adapters[domain][adapter].previous; domains[domain].count--; } - emit OracleAdaptersDisabled(address(this), domain, _adapters); + emit OracleAdaptersDisabled(domain, _adapters); } - /// @dev Returns an array of enabled oracle adapters for a given domain. - /// @param domain Uint256 identifier for the domain for which to list oracle adapters. + /** + * @dev Returns an array of enabled oracle adapters for a given domain. + * @param domain - Uint256 identifier for the domain for which to list oracle adapters. + */ function getOracleAdapters(uint256 domain) public view returns (IOracleAdapter[] memory) { IOracleAdapter[] memory _adapters = new IOracleAdapter[](domains[domain].count); IOracleAdapter currentAdapter = adapters[domain][LIST_END].next; @@ -132,54 +120,58 @@ abstract contract ShuSo is OwnableUpgradeable { return _adapters; } - /// @dev Returns the threshold and count for a given domain - /// @param domain Uint256 identifier for the domain. - /// @return threshold Uint256 oracle threshold for the given domain. - /// @return count Uint256 oracle count for the given domain. - /// @notice If the threshold for a domain has not been set, or is explicitly set to 0, this function will return a - /// threshold equal to the oracle count for the given domain. + /** + * @dev Returns the threshold and count for a given domain. + * @param domain - Uint256 identifier for the domain. + * @return threshold - Uint256 oracle threshold for the given domain. + * @return count - Uint256 oracle count for the given domain. + * @notice If the threshold for a domain has not been set, or is explicitly set to 0, this function will return a threshold equal to the oracle count for the given domain. + */ function getThresholdAndCount(uint256 domain) public view returns (uint256 threshold, uint256 count) { threshold = domains[domain].threshold; count = domains[domain].count; if (threshold == 0) threshold = count; } + /// @inheritdoc IShuSho function checkAdapterOrderAndValidity(uint256 domain, IOracleAdapter[] memory _adapters) public view { for (uint256 i = 0; i < _adapters.length; i++) { IOracleAdapter adapter = _adapters[i]; - if (i > 0 && adapter <= _adapters[i - 1]) - revert DuplicateOrOutOfOrderAdapters(address(this), adapter, _adapters[i - 1]); - if (adapters[domain][adapter].next == IOracleAdapter(address(0))) - revert InvalidAdapter(address(this), adapter); + if (i > 0 && adapter <= _adapters[i - 1]) revert DuplicateOrOutOfOrderAdapters(adapter, _adapters[i - 1]); + if (adapters[domain][adapter].next == IOracleAdapter(address(0))) revert InvalidAdapter(adapter); } } - /// @dev Returns the hash unanimously agreed upon by ALL of the enabled oraclesAdapters. - /// @param domain Uint256 identifier for the domain to query. - /// @param id Uint256 identifier to query. - /// @return hash Bytes32 hash agreed upon by the oracles for the given domain. - /// @notice Reverts if oracles disagree. - /// @notice Reverts if oracles have not yet reported the hash for the given ID. - /// @notice Reverts if no oracles are set for the given domain. + /** + * @dev Returns the hash unanimously agreed upon by ALL of the enabled oraclesAdapters. + * @param domain - Uint256 identifier for the domain to query. + * @param id - Uint256 identifier to query. + * @return hash - Bytes32 hash agreed upon by the oracles for the given domain. + * @notice Reverts if oracles disagree. + * @notice Reverts if oracles have not yet reported the hash for the given ID. + * @notice Reverts if no oracles are set for the given domain. + */ function _getUnanimousHash(uint256 domain, uint256 id) internal view returns (bytes32 hash) { IOracleAdapter[] memory _adapters = getOracleAdapters(domain); (uint256 threshold, uint256 count) = getThresholdAndCount(domain); - if (count == 0) revert NoAdaptersEnabled(address(this), domain); - if (_adapters.length < threshold) revert ThresholdNotMet(address(this)); + if (count == 0) revert NoAdaptersEnabled(domain); + if (_adapters.length < threshold) revert ThresholdNotMet(); hash = hashi.getHash(domain, id, _adapters); } - /// @dev Returns the hash agreed upon by a threshold of the enabled oraclesAdapters. - /// @param domain Uint256 identifier for the domain to query. - /// @param id Uint256 identifier to query. - /// @return hash Bytes32 hash agreed upon by a threshold of the oracles for the given domain. - /// @notice Reverts if no threshold is not reached. - /// @notice Reverts if no oracles are set for the given domain. + /** + * @dev Returns the hash agreed upon by a threshold of the enabled oraclesAdapters. + * @param domain - Uint256 identifier for the domain to query. + * @param id - Uint256 identifier to query. + * @return hash - Bytes32 hash agreed upon by a threshold of the oracles for the given domain. + * @notice Reverts if no threshold is not reached. + * @notice Reverts if no oracles are set for the given domain. + */ function _getThresholdHash(uint256 domain, uint256 id) internal view returns (bytes32 hash) { IOracleAdapter[] memory _adapters = getOracleAdapters(domain); (uint256 threshold, uint256 count) = getThresholdAndCount(domain); - if (count == 0) revert NoAdaptersEnabled(address(this), domain); - if (_adapters.length < threshold) revert ThresholdNotMet(address(this)); + if (count == 0) revert NoAdaptersEnabled(domain); + if (_adapters.length < threshold) revert ThresholdNotMet(); // get hashes bytes32[] memory hashes = new bytes32[](_adapters.length); @@ -204,28 +196,30 @@ abstract contract ShuSo is OwnableUpgradeable { } } } - revert ThresholdNotMet(address(this)); + revert ThresholdNotMet(); } - /// @dev Returns the hash unanimously agreed upon by all of the given oraclesAdapters.. - /// @param domain Uint256 identifier for the domain to query. - /// @param _adapters Array of oracle adapter addresses to query. - /// @param id Uint256 identifier to query. - /// @return hash Bytes32 hash agreed upon by the oracles for the given domain. - /// @notice _adapters must be in numberical order from smallest to largest and contain no duplicates. - /// @notice Reverts if _adapters are out of order or contain duplicates. - /// @notice Reverts if oracles disagree. - /// @notice Reverts if oracles have not yet reported the hash for the given ID. - /// @notice Reverts if no oracles are set for the given domain. + /** + * @dev Returns the hash unanimously agreed upon by all of the given oraclesAdapters. + * @param domain - Uint256 identifier for the domain to query. + * @param id - Uint256 identifier to query. + * @param _adapters - Array of oracle adapter addresses to query. + * @return hash - Bytes32 hash agreed upon by the oracles for the given domain. + * @notice _adapters must be in numerical order from smallest to largest and contain no duplicates. + * @notice Reverts if _adapters are out of order or contain duplicates. + * @notice Reverts if oracles disagree. + * @notice Reverts if oracles have not yet reported the hash for the given ID. + * @notice Reverts if no oracles are set for the given domain. + */ function _getHash( uint256 domain, uint256 id, IOracleAdapter[] memory _adapters ) internal view returns (bytes32 hash) { (uint256 threshold, uint256 count) = getThresholdAndCount(domain); - if (_adapters.length == 0) revert NoAdaptersGiven(address(this)); - if (count == 0) revert NoAdaptersEnabled(address(this), domain); - if (_adapters.length < threshold) revert ThresholdNotMet(address(this)); + if (_adapters.length == 0) revert NoAdaptersGiven(); + if (count == 0) revert NoAdaptersEnabled(domain); + if (_adapters.length < threshold) revert ThresholdNotMet(); checkAdapterOrderAndValidity(domain, _adapters); hash = hashi.getHash(domain, id, _adapters); } diff --git a/packages/evm/test/02_ShoyuBashi.spec.ts b/packages/evm/test/02_ShoyuBashi.spec.ts index 1ddc49d8..78de0e28 100644 --- a/packages/evm/test/02_ShoyuBashi.spec.ts +++ b/packages/evm/test/02_ShoyuBashi.spec.ts @@ -71,7 +71,7 @@ describe("ShoyuBashi", function () { const { shoyuBashi, wallet } = await setup() await expect(shoyuBashi.setHashi(wallet.address)) .to.emit(shoyuBashi, "HashiSet") - .withArgs(shoyuBashi.address, wallet.address) + .withArgs(wallet.address) }) }) @@ -97,7 +97,7 @@ describe("ShoyuBashi", function () { const { shoyuBashi } = await setup() await expect(shoyuBashi.setThreshold(DOMAIN_ID, 3)) .to.emit(shoyuBashi, "ThresholdSet") - .withArgs(shoyuBashi.address, DOMAIN_ID, 3) + .withArgs(DOMAIN_ID, 3) }) }) @@ -155,7 +155,7 @@ describe("ShoyuBashi", function () { const { shoyuBashi } = await setup() await expect(shoyuBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE])) .to.emit(shoyuBashi, "OracleAdaptersEnabled") - .withArgs(shoyuBashi.address, DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) + .withArgs(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) }) }) @@ -217,7 +217,7 @@ describe("ShoyuBashi", function () { await shoyuBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) await expect(shoyuBashi.disableOracleAdapters(DOMAIN_ID, [ADDRESS_THREE, ADDRESS_TWO])) .to.emit(shoyuBashi, "OracleAdaptersDisabled") - .withArgs(shoyuBashi.address, DOMAIN_ID, [ADDRESS_THREE, ADDRESS_TWO]) + .withArgs(DOMAIN_ID, [ADDRESS_THREE, ADDRESS_TWO]) }) }) diff --git a/packages/evm/test/03_GiriGiriBashi.spec.ts b/packages/evm/test/03_GiriGiriBashi.spec.ts index e3dd2d33..30afe156 100644 --- a/packages/evm/test/03_GiriGiriBashi.spec.ts +++ b/packages/evm/test/03_GiriGiriBashi.spec.ts @@ -107,7 +107,7 @@ describe("GiriGiriBashi", function () { it("Emits HashiSet() event", async function () { const { giriGiriBashi, hashi } = await setup() const tx = await giriGiriBashi.deployTransaction - await expect(tx).to.emit(giriGiriBashi, "HashiSet").withArgs(giriGiriBashi.address, hashi.address) + await expect(tx).to.emit(giriGiriBashi, "HashiSet").withArgs(hashi.address) }) }) @@ -129,7 +129,7 @@ describe("GiriGiriBashi", function () { const { giriGiriBashi } = await setup() await expect(giriGiriBashi.setThreshold(DOMAIN_ID, 3)) .to.emit(giriGiriBashi, "ThresholdSet") - .withArgs(giriGiriBashi.address, DOMAIN_ID, 3) + .withArgs(DOMAIN_ID, 3) }) }) @@ -152,7 +152,6 @@ describe("GiriGiriBashi", function () { const { giriGiriBashi, settings } = await setup() await expect(giriGiriBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO], [settings, settings])) .to.be.revertedWithCustomError(giriGiriBashi, "UnequalArrayLengths") - .withArgs(giriGiriBashi.address) }) it("Enables the given oracles", async function () { const { giriGiriBashi, settings } = await setup() @@ -183,7 +182,7 @@ describe("GiriGiriBashi", function () { const { giriGiriBashi, settings } = await setup() await expect(giriGiriBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE], [settings, settings])) .to.emit(giriGiriBashi, "OracleAdaptersEnabled") - .withArgs(giriGiriBashi.address, DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) + .withArgs(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) }) }) @@ -192,7 +191,6 @@ describe("GiriGiriBashi", function () { const { giriGiriBashi } = await setup() await expect(giriGiriBashi.disableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO])) .to.be.revertedWithCustomError(giriGiriBashi, "NoConfidenceRequired") - .withArgs(giriGiriBashi.address) }) it("Disables the given oracles", async function () { const { giriGiriBashi, settings } = await setup() @@ -261,7 +259,7 @@ describe("GiriGiriBashi", function () { const { giriGiriBashi, mockOracleAdapter } = await setup() await expect(giriGiriBashi.challengeOracleAdapter(DOMAIN_ID, 1, mockOracleAdapter.address)) .to.be.revertedWithCustomError(giriGiriBashi, "AdapterNotEnabled") - .withArgs(giriGiriBashi.address, mockOracleAdapter.address) + .withArgs(mockOracleAdapter.address) }) it("Reverts if value is less than minimum bond", async function () { const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter, settings } = await setup() @@ -272,7 +270,7 @@ describe("GiriGiriBashi", function () { ) await expect(giriGiriBashi.challengeOracleAdapter(DOMAIN_ID, 1, mockOracleAdapter.address)) .to.be.revertedWithCustomError(giriGiriBashi, "NotEnoughtValue") - .withArgs(giriGiriBashi.address, mockOracleAdapter.address, 0) + .withArgs(mockOracleAdapter.address, 0) }) it("Reverts if adapter is already quarantined", async function () { const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter, settings } = await setup() @@ -300,7 +298,7 @@ describe("GiriGiriBashi", function () { }), ) .to.be.revertedWithCustomError(giriGiriBashi, "AlreadyQuarantined") - .withArgs(giriGiriBashi.address, mockOracleAdapter.address) + .withArgs(mockOracleAdapter.address) }) it("Reverts if duplicate challenge exists", async function () { const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter, settings } = await setup() @@ -336,7 +334,7 @@ describe("GiriGiriBashi", function () { giriGiriBashi.callStatic.challengeOracleAdapter(DOMAIN_ID, 0, mockOracleAdapter.address, { value: BOND }), ) .to.be.revertedWithCustomError(giriGiriBashi, "OutOfRange") - .withArgs(giriGiriBashi.address, mockOracleAdapter.address, 0) + .withArgs(mockOracleAdapter.address, 0) // revert on block too far in the future const outOfRangeBlock = head + CHALLENGE_RANGE + 1 @@ -346,7 +344,7 @@ describe("GiriGiriBashi", function () { }), ) .to.be.revertedWithCustomError(giriGiriBashi, "OutOfRange") - .withArgs(giriGiriBashi.address, mockOracleAdapter.address, outOfRangeBlock) + .withArgs(mockOracleAdapter.address, outOfRangeBlock) // revert on block too deep for adapter const tooDeepBlock = 1 @@ -356,7 +354,7 @@ describe("GiriGiriBashi", function () { }), ) .to.be.revertedWithCustomError(giriGiriBashi, "OutOfRange") - .withArgs(giriGiriBashi.address, mockOracleAdapter.address, tooDeepBlock) + .withArgs(mockOracleAdapter.address, tooDeepBlock) // make sure it can actually be successful / doesn't always revert expect( @@ -493,7 +491,7 @@ describe("GiriGiriBashi", function () { ]), ) .to.be.revertedWithCustomError(hashi, "OraclesDisagree") - .withArgs(giriGiriBashi.address, mockOracleAdapter.address, secondMockOracleAdapter.address) + .withArgs(mockOracleAdapter.address, secondMockOracleAdapter.address) }) it("Keeps bond if canonical hash matches hash reported by challenged adapter", async function () { const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter, thirdMockOracleAdapter, settings } = @@ -600,7 +598,6 @@ describe("GiriGiriBashi", function () { ) .to.emit(giriGiriBashi, "ChallengeResolved") .withArgs( - giriGiriBashi.address, challengeId, DOMAIN_ID, challengeBlock, @@ -624,7 +621,7 @@ describe("GiriGiriBashi", function () { await giriGiriBashi.enableOracleAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) await expect(giriGiriBashi.callStatic.declareNoConfidence(DOMAIN_ID, 20, [mockOracleAdapter.address])) .to.be.revertedWithCustomError(giriGiriBashi, "CannotProveNoConfidence") - .withArgs(giriGiriBashi.address, DOMAIN_ID, 20, [mockOracleAdapter.address]) + .withArgs(DOMAIN_ID, 20, [mockOracleAdapter.address]) }) it("Reverts if any of the provided adapters agree", async function () { const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter, thirdMockOracleAdapter, settings } = @@ -638,7 +635,7 @@ describe("GiriGiriBashi", function () { await giriGiriBashi.enableOracleAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) await expect(giriGiriBashi.callStatic.declareNoConfidence(DOMAIN_ID, 22, adapters)) .to.be.revertedWithCustomError(giriGiriBashi, "AdaptersAgreed") - .withArgs(giriGiriBashi.address, adaptersThatAgree[0], adaptersThatAgree[1]) + .withArgs(adaptersThatAgree[0], adaptersThatAgree[1]) }) it("Clears state for domain", async function () { const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter, thirdMockOracleAdapter, settings } = @@ -666,7 +663,7 @@ describe("GiriGiriBashi", function () { await giriGiriBashi.enableOracleAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) await expect(giriGiriBashi.declareNoConfidence(DOMAIN_ID, 20, adapters)) .to.emit(giriGiriBashi, "NoConfidenceDeclareed") - .withArgs(giriGiriBashi.address, DOMAIN_ID) + .withArgs(DOMAIN_ID) }) }) @@ -687,7 +684,7 @@ describe("GiriGiriBashi", function () { const { giriGiriBashi } = await setup() await expect(giriGiriBashi.callStatic.setChallengeRange(DOMAIN_ID, CHALLENGE_RANGE)) .to.be.revertedWithCustomError(giriGiriBashi, "ChallengeRangeAlreadySet") - .withArgs(giriGiriBashi.address, DOMAIN_ID) + .withArgs(DOMAIN_ID) }) it("Sets challenge range for given domain", async function () { const { giriGiriBashi } = await setup() @@ -699,7 +696,7 @@ describe("GiriGiriBashi", function () { const { giriGiriBashi } = await setup() await expect(giriGiriBashi.setChallengeRange(2, CHALLENGE_RANGE)) .to.emit(giriGiriBashi, "ChallegenRangeUpdated") - .withArgs(giriGiriBashi.address, 2, CHALLENGE_RANGE) + .withArgs(2, CHALLENGE_RANGE) }) }) From 806165462a2fecd3ab131263551922514e0d42ba Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 29 Jan 2024 16:37:26 +0100 Subject: [PATCH 106/297] refactor(evm): adds missing comment within Hashi --- packages/evm/contracts/interfaces/IHashi.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/evm/contracts/interfaces/IHashi.sol b/packages/evm/contracts/interfaces/IHashi.sol index 2fbfbda6..8ced2604 100644 --- a/packages/evm/contracts/interfaces/IHashi.sol +++ b/packages/evm/contracts/interfaces/IHashi.sol @@ -18,6 +18,7 @@ interface IHashi { * @param id - ID for which to return hash. * @param threshold - Threshold to use. * @param oracleAdapters - Array of addresses for the oracle adapters to query. + * @notice If the threshold is 1, it will always return true. * @return result A boolean indicating if a threshold for a given message has been reached. */ function checkHashWithThresholdFromOracles( From 933c065c5b98d066e91d674c13e25c541d9b38bd Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 29 Jan 2024 17:13:26 +0100 Subject: [PATCH 107/297] fix(evm): fixes _getThresholdHash when the threshold = 1 --- packages/evm/contracts/ownable/ShuSo.sol | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/evm/contracts/ownable/ShuSo.sol b/packages/evm/contracts/ownable/ShuSo.sol index 7e7242ea..a75f2f91 100644 --- a/packages/evm/contracts/ownable/ShuSo.sol +++ b/packages/evm/contracts/ownable/ShuSo.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; -import { IHashi } from "../interfaces/IHashi.sol"; -import { IOracleAdapter } from "../interfaces/IOracleAdapter.sol"; import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import { IOracleAdapter } from "../interfaces/IOracleAdapter.sol"; +import { IHashi } from "../interfaces/IHashi.sol"; import { Domain } from "../interfaces/IDomain.sol"; import { IShuSho } from "../interfaces/IShuSho.sol"; @@ -164,6 +164,7 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { * @param domain - Uint256 identifier for the domain to query. * @param id - Uint256 identifier to query. * @return hash - Bytes32 hash agreed upon by a threshold of the oracles for the given domain. + * @notice If the threshold is set to 1, the function will return the hash of the first adapter in the list. * @notice Reverts if no threshold is not reached. * @notice Reverts if no oracles are set for the given domain. */ @@ -187,11 +188,10 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { if (baseHash == bytes32(0)) continue; // increment num for each instance of the curent hash - uint256 num = 1; + uint256 num = 0; for (uint j = 0; j < hashes.length; j++) { - if (baseHash == hashes[j] && i != j) { + if (baseHash == hashes[j]) { num++; - // return current hash if num equals threshold if (num == threshold) return hashes[i]; } } From 583c7627188d5aad3792ae19749701b85f2c3089 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 29 Jan 2024 17:14:09 +0100 Subject: [PATCH 108/297] refactor(evm): aligns ShoyuBashi and GiriGiriBashi tests --- packages/evm/test/02_ShoyuBashi.spec.ts | 8 +-- packages/evm/test/03_GiriGiriBashi.spec.ts | 62 +++++++++++----------- 2 files changed, 32 insertions(+), 38 deletions(-) diff --git a/packages/evm/test/02_ShoyuBashi.spec.ts b/packages/evm/test/02_ShoyuBashi.spec.ts index 78de0e28..0185ad0a 100644 --- a/packages/evm/test/02_ShoyuBashi.spec.ts +++ b/packages/evm/test/02_ShoyuBashi.spec.ts @@ -69,9 +69,7 @@ describe("ShoyuBashi", function () { }) it("Emits HashiSet() event", async function () { const { shoyuBashi, wallet } = await setup() - await expect(shoyuBashi.setHashi(wallet.address)) - .to.emit(shoyuBashi, "HashiSet") - .withArgs(wallet.address) + await expect(shoyuBashi.setHashi(wallet.address)).to.emit(shoyuBashi, "HashiSet").withArgs(wallet.address) }) }) @@ -95,9 +93,7 @@ describe("ShoyuBashi", function () { }) it("Emits HashiSet() event", async function () { const { shoyuBashi } = await setup() - await expect(shoyuBashi.setThreshold(DOMAIN_ID, 3)) - .to.emit(shoyuBashi, "ThresholdSet") - .withArgs(DOMAIN_ID, 3) + await expect(shoyuBashi.setThreshold(DOMAIN_ID, 3)).to.emit(shoyuBashi, "ThresholdSet").withArgs(DOMAIN_ID, 3) }) }) diff --git a/packages/evm/test/03_GiriGiriBashi.spec.ts b/packages/evm/test/03_GiriGiriBashi.spec.ts index 30afe156..c96d77af 100644 --- a/packages/evm/test/03_GiriGiriBashi.spec.ts +++ b/packages/evm/test/03_GiriGiriBashi.spec.ts @@ -27,7 +27,7 @@ function compareAddresses(a: string, b: string): number { } } -const setup = async () => { +const setup = async (_configs?: any) => { const [wallet] = await ethers.getSigners() const Hashi = await ethers.getContractFactory("Hashi") const hashi = await Hashi.deploy() @@ -53,7 +53,7 @@ const setup = async () => { [0, 1, 20, 21, 22], [HASH_ZERO, HASH_GOOD, HASH_DEAD, HASH_GOOD, HASH_GOOD], ) - await giriGiriBashi.setThreshold(DOMAIN_ID, 2) + await giriGiriBashi.setThreshold(DOMAIN_ID, _configs?.threshold || 2) await giriGiriBashi.setChallengeRange(DOMAIN_ID, CHALLENGE_RANGE) const settings = { @@ -65,14 +65,14 @@ const setup = async () => { } return { - wallet, - hashi, - GiriGiriBashi, giriGiriBashi, + GiriGiriBashi, + hashi, mockOracleAdapter, secondMockOracleAdapter, - thirdMockOracleAdapter, settings, + thirdMockOracleAdapter, + wallet, } } @@ -150,8 +150,9 @@ describe("GiriGiriBashi", function () { }) it("Reverts if arrays are unequal lengths", async function () { const { giriGiriBashi, settings } = await setup() - await expect(giriGiriBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO], [settings, settings])) - .to.be.revertedWithCustomError(giriGiriBashi, "UnequalArrayLengths") + await expect( + giriGiriBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO], [settings, settings]), + ).to.be.revertedWithCustomError(giriGiriBashi, "UnequalArrayLengths") }) it("Enables the given oracles", async function () { const { giriGiriBashi, settings } = await setup() @@ -189,8 +190,10 @@ describe("GiriGiriBashi", function () { describe("disableOracleAdapters()", function () { it("Reverts if a state of no confidence has not been established", async function () { const { giriGiriBashi } = await setup() - await expect(giriGiriBashi.disableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO])) - .to.be.revertedWithCustomError(giriGiriBashi, "NoConfidenceRequired") + await expect(giriGiriBashi.disableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO])).to.be.revertedWithCustomError( + giriGiriBashi, + "NoConfidenceRequired", + ) }) it("Disables the given oracles", async function () { const { giriGiriBashi, settings } = await setup() @@ -218,19 +221,22 @@ describe("GiriGiriBashi", function () { }) describe("getThresholdHash()", function () { - it("Updates head for given domain", async function () { - const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter, settings } = await setup() - await giriGiriBashi.enableOracleAdapters( - DOMAIN_ID, - [mockOracleAdapter.address, secondMockOracleAdapter.address], - [settings, settings], - ) - const oldHead = await giriGiriBashi.heads(DOMAIN_ID) - expect(await giriGiriBashi.callStatic.getThresholdHash(DOMAIN_ID, 1)).to.equal(HASH_GOOD) - await giriGiriBashi.getThresholdHash(DOMAIN_ID, 1) - const newHead = await giriGiriBashi.heads(DOMAIN_ID) - expect(newHead).not.to.equal(oldHead) - }) + for (let threshold = 1; threshold <= 3; threshold++) { + it(`Updates head for given domain with ${threshold}/3`, async function () { + const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter, thirdMockOracleAdapter, settings } = + await setup({ threshold }) + await giriGiriBashi.enableOracleAdapters( + DOMAIN_ID, + [mockOracleAdapter.address, secondMockOracleAdapter.address, thirdMockOracleAdapter.address], + [settings, settings, settings], + ) + const oldHead = await giriGiriBashi.heads(DOMAIN_ID) + expect(await giriGiriBashi.callStatic.getThresholdHash(DOMAIN_ID, 1)).to.equal(HASH_GOOD) + await giriGiriBashi.getThresholdHash(DOMAIN_ID, 1) + const newHead = await giriGiriBashi.heads(DOMAIN_ID) + expect(newHead).not.to.equal(oldHead) + }) + } }) describe("getHash()", function () { @@ -597,15 +603,7 @@ describe("GiriGiriBashi", function () { ), ) .to.emit(giriGiriBashi, "ChallengeResolved") - .withArgs( - challengeId, - DOMAIN_ID, - challengeBlock, - mockOracleAdapter.address, - wallet.address, - BOND, - true, - ) + .withArgs(challengeId, DOMAIN_ID, challengeBlock, mockOracleAdapter.address, wallet.address, BOND, true) }) }) From eae01e65b7f7cb3c462c383ecaa6672e3643da41 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 29 Jan 2024 19:51:13 +0100 Subject: [PATCH 109/297] refactor(evm): adds fx description to IReporter --- packages/evm/contracts/interfaces/IReporter.sol | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/packages/evm/contracts/interfaces/IReporter.sol b/packages/evm/contracts/interfaces/IReporter.sol index c9cfbacf..46006d4c 100644 --- a/packages/evm/contracts/interfaces/IReporter.sol +++ b/packages/evm/contracts/interfaces/IReporter.sol @@ -19,12 +19,29 @@ interface IReporter { error NotYaho(address sender, address expectedYaho); + /** + * @dev Dispatches blocks to a given oracle adapter on the target chaib. + * @param toChainId - The target chain's Uint256 identifier. + * @param adapter - The oracle adapter instance to use. + * @param blockNumbers - An array of Uint256 block numbers to dispatch. + * @notice blockNumbers must include block numbers that are greater than or equal to (currentBlock - 256) due to EVM limitations. + * @return result - The result returned by the adapter as bytes. + */ function dispatchBlocks( uint256 toChainId, IOracleAdapter adapter, uint256[] memory blockNumbers ) external payable returns (bytes32); + /** + * @dev Dispatches messages to a target chain using the specified oracle adapter. + * @param toChainId - The target chain's Uint256 identifier. + * @param adapter - The oracle adapter instance to use. + * @param messageIds - An array of Uint256 message identifiers. + * @param messageHashes - An array of bytes32 message hashes. + * @notice This function can be called only by Yaho + * @return result - The result returned by the adapter as bytes. + */ function dispatchMessages( uint256 toChainId, IOracleAdapter adapter, From 74fb30bae2fbc545275e538305ab48d87a3ee230 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 29 Jan 2024 19:51:37 +0100 Subject: [PATCH 110/297] refactor(evm): lints SygmaAdapter --- packages/evm/contracts/adapters/Sygma/SygmaAdapter.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/evm/contracts/adapters/Sygma/SygmaAdapter.sol b/packages/evm/contracts/adapters/Sygma/SygmaAdapter.sol index 251a649f..0b98ef1b 100644 --- a/packages/evm/contracts/adapters/Sygma/SygmaAdapter.sol +++ b/packages/evm/contracts/adapters/Sygma/SygmaAdapter.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; -import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol"; +import { AccessControl } from "@openzeppelin/contracts/access/AccessControl.sol"; import "../BlockHashOracleAdapter.sol"; contract SygmaAdapter is AccessControl, BlockHashOracleAdapter { From c1266e2cc4e0333fbd61f66336f1b3a30346a30e Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 30 Jan 2024 07:44:04 +0100 Subject: [PATCH 111/297] refactor(evm): refactors HeaderStorage events and errors --- packages/evm/contracts/interfaces/IHeaderStorage.sol | 9 ++++++++- packages/evm/contracts/test/MockOracleAdapter.sol | 4 ++-- packages/evm/contracts/utils/HeaderStorage.sol | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/evm/contracts/interfaces/IHeaderStorage.sol b/packages/evm/contracts/interfaces/IHeaderStorage.sol index 05613f85..e28f65c3 100644 --- a/packages/evm/contracts/interfaces/IHeaderStorage.sol +++ b/packages/evm/contracts/interfaces/IHeaderStorage.sol @@ -5,10 +5,17 @@ pragma solidity ^0.8.17; * @title IHeaderStorage */ interface IHeaderStorage { - error HeaderOutOfRange(address emitter, uint256 blockNumber); + error HeaderOutOfRange(uint256 blockNumber); event HeaderStored(uint256 indexed blockNumber, bytes32 indexed blockHeader); + /** + * @dev Retrieves the stored block header for a specific block number. + * @param blockNumber - The block number as a uint256 value. + * @return The block header as a bytes32 value. + */ + function headers(uint256 blockNumber) external view returns (bytes32); + /** * @dev Stores and returns the header for the given block. * @param blockNumber - Block number. diff --git a/packages/evm/contracts/test/MockOracleAdapter.sol b/packages/evm/contracts/test/MockOracleAdapter.sol index b61bf748..e4f796cb 100644 --- a/packages/evm/contracts/test/MockOracleAdapter.sol +++ b/packages/evm/contracts/test/MockOracleAdapter.sol @@ -5,10 +5,10 @@ import { OracleAdapter } from "../adapters/OracleAdapter.sol"; import { BlockHashOracleAdapter } from "../adapters/BlockHashOracleAdapter.sol"; contract MockOracleAdapter is OracleAdapter, BlockHashOracleAdapter { - error LengthMismatch(address emitter); + error LengthMismatch(); function setHashes(uint256 domain, uint256[] memory ids, bytes32[] memory hashes) external { - if (ids.length != hashes.length) revert LengthMismatch(address(this)); + if (ids.length != hashes.length) revert LengthMismatch(); for (uint256 i = 0; i < ids.length; i++) { _storeHash(domain, ids[i], hashes[i]); } diff --git a/packages/evm/contracts/utils/HeaderStorage.sol b/packages/evm/contracts/utils/HeaderStorage.sol index 179c3dc4..6e1a9f90 100644 --- a/packages/evm/contracts/utils/HeaderStorage.sol +++ b/packages/evm/contracts/utils/HeaderStorage.sol @@ -11,7 +11,7 @@ contract HeaderStorage is IHeaderStorage { bytes32 blockHeader = headers[blockNumber]; if (blockHeader == 0) { blockHeader = blockhash(blockNumber); - if (blockHeader == 0) revert HeaderOutOfRange(address(this), blockNumber); + if (blockHeader == 0) revert HeaderOutOfRange(blockNumber); headers[blockNumber] = blockHeader; emit HeaderStored(blockNumber, blockHeader); } From eb659931ee3d52e168e580baa19fa97fbb9c4fc0 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 30 Jan 2024 17:11:29 +0100 Subject: [PATCH 112/297] fix(evm): rm typo within ShuSo --- packages/evm/contracts/ownable/ShuSo.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/evm/contracts/ownable/ShuSo.sol b/packages/evm/contracts/ownable/ShuSo.sol index a75f2f91..dd153b6f 100644 --- a/packages/evm/contracts/ownable/ShuSo.sol +++ b/packages/evm/contracts/ownable/ShuSo.sol @@ -187,7 +187,7 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { bytes32 baseHash = hashes[i]; if (baseHash == bytes32(0)) continue; - // increment num for each instance of the curent hash + // increment num for each instance of the current hash uint256 num = 0; for (uint j = 0; j < hashes.length; j++) { if (baseHash == hashes[j]) { From 23bfeb8753c38d135c2f6a059f17ae9a497fecb2 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 30 Jan 2024 17:16:35 +0100 Subject: [PATCH 113/297] chore(test): rm not used test --- .../evm/test/adapters/axiom/00_Play.spec.ts | 261 ------------------ 1 file changed, 261 deletions(-) delete mode 100644 packages/evm/test/adapters/axiom/00_Play.spec.ts diff --git a/packages/evm/test/adapters/axiom/00_Play.spec.ts b/packages/evm/test/adapters/axiom/00_Play.spec.ts deleted file mode 100644 index 9446c461..00000000 --- a/packages/evm/test/adapters/axiom/00_Play.spec.ts +++ /dev/null @@ -1,261 +0,0 @@ -// Note that these E2E tests simulate cross-chain interactions but, -// for the sake of convenience, use only one network as both the origin and destination chain. -import { expect } from "chai" -import { config, ethers, network } from "hardhat" - -const DOMAIN_ID = network.config.chainId -const BYTES32_DOMAIN_ID = "0x0000000000000000000000000000000000000000000000000000000000007A69" - -// const ID_ZERO = 0 -const ID_ONE = 10000000 -const CryptoPunk420OwnerAtBlock10Mil = "0xc352b534e8b987e036a93539fd6897f53488e56a" -// https://etherscan.io/tx/0x324ba0703e783108b0b5f66ab520de9b13529b6bb7db789ce8f39f1369973a43 -// storage key for cryptopunk 0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB -// https://demo.axiom.xyz/custom -// Function: attestSlots((uint32,bytes32,bytes32,uint32,bytes32[10]), bytes) -// # Name Type Data -// 0 blockData.blockNumber uint32 10000000 -// 0 blockData.claimedBlockHash bytes32 0xaa20f7bde5be60603f11a45fc4923aab7552be775403fc00c2e6b805e6297dbe -// 0 blockData.prevHash bytes32 0x00dccd7227da056f4a439347923411d11e7756a88e3c9d4efbe9852cee671b65 -// 0 blockData.numFinal uint32 1024 -// 0 blockData.merkleProof bytes32[10] 0x7823fa4da327cf97a9b86da990b0755ebfaa3b490ecd0be80b0ed24106d1a8d7,0x126a2dc8ecfedc0ceb5d312da2ad5f88a93c6a3f4a38a8b778bc5ccb1d39f937,0x0cf1cf53800ec678d0deacea8ef8e57747185fa438c5a823f25274ecc3613463,0x356b4d133078199280cf008daddc4bc4ebc2fd543e144b6e01859b026a5c5115,0xbf337229d4003538b1d2b44c21c5b566b6036a00c2d389204222d328dbb72821,0xeb259a83488c376707bd80d3bc63e1b55bf6ed9248ea72392ffc7f125133293d,0x93d75de9876136b28cb9334615785f472696a7fe448c5b983c0f1f916de033b3,0xd7bdbe170113c89491892ea3fd0e4f9a0ec17109141536e78550e82ee6860f28,0xe16c89a378abf45439eb41475f93fb52c38bc987425f5bcebbcd13ec3f0d36df,0x4f57444b9a4f732d077c3c3062043ff61ff001afed844cd074e00c5f73c64f5d -// 2 proof bytes 0x000000000000000000000000000000000000000000af8fdb20c227d925248e42000000000000000000000000000000000000000000644db7116af142304717e2000000000000000000000000000000000000000000002063eb172efc8cd28c7700000000000000000000000000000000000000000084da9135a9629d12a554af00000000000000000000000000000000000000000058bb95a1264192c555eb180000000000000000000000000000000000000000000008b46561cf0d581f19d9000000000000000000000000000000000000000000e6c200773117d79ace781f00000000000000000000000000000000000000000091411a01fc5663579b998a00000000000000000000000000000000000000000000201f607169410341ed5300000000000000000000000000000000000000000003beb92fd8db4c92fc4323000000000000000000000000000000000000000000c2de15bab300d3b076e1dc000000000000000000000000000000000000000000002ef20ab8392eed55288700000000000000000000000000000000aa20f7bde5be60603f11a45fc4923aab000000000000000000000000000000007552be775403fc00c2e6b805e6297dbe0000000000000000000000000000000000000000000000000000000000989680000000000000000000000000b47e3cd837ddf8e4c57f05d70ab865de6e193bbb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000c352b53400000000000000000000000000000000e8b987e036a93539fd6897f53488e56a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000043727970746f50756e6b73000000000000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000c352b53400000000000000000000000000000000e8b987e036a93539fd6897f53488e56a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000c352b53400000000000000000000000000000000e8b987e036a93539fd6897f53488e56a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000c352b53400000000000000000000000000000000e8b987e036a93539fd6897f53488e56a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000c352b53400000000000000000000000000000000e8b987e036a93539fd6897f53488e56a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000c352b53400000000000000000000000000000000e8b987e036a93539fd6897f53488e56a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000c352b53400000000000000000000000000000000e8b987e036a93539fd6897f53488e56a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000c352b53400000000000000000000000000000000e8b987e036a93539fd6897f53488e56a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000c352b53400000000000000000000000000000000e8b987e036a93539fd6897f53488e56a2c417b53ac258dea0e9c3a09d465fa7b2ad9817949830926652cccf9e457ccff0a3520e219203ce55d67133c7044e722cd1c62b332863afac1b8aa172925e51a038d06fea82e77649ee6ff7d78478d50e4f76c29297f011806f3ea5087092b5021d6565ad78f3fe4b586de17653d0d83c54f020d8edc847f715b188fe8c9b5df00f76251d51443cbeb6de48750b01e75dcf232105c77d8b1ad56ca45daa1fe751dad7cf6b6c5aba58e16fb2c380fb861cbf69228fbd662736341e4ebe19beae02ee2ff31085b71de6b8ea37fcd87e5e040ab0ce40f84f4919a5f8da433e8e0421d923eec9ca9d87ceee7307df0da870d03e6c86dc7a2ceb975290856d49a14f716f87687189db783f45fc071cc00b57479efacd2a81d20d80ade7d9cc3b9427604a354b94ea14fc45a8821e424b2432770416b635c14488aaa56d021ada72b30259a5cc3dbc0c70b4033990cf0256b00a2bb4e3f95091011abb04dcb167d20a10b5962c321f9250c76008f986767a4fb019595b307af3e17ed8667606c4c02b011205e3aaca1c0e3fdaf0fe0440c13b393cc60818cd3807e717a671655a850b22f3d3fe0ae70e5be87b078dfa93ffe024857feadcc85444a38f4cb5815cf837f1027ba5859ac2347603af8d92b864641f276ea731575d905d8aeb7c5bf0614a70c8f50c5eb504142756459bf9ad890a1e98a0c0bb6985753b032e39234d78d8b1334e88a5c5345456317bf3c323f5059ed451bff0a3b98b7b7bcd2a6a2e2eda4029a0257f2ae62da324efdc2d501415659153b3fddc4de0325e1ee2334f1c7ce0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000229c401756e1f1bf00a43e9091579781658e52d2411c09444b529c1c604cd09bd2447dc0526bb32fd06a26544d5c564f89260eb2c34315d7538bef78fd24243062fb0db58ebc6fb463894fab1fe0cda941d0bbcc97011875b95324ce68e255a5123cda5eb0f1404d4dfbbf6322010bc1f63a6701a10f3333b61a0bb199fafce330982d83b8646a63f6dfdbebd4c6e6f6c622cc64ca598e65c3a9b43bebbb401fe211f9c1cde3f95f867527cc14bde911e94fd3115b725803b83a768a5aa6bfaba056ed9da84987ba89dc11838efc71789395cbdbb8bc51e731979409744e0b28f19806de8bc36e2335fb77f561b7535be30c51451ad60ff9d6c3dea8591f6bad00d80f4627e6fc496a8d35efc7ee2247ebc1fe940c966115965e04019ee73ae47213ddc26f47c6bd48ccc6059d9da9ea91538cf9f80f4e3be8fed91e85f90150802bf21cb3805aab138e17ac6ea5433eab028a0dfe206364e2acc4e074fcefabf03b7df4afc594d202ca2a892afd4935e5a5fd9a7e80c9be3d26926a217af5aae00420c111a7311fa500ae6e95fcf52cbee8378be50b85ba9e7fd9f4f1afdf0a216b20f3e7fd807e8695ce1689de2c62aa79fad10c9a5f621bcf25fd4e59b80b11fd0f3ddf53445b77fdb5cc9384532b17db631d4c371ec8582dcb79c4d14cd9e2501804dae3e71f9b8434bbc808363dd4d79b1248b35b15053c31c2b26edd2e0181c0bb5c799a84a9c219e0cfe55ed78b5ead9a441ab1812d3d0f0d07b9334a801d91543a42d1763640f8eccaca82af95415a88fe494607edac09fadf6c6f75227a04bc30233135a1ced057f0866cc8398a18c8547f767027d99a9a728fc1d4c00000000000000000000000000000000000000000000000000000000000000011d5d1460c917d52426c75b3be66a3273eea78f1bb27c9193cd44c23c8f6a84e520f0005a8cc725d671c522b3babef27c1adb38ebd18f41dabf581794df165676251d1f286f5cb238c1d95e149b37ec6a0ada2b65416303d371ed8607cd9558f711d3eca5b425ddb7ae6ab6760cf36123e63da627bfaa93f6d35cba5b22511bc5192609ee19ae267f2cd42ee93174692da524a1109daef4a06bbe47cb4880fda21854b7719fe26e00ee5de50d57cd229724f0370a1f860cfc95a8d7c117d5f23c2d0866e798112bf67b647c2ad0e83fcecc1abd2989350d45345611f63db5d2201f34c4a32c3d98e498455036c20f3601caa007f71691d53efa0ba7bfcde3594f155e0dbde630af0736817e818df64c8acf53b63ec316464f5963d7c6d33f55d602d6a3d6de0b695bddfab9e74fa87cfb72cf377f35f79ae8602e8fdc8ea8550e085347ca45e928f8025696856778d660d957b26faa90e5c731b57a3a7891457e0b5f5d9530b74eecf70b2c7b0b6dc936d86fb86e5d057f55cc260ffd0eba583d1a2e20d53b9fd6abcd0629bc5ba9bafde1b28b1d39d68853ddc05a49bb1c083d062c135ac184127e8ade0ad40b765f51f9a01d4242e36189ec8352259953ab2c27ccbba9c63f44a0614c7801d179515d945a135d9aad8df9d32d4b36bf6a8e680726e91a97cb641fa4f7f624dd260bf17a97393a642232319846f9052ba3e3c51a2d48aee7f6d0309964e5210eeb8d7597febbe7a86a3e8bdfb087020902899901020c077d97947319135f61d8b72801357bfc280f4254ab1b3f33fad2b05cc021c7bf12369c7d9e322669d04581a4aab17855b6789db89209c4911799b3980d152507f853337bbffb5634153fd157a5881706377ad3ad104d3030cf76b57d88178b2ff9f0c150022c23dec41317d668e7b756a8a2d57c891b23e12c0910397027b491d766663c03a534cb9c8b4681e28f4121d2f8fa9ce7b7e9a866b4762ed4 - -const blockHashWitness = { - blockNumber: 10000000, - claimedBlockHash: "0xaa20f7bde5be60603f11a45fc4923aab7552be775403fc00c2e6b805e6297dbe", - prevHash: "0x00dccd7227da056f4a439347923411d11e7756a88e3c9d4efbe9852cee671b65", - numFinal: 1024, - merkleProof: [ - "0x7823fa4da327cf97a9b86da990b0755ebfaa3b490ecd0be80b0ed24106d1a8d7", - "0x126a2dc8ecfedc0ceb5d312da2ad5f88a93c6a3f4a38a8b778bc5ccb1d39f937", - "0x0cf1cf53800ec678d0deacea8ef8e57747185fa438c5a823f25274ecc3613463", - "0x356b4d133078199280cf008daddc4bc4ebc2fd543e144b6e01859b026a5c5115", - "0xbf337229d4003538b1d2b44c21c5b566b6036a00c2d389204222d328dbb72821", - "0xeb259a83488c376707bd80d3bc63e1b55bf6ed9248ea72392ffc7f125133293d", - "0x93d75de9876136b28cb9334615785f472696a7fe448c5b983c0f1f916de033b3", - "0xd7bdbe170113c89491892ea3fd0e4f9a0ec17109141536e78550e82ee6860f28", - "0xe16c89a378abf45439eb41475f93fb52c38bc987425f5bcebbcd13ec3f0d36df", - "0x4f57444b9a4f732d077c3c3062043ff61ff001afed844cd074e00c5f73c64f5d", - ], -} - -const proof = - "0x000000000000000000000000000000000000000000c20a750285a779a8f382940000000000000000000000000000000000000000009040749a7b21fbbbc56ab1000000000000000000000000000000000000000000000cfa5466d74518ec8fc20000000000000000000000000000000000000000005df3478e70672aef4924ce000000000000000000000000000000000000000000231c15e9f1d049b4906f360000000000000000000000000000000000000000000028f4ec9495f4ac35ba99000000000000000000000000000000000000000000b4ea379117dbb72eb018e6000000000000000000000000000000000000000000d02a7285294fc5b3e33ce7000000000000000000000000000000000000000000002cd026928629d6bde1220000000000000000000000000000000000000000008c7d9b39cd4b8001427b92000000000000000000000000000000000000000000b71a51e053a0d595d1c0950000000000000000000000000000000000000000000018168d68ca1de197cf0700000000000000000000000000000000aa20f7bde5be60603f11a45fc4923aab000000000000000000000000000000007552be775403fc00c2e6b805e6297dbe0000000000000000000000000000000000000000000000000000000000989680000000000000000000000000b47e3cd837ddf8e4c57f05d70ab865de6e193bbb000000000000000000000000000000000f92f3ad435570e9f610d535ca71c2a400000000000000000000000000000000c5ef34aa438e925fe55dbb614b291b4b00000000000000000000000000000000000000000000000000000000c352b53400000000000000000000000000000000e8b987e036a93539fd6897f53488e56a000000000000000000000000000000000f92f3ad435570e9f610d535ca71c2a400000000000000000000000000000000c5ef34aa438e925fe55dbb614b291b4b00000000000000000000000000000000000000000000000000000000c352b53400000000000000000000000000000000e8b987e036a93539fd6897f53488e56a000000000000000000000000000000000f92f3ad435570e9f610d535ca71c2a400000000000000000000000000000000c5ef34aa438e925fe55dbb614b291b4b00000000000000000000000000000000000000000000000000000000c352b53400000000000000000000000000000000e8b987e036a93539fd6897f53488e56a000000000000000000000000000000000f92f3ad435570e9f610d535ca71c2a400000000000000000000000000000000c5ef34aa438e925fe55dbb614b291b4b00000000000000000000000000000000000000000000000000000000c352b53400000000000000000000000000000000e8b987e036a93539fd6897f53488e56a000000000000000000000000000000000f92f3ad435570e9f610d535ca71c2a400000000000000000000000000000000c5ef34aa438e925fe55dbb614b291b4b00000000000000000000000000000000000000000000000000000000c352b53400000000000000000000000000000000e8b987e036a93539fd6897f53488e56a000000000000000000000000000000000f92f3ad435570e9f610d535ca71c2a400000000000000000000000000000000c5ef34aa438e925fe55dbb614b291b4b00000000000000000000000000000000000000000000000000000000c352b53400000000000000000000000000000000e8b987e036a93539fd6897f53488e56a000000000000000000000000000000000f92f3ad435570e9f610d535ca71c2a400000000000000000000000000000000c5ef34aa438e925fe55dbb614b291b4b00000000000000000000000000000000000000000000000000000000c352b53400000000000000000000000000000000e8b987e036a93539fd6897f53488e56a000000000000000000000000000000000f92f3ad435570e9f610d535ca71c2a400000000000000000000000000000000c5ef34aa438e925fe55dbb614b291b4b00000000000000000000000000000000000000000000000000000000c352b53400000000000000000000000000000000e8b987e036a93539fd6897f53488e56a000000000000000000000000000000000f92f3ad435570e9f610d535ca71c2a400000000000000000000000000000000c5ef34aa438e925fe55dbb614b291b4b00000000000000000000000000000000000000000000000000000000c352b53400000000000000000000000000000000e8b987e036a93539fd6897f53488e56a000000000000000000000000000000000f92f3ad435570e9f610d535ca71c2a400000000000000000000000000000000c5ef34aa438e925fe55dbb614b291b4b00000000000000000000000000000000000000000000000000000000c352b53400000000000000000000000000000000e8b987e036a93539fd6897f53488e56a068289d29f77618bbdcc6c71439a097a276013e033be69d8365ee3f31330cb720f5a67cf836f713e3cd4334b1cddf68091628f397af8834697d383c46ff30bd728a71b966ef58f2085906901b8721c12c6e4bdbfbd944fa61b5f32d6bb3034260f1c347c2c3f76bf78bc1ff9a0db6355644e79f3e61259b78020b867707f1c382496e73fef160560bc27269102bdccfad037b7d73a09041dd7f6b4fb7f3d4875097d4857f9b0dac1f369f688c2299204b75ad707bb2158e7fbd7b8f16e61b9bb10b72622525962ac6189f50c65efb70cdfa8586ece1972885cb62297ad077c45156c7ac61eaf715afcc00f5b294320d4dddf1545d66e2c565646d4bb45894ca50eec1d5a454b34c1a66997bfb222ea87d93f31ff0528662626a46e57e3c19513299b9b6c08ceeb6c74317c2aedf8767c98568c4affe24421a43c70be4423a22128cc3661a3063d8c787b88a83258633eb03a1a1672062cd8e1fa8dd3bb2eff9e1b17d7de9c9a9ccc741cb643c13af808e4ec81e97a33437c3a33cc663972e695289f54201c49bde0b9551fb27fb51d4e6d208b21f99827887fd8ca467c39d13716500b7e73a058379e09d8c79f0a2eda1e699c81042b8e2647f3fe0f0dba677f25a81b7c54b1efe184426530ad1f12ace22255859b8325f97922231b6c1de3fb0610102f9856a361b7fa1a39a96e0bfac9bcd6dcc3ec1ff8e80d9195590d305f147d3c67016e1a6f13a244a0e09082ceb4c54a09cf777197c82a0940dfea287f02d345930ce03b8a1ef30efc65ddf2eaede252f562443888f31747097a7b3956000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020bfc7599b7ad525a7a5c5673f24831cb57330c6368cfee195c2c8e6e2dcdff3328d97b69dd606bb9c58081b1e5b481a14c4a86e8a3b93e2197f2df3c2d6b45ca10c19fd6de9c6c266fe319d317d562028a9c0cc1497aeccc08e06cc261ea9c9f1314a2543e41ccdeb3cf95792cc31597ea54a947345d8d4c777da128946154d710070a5a3b1da94a326debdd3e42fc7f212abbe8d41e9f2255d9b65e671993ae2c745546d019c9d80f35ae33777ea4a0ff2792cf7ca2ad3ec78d408fc6034daa0dc791655fe9900cf082b028e33ab4368df91e47acfd9ba73eb0fb239453eca102c6a7f3a6bdd7696732e0b00eaf8300124236fc661af10d7c8ab44a1227b30e069f109e21b1359543f617314953f5bd0de5cf754ff94a03feb8b628a0d702840452c6cf70191c30a2461ca712b18d1022792aeba142427f2dade8265d50adbe0cfb24eb5762a677de8ed5acbe0654b01894df77a838d58df6ccc6aadea436dc2000649b14adec14afe9f132afc1ab6deb50980cd54915359c9a20fb59127f212700dc6fde636038c75a918aa2aa7082265ea6ccc1f2380c59a5d6b85794d4be136ecca620dee85a87e5dc94b07814d36fb3bc698e546ef8ef4304f4ac49e2ca106db6229d808b98feb76ca2bacb6d08bae4f0442c031e4838d68babf72cbeed07f5c9b3c318f27212e12519e7434fc4a36ec32415d39cd0545701df1643f2261cee180b590c88a67480df8d770fa50811bea8a4047e8e72c140354d5630f39002e5fae847e670e8a71e49fe41dc3a90d5e0e6519230f4f0cfc6289f7d94b3d923dd9e445b4e723d652cb0a28c4903356c960e5abd4f1dd5e53864053b6881bf00000000000000000000000000000000000000000000000000000000000000012e0a8d9f0ffbf6bd32ed84839f22fe86183955e330dc32c71a7bb91a8a4a1ea906db2b670bae0f9bbe78fe5831cb3d5b04d3772ce8bbebe3f2203afdf3226d4319c919e92c8f35440c255be3c1e0ec605a4a135602e9a9e28fa7b130b5a2d9cf126cee39684d877a577301b4523586d60643692cfce5a9b7739577dbb270292b237d2e53bb5a536cf096398a8bd37e9cdbab0bef75d41538a932b30763261e1917e1b18cad3ae3eb8d2b6c72b0a0ac6131985a9bca46c5cdc5a690aae80633871e8f1e8706a972a124da6864dec1780e2628af87e2e2e1a246b3a4aead2ed5420ad699156b44b28089c1e001f56025927f44811f16da5e1627ed76aeec0476c50ad52cc72bdc305d4f95136e84aeb351bde85c5bcd61376252a762b25922fa0d2a78e5a89489bd3ca3ab1044d586d2ce1ecb3e67fb34f6c0f17b7c04ec7b6ccd00cfab3aa4660176290472248fb2e65dffe64c78735c0450bfd751a5df4f6cc22d23ce481ea6694d4e838d9ee90896d5e8dd1d383ceff8f0b1663adc5423cb801fef7f6ce0ae102ffefa790f3205392215e69fb6da0b188db31b7184ac3231af0450ecdcba2d09b5a928f1fe9a0c5b86c93cab01a3ff6a9b6ced1a08d112cf0b241f916f1326df53e6f0a378779d1858acd187eb4313bb47beb55942f5af3d5f0edd784e862c678e020bd222dbea1d8915c3ed46bc73ab0ea69b3df2438c513710f81e94e27dd8c81fe3a2ec350ce18b48c72927f4703ce2ab4915c7feb4ac3508044a522b16938d9fa9bd90a5a0c03aca11e38465f0104c5960420f1dba9a542a3394443534a115c2c1523450a8b9c000bb400e978a5e0c94cf6a87c01b858408062321c2720ef601121f822072883452be1adfb58d50acb9a97bc75fd8564d0997fbf9ad6fd83bdadd4c03a381818736bc0bdadc0a4ab7265102328677abb41a6f8f471fb3072b1710c891959c09ef6304a491d724e66c57760f4a38593c2b" - -const setup = async () => { - const [wallet] = await ethers.getSigners() - - // deploy hashi - const Hashi = await ethers.getContractFactory("Hashi") - const hashi = await Hashi.deploy() - - // deploy GiriGiriBashi - const GiriGiriBashi = await ethers.getContractFactory("GiriGiriBashi") - const giriGiriBashi = GiriGiriBashi.deploy(wallet.address, hashi.address) - - // deploy Yaho - const Yaho = await ethers.getContractFactory("Yaho") - const yaho = await Yaho.deploy() - - // deploy AMB - const AMB = await ethers.getContractFactory("MockAMB") - const amb = await AMB.deploy() - - const axiomAddressMainnet = "0xF990f9CB1A0aa6B51c0720a6f4cAe577d7AbD86A" - const verifierAddress = "0x29052F4F5e96d71772AD2b145f8C3eb7db4DB33E" - - const AxiomV02StoragePf = await ethers.getContractFactory("AxiomV02StoragePf") - const storageProof = await AxiomV02StoragePf.deploy(axiomAddressMainnet, verifierAddress, hashi.address) - - return { - amb, - wallet, - hashi, - giriGiriBashi, - yaho, - storageProof, - } -} - -describe("Axiom E2E test", function () { - this.beforeEach(async () => { - await network.provider.request({ - method: "hardhat_reset", - params: [ - { - forking: { - jsonRpcUrl: config?.networks?.mainnet?.url, - blockNumber: 10000000, - }, - }, - ], - }) - }) - - this.afterAll(async () => { - await network.provider.request({ - method: "hardhat_reset", - params: [], - }) - }) - - describe("Execution layer", function () { - it("Attest slots for the claimed block head with the block hash agreed on by N adapters", async function () { - const { amb, hashi, storageProof } = await setup() - - // deploy header storage - const HeaderStorage = await ethers.getContractFactory("HeaderStorage") - const headerStorage = await HeaderStorage.deploy() - - // deploy AMBHeaderReporter - const AMBHeaderReporter = await ethers.getContractFactory("AMBHeaderReporter") - const ambHeaderReporter = await AMBHeaderReporter.deploy(amb.address, headerStorage.address) - - // deploy AMBAdapter - const AMBAdapter = await ethers.getContractFactory("AMBAdapter") - const ambAdapter = await AMBAdapter.deploy(amb.address, ambHeaderReporter.address, BYTES32_DOMAIN_ID) - - await ambHeaderReporter.reportHeaders([ID_ONE], ambAdapter.address, 10000000) - - const expectedHash = await headerStorage.headers(ID_ONE) - expect( - await hashi.getHash( - DOMAIN_ID, - ID_ONE, - // TODO: currently we query the AMB adapter twice. We should query two or more different adapters. - [ambAdapter.address, ambAdapter.address], - ), - ).to.equal(expectedHash) - - const attestation = await storageProof.attestSlotsWithHashi( - proof, - DOMAIN_ID, - ID_ONE, - blockHashWitness.claimedBlockHash, - [ambAdapter.address, ambAdapter.address], - ) - - // uint32 blockNumber, address addr, uint256 slot, uint256 slotValue - // https://etherscan.io/tx/0x324ba0703e783108b0b5f66ab520de9b13529b6bb7db789ce8f39f1369973a43#eventlog - await expect(attestation).to.emit(storageProof, "SlotAttestationEvent") - }) - - it("Reverts if the claimed block header is different from the block hash agreed on by N adapters", async function () { - const { amb, hashi, storageProof } = await setup() - - // deploy header storage - const HeaderStorage = await ethers.getContractFactory("HeaderStorage") - const headerStorage = await HeaderStorage.deploy() - - // deploy AMBHeaderReporter - const AMBHeaderReporter = await ethers.getContractFactory("AMBHeaderReporter") - const ambHeaderReporter = await AMBHeaderReporter.deploy(amb.address, headerStorage.address) - - // deploy AMBAdapter - const AMBAdapter = await ethers.getContractFactory("AMBAdapter") - const ambAdapter = await AMBAdapter.deploy(amb.address, ambHeaderReporter.address, BYTES32_DOMAIN_ID) - - await ambHeaderReporter.reportHeaders([ID_ONE], ambAdapter.address, 10000000) - - const expectedHash = await headerStorage.headers(ID_ONE) - expect( - await hashi.getHash( - DOMAIN_ID, - ID_ONE, - // TODO: currently we query the AMB adapter twice. We should query two or more different adapters. - [ambAdapter.address, ambAdapter.address], - ), - ).to.equal(expectedHash) - - const invalidBlockHashWitness = { - ...blockHashWitness, - claimedBlockHash: "0x30db8cd39796630f83af6d4cb062a50f90d1768f8723f37af018be8b1d664e50", - } - - await expect( - storageProof.attestSlotsWithHashi(proof, DOMAIN_ID, ID_ONE, invalidBlockHashWitness.claimedBlockHash, [ - ambAdapter.address, - ambAdapter.address, - ]), - ).to.revertedWith("block hash mismatch with hash block hash") - }) - }) - - describe("L1 State Verification Example", function () { - it("Get the correct cryptopunk#420 owner address with the proof", async function () { - const { amb, hashi, storageProof } = await setup() - - // deploy header storage - const HeaderStorage = await ethers.getContractFactory("HeaderStorage") - const headerStorage = await HeaderStorage.deploy() - - // deploy AMBHeaderReporter - const AMBHeaderReporter = await ethers.getContractFactory("AMBHeaderReporter") - const ambHeaderReporter = await AMBHeaderReporter.deploy(amb.address, headerStorage.address) - - // deploy AMBAdapter - const AMBAdapter = await ethers.getContractFactory("AMBAdapter") - const ambAdapter = await AMBAdapter.deploy(amb.address, ambHeaderReporter.address, BYTES32_DOMAIN_ID) - - await ambHeaderReporter.reportHeaders([ID_ONE], ambAdapter.address, 10000000) - - const expectedHash = await headerStorage.headers(ID_ONE) - expect( - await hashi.getHash( - DOMAIN_ID, - ID_ONE, - // TODO: currently we query the AMB adapter twice. We should query two or more different adapters. - [ambAdapter.address, ambAdapter.address], - ), - ).to.equal(expectedHash) - - const expectedAddress = await storageProof.callStatic.attestCryptoPunk420AddressWithHashi( - proof, - DOMAIN_ID, - ID_ONE, - blockHashWitness.claimedBlockHash, - [ambAdapter.address, ambAdapter.address], - ) - expect(expectedAddress.toLowerCase()).to.equal(CryptoPunk420OwnerAtBlock10Mil.toLowerCase()) - }) - - it("Reverts if the proof for cryptopunk#420 owner address does not match with the block header", async function () { - const { amb, hashi /*, storageProof*/ } = await setup() - - // deploy header storage - const HeaderStorage = await ethers.getContractFactory("HeaderStorage") - const headerStorage = await HeaderStorage.deploy() - - // deploy AMBHeaderReporter - const AMBHeaderReporter = await ethers.getContractFactory("AMBHeaderReporter") - const ambHeaderReporter = await AMBHeaderReporter.deploy(amb.address, headerStorage.address) - - // deploy AMBAdapter - const AMBAdapter = await ethers.getContractFactory("AMBAdapter") - const ambAdapter = await AMBAdapter.deploy(amb.address, ambHeaderReporter.address, BYTES32_DOMAIN_ID) - - await ambHeaderReporter.reportHeaders([ID_ONE], ambAdapter.address, 10000000) - - const expectedHash = await headerStorage.headers(ID_ONE) - expect( - await hashi.getHash( - DOMAIN_ID, - ID_ONE, - // TODO: currently we query the AMB adapter twice. We should query two or more different adapters. - [ambAdapter.address, ambAdapter.address], - ), - ).to.equal(expectedHash) - - // TODO: Generate a wrong incorrectProof - /*const incorrectProof = "0x000000000000000000000000000000000000000000c20a750285a779a8f382940000000000000000000000000000000000000000009040749a7b21fbbbc56ab1000000000000000000000000000000000000000000000cfa5466d74518ec8fc20000000000000000000000000000000000000000005df3478e70672aef4924ce000000000000000000000000000000000000000000231c15e9f1d049b4906f360000000000000000000000000000000000000000000028f4ec9495f4ac35ba99000000000000000000000000000000000000000000b4ea379117dbb72eb018e6000000000000000000000000000000000000000000d02a7285294fc5b3e33ce700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c7d9b39cd4b8001427b92000000000000000000000000000000000000000000b71a51e053a0d595d1c0950000000000000000000000000000000000000000000018168d68ca1de197cf0700000000000000000000000000000000aa20f7bde5be60603f11a45fc4923aab000000000000000000000000000000007552be775403fc00c2e6b805e6297dbe0000000000000000000000000000000000000000000000000000000000989680000000000000000000000000b47e3cd837ddf8e4c57f05d70ab865de6e193bbb000000000000000000000000000000000f92f3ad435570e9f610d535ca71c2a400000000000000000000000000000000c5ef34aa438e925fe55dbb614b291b4b00000000000000000000000000000000000000000000000000000000c352b53400000000000000000000000000000000e8b987e036a93539fd6897f53488e56a000000000000000000000000000000000f92f3ad435570e9f610d535ca71c2a400000000000000000000000000000000c5ef34aa438e925fe55dbb614b291b4b00000000000000000000000000000000000000000000000000000000c352b53400000000000000000000000000000000e8b987e036a93539fd6897f53488e56a000000000000000000000000000000000f92f3ad435570e9f610d535ca71c2a400000000000000000000000000000000c5ef34aa438e925fe55dbb614b291b4b00000000000000000000000000000000000000000000000000000000c352b53400000000000000000000000000000000e8b987e036a93539fd6897f53488e56a000000000000000000000000000000000f92f3ad435570e9f610d535ca71c2a400000000000000000000000000000000c5ef34aa438e925fe55dbb614b291b4b00000000000000000000000000000000000000000000000000000000c352b53200000000000000000000000000000000e8b987e036a93539fd6897f53488e56a000000000000000000000000000000000f92f3ad435570e9f610d535ca71c2a400000000000000000000000000000000c5ef34aa438e925fe55dbb614b291b4b00000000000000000000000000000000000000000000000000000000c352b53400000000000000000000000000000000e8b987e036a93539fd6897f53488e56a000000000000000000000000000000000f92f3ad435570e9f610d535ca71c2a400000000000000000000000000000000c5ef34aa438e925fe55dbb614b291b4b00000000000000000000000000000000000000000000000000000000c352b53400000000000000000000000000000000e8b987e036a93539fd6897f53488e56a000000000000000000000000000000000f92f3ad435570e9f610d535ca71c2a400000000000000000000000000000000c5ef34aa438e925fe55dbb614b291b4b00000000000000000000000000000000000000000000000000000000c352b53400000000000000000000000000000000e8b987e036a93539fd6897f53488e56a000000000000000000000000000000000f92f3ad435570e9f610d535ca71c2a400000000000000000000000000000000c5ef34aa438e925fe55dbb614b291b4b00000000000000000000000000000000000000000000000000000000c352b53400000000000000000000000000000000e8b987e036a93539fd6897f53488e56a000000000000000000000000000000000f92f3ad435570e9f610d535ca71c2a400000000000000000000000000000000c5ef34aa438e925fe55dbb614b291b4b00000000000000000000000000000000000000000000000000000000c352b53400000000000000000000000000000000e8b987e036a93539fd6897f53488e56a000000000000000000000000000000000f92f3ad435570e9f610d535ca71c2a400000000000000000000000000000000c5ef34aa438e925fe55dbb614b291b4b00000000000000000000000000000000000000000000000000000000c352b53400000000000000000000000000000000e8b987e036a93539fd6897f53488e56a068289d29f77618bbdcc6c71439a097a276013e033be69d8365ee3f31330cb720f5a67cf836f713e3cd4334b1cddf68091628f397af8834697d383c46ff30bd728a71b966ef58f2085906901b8721c12c6e4bdbfbd944fa61b5f32d6bb3034260f1c347c2c3f76bf78bc1ff9a0db6355644e79f3e61259b78020b867707f1c382496e73fef160560bc27269102bdccfad037b7d73a09041dd7f6b4fb7f3d4875097d4857f9b0dac1f369f688c2299204b75ad707bb2158e7fbd7b8f16e61b9bb10b72622525962ac6189f50c65efb70cdfa8586ece1972885cb62297ad077c45156c7ac61eaf715afcc00f5b294320d4dddf1545d66e2c565646d4bb45894ca50eec1d5a454b34c1a66997bfb222ea87d93f31ff0528662626a46e57e3c19513299b9b6c08ceeb6c74317c2aedf8767c98568c4affe24421a43c70be4423a22128cc3661a3063d8c787b88a83258633eb03a1a1672062cd8e1fa8dd3bb2eff9e1b17d7de9c9a9ccc741cb643c13af808e4ec81e97a33437c3a33cc663972e695289f54201c49bde0b9551fb27fb51d4e6d208b21f99827887fd8ca467c39d13716500b7e73a058379e09d8c79f0a2eda1e699c81042b8e2647f3fe0f0dba677f25a81b7c54b1efe184426530ad1f12ace22255859b8325f97922231b6c1de3fb0610102f9856a361b7fa1a39a96e0bfac9bcd6dcc3ec1ff8e80d9195590d305f147d3c67016e1a6f13a244a0e09082ceb4c54a09cf777197c82a0940dfea287f02d345930ce03b8a1ef30efc65ddf2eaede252f562443888f31747097a7b3956000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020bfc7599b7ad525a7a5c5673f24831cb57330c6368cfee195c2c8e6e2dcdff3328d97b69dd606bb9c58081b1e5b481a14c4a86e8a3b93e2197f2df3c2d6b45ca10c19fd6de9c6c266fe319d317d562028a9c0cc1497aeccc08e06cc261ea9c9f1314a2543e41ccdeb3cf95792cc31597ea54a947345d8d4c777da128946154d710070a5a3b1da94a326debdd3e42fc7f212abbe8d41e9f2255d9b65e671993ae2c745546d019c9d80f35ae33777ea4a0ff2792cf7ca2ad3ec78d408fc6034daa0dc791655fe9900cf082b028e33ab4368df91e47acfd9ba73eb0fb239453eca102c6a7f3a6bdd7696732e0b00eaf8300124236fc661af10d7c8ab44a1227b30e069f109e21b1359543f617314953f5bd0de5cf754ff94a03feb8b628a0d702840452c6cf70191c30a2461ca712b18d1022792aeba142427f2dade8265d50adbe0cfb24eb5762a677de8ed5acbe0654b01894df77a838d58df6ccc6aadea436dc2000649b14adec14afe9f132afc1ab6deb50980cd54915359c9a20fb59127f212700dc6fde636038c75a918aa2aa7082265ea6ccc1f2380c59a5d6b85794d4be136ecca620dee85a87e5dc94b07814d36fb3bc698e546ef8ef4304f4ac49e2ca106db6229d808b98feb76ca2bacb6d08bae4f0442c031e4838d68babf72cbeed07f5c9b3c318f27212e12519e7434fc4a36ec32415d39cd0545701df1643f2261cee180b590c88a67480df8d770fa50811bea8a4047e8e72c140354d5630f39002e5fae847e670e8a71e49fe41dc3a90d5e0e6519230f4f0cfc6289f7d94b3d923dd9e445b4e723d652cb0a28c4903356c960e5abd4f1dd5e53864053b6881bf00000000000000000000000000000000000000000000000000000000000000012e0a8d9f0ffbf6bd32ed84839f22fe86183955e330dc32c71a7bb91a8a4a1ea906db2b670bae0f9bbe78fe5831cb3d5b04d3772ce8bbebe3f2203afdf3226d4319c919e92c8f35440c255be3c1e0ec605a4a135602e9a9e28fa7b130b5a2d9cf126cee39684d877a577301b4523586d60643692cfce5a9b7739577dbb270292b237d2e53bb5a536cf096398a8bd37e9cdbab0bef75d41538a932b30763261e1917e1b18cad3ae3eb8d2b6c72b0a0ac6131985a9bca46c5cdc5a690aae80633871e8f1e8706a972a124da6864dec1780e2628af87e2e2e1a246b3a4aead2ed5420ad699156b44b28089c1e001f56025927f44811f16da5e1627ed76aeec0476c50ad52cc72bdc305d4f95136e84aeb351bde85c5bcd61376252a762b25922fa0d2a78e5a89489bd3ca3ab1044d586d2ce1ecb3e67fb34f6c0f17b7c04ec7b6ccd00cfab3aa4660176290472248fb2e65dffe64c78735c0450bfd751a5df4f6cc22d23ce481ea6694d4e838d9ee90896d5e8dd1d383ceff8f0b1663adc5423cb801fef7f6ce0ae102ffefa790f3205392215e69fb6da0b188db31b7184ac3231af0450ecdcba2d09b5a928f1fe9a0c5b86c93cab01a3ff6a9b6ced1a08d112cf0b241f916f1326df53e6f0a378779d1858acd187eb4313bb47beb55942f5af3d5f0edd784e862c678e020bd222dbea1d8915c3ed46bc73ab0ea69b3df2438c513710f81e94e27dd8c81fe3a2ec350ce18b48c72927f4703ce2ab4915c7feb4ac3508044a522b16938d9fa9bd90a5a0c03aca11e38465f0104c5960420f1dba9a542a3394443534a115c2c1523450a8b9c000bb400e978a5e0c94cf6a87c01b858408062321c2720ef601121f822072883452be1adfb58d50acb9a97bc75fd8564d0997fbf9ad6fd83bdadd4c03a381818736bc0bdadc0a4ab7265102328677abb41a6f8f471fb3072b1710c891959c09ef6304a491d724e66c57760f4a38593c2b" - await expect(storageProof.callStatic.attestCryptoPunk420AddressWithHashi( - incorrectProof, - DOMAIN_ID, - ID_ONE, - blockHashWitness.claimedBlockHash, - [ambAdapter.address, ambAdapter.address], - )).to.revertedWith("Proof verification failed")*/ - }) - }) -}) From da29552175b0df23011a120b7ce3a45a6877018d Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 30 Jan 2024 17:35:49 +0100 Subject: [PATCH 114/297] chore(test): rm E2E test --- packages/evm/test/00_E2E.ts | 127 ------------------------------------ 1 file changed, 127 deletions(-) delete mode 100644 packages/evm/test/00_E2E.ts diff --git a/packages/evm/test/00_E2E.ts b/packages/evm/test/00_E2E.ts deleted file mode 100644 index 7f8a55e0..00000000 --- a/packages/evm/test/00_E2E.ts +++ /dev/null @@ -1,127 +0,0 @@ -/* -Note that these E2E tests simulate cross-chain interactions but, -for the sake of convenience, use only one network as both the origin and destination chain. - -*/ -import { expect } from "chai" -import { ethers, network } from "hardhat" - -const DOMAIN_ID = network.config.chainId -const BYTES32_DOMAIN_ID = "0x0000000000000000000000000000000000000000000000000000000000007A69" - -const ID_ZERO = 0 -const ID_ONE = 1 -const ID_TWO = 2 - -const setup = async () => { - const [wallet] = await ethers.getSigners() - - // deploy hashi - const Hashi = await ethers.getContractFactory("Hashi") - const hashi = await Hashi.deploy() - - // deploy ShoyuBashi - const ShoyuBashi = await ethers.getContractFactory("ShoyuBashi") - const shoyuBashi = ShoyuBashi.deploy(wallet.address, hashi.address) - - // deploy Yaho - const Yaho = await ethers.getContractFactory("Yaho") - const yaho = await Yaho.deploy() - - // deploy AMB - const AMB = await ethers.getContractFactory("MockAMB") - const amb = await AMB.deploy() - - return { - amb, - wallet, - hashi, - shoyuBashi, - yaho, - } -} - -describe("End-to-end tests", function () { - describe("Execution layer", function () { - it("Reports execution layer block hash agreed on by N adapters", async function () { - const { amb, hashi } = await setup() - - // deploy header storage - const HeaderStorage = await ethers.getContractFactory("HeaderStorage") - const headerStorage = await HeaderStorage.deploy() - - // deploy AMBHeaderReporter - const AMBHeaderReporter = await ethers.getContractFactory("AMBHeaderReporter") - const ambHeaderReporter = await AMBHeaderReporter.deploy(amb.address, headerStorage.address) - - // deploy AMBAdapter - const AMBAdapter = await ethers.getContractFactory("AMBAdapter") - const ambAdapter = await AMBAdapter.deploy(amb.address, ambHeaderReporter.address, BYTES32_DOMAIN_ID) - - await ambHeaderReporter.reportHeaders([ID_ONE, ID_TWO], ambAdapter.address, 10000000) - - let expectedHash = await headerStorage.headers(ID_ONE) - expect( - await hashi.getHash( - DOMAIN_ID, - ID_ONE, - // TODO: currently we query the AMB adapter twice. We should query two or more different adapters. - [ambAdapter.address, ambAdapter.address], - ), - ).to.equal(expectedHash) - expectedHash = await headerStorage.headers(ID_TWO) - expect( - await hashi.getHash( - DOMAIN_ID, - ID_TWO, - // TODO: currently we query the AMB adapter twice. We should query two or more different adapters. - [ambAdapter.address, ambAdapter.address], - ), - ).to.equal(expectedHash) - }) - }) - describe("Messages", function () { - it("Executes messages agreed on by N adapters", async function () { - const { amb, hashi, wallet, yaho } = await setup() - - // deploy ping - const PingPong = await ethers.getContractFactory("PingPong") - const pingPong = await PingPong.deploy() - - const message_1 = { - to: pingPong.address, - toChainId: DOMAIN_ID, - data: pingPong.interface.getSighash("ping"), - } - const message_2 = { - to: "0x0000000000000000000000000000000000000002", - toChainId: DOMAIN_ID, - data: 0x02, - } - - // deploy Yaru - const Yaru = await ethers.getContractFactory("Yaru") - const yaru = await Yaru.deploy(hashi.address, yaho.address, DOMAIN_ID) - - // deploy Oracle Adapter - const AMBMessageRelay = await ethers.getContractFactory("AMBMessageRelay") - const ambMessageRelay = await AMBMessageRelay.deploy(amb.address, yaho.address) - const AMBAdapter = await ethers.getContractFactory("AMBAdapter") - const ambAdapter = await AMBAdapter.deploy(amb.address, ambMessageRelay.address, BYTES32_DOMAIN_ID) - - //// dispatch messages - await yaho.dispatchMessagesToAdapters([message_1, message_2], [ambMessageRelay.address], [ambAdapter.address]) - - // execute messages - const response = await yaru.callStatic.executeMessages( - [message_1, message_2], - [ID_ZERO, ID_ONE], - [wallet.address, wallet.address], - // TODO: currently we query the AMB adapter twice. We should query two or more different adapters. - [ambAdapter.address, ambAdapter.address], - ) - const data = ethers.utils.defaultAbiCoder.decode(["string"], response[0]) - expect(data[0]).to.equal("pong") - }) - }) -}) From 432f870d0347762d4438b81ca09cd627046418b0 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 30 Jan 2024 19:04:56 +0100 Subject: [PATCH 115/297] refactor(evm): updates solidity version to 0.8.20 --- packages/evm/contracts/Hashi.sol | 2 +- packages/evm/contracts/Yaho.sol | 2 +- packages/evm/contracts/Yaru.sol | 2 +- .../evm/contracts/adapters/AMB/AMBAdapter.sol | 2 +- .../contracts/adapters/AMB/AMBReporter.sol | 2 +- packages/evm/contracts/adapters/AMB/IAMB.sol | 2 +- .../contracts/adapters/AMB/test/MockAMB.sol | 2 +- .../adapters/Axelar/AxelarAdapter.sol | 2 +- .../adapters/Axelar/AxelarReporter.sol | 2 +- .../adapters/BlockHashOracleAdapter.sol | 2 +- .../contracts/adapters/Celer/CelerAdapter.sol | 2 +- .../adapters/Celer/CelerReporter.sol | 2 +- .../adapters/Celer/interfaces/IMessageBus.sol | 2 +- .../Celer/interfaces/IMessageReceiverApp.sol | 2 +- .../adapters/Chainlink/CCIPAdapter.sol | 2 +- .../adapters/Chainlink/CCIPReporter.sol | 2 +- .../adapters/Connext/ConnextAdapter.sol | 2 +- .../adapters/Connext/ConnextReporter.sol | 2 +- .../adapters/DendrETH/DendrETHAdapter.sol | 2 +- .../DendrETH/interfaces/IDendrETH.sol | 2 +- .../adapters/Electron/ElectronAdapter.sol | 2 +- .../Electron/interfaces/ILightClient.sol | 2 +- .../adapters/Electron/lib/Merkle.sol | 2 +- .../adapters/Electron/lib/Receipt.sol | 2 +- .../adapters/Hyperlane/HyperlaneAdapter.sol | 2 +- .../adapters/Hyperlane/HyperlaneReporter.sol | 2 +- .../adapters/LayerZero/LayerZeroAdapter.sol | 2 +- .../adapters/LayerZero/LayerZeroReporter.sol | 2 +- .../interfaces/ILayerZeroEndpoint.sol | 2 +- .../interfaces/ILayerZeroReceiver.sol | 2 +- .../L1CrossDomainMessengerReporter.sol | 2 +- .../L2CrossDomainMessengerAdapter.sol | 2 +- .../interfaces/ICrossDomainMessenger.sol | 2 +- .../evm/contracts/adapters/OracleAdapter.sol | 2 +- .../adapters/PNetwork/PNetworkAdapter.sol | 2 +- .../adapters/PNetwork/PNetworkReporter.sol | 2 +- .../PNetwork/interfaces/IErc20Vault.sol | 2 +- .../adapters/PNetwork/interfaces/IPToken.sol | 2 +- .../adapters/PNetwork/test/ERC777Token.sol | 2 +- .../adapters/PNetwork/test/MockVault.sol | 2 +- .../adapters/PNetwork/test/PToken.sol | 2 +- packages/evm/contracts/adapters/Reporter.sol | 2 +- .../contracts/adapters/Sygma/SygmaAdapter.sol | 2 +- .../adapters/Sygma/SygmaReporter.sol | 2 +- .../adapters/Sygma/interfaces/IBridge.sol | 2 +- .../Sygma/interfaces/ISygmaAdapter.sol | 2 +- .../adapters/Telepathy/TelepathyAdapter.sol | 2 +- .../Telepathy/interfaces/ITelepathy.sol | 2 +- .../Telepathy/libraries/SimpleSerialize.sol | 2 +- .../adapters/Wormhole/WormholeAdapter.sol | 2 +- .../adapters/Wormhole/WormholeReporter.sol | 2 +- .../Wormhole/interfaces/IWormhole.sol | 2 +- .../adapters/ZetaChain/ZetaAdapter.sol | 2 +- .../adapters/ZetaChain/ZetaReporter.sol | 2 +- .../ZetaChain/interfaces/ZetaInterfaces.sol | 2 +- .../interfaces/IBlockHashOracleAdapter.sol | 2 +- packages/evm/contracts/interfaces/IDomain.sol | 2 +- .../contracts/interfaces/IGiriGiriBashi.sol | 2 +- packages/evm/contracts/interfaces/IHashi.sol | 2 +- .../contracts/interfaces/IHeaderStorage.sol | 2 +- packages/evm/contracts/interfaces/IJushin.sol | 2 +- .../evm/contracts/interfaces/IMessage.sol | 2 +- .../interfaces/IMessageHashCalculator.sol | 2 +- .../interfaces/IMessageIdCalculator.sol | 2 +- .../contracts/interfaces/IOracleAdapter.sol | 2 +- .../evm/contracts/interfaces/IReporter.sol | 2 +- .../evm/contracts/interfaces/IShoyuBashi.sol | 2 +- packages/evm/contracts/interfaces/IShuSho.sol | 2 +- packages/evm/contracts/interfaces/IYaho.sol | 2 +- packages/evm/contracts/interfaces/IYaru.sol | 2 +- .../evm/contracts/ownable/GiriGiriBashi.sol | 2 +- packages/evm/contracts/ownable/ShoyuBashi.sol | 2 +- packages/evm/contracts/ownable/ShuSo.sol | 2 +- .../evm/contracts/test/MockOracleAdapter.sol | 2 +- packages/evm/contracts/test/MockReporter.sol | 2 +- packages/evm/contracts/test/PingPong.sol | 2 +- .../evm/contracts/utils/HeaderStorage.sol | 2 +- .../contracts/utils/MessageHashCalculator.sol | 2 +- .../contracts/utils/MessageIdCalculator.sol | 2 +- packages/evm/hardhat.config.ts | 27 +- packages/evm/package.json | 4 +- packages/evm/yarn.lock | 326 ++++++++++-------- 82 files changed, 260 insertions(+), 255 deletions(-) diff --git a/packages/evm/contracts/Hashi.sol b/packages/evm/contracts/Hashi.sol index f5bde1ad..0b4b3e88 100644 --- a/packages/evm/contracts/Hashi.sol +++ b/packages/evm/contracts/Hashi.sol @@ -31,7 +31,7 @@ Made with ❤️ by Gnosis Guild */ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { IOracleAdapter } from "./interfaces/IOracleAdapter.sol"; import { IHashi } from "./interfaces/IHashi.sol"; diff --git a/packages/evm/contracts/Yaho.sol b/packages/evm/contracts/Yaho.sol index fba81136..35f99d25 100644 --- a/packages/evm/contracts/Yaho.sol +++ b/packages/evm/contracts/Yaho.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { MessageIdCalculator } from "./utils/MessageIdCalculator.sol"; import { MessageHashCalculator } from "./utils/MessageHashCalculator.sol"; diff --git a/packages/evm/contracts/Yaru.sol b/packages/evm/contracts/Yaru.sol index 6f879171..83cf06ed 100644 --- a/packages/evm/contracts/Yaru.sol +++ b/packages/evm/contracts/Yaru.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { ReentrancyGuard } from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import { IYaru } from "./interfaces/IYaru.sol"; diff --git a/packages/evm/contracts/adapters/AMB/AMBAdapter.sol b/packages/evm/contracts/adapters/AMB/AMBAdapter.sol index aa532aa7..4661fcc9 100644 --- a/packages/evm/contracts/adapters/AMB/AMBAdapter.sol +++ b/packages/evm/contracts/adapters/AMB/AMBAdapter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { IAMB } from "./IAMB.sol"; import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; diff --git a/packages/evm/contracts/adapters/AMB/AMBReporter.sol b/packages/evm/contracts/adapters/AMB/AMBReporter.sol index 6380b9ca..00582f51 100644 --- a/packages/evm/contracts/adapters/AMB/AMBReporter.sol +++ b/packages/evm/contracts/adapters/AMB/AMBReporter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { Reporter } from "../Reporter.sol"; import { AMBAdapter } from "./AMBAdapter.sol"; diff --git a/packages/evm/contracts/adapters/AMB/IAMB.sol b/packages/evm/contracts/adapters/AMB/IAMB.sol index 1da7f079..38b17d05 100644 --- a/packages/evm/contracts/adapters/AMB/IAMB.sol +++ b/packages/evm/contracts/adapters/AMB/IAMB.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; interface IAMB { function messageSender() external view returns (address); diff --git a/packages/evm/contracts/adapters/AMB/test/MockAMB.sol b/packages/evm/contracts/adapters/AMB/test/MockAMB.sol index c6b77303..9032e7bd 100644 --- a/packages/evm/contracts/adapters/AMB/test/MockAMB.sol +++ b/packages/evm/contracts/adapters/AMB/test/MockAMB.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { IAMB } from "../IAMB.sol"; import { AMBAdapter } from "../AMBAdapter.sol"; diff --git a/packages/evm/contracts/adapters/Axelar/AxelarAdapter.sol b/packages/evm/contracts/adapters/Axelar/AxelarAdapter.sol index 951d7c85..fa00deca 100644 --- a/packages/evm/contracts/adapters/Axelar/AxelarAdapter.sol +++ b/packages/evm/contracts/adapters/Axelar/AxelarAdapter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { AxelarExecutable } from "@axelar-network/axelar-gmp-sdk-solidity/contracts/executable/AxelarExecutable.sol"; diff --git a/packages/evm/contracts/adapters/Axelar/AxelarReporter.sol b/packages/evm/contracts/adapters/Axelar/AxelarReporter.sol index 87a31647..213ca88b 100644 --- a/packages/evm/contracts/adapters/Axelar/AxelarReporter.sol +++ b/packages/evm/contracts/adapters/Axelar/AxelarReporter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { Strings } from "@openzeppelin/contracts/utils/Strings.sol"; diff --git a/packages/evm/contracts/adapters/BlockHashOracleAdapter.sol b/packages/evm/contracts/adapters/BlockHashOracleAdapter.sol index ae3fe0b0..029c0612 100644 --- a/packages/evm/contracts/adapters/BlockHashOracleAdapter.sol +++ b/packages/evm/contracts/adapters/BlockHashOracleAdapter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { RLPReader } from "solidity-rlp/contracts/RLPReader.sol"; import { OracleAdapter } from "./OracleAdapter.sol"; diff --git a/packages/evm/contracts/adapters/Celer/CelerAdapter.sol b/packages/evm/contracts/adapters/Celer/CelerAdapter.sol index fa0d6f5f..3facadd3 100644 --- a/packages/evm/contracts/adapters/Celer/CelerAdapter.sol +++ b/packages/evm/contracts/adapters/Celer/CelerAdapter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { IMessageReceiverApp } from "./interfaces/IMessageReceiverApp.sol"; diff --git a/packages/evm/contracts/adapters/Celer/CelerReporter.sol b/packages/evm/contracts/adapters/Celer/CelerReporter.sol index 93cfda79..09de8d7e 100644 --- a/packages/evm/contracts/adapters/Celer/CelerReporter.sol +++ b/packages/evm/contracts/adapters/Celer/CelerReporter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { Reporter } from "../Reporter.sol"; import { IMessageBus } from "./interfaces/IMessageBus.sol"; diff --git a/packages/evm/contracts/adapters/Celer/interfaces/IMessageBus.sol b/packages/evm/contracts/adapters/Celer/interfaces/IMessageBus.sol index a70c9373..0a0d6102 100644 --- a/packages/evm/contracts/adapters/Celer/interfaces/IMessageBus.sol +++ b/packages/evm/contracts/adapters/Celer/interfaces/IMessageBus.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; interface IMessageBus { /** diff --git a/packages/evm/contracts/adapters/Celer/interfaces/IMessageReceiverApp.sol b/packages/evm/contracts/adapters/Celer/interfaces/IMessageReceiverApp.sol index 4df26bd8..366c038e 100644 --- a/packages/evm/contracts/adapters/Celer/interfaces/IMessageReceiverApp.sol +++ b/packages/evm/contracts/adapters/Celer/interfaces/IMessageReceiverApp.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; interface IMessageReceiverApp { enum ExecutionStatus { diff --git a/packages/evm/contracts/adapters/Chainlink/CCIPAdapter.sol b/packages/evm/contracts/adapters/Chainlink/CCIPAdapter.sol index a31cc642..6a83e812 100644 --- a/packages/evm/contracts/adapters/Chainlink/CCIPAdapter.sol +++ b/packages/evm/contracts/adapters/Chainlink/CCIPAdapter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { CCIPReceiver } from "@chainlink/contracts-ccip/src/v0.8/ccip/applications/CCIPReceiver.sol"; diff --git a/packages/evm/contracts/adapters/Chainlink/CCIPReporter.sol b/packages/evm/contracts/adapters/Chainlink/CCIPReporter.sol index 07a6e736..e694c76b 100644 --- a/packages/evm/contracts/adapters/Chainlink/CCIPReporter.sol +++ b/packages/evm/contracts/adapters/Chainlink/CCIPReporter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { IRouterClient } from "@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IRouterClient.sol"; diff --git a/packages/evm/contracts/adapters/Connext/ConnextAdapter.sol b/packages/evm/contracts/adapters/Connext/ConnextAdapter.sol index b39a1d09..d7f07e62 100644 --- a/packages/evm/contracts/adapters/Connext/ConnextAdapter.sol +++ b/packages/evm/contracts/adapters/Connext/ConnextAdapter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { IXReceiver } from "@connext/interfaces/core/IXReceiver.sol"; diff --git a/packages/evm/contracts/adapters/Connext/ConnextReporter.sol b/packages/evm/contracts/adapters/Connext/ConnextReporter.sol index 337451f1..68836609 100644 --- a/packages/evm/contracts/adapters/Connext/ConnextReporter.sol +++ b/packages/evm/contracts/adapters/Connext/ConnextReporter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { IConnext } from "@connext/interfaces/core/IConnext.sol"; diff --git a/packages/evm/contracts/adapters/DendrETH/DendrETHAdapter.sol b/packages/evm/contracts/adapters/DendrETH/DendrETHAdapter.sol index 87e29bb2..6d344c3f 100644 --- a/packages/evm/contracts/adapters/DendrETH/DendrETHAdapter.sol +++ b/packages/evm/contracts/adapters/DendrETH/DendrETHAdapter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { ILightClient, LightClientUpdate } from "./interfaces/IDendrETH.sol"; import { SSZ } from "../Telepathy/libraries/SimpleSerialize.sol"; diff --git a/packages/evm/contracts/adapters/DendrETH/interfaces/IDendrETH.sol b/packages/evm/contracts/adapters/DendrETH/interfaces/IDendrETH.sol index a4e98267..f86d1839 100644 --- a/packages/evm/contracts/adapters/DendrETH/interfaces/IDendrETH.sol +++ b/packages/evm/contracts/adapters/DendrETH/interfaces/IDendrETH.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity 0.8.17; +pragma solidity 0.8.20; struct LightClientUpdate { bytes32 attestedHeaderRoot; diff --git a/packages/evm/contracts/adapters/Electron/ElectronAdapter.sol b/packages/evm/contracts/adapters/Electron/ElectronAdapter.sol index a2930761..2586a732 100644 --- a/packages/evm/contracts/adapters/Electron/ElectronAdapter.sol +++ b/packages/evm/contracts/adapters/Electron/ElectronAdapter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; import { ILightClient } from "./interfaces/ILightClient.sol"; diff --git a/packages/evm/contracts/adapters/Electron/interfaces/ILightClient.sol b/packages/evm/contracts/adapters/Electron/interfaces/ILightClient.sol index ac5df919..fbb3b125 100644 --- a/packages/evm/contracts/adapters/Electron/interfaces/ILightClient.sol +++ b/packages/evm/contracts/adapters/Electron/interfaces/ILightClient.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; interface ILightClient { function headers(uint256 slot) external view returns (bytes32); diff --git a/packages/evm/contracts/adapters/Electron/lib/Merkle.sol b/packages/evm/contracts/adapters/Electron/lib/Merkle.sol index ecbf19a1..737f1c89 100644 --- a/packages/evm/contracts/adapters/Electron/lib/Merkle.sol +++ b/packages/evm/contracts/adapters/Electron/lib/Merkle.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; library Merkle { uint256 internal constant SLOTS_PER_HISTORICAL_ROOT = 8192; diff --git a/packages/evm/contracts/adapters/Electron/lib/Receipt.sol b/packages/evm/contracts/adapters/Electron/lib/Receipt.sol index 49d702d2..4c6153d7 100644 --- a/packages/evm/contracts/adapters/Electron/lib/Receipt.sol +++ b/packages/evm/contracts/adapters/Electron/lib/Receipt.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import "@polytope-labs/solidity-merkle-trees/src/MerklePatricia.sol"; import { RLPReader } from "@polytope-labs/solidity-merkle-trees/src/trie/ethereum/RLPReader.sol"; diff --git a/packages/evm/contracts/adapters/Hyperlane/HyperlaneAdapter.sol b/packages/evm/contracts/adapters/Hyperlane/HyperlaneAdapter.sol index 4a9a764e..46403380 100644 --- a/packages/evm/contracts/adapters/Hyperlane/HyperlaneAdapter.sol +++ b/packages/evm/contracts/adapters/Hyperlane/HyperlaneAdapter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { IMessageRecipient } from "@hyperlane-xyz/core/contracts/interfaces/IMessageRecipient.sol"; diff --git a/packages/evm/contracts/adapters/Hyperlane/HyperlaneReporter.sol b/packages/evm/contracts/adapters/Hyperlane/HyperlaneReporter.sol index 84d57b07..606ce902 100644 --- a/packages/evm/contracts/adapters/Hyperlane/HyperlaneReporter.sol +++ b/packages/evm/contracts/adapters/Hyperlane/HyperlaneReporter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { IMailbox } from "@hyperlane-xyz/core/contracts/interfaces/IMailbox.sol"; diff --git a/packages/evm/contracts/adapters/LayerZero/LayerZeroAdapter.sol b/packages/evm/contracts/adapters/LayerZero/LayerZeroAdapter.sol index 6eb47265..4786e41a 100644 --- a/packages/evm/contracts/adapters/LayerZero/LayerZeroAdapter.sol +++ b/packages/evm/contracts/adapters/LayerZero/LayerZeroAdapter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { ILayerZeroReceiver } from "./interfaces/ILayerZeroReceiver.sol"; diff --git a/packages/evm/contracts/adapters/LayerZero/LayerZeroReporter.sol b/packages/evm/contracts/adapters/LayerZero/LayerZeroReporter.sol index fd1eb5b9..b6d20290 100644 --- a/packages/evm/contracts/adapters/LayerZero/LayerZeroReporter.sol +++ b/packages/evm/contracts/adapters/LayerZero/LayerZeroReporter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { ILayerZeroEndpoint } from "./interfaces/ILayerZeroEndpoint.sol"; diff --git a/packages/evm/contracts/adapters/LayerZero/interfaces/ILayerZeroEndpoint.sol b/packages/evm/contracts/adapters/LayerZero/interfaces/ILayerZeroEndpoint.sol index 407b3a2c..e96c0ec7 100644 --- a/packages/evm/contracts/adapters/LayerZero/interfaces/ILayerZeroEndpoint.sol +++ b/packages/evm/contracts/adapters/LayerZero/interfaces/ILayerZeroEndpoint.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; interface ILayerZeroEndpoint { // @notice send a LayerZero message to the specified address at a LayerZero endpoint. diff --git a/packages/evm/contracts/adapters/LayerZero/interfaces/ILayerZeroReceiver.sol b/packages/evm/contracts/adapters/LayerZero/interfaces/ILayerZeroReceiver.sol index 03ff92b3..af1c7a87 100644 --- a/packages/evm/contracts/adapters/LayerZero/interfaces/ILayerZeroReceiver.sol +++ b/packages/evm/contracts/adapters/LayerZero/interfaces/ILayerZeroReceiver.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; interface ILayerZeroReceiver { // @notice LayerZero endpoint will invoke this function to deliver the message on the destination diff --git a/packages/evm/contracts/adapters/Optimism/L1CrossDomainMessengerReporter.sol b/packages/evm/contracts/adapters/Optimism/L1CrossDomainMessengerReporter.sol index c9be745b..4a969f01 100644 --- a/packages/evm/contracts/adapters/Optimism/L1CrossDomainMessengerReporter.sol +++ b/packages/evm/contracts/adapters/Optimism/L1CrossDomainMessengerReporter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { Reporter } from "../Reporter.sol"; import { IOracleAdapter } from "../../interfaces/IOracleAdapter.sol"; diff --git a/packages/evm/contracts/adapters/Optimism/L2CrossDomainMessengerAdapter.sol b/packages/evm/contracts/adapters/Optimism/L2CrossDomainMessengerAdapter.sol index 425bdb82..e0bc7c63 100644 --- a/packages/evm/contracts/adapters/Optimism/L2CrossDomainMessengerAdapter.sol +++ b/packages/evm/contracts/adapters/Optimism/L2CrossDomainMessengerAdapter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { ICrossDomainMessenger } from "./interfaces/ICrossDomainMessenger.sol"; import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; diff --git a/packages/evm/contracts/adapters/Optimism/interfaces/ICrossDomainMessenger.sol b/packages/evm/contracts/adapters/Optimism/interfaces/ICrossDomainMessenger.sol index 9c99eebe..d82c0aad 100644 --- a/packages/evm/contracts/adapters/Optimism/interfaces/ICrossDomainMessenger.sol +++ b/packages/evm/contracts/adapters/Optimism/interfaces/ICrossDomainMessenger.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity 0.8.20; interface ICrossDomainMessenger { function sendMessage(address _target, bytes calldata _message, uint32 _minGasLimit) external payable; diff --git a/packages/evm/contracts/adapters/OracleAdapter.sol b/packages/evm/contracts/adapters/OracleAdapter.sol index 4324323f..a07f33a6 100644 --- a/packages/evm/contracts/adapters/OracleAdapter.sol +++ b/packages/evm/contracts/adapters/OracleAdapter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { IOracleAdapter } from "../interfaces/IOracleAdapter.sol"; diff --git a/packages/evm/contracts/adapters/PNetwork/PNetworkAdapter.sol b/packages/evm/contracts/adapters/PNetwork/PNetworkAdapter.sol index 16f1fac3..0f559203 100644 --- a/packages/evm/contracts/adapters/PNetwork/PNetworkAdapter.sol +++ b/packages/evm/contracts/adapters/PNetwork/PNetworkAdapter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { IERC777Recipient } from "@openzeppelin/contracts/interfaces/IERC777Recipient.sol"; diff --git a/packages/evm/contracts/adapters/PNetwork/PNetworkReporter.sol b/packages/evm/contracts/adapters/PNetwork/PNetworkReporter.sol index 27901b19..f684f38c 100644 --- a/packages/evm/contracts/adapters/PNetwork/PNetworkReporter.sol +++ b/packages/evm/contracts/adapters/PNetwork/PNetworkReporter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; diff --git a/packages/evm/contracts/adapters/PNetwork/interfaces/IErc20Vault.sol b/packages/evm/contracts/adapters/PNetwork/interfaces/IErc20Vault.sol index 87f6e055..79729ff7 100644 --- a/packages/evm/contracts/adapters/PNetwork/interfaces/IErc20Vault.sol +++ b/packages/evm/contracts/adapters/PNetwork/interfaces/IErc20Vault.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; interface IErc20Vault { function pegIn( diff --git a/packages/evm/contracts/adapters/PNetwork/interfaces/IPToken.sol b/packages/evm/contracts/adapters/PNetwork/interfaces/IPToken.sol index b507a939..5e1125a5 100644 --- a/packages/evm/contracts/adapters/PNetwork/interfaces/IPToken.sol +++ b/packages/evm/contracts/adapters/PNetwork/interfaces/IPToken.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; interface IPToken { function redeem( diff --git a/packages/evm/contracts/adapters/PNetwork/test/ERC777Token.sol b/packages/evm/contracts/adapters/PNetwork/test/ERC777Token.sol index 41b106b8..fed2a9b5 100644 --- a/packages/evm/contracts/adapters/PNetwork/test/ERC777Token.sol +++ b/packages/evm/contracts/adapters/PNetwork/test/ERC777Token.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import "@openzeppelin/contracts/token/ERC777/ERC777.sol"; diff --git a/packages/evm/contracts/adapters/PNetwork/test/MockVault.sol b/packages/evm/contracts/adapters/PNetwork/test/MockVault.sol index 6917781f..80632ab8 100644 --- a/packages/evm/contracts/adapters/PNetwork/test/MockVault.sol +++ b/packages/evm/contracts/adapters/PNetwork/test/MockVault.sol @@ -4,7 +4,7 @@ // logic to handle ETHPNT<->PNT fungibility, as well as custom logic to handle GALA tokens after // they upgraded from v1 to v2. -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; diff --git a/packages/evm/contracts/adapters/PNetwork/test/PToken.sol b/packages/evm/contracts/adapters/PNetwork/test/PToken.sol index 3a069a3c..37a95fd8 100644 --- a/packages/evm/contracts/adapters/PNetwork/test/PToken.sol +++ b/packages/evm/contracts/adapters/PNetwork/test/PToken.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import "@openzeppelin/contracts/token/ERC777/ERC777.sol"; diff --git a/packages/evm/contracts/adapters/Reporter.sol b/packages/evm/contracts/adapters/Reporter.sol index f31991ee..51a22876 100644 --- a/packages/evm/contracts/adapters/Reporter.sol +++ b/packages/evm/contracts/adapters/Reporter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { IHeaderStorage } from "../interfaces/IHeaderStorage.sol"; import { IReporter } from "../interfaces/IReporter.sol"; diff --git a/packages/evm/contracts/adapters/Sygma/SygmaAdapter.sol b/packages/evm/contracts/adapters/Sygma/SygmaAdapter.sol index 0b98ef1b..4eff5602 100644 --- a/packages/evm/contracts/adapters/Sygma/SygmaAdapter.sol +++ b/packages/evm/contracts/adapters/Sygma/SygmaAdapter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { AccessControl } from "@openzeppelin/contracts/access/AccessControl.sol"; import "../BlockHashOracleAdapter.sol"; diff --git a/packages/evm/contracts/adapters/Sygma/SygmaReporter.sol b/packages/evm/contracts/adapters/Sygma/SygmaReporter.sol index 4a792cd5..7d9f33d8 100644 --- a/packages/evm/contracts/adapters/Sygma/SygmaReporter.sol +++ b/packages/evm/contracts/adapters/Sygma/SygmaReporter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { Reporter } from "../Reporter.sol"; diff --git a/packages/evm/contracts/adapters/Sygma/interfaces/IBridge.sol b/packages/evm/contracts/adapters/Sygma/interfaces/IBridge.sol index b3d81c1c..3250429b 100644 --- a/packages/evm/contracts/adapters/Sygma/interfaces/IBridge.sol +++ b/packages/evm/contracts/adapters/Sygma/interfaces/IBridge.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; /** @title Interface for Bridge contract. diff --git a/packages/evm/contracts/adapters/Sygma/interfaces/ISygmaAdapter.sol b/packages/evm/contracts/adapters/Sygma/interfaces/ISygmaAdapter.sol index 972be3d5..2d325e81 100644 --- a/packages/evm/contracts/adapters/Sygma/interfaces/ISygmaAdapter.sol +++ b/packages/evm/contracts/adapters/Sygma/interfaces/ISygmaAdapter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; interface ISygmaAdapter { function storeHashes(address reporter, uint256[] memory ids, bytes32[] memory _hashes) external; diff --git a/packages/evm/contracts/adapters/Telepathy/TelepathyAdapter.sol b/packages/evm/contracts/adapters/Telepathy/TelepathyAdapter.sol index c73e913f..038ff6bf 100644 --- a/packages/evm/contracts/adapters/Telepathy/TelepathyAdapter.sol +++ b/packages/evm/contracts/adapters/Telepathy/TelepathyAdapter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { ILightClient, TelepathyStorage } from "./interfaces/ITelepathy.sol"; import { SSZ } from "./libraries/SimpleSerialize.sol"; diff --git a/packages/evm/contracts/adapters/Telepathy/interfaces/ITelepathy.sol b/packages/evm/contracts/adapters/Telepathy/interfaces/ITelepathy.sol index 678b0217..356d0df1 100644 --- a/packages/evm/contracts/adapters/Telepathy/interfaces/ITelepathy.sol +++ b/packages/evm/contracts/adapters/Telepathy/interfaces/ITelepathy.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; interface ILightClient { function consistent() external view returns (bool); diff --git a/packages/evm/contracts/adapters/Telepathy/libraries/SimpleSerialize.sol b/packages/evm/contracts/adapters/Telepathy/libraries/SimpleSerialize.sol index 3ba3f9d3..8f43e34c 100644 --- a/packages/evm/contracts/adapters/Telepathy/libraries/SimpleSerialize.sol +++ b/packages/evm/contracts/adapters/Telepathy/libraries/SimpleSerialize.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; library SSZ { // G-indicies for the BeaconBlockHeader -> bodyRoot -> executionPayload -> {blockNumber, blockHash} diff --git a/packages/evm/contracts/adapters/Wormhole/WormholeAdapter.sol b/packages/evm/contracts/adapters/Wormhole/WormholeAdapter.sol index 0cd29fba..cc4087c9 100644 --- a/packages/evm/contracts/adapters/Wormhole/WormholeAdapter.sol +++ b/packages/evm/contracts/adapters/Wormhole/WormholeAdapter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; diff --git a/packages/evm/contracts/adapters/Wormhole/WormholeReporter.sol b/packages/evm/contracts/adapters/Wormhole/WormholeReporter.sol index 27572af2..e3d70041 100644 --- a/packages/evm/contracts/adapters/Wormhole/WormholeReporter.sol +++ b/packages/evm/contracts/adapters/Wormhole/WormholeReporter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { Reporter } from "../Reporter.sol"; import { IOracleAdapter } from "../../interfaces/IOracleAdapter.sol"; diff --git a/packages/evm/contracts/adapters/Wormhole/interfaces/IWormhole.sol b/packages/evm/contracts/adapters/Wormhole/interfaces/IWormhole.sol index 17fb0cba..61b6f54f 100644 --- a/packages/evm/contracts/adapters/Wormhole/interfaces/IWormhole.sol +++ b/packages/evm/contracts/adapters/Wormhole/interfaces/IWormhole.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; struct Signature { bytes32 r; diff --git a/packages/evm/contracts/adapters/ZetaChain/ZetaAdapter.sol b/packages/evm/contracts/adapters/ZetaChain/ZetaAdapter.sol index 3fb5ca7d..16c54868 100644 --- a/packages/evm/contracts/adapters/ZetaChain/ZetaAdapter.sol +++ b/packages/evm/contracts/adapters/ZetaChain/ZetaAdapter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { ZetaReceiver, ZetaInterfaces } from "./interfaces/ZetaInterfaces.sol"; diff --git a/packages/evm/contracts/adapters/ZetaChain/ZetaReporter.sol b/packages/evm/contracts/adapters/ZetaChain/ZetaReporter.sol index 591a005b..adc8f85d 100644 --- a/packages/evm/contracts/adapters/ZetaChain/ZetaReporter.sol +++ b/packages/evm/contracts/adapters/ZetaChain/ZetaReporter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { SafeERC20, IERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; diff --git a/packages/evm/contracts/adapters/ZetaChain/interfaces/ZetaInterfaces.sol b/packages/evm/contracts/adapters/ZetaChain/interfaces/ZetaInterfaces.sol index 06288dde..8a640f2e 100644 --- a/packages/evm/contracts/adapters/ZetaChain/interfaces/ZetaInterfaces.sol +++ b/packages/evm/contracts/adapters/ZetaChain/interfaces/ZetaInterfaces.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; interface ZetaInterfaces { /** diff --git a/packages/evm/contracts/interfaces/IBlockHashOracleAdapter.sol b/packages/evm/contracts/interfaces/IBlockHashOracleAdapter.sol index 09fb6020..56bd8dcc 100644 --- a/packages/evm/contracts/interfaces/IBlockHashOracleAdapter.sol +++ b/packages/evm/contracts/interfaces/IBlockHashOracleAdapter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { IOracleAdapter } from "./IOracleAdapter.sol"; diff --git a/packages/evm/contracts/interfaces/IDomain.sol b/packages/evm/contracts/interfaces/IDomain.sol index b510c96f..8c169f38 100644 --- a/packages/evm/contracts/interfaces/IDomain.sol +++ b/packages/evm/contracts/interfaces/IDomain.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; struct Domain { uint256 threshold; diff --git a/packages/evm/contracts/interfaces/IGiriGiriBashi.sol b/packages/evm/contracts/interfaces/IGiriGiriBashi.sol index 234d4dc2..3c47a12c 100644 --- a/packages/evm/contracts/interfaces/IGiriGiriBashi.sol +++ b/packages/evm/contracts/interfaces/IGiriGiriBashi.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { IHashi } from "./IHashi.sol"; import { IOracleAdapter } from "./IOracleAdapter.sol"; diff --git a/packages/evm/contracts/interfaces/IHashi.sol b/packages/evm/contracts/interfaces/IHashi.sol index 8ced2604..982044e2 100644 --- a/packages/evm/contracts/interfaces/IHashi.sol +++ b/packages/evm/contracts/interfaces/IHashi.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { IOracleAdapter } from "./IOracleAdapter.sol"; diff --git a/packages/evm/contracts/interfaces/IHeaderStorage.sol b/packages/evm/contracts/interfaces/IHeaderStorage.sol index e28f65c3..26b99d1c 100644 --- a/packages/evm/contracts/interfaces/IHeaderStorage.sol +++ b/packages/evm/contracts/interfaces/IHeaderStorage.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; /** * @title IHeaderStorage diff --git a/packages/evm/contracts/interfaces/IJushin.sol b/packages/evm/contracts/interfaces/IJushin.sol index 355aacc2..dd6bf224 100644 --- a/packages/evm/contracts/interfaces/IJushin.sol +++ b/packages/evm/contracts/interfaces/IJushin.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; /** * @title IJushin diff --git a/packages/evm/contracts/interfaces/IMessage.sol b/packages/evm/contracts/interfaces/IMessage.sol index d3a06144..08c14dd8 100644 --- a/packages/evm/contracts/interfaces/IMessage.sol +++ b/packages/evm/contracts/interfaces/IMessage.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { IReporter } from "./IReporter.sol"; import { IOracleAdapter } from "./IOracleAdapter.sol"; diff --git a/packages/evm/contracts/interfaces/IMessageHashCalculator.sol b/packages/evm/contracts/interfaces/IMessageHashCalculator.sol index 97ba8d81..acb10fd8 100644 --- a/packages/evm/contracts/interfaces/IMessageHashCalculator.sol +++ b/packages/evm/contracts/interfaces/IMessageHashCalculator.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { Message } from "./IMessage.sol"; diff --git a/packages/evm/contracts/interfaces/IMessageIdCalculator.sol b/packages/evm/contracts/interfaces/IMessageIdCalculator.sol index 18265740..f316fbb7 100644 --- a/packages/evm/contracts/interfaces/IMessageIdCalculator.sol +++ b/packages/evm/contracts/interfaces/IMessageIdCalculator.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; /** * @title IMessageIdCalculator diff --git a/packages/evm/contracts/interfaces/IOracleAdapter.sol b/packages/evm/contracts/interfaces/IOracleAdapter.sol index 18d1bb5a..3bcfc9e6 100644 --- a/packages/evm/contracts/interfaces/IOracleAdapter.sol +++ b/packages/evm/contracts/interfaces/IOracleAdapter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; /** * @title IOracleAdapter diff --git a/packages/evm/contracts/interfaces/IReporter.sol b/packages/evm/contracts/interfaces/IReporter.sol index 46006d4c..5448e704 100644 --- a/packages/evm/contracts/interfaces/IReporter.sol +++ b/packages/evm/contracts/interfaces/IReporter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { IOracleAdapter } from "./IOracleAdapter.sol"; diff --git a/packages/evm/contracts/interfaces/IShoyuBashi.sol b/packages/evm/contracts/interfaces/IShoyuBashi.sol index c8157981..31551099 100644 --- a/packages/evm/contracts/interfaces/IShoyuBashi.sol +++ b/packages/evm/contracts/interfaces/IShoyuBashi.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { IHashi } from "./IHashi.sol"; import { IOracleAdapter } from "./IOracleAdapter.sol"; diff --git a/packages/evm/contracts/interfaces/IShuSho.sol b/packages/evm/contracts/interfaces/IShuSho.sol index 11b6e74b..6fbd9d59 100644 --- a/packages/evm/contracts/interfaces/IShuSho.sol +++ b/packages/evm/contracts/interfaces/IShuSho.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { IHashi } from "./IHashi.sol"; import { IOracleAdapter } from "./IOracleAdapter.sol"; diff --git a/packages/evm/contracts/interfaces/IYaho.sol b/packages/evm/contracts/interfaces/IYaho.sol index 2712526a..e51b2e3a 100644 --- a/packages/evm/contracts/interfaces/IYaho.sol +++ b/packages/evm/contracts/interfaces/IYaho.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { IMessageHashCalculator } from "./IMessageHashCalculator.sol"; import { IMessageIdCalculator } from "./IMessageIdCalculator.sol"; diff --git a/packages/evm/contracts/interfaces/IYaru.sol b/packages/evm/contracts/interfaces/IYaru.sol index eaa7c7c0..7f1d5aaa 100644 --- a/packages/evm/contracts/interfaces/IYaru.sol +++ b/packages/evm/contracts/interfaces/IYaru.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { Message } from "./IMessage.sol"; import { IMessageHashCalculator } from "./IMessageHashCalculator.sol"; diff --git a/packages/evm/contracts/ownable/GiriGiriBashi.sol b/packages/evm/contracts/ownable/GiriGiriBashi.sol index 0a41ada0..deb061fc 100644 --- a/packages/evm/contracts/ownable/GiriGiriBashi.sol +++ b/packages/evm/contracts/ownable/GiriGiriBashi.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { ShuSo } from "./ShuSo.sol"; import { IOracleAdapter } from "../interfaces/IOracleAdapter.sol"; diff --git a/packages/evm/contracts/ownable/ShoyuBashi.sol b/packages/evm/contracts/ownable/ShoyuBashi.sol index d1655a44..6d1c4aa2 100644 --- a/packages/evm/contracts/ownable/ShoyuBashi.sol +++ b/packages/evm/contracts/ownable/ShoyuBashi.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { ShuSo } from "./ShuSo.sol"; import { IOracleAdapter } from "../interfaces/IOracleAdapter.sol"; diff --git a/packages/evm/contracts/ownable/ShuSo.sol b/packages/evm/contracts/ownable/ShuSo.sol index dd153b6f..5021669e 100644 --- a/packages/evm/contracts/ownable/ShuSo.sol +++ b/packages/evm/contracts/ownable/ShuSo.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import { IOracleAdapter } from "../interfaces/IOracleAdapter.sol"; diff --git a/packages/evm/contracts/test/MockOracleAdapter.sol b/packages/evm/contracts/test/MockOracleAdapter.sol index e4f796cb..c91d1aba 100644 --- a/packages/evm/contracts/test/MockOracleAdapter.sol +++ b/packages/evm/contracts/test/MockOracleAdapter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { OracleAdapter } from "../adapters/OracleAdapter.sol"; import { BlockHashOracleAdapter } from "../adapters/BlockHashOracleAdapter.sol"; diff --git a/packages/evm/contracts/test/MockReporter.sol b/packages/evm/contracts/test/MockReporter.sol index 44491b2b..84525ca9 100644 --- a/packages/evm/contracts/test/MockReporter.sol +++ b/packages/evm/contracts/test/MockReporter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { Reporter } from "../adapters/Reporter.sol"; import { IOracleAdapter } from "../interfaces/IOracleAdapter.sol"; diff --git a/packages/evm/contracts/test/PingPong.sol b/packages/evm/contracts/test/PingPong.sol index ab54c1c5..672b41f7 100644 --- a/packages/evm/contracts/test/PingPong.sol +++ b/packages/evm/contracts/test/PingPong.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { IJushin } from "../interfaces/IJushin.sol"; diff --git a/packages/evm/contracts/utils/HeaderStorage.sol b/packages/evm/contracts/utils/HeaderStorage.sol index 6e1a9f90..01094de7 100644 --- a/packages/evm/contracts/utils/HeaderStorage.sol +++ b/packages/evm/contracts/utils/HeaderStorage.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { IHeaderStorage } from "../interfaces/IHeaderStorage.sol"; diff --git a/packages/evm/contracts/utils/MessageHashCalculator.sol b/packages/evm/contracts/utils/MessageHashCalculator.sol index 630ecba6..4c39338f 100644 --- a/packages/evm/contracts/utils/MessageHashCalculator.sol +++ b/packages/evm/contracts/utils/MessageHashCalculator.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { IMessageHashCalculator } from "../interfaces/IMessageHashCalculator.sol"; import { Message } from "../interfaces/IMessage.sol"; diff --git a/packages/evm/contracts/utils/MessageIdCalculator.sol b/packages/evm/contracts/utils/MessageIdCalculator.sol index 9c816b4c..3d137e07 100644 --- a/packages/evm/contracts/utils/MessageIdCalculator.sol +++ b/packages/evm/contracts/utils/MessageIdCalculator.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import { IMessageIdCalculator } from "../interfaces/IMessageIdCalculator.sol"; diff --git a/packages/evm/hardhat.config.ts b/packages/evm/hardhat.config.ts index 0e6fb306..dad15240 100644 --- a/packages/evm/hardhat.config.ts +++ b/packages/evm/hardhat.config.ts @@ -1,3 +1,4 @@ +import "@nomicfoundation/hardhat-chai-matchers" import "@nomicfoundation/hardhat-toolbox" import { config as dotenvConfig } from "dotenv" import "hardhat-change-network" @@ -95,18 +96,7 @@ const config: HardhatUserConfig = { src: "./contracts", }, networks: { - hardhat: { - accounts: { - accountsBalance: "1000000000000000000000", - }, - // Used for testing axiom - // forking: { - // url: getChainConfig("mainnet").url, - // // block number of attestation block - // blockNumber: 10000000, - // }, - chainId: chainIds.hardhat, - }, + hardhat: {}, arbitrum: getChainConfig("arbitrum-mainnet"), avalanche: getChainConfig("avalanche"), bsc: getChainConfig("bsc"), @@ -124,21 +114,14 @@ const config: HardhatUserConfig = { cache: "./cache", sources: "./contracts", tests: "./test", - // tests: "./test_axiom", }, solidity: { - version: "0.8.17", + version: "0.8.20", settings: { - metadata: { - // Not including the metadata hash - // https://github.com/paulrberg/hardhat-template/issues/31 - bytecodeHash: "none", - }, - // Disable the optimizer when debugging - // https://hardhat.org/hardhat-network/#solidity-optimizer-support + viaIR: true, optimizer: { enabled: true, - runs: 800, + runs: 10000, }, }, }, diff --git a/packages/evm/package.json b/packages/evm/package.json index 4e763ddd..1e922fc5 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -37,7 +37,7 @@ "eslint-config-prettier": "^8.5.0", "ethers": "^5.7.2", "fs-extra": "^10.1.0", - "hardhat": "^2.12.2", + "hardhat": "^2.19.4", "hardhat-gas-reporter": "^1.0.9", "lint-staged": "^13.0.4", "lodash": "^4.17.21", @@ -103,6 +103,6 @@ "hardhat-change-network": "^0.0.7", "hardhat-deploy": "^0.11.31", "openzeppelin": "npm:@openzeppelin/contracts@4.3.3", - "solidity-rlp": "^2.0.7" + "solidity-rlp": "^2.0.8" } } diff --git a/packages/evm/yarn.lock b/packages/evm/yarn.lock index b3149a87..80fdcbef 100644 --- a/packages/evm/yarn.lock +++ b/packages/evm/yarn.lock @@ -184,6 +184,52 @@ __metadata: languageName: node linkType: hard +"@chainsafe/as-sha256@npm:^0.3.1": + version: 0.3.1 + resolution: "@chainsafe/as-sha256@npm:0.3.1" + checksum: 58ea733be1657b0e31dbf48b0dba862da0833df34a81c1460c7352f04ce90874f70003cbf34d0afb9e5e53a33ee2d63a261a8b12462be85b2ba0a6f7f13d6150 + languageName: node + linkType: hard + +"@chainsafe/persistent-merkle-tree@npm:^0.4.2": + version: 0.4.2 + resolution: "@chainsafe/persistent-merkle-tree@npm:0.4.2" + dependencies: + "@chainsafe/as-sha256": ^0.3.1 + checksum: f9cfcb2132a243992709715dbd28186ab48c7c0c696f29d30857693cca5526bf753974a505ef68ffd5623bbdbcaa10f9083f4dd40bf99eb6408e451cc26a1a9e + languageName: node + linkType: hard + +"@chainsafe/persistent-merkle-tree@npm:^0.5.0": + version: 0.5.0 + resolution: "@chainsafe/persistent-merkle-tree@npm:0.5.0" + dependencies: + "@chainsafe/as-sha256": ^0.3.1 + checksum: 2c67203da776c79cd3a6132e2d672fe132393b2e63dc71604e3134acc8c0ec25cc5e431051545939ea0f7c5ff2066fb806b9e5cab974ca085d046226a1671f7d + languageName: node + linkType: hard + +"@chainsafe/ssz@npm:^0.10.0": + version: 0.10.2 + resolution: "@chainsafe/ssz@npm:0.10.2" + dependencies: + "@chainsafe/as-sha256": ^0.3.1 + "@chainsafe/persistent-merkle-tree": ^0.5.0 + checksum: 6bb70cf741d0a19dd0b28b3f6f067b96fa39f556e2eefa6ac745b21db9c3b3a8393dc3cca8ff4a6ce065ed71ddc3fb1b2b390a92004b9d01067c26e2558e5503 + languageName: node + linkType: hard + +"@chainsafe/ssz@npm:^0.9.2": + version: 0.9.4 + resolution: "@chainsafe/ssz@npm:0.9.4" + dependencies: + "@chainsafe/as-sha256": ^0.3.1 + "@chainsafe/persistent-merkle-tree": ^0.4.2 + case: ^1.6.3 + checksum: c6eaedeae9e5618b3c666ff4507a27647f665a8dcf17d5ca86da4ed4788c5a93868f256d0005467d184fdf35ec03f323517ec2e55ec42492d769540a2ec396bc + languageName: node + linkType: hard + "@commitlint/cli@npm:^17.3.0": version: 17.5.1 resolution: "@commitlint/cli@npm:17.5.1" @@ -727,7 +773,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/providers@npm:5.7.2, @ethersproject/providers@npm:^5.7.0, @ethersproject/providers@npm:^5.7.2": +"@ethersproject/providers@npm:5.7.2, @ethersproject/providers@npm:^5.7.0, @ethersproject/providers@npm:^5.7.1, @ethersproject/providers@npm:^5.7.2": version: 5.7.2 resolution: "@ethersproject/providers@npm:5.7.2" dependencies: @@ -979,7 +1025,7 @@ __metadata: eslint-config-prettier: ^8.5.0 ethers: ^5.7.2 fs-extra: ^10.1.0 - hardhat: ^2.12.2 + hardhat: ^2.19.4 hardhat-change-network: ^0.0.7 hardhat-deploy: ^0.11.31 hardhat-gas-reporter: ^1.0.9 @@ -994,7 +1040,7 @@ __metadata: solhint: ^3.3.7 solhint-plugin-prettier: ^0.0.5 solidity-coverage: ^0.8.2 - solidity-rlp: ^2.0.7 + solidity-rlp: ^2.0.8 ts-generator: ^0.1.1 ts-node: ^10.9.1 typechain: ^8.1.1 @@ -1196,159 +1242,161 @@ __metadata: languageName: node linkType: hard -"@nomicfoundation/ethereumjs-block@npm:4.2.2, @nomicfoundation/ethereumjs-block@npm:^4.0.0": - version: 4.2.2 - resolution: "@nomicfoundation/ethereumjs-block@npm:4.2.2" +"@nomicfoundation/ethereumjs-block@npm:5.0.2": + version: 5.0.2 + resolution: "@nomicfoundation/ethereumjs-block@npm:5.0.2" dependencies: - "@nomicfoundation/ethereumjs-common": 3.1.2 - "@nomicfoundation/ethereumjs-rlp": 4.0.3 - "@nomicfoundation/ethereumjs-trie": 5.0.5 - "@nomicfoundation/ethereumjs-tx": 4.1.2 - "@nomicfoundation/ethereumjs-util": 8.0.6 + "@nomicfoundation/ethereumjs-common": 4.0.2 + "@nomicfoundation/ethereumjs-rlp": 5.0.2 + "@nomicfoundation/ethereumjs-trie": 6.0.2 + "@nomicfoundation/ethereumjs-tx": 5.0.2 + "@nomicfoundation/ethereumjs-util": 9.0.2 ethereum-cryptography: 0.1.3 - checksum: 174a251d9c4e0bb9c1a7a6e77c52f1b2b4708d8135dba55c1025776248258ce905e4383a79da0ce7ac4e67e03b6c56351ca634a771b5eae976ed97498fc163f9 + ethers: ^5.7.1 + checksum: 7ff744f44a01f1c059ca7812a1cfc8089f87aa506af6cb39c78331dca71b32993cbd6fa05ad03f8c4f4fab73bb998a927af69e0d8ff01ae192ee5931606e09f5 languageName: node linkType: hard -"@nomicfoundation/ethereumjs-blockchain@npm:6.2.2, @nomicfoundation/ethereumjs-blockchain@npm:^6.0.0": - version: 6.2.2 - resolution: "@nomicfoundation/ethereumjs-blockchain@npm:6.2.2" - dependencies: - "@nomicfoundation/ethereumjs-block": 4.2.2 - "@nomicfoundation/ethereumjs-common": 3.1.2 - "@nomicfoundation/ethereumjs-ethash": 2.0.5 - "@nomicfoundation/ethereumjs-rlp": 4.0.3 - "@nomicfoundation/ethereumjs-trie": 5.0.5 - "@nomicfoundation/ethereumjs-util": 8.0.6 +"@nomicfoundation/ethereumjs-blockchain@npm:7.0.2": + version: 7.0.2 + resolution: "@nomicfoundation/ethereumjs-blockchain@npm:7.0.2" + dependencies: + "@nomicfoundation/ethereumjs-block": 5.0.2 + "@nomicfoundation/ethereumjs-common": 4.0.2 + "@nomicfoundation/ethereumjs-ethash": 3.0.2 + "@nomicfoundation/ethereumjs-rlp": 5.0.2 + "@nomicfoundation/ethereumjs-trie": 6.0.2 + "@nomicfoundation/ethereumjs-tx": 5.0.2 + "@nomicfoundation/ethereumjs-util": 9.0.2 abstract-level: ^1.0.3 debug: ^4.3.3 ethereum-cryptography: 0.1.3 level: ^8.0.0 lru-cache: ^5.1.1 memory-level: ^1.0.0 - checksum: 5933600bf005ec3e33f6fdd0b3582b80ed7eac8fa776fc86f21de8a6ac3614e3262c48ad3737015c19558165aecd7b13a8056e96afd61511d0605411e0264871 + checksum: b7e440dcd73e32aa72d13bfd28cb472773c9c60ea808a884131bf7eb3f42286ad594a0864215f599332d800f3fe1f772fff4b138d2dcaa8f41e4d8389bff33e7 languageName: node linkType: hard -"@nomicfoundation/ethereumjs-common@npm:3.1.2, @nomicfoundation/ethereumjs-common@npm:^3.0.0": - version: 3.1.2 - resolution: "@nomicfoundation/ethereumjs-common@npm:3.1.2" +"@nomicfoundation/ethereumjs-common@npm:4.0.2": + version: 4.0.2 + resolution: "@nomicfoundation/ethereumjs-common@npm:4.0.2" dependencies: - "@nomicfoundation/ethereumjs-util": 8.0.6 + "@nomicfoundation/ethereumjs-util": 9.0.2 crc-32: ^1.2.0 - checksum: b886e47bb4da26b42bf9e905c5f073db62d2ad1b740d50898012580b501868839fcf08430debe3fca927b4d73e01628c1b0b2e84401feb551245dacfac045404 + checksum: f0d84704d6254d374299c19884312bd5666974b4b6f342d3f10bc76e549de78d20e45a53d25fbdc146268a52335497127e4f069126da7c60ac933a158e704887 languageName: node linkType: hard -"@nomicfoundation/ethereumjs-ethash@npm:2.0.5": - version: 2.0.5 - resolution: "@nomicfoundation/ethereumjs-ethash@npm:2.0.5" +"@nomicfoundation/ethereumjs-ethash@npm:3.0.2": + version: 3.0.2 + resolution: "@nomicfoundation/ethereumjs-ethash@npm:3.0.2" dependencies: - "@nomicfoundation/ethereumjs-block": 4.2.2 - "@nomicfoundation/ethereumjs-rlp": 4.0.3 - "@nomicfoundation/ethereumjs-util": 8.0.6 + "@nomicfoundation/ethereumjs-block": 5.0.2 + "@nomicfoundation/ethereumjs-rlp": 5.0.2 + "@nomicfoundation/ethereumjs-util": 9.0.2 abstract-level: ^1.0.3 bigint-crypto-utils: ^3.0.23 ethereum-cryptography: 0.1.3 - checksum: 0b03c8771602cfa64c9d35e5686326d0bfecb7dc0874cd9ff737cae0ec401396187d8499c103b8858fed5b9bd930e132b8fd09d19b3f0649df36d7d0fdf4d27c + checksum: e4011e4019dd9b92f7eeebfc1e6c9a9685c52d8fd0ee4f28f03e50048a23b600c714490827f59fdce497b3afb503b3fd2ebf6815ff307e9949c3efeff1403278 languageName: node linkType: hard -"@nomicfoundation/ethereumjs-evm@npm:1.3.2, @nomicfoundation/ethereumjs-evm@npm:^1.0.0": - version: 1.3.2 - resolution: "@nomicfoundation/ethereumjs-evm@npm:1.3.2" +"@nomicfoundation/ethereumjs-evm@npm:2.0.2": + version: 2.0.2 + resolution: "@nomicfoundation/ethereumjs-evm@npm:2.0.2" dependencies: - "@nomicfoundation/ethereumjs-common": 3.1.2 - "@nomicfoundation/ethereumjs-util": 8.0.6 - "@types/async-eventemitter": ^0.2.1 - async-eventemitter: ^0.2.4 + "@ethersproject/providers": ^5.7.1 + "@nomicfoundation/ethereumjs-common": 4.0.2 + "@nomicfoundation/ethereumjs-tx": 5.0.2 + "@nomicfoundation/ethereumjs-util": 9.0.2 debug: ^4.3.3 ethereum-cryptography: 0.1.3 mcl-wasm: ^0.7.1 rustbn.js: ~0.2.0 - checksum: 4a051f36968574ffbee5d3c401ebf1c81899b69a0692c372fced67691fe18f26741f26d1781e79dfa52136af888e561d80de4fd7dd59000d640c51bd8b130023 + checksum: a23cf570836ddc147606b02df568069de946108e640f902358fef67e589f6b371d856056ee44299d9b4e3497f8ae25faa45e6b18fefd90e9b222dc6a761d85f0 languageName: node linkType: hard -"@nomicfoundation/ethereumjs-rlp@npm:4.0.3, @nomicfoundation/ethereumjs-rlp@npm:^4.0.0": - version: 4.0.3 - resolution: "@nomicfoundation/ethereumjs-rlp@npm:4.0.3" +"@nomicfoundation/ethereumjs-rlp@npm:5.0.2": + version: 5.0.2 + resolution: "@nomicfoundation/ethereumjs-rlp@npm:5.0.2" bin: rlp: bin/rlp - checksum: 14fc83701dd52323fae705786549ab07482ace315de69a586bb948b6f21ec529794cef8248af0b5c7e8f8b05fbadfbe222754b305841fa2189bfbc8f1eb064a2 + checksum: a74434cadefca9aa8754607cc1ad7bb4bbea4ee61c6214918e60a5bbee83206850346eb64e39fd1fe97f854c7ec0163e01148c0c881dda23881938f0645a0ef2 languageName: node linkType: hard -"@nomicfoundation/ethereumjs-statemanager@npm:1.0.5, @nomicfoundation/ethereumjs-statemanager@npm:^1.0.0": - version: 1.0.5 - resolution: "@nomicfoundation/ethereumjs-statemanager@npm:1.0.5" +"@nomicfoundation/ethereumjs-statemanager@npm:2.0.2": + version: 2.0.2 + resolution: "@nomicfoundation/ethereumjs-statemanager@npm:2.0.2" dependencies: - "@nomicfoundation/ethereumjs-common": 3.1.2 - "@nomicfoundation/ethereumjs-rlp": 4.0.3 - "@nomicfoundation/ethereumjs-trie": 5.0.5 - "@nomicfoundation/ethereumjs-util": 8.0.6 + "@nomicfoundation/ethereumjs-common": 4.0.2 + "@nomicfoundation/ethereumjs-rlp": 5.0.2 debug: ^4.3.3 ethereum-cryptography: 0.1.3 - functional-red-black-tree: ^1.0.1 - checksum: 0f88743900b2211deb5d2393bf111ef63411ce533387a6d06c48cc9ac1f4fc38f968cdecc4712ebdafdebc3c4c2ce6bd1abd82989f4f4f515d3f571981d38f9f + ethers: ^5.7.1 + js-sdsl: ^4.1.4 + checksum: 3ab6578e252e53609afd98d8ba42a99f182dcf80252f23ed9a5e0471023ffb2502130f85fc47fa7c94cd149f9be799ed9a0942ca52a143405be9267f4ad94e64 languageName: node linkType: hard -"@nomicfoundation/ethereumjs-trie@npm:5.0.5, @nomicfoundation/ethereumjs-trie@npm:^5.0.0": - version: 5.0.5 - resolution: "@nomicfoundation/ethereumjs-trie@npm:5.0.5" +"@nomicfoundation/ethereumjs-trie@npm:6.0.2": + version: 6.0.2 + resolution: "@nomicfoundation/ethereumjs-trie@npm:6.0.2" dependencies: - "@nomicfoundation/ethereumjs-rlp": 4.0.3 - "@nomicfoundation/ethereumjs-util": 8.0.6 + "@nomicfoundation/ethereumjs-rlp": 5.0.2 + "@nomicfoundation/ethereumjs-util": 9.0.2 + "@types/readable-stream": ^2.3.13 ethereum-cryptography: 0.1.3 readable-stream: ^3.6.0 - checksum: bed56b55093275166c40d0aa097b32d348b3795cbfdc3797d48d136a578161431e70f30bcf453b74b52f77b897d79b61a3fb9d1abd10187c0cb7f25e40dea9c5 + checksum: d4da918d333851b9f2cce7dbd25ab5753e0accd43d562d98fd991b168b6a08d1794528f0ade40fe5617c84900378376fe6256cdbe52c8d66bf4c53293bbc7c40 languageName: node linkType: hard -"@nomicfoundation/ethereumjs-tx@npm:4.1.2, @nomicfoundation/ethereumjs-tx@npm:^4.0.0": - version: 4.1.2 - resolution: "@nomicfoundation/ethereumjs-tx@npm:4.1.2" +"@nomicfoundation/ethereumjs-tx@npm:5.0.2": + version: 5.0.2 + resolution: "@nomicfoundation/ethereumjs-tx@npm:5.0.2" dependencies: - "@nomicfoundation/ethereumjs-common": 3.1.2 - "@nomicfoundation/ethereumjs-rlp": 4.0.3 - "@nomicfoundation/ethereumjs-util": 8.0.6 + "@chainsafe/ssz": ^0.9.2 + "@ethersproject/providers": ^5.7.2 + "@nomicfoundation/ethereumjs-common": 4.0.2 + "@nomicfoundation/ethereumjs-rlp": 5.0.2 + "@nomicfoundation/ethereumjs-util": 9.0.2 ethereum-cryptography: 0.1.3 - checksum: 209622bdc56e5f1267e5d2de69ed18388b141edc568f739f0ed865aecfe96e07c381aab779ed0adacefeae4da5be64fa1110a02e481e9a7c343bf0d53f4fd1b9 + checksum: 0bbcea75786b2ccb559afe2ecc9866fb4566a9f157b6ffba4f50960d14f4b3da2e86e273f6fadda9b860e67cfcabf589970fb951b328cb5f900a585cd21842a2 languageName: node linkType: hard -"@nomicfoundation/ethereumjs-util@npm:8.0.6, @nomicfoundation/ethereumjs-util@npm:^8.0.0": - version: 8.0.6 - resolution: "@nomicfoundation/ethereumjs-util@npm:8.0.6" +"@nomicfoundation/ethereumjs-util@npm:9.0.2": + version: 9.0.2 + resolution: "@nomicfoundation/ethereumjs-util@npm:9.0.2" dependencies: - "@nomicfoundation/ethereumjs-rlp": 4.0.3 + "@chainsafe/ssz": ^0.10.0 + "@nomicfoundation/ethereumjs-rlp": 5.0.2 ethereum-cryptography: 0.1.3 - checksum: 7a51c2069702750d94bf6bc5afd4a26c50321fe42504339d5275b60974941451eb41232f8a08c307797bcd498f20a3b27074351a76abdfc36a5e74473a7eda01 + checksum: 3a08f7b88079ef9f53b43da9bdcb8195498fd3d3911c2feee2571f4d1204656053f058b2f650471c86f7d2d0ba2f814768c7cfb0f266eede41c848356afc4900 languageName: node linkType: hard -"@nomicfoundation/ethereumjs-vm@npm:^6.0.0": - version: 6.4.2 - resolution: "@nomicfoundation/ethereumjs-vm@npm:6.4.2" +"@nomicfoundation/ethereumjs-vm@npm:7.0.2": + version: 7.0.2 + resolution: "@nomicfoundation/ethereumjs-vm@npm:7.0.2" dependencies: - "@nomicfoundation/ethereumjs-block": 4.2.2 - "@nomicfoundation/ethereumjs-blockchain": 6.2.2 - "@nomicfoundation/ethereumjs-common": 3.1.2 - "@nomicfoundation/ethereumjs-evm": 1.3.2 - "@nomicfoundation/ethereumjs-rlp": 4.0.3 - "@nomicfoundation/ethereumjs-statemanager": 1.0.5 - "@nomicfoundation/ethereumjs-trie": 5.0.5 - "@nomicfoundation/ethereumjs-tx": 4.1.2 - "@nomicfoundation/ethereumjs-util": 8.0.6 - "@types/async-eventemitter": ^0.2.1 - async-eventemitter: ^0.2.4 + "@nomicfoundation/ethereumjs-block": 5.0.2 + "@nomicfoundation/ethereumjs-blockchain": 7.0.2 + "@nomicfoundation/ethereumjs-common": 4.0.2 + "@nomicfoundation/ethereumjs-evm": 2.0.2 + "@nomicfoundation/ethereumjs-rlp": 5.0.2 + "@nomicfoundation/ethereumjs-statemanager": 2.0.2 + "@nomicfoundation/ethereumjs-trie": 6.0.2 + "@nomicfoundation/ethereumjs-tx": 5.0.2 + "@nomicfoundation/ethereumjs-util": 9.0.2 debug: ^4.3.3 ethereum-cryptography: 0.1.3 - functional-red-black-tree: ^1.0.1 mcl-wasm: ^0.7.1 rustbn.js: ~0.2.0 - checksum: 9138b8cce872a51fe2e378942c52fc6c54d8126ff094ba6bb78cbb630cafa20d7fbaa2b08bdcf7cad6de78e19ce68493ddbcc2e02acb7c803b866dc121274ea7 + checksum: 1c25ba4d0644cadb8a2b0241a4bb02e578bfd7f70e3492b855c2ab5c120cb159cb8f7486f84dc1597884bd1697feedbfb5feb66e91352afb51f3694fd8e4a043 languageName: node linkType: hard @@ -1871,13 +1919,6 @@ __metadata: languageName: node linkType: hard -"@types/async-eventemitter@npm:^0.2.1": - version: 0.2.1 - resolution: "@types/async-eventemitter@npm:0.2.1" - checksum: 36ba0a6f52082f76b19b9123a2fa0497f94fe15218fa54040cc45f0edff483ec3be93a38c177cd4dab79f5e32333fbdf3682d4dc94197438e86694b1fddd6896 - languageName: node - linkType: hard - "@types/bn.js@npm:^4.11.3": version: 4.11.6 resolution: "@types/bn.js@npm:4.11.6" @@ -2060,6 +2101,16 @@ __metadata: languageName: node linkType: hard +"@types/readable-stream@npm:^2.3.13": + version: 2.3.15 + resolution: "@types/readable-stream@npm:2.3.15" + dependencies: + "@types/node": "*" + safe-buffer: ~5.1.1 + checksum: ec36f525cad09b6c65a1dafcb5ad99b9e2ed824ec49b7aa23180ac427e5d35b8a0706193ecd79ab4253a283ad485ba03d5917a98daaaa144f0ea34f4823e9d82 + languageName: node + linkType: hard + "@types/resolve@npm:^0.0.8": version: 0.0.8 resolution: "@types/resolve@npm:0.0.8" @@ -2241,15 +2292,6 @@ __metadata: languageName: node linkType: hard -"abort-controller@npm:^3.0.0": - version: 3.0.0 - resolution: "abort-controller@npm:3.0.0" - dependencies: - event-target-shim: ^5.0.0 - checksum: 170bdba9b47b7e65906a28c8ce4f38a7a369d78e2271706f020849c1bfe0ee2067d4261df8bbb66eb84f79208fd5b710df759d64191db58cfba7ce8ef9c54b75 - languageName: node - linkType: hard - "abstract-level@npm:^1.0.0, abstract-level@npm:^1.0.2, abstract-level@npm:^1.0.3": version: 1.0.3 resolution: "abstract-level@npm:1.0.3" @@ -2639,15 +2681,6 @@ __metadata: languageName: node linkType: hard -"async-eventemitter@npm:^0.2.4": - version: 0.2.4 - resolution: "async-eventemitter@npm:0.2.4" - dependencies: - async: ^2.4.0 - checksum: b9e77e0f58ebd7188c50c23d613d1263e0ab501f5e677e02b57cc97d7032beaf60aafa189887e7105569c791e212df4af00b608be1e9a4c425911d577124911e - languageName: node - linkType: hard - "async@npm:1.x": version: 1.5.2 resolution: "async@npm:1.5.2" @@ -2655,15 +2688,6 @@ __metadata: languageName: node linkType: hard -"async@npm:^2.4.0": - version: 2.6.4 - resolution: "async@npm:2.6.4" - dependencies: - lodash: ^4.17.14 - checksum: a52083fb32e1ebe1d63e5c5624038bb30be68ff07a6c8d7dfe35e47c93fc144bd8652cbec869e0ac07d57dde387aa5f1386be3559cdee799cb1f789678d88e19 - languageName: node - linkType: hard - "asynckit@npm:^0.4.0": version: 0.4.0 resolution: "asynckit@npm:0.4.0" @@ -3076,6 +3100,13 @@ __metadata: languageName: node linkType: hard +"case@npm:^1.6.3": + version: 1.6.3 + resolution: "case@npm:1.6.3" + checksum: febe73278f910b0d28aab7efd6f51c235f9aa9e296148edb56dfb83fd58faa88308c30ce9a0122b6e53e0362c44f4407105bd5ef89c46860fc2b184e540fd68d + languageName: node + linkType: hard + "caseless@npm:^0.12.0, caseless@npm:~0.12.0": version: 0.12.0 resolution: "caseless@npm:0.12.0" @@ -4550,13 +4581,6 @@ __metadata: languageName: node linkType: hard -"event-target-shim@npm:^5.0.0": - version: 5.0.1 - resolution: "event-target-shim@npm:5.0.1" - checksum: 1ffe3bb22a6d51bdeb6bf6f7cf97d2ff4a74b017ad12284cc9e6a279e727dc30a5de6bb613e5596ff4dc3e517841339ad09a7eec44266eccb1aa201a30448166 - languageName: node - linkType: hard - "eventemitter3@npm:^4.0.7": version: 4.0.7 resolution: "eventemitter3@npm:4.0.7" @@ -5548,27 +5572,26 @@ __metadata: languageName: node linkType: hard -"hardhat@npm:^2.12.2": - version: 2.13.0 - resolution: "hardhat@npm:2.13.0" +"hardhat@npm:^2.19.4": + version: 2.19.4 + resolution: "hardhat@npm:2.19.4" dependencies: "@ethersproject/abi": ^5.1.2 "@metamask/eth-sig-util": ^4.0.0 - "@nomicfoundation/ethereumjs-block": ^4.0.0 - "@nomicfoundation/ethereumjs-blockchain": ^6.0.0 - "@nomicfoundation/ethereumjs-common": ^3.0.0 - "@nomicfoundation/ethereumjs-evm": ^1.0.0 - "@nomicfoundation/ethereumjs-rlp": ^4.0.0 - "@nomicfoundation/ethereumjs-statemanager": ^1.0.0 - "@nomicfoundation/ethereumjs-trie": ^5.0.0 - "@nomicfoundation/ethereumjs-tx": ^4.0.0 - "@nomicfoundation/ethereumjs-util": ^8.0.0 - "@nomicfoundation/ethereumjs-vm": ^6.0.0 + "@nomicfoundation/ethereumjs-block": 5.0.2 + "@nomicfoundation/ethereumjs-blockchain": 7.0.2 + "@nomicfoundation/ethereumjs-common": 4.0.2 + "@nomicfoundation/ethereumjs-evm": 2.0.2 + "@nomicfoundation/ethereumjs-rlp": 5.0.2 + "@nomicfoundation/ethereumjs-statemanager": 2.0.2 + "@nomicfoundation/ethereumjs-trie": 6.0.2 + "@nomicfoundation/ethereumjs-tx": 5.0.2 + "@nomicfoundation/ethereumjs-util": 9.0.2 + "@nomicfoundation/ethereumjs-vm": 7.0.2 "@nomicfoundation/solidity-analyzer": ^0.1.0 "@sentry/node": ^5.18.1 "@types/bn.js": ^5.1.0 "@types/lru-cache": ^5.1.0 - abort-controller: ^3.0.0 adm-zip: ^0.4.16 aggregate-error: ^3.0.0 ansi-escapes: ^4.3.0 @@ -5591,7 +5614,6 @@ __metadata: mnemonist: ^0.38.0 mocha: ^10.0.0 p-map: ^4.0.0 - qs: ^6.7.0 raw-body: ^2.4.1 resolve: 1.17.0 semver: ^6.3.0 @@ -5612,7 +5634,7 @@ __metadata: optional: true bin: hardhat: internal/cli/bootstrap.js - checksum: a69813120e5e8f05cefb9ae9c7ff2e2fd06aa8802baf6bb81778810b3ea879d6cb31f04c5719ebe6c0289cc2bd72d1e1f00d65afcf1a049ed3130c35025046e1 + checksum: 05dcaeab5bb641e74426ad47acfda903dcd3fd229b0d30f45b9de1d3c54fe6364161f3c88517984233d18f5b9294a050500ca7336b6ca069fa259fede6f5acb1 languageName: node linkType: hard @@ -8162,7 +8184,7 @@ __metadata: languageName: node linkType: hard -"qs@npm:^6.4.0, qs@npm:^6.7.0": +"qs@npm:^6.4.0": version: 6.11.1 resolution: "qs@npm:6.11.1" dependencies: @@ -9080,10 +9102,10 @@ __metadata: languageName: node linkType: hard -"solidity-rlp@npm:^2.0.7": - version: 2.0.7 - resolution: "solidity-rlp@npm:2.0.7" - checksum: 05df8300ed3f1a99eab45177f7dfe95310e0eb1bce7808379285b4a8c5b9f1bb17f3a7ce778a9416889f3b7ecaeb2d365450507f89ca7f4c99e02ac90166e60f +"solidity-rlp@npm:^2.0.8": + version: 2.0.8 + resolution: "solidity-rlp@npm:2.0.8" + checksum: e182087ffa1ee61447a04cae1b2ac3d814a65f52c1e6c81084ed181216f63fdc44df5197b5a35a627809db392fddd65f6e8dde4b8e49decdfc6fdfc7ed7ba3e8 languageName: node linkType: hard From f15c9150041af0c7fc467d5a29e1bfd1b21af31d Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 30 Jan 2024 19:05:05 +0100 Subject: [PATCH 116/297] fix(evm): fixes OracleAdapter test --- packages/evm/test/adapters/02_OracleAdapter.spec.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/evm/test/adapters/02_OracleAdapter.spec.ts b/packages/evm/test/adapters/02_OracleAdapter.spec.ts index 81d657ee..b4843a41 100644 --- a/packages/evm/test/adapters/02_OracleAdapter.spec.ts +++ b/packages/evm/test/adapters/02_OracleAdapter.spec.ts @@ -31,6 +31,7 @@ const blockRLP = (block) => { block.mixHash, block.nonce, block.baseFeePerGas, + block.withdrawalsRoot, ] return RLP.encode(values.map(emptyHexlify)) } From 2303722142668bcc7ee681176a23fa5c83833d4f Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 31 Jan 2024 10:09:44 +0100 Subject: [PATCH 117/297] refactor(evm): rn OracleAdapter into Adapter --- packages/evm/contracts/Hashi.sol | 49 +- packages/evm/contracts/Yaho.sol | 16 +- packages/evm/contracts/Yaru.sol | 4 +- .../evm/contracts/adapters/AMB/AMBAdapter.sol | 4 +- .../contracts/adapters/AMB/AMBReporter.sol | 2 +- .../{OracleAdapter.sol => Adapter.sol} | 8 +- .../adapters/Axelar/AxelarAdapter.sol | 4 +- ...OracleAdapter.sol => BlockHashAdapter.sol} | 15 +- .../contracts/adapters/Celer/CelerAdapter.sol | 4 +- .../adapters/Chainlink/CCIPAdapter.sol | 4 +- .../adapters/Connext/ConnextAdapter.sol | 4 +- .../adapters/DendrETH/DendrETHAdapter.sol | 4 +- .../adapters/Electron/ElectronAdapter.sol | 4 +- .../adapters/Hyperlane/HyperlaneAdapter.sol | 4 +- .../adapters/LayerZero/LayerZeroAdapter.sol | 4 +- .../L1CrossDomainMessengerReporter.sol | 2 +- .../L2CrossDomainMessengerAdapter.sol | 4 +- .../adapters/PNetwork/PNetworkAdapter.sol | 4 +- packages/evm/contracts/adapters/Reporter.sol | 6 +- .../contracts/adapters/Sygma/SygmaAdapter.sol | 4 +- .../adapters/Telepathy/TelepathyAdapter.sol | 4 +- .../adapters/Wormhole/WormholeAdapter.sol | 4 +- .../adapters/Wormhole/WormholeReporter.sol | 2 +- .../adapters/ZetaChain/ZetaAdapter.sol | 4 +- .../evm/contracts/interfaces/IAdapter.sol | 22 + ...racleAdapter.sol => IBlockHashAdapter.sol} | 6 +- .../contracts/interfaces/IGiriGiriBashi.sol | 118 +++-- packages/evm/contracts/interfaces/IHashi.sol | 52 +-- .../evm/contracts/interfaces/IMessage.sol | 4 +- .../contracts/interfaces/IOracleAdapter.sol | 22 - .../evm/contracts/interfaces/IReporter.sol | 18 +- .../evm/contracts/interfaces/IShoyuBashi.sol | 44 +- packages/evm/contracts/interfaces/IShuSho.sol | 24 +- packages/evm/contracts/interfaces/IYaho.sol | 18 +- .../evm/contracts/ownable/GiriGiriBashi.sol | 64 ++- packages/evm/contracts/ownable/ShoyuBashi.sol | 12 +- packages/evm/contracts/ownable/ShuSo.sol | 106 +++-- ...{MockOracleAdapter.sol => MockAdapter.sol} | 6 +- packages/evm/contracts/test/MockReporter.sol | 2 +- packages/evm/test/01_Hashi.spec.ts | 148 +++--- packages/evm/test/02_ShoyuBashi.spec.ts | 161 +++---- packages/evm/test/03_GiriGiriBashi.spec.ts | 420 ++++++++---------- packages/evm/test/05_Yaru.spec.ts | 2 +- .../test/adapters/02_OracleAdapter.spec.ts | 44 +- 44 files changed, 680 insertions(+), 777 deletions(-) rename packages/evm/contracts/adapters/{OracleAdapter.sol => Adapter.sol} (74%) rename packages/evm/contracts/adapters/{BlockHashOracleAdapter.sol => BlockHashAdapter.sol} (66%) create mode 100644 packages/evm/contracts/interfaces/IAdapter.sol rename packages/evm/contracts/interfaces/{IBlockHashOracleAdapter.sol => IBlockHashAdapter.sol} (79%) delete mode 100644 packages/evm/contracts/interfaces/IOracleAdapter.sol rename packages/evm/contracts/test/{MockOracleAdapter.sol => MockAdapter.sol} (64%) diff --git a/packages/evm/contracts/Hashi.sol b/packages/evm/contracts/Hashi.sol index 0b4b3e88..662cb008 100644 --- a/packages/evm/contracts/Hashi.sol +++ b/packages/evm/contracts/Hashi.sol @@ -33,24 +33,23 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.20; -import { IOracleAdapter } from "./interfaces/IOracleAdapter.sol"; +import { IAdapter } from "./interfaces/IAdapter.sol"; import { IHashi } from "./interfaces/IHashi.sol"; contract Hashi is IHashi { /// @inheritdoc IHashi - function checkHashWithThresholdFromOracles( + function checkHashWithThresholdFromAdapters( uint256 domain, uint256 id, uint256 threshold, - IOracleAdapter[] calldata oracleAdapters + IAdapter[] calldata adapters ) external view returns (bool) { - if (oracleAdapters.length == 0) revert NoOracleAdaptersGiven(); - if (threshold > oracleAdapters.length || threshold == 0) - revert InvalidThreshold(threshold, oracleAdapters.length); + if (adapters.length == 0) revert NoAdaptersGiven(); + if (threshold > adapters.length || threshold == 0) revert InvalidThreshold(threshold, adapters.length); - bytes32[] memory hashes = new bytes32[](oracleAdapters.length); - for (uint256 i = 0; i < oracleAdapters.length; ) { - try oracleAdapters[i].getHashFromOracle(domain, id) returns (bytes32 hash) { + bytes32[] memory hashes = new bytes32[](adapters.length); + for (uint256 i = 0; i < adapters.length; ) { + try adapters[i].getHash(domain, id) returns (bytes32 hash) { hashes[i] = hash; } catch {} // solhint-disable no-empty-blocks unchecked { @@ -88,20 +87,20 @@ contract Hashi is IHashi { } /// @inheritdoc IHashi - function getHashFromOracle(uint256 domain, uint256 id, IOracleAdapter oracleAdapter) public view returns (bytes32) { - return oracleAdapter.getHashFromOracle(domain, id); + function getHashFromAdapter(uint256 domain, uint256 id, IAdapter adapter) public view returns (bytes32) { + return adapter.getHash(domain, id); } /// @inheritdoc IHashi - function getHashesFromOracles( + function getHashesFromAdapters( uint256 domain, uint256 id, - IOracleAdapter[] calldata oracleAdapters + IAdapter[] calldata adapters ) public view returns (bytes32[] memory) { - if (oracleAdapters.length == 0) revert NoOracleAdaptersGiven(); - bytes32[] memory hashes = new bytes32[](oracleAdapters.length); - for (uint256 i = 0; i < oracleAdapters.length; ) { - hashes[i] = getHashFromOracle(domain, id, oracleAdapters[i]); + if (adapters.length == 0) revert NoAdaptersGiven(); + bytes32[] memory hashes = new bytes32[](adapters.length); + for (uint256 i = 0; i < adapters.length; ) { + hashes[i] = getHashFromAdapter(domain, id, adapters[i]); unchecked { ++i; } @@ -110,18 +109,14 @@ contract Hashi is IHashi { } /// @inheritdoc IHashi - function getHash( - uint256 domain, - uint256 id, - IOracleAdapter[] calldata oracleAdapters - ) external view returns (bytes32 hash) { - if (oracleAdapters.length == 0) revert NoOracleAdaptersGiven(); - bytes32[] memory hashes = getHashesFromOracles(domain, id, oracleAdapters); + function getHash(uint256 domain, uint256 id, IAdapter[] calldata adapters) external view returns (bytes32 hash) { + if (adapters.length == 0) revert NoAdaptersGiven(); + bytes32[] memory hashes = getHashesFromAdapters(domain, id, adapters); hash = hashes[0]; - if (hash == bytes32(0)) revert OracleDidNotReport(oracleAdapters[0]); + if (hash == bytes32(0)) revert HashNotAvailableInAdapter(adapters[0]); for (uint256 i = 1; i < hashes.length; ) { - if (hashes[i] == bytes32(0)) revert OracleDidNotReport(oracleAdapters[i]); - if (hash != hashes[i]) revert OraclesDisagree(oracleAdapters[i - 1], oracleAdapters[i]); + if (hashes[i] == bytes32(0)) revert HashNotAvailableInAdapter(adapters[i]); + if (hash != hashes[i]) revert AdaptersDisagree(adapters[i - 1], adapters[i]); unchecked { ++i; } diff --git a/packages/evm/contracts/Yaho.sol b/packages/evm/contracts/Yaho.sol index 35f99d25..dc23bbe3 100644 --- a/packages/evm/contracts/Yaho.sol +++ b/packages/evm/contracts/Yaho.sol @@ -6,7 +6,7 @@ import { MessageHashCalculator } from "./utils/MessageHashCalculator.sol"; import { IYaho } from "./interfaces/IYaho.sol"; import { IReporter } from "./interfaces/IReporter.sol"; import { Message } from "./interfaces/IMessage.sol"; -import { IOracleAdapter } from "./interfaces/IOracleAdapter.sol"; +import { IAdapter } from "./interfaces/IAdapter.sol"; contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { mapping(uint256 => bytes32) private _pendingMessageHashes; @@ -18,7 +18,7 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { address receiver, bytes calldata data, IReporter[] calldata reporters, - IOracleAdapter[] calldata adapters + IAdapter[] calldata adapters ) external returns (uint256) { _checkReportersAndAdapters(threshold, reporters, adapters); (uint256 messageId, ) = _dispatchMessage(toChainId, threshold, receiver, data, reporters, adapters); @@ -32,7 +32,7 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { address receiver, bytes calldata data, IReporter[] calldata reporters, - IOracleAdapter[] calldata adapters + IAdapter[] calldata adapters ) external payable returns (uint256, bytes32[] memory) { _checkReportersAndAdapters(threshold, reporters, adapters); (uint256 messageId, bytes32 messageHash) = _dispatchMessage( @@ -60,7 +60,7 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { address[] calldata receivers, bytes[] calldata data, IReporter[] calldata reporters, - IOracleAdapter[] calldata adapters + IAdapter[] calldata adapters ) external payable returns (uint256[] memory, bytes32[] memory) { if (thresholds.length != receivers.length) revert UnequalArrayLengths(thresholds.length, receivers.length); if (thresholds.length != data.length) revert UnequalArrayLengths(thresholds.length, data.length); @@ -127,7 +127,7 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { function _checkReportersAndAdapters( uint256 threshold, IReporter[] calldata reporters, - IOracleAdapter[] calldata adapters + IAdapter[] calldata adapters ) internal pure { if (reporters.length == 0) revert NoReportersGiven(); if (adapters.length == 0) revert NoAdaptersGiven(); @@ -141,7 +141,7 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { address receiver, bytes calldata data, IReporter[] calldata reporters, - IOracleAdapter[] calldata adapters + IAdapter[] calldata adapters ) internal returns (uint256, bytes32) { address sender = msg.sender; Message memory message = Message( @@ -166,7 +166,7 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { uint256 messageId, bytes32 messageHash, IReporter[] memory reporters, - IOracleAdapter[] memory adapters + IAdapter[] memory adapters ) internal returns (bytes32[] memory) { uint256[] memory messageIds = new uint256[](1); bytes32[] memory messageHashes = new bytes32[](1); @@ -180,7 +180,7 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { uint256[] memory messageIds, bytes32[] memory messageHashes, IReporter[] memory reporters, - IOracleAdapter[] memory adapters + IAdapter[] memory adapters ) internal returns (bytes32[] memory) { bytes32[] memory reportersReceipts = new bytes32[](reporters.length); diff --git a/packages/evm/contracts/Yaru.sol b/packages/evm/contracts/Yaru.sol index 83cf06ed..452e2dcc 100644 --- a/packages/evm/contracts/Yaru.sol +++ b/packages/evm/contracts/Yaru.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.20; import { ReentrancyGuard } from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import { IYaru } from "./interfaces/IYaru.sol"; -import { IHashi, IOracleAdapter } from "./interfaces/IHashi.sol"; +import { IHashi, IAdapter } from "./interfaces/IHashi.sol"; import { Message } from "./interfaces/IMessage.sol"; import { MessageIdCalculator } from "./utils/MessageIdCalculator.sol"; import { MessageHashCalculator } from "./utils/MessageHashCalculator.sol"; @@ -37,7 +37,7 @@ contract Yaru is IYaru, MessageIdCalculator, MessageHashCalculator, ReentrancyGu executed[messageId] = true; if ( - !IHashi(HASHI).checkHashWithThresholdFromOracles( + !IHashi(HASHI).checkHashWithThresholdFromAdapters( SOURCE_CHAIN_ID, messageId, message.threshold, diff --git a/packages/evm/contracts/adapters/AMB/AMBAdapter.sol b/packages/evm/contracts/adapters/AMB/AMBAdapter.sol index 4661fcc9..93baf851 100644 --- a/packages/evm/contracts/adapters/AMB/AMBAdapter.sol +++ b/packages/evm/contracts/adapters/AMB/AMBAdapter.sol @@ -2,9 +2,9 @@ pragma solidity ^0.8.20; import { IAMB } from "./IAMB.sol"; -import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; +import { BlockHashAdapter } from "../BlockHashAdapter.sol"; -contract AMBAdapter is BlockHashOracleAdapter { +contract AMBAdapter is BlockHashAdapter { string public constant PROVIDER = "amb"; IAMB public immutable AMB; diff --git a/packages/evm/contracts/adapters/AMB/AMBReporter.sol b/packages/evm/contracts/adapters/AMB/AMBReporter.sol index 00582f51..7f573728 100644 --- a/packages/evm/contracts/adapters/AMB/AMBReporter.sol +++ b/packages/evm/contracts/adapters/AMB/AMBReporter.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.20; import { Reporter } from "../Reporter.sol"; import { AMBAdapter } from "./AMBAdapter.sol"; -import { IOracleAdapter } from "../../interfaces/IOracleAdapter.sol"; +import { IAdapter } from "../../interfaces/IAdapter.sol"; import { IAMB } from "./IAMB.sol"; contract AMBReporter is Reporter { diff --git a/packages/evm/contracts/adapters/OracleAdapter.sol b/packages/evm/contracts/adapters/Adapter.sol similarity index 74% rename from packages/evm/contracts/adapters/OracleAdapter.sol rename to packages/evm/contracts/adapters/Adapter.sol index a07f33a6..6bf1e470 100644 --- a/packages/evm/contracts/adapters/OracleAdapter.sol +++ b/packages/evm/contracts/adapters/Adapter.sol @@ -1,13 +1,13 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.20; -import { IOracleAdapter } from "../interfaces/IOracleAdapter.sol"; +import { IAdapter } from "../interfaces/IAdapter.sol"; -abstract contract OracleAdapter is IOracleAdapter { +abstract contract Adapter is IAdapter { mapping(uint256 => mapping(uint256 => bytes32)) private _hashes; - /// @inheritdoc IOracleAdapter - function getHashFromOracle(uint256 domain, uint256 id) public view returns (bytes32) { + /// @inheritdoc IAdapter + function getHash(uint256 domain, uint256 id) public view returns (bytes32) { return _hashes[domain][id]; } diff --git a/packages/evm/contracts/adapters/Axelar/AxelarAdapter.sol b/packages/evm/contracts/adapters/Axelar/AxelarAdapter.sol index fa00deca..764948b8 100644 --- a/packages/evm/contracts/adapters/Axelar/AxelarAdapter.sol +++ b/packages/evm/contracts/adapters/Axelar/AxelarAdapter.sol @@ -3,9 +3,9 @@ pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { AxelarExecutable } from "@axelar-network/axelar-gmp-sdk-solidity/contracts/executable/AxelarExecutable.sol"; -import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; +import { BlockHashAdapter } from "../BlockHashAdapter.sol"; -contract AxelarAdapter is BlockHashOracleAdapter, Ownable, AxelarExecutable { +contract AxelarAdapter is BlockHashAdapter, Ownable, AxelarExecutable { string public constant PROVIDER = "axelar"; mapping(bytes32 => bytes32) public enabledReporters; diff --git a/packages/evm/contracts/adapters/BlockHashOracleAdapter.sol b/packages/evm/contracts/adapters/BlockHashAdapter.sol similarity index 66% rename from packages/evm/contracts/adapters/BlockHashOracleAdapter.sol rename to packages/evm/contracts/adapters/BlockHashAdapter.sol index 029c0612..bdf65b50 100644 --- a/packages/evm/contracts/adapters/BlockHashOracleAdapter.sol +++ b/packages/evm/contracts/adapters/BlockHashAdapter.sol @@ -2,13 +2,13 @@ pragma solidity ^0.8.20; import { RLPReader } from "solidity-rlp/contracts/RLPReader.sol"; -import { OracleAdapter } from "./OracleAdapter.sol"; -import { IBlockHashOracleAdapter } from "../interfaces/IBlockHashOracleAdapter.sol"; +import { Adapter } from "./Adapter.sol"; +import { IBlockHashAdapter } from "../interfaces/IBlockHashAdapter.sol"; -abstract contract BlockHashOracleAdapter is IBlockHashOracleAdapter, OracleAdapter { +abstract contract BlockHashAdapter is IBlockHashAdapter, Adapter { using RLPReader for RLPReader.RLPItem; - /// @inheritdoc IBlockHashOracleAdapter + /// @inheritdoc IBlockHashAdapter function proveAncestralBlockHashes(uint256 chainId, bytes[] memory blockHeaders) external { for (uint256 i = 0; i < blockHeaders.length; i++) { RLPReader.RLPItem memory blockHeaderRLP = RLPReader.toRlpItem(blockHeaders[i]); @@ -24,11 +24,10 @@ abstract contract BlockHashOracleAdapter is IBlockHashOracleAdapter, OracleAdapt bytes32 blockParent = bytes32(blockHeaderContent[0].toUint()); uint256 blockNumber = uint256(blockHeaderContent[8].toUint()); - bytes32 reportedBlockHash = keccak256(blockHeaders[i]); - bytes32 storedBlockHash = getHashFromOracle(chainId, blockNumber); + bytes32 blockHash = keccak256(blockHeaders[i]); + bytes32 storedBlockHash = getHash(chainId, blockNumber); - if (reportedBlockHash != storedBlockHash) - revert ConflictingBlockHeader(blockNumber, reportedBlockHash, storedBlockHash); + if (blockHash != storedBlockHash) revert ConflictingBlockHeader(blockNumber, blockHash, storedBlockHash); _storeHash(chainId, blockNumber - 1, blockParent); } diff --git a/packages/evm/contracts/adapters/Celer/CelerAdapter.sol b/packages/evm/contracts/adapters/Celer/CelerAdapter.sol index 3facadd3..39991a87 100644 --- a/packages/evm/contracts/adapters/Celer/CelerAdapter.sol +++ b/packages/evm/contracts/adapters/Celer/CelerAdapter.sol @@ -3,9 +3,9 @@ pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { IMessageReceiverApp } from "./interfaces/IMessageReceiverApp.sol"; -import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; +import { BlockHashAdapter } from "../BlockHashAdapter.sol"; -contract CelerAdapter is BlockHashOracleAdapter, Ownable, IMessageReceiverApp { +contract CelerAdapter is BlockHashAdapter, Ownable, IMessageReceiverApp { string public constant PROVIDER = "celer"; address public immutable CELER_BUS; diff --git a/packages/evm/contracts/adapters/Chainlink/CCIPAdapter.sol b/packages/evm/contracts/adapters/Chainlink/CCIPAdapter.sol index 6a83e812..558148ee 100644 --- a/packages/evm/contracts/adapters/Chainlink/CCIPAdapter.sol +++ b/packages/evm/contracts/adapters/Chainlink/CCIPAdapter.sol @@ -4,9 +4,9 @@ pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { CCIPReceiver } from "@chainlink/contracts-ccip/src/v0.8/ccip/applications/CCIPReceiver.sol"; import { Client } from "@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Client.sol"; -import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; +import { BlockHashAdapter } from "../BlockHashAdapter.sol"; -contract CCIPAdapter is BlockHashOracleAdapter, Ownable, CCIPReceiver { +contract CCIPAdapter is BlockHashAdapter, Ownable, CCIPReceiver { string public constant PROVIDER = "ccip"; mapping(uint64 => address) public enabledReporters; diff --git a/packages/evm/contracts/adapters/Connext/ConnextAdapter.sol b/packages/evm/contracts/adapters/Connext/ConnextAdapter.sol index d7f07e62..09f97437 100644 --- a/packages/evm/contracts/adapters/Connext/ConnextAdapter.sol +++ b/packages/evm/contracts/adapters/Connext/ConnextAdapter.sol @@ -3,9 +3,9 @@ pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { IXReceiver } from "@connext/interfaces/core/IXReceiver.sol"; -import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; +import { BlockHashAdapter } from "../BlockHashAdapter.sol"; -contract ConnextAdapter is BlockHashOracleAdapter, Ownable, IXReceiver { +contract ConnextAdapter is BlockHashAdapter, Ownable, IXReceiver { string public constant PROVIDER = "connext"; address public immutable CONNEXT; diff --git a/packages/evm/contracts/adapters/DendrETH/DendrETHAdapter.sol b/packages/evm/contracts/adapters/DendrETH/DendrETHAdapter.sol index 6d344c3f..f4975477 100644 --- a/packages/evm/contracts/adapters/DendrETH/DendrETHAdapter.sol +++ b/packages/evm/contracts/adapters/DendrETH/DendrETHAdapter.sol @@ -3,9 +3,9 @@ pragma solidity ^0.8.20; import { ILightClient, LightClientUpdate } from "./interfaces/IDendrETH.sol"; import { SSZ } from "../Telepathy/libraries/SimpleSerialize.sol"; -import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; +import { BlockHashAdapter } from "../BlockHashAdapter.sol"; -contract DendrETHAdapter is BlockHashOracleAdapter { +contract DendrETHAdapter is BlockHashAdapter { error InvalidUpdate(); error BlockHeaderNotAvailable(uint256 slot); error InvalidBlockNumberProof(); diff --git a/packages/evm/contracts/adapters/Electron/ElectronAdapter.sol b/packages/evm/contracts/adapters/Electron/ElectronAdapter.sol index 2586a732..7dc62580 100644 --- a/packages/evm/contracts/adapters/Electron/ElectronAdapter.sol +++ b/packages/evm/contracts/adapters/Electron/ElectronAdapter.sol @@ -1,13 +1,13 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.20; -import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; +import { BlockHashAdapter } from "../BlockHashAdapter.sol"; import { ILightClient } from "./interfaces/ILightClient.sol"; import { Merkle } from "./lib/Merkle.sol"; import { Receipt } from "./lib/Receipt.sol"; import { Ownable } from "openzeppelin/access/Ownable.sol"; -contract ElectronAdapter is BlockHashOracleAdapter, Ownable { +contract ElectronAdapter is BlockHashAdapter, Ownable { ILightClient public lightClient; bytes32 public constant EVENT_SIG_HASH = 0xf7df17dce0093aedfcbae24b4f04e823f9e863c97986ab1ba6c5267ace49ddea; // HeaderStored(uint256,bytes32) diff --git a/packages/evm/contracts/adapters/Hyperlane/HyperlaneAdapter.sol b/packages/evm/contracts/adapters/Hyperlane/HyperlaneAdapter.sol index 46403380..5e87fdcc 100644 --- a/packages/evm/contracts/adapters/Hyperlane/HyperlaneAdapter.sol +++ b/packages/evm/contracts/adapters/Hyperlane/HyperlaneAdapter.sol @@ -4,9 +4,9 @@ pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { IMessageRecipient } from "@hyperlane-xyz/core/contracts/interfaces/IMessageRecipient.sol"; import { IInterchainSecurityModule } from "@hyperlane-xyz/core/contracts/interfaces/IInterchainSecurityModule.sol"; -import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; +import { BlockHashAdapter } from "../BlockHashAdapter.sol"; -contract HyperlaneAdapter is BlockHashOracleAdapter, Ownable, IMessageRecipient { +contract HyperlaneAdapter is BlockHashAdapter, Ownable, IMessageRecipient { string public constant PROVIDER = "hyperlane"; address public immutable HYPERLANE_MAILBOX; diff --git a/packages/evm/contracts/adapters/LayerZero/LayerZeroAdapter.sol b/packages/evm/contracts/adapters/LayerZero/LayerZeroAdapter.sol index 4786e41a..e9688db8 100644 --- a/packages/evm/contracts/adapters/LayerZero/LayerZeroAdapter.sol +++ b/packages/evm/contracts/adapters/LayerZero/LayerZeroAdapter.sol @@ -3,9 +3,9 @@ pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { ILayerZeroReceiver } from "./interfaces/ILayerZeroReceiver.sol"; -import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; +import { BlockHashAdapter } from "../BlockHashAdapter.sol"; -contract LayerZeroAdapter is BlockHashOracleAdapter, Ownable, ILayerZeroReceiver { +contract LayerZeroAdapter is BlockHashAdapter, Ownable, ILayerZeroReceiver { string public constant PROVIDER = "layer-zero"; address public immutable LAYER_ZERO_ENDPOINT; diff --git a/packages/evm/contracts/adapters/Optimism/L1CrossDomainMessengerReporter.sol b/packages/evm/contracts/adapters/Optimism/L1CrossDomainMessengerReporter.sol index 4a969f01..c6c121e2 100644 --- a/packages/evm/contracts/adapters/Optimism/L1CrossDomainMessengerReporter.sol +++ b/packages/evm/contracts/adapters/Optimism/L1CrossDomainMessengerReporter.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.20; import { Reporter } from "../Reporter.sol"; -import { IOracleAdapter } from "../../interfaces/IOracleAdapter.sol"; +import { IAdapter } from "../../interfaces/IAdapter.sol"; import { ICrossDomainMessenger } from "./interfaces/ICrossDomainMessenger.sol"; contract L1CrossDomainMessengerReporter is Reporter { diff --git a/packages/evm/contracts/adapters/Optimism/L2CrossDomainMessengerAdapter.sol b/packages/evm/contracts/adapters/Optimism/L2CrossDomainMessengerAdapter.sol index e0bc7c63..0c85347a 100644 --- a/packages/evm/contracts/adapters/Optimism/L2CrossDomainMessengerAdapter.sol +++ b/packages/evm/contracts/adapters/Optimism/L2CrossDomainMessengerAdapter.sol @@ -2,9 +2,9 @@ pragma solidity ^0.8.20; import { ICrossDomainMessenger } from "./interfaces/ICrossDomainMessenger.sol"; -import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; +import { BlockHashAdapter } from "../BlockHashAdapter.sol"; -contract L2CrossDomainMessengerAdapter is BlockHashOracleAdapter { +contract L2CrossDomainMessengerAdapter is BlockHashAdapter { string public constant PROVIDER = "optimism"; ICrossDomainMessenger public immutable L2_CROSS_DOMAIN_MESSENGER; diff --git a/packages/evm/contracts/adapters/PNetwork/PNetworkAdapter.sol b/packages/evm/contracts/adapters/PNetwork/PNetworkAdapter.sol index 0f559203..8168e8e4 100644 --- a/packages/evm/contracts/adapters/PNetwork/PNetworkAdapter.sol +++ b/packages/evm/contracts/adapters/PNetwork/PNetworkAdapter.sol @@ -4,9 +4,9 @@ pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { IERC777Recipient } from "@openzeppelin/contracts/interfaces/IERC777Recipient.sol"; import { IERC1820RegistryUpgradeable } from "@openzeppelin/contracts-upgradeable/interfaces/IERC1820RegistryUpgradeable.sol"; -import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; +import { BlockHashAdapter } from "../BlockHashAdapter.sol"; -contract PNetworkAdapter is BlockHashOracleAdapter, Ownable { +contract PNetworkAdapter is BlockHashAdapter, Ownable { string public constant PROVIDER = "pnetwork"; address public immutable VAULT; diff --git a/packages/evm/contracts/adapters/Reporter.sol b/packages/evm/contracts/adapters/Reporter.sol index 51a22876..ff0552de 100644 --- a/packages/evm/contracts/adapters/Reporter.sol +++ b/packages/evm/contracts/adapters/Reporter.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.20; import { IHeaderStorage } from "../interfaces/IHeaderStorage.sol"; import { IReporter } from "../interfaces/IReporter.sol"; -import { IOracleAdapter } from "../interfaces/IOracleAdapter.sol"; +import { IAdapter } from "../interfaces/IAdapter.sol"; abstract contract Reporter is IReporter { address public immutable HEADER_STORAGE; @@ -22,7 +22,7 @@ abstract contract Reporter is IReporter { /// @inheritdoc IReporter function dispatchBlocks( uint256 toChainId, - IOracleAdapter adapter, + IAdapter adapter, uint256[] memory blockNumbers ) external payable returns (bytes32) { bytes32[] memory blockHeaders = IHeaderStorage(HEADER_STORAGE).storeBlockHeaders(blockNumbers); @@ -38,7 +38,7 @@ abstract contract Reporter is IReporter { /// @inheritdoc IReporter function dispatchMessages( uint256 toChainId, - IOracleAdapter adapter, + IAdapter adapter, uint256[] memory messageIds, bytes32[] memory messageHashes ) external payable onlyYaho returns (bytes32) { diff --git a/packages/evm/contracts/adapters/Sygma/SygmaAdapter.sol b/packages/evm/contracts/adapters/Sygma/SygmaAdapter.sol index 4eff5602..3343059e 100644 --- a/packages/evm/contracts/adapters/Sygma/SygmaAdapter.sol +++ b/packages/evm/contracts/adapters/Sygma/SygmaAdapter.sol @@ -2,9 +2,9 @@ pragma solidity ^0.8.20; import { AccessControl } from "@openzeppelin/contracts/access/AccessControl.sol"; -import "../BlockHashOracleAdapter.sol"; +import "../BlockHashAdapter.sol"; -contract SygmaAdapter is AccessControl, BlockHashOracleAdapter { +contract SygmaAdapter is AccessControl, BlockHashAdapter { string public constant PROVIDER = "sygma"; struct Reporter { diff --git a/packages/evm/contracts/adapters/Telepathy/TelepathyAdapter.sol b/packages/evm/contracts/adapters/Telepathy/TelepathyAdapter.sol index 038ff6bf..5e569e4c 100644 --- a/packages/evm/contracts/adapters/Telepathy/TelepathyAdapter.sol +++ b/packages/evm/contracts/adapters/Telepathy/TelepathyAdapter.sol @@ -3,9 +3,9 @@ pragma solidity ^0.8.20; import { ILightClient, TelepathyStorage } from "./interfaces/ITelepathy.sol"; import { SSZ } from "./libraries/SimpleSerialize.sol"; -import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; +import { BlockHashAdapter } from "../BlockHashAdapter.sol"; -contract TelepathyAdapter is BlockHashOracleAdapter { +contract TelepathyAdapter is BlockHashAdapter { error NoLightClientOnChain(uint32 chainId); error InconsistentLightClient(address lightClient); error BlockHeaderNotAvailable(uint256 slot); diff --git a/packages/evm/contracts/adapters/Wormhole/WormholeAdapter.sol b/packages/evm/contracts/adapters/Wormhole/WormholeAdapter.sol index cc4087c9..bcbd228f 100644 --- a/packages/evm/contracts/adapters/Wormhole/WormholeAdapter.sol +++ b/packages/evm/contracts/adapters/Wormhole/WormholeAdapter.sol @@ -2,10 +2,10 @@ pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; -import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; +import { BlockHashAdapter } from "../BlockHashAdapter.sol"; import { IWormhole, VM } from "./interfaces/IWormhole.sol"; -contract WormholeAdapter is BlockHashOracleAdapter, Ownable { +contract WormholeAdapter is BlockHashAdapter, Ownable { IWormhole public immutable WORMHOLE; mapping(uint32 => bytes32) public enabledReporters; diff --git a/packages/evm/contracts/adapters/Wormhole/WormholeReporter.sol b/packages/evm/contracts/adapters/Wormhole/WormholeReporter.sol index e3d70041..d751983a 100644 --- a/packages/evm/contracts/adapters/Wormhole/WormholeReporter.sol +++ b/packages/evm/contracts/adapters/Wormhole/WormholeReporter.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.20; import { Reporter } from "../Reporter.sol"; -import { IOracleAdapter } from "../../interfaces/IOracleAdapter.sol"; +import { IAdapter } from "../../interfaces/IAdapter.sol"; import { IWormhole } from "./interfaces/IWormhole.sol"; contract WormholeReporter is Reporter { diff --git a/packages/evm/contracts/adapters/ZetaChain/ZetaAdapter.sol b/packages/evm/contracts/adapters/ZetaChain/ZetaAdapter.sol index 16c54868..06c7b55d 100644 --- a/packages/evm/contracts/adapters/ZetaChain/ZetaAdapter.sol +++ b/packages/evm/contracts/adapters/ZetaChain/ZetaAdapter.sol @@ -3,9 +3,9 @@ pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { ZetaReceiver, ZetaInterfaces } from "./interfaces/ZetaInterfaces.sol"; -import { BlockHashOracleAdapter } from "../BlockHashOracleAdapter.sol"; +import { BlockHashAdapter } from "../BlockHashAdapter.sol"; -contract ZetaAdapter is BlockHashOracleAdapter, Ownable, ZetaReceiver { +contract ZetaAdapter is BlockHashAdapter, Ownable, ZetaReceiver { string public constant PROVIDER = "zeta"; address public immutable ZETA_CONNECTOR; diff --git a/packages/evm/contracts/interfaces/IAdapter.sol b/packages/evm/contracts/interfaces/IAdapter.sol new file mode 100644 index 00000000..773c1066 --- /dev/null +++ b/packages/evm/contracts/interfaces/IAdapter.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity ^0.8.20; + +/** + * @title IAdapter + */ +interface IAdapter { + error InvalidBlockHeaderLength(uint256 length); + error InvalidBlockHeaderRLP(); + error ConflictingBlockHeader(uint256 blockNumber, bytes32 blockHash, bytes32 storedBlockHash); + + event HashStored(uint256 indexed id, bytes32 indexed hashes); + + /** + * @dev Returns the hash for a given ID. + * @param domain - Identifier for the domain to query. + * @param id - Identifier for the ID to query. + * @return hash Bytes32 hash for the given ID on the given domain. + * @notice MUST return bytes32(0) if the hash is not present. + */ + function getHash(uint256 domain, uint256 id) external view returns (bytes32 hash); +} diff --git a/packages/evm/contracts/interfaces/IBlockHashOracleAdapter.sol b/packages/evm/contracts/interfaces/IBlockHashAdapter.sol similarity index 79% rename from packages/evm/contracts/interfaces/IBlockHashOracleAdapter.sol rename to packages/evm/contracts/interfaces/IBlockHashAdapter.sol index 56bd8dcc..9073c05b 100644 --- a/packages/evm/contracts/interfaces/IBlockHashOracleAdapter.sol +++ b/packages/evm/contracts/interfaces/IBlockHashAdapter.sol @@ -1,12 +1,12 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.20; -import { IOracleAdapter } from "./IOracleAdapter.sol"; +import { IAdapter } from "./IAdapter.sol"; /** - * @title IBlockHashOracleAdapter + * @title IBlockHashAdapter */ -interface IBlockHashOracleAdapter is IOracleAdapter { +interface IBlockHashAdapter is IAdapter { /** * @dev Proves and stores valid ancestral block hashes for a given chain ID. * @param chainId - The ID of the chain to prove block hashes for. diff --git a/packages/evm/contracts/interfaces/IGiriGiriBashi.sol b/packages/evm/contracts/interfaces/IGiriGiriBashi.sol index 3c47a12c..264953c6 100644 --- a/packages/evm/contracts/interfaces/IGiriGiriBashi.sol +++ b/packages/evm/contracts/interfaces/IGiriGiriBashi.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.20; import { IHashi } from "./IHashi.sol"; -import { IOracleAdapter } from "./IOracleAdapter.sol"; +import { IAdapter } from "./IAdapter.sol"; import { IShuSho } from "./IShuSho.sol"; /** @@ -12,9 +12,9 @@ interface IGiriGiriBashi is IShuSho { struct Settings { bool quarantined; // whether or not the adapter has has been quarantined. uint256 minimumBond; // amount that must be bonded alongside a challenge. - uint256 startId; // earliest id that the oracle could have reported. - uint256 idDepth; // how far behind the current head can this oracle safely report. 0 equals infinite. - uint256 timeout; // grace period in which the oracle must report on an in range id after being challenged. + uint256 startId; // earliest id that the adapter could have stored. + uint256 idDepth; // how far behind the current head can this adapter safely report. 0 equals infinite. + uint256 timeout; // grace period in which the adapter must report on an in range id after being challenged. } struct Challenge { @@ -26,12 +26,12 @@ interface IGiriGiriBashi is IShuSho { event BondRecipientSet(address payable bondRecipient); event NewHead(uint256 domain, uint256 head); event ChallegenRangeUpdated(uint256 domain, uint256 range); - event SettingsInitialized(uint256 domain, IOracleAdapter adapter, Settings settings); + event SettingsInitialized(uint256 domain, IAdapter adapter, Settings settings); event ChallengeCreated( bytes32 challengeId, uint256 indexed domain, uint256 id, - IOracleAdapter indexed adapter, + IAdapter indexed adapter, address indexed challenger, uint256 timestamp, uint256 bond @@ -40,23 +40,23 @@ interface IGiriGiriBashi is IShuSho { bytes32 challengeId, uint256 indexed domain, uint256 id, - IOracleAdapter indexed adapter, + IAdapter indexed adapter, address indexed challenger, uint256 bond, bool challengeSuccessful ); event NoConfidenceDeclareed(uint256 domain); - error DuplicateChallenge(bytes32 challengeId, uint256 domain, uint256 id, IOracleAdapter adapter); - error OutOfRange(IOracleAdapter adapter, uint256 id); - error AlreadyQuarantined(IOracleAdapter adapter); - error NotEnoughtValue(IOracleAdapter adapter, uint256 value); - error ChallengeNotFound(bytes32 challengeId, uint256 domain, uint256 id, IOracleAdapter adapter); - error AdapterHasNotYetTimedOut(IOracleAdapter adapter); + error DuplicateChallenge(bytes32 challengeId, uint256 domain, uint256 id, IAdapter adapter); + error OutOfRange(IAdapter adapter, uint256 id); + error AlreadyQuarantined(IAdapter adapter); + error NotEnoughtValue(IAdapter adapter, uint256 value); + error ChallengeNotFound(bytes32 challengeId, uint256 domain, uint256 id, IAdapter adapter); + error AdapterHasNotYetTimedOut(IAdapter adapter); error UnequalArrayLengths(); - error AdapterNotQuarantined(IOracleAdapter adapter); - error CannotProveNoConfidence(uint256 domain, uint256 id, IOracleAdapter[] adapters); - error AdaptersAgreed(IOracleAdapter, IOracleAdapter); + error AdapterNotQuarantined(IAdapter adapter); + error CannotProveNoConfidence(uint256 domain, uint256 id, IAdapter[] adapters); + error AdaptersAgreed(IAdapter, IAdapter); error NoConfidenceRequired(); error CountMustBeZero(uint256 domain); error ChallengeRangeAlreadySet(uint256 domain); @@ -82,111 +82,107 @@ interface IGiriGiriBashi is IShuSho { function setChallengeRange(uint256 domain, uint256 range) external; /** - * @dev Challenges the oracle adapter to provide a response. If the oracle adapter fails, it can be quarantined. + * @dev Challenges the adapter to provide a response. If the adapter fails, it can be quarantined. * @param domain - The Uint256 identifier for the domain. * @param id - The Uint256 identifier for the challenge. - * @param adapter - The address of the oracle adapter to challenge. + * @param adapter - The address of the adapter to challenge. * @notice Caller must pay a minimum bond to issue the challenge. This bond should be high enough to cover the gas costs for successfully completing the challenge. */ - function challengeOracleAdapter(uint256 domain, uint256 id, IOracleAdapter adapter) external payable; + function challengeAdapter(uint256 domain, uint256 id, IAdapter adapter) external payable; /** - * @dev Resolves a challenge by comparing results from a specific oracle adapter with others. + * @dev Resolves a challenge by comparing results from a specific adapter with others. * @param domain - The Uint256 identifier for the domain. * @param id - The Uint256 identifier. - * @param adapter - The oracle adapter instance for comparison. - * @param adapters - An array of oracle adapter instances for comparison. + * @param adapter - The adapter instance for comparison. + * @param adapters - An array of adapter instances for comparison. * @return A boolean indicating the success of the challenge resolution. */ function resolveChallenge( uint256 domain, uint256 id, - IOracleAdapter adapter, - IOracleAdapter[] memory adapters + IAdapter adapter, + IAdapter[] memory adapters ) external returns (bool); /** - * @dev show that enough oracles disagree that they could not make a threshold if the remainder all agree with one. + * @dev show that enough adapters disagree that they could not make a threshold if the remainder all agree with one. * @param domain - The Uint256 identifier for the domain. * @param id - The Uint256 identifier. - * @param adapters - An array of oracle adapter instances. + * @param adapters - An array of adapter instances. */ - function declareNoConfidence(uint256 domain, uint256 id, IOracleAdapter[] memory adapters) external; + function declareNoConfidence(uint256 domain, uint256 id, IAdapter[] memory adapters) external; /** - * @dev Replaces the quarantined oracle adapters for a given domain with new adapters and settings. + * @dev Replaces the quarantined adapters for a given domain with new adapters and settings. * @param domain - The Uint256 identifier for the domain. - * @param currentAdapters - An array of current oracle adapter instances to be replaced. - * @param newAdapters - An array of new oracle adapter instances to replace the current ones. + * @param currentAdapters - An array of current adapter instances to be replaced. + * @param newAdapters - An array of new adapter instances to replace the current ones. * @param settings - An array of settings corresponding to the new adapters. */ - function replaceQuaratinedOrcales( + function replaceQuaratinedAdapters( uint256 domain, - IOracleAdapter[] memory currentAdapters, - IOracleAdapter[] memory newAdapters, + IAdapter[] memory currentAdapters, + IAdapter[] memory newAdapters, Settings[] memory settings ) external; /** - * @dev Disables a set of oracle adapters for a given domain. + * @dev Disables a set of adapters for a given domain. * @param domain - The Uint256 identifier for the domain. - * @param adapters - An array of oracle adapter instances to be disabled. + * @param adapters - An array of adapter instances to be disabled. */ - function disableOracleAdapters(uint256 domain, IOracleAdapter[] memory adapters) external; + function disableAdapters(uint256 domain, IAdapter[] memory adapters) external; /** - * @dev Enables a set of oracle adapters for a given domain with specific settings. + * @dev Enables a set of adapters for a given domain with specific settings. * @param domain - The Uint256 identifier for the domain. - * @param adapters - An array of oracle adapter instances. + * @param adapters - An array of adapter instances. * @param settings - An array of settings, corresponding to each adapter. */ - function enableOracleAdapters( - uint256 domain, - IOracleAdapter[] memory adapters, - Settings[] memory settings - ) external; + function enableAdapters(uint256 domain, IAdapter[] memory adapters, Settings[] memory settings) external; /** - * @dev Gets the challenge ID for a given domain, ID, and oracle adapter. + * @dev Gets the challenge ID for a given domain, ID, and adapter. * @param domain - The Uint256 identifier for the domain. * @param id - The Uint256 identifier. - * @param adapter - The oracle adapter instance. + * @param adapter - The adapter instance. * @return The computed challenge ID as a bytes32 hash. */ - function getChallengeId(uint256 domain, uint256 id, IOracleAdapter adapter) external pure returns (bytes32); + function getChallengeId(uint256 domain, uint256 id, IAdapter adapter) external pure returns (bytes32); /** - * @dev Returns the hash unanimously agreed upon by ALL of the enabled oraclesAdapters. + * @dev Returns the hash unanimously agreed upon by ALL of the enabled adapters. * @param domain - Uint256 identifier for the domain to query. * @param id - Uint256 identifier to query. - * @return hash - Bytes32 hash agreed upon by the oracles for the given domain. - * @notice Reverts if oracles disagree. - * @notice Reverts if oracles have not yet reported the hash for the given ID. - * @notice Reverts if no oracles are set for the given domain. + * @return hash - Bytes32 hash agreed upon by the adapters for the given domain. + * @notice Reverts if adapters disagree. + * @notice Revert if the adapters do not yet have the hash for the given ID. + * @notice Reverts if no adapters are set for the given domain. */ function getUnanimousHash(uint256 domain, uint256 id) external returns (bytes32 hash); /** - * @dev Returns the hash agreed upon by a threshold of the enabled oraclesAdapters. + * @dev Returns the hash agreed upon by a threshold of the enabled adapters. * @param domain - Uint256 identifier for the domain to query. * @param id - Uint256 identifier to query. - * @return hash - Bytes32 hash agreed upon by a threshold of the oracles for the given domain. + * @return hash - Bytes32 hash agreed upon by a threshold of the adapters for the given domain. * @notice Reverts if no threshold is not reached. - * @notice Reverts if no oracles are set for the given domain. + * @notice Reverts if no adapters are set for the given domain. */ function getThresholdHash(uint256 domain, uint256 id) external returns (bytes32 hash); /** - * @dev Returns the hash unanimously agreed upon by all of the given oraclesAdapters. + * @dev Returns the hash unanimously agreed upon by all of the given adapters. * @param domain - Uint256 identifier for the domain to query. - * @param adapters - Array of oracle adapter addresses to query. + * @param adapters - Array of adapter addresses to query. * @param id - Uint256 identifier to query. - * @return hash - Bytes32 hash agreed upon by the oracles for the given domain. + * @return hash - Bytes32 hash agreed upon by the adapters for the given domain. * @notice adapters must be in numerical order from smallest to largest and contain no duplicates. * @notice Reverts if adapters are out of order or contain duplicates. - * @notice Reverts if oracles disagree. - * @notice Reverts if oracles have not yet reported the hash for the given ID. - * @notice Reverts if no oracles are set for the given domain. + * @notice Reverts if adapters disagree. + * @notice Revert if the adapters do not yet have the hash for the given ID. + * @notice Reverts if no adapters are set for the given domain. */ - function getHash(uint256 domain, uint256 id, IOracleAdapter[] memory adapters) external returns (bytes32 hash); + function getHash(uint256 domain, uint256 id, IAdapter[] memory adapters) external returns (bytes32 hash); } diff --git a/packages/evm/contracts/interfaces/IHashi.sol b/packages/evm/contracts/interfaces/IHashi.sol index 982044e2..acdce80e 100644 --- a/packages/evm/contracts/interfaces/IHashi.sol +++ b/packages/evm/contracts/interfaces/IHashi.sol @@ -1,70 +1,62 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.20; -import { IOracleAdapter } from "./IOracleAdapter.sol"; +import { IAdapter } from "./IAdapter.sol"; /** * @title IHashi */ interface IHashi { error InvalidThreshold(uint256 threshold, uint256 maxThreshold); - error NoOracleAdaptersGiven(); - error OracleDidNotReport(IOracleAdapter oracleAdapter); - error OraclesDisagree(IOracleAdapter oracleOne, IOracleAdapter oracleTwo); + error NoAdaptersGiven(); + error HashNotAvailableInAdapter(IAdapter adapter); + error AdaptersDisagree(IAdapter adapterOne, IAdapter adapterTwo); /** - * @dev Checks whether the threshold is reached for a message given a set of oracleAdapters. + * @dev Checks whether the threshold is reached for a message given a set of adapters. * @param domain - ID of the domain to query. * @param id - ID for which to return hash. * @param threshold - Threshold to use. - * @param oracleAdapters - Array of addresses for the oracle adapters to query. + * @param adapters - Array of addresses for the adapters to query. * @notice If the threshold is 1, it will always return true. * @return result A boolean indicating if a threshold for a given message has been reached. */ - function checkHashWithThresholdFromOracles( + function checkHashWithThresholdFromAdapters( uint256 domain, uint256 id, uint256 threshold, - IOracleAdapter[] calldata oracleAdapters + IAdapter[] calldata adapters ) external view returns (bool); /** - * @dev Returns the hash reported by a given oracle for a given ID. + * @dev Returns the hash stored by a given adapter for a given ID. * @param domain - ID of the domain to query. * @param id - ID for which to return a hash. - * @param oracleAdapter - Address of the oracle adapter to query. - * @return hash reported by the given oracle adapter for the given ID. + * @param adapter - Address of the adapter to query. + * @return hash stored by the given adapter for the given ID. */ - function getHashFromOracle( - uint256 domain, - uint256 id, - IOracleAdapter oracleAdapter - ) external view returns (bytes32); + function getHashFromAdapter(uint256 domain, uint256 id, IAdapter adapter) external view returns (bytes32); /** - * @dev Returns the hashes for a given ID reported by a given set of oracles. + * @dev Returns the hashes for a given ID stored by a given set of adapters. * @param domain - The ID of the domain to query. * @param id - The ID for which to return hashes. - * @param oracleAdapters - An array of addresses for the oracle adapters to query. - * @return hashes An array of hashes reported by the given oracle adapters for the specified ID. + * @param adapters - An array of addresses for the adapters to query. + * @return hashes An array of hashes stored by the given adapters for the specified ID. */ - function getHashesFromOracles( + function getHashesFromAdapters( uint256 domain, uint256 id, - IOracleAdapter[] calldata oracleAdapters + IAdapter[] calldata adapters ) external view returns (bytes32[] memory); /** - * @dev Returns the hash unanimously agreed upon by a given set of oracles. + * @dev Returns the hash unanimously agreed upon by a given set of adapters. * @param domain - The ID of the domain to query. * @param id - The ID for which to return a hash. - * @param oracleAdapters - An array of addresses for the oracle adapters to query. - * @return hash agreed on by the given set of oracle adapters. - * @notice MUST revert if oracles disagree on the hash or if an oracle does not report. + * @param adapters - An array of addresses for the adapters to query. + * @return hash agreed on by the given set of adapters. + * @notice MUST revert if adapters disagree on the hash or if an adapter does not report. */ - function getHash( - uint256 domain, - uint256 id, - IOracleAdapter[] calldata oracleAdapters - ) external view returns (bytes32); + function getHash(uint256 domain, uint256 id, IAdapter[] calldata adapters) external view returns (bytes32); } diff --git a/packages/evm/contracts/interfaces/IMessage.sol b/packages/evm/contracts/interfaces/IMessage.sol index 08c14dd8..c26cf102 100644 --- a/packages/evm/contracts/interfaces/IMessage.sol +++ b/packages/evm/contracts/interfaces/IMessage.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.20; import { IReporter } from "./IReporter.sol"; -import { IOracleAdapter } from "./IOracleAdapter.sol"; +import { IAdapter } from "./IAdapter.sol"; struct Message { bytes32 salt; @@ -12,5 +12,5 @@ struct Message { address receiver; bytes data; IReporter[] reporters; - IOracleAdapter[] adapters; + IAdapter[] adapters; } diff --git a/packages/evm/contracts/interfaces/IOracleAdapter.sol b/packages/evm/contracts/interfaces/IOracleAdapter.sol deleted file mode 100644 index 3bcfc9e6..00000000 --- a/packages/evm/contracts/interfaces/IOracleAdapter.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.20; - -/** - * @title IOracleAdapter - */ -interface IOracleAdapter { - error InvalidBlockHeaderLength(uint256 length); - error InvalidBlockHeaderRLP(); - error ConflictingBlockHeader(uint256 blockNumber, bytes32 reportedBlockHash, bytes32 storedBlockHash); - - event HashStored(uint256 indexed id, bytes32 indexed hashes); - - /** - * @dev Returns the hash for a given ID, as reported by the oracle. - * @param domain - Identifier for the domain to query. - * @param id - Identifier for the ID to query. - * @return hash Bytes32 hash reported by the oracle for the given ID on the given domain. - * @notice MUST return bytes32(0) if the oracle has not yet reported a hash for the given ID. - */ - function getHashFromOracle(uint256 domain, uint256 id) external view returns (bytes32 hash); -} diff --git a/packages/evm/contracts/interfaces/IReporter.sol b/packages/evm/contracts/interfaces/IReporter.sol index 5448e704..0a512f84 100644 --- a/packages/evm/contracts/interfaces/IReporter.sol +++ b/packages/evm/contracts/interfaces/IReporter.sol @@ -1,18 +1,18 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.20; -import { IOracleAdapter } from "./IOracleAdapter.sol"; +import { IAdapter } from "./IAdapter.sol"; interface IReporter { event BlockDispatched( uint256 indexed toChainId, - IOracleAdapter adapter, + IAdapter adapter, uint256 indexed blockNumber, bytes32 blockHeader ); event MessageDispatched( uint256 indexed toChainId, - IOracleAdapter adapter, + IAdapter adapter, uint256 indexed messageId, bytes32 messageHash ); @@ -20,23 +20,23 @@ interface IReporter { error NotYaho(address sender, address expectedYaho); /** - * @dev Dispatches blocks to a given oracle adapter on the target chaib. + * @dev Dispatches blocks to a given adapter on the target chaib. * @param toChainId - The target chain's Uint256 identifier. - * @param adapter - The oracle adapter instance to use. + * @param adapter - The adapter instance to use. * @param blockNumbers - An array of Uint256 block numbers to dispatch. * @notice blockNumbers must include block numbers that are greater than or equal to (currentBlock - 256) due to EVM limitations. * @return result - The result returned by the adapter as bytes. */ function dispatchBlocks( uint256 toChainId, - IOracleAdapter adapter, + IAdapter adapter, uint256[] memory blockNumbers ) external payable returns (bytes32); /** - * @dev Dispatches messages to a target chain using the specified oracle adapter. + * @dev Dispatches messages to a target chain using the specified adapter. * @param toChainId - The target chain's Uint256 identifier. - * @param adapter - The oracle adapter instance to use. + * @param adapter - The adapter instance to use. * @param messageIds - An array of Uint256 message identifiers. * @param messageHashes - An array of bytes32 message hashes. * @notice This function can be called only by Yaho @@ -44,7 +44,7 @@ interface IReporter { */ function dispatchMessages( uint256 toChainId, - IOracleAdapter adapter, + IAdapter adapter, uint256[] memory messageIds, bytes32[] memory messageHashes ) external payable returns (bytes32); diff --git a/packages/evm/contracts/interfaces/IShoyuBashi.sol b/packages/evm/contracts/interfaces/IShoyuBashi.sol index 31551099..7974f254 100644 --- a/packages/evm/contracts/interfaces/IShoyuBashi.sol +++ b/packages/evm/contracts/interfaces/IShoyuBashi.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.20; import { IHashi } from "./IHashi.sol"; -import { IOracleAdapter } from "./IOracleAdapter.sol"; +import { IAdapter } from "./IAdapter.sol"; import { IShuSho } from "./IShuSho.sol"; /** @@ -20,54 +20,54 @@ interface IShoyuBashi is IShuSho { /** * @dev Enables the given adapters for a given domain. - * @param domain - Uint256 identifier for the domain for which to set oracle adapters. - * @param adapters - Array of oracleAdapter addresses. + * @param domain - Uint256 identifier for the domain for which to set adapters. + * @param adapters - Array of adapter addresses. * @notice Reverts if adapters are out of order or contain duplicates. * @notice Only callable by the owner of this contract. */ - function enableOracleAdapters(uint256 domain, IOracleAdapter[] memory adapters) external; + function enableAdapters(uint256 domain, IAdapter[] memory adapters) external; /** * @dev Disables the given adapters for a given domain. - * @param domain - Uint256 identifier for the domain for which to set oracle adapters. - * @param adapters - Array of oracleAdapter addresses. + * @param domain - Uint256 identifier for the domain for which to set adapters. + * @param adapters - Array of adapter addresses. * @notice Reverts if adapters are out of order or contain duplicates. * @notice Only callable by the owner of this contract. */ - function disableOracleAdapters(uint256 domain, IOracleAdapter[] memory adapters) external; + function disableAdapters(uint256 domain, IAdapter[] memory adapters) external; /** - * @dev Returns the hash unanimously agreed upon by ALL of the enabled oraclesAdapters. + * @dev Returns the hash unanimously agreed upon by ALL of the enabled adapters. * @param domain - Uint256 identifier for the domain to query. * @param id - Uint256 identifier to query. - * @return Bytes32 hash agreed upon by the oracles for the given domain. - * @notice Reverts if oracles disagree. - * @notice Reverts if oracles have not yet reported the hash for the given ID. - * @notice Reverts if no oracles are set for the given domain. + * @return Bytes32 hash agreed upon by the adapters for the given domain. + * @notice Reverts if adapters disagree. + * @notice Revert if the adapters do not yet have the hash for the given ID. + * @notice Reverts if no adapters are set for the given domain. */ function getUnanimousHash(uint256 domain, uint256 id) external view returns (bytes32); /** - * @dev Returns the hash agreed upon by a threshold of the enabled oraclesAdapters. + * @dev Returns the hash agreed upon by a threshold of the enabled adapters. * @param domain - Uint256 identifier for the domain to query. * @param id - Uint256 identifier to query. - * @return Bytes32 hash agreed upon by a threshold of the oracles for the given domain. + * @return Bytes32 hash agreed upon by a threshold of the adapters for the given domain. * @notice Reverts if the threshold is not reached. - * @notice Reverts if no oracles are set for the given domain. + * @notice Reverts if no adapters are set for the given domain. */ function getThresholdHash(uint256 domain, uint256 id) external view returns (bytes32); /** - * @dev Returns the hash unanimously agreed upon by all of the given oraclesAdapters. + * @dev Returns the hash unanimously agreed upon by all of the given adapters. * @param domain - Uint256 identifier for the domain to query. - * @param adapters - Array of oracle adapter addresses to query. + * @param adapters - Array of adapter addresses to query. * @param id - Uint256 identifier to query. - * @return Bytes32 hash agreed upon by the oracles for the given domain. + * @return Bytes32 hash agreed upon by the adapters for the given domain. * @notice adapters must be in numerical order from smallest to largest and contain no duplicates. * @notice Reverts if adapters are out of order or contain duplicates. - * @notice Reverts if oracles disagree. - * @notice Reverts if oracles have not yet reported the hash for the given ID. - * @notice Reverts if no oracles are set for the given domain. + * @notice Reverts if adapters disagree. + * @notice Revert if the adapters do not yet have the hash for the given ID. + * @notice Reverts if no adapters are set for the given domain. */ - function getHash(uint256 domain, uint256 id, IOracleAdapter[] memory adapters) external view returns (bytes32); + function getHash(uint256 domain, uint256 id, IAdapter[] memory adapters) external view returns (bytes32); } diff --git a/packages/evm/contracts/interfaces/IShuSho.sol b/packages/evm/contracts/interfaces/IShuSho.sol index 6fbd9d59..c9667b73 100644 --- a/packages/evm/contracts/interfaces/IShuSho.sol +++ b/packages/evm/contracts/interfaces/IShuSho.sol @@ -2,37 +2,37 @@ pragma solidity ^0.8.20; import { IHashi } from "./IHashi.sol"; -import { IOracleAdapter } from "./IOracleAdapter.sol"; +import { IAdapter } from "./IAdapter.sol"; /** * @title IShuSho */ interface IShuSho { struct Link { - IOracleAdapter previous; - IOracleAdapter next; + IAdapter previous; + IAdapter next; } event HashiSet(IHashi indexed hashi); event Init(address indexed owner, IHashi indexed hashi); - event OracleAdaptersEnabled(uint256 indexed domain, IOracleAdapter[] adapters); - event OracleAdaptersDisabled(uint256 indexed domain, IOracleAdapter[] adapters); + event AdaptersEnabled(uint256 indexed domain, IAdapter[] adapters); + event AdaptersDisabled(uint256 indexed domain, IAdapter[] adapters); event ThresholdSet(uint256 domain, uint256 threshold); - error AdapterNotEnabled(IOracleAdapter adapter); - error AdapterAlreadyEnabled(IOracleAdapter adapter); + error AdapterNotEnabled(IAdapter adapter); + error AdapterAlreadyEnabled(IAdapter adapter); error DuplicateHashiAddress(IHashi hashi); - error DuplicateOrOutOfOrderAdapters(IOracleAdapter adapterOne, IOracleAdapter adapterTwo); + error DuplicateOrOutOfOrderAdapters(IAdapter adapterOne, IAdapter adapterTwo); error DuplicateThreashold(uint256 threshold); - error InvalidAdapter(IOracleAdapter adapter); + error InvalidAdapter(IAdapter adapter); error NoAdaptersEnabled(uint256 domain); error NoAdaptersGiven(); error ThresholdNotMet(); /** - * @dev Checks the order and validity of oracle adapters for a given domain. + * @dev Checks the order and validity of adapters for a given domain. * @param domain - The Uint256 identifier for the domain. - * @param _adapters - An array of oracle adapter instances. + * @param _adapters - An array of adapter instances. */ - function checkAdapterOrderAndValidity(uint256 domain, IOracleAdapter[] memory _adapters) external view; + function checkAdapterOrderAndValidity(uint256 domain, IAdapter[] memory _adapters) external view; } diff --git a/packages/evm/contracts/interfaces/IYaho.sol b/packages/evm/contracts/interfaces/IYaho.sol index e51b2e3a..bf9b151a 100644 --- a/packages/evm/contracts/interfaces/IYaho.sol +++ b/packages/evm/contracts/interfaces/IYaho.sol @@ -5,7 +5,7 @@ import { IMessageHashCalculator } from "./IMessageHashCalculator.sol"; import { IMessageIdCalculator } from "./IMessageIdCalculator.sol"; import { Message } from "./IMessage.sol"; import { IReporter } from "./IReporter.sol"; -import { IOracleAdapter } from "./IOracleAdapter.sol"; +import { IAdapter } from "./IAdapter.sol"; /** * @title IYaho @@ -29,7 +29,7 @@ interface IYaho is IMessageHashCalculator, IMessageIdCalculator { * @param receiver - The address of the receiver on the destination chain. * @param data - The data being sent in the message, represented as a byte array. * @param reporters - An array of `IReporter` contracts (not actively used in this step). - * @param adapters - An array of `IOracleAdapter` contracts (for later validation use). + * @param adapters - An array of `IAdapter` contracts (for later validation use). * @return messageId A unique identifier for the dispatched message, used for tracking and subsequent validation. */ function dispatchMessage( @@ -38,7 +38,7 @@ interface IYaho is IMessageHashCalculator, IMessageIdCalculator { address receiver, bytes calldata data, IReporter[] calldata reporters, - IOracleAdapter[] calldata adapters + IAdapter[] calldata adapters ) external returns (uint256); /** @@ -48,7 +48,7 @@ interface IYaho is IMessageHashCalculator, IMessageIdCalculator { * @param receiver - The address of the receiver on the destination chain. * @param data - The data being sent in the message, represented as a byte array. * @param reporters - An array of `IReporter` contracts (not actively used in this step). - * @param adapters - An array of `IOracleAdapter` contracts (for later validation use). + * @param adapters - An array of `IAdapter` contracts (for later validation use). * @return (messageId, result) A unique identifier for the dispatched message and an array of byte arrays, where each element is the result of dispatching a respective message to the corresponding Reporter. */ function dispatchMessageToAdapters( @@ -57,7 +57,7 @@ interface IYaho is IMessageHashCalculator, IMessageIdCalculator { address receiver, bytes calldata data, IReporter[] calldata reporters, - IOracleAdapter[] calldata adapters + IAdapter[] calldata adapters ) external payable returns (uint256, bytes32[] memory); /** @@ -67,7 +67,7 @@ interface IYaho is IMessageHashCalculator, IMessageIdCalculator { * @param receivers - An array of addresses for the receivers on the destination chain, one for each message. * @param data - An array of data payloads for each message, represented as byte arrays. * @param reporters - An array of `IReporter` contracts for reporting the status of each message. - * @param adapters - An array of `IOracleAdapter` contracts used for the validation of each message. + * @param adapters - An array of `IAdapter` contracts used for the validation of each message. * @return (messageIds, result) An array of unique identifiers for the dispatched messages and an array of bytes32 arrays, where each element is the result of dispatching a respective message to the corresponding Reporter. */ function dispatchMessagesToAdapters( @@ -76,7 +76,7 @@ interface IYaho is IMessageHashCalculator, IMessageIdCalculator { address[] calldata receivers, bytes[] calldata data, IReporter[] calldata reporters, - IOracleAdapter[] calldata adapters + IAdapter[] calldata adapters ) external payable returns (uint256[] memory, bytes32[] memory); /** @@ -87,9 +87,9 @@ interface IYaho is IMessageHashCalculator, IMessageIdCalculator { function getPendingMessageHash(uint256 messageId) external view returns (bytes32); /** - * @dev Relays an array of messages to their respective oracle adapters. In order to be able to aggregate messages within the reporter, it's mandatory that all messages have the same toChainId, reporters and adapters. + * @dev Relays an array of messages to their respective adapters. In order to be able to aggregate messages within the reporter, it's mandatory that all messages have the same toChainId, reporters and adapters. * - * @param messages - An array of `Message` structures to be relayed to the oracle adapters. + * @param messages - An array of `Message` structures to be relayed to the adapters. * @return result An array of bytes32 arrays, where each element is the result of dispatching a respective all messages to the corresponding Reporter. */ function relayMessagesToAdapters(Message[] calldata messages) external payable returns (bytes32[] memory); diff --git a/packages/evm/contracts/ownable/GiriGiriBashi.sol b/packages/evm/contracts/ownable/GiriGiriBashi.sol index deb061fc..265bbe75 100644 --- a/packages/evm/contracts/ownable/GiriGiriBashi.sol +++ b/packages/evm/contracts/ownable/GiriGiriBashi.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.20; import { ShuSo } from "./ShuSo.sol"; -import { IOracleAdapter } from "../interfaces/IOracleAdapter.sol"; +import { IAdapter } from "../interfaces/IAdapter.sol"; import { IHashi } from "../interfaces/IHashi.sol"; import { IGiriGiriBashi } from "../interfaces/IGiriGiriBashi.sol"; @@ -10,7 +10,7 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { address payable public bondRecipient; // address that bonds from unsuccessful challenges should be sent to. mapping(uint256 => uint256) public heads; // highest Id reported. mapping(uint256 => uint256) public challengeRanges; // how far beyond the current highestId can a challenged. - mapping(IOracleAdapter => Settings) public settings; + mapping(IAdapter => Settings) public settings; mapping(bytes32 => Challenge) public challenges; // current challenges. constructor(address _owner, address _hashi, address payable _bondRecipient) ShuSo(_owner, _hashi) { @@ -50,8 +50,8 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { } /// @inheritdoc IGiriGiriBashi - function challengeOracleAdapter(uint256 domain, uint256 id, IOracleAdapter adapter) public payable { - if (adapters[domain][adapter].previous == IOracleAdapter(address(0))) revert AdapterNotEnabled(adapter); + function challengeAdapter(uint256 domain, uint256 id, IAdapter adapter) public payable { + if (adapters[domain][adapter].previous == IAdapter(address(0))) revert AdapterNotEnabled(adapter); if (msg.value < settings[adapter].minimumBond) revert NotEnoughtValue(adapter, msg.value); if (settings[adapter].quarantined) revert AlreadyQuarantined(adapter); @@ -83,25 +83,22 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { function resolveChallenge( uint256 domain, uint256 id, - IOracleAdapter adapter, - IOracleAdapter[] memory _adapters + IAdapter adapter, + IAdapter[] memory _adapters ) public returns (bool success) { // check if challenge exists, revert if false bytes32 challengeId = getChallengeId(domain, id, adapter); if (challenges[challengeId].challenger == address(0)) revert ChallengeNotFound(challengeId, domain, id, adapter); - // check if oracle has reported Challenge storage challenge = challenges[challengeId]; Settings storage adapterSettings = settings[adapter]; - bytes32 reportedHash = adapter.getHashFromOracle(domain, id); + bytes32 storedHash = adapter.getHash(domain, id); - // if no hash reported - if (reportedHash == bytes32(0)) { + if (storedHash == bytes32(0)) { // check block.timestamp is greater than challenge.timestamp + adapterSettings.timeout, revert if false. if (block.timestamp < challenge.timestamp + adapterSettings.timeout) revert AdapterHasNotYetTimedOut(adapter); - // quaratine oracle adapter. adapterSettings.quarantined = true; // send bond to challenger challenge.challenger.transfer(challenge.bond); @@ -110,22 +107,21 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { // if _adapters + 1 equals threshold && _adapters + adapter report the same header if (_adapters.length + 1 == domains[domain].threshold) { bytes32 canonicalHash = hashi.getHash(domain, id, _adapters); - if (canonicalHash == reportedHash) { + if (canonicalHash == storedHash) { // return bond to recipient bondRecipient.transfer(challenge.bond); success = false; } else { - revert IHashi.OraclesDisagree(adapter, _adapters[0]); + revert IHashi.AdaptersDisagree(adapter, _adapters[0]); } } else { // check if _adapters report the same header as adapter bytes32 canonicalHash = getHash(domain, id, _adapters); - if (canonicalHash == reportedHash) { - // if reported headers match send bond to recipient. + if (canonicalHash == storedHash) { bondRecipient.transfer(challenge.bond); success = false; } else { - // quaratine oracle + // quaratine adapter adapterSettings.quarantined = true; // return bond to challenger challenge.challenger.transfer(challenge.bond); @@ -141,7 +137,7 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { } /// @inheritdoc IGiriGiriBashi - function declareNoConfidence(uint256 domain, uint256 id, IOracleAdapter[] memory _adapters) public { + function declareNoConfidence(uint256 domain, uint256 id, IAdapter[] memory _adapters) public { checkAdapterOrderAndValidity(domain, _adapters); (uint256 threshold, uint256 count) = getThresholdAndCount(domain); @@ -150,7 +146,7 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { if (confidence >= threshold) revert CannotProveNoConfidence(domain, id, _adapters); bytes32[] memory hashes = new bytes32[](_adapters.length); - for (uint i = 0; i < _adapters.length; i++) hashes[i] = _adapters[i].getHashFromOracle(domain, id); + for (uint i = 0; i < _adapters.length; i++) hashes[i] = _adapters[i].getHash(domain, id); // prove that each member of _adapters disagrees for (uint i = 0; i < hashes.length; i++) @@ -164,10 +160,10 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { } /// @inheritdoc IGiriGiriBashi - function replaceQuaratinedOrcales( + function replaceQuaratinedAdapters( uint256 domain, - IOracleAdapter[] memory currentAdapters, - IOracleAdapter[] memory newAdapters, + IAdapter[] memory currentAdapters, + IAdapter[] memory newAdapters, Settings[] memory _settings ) public onlyOwner { if (currentAdapters.length != newAdapters.length || currentAdapters.length != _settings.length) @@ -175,33 +171,29 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { for (uint i = 0; i < currentAdapters.length; i++) { if (!settings[currentAdapters[i]].quarantined) revert AdapterNotQuarantined(currentAdapters[i]); } - _disableOracleAdapters(domain, currentAdapters); - _enableOracleAdapters(domain, newAdapters); + _disableAdapters(domain, currentAdapters); + _enableAdapters(domain, newAdapters); initSettings(domain, newAdapters, _settings); } /// @inheritdoc IGiriGiriBashi - function disableOracleAdapters(uint256 domain, IOracleAdapter[] memory _adapters) public noConfidence(domain) { - _disableOracleAdapters(domain, _adapters); + function disableAdapters(uint256 domain, IAdapter[] memory _adapters) public noConfidence(domain) { + _disableAdapters(domain, _adapters); if (domains[domain].count == 0) domains[domain].threshold = 0; } /// @inheritdoc IGiriGiriBashi - function enableOracleAdapters( + function enableAdapters( uint256 domain, - IOracleAdapter[] memory _adapters, + IAdapter[] memory _adapters, Settings[] memory _settings ) public zeroCount(domain) { - _enableOracleAdapters(domain, _adapters); + _enableAdapters(domain, _adapters); initSettings(domain, _adapters, _settings); } /// @inheritdoc IGiriGiriBashi - function getChallengeId( - uint256 domain, - uint256 id, - IOracleAdapter adapter - ) public pure returns (bytes32 challengeId) { + function getChallengeId(uint256 domain, uint256 id, IAdapter adapter) public pure returns (bytes32 challengeId) { challengeId = keccak256(abi.encodePacked(domain, id, adapter)); } @@ -218,15 +210,15 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { } /// @inheritdoc IGiriGiriBashi - function getHash(uint256 domain, uint256 id, IOracleAdapter[] memory _adapters) public returns (bytes32 hash) { + function getHash(uint256 domain, uint256 id, IAdapter[] memory _adapters) public returns (bytes32 hash) { hash = _getHash(domain, id, _adapters); updateHead(domain, id); } - function initSettings(uint256 domain, IOracleAdapter[] memory _adapters, Settings[] memory _settings) private { + function initSettings(uint256 domain, IAdapter[] memory _adapters, Settings[] memory _settings) private { if (_adapters.length != _settings.length) revert UnequalArrayLengths(); for (uint i = 0; i < _adapters.length; i++) { - IOracleAdapter adapter = _adapters[i]; + IAdapter adapter = _adapters[i]; settings[adapter].quarantined = false; settings[adapter].minimumBond = _settings[i].minimumBond; settings[adapter].startId = _settings[i].startId; diff --git a/packages/evm/contracts/ownable/ShoyuBashi.sol b/packages/evm/contracts/ownable/ShoyuBashi.sol index 6d1c4aa2..ee3e7837 100644 --- a/packages/evm/contracts/ownable/ShoyuBashi.sol +++ b/packages/evm/contracts/ownable/ShoyuBashi.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.20; import { ShuSo } from "./ShuSo.sol"; -import { IOracleAdapter } from "../interfaces/IOracleAdapter.sol"; +import { IAdapter } from "../interfaces/IAdapter.sol"; import { IHashi } from "../interfaces/IHashi.sol"; import { IShoyuBashi } from "../interfaces/IShoyuBashi.sol"; @@ -19,13 +19,13 @@ contract ShoyuBashi is IShoyuBashi, ShuSo { } /// @inheritdoc IShoyuBashi - function enableOracleAdapters(uint256 domain, IOracleAdapter[] memory _adapters) public { - _enableOracleAdapters(domain, _adapters); + function enableAdapters(uint256 domain, IAdapter[] memory _adapters) public { + _enableAdapters(domain, _adapters); } /// @inheritdoc IShoyuBashi - function disableOracleAdapters(uint256 domain, IOracleAdapter[] memory _adapters) public { - _disableOracleAdapters(domain, _adapters); + function disableAdapters(uint256 domain, IAdapter[] memory _adapters) public { + _disableAdapters(domain, _adapters); } /// @inheritdoc IShoyuBashi @@ -39,7 +39,7 @@ contract ShoyuBashi is IShoyuBashi, ShuSo { } /// @inheritdoc IShoyuBashi - function getHash(uint256 domain, uint256 id, IOracleAdapter[] memory _adapters) public view returns (bytes32) { + function getHash(uint256 domain, uint256 id, IAdapter[] memory _adapters) public view returns (bytes32) { return _getHash(domain, id, _adapters); } } diff --git a/packages/evm/contracts/ownable/ShuSo.sol b/packages/evm/contracts/ownable/ShuSo.sol index 5021669e..778482e8 100644 --- a/packages/evm/contracts/ownable/ShuSo.sol +++ b/packages/evm/contracts/ownable/ShuSo.sol @@ -2,16 +2,16 @@ pragma solidity ^0.8.20; import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; -import { IOracleAdapter } from "../interfaces/IOracleAdapter.sol"; +import { IAdapter } from "../interfaces/IAdapter.sol"; import { IHashi } from "../interfaces/IHashi.sol"; import { Domain } from "../interfaces/IDomain.sol"; import { IShuSho } from "../interfaces/IShuSho.sol"; abstract contract ShuSo is IShuSho, OwnableUpgradeable { - IOracleAdapter internal constant LIST_END = IOracleAdapter(address(0x1)); + IAdapter internal constant LIST_END = IAdapter(address(0x1)); IHashi public hashi; - mapping(uint256 => mapping(IOracleAdapter => Link)) public adapters; + mapping(uint256 => mapping(IAdapter => Link)) public adapters; mapping(uint256 => Domain) public domains; constructor(address _owner, address _hashi) { @@ -55,64 +55,64 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { /** * @dev Enables the given adapters for a given domain. - * @param domain - Uint256 identifier for the domain for which to set oracle adapters. - * @param _adapters - Array of oracleAdapter addresses. + * @param domain - Uint256 identifier for the domain for which to set adapters. + * @param _adapters - Array of adapter addresses. * @notice Reverts if _adapters are out of order or contain duplicates. * @notice Only callable by the owner of this contract. */ - function _enableOracleAdapters(uint256 domain, IOracleAdapter[] memory _adapters) internal onlyOwner { - if (adapters[domain][LIST_END].next == IOracleAdapter(address(0))) { + function _enableAdapters(uint256 domain, IAdapter[] memory _adapters) internal onlyOwner { + if (adapters[domain][LIST_END].next == IAdapter(address(0))) { adapters[domain][LIST_END].next = LIST_END; adapters[domain][LIST_END].previous = LIST_END; } if (_adapters.length == 0) revert NoAdaptersGiven(); for (uint256 i = 0; i < _adapters.length; i++) { - IOracleAdapter adapter = _adapters[i]; - if (adapter == IOracleAdapter(address(0)) || adapter == LIST_END) revert InvalidAdapter(adapter); - if (adapters[domain][adapter].next != IOracleAdapter(address(0))) revert AdapterAlreadyEnabled(adapter); - IOracleAdapter previous = adapters[domain][LIST_END].previous; + IAdapter adapter = _adapters[i]; + if (adapter == IAdapter(address(0)) || adapter == LIST_END) revert InvalidAdapter(adapter); + if (adapters[domain][adapter].next != IAdapter(address(0))) revert AdapterAlreadyEnabled(adapter); + IAdapter previous = adapters[domain][LIST_END].previous; adapters[domain][previous].next = adapter; adapters[domain][adapter].previous = previous; adapters[domain][LIST_END].previous = adapter; adapters[domain][adapter].next = LIST_END; domains[domain].count++; } - emit OracleAdaptersEnabled(domain, _adapters); + emit AdaptersEnabled(domain, _adapters); } /** * @dev Disables the given adapters for a given domain. - * @param domain - Uint256 identifier for the domain for which to set oracle adapters. - * @param _adapters - Array of oracleAdapter addresses. + * @param domain - Uint256 identifier for the domain for which to set adapters. + * @param _adapters - Array of adapter addresses. * @notice Reverts if _adapters are out of order or contain duplicates. * @notice Only callable by the owner of this contract. */ - function _disableOracleAdapters(uint256 domain, IOracleAdapter[] memory _adapters) internal onlyOwner { + function _disableAdapters(uint256 domain, IAdapter[] memory _adapters) internal onlyOwner { if (domains[domain].count == 0) revert NoAdaptersEnabled(domain); if (_adapters.length == 0) revert NoAdaptersGiven(); for (uint256 i = 0; i < _adapters.length; i++) { - IOracleAdapter adapter = _adapters[i]; - if (adapter == IOracleAdapter(address(0)) || adapter == LIST_END) revert InvalidAdapter(adapter); + IAdapter adapter = _adapters[i]; + if (adapter == IAdapter(address(0)) || adapter == LIST_END) revert InvalidAdapter(adapter); Link memory current = adapters[domain][adapter]; - if (current.next == IOracleAdapter(address(0))) revert AdapterNotEnabled(adapter); - IOracleAdapter next = current.next; - IOracleAdapter previous = current.previous; + if (current.next == IAdapter(address(0))) revert AdapterNotEnabled(adapter); + IAdapter next = current.next; + IAdapter previous = current.previous; adapters[domain][next].previous = previous; adapters[domain][previous].next = next; delete adapters[domain][adapter].next; delete adapters[domain][adapter].previous; domains[domain].count--; } - emit OracleAdaptersDisabled(domain, _adapters); + emit AdaptersDisabled(domain, _adapters); } /** - * @dev Returns an array of enabled oracle adapters for a given domain. - * @param domain - Uint256 identifier for the domain for which to list oracle adapters. + * @dev Returns an array of enabled adapters for a given domain. + * @param domain - Uint256 identifier for the domain for which to list adapters. */ - function getOracleAdapters(uint256 domain) public view returns (IOracleAdapter[] memory) { - IOracleAdapter[] memory _adapters = new IOracleAdapter[](domains[domain].count); - IOracleAdapter currentAdapter = adapters[domain][LIST_END].next; + function getAdapters(uint256 domain) public view returns (IAdapter[] memory) { + IAdapter[] memory _adapters = new IAdapter[](domains[domain].count); + IAdapter currentAdapter = adapters[domain][LIST_END].next; for (uint256 i = 0; i < _adapters.length; i++) { _adapters[i] = currentAdapter; currentAdapter = adapters[domain][currentAdapter].next; @@ -123,9 +123,9 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { /** * @dev Returns the threshold and count for a given domain. * @param domain - Uint256 identifier for the domain. - * @return threshold - Uint256 oracle threshold for the given domain. - * @return count - Uint256 oracle count for the given domain. - * @notice If the threshold for a domain has not been set, or is explicitly set to 0, this function will return a threshold equal to the oracle count for the given domain. + * @return threshold - Uint256 adapters threshold for the given domain. + * @return count - Uint256 adapters count for the given domain. + * @notice If the threshold for a domain has not been set, or is explicitly set to 0, this function will return a threshold equal to the adapters count for the given domain. */ function getThresholdAndCount(uint256 domain) public view returns (uint256 threshold, uint256 count) { threshold = domains[domain].threshold; @@ -134,25 +134,25 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { } /// @inheritdoc IShuSho - function checkAdapterOrderAndValidity(uint256 domain, IOracleAdapter[] memory _adapters) public view { + function checkAdapterOrderAndValidity(uint256 domain, IAdapter[] memory _adapters) public view { for (uint256 i = 0; i < _adapters.length; i++) { - IOracleAdapter adapter = _adapters[i]; + IAdapter adapter = _adapters[i]; if (i > 0 && adapter <= _adapters[i - 1]) revert DuplicateOrOutOfOrderAdapters(adapter, _adapters[i - 1]); - if (adapters[domain][adapter].next == IOracleAdapter(address(0))) revert InvalidAdapter(adapter); + if (adapters[domain][adapter].next == IAdapter(address(0))) revert InvalidAdapter(adapter); } } /** - * @dev Returns the hash unanimously agreed upon by ALL of the enabled oraclesAdapters. + * @dev Returns the hash unanimously agreed upon by ALL of the enabled adapters. * @param domain - Uint256 identifier for the domain to query. * @param id - Uint256 identifier to query. - * @return hash - Bytes32 hash agreed upon by the oracles for the given domain. - * @notice Reverts if oracles disagree. - * @notice Reverts if oracles have not yet reported the hash for the given ID. - * @notice Reverts if no oracles are set for the given domain. + * @return hash - Bytes32 hash agreed upon by the adapters for the given domain. + * @notice Reverts if adapters disagree. + * @notice Revert if the adapters do not yet have the hash for the given ID. + * @notice Reverts if no adapters are set for the given domain. */ function _getUnanimousHash(uint256 domain, uint256 id) internal view returns (bytes32 hash) { - IOracleAdapter[] memory _adapters = getOracleAdapters(domain); + IAdapter[] memory _adapters = getAdapters(domain); (uint256 threshold, uint256 count) = getThresholdAndCount(domain); if (count == 0) revert NoAdaptersEnabled(domain); if (_adapters.length < threshold) revert ThresholdNotMet(); @@ -160,16 +160,16 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { } /** - * @dev Returns the hash agreed upon by a threshold of the enabled oraclesAdapters. + * @dev Returns the hash agreed upon by a threshold of the enabled adapters. * @param domain - Uint256 identifier for the domain to query. * @param id - Uint256 identifier to query. - * @return hash - Bytes32 hash agreed upon by a threshold of the oracles for the given domain. + * @return hash - Bytes32 hash agreed upon by a threshold of the adapters for the given domain. * @notice If the threshold is set to 1, the function will return the hash of the first adapter in the list. * @notice Reverts if no threshold is not reached. - * @notice Reverts if no oracles are set for the given domain. + * @notice Reverts if no adapters are set for the given domain. */ function _getThresholdHash(uint256 domain, uint256 id) internal view returns (bytes32 hash) { - IOracleAdapter[] memory _adapters = getOracleAdapters(domain); + IAdapter[] memory _adapters = getAdapters(domain); (uint256 threshold, uint256 count) = getThresholdAndCount(domain); if (count == 0) revert NoAdaptersEnabled(domain); if (_adapters.length < threshold) revert ThresholdNotMet(); @@ -177,12 +177,12 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { // get hashes bytes32[] memory hashes = new bytes32[](_adapters.length); for (uint i = 0; i < _adapters.length; i++) { - try _adapters[i].getHashFromOracle(domain, id) returns (bytes32 currentHash) { + try _adapters[i].getHash(domain, id) returns (bytes32 currentHash) { hashes[i] = currentHash; } catch {} // solhint-disable no-empty-blocks } - // find a hash agreed on by a threshold of oracles + // find a hash agreed on by a threshold of adapters for (uint i = 0; i < hashes.length; i++) { bytes32 baseHash = hashes[i]; if (baseHash == bytes32(0)) continue; @@ -200,22 +200,18 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { } /** - * @dev Returns the hash unanimously agreed upon by all of the given oraclesAdapters. + * @dev Returns the hash unanimously agreed upon by all of the given adapters. * @param domain - Uint256 identifier for the domain to query. * @param id - Uint256 identifier to query. - * @param _adapters - Array of oracle adapter addresses to query. - * @return hash - Bytes32 hash agreed upon by the oracles for the given domain. + * @param _adapters - Array of adapter addresses to query. + * @return hash - Bytes32 hash agreed upon by the adapters for the given domain. * @notice _adapters must be in numerical order from smallest to largest and contain no duplicates. * @notice Reverts if _adapters are out of order or contain duplicates. - * @notice Reverts if oracles disagree. - * @notice Reverts if oracles have not yet reported the hash for the given ID. - * @notice Reverts if no oracles are set for the given domain. + * @notice Reverts if adapters disagree. + * @notice Revert if the adapters do not yet have the hash for the given ID. + * @notice Reverts if no adapters are set for the given domain. */ - function _getHash( - uint256 domain, - uint256 id, - IOracleAdapter[] memory _adapters - ) internal view returns (bytes32 hash) { + function _getHash(uint256 domain, uint256 id, IAdapter[] memory _adapters) internal view returns (bytes32 hash) { (uint256 threshold, uint256 count) = getThresholdAndCount(domain); if (_adapters.length == 0) revert NoAdaptersGiven(); if (count == 0) revert NoAdaptersEnabled(domain); diff --git a/packages/evm/contracts/test/MockOracleAdapter.sol b/packages/evm/contracts/test/MockAdapter.sol similarity index 64% rename from packages/evm/contracts/test/MockOracleAdapter.sol rename to packages/evm/contracts/test/MockAdapter.sol index c91d1aba..8e318dac 100644 --- a/packages/evm/contracts/test/MockOracleAdapter.sol +++ b/packages/evm/contracts/test/MockAdapter.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.20; -import { OracleAdapter } from "../adapters/OracleAdapter.sol"; -import { BlockHashOracleAdapter } from "../adapters/BlockHashOracleAdapter.sol"; +import { Adapter } from "../adapters/Adapter.sol"; +import { BlockHashAdapter } from "../adapters/BlockHashAdapter.sol"; -contract MockOracleAdapter is OracleAdapter, BlockHashOracleAdapter { +contract MockAdapter is Adapter, BlockHashAdapter { error LengthMismatch(); function setHashes(uint256 domain, uint256[] memory ids, bytes32[] memory hashes) external { diff --git a/packages/evm/contracts/test/MockReporter.sol b/packages/evm/contracts/test/MockReporter.sol index 84525ca9..275d4d3f 100644 --- a/packages/evm/contracts/test/MockReporter.sol +++ b/packages/evm/contracts/test/MockReporter.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.20; import { Reporter } from "../adapters/Reporter.sol"; -import { IOracleAdapter } from "../interfaces/IOracleAdapter.sol"; +import { IAdapter } from "../interfaces/IAdapter.sol"; contract MockReporter is Reporter { constructor(address headerStorage, address yaho) Reporter(headerStorage, yaho) {} diff --git a/packages/evm/test/01_Hashi.spec.ts b/packages/evm/test/01_Hashi.spec.ts index 8915501b..2f2101eb 100644 --- a/packages/evm/test/01_Hashi.spec.ts +++ b/packages/evm/test/01_Hashi.spec.ts @@ -10,21 +10,21 @@ const setup = async () => { const [wallet] = await ethers.getSigners() const Hashi = await ethers.getContractFactory("Hashi") const hashi = await Hashi.deploy() - const MockOracleAdapter = await ethers.getContractFactory("MockOracleAdapter") - const mockOracleAdapter = await MockOracleAdapter.deploy() - const badMockOracleAdapter = await MockOracleAdapter.deploy() - const nonReportingMockOracleAdapter = await MockOracleAdapter.deploy() + const MockAdapter = await ethers.getContractFactory("MockAdapter") + const mockAdapter = await MockAdapter.deploy() + const badMockAdapter = await MockAdapter.deploy() + const nonReportingMockAdapter = await MockAdapter.deploy() - await mockOracleAdapter.setHashes(DOMAIN_ID, [0, 1], [HASH_ZERO, HASH_GOOD]) - await badMockOracleAdapter.setHashes(DOMAIN_ID, [0, 1], [HASH_BAD, HASH_BAD]) - await nonReportingMockOracleAdapter.setHashes(DOMAIN_ID, [0, 1], [HASH_ZERO, HASH_ZERO]) + await mockAdapter.setHashes(DOMAIN_ID, [0, 1], [HASH_ZERO, HASH_GOOD]) + await badMockAdapter.setHashes(DOMAIN_ID, [0, 1], [HASH_BAD, HASH_BAD]) + await nonReportingMockAdapter.setHashes(DOMAIN_ID, [0, 1], [HASH_ZERO, HASH_ZERO]) return { wallet, hashi, - mockOracleAdapter, - badMockOracleAdapter, - nonReportingMockOracleAdapter, + mockAdapter, + badMockAdapter, + nonReportingMockAdapter, } } @@ -36,128 +36,112 @@ describe("Hashi", function () { }) }) - describe("getHashFromOracle()", function () { + describe("getHashFromAdapter()", function () { it("Returns correct hash", async function () { - const { hashi, mockOracleAdapter } = await setup() - expect(await hashi.getHashFromOracle(DOMAIN_ID, 0, mockOracleAdapter.address)).to.equal(HASH_ZERO) - expect(await hashi.getHashFromOracle(DOMAIN_ID, 1, mockOracleAdapter.address)).to.equal(HASH_GOOD) + const { hashi, mockAdapter } = await setup() + expect(await hashi.getHashFromAdapter(DOMAIN_ID, 0, mockAdapter.address)).to.equal(HASH_ZERO) + expect(await hashi.getHashFromAdapter(DOMAIN_ID, 1, mockAdapter.address)).to.equal(HASH_GOOD) }) }) - describe("getHashesFromOracles()", function () { - it("Reverts if oracleAdapters length is zero", async function () { + describe("getHashesFromAdapters()", function () { + it("Reverts if adapters length is zero", async function () { const { hashi } = await setup() - await expect(hashi.getHashesFromOracles(DOMAIN_ID, 1, [])).to.revertedWithCustomError( - hashi, - "NoOracleAdaptersGiven", - ) + await expect(hashi.getHashesFromAdapters(DOMAIN_ID, 1, [])).to.revertedWithCustomError(hashi, "NoAdaptersGiven") }) - it("Returns correct hashs from each oracle", async function () { - const { hashi, mockOracleAdapter, badMockOracleAdapter } = await setup() - const oracles = [mockOracleAdapter.address, badMockOracleAdapter.address] - const returnData = await hashi.getHashesFromOracles(DOMAIN_ID, 1, oracles) + it("Returns correct hashs from each adapter", async function () { + const { hashi, mockAdapter, badMockAdapter } = await setup() + const adapters = [mockAdapter.address, badMockAdapter.address] + const returnData = await hashi.getHashesFromAdapters(DOMAIN_ID, 1, adapters) expect(returnData[0]).to.equal(HASH_GOOD) expect(returnData[1]).to.equal(HASH_BAD) }) - it("Returns Bytes(0) for non-reporting oracles", async function () { - const { hashi, mockOracleAdapter, nonReportingMockOracleAdapter } = await setup() - const oracles = [mockOracleAdapter.address, nonReportingMockOracleAdapter.address] - const returnData = await hashi.getHashesFromOracles(DOMAIN_ID, 1, oracles) + it("Returns Bytes(0) for non-reporting adapters", async function () { + const { hashi, mockAdapter, nonReportingMockAdapter } = await setup() + const adapters = [mockAdapter.address, nonReportingMockAdapter.address] + const returnData = await hashi.getHashesFromAdapters(DOMAIN_ID, 1, adapters) expect(returnData[0]).to.equal(HASH_GOOD) expect(returnData[1]).to.equal(HASH_ZERO) }) }) describe("getHash()", function () { - it("Reverts if oracleAdapters length is zero", async function () { + it("Reverts if adapters length is zero", async function () { const { hashi } = await setup() - await expect(hashi.getHash(DOMAIN_ID, 1, [])).to.revertedWithCustomError(hashi, "NoOracleAdaptersGiven") + await expect(hashi.getHash(DOMAIN_ID, 1, [])).to.revertedWithCustomError(hashi, "NoAdaptersGiven") }) - it("Reverts if one of oracleAdapters is non-reporting", async function () { - const { hashi, mockOracleAdapter, nonReportingMockOracleAdapter } = await setup() - await expect(hashi.getHash(DOMAIN_ID, 1, [nonReportingMockOracleAdapter.address])).to.revertedWithCustomError( + it("Reverts if one of adapters is non-reporting", async function () { + const { hashi, mockAdapter, nonReportingMockAdapter } = await setup() + await expect(hashi.getHash(DOMAIN_ID, 1, [nonReportingMockAdapter.address])).to.revertedWithCustomError( hashi, - "OracleDidNotReport", + "HashNotAvailableInAdapter", ) await expect( - hashi.getHash(DOMAIN_ID, 1, [mockOracleAdapter.address, nonReportingMockOracleAdapter.address]), - ).to.revertedWithCustomError(hashi, "OracleDidNotReport") + hashi.getHash(DOMAIN_ID, 1, [mockAdapter.address, nonReportingMockAdapter.address]), + ).to.revertedWithCustomError(hashi, "HashNotAvailableInAdapter") }) - it("Reverts if oracleAdapters disagree", async function () { - const { hashi, mockOracleAdapter, badMockOracleAdapter } = await setup() + it("Reverts if adapters disagree", async function () { + const { hashi, mockAdapter, badMockAdapter } = await setup() await expect( - hashi.getHash(DOMAIN_ID, 1, [mockOracleAdapter.address, badMockOracleAdapter.address]), - ).to.revertedWithCustomError(hashi, "OraclesDisagree") + hashi.getHash(DOMAIN_ID, 1, [mockAdapter.address, badMockAdapter.address]), + ).to.revertedWithCustomError(hashi, "AdaptersDisagree") }) it("Returns unanimously agreed on hash", async function () { - const { hashi, mockOracleAdapter } = await setup() + const { hashi, mockAdapter } = await setup() expect( - await hashi.getHash(DOMAIN_ID, 1, [ - mockOracleAdapter.address, - mockOracleAdapter.address, - mockOracleAdapter.address, - ]), + await hashi.getHash(DOMAIN_ID, 1, [mockAdapter.address, mockAdapter.address, mockAdapter.address]), ).to.equal(HASH_GOOD) }) - it("Returns hash for single oracle", async function () { - const { hashi, mockOracleAdapter } = await setup() - expect(await hashi.getHash(DOMAIN_ID, 1, [mockOracleAdapter.address])).to.equal(HASH_GOOD) + it("Returns hash for single adapter", async function () { + const { hashi, mockAdapter } = await setup() + expect(await hashi.getHash(DOMAIN_ID, 1, [mockAdapter.address])).to.equal(HASH_GOOD) }) }) - describe("checkHashWithThresholdFromOracles()", function () { + describe("checkHashWithThresholdFromAdapters()", function () { it("should return false if the threshold is not reached", async () => { - const { hashi, mockOracleAdapter, badMockOracleAdapter, nonReportingMockOracleAdapter } = await setup() + const { hashi, mockAdapter, badMockAdapter, nonReportingMockAdapter } = await setup() const id = 3 const threshold = 3 - const oracles = [mockOracleAdapter, badMockOracleAdapter, nonReportingMockOracleAdapter].map( - ({ address }) => address, - ) - await mockOracleAdapter.setHashes(DOMAIN_ID, [id], [HASH_GOOD]) - expect(await hashi.checkHashWithThresholdFromOracles(DOMAIN_ID, id, threshold, oracles)).to.be.eq(false) + const adapters = [mockAdapter, badMockAdapter, nonReportingMockAdapter].map(({ address }) => address) + await mockAdapter.setHashes(DOMAIN_ID, [id], [HASH_GOOD]) + expect(await hashi.checkHashWithThresholdFromAdapters(DOMAIN_ID, id, threshold, adapters)).to.be.eq(false) }) it("should return true if the threshold is reached", async () => { - const { hashi, mockOracleAdapter, badMockOracleAdapter, nonReportingMockOracleAdapter } = await setup() + const { hashi, mockAdapter, badMockAdapter, nonReportingMockAdapter } = await setup() const id = 3 const threshold = 3 - const oracles = [mockOracleAdapter, badMockOracleAdapter, nonReportingMockOracleAdapter].map( - ({ address }) => address, - ) - await mockOracleAdapter.setHashes(DOMAIN_ID, [id], [HASH_GOOD]) - await badMockOracleAdapter.setHashes(DOMAIN_ID, [id], [HASH_GOOD]) - await nonReportingMockOracleAdapter.setHashes(DOMAIN_ID, [id], [HASH_GOOD]) - expect(await hashi.checkHashWithThresholdFromOracles(DOMAIN_ID, id, threshold, oracles)).to.be.eq(true) + const adapters = [mockAdapter, badMockAdapter, nonReportingMockAdapter].map(({ address }) => address) + await mockAdapter.setHashes(DOMAIN_ID, [id], [HASH_GOOD]) + await badMockAdapter.setHashes(DOMAIN_ID, [id], [HASH_GOOD]) + await nonReportingMockAdapter.setHashes(DOMAIN_ID, [id], [HASH_GOOD]) + expect(await hashi.checkHashWithThresholdFromAdapters(DOMAIN_ID, id, threshold, adapters)).to.be.eq(true) }) - it("should revert if the threshold > oracle adapters", async () => { - const { hashi, mockOracleAdapter, badMockOracleAdapter, nonReportingMockOracleAdapter } = await setup() + it("should revert if the threshold > adapters", async () => { + const { hashi, mockAdapter, badMockAdapter, nonReportingMockAdapter } = await setup() const id = 3 const threshold = 4 - const oracles = [mockOracleAdapter, badMockOracleAdapter, nonReportingMockOracleAdapter].map( - ({ address }) => address, - ) - await expect(hashi.checkHashWithThresholdFromOracles(DOMAIN_ID, id, threshold, oracles)) + const adapters = [mockAdapter, badMockAdapter, nonReportingMockAdapter].map(({ address }) => address) + await expect(hashi.checkHashWithThresholdFromAdapters(DOMAIN_ID, id, threshold, adapters)) .to.be.revertedWithCustomError(hashi, "InvalidThreshold") - .withArgs(threshold, oracles.length) + .withArgs(threshold, adapters.length) }) it("should revert false if the threshold is 0", async () => { - const { hashi, mockOracleAdapter, badMockOracleAdapter, nonReportingMockOracleAdapter } = await setup() + const { hashi, mockAdapter, badMockAdapter, nonReportingMockAdapter } = await setup() const id = 3 const threshold = 0 - const oracles = [mockOracleAdapter, badMockOracleAdapter, nonReportingMockOracleAdapter].map( - ({ address }) => address, - ) - await expect(hashi.checkHashWithThresholdFromOracles(DOMAIN_ID, id, threshold, oracles)) + const adapters = [mockAdapter, badMockAdapter, nonReportingMockAdapter].map(({ address }) => address) + await expect(hashi.checkHashWithThresholdFromAdapters(DOMAIN_ID, id, threshold, adapters)) .to.be.revertedWithCustomError(hashi, "InvalidThreshold") - .withArgs(threshold, oracles.length) + .withArgs(threshold, adapters.length) }) - it("should revert false if we don't provide any oracle adapter", async () => { + it("should revert false if we don't provide any adapter", async () => { const { hashi } = await setup() const id = 3 const threshold = 3 - await expect(hashi.checkHashWithThresholdFromOracles(DOMAIN_ID, id, threshold, [])).to.be.revertedWithCustomError( - hashi, - "NoOracleAdaptersGiven", - ) + await expect( + hashi.checkHashWithThresholdFromAdapters(DOMAIN_ID, id, threshold, []), + ).to.be.revertedWithCustomError(hashi, "NoAdaptersGiven") }) }) }) diff --git a/packages/evm/test/02_ShoyuBashi.spec.ts b/packages/evm/test/02_ShoyuBashi.spec.ts index 0185ad0a..af46d28f 100644 --- a/packages/evm/test/02_ShoyuBashi.spec.ts +++ b/packages/evm/test/02_ShoyuBashi.spec.ts @@ -16,12 +16,12 @@ const setup = async () => { const hashi = await Hashi.deploy() const ShoyuBashi = await ethers.getContractFactory("ShoyuBashi") const shoyuBashi = await ShoyuBashi.deploy(wallet.address, hashi.address) - const MockOracleAdapter = await ethers.getContractFactory("MockOracleAdapter") - const mockOracleAdapter = await MockOracleAdapter.deploy() - const anotherOracleAdapter = await MockOracleAdapter.deploy() + const MockAdapter = await ethers.getContractFactory("MockAdapter") + const mockAdapter = await MockAdapter.deploy() + const anotherAdapter = await MockAdapter.deploy() - await mockOracleAdapter.setHashes(DOMAIN_ID, [0, 1, 2], [HASH_ZERO, HASH_GOOD, HASH_GOOD]) - await anotherOracleAdapter.setHashes(DOMAIN_ID, [0, 1, 2], [HASH_ZERO, HASH_GOOD, HASH_BAD]) + await mockAdapter.setHashes(DOMAIN_ID, [0, 1, 2], [HASH_ZERO, HASH_GOOD, HASH_GOOD]) + await anotherAdapter.setHashes(DOMAIN_ID, [0, 1, 2], [HASH_ZERO, HASH_GOOD, HASH_BAD]) await shoyuBashi.setThreshold(DOMAIN_ID, 2) return { @@ -29,8 +29,8 @@ const setup = async () => { hashi, ShoyuBashi, shoyuBashi, - mockOracleAdapter, - anotherOracleAdapter, + mockAdapter, + anotherAdapter, } } @@ -97,47 +97,47 @@ describe("ShoyuBashi", function () { }) }) - describe("enableOracleAdapters()", function () { + describe("enableAdapters()", function () { it("Reverts if called by non-owner account", async function () { const { shoyuBashi } = await setup() await shoyuBashi.transferOwnership(shoyuBashi.address) - await expect(shoyuBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO])).to.be.revertedWith( + await expect(shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO])).to.be.revertedWith( "Ownable: caller is not the owner", ) }) it("Reverts if given an empty array", async function () { const { shoyuBashi } = await setup() - await expect(shoyuBashi.enableOracleAdapters(DOMAIN_ID, [])).to.be.revertedWithCustomError( + await expect(shoyuBashi.enableAdapters(DOMAIN_ID, [])).to.be.revertedWithCustomError( shoyuBashi, "NoAdaptersGiven", ) }) - it("Reverts if given oracle adapter is Address(0)", async function () { + it("Reverts if given adapter is Address(0)", async function () { const { shoyuBashi } = await setup() - await expect(shoyuBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_ZERO])).to.be.revertedWithCustomError( + await expect(shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_ZERO])).to.be.revertedWithCustomError( shoyuBashi, "InvalidAdapter", ) }) - it("Reverts if given oracle adapter is Address(1) / LIST_END", async function () { + it("Reverts if given adapter is Address(1) / LIST_END", async function () { const { shoyuBashi } = await setup() - await expect(shoyuBashi.enableOracleAdapters(DOMAIN_ID, [LIST_END])).to.be.revertedWithCustomError( + await expect(shoyuBashi.enableAdapters(DOMAIN_ID, [LIST_END])).to.be.revertedWithCustomError( shoyuBashi, "InvalidAdapter", ) }) it("Reverts if adapter is already enabled", async function () { const { shoyuBashi } = await setup() - await expect(shoyuBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO])) - await expect(shoyuBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO])).to.be.revertedWithCustomError( + await expect(shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO])) + await expect(shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO])).to.be.revertedWithCustomError( shoyuBashi, "AdapterAlreadyEnabled", ) }) - it("Enables the given oracles", async function () { + it("Enables the given adapters", async function () { const { shoyuBashi } = await setup() - await expect(shoyuBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE])) - const adapters = await shoyuBashi.getOracleAdapters(DOMAIN_ID) + await expect(shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE])) + const adapters = await shoyuBashi.getAdapters(DOMAIN_ID) await expect(adapters[0]).to.equal(ADDRESS_TWO) await expect(adapters[1]).to.equal(ADDRESS_THREE) expect((await shoyuBashi.adapters(DOMAIN_ID, LIST_END)).next).to.equal(ADDRESS_TWO) @@ -147,89 +147,90 @@ describe("ShoyuBashi", function () { expect((await shoyuBashi.adapters(DOMAIN_ID, ADDRESS_THREE)).next).to.equal(LIST_END) expect((await shoyuBashi.adapters(DOMAIN_ID, ADDRESS_THREE)).previous).to.equal(ADDRESS_TWO) }) - it("Emits OracleAdaptersEnabled() event", async function () { + it("Emits AdaptersEnabled() event", async function () { const { shoyuBashi } = await setup() - await expect(shoyuBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE])) - .to.emit(shoyuBashi, "OracleAdaptersEnabled") + await expect(shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE])) + .to.emit(shoyuBashi, "AdaptersEnabled") .withArgs(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) }) }) - describe("disableOracleAdapters()", function () { + describe("disableAdapters()", function () { it("Reverts if called by non-owner account", async function () { const { shoyuBashi } = await setup() await shoyuBashi.transferOwnership(shoyuBashi.address) - await expect(shoyuBashi.disableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO])).to.be.revertedWith( + await expect(shoyuBashi.disableAdapters(DOMAIN_ID, [ADDRESS_TWO])).to.be.revertedWith( "Ownable: caller is not the owner", ) }) it("Reverts if no adapters are enabled", async function () { const { shoyuBashi } = await setup() - await expect(shoyuBashi.disableOracleAdapters(DOMAIN_ID, [])).to.be.revertedWithCustomError( + await expect(shoyuBashi.disableAdapters(DOMAIN_ID, [])).to.be.revertedWithCustomError( shoyuBashi, "NoAdaptersEnabled", ) }) it("Reverts if given an empty array", async function () { const { shoyuBashi } = await setup() - await shoyuBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO]) - await expect(shoyuBashi.disableOracleAdapters(DOMAIN_ID, [])).to.be.revertedWithCustomError( + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO]) + await expect(shoyuBashi.disableAdapters(DOMAIN_ID, [])).to.be.revertedWithCustomError( shoyuBashi, "NoAdaptersGiven", ) }) - it("Reverts if given oracle adapter is Address(0)", async function () { + it("Reverts if given adapter is Address(0)", async function () { const { shoyuBashi } = await setup() - await shoyuBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO]) - await expect(shoyuBashi.disableOracleAdapters(DOMAIN_ID, [ADDRESS_ZERO])).to.be.revertedWithCustomError( + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO]) + await expect(shoyuBashi.disableAdapters(DOMAIN_ID, [ADDRESS_ZERO])).to.be.revertedWithCustomError( shoyuBashi, "InvalidAdapter", ) }) - it("Reverts if given oracle adapter is Address(1) / LIST_END", async function () { + it("Reverts if given adapter is Address(1) / LIST_END", async function () { const { shoyuBashi } = await setup() - await shoyuBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO]) - await expect(shoyuBashi.disableOracleAdapters(DOMAIN_ID, [LIST_END])).to.be.revertedWithCustomError( + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO]) + await expect(shoyuBashi.disableAdapters(DOMAIN_ID, [LIST_END])).to.be.revertedWithCustomError( shoyuBashi, "InvalidAdapter", ) }) it("Reverts if adapter is not enabled", async function () { const { shoyuBashi } = await setup() - await shoyuBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO]) - await expect( - shoyuBashi.disableOracleAdapters(DOMAIN_ID, [ADDRESS_THREE, ADDRESS_TWO]), - ).to.be.revertedWithCustomError(shoyuBashi, "AdapterNotEnabled") + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO]) + await expect(shoyuBashi.disableAdapters(DOMAIN_ID, [ADDRESS_THREE, ADDRESS_TWO])).to.be.revertedWithCustomError( + shoyuBashi, + "AdapterNotEnabled", + ) }) - it("Disables the given oracles", async function () { + it("Disables the given adapters", async function () { const { shoyuBashi } = await setup() - await shoyuBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) - await shoyuBashi.disableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) - const adapters = await shoyuBashi.getOracleAdapters(DOMAIN_ID) + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) + await shoyuBashi.disableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) + const adapters = await shoyuBashi.getAdapters(DOMAIN_ID) await expect(adapters[0]).to.equal(undefined) }) - it("Emits OracleAdaptersDisabled() event", async function () { + it("Emits AdaptersDisabled() event", async function () { const { shoyuBashi } = await setup() - await shoyuBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) - await expect(shoyuBashi.disableOracleAdapters(DOMAIN_ID, [ADDRESS_THREE, ADDRESS_TWO])) - .to.emit(shoyuBashi, "OracleAdaptersDisabled") + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) + await expect(shoyuBashi.disableAdapters(DOMAIN_ID, [ADDRESS_THREE, ADDRESS_TWO])) + .to.emit(shoyuBashi, "AdaptersDisabled") .withArgs(DOMAIN_ID, [ADDRESS_THREE, ADDRESS_TWO]) }) }) - describe("getOracleAdapters()", function () { + describe("getAdapters()", function () { it("Returns empty array if no adapters are enabled", async function () { const { shoyuBashi } = await setup() - const adapters = await shoyuBashi.getOracleAdapters(DOMAIN_ID) + const adapters = await shoyuBashi.getAdapters(DOMAIN_ID) expect(adapters[0]).to.equal(undefined) - await shoyuBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) - await expect(shoyuBashi.disableOracleAdapters(DOMAIN_ID, [ADDRESS_THREE, ADDRESS_TWO])) + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) + await expect(shoyuBashi.disableAdapters(DOMAIN_ID, [ADDRESS_THREE, ADDRESS_TWO])) expect(adapters[0]).to.equal(undefined) }) it("Returns array of enabled adapters", async function () { const { shoyuBashi } = await setup() - await shoyuBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) - const adapters = await shoyuBashi.getOracleAdapters(DOMAIN_ID) + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) + const adapters = await shoyuBashi.getAdapters(DOMAIN_ID) expect(adapters[0]).to.equal(ADDRESS_TWO) expect(adapters[1]).to.equal(ADDRESS_THREE) }) @@ -238,13 +239,13 @@ describe("ShoyuBashi", function () { describe("getThresholdAndCount()", function () { it("Returns threshold equal to count if threshold not explicitly set", async function () { const { shoyuBashi } = await setup() - await shoyuBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) const [threshold, count] = await shoyuBashi.getThresholdAndCount(DOMAIN_ID) await expect(threshold).to.equal(count) }) it("Returns threshold and count", async function () { const { shoyuBashi } = await setup() - await shoyuBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) await shoyuBashi.setThreshold(DOMAIN_ID, 1) const [threshold] = await shoyuBashi.getThresholdAndCount(DOMAIN_ID) await expect(threshold).to.equal(1) @@ -260,16 +261,16 @@ describe("ShoyuBashi", function () { ) }) it("Reverts if threshold is not met", async function () { - const { shoyuBashi, mockOracleAdapter } = await setup() - await shoyuBashi.enableOracleAdapters(DOMAIN_ID, [mockOracleAdapter.address]) + const { shoyuBashi, mockAdapter } = await setup() + await shoyuBashi.enableAdapters(DOMAIN_ID, [mockAdapter.address]) await expect(shoyuBashi.getUnanimousHash(DOMAIN_ID, 1)).to.be.revertedWithCustomError( shoyuBashi, "ThresholdNotMet", ) }) it("Returns unanimous agreed on hash", async function () { - const { shoyuBashi, mockOracleAdapter, anotherOracleAdapter } = await setup() - await shoyuBashi.enableOracleAdapters(DOMAIN_ID, [mockOracleAdapter.address, anotherOracleAdapter.address]) + const { shoyuBashi, mockAdapter, anotherAdapter } = await setup() + await shoyuBashi.enableAdapters(DOMAIN_ID, [mockAdapter.address, anotherAdapter.address]) expect(await shoyuBashi.getUnanimousHash(DOMAIN_ID, 1)).to.equal(HASH_GOOD) }) }) @@ -283,81 +284,81 @@ describe("ShoyuBashi", function () { ) }) it("Reverts if threshold is not met", async function () { - const { shoyuBashi, mockOracleAdapter, anotherOracleAdapter } = await setup() - await shoyuBashi.enableOracleAdapters(DOMAIN_ID, [mockOracleAdapter.address, anotherOracleAdapter.address]) + const { shoyuBashi, mockAdapter, anotherAdapter } = await setup() + await shoyuBashi.enableAdapters(DOMAIN_ID, [mockAdapter.address, anotherAdapter.address]) await expect(shoyuBashi.getThresholdHash(DOMAIN_ID, 2)).to.be.revertedWithCustomError( shoyuBashi, "ThresholdNotMet", ) }) it("Reverts if threshold returns bytes(0)", async function () { - const { shoyuBashi, mockOracleAdapter, anotherOracleAdapter } = await setup() - await shoyuBashi.enableOracleAdapters(DOMAIN_ID, [mockOracleAdapter.address, anotherOracleAdapter.address]) + const { shoyuBashi, mockAdapter, anotherAdapter } = await setup() + await shoyuBashi.enableAdapters(DOMAIN_ID, [mockAdapter.address, anotherAdapter.address]) await expect(shoyuBashi.getThresholdHash(DOMAIN_ID, 0)).to.be.revertedWithCustomError( shoyuBashi, "ThresholdNotMet", ) }) it("Returns unanimous agreed on hash", async function () { - const { shoyuBashi, mockOracleAdapter, anotherOracleAdapter } = await setup() - await shoyuBashi.enableOracleAdapters(DOMAIN_ID, [mockOracleAdapter.address, anotherOracleAdapter.address]) + const { shoyuBashi, mockAdapter, anotherAdapter } = await setup() + await shoyuBashi.enableAdapters(DOMAIN_ID, [mockAdapter.address, anotherAdapter.address]) expect(await shoyuBashi.getThresholdHash(DOMAIN_ID, 1)).to.equal(HASH_GOOD) }) }) describe("getHash()", function () { it("Reverts if threshold is not met", async function () { - const { shoyuBashi, mockOracleAdapter } = await setup() - await shoyuBashi.enableOracleAdapters(DOMAIN_ID, [mockOracleAdapter.address]) - await expect(shoyuBashi.getHash(DOMAIN_ID, 1, [mockOracleAdapter.address])).to.be.revertedWithCustomError( + const { shoyuBashi, mockAdapter } = await setup() + await shoyuBashi.enableAdapters(DOMAIN_ID, [mockAdapter.address]) + await expect(shoyuBashi.getHash(DOMAIN_ID, 1, [mockAdapter.address])).to.be.revertedWithCustomError( shoyuBashi, "ThresholdNotMet", ) }) - it("Reverts if given oracle adapters are duplicate", async function () { + it("Reverts if given adapters are duplicate", async function () { const { shoyuBashi } = await setup() - await shoyuBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) await expect(shoyuBashi.getHash(DOMAIN_ID, 1, [ADDRESS_TWO, ADDRESS_TWO])).to.be.revertedWithCustomError( shoyuBashi, "DuplicateOrOutOfOrderAdapters", ) }) - it("Reverts if given oracle adapters are out of order", async function () { + it("Reverts if given adapters are out of order", async function () { const { shoyuBashi } = await setup() - await shoyuBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) await expect(shoyuBashi.getHash(DOMAIN_ID, 1, [ADDRESS_THREE, ADDRESS_TWO])).to.be.revertedWithCustomError( shoyuBashi, "DuplicateOrOutOfOrderAdapters", ) }) - it("Reverts if given oracle adapter is not enabled", async function () { + it("Reverts if given adapter is not enabled", async function () { const { shoyuBashi } = await setup() - await shoyuBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO]) + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO]) await expect(shoyuBashi.getHash(DOMAIN_ID, 1, [ADDRESS_TWO, ADDRESS_THREE])).to.be.revertedWithCustomError( shoyuBashi, "InvalidAdapter", ) }) - it("Reverts if no oracle adapters are enabled", async function () { + it("Reverts if no adapters are enabled", async function () { const { shoyuBashi } = await setup() await expect(shoyuBashi.getHash(DOMAIN_ID, 1, [ADDRESS_TWO, ADDRESS_THREE])).to.be.revertedWithCustomError( shoyuBashi, "NoAdaptersEnabled", ) }) - it("Reverts if no oracle adapters are given", async function () { + it("Reverts if no adapters are given", async function () { const { shoyuBashi } = await setup() - await shoyuBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO]) + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO]) await expect(shoyuBashi.getHash(DOMAIN_ID, 1, [])).to.be.revertedWithCustomError(shoyuBashi, "NoAdaptersGiven") }) it("Returns unanimous agreed on hash", async function () { - const { shoyuBashi, mockOracleAdapter, anotherOracleAdapter } = await setup() - await shoyuBashi.enableOracleAdapters(DOMAIN_ID, [mockOracleAdapter.address, anotherOracleAdapter.address]) + const { shoyuBashi, mockAdapter, anotherAdapter } = await setup() + await shoyuBashi.enableAdapters(DOMAIN_ID, [mockAdapter.address, anotherAdapter.address]) let adapters - if (anotherOracleAdapter.address > mockOracleAdapter.address) { - adapters = [mockOracleAdapter.address, anotherOracleAdapter.address] + if (anotherAdapter.address > mockAdapter.address) { + adapters = [mockAdapter.address, anotherAdapter.address] } else { - adapters = [anotherOracleAdapter.address, mockOracleAdapter.address] + adapters = [anotherAdapter.address, mockAdapter.address] } expect(await shoyuBashi.getHash(DOMAIN_ID, 1, adapters)).to.equal(HASH_GOOD) }) diff --git a/packages/evm/test/03_GiriGiriBashi.spec.ts b/packages/evm/test/03_GiriGiriBashi.spec.ts index c96d77af..7fe37ee2 100644 --- a/packages/evm/test/03_GiriGiriBashi.spec.ts +++ b/packages/evm/test/03_GiriGiriBashi.spec.ts @@ -33,22 +33,18 @@ const setup = async (_configs?: any) => { const hashi = await Hashi.deploy() const GiriGiriBashi = await ethers.getContractFactory("GiriGiriBashi") const giriGiriBashi = await GiriGiriBashi.deploy(wallet.address, hashi.address, ADDRESS_TWO) - const MockOracleAdapter = await ethers.getContractFactory("MockOracleAdapter") - const mockOracleAdapter = await MockOracleAdapter.deploy() - const secondMockOracleAdapter = await MockOracleAdapter.deploy() - const thirdMockOracleAdapter = await MockOracleAdapter.deploy() + const MockAdapter = await ethers.getContractFactory("MockAdapter") + const mockAdapter = await MockAdapter.deploy() + const secondMockAdapter = await MockAdapter.deploy() + const thirdMockAdapter = await MockAdapter.deploy() - await mockOracleAdapter.setHashes( - DOMAIN_ID, - [0, 1, 20, 21, 22], - [HASH_ZERO, HASH_GOOD, HASH_BAD, HASH_GOOD, HASH_BAD], - ) - await secondMockOracleAdapter.setHashes( + await mockAdapter.setHashes(DOMAIN_ID, [0, 1, 20, 21, 22], [HASH_ZERO, HASH_GOOD, HASH_BAD, HASH_GOOD, HASH_BAD]) + await secondMockAdapter.setHashes( DOMAIN_ID, [0, 1, 20, 21, 22], [HASH_ZERO, HASH_GOOD, HASH_GOOD, HASH_GOOD, HASH_GOOD], ) - await thirdMockOracleAdapter.setHashes( + await thirdMockAdapter.setHashes( DOMAIN_ID, [0, 1, 20, 21, 22], [HASH_ZERO, HASH_GOOD, HASH_DEAD, HASH_GOOD, HASH_GOOD], @@ -68,10 +64,10 @@ const setup = async (_configs?: any) => { giriGiriBashi, GiriGiriBashi, hashi, - mockOracleAdapter, - secondMockOracleAdapter, + mockAdapter, + secondMockAdapter, settings, - thirdMockOracleAdapter, + thirdMockAdapter, wallet, } } @@ -113,8 +109,8 @@ describe("GiriGiriBashi", function () { describe("setThreshold()", function () { it("Reverts if count is greater than zero", async function () { - const { giriGiriBashi, mockOracleAdapter, settings } = await setup() - await giriGiriBashi.enableOracleAdapters(DOMAIN_ID, [mockOracleAdapter.address], [settings]) + const { giriGiriBashi, mockAdapter, settings } = await setup() + await giriGiriBashi.enableAdapters(DOMAIN_ID, [mockAdapter.address], [settings]) await expect(giriGiriBashi.setThreshold(DOMAIN_ID, 2)).to.be.revertedWithCustomError( giriGiriBashi, "CountMustBeZero", @@ -133,31 +129,32 @@ describe("GiriGiriBashi", function () { }) }) - describe("enableOracleAdapters()", function () { + describe("enableAdapters()", function () { it("Reverts if called by non-owner account", async function () { const { giriGiriBashi, settings } = await setup() await giriGiriBashi.transferOwnership(giriGiriBashi.address) - await expect(giriGiriBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO], [settings])).to.be.revertedWith( + await expect(giriGiriBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO], [settings])).to.be.revertedWith( "Ownable: caller is not the owner", ) }) it("Reverts if any adapters are already enabled", async function () { const { giriGiriBashi, settings } = await setup() - await expect(giriGiriBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO], [settings])) - await expect( - giriGiriBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO], [settings]), - ).to.be.revertedWithCustomError(giriGiriBashi, "CountMustBeZero") + await expect(giriGiriBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO], [settings])) + await expect(giriGiriBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO], [settings])).to.be.revertedWithCustomError( + giriGiriBashi, + "CountMustBeZero", + ) }) it("Reverts if arrays are unequal lengths", async function () { const { giriGiriBashi, settings } = await setup() await expect( - giriGiriBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO], [settings, settings]), + giriGiriBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO], [settings, settings]), ).to.be.revertedWithCustomError(giriGiriBashi, "UnequalArrayLengths") }) - it("Enables the given oracles", async function () { + it("Enables the given adapters", async function () { const { giriGiriBashi, settings } = await setup() - await expect(giriGiriBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE], [settings, settings])) - const adapters = await giriGiriBashi.getOracleAdapters(DOMAIN_ID) + await expect(giriGiriBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE], [settings, settings])) + const adapters = await giriGiriBashi.getAdapters(DOMAIN_ID) await expect(adapters[0]).to.equal(ADDRESS_TWO) await expect(adapters[1]).to.equal(ADDRESS_THREE) expect((await giriGiriBashi.adapters(DOMAIN_ID, LIST_END)).next).to.equal(ADDRESS_TWO) @@ -179,38 +176,38 @@ describe("GiriGiriBashi", function () { expect(adapterSettings.idDepth).to.deep.equal(settings.idDepth) expect(adapterSettings.timeout).to.deep.equal(settings.timeout) }) - it("Emits OracleAdaptersEnabled() event", async function () { + it("Emits AdaptersEnabled() event", async function () { const { giriGiriBashi, settings } = await setup() - await expect(giriGiriBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE], [settings, settings])) - .to.emit(giriGiriBashi, "OracleAdaptersEnabled") + await expect(giriGiriBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE], [settings, settings])) + .to.emit(giriGiriBashi, "AdaptersEnabled") .withArgs(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) }) }) - describe("disableOracleAdapters()", function () { + describe("disableAdapters()", function () { it("Reverts if a state of no confidence has not been established", async function () { const { giriGiriBashi } = await setup() - await expect(giriGiriBashi.disableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO])).to.be.revertedWithCustomError( + await expect(giriGiriBashi.disableAdapters(DOMAIN_ID, [ADDRESS_TWO])).to.be.revertedWithCustomError( giriGiriBashi, "NoConfidenceRequired", ) }) - it("Disables the given oracles", async function () { + it("Disables the given adapters", async function () { const { giriGiriBashi, settings } = await setup() await giriGiriBashi.setThreshold(DOMAIN_ID, ethers.constants.MaxUint256) - await giriGiriBashi.enableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE], [settings, settings]) - await giriGiriBashi.disableOracleAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) - const adapters = await giriGiriBashi.getOracleAdapters(DOMAIN_ID) + await giriGiriBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE], [settings, settings]) + await giriGiriBashi.disableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) + const adapters = await giriGiriBashi.getAdapters(DOMAIN_ID) await expect(adapters[0]).to.equal(undefined) }) }) describe("getUnanimousHash()", function () { it("Updates head for given domain", async function () { - const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter, settings } = await setup() - await giriGiriBashi.enableOracleAdapters( + const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() + await giriGiriBashi.enableAdapters( DOMAIN_ID, - [mockOracleAdapter.address, secondMockOracleAdapter.address], + [mockAdapter.address, secondMockAdapter.address], [settings, settings], ) const oldHead = await giriGiriBashi.heads(DOMAIN_ID) @@ -223,11 +220,10 @@ describe("GiriGiriBashi", function () { describe("getThresholdHash()", function () { for (let threshold = 1; threshold <= 3; threshold++) { it(`Updates head for given domain with ${threshold}/3`, async function () { - const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter, thirdMockOracleAdapter, settings } = - await setup({ threshold }) - await giriGiriBashi.enableOracleAdapters( + const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup({ threshold }) + await giriGiriBashi.enableAdapters( DOMAIN_ID, - [mockOracleAdapter.address, secondMockOracleAdapter.address, thirdMockOracleAdapter.address], + [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address], [settings, settings, settings], ) const oldHead = await giriGiriBashi.heads(DOMAIN_ID) @@ -241,17 +237,17 @@ describe("GiriGiriBashi", function () { describe("getHash()", function () { it("Updates head for given domain", async function () { - const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter, settings } = await setup() - await giriGiriBashi.enableOracleAdapters( + const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() + await giriGiriBashi.enableAdapters( DOMAIN_ID, - [mockOracleAdapter.address, secondMockOracleAdapter.address], + [mockAdapter.address, secondMockAdapter.address], [settings, settings], ) let adapters - if (secondMockOracleAdapter.address > mockOracleAdapter.address) { - adapters = [mockOracleAdapter.address, secondMockOracleAdapter.address] + if (secondMockAdapter.address > mockAdapter.address) { + adapters = [mockAdapter.address, secondMockAdapter.address] } else { - adapters = [secondMockOracleAdapter.address, mockOracleAdapter.address] + adapters = [secondMockAdapter.address, mockAdapter.address] } const oldHead = await giriGiriBashi.heads(DOMAIN_ID) await giriGiriBashi.getHash(DOMAIN_ID, 1, adapters) @@ -260,137 +256,128 @@ describe("GiriGiriBashi", function () { }) }) - describe("challengeOracleAdapter()", function () { + describe("challengeAdapter()", function () { it("Reverts if given adapter is not enabled", async function () { - const { giriGiriBashi, mockOracleAdapter } = await setup() - await expect(giriGiriBashi.challengeOracleAdapter(DOMAIN_ID, 1, mockOracleAdapter.address)) + const { giriGiriBashi, mockAdapter } = await setup() + await expect(giriGiriBashi.challengeAdapter(DOMAIN_ID, 1, mockAdapter.address)) .to.be.revertedWithCustomError(giriGiriBashi, "AdapterNotEnabled") - .withArgs(mockOracleAdapter.address) + .withArgs(mockAdapter.address) }) it("Reverts if value is less than minimum bond", async function () { - const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter, settings } = await setup() - await giriGiriBashi.enableOracleAdapters( + const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() + await giriGiriBashi.enableAdapters( DOMAIN_ID, - [mockOracleAdapter.address, secondMockOracleAdapter.address], + [mockAdapter.address, secondMockAdapter.address], [settings, settings], ) - await expect(giriGiriBashi.challengeOracleAdapter(DOMAIN_ID, 1, mockOracleAdapter.address)) + await expect(giriGiriBashi.challengeAdapter(DOMAIN_ID, 1, mockAdapter.address)) .to.be.revertedWithCustomError(giriGiriBashi, "NotEnoughtValue") - .withArgs(mockOracleAdapter.address, 0) + .withArgs(mockAdapter.address, 0) }) it("Reverts if adapter is already quarantined", async function () { - const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter, settings } = await setup() - const adapters = [mockOracleAdapter.address, secondMockOracleAdapter.address].sort(compareAddresses) - await giriGiriBashi.enableOracleAdapters(DOMAIN_ID, adapters, [settings, settings]) + const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() + const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) + await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) const head = await giriGiriBashi.heads(DOMAIN_ID) const challengeBlock = head - CHALLENGE_RANGE + 2 - await giriGiriBashi.challengeOracleAdapter(DOMAIN_ID, challengeBlock, mockOracleAdapter.address, { + await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { value: BOND, }) - const challengeId = await giriGiriBashi.getChallengeId(DOMAIN_ID, challengeBlock, mockOracleAdapter.address) + const challengeId = await giriGiriBashi.getChallengeId(DOMAIN_ID, challengeBlock, mockAdapter.address) const challenge = await giriGiriBashi.challenges(challengeId) const increaseAmount = challenge.timestamp.add(settings.timeout).add(1) await network.provider.send("evm_setNextBlockTimestamp", [increaseAmount.toHexString()]) - await giriGiriBashi.resolveChallenge(DOMAIN_ID, challengeBlock, mockOracleAdapter.address, [ - secondMockOracleAdapter.address, - ]) + await giriGiriBashi.resolveChallenge(DOMAIN_ID, challengeBlock, mockAdapter.address, [secondMockAdapter.address]) await expect( - giriGiriBashi.callStatic.challengeOracleAdapter(DOMAIN_ID, challengeBlock, mockOracleAdapter.address, { + giriGiriBashi.callStatic.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { value: BOND, }), ) .to.be.revertedWithCustomError(giriGiriBashi, "AlreadyQuarantined") - .withArgs(mockOracleAdapter.address) + .withArgs(mockAdapter.address) }) it("Reverts if duplicate challenge exists", async function () { - const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter, settings } = await setup() - const adapters = [mockOracleAdapter.address, secondMockOracleAdapter.address].sort(compareAddresses) - await giriGiriBashi.enableOracleAdapters(DOMAIN_ID, adapters, [settings, settings]) + const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() + const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) + await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) const head = await giriGiriBashi.heads(DOMAIN_ID) expect( - await giriGiriBashi.challengeOracleAdapter(DOMAIN_ID, head - CHALLENGE_RANGE + 1, mockOracleAdapter.address, { + await giriGiriBashi.challengeAdapter(DOMAIN_ID, head - CHALLENGE_RANGE + 1, mockAdapter.address, { value: BOND, }), ) await expect( - giriGiriBashi.callStatic.challengeOracleAdapter( - DOMAIN_ID, - head - CHALLENGE_RANGE + 1, - mockOracleAdapter.address, - { - value: BOND, - }, - ), + giriGiriBashi.callStatic.challengeAdapter(DOMAIN_ID, head - CHALLENGE_RANGE + 1, mockAdapter.address, { + value: BOND, + }), ).to.be.revertedWithCustomError(giriGiriBashi, "DuplicateChallenge") }) it("Reverts if challenge is out of range", async function () { - const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter, settings } = await setup() - const adapters = [mockOracleAdapter.address, secondMockOracleAdapter.address].sort(compareAddresses) - await giriGiriBashi.enableOracleAdapters(DOMAIN_ID, adapters, [settings, settings]) + const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() + const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) + await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) const head = await giriGiriBashi.heads(DOMAIN_ID) // revert on block before start ID - await expect( - giriGiriBashi.callStatic.challengeOracleAdapter(DOMAIN_ID, 0, mockOracleAdapter.address, { value: BOND }), - ) + await expect(giriGiriBashi.callStatic.challengeAdapter(DOMAIN_ID, 0, mockAdapter.address, { value: BOND })) .to.be.revertedWithCustomError(giriGiriBashi, "OutOfRange") - .withArgs(mockOracleAdapter.address, 0) + .withArgs(mockAdapter.address, 0) // revert on block too far in the future const outOfRangeBlock = head + CHALLENGE_RANGE + 1 await expect( - giriGiriBashi.callStatic.challengeOracleAdapter(DOMAIN_ID, outOfRangeBlock, mockOracleAdapter.address, { + giriGiriBashi.callStatic.challengeAdapter(DOMAIN_ID, outOfRangeBlock, mockAdapter.address, { value: BOND, }), ) .to.be.revertedWithCustomError(giriGiriBashi, "OutOfRange") - .withArgs(mockOracleAdapter.address, outOfRangeBlock) + .withArgs(mockAdapter.address, outOfRangeBlock) // revert on block too deep for adapter const tooDeepBlock = 1 await expect( - giriGiriBashi.callStatic.challengeOracleAdapter(DOMAIN_ID, tooDeepBlock, mockOracleAdapter.address, { + giriGiriBashi.callStatic.challengeAdapter(DOMAIN_ID, tooDeepBlock, mockAdapter.address, { value: BOND, }), ) .to.be.revertedWithCustomError(giriGiriBashi, "OutOfRange") - .withArgs(mockOracleAdapter.address, tooDeepBlock) + .withArgs(mockAdapter.address, tooDeepBlock) // make sure it can actually be successful / doesn't always revert expect( - await giriGiriBashi.challengeOracleAdapter(DOMAIN_ID, head - CHALLENGE_RANGE + 1, mockOracleAdapter.address, { + await giriGiriBashi.challengeAdapter(DOMAIN_ID, head - CHALLENGE_RANGE + 1, mockAdapter.address, { value: BOND, }), ) }) it("Creates a challenge for the given adapter", async function () { - const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter, settings } = await setup() - const adapters = [mockOracleAdapter.address, secondMockOracleAdapter.address].sort(compareAddresses) - await giriGiriBashi.enableOracleAdapters(DOMAIN_ID, adapters, [settings, settings]) + const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() + const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) + await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) const head = await giriGiriBashi.heads(DOMAIN_ID) expect( - await giriGiriBashi.challengeOracleAdapter(DOMAIN_ID, head - CHALLENGE_RANGE + 1, mockOracleAdapter.address, { + await giriGiriBashi.challengeAdapter(DOMAIN_ID, head - CHALLENGE_RANGE + 1, mockAdapter.address, { value: BOND, }), ) }) it("Emits the ChallengeCreated event", async function () { - const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter, settings } = await setup() - const adapters = [mockOracleAdapter.address, secondMockOracleAdapter.address].sort(compareAddresses) - await giriGiriBashi.enableOracleAdapters(DOMAIN_ID, adapters, [settings, settings]) + const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() + const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) + await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) const head = await giriGiriBashi.heads(DOMAIN_ID) await expect( - giriGiriBashi.challengeOracleAdapter(DOMAIN_ID, head - CHALLENGE_RANGE + 1, mockOracleAdapter.address, { + giriGiriBashi.challengeAdapter(DOMAIN_ID, head - CHALLENGE_RANGE + 1, mockAdapter.address, { value: BOND, }), ).to.emit(giriGiriBashi, "ChallengeCreated") @@ -399,48 +386,44 @@ describe("GiriGiriBashi", function () { describe("resolveChallenge()", function () { it("Reverts if challenge is not found", async function () { - const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter } = await setup() + const { giriGiriBashi, mockAdapter, secondMockAdapter } = await setup() await expect( - giriGiriBashi.callStatic.resolveChallenge(DOMAIN_ID, 5, mockOracleAdapter.address, [ - secondMockOracleAdapter.address, - ]), + giriGiriBashi.callStatic.resolveChallenge(DOMAIN_ID, 5, mockAdapter.address, [secondMockAdapter.address]), ).to.be.revertedWithCustomError(giriGiriBashi, "ChallengeNotFound") }) it("Reverts if adapter has not yet timed out", async function () { - const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter, settings } = await setup() - const adapters = [mockOracleAdapter.address, secondMockOracleAdapter.address].sort(compareAddresses) - await giriGiriBashi.enableOracleAdapters(DOMAIN_ID, adapters, [settings, settings]) + const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() + const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) + await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) const head = await giriGiriBashi.heads(DOMAIN_ID) const challengeBlock = head - CHALLENGE_RANGE + 1 - await giriGiriBashi.challengeOracleAdapter(DOMAIN_ID, challengeBlock, mockOracleAdapter.address, { + await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { value: BOND, }) - const challengeId = await giriGiriBashi.getChallengeId(DOMAIN_ID, challengeBlock, mockOracleAdapter.address) + const challengeId = await giriGiriBashi.getChallengeId(DOMAIN_ID, challengeBlock, mockAdapter.address) const challenge = await giriGiriBashi.challenges(challengeId) const increaseAmount = challenge.timestamp.add(settings.timeout).sub(1) await network.provider.send("evm_setNextBlockTimestamp", [increaseAmount.toHexString()]) await expect( - giriGiriBashi.resolveChallenge(DOMAIN_ID, challengeBlock, mockOracleAdapter.address, [ - secondMockOracleAdapter.address, - ]), + giriGiriBashi.resolveChallenge(DOMAIN_ID, challengeBlock, mockAdapter.address, [secondMockAdapter.address]), ).to.be.revertedWithCustomError(giriGiriBashi, "AdapterHasNotYetTimedOut") }) it("Quarantines adapter and returns bond if adapter times out", async function () { - const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter, settings, wallet } = await setup() - const adapters = [mockOracleAdapter.address, secondMockOracleAdapter.address].sort(compareAddresses) - await giriGiriBashi.enableOracleAdapters(DOMAIN_ID, adapters, [settings, settings]) + const { giriGiriBashi, mockAdapter, secondMockAdapter, settings, wallet } = await setup() + const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) + await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) const head = await giriGiriBashi.heads(DOMAIN_ID) const challengeBlock = head - CHALLENGE_RANGE + 1 - await giriGiriBashi.challengeOracleAdapter(DOMAIN_ID, challengeBlock, mockOracleAdapter.address, { + await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { value: BOND, }) - const challengeId = await giriGiriBashi.getChallengeId(DOMAIN_ID, challengeBlock, mockOracleAdapter.address) + const challengeId = await giriGiriBashi.getChallengeId(DOMAIN_ID, challengeBlock, mockAdapter.address) const challenge = await giriGiriBashi.challenges(challengeId) const increaseAmount = challenge.timestamp.add(settings.timeout).add(1) @@ -448,68 +431,63 @@ describe("GiriGiriBashi", function () { const previousBalance = await ethers.provider.getBalance(wallet.address) - await giriGiriBashi.resolveChallenge(DOMAIN_ID, challengeBlock, mockOracleAdapter.address, [ - secondMockOracleAdapter.address, - ]) + await giriGiriBashi.resolveChallenge(DOMAIN_ID, challengeBlock, mockAdapter.address, [secondMockAdapter.address]) const newBalance = await ethers.provider.getBalance(wallet.address) await expect(newBalance).to.be.greaterThan(previousBalance) - const quarantined = (await giriGiriBashi.settings(mockOracleAdapter.address)).quarantined + const quarantined = (await giriGiriBashi.settings(mockAdapter.address)).quarantined await expect(quarantined).to.equal(true) }) it("Keeps bond if _adapters + adapter equals threshold and agree", async function () { - const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter, settings } = await setup() - const adapters = [mockOracleAdapter.address, secondMockOracleAdapter.address].sort(compareAddresses) - await giriGiriBashi.enableOracleAdapters(DOMAIN_ID, adapters, [settings, settings]) + const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() + const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) + await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) await giriGiriBashi.getHash(DOMAIN_ID, 1, adapters) const head = await giriGiriBashi.heads(DOMAIN_ID) const challengeBlock = head.add(20) - await giriGiriBashi.challengeOracleAdapter(DOMAIN_ID, challengeBlock, mockOracleAdapter.address, { + await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { value: BOND, }) expect( - await giriGiriBashi.resolveChallenge(DOMAIN_ID, challengeBlock, mockOracleAdapter.address, [ - secondMockOracleAdapter.address, + await giriGiriBashi.resolveChallenge(DOMAIN_ID, challengeBlock, mockAdapter.address, [ + secondMockAdapter.address, ]), ) expect(await ethers.provider.getBalance(ADDRESS_TWO)).to.equal(BOND) - const quarantined = (await giriGiriBashi.settings(mockOracleAdapter.address)).quarantined + const quarantined = (await giriGiriBashi.settings(mockAdapter.address)).quarantined expect(quarantined).to.equal(false) }) it("Reverts if _adapters + adapter equals threshold and disagree", async function () { - const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter, settings, hashi } = await setup() - const adapters = [mockOracleAdapter.address, secondMockOracleAdapter.address].sort(compareAddresses) - await giriGiriBashi.enableOracleAdapters(DOMAIN_ID, adapters, [settings, settings]) + const { giriGiriBashi, mockAdapter, secondMockAdapter, settings, hashi } = await setup() + const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) + await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) const head = await giriGiriBashi.heads(DOMAIN_ID) const challengeBlock = head.add(1) - await giriGiriBashi.challengeOracleAdapter(DOMAIN_ID, challengeBlock, mockOracleAdapter.address, { + await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { value: BOND, }) await expect( - giriGiriBashi.resolveChallenge(DOMAIN_ID, challengeBlock, mockOracleAdapter.address, [ - secondMockOracleAdapter.address, - ]), + giriGiriBashi.resolveChallenge(DOMAIN_ID, challengeBlock, mockAdapter.address, [secondMockAdapter.address]), ) - .to.be.revertedWithCustomError(hashi, "OraclesDisagree") - .withArgs(mockOracleAdapter.address, secondMockOracleAdapter.address) + .to.be.revertedWithCustomError(hashi, "AdaptersDisagree") + .withArgs(mockAdapter.address, secondMockAdapter.address) }) it("Keeps bond if canonical hash matches hash reported by challenged adapter", async function () { - const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter, thirdMockOracleAdapter, settings } = - await setup() - let adapters = [mockOracleAdapter.address, secondMockOracleAdapter.address, thirdMockOracleAdapter.address] - await giriGiriBashi.enableOracleAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) + const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() + let adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address] + await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) adapters = adapters.sort(compareAddresses) await giriGiriBashi.getHash(DOMAIN_ID, 1, adapters) const head = await giriGiriBashi.heads(DOMAIN_ID) const challengeBlock = head.add(20) - await giriGiriBashi.challengeOracleAdapter(DOMAIN_ID, challengeBlock, mockOracleAdapter.address, { + await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { value: BOND, }) @@ -518,132 +496,110 @@ describe("GiriGiriBashi", function () { await giriGiriBashi.resolveChallenge( DOMAIN_ID, challengeBlock, - mockOracleAdapter.address, - [secondMockOracleAdapter.address, thirdMockOracleAdapter.address].sort(compareAddresses), + mockAdapter.address, + [secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses), ) expect(await ethers.provider.getBalance(ADDRESS_TWO)).to.equal(previousBalance.add(BOND)) - const quarantined = (await giriGiriBashi.settings(mockOracleAdapter.address)).quarantined + const quarantined = (await giriGiriBashi.settings(mockAdapter.address)).quarantined expect(quarantined).to.equal(false) }) - it("Quarantines oracle and returns bond if challenged adapter disagrees with canonical hash", async function () { - const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter, thirdMockOracleAdapter, settings } = - await setup() - let adapters = [mockOracleAdapter.address, secondMockOracleAdapter.address, thirdMockOracleAdapter.address] - await giriGiriBashi.enableOracleAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) + it("Quarantines adapter and returns bond if challenged adapter disagrees with canonical hash", async function () { + const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() + let adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address] + await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) adapters = adapters.sort(compareAddresses) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) const head = await giriGiriBashi.heads(DOMAIN_ID) const challengeBlock = head.add(1) - await giriGiriBashi.challengeOracleAdapter(DOMAIN_ID, challengeBlock, mockOracleAdapter.address, { + await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { value: BOND, }) await giriGiriBashi.resolveChallenge( DOMAIN_ID, challengeBlock, - mockOracleAdapter.address, - [secondMockOracleAdapter.address, thirdMockOracleAdapter.address].sort(compareAddresses), + mockAdapter.address, + [secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses), ) - const quarantined = (await giriGiriBashi.settings(mockOracleAdapter.address)).quarantined + const quarantined = (await giriGiriBashi.settings(mockAdapter.address)).quarantined await expect(quarantined).to.equal(true) }) it("Clears state after challenge is resolved", async function () { - const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter, thirdMockOracleAdapter, settings } = - await setup() - let adapters = [mockOracleAdapter.address, secondMockOracleAdapter.address, thirdMockOracleAdapter.address] - await giriGiriBashi.enableOracleAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) + const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() + let adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address] + await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) adapters = adapters.sort(compareAddresses) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) const head = await giriGiriBashi.heads(DOMAIN_ID) const challengeBlock = head.add(1) - await giriGiriBashi.challengeOracleAdapter(DOMAIN_ID, challengeBlock, mockOracleAdapter.address, { + await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { value: BOND, }) await giriGiriBashi.resolveChallenge( DOMAIN_ID, challengeBlock, - mockOracleAdapter.address, - [secondMockOracleAdapter.address, thirdMockOracleAdapter.address].sort(compareAddresses), + mockAdapter.address, + [secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses), ) - const quarantined = (await giriGiriBashi.settings(mockOracleAdapter.address)).quarantined + const quarantined = (await giriGiriBashi.settings(mockAdapter.address)).quarantined expect(quarantined).to.equal(true) - const challengeId = await giriGiriBashi.getChallengeId(DOMAIN_ID, challengeBlock, mockOracleAdapter.address) + const challengeId = await giriGiriBashi.getChallengeId(DOMAIN_ID, challengeBlock, mockAdapter.address) const challenge = await giriGiriBashi.challenges(challengeId) expect(challenge.challenger).to.equal(ADDRESS_ZERO) expect(challenge.timestamp).to.equal(0) expect(challenge.bond).to.equal(0) }) it("Emits ChallengeResolved() event", async function () { - const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter, thirdMockOracleAdapter, settings, wallet } = - await setup() - const adapters = [ - mockOracleAdapter.address, - secondMockOracleAdapter.address, - thirdMockOracleAdapter.address, - ].sort(compareAddresses) - await giriGiriBashi.enableOracleAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) + const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings, wallet } = await setup() + const adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses) + await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) const head = await giriGiriBashi.heads(DOMAIN_ID) const challengeBlock = head.add(1) - await giriGiriBashi.challengeOracleAdapter(DOMAIN_ID, challengeBlock, mockOracleAdapter.address, { + await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { value: BOND, }) - const challengeId = await giriGiriBashi.getChallengeId(DOMAIN_ID, challengeBlock, mockOracleAdapter.address) + const challengeId = await giriGiriBashi.getChallengeId(DOMAIN_ID, challengeBlock, mockAdapter.address) await expect( giriGiriBashi.resolveChallenge( DOMAIN_ID, challengeBlock, - mockOracleAdapter.address, - [secondMockOracleAdapter.address, thirdMockOracleAdapter.address].sort(compareAddresses), + mockAdapter.address, + [secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses), ), ) .to.emit(giriGiriBashi, "ChallengeResolved") - .withArgs(challengeId, DOMAIN_ID, challengeBlock, mockOracleAdapter.address, wallet.address, BOND, true) + .withArgs(challengeId, DOMAIN_ID, challengeBlock, mockAdapter.address, wallet.address, BOND, true) }) }) describe("declareNoConfidence()", function () { it("Reverts if too few adapters were provided to prove no confidence", async function () { - const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter, thirdMockOracleAdapter, settings } = - await setup() - const adapters = [ - mockOracleAdapter.address, - secondMockOracleAdapter.address, - thirdMockOracleAdapter.address, - ].sort(compareAddresses) - await giriGiriBashi.enableOracleAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) - await expect(giriGiriBashi.callStatic.declareNoConfidence(DOMAIN_ID, 20, [mockOracleAdapter.address])) + const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() + const adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses) + await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) + await expect(giriGiriBashi.callStatic.declareNoConfidence(DOMAIN_ID, 20, [mockAdapter.address])) .to.be.revertedWithCustomError(giriGiriBashi, "CannotProveNoConfidence") - .withArgs(DOMAIN_ID, 20, [mockOracleAdapter.address]) + .withArgs(DOMAIN_ID, 20, [mockAdapter.address]) }) it("Reverts if any of the provided adapters agree", async function () { - const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter, thirdMockOracleAdapter, settings } = - await setup() - const adapters = [ - mockOracleAdapter.address, - secondMockOracleAdapter.address, - thirdMockOracleAdapter.address, - ].sort(compareAddresses) - const adaptersThatAgree = [secondMockOracleAdapter.address, thirdMockOracleAdapter.address].sort(compareAddresses) - await giriGiriBashi.enableOracleAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) + const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() + const adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses) + const adaptersThatAgree = [secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses) + await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) await expect(giriGiriBashi.callStatic.declareNoConfidence(DOMAIN_ID, 22, adapters)) .to.be.revertedWithCustomError(giriGiriBashi, "AdaptersAgreed") .withArgs(adaptersThatAgree[0], adaptersThatAgree[1]) }) it("Clears state for domain", async function () { - const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter, thirdMockOracleAdapter, settings } = - await setup() - const adapters = [ - mockOracleAdapter.address, - secondMockOracleAdapter.address, - thirdMockOracleAdapter.address, - ].sort(compareAddresses) - await giriGiriBashi.enableOracleAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) + const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() + const adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses) + await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) expect(await giriGiriBashi.declareNoConfidence(DOMAIN_ID, 20, adapters)) const domain = await giriGiriBashi.domains(DOMAIN_ID) const challengeRange = await giriGiriBashi.challengeRanges(DOMAIN_ID) @@ -651,14 +607,9 @@ describe("GiriGiriBashi", function () { expect(challengeRange).to.equal(0) }) it("Emits NoConfidenceDeclareed() event", async function () { - const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter, thirdMockOracleAdapter, settings } = - await setup() - const adapters = [ - mockOracleAdapter.address, - secondMockOracleAdapter.address, - thirdMockOracleAdapter.address, - ].sort(compareAddresses) - await giriGiriBashi.enableOracleAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) + const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() + const adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses) + await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) await expect(giriGiriBashi.declareNoConfidence(DOMAIN_ID, 20, adapters)) .to.emit(giriGiriBashi, "NoConfidenceDeclareed") .withArgs(DOMAIN_ID) @@ -698,78 +649,75 @@ describe("GiriGiriBashi", function () { }) }) - describe("replaceQuaratinedOrcales()", function () { + describe("replaceQuaratinedAdapters()", function () { it("Reverts if given arrays are unequal length", async function () { - const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter, settings } = await setup() - await giriGiriBashi.enableOracleAdapters( + const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() + await giriGiriBashi.enableAdapters( DOMAIN_ID, - [mockOracleAdapter.address, secondMockOracleAdapter.address], + [mockAdapter.address, secondMockAdapter.address], [settings, settings], ) await expect( - giriGiriBashi.replaceQuaratinedOrcales( + giriGiriBashi.replaceQuaratinedAdapters( DOMAIN_ID, - [mockOracleAdapter.address, secondMockOracleAdapter.address], + [mockAdapter.address, secondMockAdapter.address], [ADDRESS_ZERO], [settings, settings], ), ).to.be.revertedWithCustomError(giriGiriBashi, "UnequalArrayLengths") await expect( - giriGiriBashi.replaceQuaratinedOrcales( + giriGiriBashi.replaceQuaratinedAdapters( DOMAIN_ID, - [mockOracleAdapter.address], + [mockAdapter.address], [ADDRESS_ZERO, ADDRESS_ZERO], [settings, settings], ), ).to.be.revertedWithCustomError(giriGiriBashi, "UnequalArrayLengths") await expect( - giriGiriBashi.replaceQuaratinedOrcales( + giriGiriBashi.replaceQuaratinedAdapters( DOMAIN_ID, - [mockOracleAdapter.address, secondMockOracleAdapter.address], + [mockAdapter.address, secondMockAdapter.address], [ADDRESS_ZERO, ADDRESS_ZERO], [settings], ), ).to.be.revertedWithCustomError(giriGiriBashi, "UnequalArrayLengths") }) it("Reverts if given adapter is not quarantined", async function () { - const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter, settings } = await setup() - await giriGiriBashi.enableOracleAdapters( + const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() + await giriGiriBashi.enableAdapters( DOMAIN_ID, - [mockOracleAdapter.address, secondMockOracleAdapter.address], + [mockAdapter.address, secondMockAdapter.address], [settings, settings], ) await expect( - giriGiriBashi.replaceQuaratinedOrcales( + giriGiriBashi.replaceQuaratinedAdapters( DOMAIN_ID, - [mockOracleAdapter.address, secondMockOracleAdapter.address], + [mockAdapter.address, secondMockAdapter.address], [ADDRESS_ZERO, ADDRESS_ZERO], [settings, settings], ), ).to.be.revertedWithCustomError(giriGiriBashi, "AdapterNotQuarantined") }) - it("Replaces oracle adapters and initializes settings", async function () { - const { giriGiriBashi, mockOracleAdapter, secondMockOracleAdapter, thirdMockOracleAdapter, settings } = - await setup() - let adapters = [mockOracleAdapter.address, secondMockOracleAdapter.address, thirdMockOracleAdapter.address] - await giriGiriBashi.enableOracleAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) + it("Replaces adapters and initializes settings", async function () { + const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() + let adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address] + await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) adapters = adapters.sort(compareAddresses) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) const head = await giriGiriBashi.heads(DOMAIN_ID) const challengeBlock = head.add(1) - await giriGiriBashi.challengeOracleAdapter(DOMAIN_ID, challengeBlock, mockOracleAdapter.address, { + await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { value: BOND, }) await giriGiriBashi.resolveChallenge( DOMAIN_ID, challengeBlock, - mockOracleAdapter.address, - [secondMockOracleAdapter.address, thirdMockOracleAdapter.address].sort(compareAddresses), - ) - expect( - await giriGiriBashi.replaceQuaratinedOrcales(DOMAIN_ID, [mockOracleAdapter.address], [ADDRESS_TWO], [settings]), + mockAdapter.address, + [secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses), ) + expect(await giriGiriBashi.replaceQuaratinedAdapters(DOMAIN_ID, [mockAdapter.address], [ADDRESS_TWO], [settings])) const adapterSettings = await giriGiriBashi.settings(ADDRESS_TWO) expect(adapterSettings.quarantined).to.deep.equal(settings.quarantined) expect(adapterSettings.minimumBond).to.deep.equal(settings.minimumBond) diff --git a/packages/evm/test/05_Yaru.spec.ts b/packages/evm/test/05_Yaru.spec.ts index 59e21666..28f935bd 100644 --- a/packages/evm/test/05_Yaru.spec.ts +++ b/packages/evm/test/05_Yaru.spec.ts @@ -26,7 +26,7 @@ describe("Yaru", () => { const Yaho = await ethers.getContractFactory("Yaho") const Hashi = await ethers.getContractFactory("Hashi") const Reporter = await ethers.getContractFactory("MockReporter") - const Adapter = await ethers.getContractFactory("MockOracleAdapter") + const Adapter = await ethers.getContractFactory("MockAdapter") const PingPong = await ethers.getContractFactory("PingPong") const HeaderStorage = await ethers.getContractFactory("HeaderStorage") diff --git a/packages/evm/test/adapters/02_OracleAdapter.spec.ts b/packages/evm/test/adapters/02_OracleAdapter.spec.ts index b4843a41..ed60d30c 100644 --- a/packages/evm/test/adapters/02_OracleAdapter.spec.ts +++ b/packages/evm/test/adapters/02_OracleAdapter.spec.ts @@ -47,8 +47,8 @@ const getBlock = async (blockNumber: number) => { const setup = async () => { await network.provider.request({ method: "hardhat_reset", params: [] }) const [wallet] = await ethers.getSigners() - const OracleAdapter = await ethers.getContractFactory("MockOracleAdapter") - const oracleAdapter = await OracleAdapter.deploy() + const Adapter = await ethers.getContractFactory("MockAdapter") + const adapter = await Adapter.deploy() await mine(120) const reportedBlockNumbers = [100, 110] const unreportedBlockNumbers = [109, 108, 107] @@ -59,10 +59,10 @@ const setup = async () => { .filter((block) => reportedBlockNumbers.includes(block.blockNumber)) .map((block) => block.hash) - await oracleAdapter.setHashes(CHAIN_ID, reportedBlockNumbers, reportedBlockHashes) + await adapter.setHashes(CHAIN_ID, reportedBlockNumbers, reportedBlockHashes) return { wallet, - oracleAdapter, + adapter, reportedBlockNumbers, reportedBlockHashes, unreportedBlockNumbers, @@ -70,67 +70,67 @@ const setup = async () => { } } -describe("OracleAdapter", function () { +describe("Adapter", function () { describe("Deploy", function () { it("Successfully deploys contract", async function () { - const { oracleAdapter } = await setup() - expect(await oracleAdapter.deployed()) + const { adapter } = await setup() + expect(await adapter.deployed()) }) }) describe("proveAncestralBlockHashes()", function () { it("Adds ancestral block hashes of proven blocks", async function () { - const { oracleAdapter, blocks } = await setup() + const { adapter, blocks } = await setup() const blockHeaders = blocks.map((block) => blockRLP(block)) // All blocks should have been proven and their ancestral headers stored - const tx = oracleAdapter.proveAncestralBlockHashes(CHAIN_ID, blockHeaders) + const tx = adapter.proveAncestralBlockHashes(CHAIN_ID, blockHeaders) for (const block of blocks) { await expect(tx) - .to.emit(oracleAdapter, "HashStored") + .to.emit(adapter, "HashStored") .withArgs(block.blockNumber - 1, block.parentHash) } }) it("Reverts if given unknown blocks", async function () { - const { oracleAdapter, blocks, unreportedBlockNumbers } = await setup() + const { adapter, blocks, unreportedBlockNumbers } = await setup() const unreportedBlockNumber = unreportedBlockNumbers[0] const unreportedBlock = blocks.find((block) => block.blockNumber === unreportedBlockNumber) const blockHeaders = [blockRLP(unreportedBlock)] - await expect(oracleAdapter.proveAncestralBlockHashes(CHAIN_ID, blockHeaders)) - .to.revertedWithCustomError(oracleAdapter, "ConflictingBlockHeader") + await expect(adapter.proveAncestralBlockHashes(CHAIN_ID, blockHeaders)) + .to.revertedWithCustomError(adapter, "ConflictingBlockHeader") .withArgs(unreportedBlockNumber, unreportedBlock.hash, EMPTY_HASH) }) it("Reverts if block header is invalid RLP encoding", async function () { - const { oracleAdapter } = await setup() + const { adapter } = await setup() const invalidRLP = ["0xa0000000"] // Invalid block header RLP - await expect(oracleAdapter.proveAncestralBlockHashes(CHAIN_ID, invalidRLP)).to.revertedWithCustomError( - oracleAdapter, + await expect(adapter.proveAncestralBlockHashes(CHAIN_ID, invalidRLP)).to.revertedWithCustomError( + adapter, "InvalidBlockHeaderRLP", ) }) it("Reverts if block proof doesn't match valid block header lengths", async function () { - const { oracleAdapter, blocks } = await setup() + const { adapter, blocks } = await setup() const blockHeaderContents = RLP.decode(blockRLP(blocks[0])) const blockHeaderTooShortContents = blockHeaderContents.slice(0, 14) const blockHeaderTooShort = RLP.encode(blockHeaderTooShortContents) // Block header RLP contains too few elements - await expect(oracleAdapter.proveAncestralBlockHashes(CHAIN_ID, [blockHeaderTooShort])) - .to.revertedWithCustomError(oracleAdapter, "InvalidBlockHeaderLength") + await expect(adapter.proveAncestralBlockHashes(CHAIN_ID, [blockHeaderTooShort])) + .to.revertedWithCustomError(adapter, "InvalidBlockHeaderLength") .withArgs(blockHeaderTooShortContents.length) - const blockHeaderTooLongContents = blockHeaderContents.concat([oracleAdapter.address, oracleAdapter.address]) + const blockHeaderTooLongContents = blockHeaderContents.concat([adapter.address, adapter.address]) const blockHeaderTooLong = RLP.encode(blockHeaderTooLongContents) // Block header RLP contains too many elements - await expect(oracleAdapter.proveAncestralBlockHashes(CHAIN_ID, [blockHeaderTooLong])) - .to.revertedWithCustomError(oracleAdapter, "InvalidBlockHeaderLength") + await expect(adapter.proveAncestralBlockHashes(CHAIN_ID, [blockHeaderTooLong])) + .to.revertedWithCustomError(adapter, "InvalidBlockHeaderLength") .withArgs(blockHeaderTooLongContents.length) }) }) From 2973b6e6f54a0cfc921b8974576bd2e26fd8d614 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 31 Jan 2024 10:21:59 +0100 Subject: [PATCH 118/297] ref(evm): adds events comments within interfaces --- .../evm/contracts/interfaces/IAdapter.sol | 7 +- .../contracts/interfaces/IGiriGiriBashi.sol | 78 +++++++++++++++---- .../contracts/interfaces/IHeaderStorage.sol | 5 ++ .../evm/contracts/interfaces/IReporter.sol | 19 ++++- packages/evm/contracts/interfaces/IShuSho.sol | 40 ++++++++-- packages/evm/contracts/interfaces/IYaho.sol | 5 ++ packages/evm/contracts/interfaces/IYaru.sol | 5 ++ 7 files changed, 136 insertions(+), 23 deletions(-) diff --git a/packages/evm/contracts/interfaces/IAdapter.sol b/packages/evm/contracts/interfaces/IAdapter.sol index 773c1066..0b4287ec 100644 --- a/packages/evm/contracts/interfaces/IAdapter.sol +++ b/packages/evm/contracts/interfaces/IAdapter.sol @@ -9,7 +9,12 @@ interface IAdapter { error InvalidBlockHeaderRLP(); error ConflictingBlockHeader(uint256 blockNumber, bytes32 blockHash, bytes32 storedBlockHash); - event HashStored(uint256 indexed id, bytes32 indexed hashes); + /** + * @dev Emitted when a hash is stored. + * @param id - The ID of the stored hash. + * @param hash - The stored hash as bytes32 values. + */ + event HashStored(uint256 indexed id, bytes32 indexed hash); /** * @dev Returns the hash for a given ID. diff --git a/packages/evm/contracts/interfaces/IGiriGiriBashi.sol b/packages/evm/contracts/interfaces/IGiriGiriBashi.sol index 264953c6..44db8f03 100644 --- a/packages/evm/contracts/interfaces/IGiriGiriBashi.sol +++ b/packages/evm/contracts/interfaces/IGiriGiriBashi.sol @@ -23,10 +23,58 @@ interface IGiriGiriBashi is IShuSho { uint256 bond; // bond paid by the challenger. } + error DuplicateChallenge(bytes32 challengeId, uint256 domain, uint256 id, IAdapter adapter); + error OutOfRange(IAdapter adapter, uint256 id); + error AlreadyQuarantined(IAdapter adapter); + error NotEnoughtValue(IAdapter adapter, uint256 value); + error ChallengeNotFound(bytes32 challengeId, uint256 domain, uint256 id, IAdapter adapter); + error AdapterHasNotYetTimedOut(IAdapter adapter); + error UnequalArrayLengths(); + error AdapterNotQuarantined(IAdapter adapter); + error CannotProveNoConfidence(uint256 domain, uint256 id, IAdapter[] adapters); + error AdaptersAgreed(IAdapter, IAdapter); + error NoConfidenceRequired(); + error CountMustBeZero(uint256 domain); + error ChallengeRangeAlreadySet(uint256 domain); + + /** + * @dev Emitted when the bond recipient address is set. + * @param bondRecipient - The new bond recipient address as an Ethereum address. + */ event BondRecipientSet(address payable bondRecipient); + + /** + * @dev Emitted when a new head is updated. + * @param domain - The domain associated with the new head. + * @param head - The new head as a Uint256 identifier. + */ event NewHead(uint256 domain, uint256 head); + + /** + * @dev Emitted when the challenge range is updated. + * @param domain - The domain associated with the updated challenge range. + * @param range - The new challenge range as a Uint256 identifier. + */ event ChallegenRangeUpdated(uint256 domain, uint256 range); + + /** + * @dev Emitted when settings are initialized for a specific domain and adapter. + * @param domain - The domain associated with the initialized settings. + * @param adapter - The adapter address associated with the initialized settings. + * @param settings - The initialized settings object. + */ event SettingsInitialized(uint256 domain, IAdapter adapter, Settings settings); + + /** + * @dev Emitted when a challenge is created. + * @param challengeId - The unique identifier for the challenge. + * @param domain - The domain associated with the challenge. + * @param id - The identifier associated with the challenge. + * @param adapter - The adapter address associated with the challenge. + * @param challenger - The address of the challenger. + * @param timestamp - The timestamp when the challenge was created. + * @param bond - The bond amount associated with the challenge. + */ event ChallengeCreated( bytes32 challengeId, uint256 indexed domain, @@ -36,6 +84,17 @@ interface IGiriGiriBashi is IShuSho { uint256 timestamp, uint256 bond ); + + /** + * @dev Emitted when a challenge is resolved. + * @param challengeId - The unique identifier for the resolved challenge. + * @param domain - The domain associated with the resolved challenge. + * @param id - The identifier associated with the resolved challenge. + * @param adapter - The adapter address associated with the resolved challenge. + * @param challenger - The address of the challenger. + * @param bond - The bond amount associated with the resolved challenge. + * @param challengeSuccessful - A boolean indicating whether the challenge was successful. + */ event ChallengeResolved( bytes32 challengeId, uint256 indexed domain, @@ -45,21 +104,12 @@ interface IGiriGiriBashi is IShuSho { uint256 bond, bool challengeSuccessful ); - event NoConfidenceDeclareed(uint256 domain); - error DuplicateChallenge(bytes32 challengeId, uint256 domain, uint256 id, IAdapter adapter); - error OutOfRange(IAdapter adapter, uint256 id); - error AlreadyQuarantined(IAdapter adapter); - error NotEnoughtValue(IAdapter adapter, uint256 value); - error ChallengeNotFound(bytes32 challengeId, uint256 domain, uint256 id, IAdapter adapter); - error AdapterHasNotYetTimedOut(IAdapter adapter); - error UnequalArrayLengths(); - error AdapterNotQuarantined(IAdapter adapter); - error CannotProveNoConfidence(uint256 domain, uint256 id, IAdapter[] adapters); - error AdaptersAgreed(IAdapter, IAdapter); - error NoConfidenceRequired(); - error CountMustBeZero(uint256 domain); - error ChallengeRangeAlreadySet(uint256 domain); + /** + * @dev Emitted when a declaration of no confidence is made for a specific domain. + * @param domain - The domain associated with the declaration. + */ + event NoConfidenceDeclareed(uint256 domain); /** * @dev Sets the threshold for a specific domain. diff --git a/packages/evm/contracts/interfaces/IHeaderStorage.sol b/packages/evm/contracts/interfaces/IHeaderStorage.sol index 26b99d1c..126857b2 100644 --- a/packages/evm/contracts/interfaces/IHeaderStorage.sol +++ b/packages/evm/contracts/interfaces/IHeaderStorage.sol @@ -7,6 +7,11 @@ pragma solidity ^0.8.20; interface IHeaderStorage { error HeaderOutOfRange(uint256 blockNumber); + /** + * @dev Emitted when a block header is stored. + * @param blockNumber - The block number associated with the stored header. + * @param blockHeader - The stored block header as a bytes32 value. + */ event HeaderStored(uint256 indexed blockNumber, bytes32 indexed blockHeader); /** diff --git a/packages/evm/contracts/interfaces/IReporter.sol b/packages/evm/contracts/interfaces/IReporter.sol index 0a512f84..e02ca9dd 100644 --- a/packages/evm/contracts/interfaces/IReporter.sol +++ b/packages/evm/contracts/interfaces/IReporter.sol @@ -4,12 +4,29 @@ pragma solidity ^0.8.20; import { IAdapter } from "./IAdapter.sol"; interface IReporter { + error NotYaho(address sender, address expectedYaho); + + /** + * @dev Emitted when a block is dispatched to another chain. + * @param toChainId - The target chain's identifier associated with the dispatched block. + * @param adapter - The adapter address associated with the dispatched block. + * @param blockNumber - The block number associated with the dispatched block. + * @param blockHeader - The dispatched block header as a bytes32 value. + */ event BlockDispatched( uint256 indexed toChainId, IAdapter adapter, uint256 indexed blockNumber, bytes32 blockHeader ); + + /** + * @dev Emitted when a message is dispatched to another chain. + * @param toChainId - The target chain's identifier associated with the dispatched message. + * @param adapter - The adapter address associated with the dispatched message. + * @param messageId - The message identifier associated with the dispatched message. + * @param messageHash - The dispatched message hash as a bytes32 value. + */ event MessageDispatched( uint256 indexed toChainId, IAdapter adapter, @@ -17,8 +34,6 @@ interface IReporter { bytes32 messageHash ); - error NotYaho(address sender, address expectedYaho); - /** * @dev Dispatches blocks to a given adapter on the target chaib. * @param toChainId - The target chain's Uint256 identifier. diff --git a/packages/evm/contracts/interfaces/IShuSho.sol b/packages/evm/contracts/interfaces/IShuSho.sol index c9667b73..615a6f82 100644 --- a/packages/evm/contracts/interfaces/IShuSho.sol +++ b/packages/evm/contracts/interfaces/IShuSho.sol @@ -13,12 +13,6 @@ interface IShuSho { IAdapter next; } - event HashiSet(IHashi indexed hashi); - event Init(address indexed owner, IHashi indexed hashi); - event AdaptersEnabled(uint256 indexed domain, IAdapter[] adapters); - event AdaptersDisabled(uint256 indexed domain, IAdapter[] adapters); - event ThresholdSet(uint256 domain, uint256 threshold); - error AdapterNotEnabled(IAdapter adapter); error AdapterAlreadyEnabled(IAdapter adapter); error DuplicateHashiAddress(IHashi hashi); @@ -29,6 +23,40 @@ interface IShuSho { error NoAdaptersGiven(); error ThresholdNotMet(); + /** + * @dev Emitted when the address of the IHashi contract is set. + * @param hashi - The address of the IHashi contract associated with this event. + */ + event HashiSet(IHashi indexed hashi); + + /** + * @dev Emitted when initialization occurs with the owner's address and the IHashi contract address. + * @param owner - The address of the owner associated with this event. + * @param hashi - The address of the IHashi contract associated with this event. + */ + event Init(address indexed owner, IHashi indexed hashi); + + /** + * @dev Emitted when adapters are enabled for a specific domain. + * @param domain - The domain associated with the enabled adapters. + * @param adapters - An array of enabled adapter addresses associated with this event. + */ + event AdaptersEnabled(uint256 indexed domain, IAdapter[] adapters); + + /** + * @dev Emitted when adapters are disabled for a specific domain. + * @param domain - The domain associated with the disabled adapters. + * @param adapters - An array of disabled adapter addresses associated with this event. + */ + event AdaptersDisabled(uint256 indexed domain, IAdapter[] adapters); + + /** + * @dev Emitted when the threshold is set for a specific domain. + * @param domain - The domain associated with the set threshold. + * @param threshold - The new threshold value associated with this event. + */ + event ThresholdSet(uint256 domain, uint256 threshold); + /** * @dev Checks the order and validity of adapters for a given domain. * @param domain - The Uint256 identifier for the domain. diff --git a/packages/evm/contracts/interfaces/IYaho.sol b/packages/evm/contracts/interfaces/IYaho.sol index bf9b151a..a7f41e25 100644 --- a/packages/evm/contracts/interfaces/IYaho.sol +++ b/packages/evm/contracts/interfaces/IYaho.sol @@ -20,6 +20,11 @@ interface IYaho is IMessageHashCalculator, IMessageIdCalculator { error InvalidMessage(Message message); error InvalidThreshold(uint256 threshold, uint256 maxThreshold); + /** + * @dev Emitted when a message is dispatched with its associated message ID and message struct. + * @param messageId - The message ID associated with the dispatched message. + * @param message - The message struct associated with this event. + */ event MessageDispatched(uint256 indexed messageId, Message message); /** diff --git a/packages/evm/contracts/interfaces/IYaru.sol b/packages/evm/contracts/interfaces/IYaru.sol index 7f1d5aaa..4f26ad1f 100644 --- a/packages/evm/contracts/interfaces/IYaru.sol +++ b/packages/evm/contracts/interfaces/IYaru.sol @@ -14,6 +14,11 @@ interface IYaru is IMessageHashCalculator, IMessageIdCalculator { error CallFailed(); error ThresholdNotMet(); + /** + * @dev Emitted when a message is executed with its associated message ID and message object. + * @param messageId - The message ID associated with the executed message. + * @param message - The message object associated with this event. + */ event MessageExecuted(uint256 indexed messageId, Message message); /** From f6ac5384ff0dae26d71eb0b8ab9f1b3484de374a Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 31 Jan 2024 13:43:36 +0100 Subject: [PATCH 119/297] refactor(evm): mv Domain within IShuSho --- packages/evm/contracts/interfaces/IDomain.sol | 7 ------- packages/evm/contracts/interfaces/IShuSho.sol | 5 +++++ packages/evm/contracts/ownable/ShuSo.sol | 1 - 3 files changed, 5 insertions(+), 8 deletions(-) delete mode 100644 packages/evm/contracts/interfaces/IDomain.sol diff --git a/packages/evm/contracts/interfaces/IDomain.sol b/packages/evm/contracts/interfaces/IDomain.sol deleted file mode 100644 index 8c169f38..00000000 --- a/packages/evm/contracts/interfaces/IDomain.sol +++ /dev/null @@ -1,7 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.20; - -struct Domain { - uint256 threshold; - uint256 count; -} diff --git a/packages/evm/contracts/interfaces/IShuSho.sol b/packages/evm/contracts/interfaces/IShuSho.sol index 615a6f82..66228860 100644 --- a/packages/evm/contracts/interfaces/IShuSho.sol +++ b/packages/evm/contracts/interfaces/IShuSho.sol @@ -8,6 +8,11 @@ import { IAdapter } from "./IAdapter.sol"; * @title IShuSho */ interface IShuSho { + struct Domain { + uint256 threshold; + uint256 count; + } + struct Link { IAdapter previous; IAdapter next; diff --git a/packages/evm/contracts/ownable/ShuSo.sol b/packages/evm/contracts/ownable/ShuSo.sol index 778482e8..0bd407df 100644 --- a/packages/evm/contracts/ownable/ShuSo.sol +++ b/packages/evm/contracts/ownable/ShuSo.sol @@ -4,7 +4,6 @@ pragma solidity ^0.8.20; import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import { IAdapter } from "../interfaces/IAdapter.sol"; import { IHashi } from "../interfaces/IHashi.sol"; -import { Domain } from "../interfaces/IDomain.sol"; import { IShuSho } from "../interfaces/IShuSho.sol"; abstract contract ShuSo is IShuSho, OwnableUpgradeable { From 5917ee2ddab31ad1775a0001e88c21b728cea3da Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 31 Jan 2024 13:54:00 +0100 Subject: [PATCH 120/297] refactor(evm): improves ShuSho & IShuSho --- packages/evm/contracts/interfaces/IShuSho.sol | 16 ++ packages/evm/contracts/ownable/ShuSo.sol | 170 +++++++++--------- 2 files changed, 96 insertions(+), 90 deletions(-) diff --git a/packages/evm/contracts/interfaces/IShuSho.sol b/packages/evm/contracts/interfaces/IShuSho.sol index 66228860..4c44df1e 100644 --- a/packages/evm/contracts/interfaces/IShuSho.sol +++ b/packages/evm/contracts/interfaces/IShuSho.sol @@ -68,4 +68,20 @@ interface IShuSho { * @param _adapters - An array of adapter instances. */ function checkAdapterOrderAndValidity(uint256 domain, IAdapter[] memory _adapters) external view; + + /** + * @dev Returns an array of enabled adapters for a given domain. + * @param domain - Uint256 identifier for the domain for which to list adapters. + * @return adapters - The adapters for a given domain. + */ + function getAdapters(uint256 domain) external view returns (IAdapter[] memory); + + /** + * @dev Returns the threshold and count for a given domain. + * @param domain - Uint256 identifier for the domain. + * @return threshold - Uint256 adapters threshold for the given domain. + * @return count - Uint256 adapters count for the given domain. + * @notice If the threshold for a domain has not been set, or is explicitly set to 0, this function will return a threshold equal to the adapters count for the given domain. + */ + function getThresholdAndCount(uint256 domain) external view returns (uint256, uint256); } diff --git a/packages/evm/contracts/ownable/ShuSo.sol b/packages/evm/contracts/ownable/ShuSo.sol index 0bd407df..ffdadc9d 100644 --- a/packages/evm/contracts/ownable/ShuSo.sol +++ b/packages/evm/contracts/ownable/ShuSo.sol @@ -26,59 +26,37 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { emit Init(_owner, _hashi); } - function setHashi(IHashi _hashi) public virtual; - - /** - * @dev Sets the address of the IHashi contract. - * @param _hashi - Address of the hashi contract. - * @notice Only callable by the owner of this contract. - */ - function _setHashi(IHashi _hashi) internal onlyOwner { - if (hashi == _hashi) revert DuplicateHashiAddress(_hashi); - hashi = _hashi; - emit HashiSet(hashi); - } - - /** - * @dev Sets the threshold of adapters required for a given domain. - * @param domain - Uint256 identifier for the domain for which to set the threshold. - * @param threshold - Uint256 threshold to set for the given domain. - * @notice Only callable by the owner of this contract. - * @notice Reverts if threshold is already set to the given value. - */ - function _setThreshold(uint256 domain, uint256 threshold) internal onlyOwner { - if (domains[domain].threshold == threshold) revert DuplicateThreashold(threshold); - domains[domain].threshold = threshold; - emit ThresholdSet(domain, threshold); + /// @inheritdoc IShuSho + function checkAdapterOrderAndValidity(uint256 domain, IAdapter[] memory _adapters) public view { + for (uint256 i = 0; i < _adapters.length; i++) { + IAdapter adapter = _adapters[i]; + if (i > 0 && adapter <= _adapters[i - 1]) revert DuplicateOrOutOfOrderAdapters(adapter, _adapters[i - 1]); + if (adapters[domain][adapter].next == IAdapter(address(0))) revert InvalidAdapter(adapter); + } } - /** - * @dev Enables the given adapters for a given domain. - * @param domain - Uint256 identifier for the domain for which to set adapters. - * @param _adapters - Array of adapter addresses. - * @notice Reverts if _adapters are out of order or contain duplicates. - * @notice Only callable by the owner of this contract. - */ - function _enableAdapters(uint256 domain, IAdapter[] memory _adapters) internal onlyOwner { - if (adapters[domain][LIST_END].next == IAdapter(address(0))) { - adapters[domain][LIST_END].next = LIST_END; - adapters[domain][LIST_END].previous = LIST_END; - } - if (_adapters.length == 0) revert NoAdaptersGiven(); + /// @inheritdoc IShuSho + function getAdapters(uint256 domain) public view returns (IAdapter[] memory) { + IAdapter[] memory _adapters = new IAdapter[](domains[domain].count); + IAdapter currentAdapter = adapters[domain][LIST_END].next; for (uint256 i = 0; i < _adapters.length; i++) { - IAdapter adapter = _adapters[i]; - if (adapter == IAdapter(address(0)) || adapter == LIST_END) revert InvalidAdapter(adapter); - if (adapters[domain][adapter].next != IAdapter(address(0))) revert AdapterAlreadyEnabled(adapter); - IAdapter previous = adapters[domain][LIST_END].previous; - adapters[domain][previous].next = adapter; - adapters[domain][adapter].previous = previous; - adapters[domain][LIST_END].previous = adapter; - adapters[domain][adapter].next = LIST_END; - domains[domain].count++; + _adapters[i] = currentAdapter; + currentAdapter = adapters[domain][currentAdapter].next; } - emit AdaptersEnabled(domain, _adapters); + return _adapters; + } + + /// @inheritdoc IShuSho + function getThresholdAndCount(uint256 domain_) public view returns (uint256, uint256) { + Domain storage domain = domains[domain_]; + uint256 threshold = domain.threshold; + uint256 count = domain.count; + if (threshold == 0) threshold = count; + return (threshold, count); } + function setHashi(IHashi _hashi) public virtual; + /** * @dev Disables the given adapters for a given domain. * @param domain - Uint256 identifier for the domain for which to set adapters. @@ -106,56 +84,51 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { } /** - * @dev Returns an array of enabled adapters for a given domain. - * @param domain - Uint256 identifier for the domain for which to list adapters. + * @dev Enables the given adapters for a given domain. + * @param domain - Uint256 identifier for the domain for which to set adapters. + * @param _adapters - Array of adapter addresses. + * @notice Reverts if _adapters are out of order or contain duplicates. + * @notice Only callable by the owner of this contract. */ - function getAdapters(uint256 domain) public view returns (IAdapter[] memory) { - IAdapter[] memory _adapters = new IAdapter[](domains[domain].count); - IAdapter currentAdapter = adapters[domain][LIST_END].next; - for (uint256 i = 0; i < _adapters.length; i++) { - _adapters[i] = currentAdapter; - currentAdapter = adapters[domain][currentAdapter].next; + function _enableAdapters(uint256 domain, IAdapter[] memory _adapters) internal onlyOwner { + if (adapters[domain][LIST_END].next == IAdapter(address(0))) { + adapters[domain][LIST_END].next = LIST_END; + adapters[domain][LIST_END].previous = LIST_END; } - return _adapters; - } - - /** - * @dev Returns the threshold and count for a given domain. - * @param domain - Uint256 identifier for the domain. - * @return threshold - Uint256 adapters threshold for the given domain. - * @return count - Uint256 adapters count for the given domain. - * @notice If the threshold for a domain has not been set, or is explicitly set to 0, this function will return a threshold equal to the adapters count for the given domain. - */ - function getThresholdAndCount(uint256 domain) public view returns (uint256 threshold, uint256 count) { - threshold = domains[domain].threshold; - count = domains[domain].count; - if (threshold == 0) threshold = count; - } - - /// @inheritdoc IShuSho - function checkAdapterOrderAndValidity(uint256 domain, IAdapter[] memory _adapters) public view { + if (_adapters.length == 0) revert NoAdaptersGiven(); for (uint256 i = 0; i < _adapters.length; i++) { IAdapter adapter = _adapters[i]; - if (i > 0 && adapter <= _adapters[i - 1]) revert DuplicateOrOutOfOrderAdapters(adapter, _adapters[i - 1]); - if (adapters[domain][adapter].next == IAdapter(address(0))) revert InvalidAdapter(adapter); + if (adapter == IAdapter(address(0)) || adapter == LIST_END) revert InvalidAdapter(adapter); + if (adapters[domain][adapter].next != IAdapter(address(0))) revert AdapterAlreadyEnabled(adapter); + IAdapter previous = adapters[domain][LIST_END].previous; + adapters[domain][previous].next = adapter; + adapters[domain][adapter].previous = previous; + adapters[domain][LIST_END].previous = adapter; + adapters[domain][adapter].next = LIST_END; + domains[domain].count++; } + emit AdaptersEnabled(domain, _adapters); } /** - * @dev Returns the hash unanimously agreed upon by ALL of the enabled adapters. + * @dev Returns the hash unanimously agreed upon by all of the given adapters. * @param domain - Uint256 identifier for the domain to query. * @param id - Uint256 identifier to query. + * @param _adapters - Array of adapter addresses to query. * @return hash - Bytes32 hash agreed upon by the adapters for the given domain. + * @notice _adapters must be in numerical order from smallest to largest and contain no duplicates. + * @notice Reverts if _adapters are out of order or contain duplicates. * @notice Reverts if adapters disagree. * @notice Revert if the adapters do not yet have the hash for the given ID. * @notice Reverts if no adapters are set for the given domain. */ - function _getUnanimousHash(uint256 domain, uint256 id) internal view returns (bytes32 hash) { - IAdapter[] memory _adapters = getAdapters(domain); + function _getHash(uint256 domain, uint256 id, IAdapter[] memory _adapters) internal view returns (bytes32) { (uint256 threshold, uint256 count) = getThresholdAndCount(domain); + if (_adapters.length == 0) revert NoAdaptersGiven(); if (count == 0) revert NoAdaptersEnabled(domain); if (_adapters.length < threshold) revert ThresholdNotMet(); - hash = hashi.getHash(domain, id, _adapters); + checkAdapterOrderAndValidity(domain, _adapters); + return hashi.getHash(domain, id, _adapters); } /** @@ -173,7 +146,6 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { if (count == 0) revert NoAdaptersEnabled(domain); if (_adapters.length < threshold) revert ThresholdNotMet(); - // get hashes bytes32[] memory hashes = new bytes32[](_adapters.length); for (uint i = 0; i < _adapters.length; i++) { try _adapters[i].getHash(domain, id) returns (bytes32 currentHash) { @@ -181,12 +153,10 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { } catch {} // solhint-disable no-empty-blocks } - // find a hash agreed on by a threshold of adapters for (uint i = 0; i < hashes.length; i++) { bytes32 baseHash = hashes[i]; if (baseHash == bytes32(0)) continue; - // increment num for each instance of the current hash uint256 num = 0; for (uint j = 0; j < hashes.length; j++) { if (baseHash == hashes[j]) { @@ -199,23 +169,43 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { } /** - * @dev Returns the hash unanimously agreed upon by all of the given adapters. + * @dev Returns the hash unanimously agreed upon by ALL of the enabled adapters. * @param domain - Uint256 identifier for the domain to query. * @param id - Uint256 identifier to query. - * @param _adapters - Array of adapter addresses to query. * @return hash - Bytes32 hash agreed upon by the adapters for the given domain. - * @notice _adapters must be in numerical order from smallest to largest and contain no duplicates. - * @notice Reverts if _adapters are out of order or contain duplicates. * @notice Reverts if adapters disagree. * @notice Revert if the adapters do not yet have the hash for the given ID. * @notice Reverts if no adapters are set for the given domain. */ - function _getHash(uint256 domain, uint256 id, IAdapter[] memory _adapters) internal view returns (bytes32 hash) { + function _getUnanimousHash(uint256 domain, uint256 id) internal view returns (bytes32 hash) { + IAdapter[] memory _adapters = getAdapters(domain); (uint256 threshold, uint256 count) = getThresholdAndCount(domain); - if (_adapters.length == 0) revert NoAdaptersGiven(); if (count == 0) revert NoAdaptersEnabled(domain); if (_adapters.length < threshold) revert ThresholdNotMet(); - checkAdapterOrderAndValidity(domain, _adapters); - hash = hashi.getHash(domain, id, _adapters); + return hashi.getHash(domain, id, _adapters); + } + + /** + * @dev Sets the address of the IHashi contract. + * @param _hashi - Address of the hashi contract. + * @notice Only callable by the owner of this contract. + */ + function _setHashi(IHashi _hashi) internal onlyOwner { + if (hashi == _hashi) revert DuplicateHashiAddress(_hashi); + hashi = _hashi; + emit HashiSet(hashi); + } + + /** + * @dev Sets the threshold of adapters required for a given domain. + * @param domain - Uint256 identifier for the domain for which to set the threshold. + * @param threshold - Uint256 threshold to set for the given domain. + * @notice Only callable by the owner of this contract. + * @notice Reverts if threshold is already set to the given value. + */ + function _setThreshold(uint256 domain, uint256 threshold) internal onlyOwner { + if (domains[domain].threshold == threshold) revert DuplicateThreashold(threshold); + domains[domain].threshold = threshold; + emit ThresholdSet(domain, threshold); } } From bd5ed255cbc838d7d93fe4c5bdb84ad0d604b9a6 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 31 Jan 2024 14:41:50 +0100 Subject: [PATCH 121/297] refactor(evm): sort alphabetically fxs within the interfaces and rm some typos --- .../evm/contracts/interfaces/IAdapter.sol | 2 +- .../contracts/interfaces/IGiriGiriBashi.sol | 54 +++++++++---------- packages/evm/contracts/interfaces/IHashi.sol | 4 +- .../evm/contracts/interfaces/IShoyuBashi.sol | 32 +++++------ packages/evm/contracts/interfaces/IYaru.sol | 2 +- .../evm/contracts/ownable/GiriGiriBashi.sol | 8 +-- packages/evm/test/03_GiriGiriBashi.spec.ts | 24 +++++---- 7 files changed, 64 insertions(+), 62 deletions(-) diff --git a/packages/evm/contracts/interfaces/IAdapter.sol b/packages/evm/contracts/interfaces/IAdapter.sol index 0b4287ec..11ecb4f7 100644 --- a/packages/evm/contracts/interfaces/IAdapter.sol +++ b/packages/evm/contracts/interfaces/IAdapter.sol @@ -5,9 +5,9 @@ pragma solidity ^0.8.20; * @title IAdapter */ interface IAdapter { + error ConflictingBlockHeader(uint256 blockNumber, bytes32 blockHash, bytes32 storedBlockHash); error InvalidBlockHeaderLength(uint256 length); error InvalidBlockHeaderRLP(); - error ConflictingBlockHeader(uint256 blockNumber, bytes32 blockHash, bytes32 storedBlockHash); /** * @dev Emitted when a hash is stored. diff --git a/packages/evm/contracts/interfaces/IGiriGiriBashi.sol b/packages/evm/contracts/interfaces/IGiriGiriBashi.sol index 44db8f03..5cf5dd10 100644 --- a/packages/evm/contracts/interfaces/IGiriGiriBashi.sol +++ b/packages/evm/contracts/interfaces/IGiriGiriBashi.sol @@ -1,41 +1,41 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.20; -import { IHashi } from "./IHashi.sol"; import { IAdapter } from "./IAdapter.sol"; +import { IHashi } from "./IHashi.sol"; import { IShuSho } from "./IShuSho.sol"; /** * @title IGiriGiriBashi */ interface IGiriGiriBashi is IShuSho { - struct Settings { - bool quarantined; // whether or not the adapter has has been quarantined. - uint256 minimumBond; // amount that must be bonded alongside a challenge. - uint256 startId; // earliest id that the adapter could have stored. - uint256 idDepth; // how far behind the current head can this adapter safely report. 0 equals infinite. - uint256 timeout; // grace period in which the adapter must report on an in range id after being challenged. - } - struct Challenge { address payable challenger; // account that raised the challenge. uint256 timestamp; // timestamp when the challenge was created. uint256 bond; // bond paid by the challenger. } - error DuplicateChallenge(bytes32 challengeId, uint256 domain, uint256 id, IAdapter adapter); - error OutOfRange(IAdapter adapter, uint256 id); - error AlreadyQuarantined(IAdapter adapter); - error NotEnoughtValue(IAdapter adapter, uint256 value); - error ChallengeNotFound(bytes32 challengeId, uint256 domain, uint256 id, IAdapter adapter); + struct Settings { + bool quarantined; // whether or not the adapter has been quarantined. + uint256 minimumBond; // amount that must be bonded alongside a challenge. + uint256 startId; // earliest id that the adapter could have stored. + uint256 idDepth; // how far behind the current head can this adapter safely report. 0 equals infinite. + uint256 timeout; // grace period in which the adapter must report on an in-range id after being challenged. + } + error AdapterHasNotYetTimedOut(IAdapter adapter); - error UnequalArrayLengths(); error AdapterNotQuarantined(IAdapter adapter); + error AdaptersAgreed(IAdapter adapter1, IAdapter adapter2); + error AlreadyQuarantined(IAdapter adapter); error CannotProveNoConfidence(uint256 domain, uint256 id, IAdapter[] adapters); - error AdaptersAgreed(IAdapter, IAdapter); - error NoConfidenceRequired(); - error CountMustBeZero(uint256 domain); + error ChallengeNotFound(bytes32 challengeId, uint256 domain, uint256 id, IAdapter adapter); error ChallengeRangeAlreadySet(uint256 domain); + error CountMustBeZero(uint256 domain); + error DuplicateChallenge(bytes32 challengeId, uint256 domain, uint256 id, IAdapter adapter); + error NoConfidenceRequired(); + error NotEnoughValue(IAdapter adapter, uint256 value); + error OutOfRange(IAdapter adapter, uint256 id); + error UnequalArrayLengths(); /** * @dev Emitted when the bond recipient address is set. @@ -55,7 +55,7 @@ interface IGiriGiriBashi is IShuSho { * @param domain - The domain associated with the updated challenge range. * @param range - The new challenge range as a Uint256 identifier. */ - event ChallegenRangeUpdated(uint256 domain, uint256 range); + event ChallengeRangeUpdated(uint256 domain, uint256 range); /** * @dev Emitted when settings are initialized for a specific domain and adapter. @@ -109,7 +109,7 @@ interface IGiriGiriBashi is IShuSho { * @dev Emitted when a declaration of no confidence is made for a specific domain. * @param domain - The domain associated with the declaration. */ - event NoConfidenceDeclareed(uint256 domain); + event NoConfidenceDeclared(uint256 domain); /** * @dev Sets the threshold for a specific domain. @@ -134,7 +134,7 @@ interface IGiriGiriBashi is IShuSho { /** * @dev Challenges the adapter to provide a response. If the adapter fails, it can be quarantined. * @param domain - The Uint256 identifier for the domain. - * @param id - The Uint256 identifier for the challenge. + * @param id - The Uint256 identifier for the challenge. * @param adapter - The address of the adapter to challenge. * @notice Caller must pay a minimum bond to issue the challenge. This bond should be high enough to cover the gas costs for successfully completing the challenge. */ @@ -156,7 +156,7 @@ interface IGiriGiriBashi is IShuSho { ) external returns (bool); /** - * @dev show that enough adapters disagree that they could not make a threshold if the remainder all agree with one. + * @dev Show that enough adapters disagree that they could not make a threshold if the remainder all agree with one. * @param domain - The Uint256 identifier for the domain. * @param id - The Uint256 identifier. * @param adapters - An array of adapter instances. @@ -170,7 +170,7 @@ interface IGiriGiriBashi is IShuSho { * @param newAdapters - An array of new adapter instances to replace the current ones. * @param settings - An array of settings corresponding to the new adapters. */ - function replaceQuaratinedAdapters( + function replaceQuarantinedAdapters( uint256 domain, IAdapter[] memory currentAdapters, IAdapter[] memory newAdapters, @@ -210,7 +210,7 @@ interface IGiriGiriBashi is IShuSho { * @notice Revert if the adapters do not yet have the hash for the given ID. * @notice Reverts if no adapters are set for the given domain. */ - function getUnanimousHash(uint256 domain, uint256 id) external returns (bytes32 hash); + function getUnanimousHash(uint256 domain, uint256 id) external returns (bytes32); /** * @dev Returns the hash agreed upon by a threshold of the enabled adapters. @@ -220,7 +220,7 @@ interface IGiriGiriBashi is IShuSho { * @notice Reverts if no threshold is not reached. * @notice Reverts if no adapters are set for the given domain. */ - function getThresholdHash(uint256 domain, uint256 id) external returns (bytes32 hash); + function getThresholdHash(uint256 domain, uint256 id) external returns (bytes32); /** * @dev Returns the hash unanimously agreed upon by all of the given adapters. @@ -228,11 +228,11 @@ interface IGiriGiriBashi is IShuSho { * @param adapters - Array of adapter addresses to query. * @param id - Uint256 identifier to query. * @return hash - Bytes32 hash agreed upon by the adapters for the given domain. - * @notice adapters must be in numerical order from smallest to largest and contain no duplicates. + * @notice Adapters must be in numerical order from smallest to largest and contain no duplicates. * @notice Reverts if adapters are out of order or contain duplicates. * @notice Reverts if adapters disagree. * @notice Revert if the adapters do not yet have the hash for the given ID. * @notice Reverts if no adapters are set for the given domain. */ - function getHash(uint256 domain, uint256 id, IAdapter[] memory adapters) external returns (bytes32 hash); + function getHash(uint256 domain, uint256 id, IAdapter[] memory adapters) external returns (bytes32); } diff --git a/packages/evm/contracts/interfaces/IHashi.sol b/packages/evm/contracts/interfaces/IHashi.sol index acdce80e..fa883171 100644 --- a/packages/evm/contracts/interfaces/IHashi.sol +++ b/packages/evm/contracts/interfaces/IHashi.sol @@ -7,10 +7,10 @@ import { IAdapter } from "./IAdapter.sol"; * @title IHashi */ interface IHashi { + error AdaptersDisagree(IAdapter adapterOne, IAdapter adapterTwo); + error HashNotAvailableInAdapter(IAdapter adapter); error InvalidThreshold(uint256 threshold, uint256 maxThreshold); error NoAdaptersGiven(); - error HashNotAvailableInAdapter(IAdapter adapter); - error AdaptersDisagree(IAdapter adapterOne, IAdapter adapterTwo); /** * @dev Checks whether the threshold is reached for a message given a set of adapters. diff --git a/packages/evm/contracts/interfaces/IShoyuBashi.sol b/packages/evm/contracts/interfaces/IShoyuBashi.sol index 7974f254..15f43f46 100644 --- a/packages/evm/contracts/interfaces/IShoyuBashi.sol +++ b/packages/evm/contracts/interfaces/IShoyuBashi.sol @@ -10,39 +10,30 @@ import { IShuSho } from "./IShuSho.sol"; */ interface IShoyuBashi is IShuSho { /** - * @dev Sets the threshold of adapters required for a given domain. - * @param domain - Uint256 identifier for the domain for which to set the threshold. - * @param threshold - Uint256 threshold to set for the given domain. - * @notice Only callable by the owner of this contract. - * @notice Reverts if the threshold is already set to the given value. - */ - function setThreshold(uint256 domain, uint256 threshold) external; - - /** - * @dev Enables the given adapters for a given domain. + * @dev Disables the given adapters for a given domain. * @param domain - Uint256 identifier for the domain for which to set adapters. * @param adapters - Array of adapter addresses. - * @notice Reverts if adapters are out of order or contain duplicates. * @notice Only callable by the owner of this contract. + * @notice Reverts if adapters are out of order or contain duplicates. */ - function enableAdapters(uint256 domain, IAdapter[] memory adapters) external; + function disableAdapters(uint256 domain, IAdapter[] memory adapters) external; /** - * @dev Disables the given adapters for a given domain. + * @dev Enables the given adapters for a given domain. * @param domain - Uint256 identifier for the domain for which to set adapters. * @param adapters - Array of adapter addresses. - * @notice Reverts if adapters are out of order or contain duplicates. * @notice Only callable by the owner of this contract. + * @notice Reverts if adapters are out of order or contain duplicates. */ - function disableAdapters(uint256 domain, IAdapter[] memory adapters) external; + function enableAdapters(uint256 domain, IAdapter[] memory adapters) external; /** * @dev Returns the hash unanimously agreed upon by ALL of the enabled adapters. * @param domain - Uint256 identifier for the domain to query. * @param id - Uint256 identifier to query. * @return Bytes32 hash agreed upon by the adapters for the given domain. - * @notice Reverts if adapters disagree. * @notice Revert if the adapters do not yet have the hash for the given ID. + * @notice Reverts if adapters disagree. * @notice Reverts if no adapters are set for the given domain. */ function getUnanimousHash(uint256 domain, uint256 id) external view returns (bytes32); @@ -70,4 +61,13 @@ interface IShoyuBashi is IShuSho { * @notice Reverts if no adapters are set for the given domain. */ function getHash(uint256 domain, uint256 id, IAdapter[] memory adapters) external view returns (bytes32); + + /** + * @dev Sets the threshold of adapters required for a given domain. + * @param domain - Uint256 identifier for the domain for which to set the threshold. + * @param threshold - Uint256 threshold to set for the given domain. + * @notice Only callable by the owner of this contract. + * @notice Reverts if the threshold is already set to the given value. + */ + function setThreshold(uint256 domain, uint256 threshold) external; } diff --git a/packages/evm/contracts/interfaces/IYaru.sol b/packages/evm/contracts/interfaces/IYaru.sol index 4f26ad1f..77258293 100644 --- a/packages/evm/contracts/interfaces/IYaru.sol +++ b/packages/evm/contracts/interfaces/IYaru.sol @@ -9,9 +9,9 @@ import { IMessageIdCalculator } from "./IMessageIdCalculator.sol"; * @title IYaru */ interface IYaru is IMessageHashCalculator, IMessageIdCalculator { + error CallFailed(); error InvalidToChainId(uint256 chainId, uint256 expectedChainId); error MessageIdAlreadyExecuted(uint256 messageId); - error CallFailed(); error ThresholdNotMet(); /** diff --git a/packages/evm/contracts/ownable/GiriGiriBashi.sol b/packages/evm/contracts/ownable/GiriGiriBashi.sol index 265bbe75..ab114169 100644 --- a/packages/evm/contracts/ownable/GiriGiriBashi.sol +++ b/packages/evm/contracts/ownable/GiriGiriBashi.sol @@ -46,13 +46,13 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { function setChallengeRange(uint256 domain, uint256 range) public { if (challengeRanges[domain] != 0) revert ChallengeRangeAlreadySet(domain); challengeRanges[domain] = range; - emit ChallegenRangeUpdated(domain, range); + emit ChallengeRangeUpdated(domain, range); } /// @inheritdoc IGiriGiriBashi function challengeAdapter(uint256 domain, uint256 id, IAdapter adapter) public payable { if (adapters[domain][adapter].previous == IAdapter(address(0))) revert AdapterNotEnabled(adapter); - if (msg.value < settings[adapter].minimumBond) revert NotEnoughtValue(adapter, msg.value); + if (msg.value < settings[adapter].minimumBond) revert NotEnoughValue(adapter, msg.value); if (settings[adapter].quarantined) revert AlreadyQuarantined(adapter); bytes32 challengeId = getChallengeId(domain, id, adapter); @@ -156,11 +156,11 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { domains[domain].threshold = type(uint256).max; delete challengeRanges[domain]; - emit NoConfidenceDeclareed(domain); + emit NoConfidenceDeclared(domain); } /// @inheritdoc IGiriGiriBashi - function replaceQuaratinedAdapters( + function replaceQuarantinedAdapters( uint256 domain, IAdapter[] memory currentAdapters, IAdapter[] memory newAdapters, diff --git a/packages/evm/test/03_GiriGiriBashi.spec.ts b/packages/evm/test/03_GiriGiriBashi.spec.ts index 7fe37ee2..1ccd2e9b 100644 --- a/packages/evm/test/03_GiriGiriBashi.spec.ts +++ b/packages/evm/test/03_GiriGiriBashi.spec.ts @@ -271,7 +271,7 @@ describe("GiriGiriBashi", function () { [settings, settings], ) await expect(giriGiriBashi.challengeAdapter(DOMAIN_ID, 1, mockAdapter.address)) - .to.be.revertedWithCustomError(giriGiriBashi, "NotEnoughtValue") + .to.be.revertedWithCustomError(giriGiriBashi, "NotEnoughValue") .withArgs(mockAdapter.address, 0) }) it("Reverts if adapter is already quarantined", async function () { @@ -606,12 +606,12 @@ describe("GiriGiriBashi", function () { expect(domain.threshold).to.equal(ethers.constants.MaxUint256) expect(challengeRange).to.equal(0) }) - it("Emits NoConfidenceDeclareed() event", async function () { + it("Emits NoConfidenceDeclared() event", async function () { const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() const adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses) await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) await expect(giriGiriBashi.declareNoConfidence(DOMAIN_ID, 20, adapters)) - .to.emit(giriGiriBashi, "NoConfidenceDeclareed") + .to.emit(giriGiriBashi, "NoConfidenceDeclared") .withArgs(DOMAIN_ID) }) }) @@ -641,15 +641,15 @@ describe("GiriGiriBashi", function () { const challengeRange = await giriGiriBashi.challengeRanges(2) expect(challengeRange).to.equal(CHALLENGE_RANGE) }) - it("Emits the ChallegenRangeUpdated event", async function () { + it("Emits the ChallengeRangeUpdated event", async function () { const { giriGiriBashi } = await setup() await expect(giriGiriBashi.setChallengeRange(2, CHALLENGE_RANGE)) - .to.emit(giriGiriBashi, "ChallegenRangeUpdated") + .to.emit(giriGiriBashi, "ChallengeRangeUpdated") .withArgs(2, CHALLENGE_RANGE) }) }) - describe("replaceQuaratinedAdapters()", function () { + describe("replaceQuarantinedAdapters()", function () { it("Reverts if given arrays are unequal length", async function () { const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() await giriGiriBashi.enableAdapters( @@ -658,7 +658,7 @@ describe("GiriGiriBashi", function () { [settings, settings], ) await expect( - giriGiriBashi.replaceQuaratinedAdapters( + giriGiriBashi.replaceQuarantinedAdapters( DOMAIN_ID, [mockAdapter.address, secondMockAdapter.address], [ADDRESS_ZERO], @@ -666,7 +666,7 @@ describe("GiriGiriBashi", function () { ), ).to.be.revertedWithCustomError(giriGiriBashi, "UnequalArrayLengths") await expect( - giriGiriBashi.replaceQuaratinedAdapters( + giriGiriBashi.replaceQuarantinedAdapters( DOMAIN_ID, [mockAdapter.address], [ADDRESS_ZERO, ADDRESS_ZERO], @@ -674,7 +674,7 @@ describe("GiriGiriBashi", function () { ), ).to.be.revertedWithCustomError(giriGiriBashi, "UnequalArrayLengths") await expect( - giriGiriBashi.replaceQuaratinedAdapters( + giriGiriBashi.replaceQuarantinedAdapters( DOMAIN_ID, [mockAdapter.address, secondMockAdapter.address], [ADDRESS_ZERO, ADDRESS_ZERO], @@ -690,7 +690,7 @@ describe("GiriGiriBashi", function () { [settings, settings], ) await expect( - giriGiriBashi.replaceQuaratinedAdapters( + giriGiriBashi.replaceQuarantinedAdapters( DOMAIN_ID, [mockAdapter.address, secondMockAdapter.address], [ADDRESS_ZERO, ADDRESS_ZERO], @@ -717,7 +717,9 @@ describe("GiriGiriBashi", function () { mockAdapter.address, [secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses), ) - expect(await giriGiriBashi.replaceQuaratinedAdapters(DOMAIN_ID, [mockAdapter.address], [ADDRESS_TWO], [settings])) + expect( + await giriGiriBashi.replaceQuarantinedAdapters(DOMAIN_ID, [mockAdapter.address], [ADDRESS_TWO], [settings]), + ) const adapterSettings = await giriGiriBashi.settings(ADDRESS_TWO) expect(adapterSettings.quarantined).to.deep.equal(settings.quarantined) expect(adapterSettings.minimumBond).to.deep.equal(settings.minimumBond) From ccd5be5c43d8108c2f1ca51bc9b2ad623de6c37f Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 31 Jan 2024 14:51:53 +0100 Subject: [PATCH 122/297] refactor(evm): sort alphabetically fxs within the implementations --- .../contracts/interfaces/IGiriGiriBashi.sol | 154 +++++++-------- packages/evm/contracts/interfaces/IShuSho.sol | 28 +-- .../evm/contracts/ownable/GiriGiriBashi.sol | 180 +++++++++--------- 3 files changed, 181 insertions(+), 181 deletions(-) diff --git a/packages/evm/contracts/interfaces/IGiriGiriBashi.sol b/packages/evm/contracts/interfaces/IGiriGiriBashi.sol index 5cf5dd10..2b917028 100644 --- a/packages/evm/contracts/interfaces/IGiriGiriBashi.sol +++ b/packages/evm/contracts/interfaces/IGiriGiriBashi.sol @@ -43,28 +43,6 @@ interface IGiriGiriBashi is IShuSho { */ event BondRecipientSet(address payable bondRecipient); - /** - * @dev Emitted when a new head is updated. - * @param domain - The domain associated with the new head. - * @param head - The new head as a Uint256 identifier. - */ - event NewHead(uint256 domain, uint256 head); - - /** - * @dev Emitted when the challenge range is updated. - * @param domain - The domain associated with the updated challenge range. - * @param range - The new challenge range as a Uint256 identifier. - */ - event ChallengeRangeUpdated(uint256 domain, uint256 range); - - /** - * @dev Emitted when settings are initialized for a specific domain and adapter. - * @param domain - The domain associated with the initialized settings. - * @param adapter - The adapter address associated with the initialized settings. - * @param settings - The initialized settings object. - */ - event SettingsInitialized(uint256 domain, IAdapter adapter, Settings settings); - /** * @dev Emitted when a challenge is created. * @param challengeId - The unique identifier for the challenge. @@ -85,6 +63,13 @@ interface IGiriGiriBashi is IShuSho { uint256 bond ); + /** + * @dev Emitted when the challenge range is updated. + * @param domain - The domain associated with the updated challenge range. + * @param range - The new challenge range as a Uint256 identifier. + */ + event ChallengeRangeUpdated(uint256 domain, uint256 range); + /** * @dev Emitted when a challenge is resolved. * @param challengeId - The unique identifier for the resolved challenge. @@ -106,30 +91,25 @@ interface IGiriGiriBashi is IShuSho { ); /** - * @dev Emitted when a declaration of no confidence is made for a specific domain. - * @param domain - The domain associated with the declaration. - */ - event NoConfidenceDeclared(uint256 domain); - - /** - * @dev Sets the threshold for a specific domain. - * @param domain - The Uint256 identifier for the domain. - * @param threshold - The Uint256 threshold to set for the given domain. + * @dev Emitted when a new head is updated. + * @param domain - The domain associated with the new head. + * @param head - The new head as a Uint256 identifier. */ - function setThreshold(uint256 domain, uint256 threshold) external; + event NewHead(uint256 domain, uint256 head); /** - * @dev Sets the bond recipient address for payments. - * @param bondRecipient - The address where bond payments should be sent. + * @dev Emitted when a declaration of no confidence is made for a specific domain. + * @param domain - The domain associated with the declaration. */ - function setBondRecipient(address payable bondRecipient) external; + event NoConfidenceDeclared(uint256 domain); /** - * @dev Sets the challenge range for a specific domain. - * @param domain - The Uint256 identifier for the domain. - * @param range - The Uint256 range to set for the given domain. + * @dev Emitted when settings are initialized for a specific domain and adapter. + * @param domain - The domain associated with the initialized settings. + * @param adapter - The adapter address associated with the initialized settings. + * @param settings - The initialized settings object. */ - function setChallengeRange(uint256 domain, uint256 range) external; + event SettingsInitialized(uint256 domain, IAdapter adapter, Settings settings); /** * @dev Challenges the adapter to provide a response. If the adapter fails, it can be quarantined. @@ -140,21 +120,6 @@ interface IGiriGiriBashi is IShuSho { */ function challengeAdapter(uint256 domain, uint256 id, IAdapter adapter) external payable; - /** - * @dev Resolves a challenge by comparing results from a specific adapter with others. - * @param domain - The Uint256 identifier for the domain. - * @param id - The Uint256 identifier. - * @param adapter - The adapter instance for comparison. - * @param adapters - An array of adapter instances for comparison. - * @return A boolean indicating the success of the challenge resolution. - */ - function resolveChallenge( - uint256 domain, - uint256 id, - IAdapter adapter, - IAdapter[] memory adapters - ) external returns (bool); - /** * @dev Show that enough adapters disagree that they could not make a threshold if the remainder all agree with one. * @param domain - The Uint256 identifier for the domain. @@ -163,20 +128,6 @@ interface IGiriGiriBashi is IShuSho { */ function declareNoConfidence(uint256 domain, uint256 id, IAdapter[] memory adapters) external; - /** - * @dev Replaces the quarantined adapters for a given domain with new adapters and settings. - * @param domain - The Uint256 identifier for the domain. - * @param currentAdapters - An array of current adapter instances to be replaced. - * @param newAdapters - An array of new adapter instances to replace the current ones. - * @param settings - An array of settings corresponding to the new adapters. - */ - function replaceQuarantinedAdapters( - uint256 domain, - IAdapter[] memory currentAdapters, - IAdapter[] memory newAdapters, - Settings[] memory settings - ) external; - /** * @dev Disables a set of adapters for a given domain. * @param domain - The Uint256 identifier for the domain. @@ -202,25 +153,25 @@ interface IGiriGiriBashi is IShuSho { function getChallengeId(uint256 domain, uint256 id, IAdapter adapter) external pure returns (bytes32); /** - * @dev Returns the hash unanimously agreed upon by ALL of the enabled adapters. + * @dev Returns the hash agreed upon by a threshold of the enabled adapters. * @param domain - Uint256 identifier for the domain to query. * @param id - Uint256 identifier to query. - * @return hash - Bytes32 hash agreed upon by the adapters for the given domain. - * @notice Reverts if adapters disagree. - * @notice Revert if the adapters do not yet have the hash for the given ID. + * @return hash - Bytes32 hash agreed upon by a threshold of the adapters for the given domain. + * @notice Reverts if no threshold is not reached. * @notice Reverts if no adapters are set for the given domain. */ - function getUnanimousHash(uint256 domain, uint256 id) external returns (bytes32); + function getThresholdHash(uint256 domain, uint256 id) external returns (bytes32); /** - * @dev Returns the hash agreed upon by a threshold of the enabled adapters. + * @dev Returns the hash unanimously agreed upon by ALL of the enabled adapters. * @param domain - Uint256 identifier for the domain to query. * @param id - Uint256 identifier to query. - * @return hash - Bytes32 hash agreed upon by a threshold of the adapters for the given domain. - * @notice Reverts if no threshold is not reached. + * @return hash - Bytes32 hash agreed upon by the adapters for the given domain. + * @notice Reverts if adapters disagree. + * @notice Revert if the adapters do not yet have the hash for the given ID. * @notice Reverts if no adapters are set for the given domain. */ - function getThresholdHash(uint256 domain, uint256 id) external returns (bytes32); + function getUnanimousHash(uint256 domain, uint256 id) external returns (bytes32); /** * @dev Returns the hash unanimously agreed upon by all of the given adapters. @@ -235,4 +186,53 @@ interface IGiriGiriBashi is IShuSho { * @notice Reverts if no adapters are set for the given domain. */ function getHash(uint256 domain, uint256 id, IAdapter[] memory adapters) external returns (bytes32); + + /** + * @dev Replaces the quarantined adapters for a given domain with new adapters and settings. + * @param domain - The Uint256 identifier for the domain. + * @param currentAdapters - An array of current adapter instances to be replaced. + * @param newAdapters - An array of new adapter instances to replace the current ones. + * @param settings - An array of settings corresponding to the new adapters. + */ + function replaceQuarantinedAdapters( + uint256 domain, + IAdapter[] memory currentAdapters, + IAdapter[] memory newAdapters, + Settings[] memory settings + ) external; + + /** + * @dev Resolves a challenge by comparing results from a specific adapter with others. + * @param domain - The Uint256 identifier for the domain. + * @param id - The Uint256 identifier. + * @param adapter - The adapter instance for comparison. + * @param adapters - An array of adapter instances for comparison. + * @return A boolean indicating the success of the challenge resolution. + */ + function resolveChallenge( + uint256 domain, + uint256 id, + IAdapter adapter, + IAdapter[] memory adapters + ) external returns (bool); + + /** + * @dev Sets the bond recipient address for payments. + * @param bondRecipient - The address where bond payments should be sent. + */ + function setBondRecipient(address payable bondRecipient) external; + + /** + * @dev Sets the challenge range for a specific domain. + * @param domain - The Uint256 identifier for the domain. + * @param range - The Uint256 range to set for the given domain. + */ + function setChallengeRange(uint256 domain, uint256 range) external; + + /** + * @dev Sets the threshold for a specific domain. + * @param domain - The Uint256 identifier for the domain. + * @param threshold - The Uint256 threshold to set for the given domain. + */ + function setThreshold(uint256 domain, uint256 threshold) external; } diff --git a/packages/evm/contracts/interfaces/IShuSho.sol b/packages/evm/contracts/interfaces/IShuSho.sol index 4c44df1e..97feeecf 100644 --- a/packages/evm/contracts/interfaces/IShuSho.sol +++ b/packages/evm/contracts/interfaces/IShuSho.sol @@ -29,17 +29,11 @@ interface IShuSho { error ThresholdNotMet(); /** - * @dev Emitted when the address of the IHashi contract is set. - * @param hashi - The address of the IHashi contract associated with this event. - */ - event HashiSet(IHashi indexed hashi); - - /** - * @dev Emitted when initialization occurs with the owner's address and the IHashi contract address. - * @param owner - The address of the owner associated with this event. - * @param hashi - The address of the IHashi contract associated with this event. + * @dev Emitted when adapters are disabled for a specific domain. + * @param domain - The domain associated with the disabled adapters. + * @param adapters - An array of disabled adapter addresses associated with this event. */ - event Init(address indexed owner, IHashi indexed hashi); + event AdaptersDisabled(uint256 indexed domain, IAdapter[] adapters); /** * @dev Emitted when adapters are enabled for a specific domain. @@ -49,11 +43,17 @@ interface IShuSho { event AdaptersEnabled(uint256 indexed domain, IAdapter[] adapters); /** - * @dev Emitted when adapters are disabled for a specific domain. - * @param domain - The domain associated with the disabled adapters. - * @param adapters - An array of disabled adapter addresses associated with this event. + * @dev Emitted when the address of the IHashi contract is set. + * @param hashi - The address of the IHashi contract associated with this event. */ - event AdaptersDisabled(uint256 indexed domain, IAdapter[] adapters); + event HashiSet(IHashi indexed hashi); + + /** + * @dev Emitted when initialization occurs with the owner's address and the IHashi contract address. + * @param owner - The address of the owner associated with this event. + * @param hashi - The address of the IHashi contract associated with this event. + */ + event Init(address indexed owner, IHashi indexed hashi); /** * @dev Emitted when the threshold is set for a specific domain. diff --git a/packages/evm/contracts/ownable/GiriGiriBashi.sol b/packages/evm/contracts/ownable/GiriGiriBashi.sol index ab114169..122f8273 100644 --- a/packages/evm/contracts/ownable/GiriGiriBashi.sol +++ b/packages/evm/contracts/ownable/GiriGiriBashi.sol @@ -27,28 +27,6 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { _; } - function setHashi(IHashi _hashi) public override onlyInitializing { - _setHashi(_hashi); - } - - /// @inheritdoc IGiriGiriBashi - function setThreshold(uint256 domain, uint256 threshold) public zeroCount(domain) { - _setThreshold(domain, threshold); - } - - /// @inheritdoc IGiriGiriBashi - function setBondRecipient(address payable _bondRecipient) public onlyOwner { - bondRecipient = _bondRecipient; - emit BondRecipientSet(_bondRecipient); - } - - /// @inheritdoc IGiriGiriBashi - function setChallengeRange(uint256 domain, uint256 range) public { - if (challengeRanges[domain] != 0) revert ChallengeRangeAlreadySet(domain); - challengeRanges[domain] = range; - emit ChallengeRangeUpdated(domain, range); - } - /// @inheritdoc IGiriGiriBashi function challengeAdapter(uint256 domain, uint256 id, IAdapter adapter) public payable { if (adapters[domain][adapter].previous == IAdapter(address(0))) revert AdapterNotEnabled(adapter); @@ -79,6 +57,85 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { emit ChallengeCreated(challengeId, domain, id, adapter, msg.sender, block.timestamp, msg.value); } + /// @inheritdoc IGiriGiriBashi + function enableAdapters( + uint256 domain, + IAdapter[] memory _adapters, + Settings[] memory _settings + ) public zeroCount(domain) { + _enableAdapters(domain, _adapters); + initSettings(domain, _adapters, _settings); + } + + /// @inheritdoc IGiriGiriBashi + function declareNoConfidence(uint256 domain, uint256 id, IAdapter[] memory _adapters) public { + checkAdapterOrderAndValidity(domain, _adapters); + (uint256 threshold, uint256 count) = getThresholdAndCount(domain); + + // check that there are enough adapters to prove no confidence + uint256 confidence = (count - _adapters.length) + 1; + if (confidence >= threshold) revert CannotProveNoConfidence(domain, id, _adapters); + + bytes32[] memory hashes = new bytes32[](_adapters.length); + for (uint i = 0; i < _adapters.length; i++) hashes[i] = _adapters[i].getHash(domain, id); + + // prove that each member of _adapters disagrees + for (uint i = 0; i < hashes.length; i++) + for (uint j = 0; j < hashes.length; j++) + if (hashes[i] == hashes[j] && i != j) revert AdaptersAgreed(_adapters[i], _adapters[j]); + + domains[domain].threshold = type(uint256).max; + delete challengeRanges[domain]; + + emit NoConfidenceDeclared(domain); + } + + /// @inheritdoc IGiriGiriBashi + function disableAdapters(uint256 domain, IAdapter[] memory _adapters) public noConfidence(domain) { + _disableAdapters(domain, _adapters); + if (domains[domain].count == 0) domains[domain].threshold = 0; + } + + /// @inheritdoc IGiriGiriBashi + function getChallengeId(uint256 domain, uint256 id, IAdapter adapter) public pure returns (bytes32 challengeId) { + challengeId = keccak256(abi.encodePacked(domain, id, adapter)); + } + + /// @inheritdoc IGiriGiriBashi + function getThresholdHash(uint256 domain, uint256 id) public returns (bytes32 hash) { + hash = _getThresholdHash(domain, id); + updateHead(domain, id); + } + + /// @inheritdoc IGiriGiriBashi + function getUnanimousHash(uint256 domain, uint256 id) public returns (bytes32 hash) { + hash = _getUnanimousHash(domain, id); + updateHead(domain, id); + } + + /// @inheritdoc IGiriGiriBashi + function getHash(uint256 domain, uint256 id, IAdapter[] memory _adapters) public returns (bytes32 hash) { + hash = _getHash(domain, id, _adapters); + updateHead(domain, id); + } + + /// @inheritdoc IGiriGiriBashi + function replaceQuarantinedAdapters( + uint256 domain, + IAdapter[] memory currentAdapters, + IAdapter[] memory newAdapters, + Settings[] memory _settings + ) public onlyOwner { + if (currentAdapters.length != newAdapters.length || currentAdapters.length != _settings.length) + revert UnequalArrayLengths(); + for (uint i = 0; i < currentAdapters.length; i++) { + if (!settings[currentAdapters[i]].quarantined) revert AdapterNotQuarantined(currentAdapters[i]); + } + _disableAdapters(domain, currentAdapters); + _enableAdapters(domain, newAdapters); + initSettings(domain, newAdapters, _settings); + } + /// @inheritdoc IGiriGiriBashi function resolveChallenge( uint256 domain, @@ -137,82 +194,25 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { } /// @inheritdoc IGiriGiriBashi - function declareNoConfidence(uint256 domain, uint256 id, IAdapter[] memory _adapters) public { - checkAdapterOrderAndValidity(domain, _adapters); - (uint256 threshold, uint256 count) = getThresholdAndCount(domain); - - // check that there are enough adapters to prove no confidence - uint256 confidence = (count - _adapters.length) + 1; - if (confidence >= threshold) revert CannotProveNoConfidence(domain, id, _adapters); - - bytes32[] memory hashes = new bytes32[](_adapters.length); - for (uint i = 0; i < _adapters.length; i++) hashes[i] = _adapters[i].getHash(domain, id); - - // prove that each member of _adapters disagrees - for (uint i = 0; i < hashes.length; i++) - for (uint j = 0; j < hashes.length; j++) - if (hashes[i] == hashes[j] && i != j) revert AdaptersAgreed(_adapters[i], _adapters[j]); - - domains[domain].threshold = type(uint256).max; - delete challengeRanges[domain]; - - emit NoConfidenceDeclared(domain); - } - - /// @inheritdoc IGiriGiriBashi - function replaceQuarantinedAdapters( - uint256 domain, - IAdapter[] memory currentAdapters, - IAdapter[] memory newAdapters, - Settings[] memory _settings - ) public onlyOwner { - if (currentAdapters.length != newAdapters.length || currentAdapters.length != _settings.length) - revert UnequalArrayLengths(); - for (uint i = 0; i < currentAdapters.length; i++) { - if (!settings[currentAdapters[i]].quarantined) revert AdapterNotQuarantined(currentAdapters[i]); - } - _disableAdapters(domain, currentAdapters); - _enableAdapters(domain, newAdapters); - initSettings(domain, newAdapters, _settings); - } - - /// @inheritdoc IGiriGiriBashi - function disableAdapters(uint256 domain, IAdapter[] memory _adapters) public noConfidence(domain) { - _disableAdapters(domain, _adapters); - if (domains[domain].count == 0) domains[domain].threshold = 0; - } - - /// @inheritdoc IGiriGiriBashi - function enableAdapters( - uint256 domain, - IAdapter[] memory _adapters, - Settings[] memory _settings - ) public zeroCount(domain) { - _enableAdapters(domain, _adapters); - initSettings(domain, _adapters, _settings); - } - - /// @inheritdoc IGiriGiriBashi - function getChallengeId(uint256 domain, uint256 id, IAdapter adapter) public pure returns (bytes32 challengeId) { - challengeId = keccak256(abi.encodePacked(domain, id, adapter)); + function setBondRecipient(address payable _bondRecipient) public onlyOwner { + bondRecipient = _bondRecipient; + emit BondRecipientSet(_bondRecipient); } /// @inheritdoc IGiriGiriBashi - function getUnanimousHash(uint256 domain, uint256 id) public returns (bytes32 hash) { - hash = _getUnanimousHash(domain, id); - updateHead(domain, id); + function setChallengeRange(uint256 domain, uint256 range) public { + if (challengeRanges[domain] != 0) revert ChallengeRangeAlreadySet(domain); + challengeRanges[domain] = range; + emit ChallengeRangeUpdated(domain, range); } - /// @inheritdoc IGiriGiriBashi - function getThresholdHash(uint256 domain, uint256 id) public returns (bytes32 hash) { - hash = _getThresholdHash(domain, id); - updateHead(domain, id); + function setHashi(IHashi _hashi) public override onlyInitializing { + _setHashi(_hashi); } /// @inheritdoc IGiriGiriBashi - function getHash(uint256 domain, uint256 id, IAdapter[] memory _adapters) public returns (bytes32 hash) { - hash = _getHash(domain, id, _adapters); - updateHead(domain, id); + function setThreshold(uint256 domain, uint256 threshold) public zeroCount(domain) { + _setThreshold(domain, threshold); } function initSettings(uint256 domain, IAdapter[] memory _adapters, Settings[] memory _settings) private { From 76b69fe358750127faff7867a585bc4167ebddd0 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 31 Jan 2024 15:01:18 +0100 Subject: [PATCH 123/297] refactor(evm): adds missing // solhint-disable no-empty-blocks --- packages/evm/contracts/adapters/Axelar/AxelarAdapter.sol | 2 +- packages/evm/contracts/adapters/Chainlink/CCIPAdapter.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/evm/contracts/adapters/Axelar/AxelarAdapter.sol b/packages/evm/contracts/adapters/Axelar/AxelarAdapter.sol index 764948b8..b50d28ad 100644 --- a/packages/evm/contracts/adapters/Axelar/AxelarAdapter.sol +++ b/packages/evm/contracts/adapters/Axelar/AxelarAdapter.sol @@ -16,7 +16,7 @@ contract AxelarAdapter is BlockHashAdapter, Ownable, AxelarExecutable { event ReporterSet(uint256 indexed chainId, string name, string indexed reporter); - constructor(address axelarGateway) AxelarExecutable(axelarGateway) {} + constructor(address axelarGateway) AxelarExecutable(axelarGateway) {} // solhint-disable no-empty-blocks function setReporterByChain( uint256 chainId, diff --git a/packages/evm/contracts/adapters/Chainlink/CCIPAdapter.sol b/packages/evm/contracts/adapters/Chainlink/CCIPAdapter.sol index 558148ee..90dea4da 100644 --- a/packages/evm/contracts/adapters/Chainlink/CCIPAdapter.sol +++ b/packages/evm/contracts/adapters/Chainlink/CCIPAdapter.sol @@ -16,7 +16,7 @@ contract CCIPAdapter is BlockHashAdapter, Ownable, CCIPReceiver { event ReporterSet(uint256 indexed chainId, uint64 indexed chainSelector, address indexed reporter); - constructor(address ccipRouter) CCIPReceiver(ccipRouter) {} + constructor(address ccipRouter) CCIPReceiver(ccipRouter) {} // solhint-disable no-empty-blocks function setReporterByChain(uint256 chainId, uint64 chainSelector, address reporter) external onlyOwner { enabledReporters[chainSelector] = reporter; From 48fd469b33c84bbd4950234960780ee57689a618 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 1 Feb 2024 07:58:08 +0100 Subject: [PATCH 124/297] refactor(evm): rn toChainId into targetChainId --- packages/evm/contracts/Yaho.sol | 35 ++++++++------- packages/evm/contracts/Yaru.sol | 2 +- .../contracts/adapters/AMB/AMBReporter.sol | 10 ++--- .../adapters/Axelar/AxelarReporter.sol | 10 ++--- .../adapters/Celer/CelerReporter.sol | 4 +- .../adapters/Chainlink/CCIPReporter.sol | 8 ++-- .../adapters/Connext/ConnextReporter.sol | 8 ++-- .../adapters/Hyperlane/HyperlaneReporter.sol | 8 ++-- .../adapters/LayerZero/LayerZeroReporter.sol | 8 ++-- .../L1CrossDomainMessengerReporter.sol | 10 ++--- .../adapters/PNetwork/PNetworkReporter.sol | 10 ++--- packages/evm/contracts/adapters/Reporter.sol | 14 +++--- .../adapters/Sygma/SygmaReporter.sol | 14 +++--- .../adapters/ZetaChain/ZetaReporter.sol | 4 +- .../evm/contracts/interfaces/IMessage.sol | 2 +- .../evm/contracts/interfaces/IReporter.sol | 16 +++---- packages/evm/contracts/interfaces/IYaho.sol | 20 ++++----- packages/evm/test/04_Yaho.spec.ts | 44 +++++++++---------- .../evm/test/adapters/03_Reporter.spec.ts | 20 ++++----- packages/evm/test/utils/Message.ts | 10 ++--- 20 files changed, 129 insertions(+), 128 deletions(-) diff --git a/packages/evm/contracts/Yaho.sol b/packages/evm/contracts/Yaho.sol index dc23bbe3..0422b3e9 100644 --- a/packages/evm/contracts/Yaho.sol +++ b/packages/evm/contracts/Yaho.sol @@ -13,7 +13,7 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { /// @inheritdoc IYaho function dispatchMessage( - uint256 toChainId, + uint256 targetChainId, uint256 threshold, address receiver, bytes calldata data, @@ -21,13 +21,13 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { IAdapter[] calldata adapters ) external returns (uint256) { _checkReportersAndAdapters(threshold, reporters, adapters); - (uint256 messageId, ) = _dispatchMessage(toChainId, threshold, receiver, data, reporters, adapters); + (uint256 messageId, ) = _dispatchMessage(targetChainId, threshold, receiver, data, reporters, adapters); return messageId; } /// @inheritdoc IYaho function dispatchMessageToAdapters( - uint256 toChainId, + uint256 targetChainId, uint256 threshold, address receiver, bytes calldata data, @@ -36,7 +36,7 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { ) external payable returns (uint256, bytes32[] memory) { _checkReportersAndAdapters(threshold, reporters, adapters); (uint256 messageId, bytes32 messageHash) = _dispatchMessage( - toChainId, + targetChainId, threshold, receiver, data, @@ -44,7 +44,7 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { adapters ); bytes32[] memory reportersReceipts = _dispatchMessageToAdapters( - toChainId, + targetChainId, messageId, messageHash, reporters, @@ -55,7 +55,7 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { /// @inheritdoc IYaho function dispatchMessagesToAdapters( - uint256 toChainId, + uint256 targetChainId, uint256[] calldata thresholds, address[] calldata receivers, bytes[] calldata data, @@ -70,7 +70,7 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { for (uint256 i = 0; i < receivers.length; ) { _checkReportersAndAdapters(thresholds[i], reporters, adapters); (messageIds[i], messageHashes[i]) = _dispatchMessage( - toChainId, + targetChainId, thresholds[i], receivers[i], data[i], @@ -83,7 +83,7 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { } bytes32[] memory reportersReceipts = new bytes32[](reporters.length); - reportersReceipts = _dispatchMessagesToAdapters(toChainId, messageIds, messageHashes, reporters, adapters); + reportersReceipts = _dispatchMessagesToAdapters(targetChainId, messageIds, messageHashes, reporters, adapters); return (messageIds, reportersReceipts); } @@ -97,7 +97,7 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { if (messages.length == 0) revert NoMessagesGiven(); bytes32 expectedParams = keccak256( - abi.encode(messages[0].toChainId, messages[0].reporters, messages[0].adapters) + abi.encode(messages[0].targetChainId, messages[0].reporters, messages[0].adapters) ); bytes32[] memory messageHashes = new bytes32[](messages.length); @@ -105,7 +105,8 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { for (uint256 i = 0; i < messages.length; i++) { Message memory message = messages[i]; if ( - i > 0 && expectedParams != keccak256(abi.encode(message.toChainId, message.reporters, message.adapters)) + i > 0 && + expectedParams != keccak256(abi.encode(message.targetChainId, message.reporters, message.adapters)) ) revert InvalidMessage(message); uint256 messageId = calculateMessageId(block.chainid, address(this), calculateMessageHash(message)); bytes32 messageHash = _pendingMessageHashes[messageId]; @@ -116,7 +117,7 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { return _dispatchMessagesToAdapters( - messages[0].toChainId, + messages[0].targetChainId, messageIds, messageHashes, messages[0].reporters, @@ -136,7 +137,7 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { } function _dispatchMessage( - uint256 toChainId, + uint256 targetChainId, uint256 threshold, address receiver, bytes calldata data, @@ -146,7 +147,7 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { address sender = msg.sender; Message memory message = Message( keccak256(abi.encode(blockhash(block.number - 1), gasleft())), - toChainId, + targetChainId, threshold, sender, receiver, @@ -162,7 +163,7 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { } function _dispatchMessageToAdapters( - uint256 toChainId, + uint256 targetChainId, uint256 messageId, bytes32 messageHash, IReporter[] memory reporters, @@ -172,11 +173,11 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { bytes32[] memory messageHashes = new bytes32[](1); messageIds[0] = messageId; messageHashes[0] = messageHash; - return _dispatchMessagesToAdapters(toChainId, messageIds, messageHashes, reporters, adapters); + return _dispatchMessagesToAdapters(targetChainId, messageIds, messageHashes, reporters, adapters); } function _dispatchMessagesToAdapters( - uint256 toChainId, + uint256 targetChainId, uint256[] memory messageIds, bytes32[] memory messageHashes, IReporter[] memory reporters, @@ -185,7 +186,7 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { bytes32[] memory reportersReceipts = new bytes32[](reporters.length); for (uint256 i = 0; i < reporters.length; ) { - reportersReceipts[i] = reporters[i].dispatchMessages(toChainId, adapters[i], messageIds, messageHashes); + reportersReceipts[i] = reporters[i].dispatchMessages(targetChainId, adapters[i], messageIds, messageHashes); unchecked { ++i; } diff --git a/packages/evm/contracts/Yaru.sol b/packages/evm/contracts/Yaru.sol index 452e2dcc..514cdc71 100644 --- a/packages/evm/contracts/Yaru.sol +++ b/packages/evm/contracts/Yaru.sol @@ -31,7 +31,7 @@ contract Yaru is IYaru, MessageIdCalculator, MessageHashCalculator, ReentrancyGu bytes32 messageHash = calculateMessageHash(message); uint256 messageId = calculateMessageId(SOURCE_CHAIN_ID, YAHO, messageHash); - if (message.toChainId != block.chainid) revert InvalidToChainId(message.toChainId, block.chainid); + if (message.targetChainId != block.chainid) revert InvalidToChainId(message.targetChainId, block.chainid); if (executed[messageId]) revert MessageIdAlreadyExecuted(messageId); executed[messageId] = true; diff --git a/packages/evm/contracts/adapters/AMB/AMBReporter.sol b/packages/evm/contracts/adapters/AMB/AMBReporter.sol index 7f573728..4b5d9703 100644 --- a/packages/evm/contracts/adapters/AMB/AMBReporter.sol +++ b/packages/evm/contracts/adapters/AMB/AMBReporter.sol @@ -11,7 +11,7 @@ contract AMBReporter is Reporter { address public immutable AMB; uint256 public immutable GAS; - uint256 public immutable TO_CHAIN_ID; + uint256 public immutable TARGET_CHAIN_ID; error InvalidToChainId(uint256 chainId, uint256 expectedChainId); @@ -19,21 +19,21 @@ contract AMBReporter is Reporter { address headerStorage, address yaho, address amb, - uint256 toChainId, + uint256 targetChainId, uint256 gas ) Reporter(headerStorage, yaho) { AMB = amb; - TO_CHAIN_ID = toChainId; + TARGET_CHAIN_ID = targetChainId; GAS = gas; } function _dispatch( - uint256 toChainId, + uint256 targetChainId, address adapter, uint256[] memory ids, bytes32[] memory hashes ) internal override returns (bytes32) { - if (toChainId != TO_CHAIN_ID) revert InvalidToChainId(toChainId, TO_CHAIN_ID); + if (targetChainId != TARGET_CHAIN_ID) revert InvalidToChainId(targetChainId, TARGET_CHAIN_ID); bytes memory payload = abi.encodeCall(AMBAdapter.storeHashes, (ids, hashes)); return IAMB(AMB).requireToPassMessage(adapter, payload, GAS); } diff --git a/packages/evm/contracts/adapters/Axelar/AxelarReporter.sol b/packages/evm/contracts/adapters/Axelar/AxelarReporter.sol index 213ca88b..3141cd20 100644 --- a/packages/evm/contracts/adapters/Axelar/AxelarReporter.sol +++ b/packages/evm/contracts/adapters/Axelar/AxelarReporter.sol @@ -37,13 +37,13 @@ contract AxelarReporter is Reporter, Ownable { } function _dispatch( - uint256 toChainId, + uint256 targetChainId, address adapter, uint256[] memory ids, bytes32[] memory hashes ) internal override returns (bytes32) { - string memory chainName = chainNames[toChainId]; - if (keccak256(abi.encode(chainName)) == NULL_STRING) revert ChainIdNotSupported(toChainId); + string memory targetChainName = chainNames[targetChainId]; + if (keccak256(abi.encode(targetChainName)) == NULL_STRING) revert ChainIdNotSupported(targetChainId); string memory sAdapter = uint256(uint160(adapter)).toHexString(20); bytes memory payload = abi.encode(ids, hashes); @@ -51,14 +51,14 @@ contract AxelarReporter is Reporter, Ownable { if (msg.value > 0) { AXELAR_GAS_SERVICE.payNativeGasForContractCall{ value: msg.value }( address(this), - chainName, + targetChainName, sAdapter, payload, msg.sender ); } - AXELAR_GATEWAY.callContract(chainName, sAdapter, payload); + AXELAR_GATEWAY.callContract(targetChainName, sAdapter, payload); return bytes32(0); } } diff --git a/packages/evm/contracts/adapters/Celer/CelerReporter.sol b/packages/evm/contracts/adapters/Celer/CelerReporter.sol index 09de8d7e..1dd9793d 100644 --- a/packages/evm/contracts/adapters/Celer/CelerReporter.sol +++ b/packages/evm/contracts/adapters/Celer/CelerReporter.sol @@ -13,13 +13,13 @@ contract CelerReporter is Reporter { } function _dispatch( - uint256 toChainId, + uint256 targetChainId, address adapter, uint256[] memory ids, bytes32[] memory hashes ) internal override returns (bytes32) { bytes memory payload = abi.encode(ids, hashes); - CELER_BUS.sendMessage{ value: msg.value }(adapter, toChainId, payload); + CELER_BUS.sendMessage{ value: msg.value }(adapter, targetChainId, payload); return bytes32(0); } } diff --git a/packages/evm/contracts/adapters/Chainlink/CCIPReporter.sol b/packages/evm/contracts/adapters/Chainlink/CCIPReporter.sol index e694c76b..685913f5 100644 --- a/packages/evm/contracts/adapters/Chainlink/CCIPReporter.sol +++ b/packages/evm/contracts/adapters/Chainlink/CCIPReporter.sol @@ -27,13 +27,13 @@ contract CCIPReporter is Reporter, Ownable { } function _dispatch( - uint256 toChainId, + uint256 targetChainId, address adapter, uint256[] memory ids, bytes32[] memory hashes ) internal override returns (bytes32) { - uint64 chainSelector = chainSelectors[toChainId]; - if (chainSelector == 0) revert ChainSelectorNotAvailable(); + uint64 targetChainSelector = chainSelectors[targetChainId]; + if (targetChainSelector == 0) revert ChainSelectorNotAvailable(); bytes memory payload = abi.encode(ids, hashes); Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ receiver: abi.encode(adapter), @@ -42,7 +42,7 @@ contract CCIPReporter is Reporter, Ownable { extraArgs: Client._argsToBytes(Client.EVMExtraArgsV1({ gasLimit: 200_000, strict: false })), feeToken: address(0) // Pay fees with native }); - CCIP_ROUTER.ccipSend{ value: msg.value }(chainSelector, message); + CCIP_ROUTER.ccipSend{ value: msg.value }(targetChainSelector, message); return bytes32(0); } } diff --git a/packages/evm/contracts/adapters/Connext/ConnextReporter.sol b/packages/evm/contracts/adapters/Connext/ConnextReporter.sol index 68836609..5b9222db 100644 --- a/packages/evm/contracts/adapters/Connext/ConnextReporter.sol +++ b/packages/evm/contracts/adapters/Connext/ConnextReporter.sol @@ -26,16 +26,16 @@ contract ConnextReporter is Reporter, Ownable { } function _dispatch( - uint256 toChainId, + uint256 targetChainId, address adapter, uint256[] memory ids, bytes32[] memory hashes ) internal override returns (bytes32) { - uint32 domainId = domainIds[toChainId]; - if (domainId == 0) revert DomainIdNotAvailable(); + uint32 targetDomainId = domainIds[targetChainId]; + if (targetDomainId == 0) revert DomainIdNotAvailable(); bytes memory payload = abi.encode(ids, hashes); bytes32 transferId = CONNEXT.xcall{ value: msg.value }( - domainId, // _destination: Domain ID of the destination chain + targetDomainId, // _destination: Domain ID of the destination chain adapter, // _to: address of the target contract address(0), // _asset: use address zero for 0-value transfers msg.sender, // _delegate: address that can revert or forceLocal on destination diff --git a/packages/evm/contracts/adapters/Hyperlane/HyperlaneReporter.sol b/packages/evm/contracts/adapters/Hyperlane/HyperlaneReporter.sol index 606ce902..dcba67c7 100644 --- a/packages/evm/contracts/adapters/Hyperlane/HyperlaneReporter.sol +++ b/packages/evm/contracts/adapters/Hyperlane/HyperlaneReporter.sol @@ -28,15 +28,15 @@ contract HyperlaneReporter is Reporter, Ownable { } function _dispatch( - uint256 toChainId, + uint256 targetChainId, address adapter, uint256[] memory ids, bytes32[] memory hashes ) internal override returns (bytes32) { - uint32 destinationDomain = domains[toChainId]; - if (destinationDomain == 0) revert DomainNotAvailable(); + uint32 targetDomain = domains[targetChainId]; + if (targetDomain == 0) revert DomainNotAvailable(); bytes memory payload = abi.encode(ids, hashes); - HYPERLANE_MAILBOX.dispatch{ value: msg.value }(destinationDomain, adapter.addressToBytes32(), payload); + HYPERLANE_MAILBOX.dispatch{ value: msg.value }(targetDomain, adapter.addressToBytes32(), payload); return bytes32(0); } diff --git a/packages/evm/contracts/adapters/LayerZero/LayerZeroReporter.sol b/packages/evm/contracts/adapters/LayerZero/LayerZeroReporter.sol index b6d20290..7ce99098 100644 --- a/packages/evm/contracts/adapters/LayerZero/LayerZeroReporter.sol +++ b/packages/evm/contracts/adapters/LayerZero/LayerZeroReporter.sol @@ -25,18 +25,18 @@ contract LayerZeroReporter is Reporter, Ownable { } function _dispatch( - uint256 toChainId, + uint256 targetChainId, address adapter, uint256[] memory ids, bytes32[] memory hashes ) internal override returns (bytes32) { - uint16 endpointId = endpointIds[toChainId]; - if (endpointId == 0) revert EndpointIdNotAvailable(); + uint16 targetEndpointId = endpointIds[targetChainId]; + if (targetEndpointId == 0) revert EndpointIdNotAvailable(); bytes memory payload = abi.encode(ids, hashes); bytes memory path = abi.encodePacked(adapter, address(this)); // solhint-disable-next-line check-send-result LAYER_ZERO_ENDPOINT.send{ value: msg.value }( - endpointId, + targetEndpointId, path, payload, payable(msg.sender), // _refundAddress: refund address diff --git a/packages/evm/contracts/adapters/Optimism/L1CrossDomainMessengerReporter.sol b/packages/evm/contracts/adapters/Optimism/L1CrossDomainMessengerReporter.sol index c6c121e2..e0c03dee 100644 --- a/packages/evm/contracts/adapters/Optimism/L1CrossDomainMessengerReporter.sol +++ b/packages/evm/contracts/adapters/Optimism/L1CrossDomainMessengerReporter.sol @@ -12,7 +12,7 @@ contract L1CrossDomainMessengerReporter is Reporter { uint32 internal constant GAS_LIMIT = 1_920_000; ICrossDomainMessenger public immutable L1_CROSS_DOMAIN_MESSENGER; - uint256 public immutable TO_CHAIN_ID; + uint256 public immutable TARGET_CHAIN_ID; error InvalidToChainId(uint256 chainId, uint256 expectedChainId); @@ -20,19 +20,19 @@ contract L1CrossDomainMessengerReporter is Reporter { address headerStorage, address yaho, address l1CrossDomainMessenger, - uint256 toChainId + uint256 targetChainId ) Reporter(headerStorage, yaho) { L1_CROSS_DOMAIN_MESSENGER = ICrossDomainMessenger(l1CrossDomainMessenger); - TO_CHAIN_ID = toChainId; + TARGET_CHAIN_ID = targetChainId; } function _dispatch( - uint256 toChainId, + uint256 targetChainId, address adapter, uint256[] memory ids, bytes32[] memory hashes ) internal override returns (bytes32) { - if (toChainId != TO_CHAIN_ID) revert InvalidToChainId(toChainId, TO_CHAIN_ID); + if (targetChainId != TARGET_CHAIN_ID) revert InvalidToChainId(targetChainId, TARGET_CHAIN_ID); bytes memory message = abi.encodeWithSignature("storeHashes(uint256[],bytes32[])", ids, hashes); L1_CROSS_DOMAIN_MESSENGER.sendMessage(adapter, message, GAS_LIMIT); return bytes32(0); diff --git a/packages/evm/contracts/adapters/PNetwork/PNetworkReporter.sol b/packages/evm/contracts/adapters/PNetwork/PNetworkReporter.sol index f684f38c..372f2ced 100644 --- a/packages/evm/contracts/adapters/PNetwork/PNetworkReporter.sol +++ b/packages/evm/contracts/adapters/PNetwork/PNetworkReporter.sol @@ -36,19 +36,19 @@ contract PNetworkReporter is Reporter, Ownable { } function _dispatch( - uint256 toChainId, + uint256 targetChainId, address adapter, uint256[] memory ids, bytes32[] memory hashes ) internal override returns (bytes32) { - bytes4 networkId = networkIds[toChainId]; - if (networkId == 0) revert NetworkIdNotAvailable(); + bytes4 targetNetworkId = networkIds[targetChainId]; + if (targetNetworkId == 0) revert NetworkIdNotAvailable(); bytes memory payload = abi.encode(ids, hashes); if (VAULT != address(0)) { IERC20(TOKEN).approve(VAULT, SWAP_AMOUNT); - IErc20Vault(VAULT).pegIn(SWAP_AMOUNT, TOKEN, _toAsciiString(adapter), payload, networkId); + IErc20Vault(VAULT).pegIn(SWAP_AMOUNT, TOKEN, _toAsciiString(adapter), payload, targetNetworkId); } else { - IPToken(TOKEN).redeem(SWAP_AMOUNT, payload, _toAsciiString(adapter), networkId); + IPToken(TOKEN).redeem(SWAP_AMOUNT, payload, _toAsciiString(adapter), targetNetworkId); } return bytes32(0); } diff --git a/packages/evm/contracts/adapters/Reporter.sol b/packages/evm/contracts/adapters/Reporter.sol index ff0552de..e1a9a5c0 100644 --- a/packages/evm/contracts/adapters/Reporter.sol +++ b/packages/evm/contracts/adapters/Reporter.sol @@ -21,38 +21,38 @@ abstract contract Reporter is IReporter { /// @inheritdoc IReporter function dispatchBlocks( - uint256 toChainId, + uint256 targetChainId, IAdapter adapter, uint256[] memory blockNumbers ) external payable returns (bytes32) { bytes32[] memory blockHeaders = IHeaderStorage(HEADER_STORAGE).storeBlockHeaders(blockNumbers); for (uint256 i = 0; i < blockNumbers.length; ) { - emit BlockDispatched(toChainId, adapter, blockNumbers[i], blockHeaders[i]); + emit BlockDispatched(targetChainId, adapter, blockNumbers[i], blockHeaders[i]); unchecked { ++i; } } - return _dispatch(toChainId, address(adapter), blockNumbers, blockHeaders); + return _dispatch(targetChainId, address(adapter), blockNumbers, blockHeaders); } /// @inheritdoc IReporter function dispatchMessages( - uint256 toChainId, + uint256 targetChainId, IAdapter adapter, uint256[] memory messageIds, bytes32[] memory messageHashes ) external payable onlyYaho returns (bytes32) { for (uint256 i = 0; i < messageIds.length; ) { - emit MessageDispatched(toChainId, adapter, messageIds[i], messageHashes[i]); + emit MessageDispatched(targetChainId, adapter, messageIds[i], messageHashes[i]); unchecked { ++i; } } - return _dispatch(toChainId, address(adapter), messageIds, messageHashes); + return _dispatch(targetChainId, address(adapter), messageIds, messageHashes); } function _dispatch( - uint256 toChainId, + uint256 targetChainId, address adapter, uint256[] memory messageIds, bytes32[] memory messageHashes diff --git a/packages/evm/contracts/adapters/Sygma/SygmaReporter.sol b/packages/evm/contracts/adapters/Sygma/SygmaReporter.sol index 7d9f33d8..ec2d0ac4 100644 --- a/packages/evm/contracts/adapters/Sygma/SygmaReporter.sol +++ b/packages/evm/contracts/adapters/Sygma/SygmaReporter.sol @@ -32,15 +32,15 @@ contract SygmaReporter is Reporter, Ownable { } function _dispatch( - uint256 toChainId, + uint256 targetChainId, address adapter, uint256[] memory ids, bytes32[] memory hashes ) internal override returns (bytes32) { - uint8 domainId = domainIds[toChainId]; - if (domainId == 0) revert DomainIdNotAvailable(); - bytes32 resourceId = resourceIds[toChainId]; - if (resourceId == bytes32(0)) revert ResourceIdNotAvailable(); + uint8 targetDomainId = domainIds[targetChainId]; + if (targetDomainId == 0) revert DomainIdNotAvailable(); + bytes32 targetResourceId = resourceIds[targetChainId]; + if (targetResourceId == bytes32(0)) revert ResourceIdNotAvailable(); bytes memory depositData = abi.encodePacked( // uint256 maxFee uint256(950000), @@ -60,8 +60,8 @@ contract SygmaReporter is Reporter, Ownable { prepareDepositData(ids, hashes) ); (uint64 nonce, bytes memory handlerResponse) = BRIDGE.deposit{ value: msg.value }( - domainId, - resourceId, + targetDomainId, + targetResourceId, depositData, "" // feeData ); diff --git a/packages/evm/contracts/adapters/ZetaChain/ZetaReporter.sol b/packages/evm/contracts/adapters/ZetaChain/ZetaReporter.sol index adc8f85d..b329e3e5 100644 --- a/packages/evm/contracts/adapters/ZetaChain/ZetaReporter.sol +++ b/packages/evm/contracts/adapters/ZetaChain/ZetaReporter.sol @@ -27,7 +27,7 @@ contract ZetaReporter is Reporter, Ownable { } function _dispatch( - uint256 toChainId, + uint256 targetChainId, address adapter, uint256[] memory ids, bytes32[] memory hashes @@ -39,7 +39,7 @@ contract ZetaReporter is Reporter, Ownable { // solhint-disable-next-line check-send-result ZETA_CONNECTOR.send( ZetaInterfaces.SendInput({ - destinationChainId: toChainId, + destinationChainId: targetChainId, destinationAddress: abi.encodePacked(adapter), destinationGasLimit: 200_000, message: payload, diff --git a/packages/evm/contracts/interfaces/IMessage.sol b/packages/evm/contracts/interfaces/IMessage.sol index c26cf102..751e686d 100644 --- a/packages/evm/contracts/interfaces/IMessage.sol +++ b/packages/evm/contracts/interfaces/IMessage.sol @@ -6,7 +6,7 @@ import { IAdapter } from "./IAdapter.sol"; struct Message { bytes32 salt; - uint256 toChainId; + uint256 targetChainId; uint256 threshold; address sender; address receiver; diff --git a/packages/evm/contracts/interfaces/IReporter.sol b/packages/evm/contracts/interfaces/IReporter.sol index e02ca9dd..ced2048a 100644 --- a/packages/evm/contracts/interfaces/IReporter.sol +++ b/packages/evm/contracts/interfaces/IReporter.sol @@ -8,13 +8,13 @@ interface IReporter { /** * @dev Emitted when a block is dispatched to another chain. - * @param toChainId - The target chain's identifier associated with the dispatched block. + * @param targetChainId - The target chain's identifier associated with the dispatched block. * @param adapter - The adapter address associated with the dispatched block. * @param blockNumber - The block number associated with the dispatched block. * @param blockHeader - The dispatched block header as a bytes32 value. */ event BlockDispatched( - uint256 indexed toChainId, + uint256 indexed targetChainId, IAdapter adapter, uint256 indexed blockNumber, bytes32 blockHeader @@ -22,13 +22,13 @@ interface IReporter { /** * @dev Emitted when a message is dispatched to another chain. - * @param toChainId - The target chain's identifier associated with the dispatched message. + * @param targetChainId - The target chain's identifier associated with the dispatched message. * @param adapter - The adapter address associated with the dispatched message. * @param messageId - The message identifier associated with the dispatched message. * @param messageHash - The dispatched message hash as a bytes32 value. */ event MessageDispatched( - uint256 indexed toChainId, + uint256 indexed targetChainId, IAdapter adapter, uint256 indexed messageId, bytes32 messageHash @@ -36,21 +36,21 @@ interface IReporter { /** * @dev Dispatches blocks to a given adapter on the target chaib. - * @param toChainId - The target chain's Uint256 identifier. + * @param targetChainId - The target chain's Uint256 identifier. * @param adapter - The adapter instance to use. * @param blockNumbers - An array of Uint256 block numbers to dispatch. * @notice blockNumbers must include block numbers that are greater than or equal to (currentBlock - 256) due to EVM limitations. * @return result - The result returned by the adapter as bytes. */ function dispatchBlocks( - uint256 toChainId, + uint256 targetChainId, IAdapter adapter, uint256[] memory blockNumbers ) external payable returns (bytes32); /** * @dev Dispatches messages to a target chain using the specified adapter. - * @param toChainId - The target chain's Uint256 identifier. + * @param targetChainId - The target chain's Uint256 identifier. * @param adapter - The adapter instance to use. * @param messageIds - An array of Uint256 message identifiers. * @param messageHashes - An array of bytes32 message hashes. @@ -58,7 +58,7 @@ interface IReporter { * @return result - The result returned by the adapter as bytes. */ function dispatchMessages( - uint256 toChainId, + uint256 targetChainId, IAdapter adapter, uint256[] memory messageIds, bytes32[] memory messageHashes diff --git a/packages/evm/contracts/interfaces/IYaho.sol b/packages/evm/contracts/interfaces/IYaho.sol index a7f41e25..835a15e3 100644 --- a/packages/evm/contracts/interfaces/IYaho.sol +++ b/packages/evm/contracts/interfaces/IYaho.sol @@ -29,16 +29,16 @@ interface IYaho is IMessageHashCalculator, IMessageIdCalculator { /** * @dev Dispatches a message to a specified chain with a set of validation parameters without calling the reporters. It just write in storage a commitment of message. In order to dispatch it to the reporters, you must then invoke `relayMessagesToAdapters` - * @param toChainId - The ID of the target chain to which the message is being sent. + * @param targetChainId - The ID of the target chain to which the message is being sent. * @param threshold - The minimum number of adapters required to have stored the same message. - * @param receiver - The address of the receiver on the destination chain. + * @param receiver - The address of the receiver on the target chain. * @param data - The data being sent in the message, represented as a byte array. * @param reporters - An array of `IReporter` contracts (not actively used in this step). * @param adapters - An array of `IAdapter` contracts (for later validation use). * @return messageId A unique identifier for the dispatched message, used for tracking and subsequent validation. */ function dispatchMessage( - uint256 toChainId, + uint256 targetChainId, uint256 threshold, address receiver, bytes calldata data, @@ -48,16 +48,16 @@ interface IYaho is IMessageHashCalculator, IMessageIdCalculator { /** * @dev Dispatches a message to a specified chain with a set of validation parameters and calls the reporters. - * @param toChainId - The ID of the target chain to which the message is being sent. + * @param targetChainId - The ID of the target chain to which the message is being sent. * @param threshold - The minimum number of adapters required to have stored the same message. - * @param receiver - The address of the receiver on the destination chain. + * @param receiver - The address of the receiver on the target chain. * @param data - The data being sent in the message, represented as a byte array. * @param reporters - An array of `IReporter` contracts (not actively used in this step). * @param adapters - An array of `IAdapter` contracts (for later validation use). * @return (messageId, result) A unique identifier for the dispatched message and an array of byte arrays, where each element is the result of dispatching a respective message to the corresponding Reporter. */ function dispatchMessageToAdapters( - uint256 toChainId, + uint256 targetChainId, uint256 threshold, address receiver, bytes calldata data, @@ -67,16 +67,16 @@ interface IYaho is IMessageHashCalculator, IMessageIdCalculator { /** * @dev Dispatches an array of messages to specified chains and calls the reporters. - * @param toChainId - The ID of the destination chain for all messages. + * @param targetChainId - The ID of the target chain for all messages. * @param thresholds - An array of minimum validation thresholds required for each message. - * @param receivers - An array of addresses for the receivers on the destination chain, one for each message. + * @param receivers - An array of addresses for the receivers on the target chain, one for each message. * @param data - An array of data payloads for each message, represented as byte arrays. * @param reporters - An array of `IReporter` contracts for reporting the status of each message. * @param adapters - An array of `IAdapter` contracts used for the validation of each message. * @return (messageIds, result) An array of unique identifiers for the dispatched messages and an array of bytes32 arrays, where each element is the result of dispatching a respective message to the corresponding Reporter. */ function dispatchMessagesToAdapters( - uint256 toChainId, + uint256 targetChainId, uint256[] calldata thresholds, address[] calldata receivers, bytes[] calldata data, @@ -92,7 +92,7 @@ interface IYaho is IMessageHashCalculator, IMessageIdCalculator { function getPendingMessageHash(uint256 messageId) external view returns (bytes32); /** - * @dev Relays an array of messages to their respective adapters. In order to be able to aggregate messages within the reporter, it's mandatory that all messages have the same toChainId, reporters and adapters. + * @dev Relays an array of messages to their respective adapters. In order to be able to aggregate messages within the reporter, it's mandatory that all messages have the same targetChainId, reporters and adapters. * * @param messages - An array of `Message` structures to be relayed to the adapters. * @return result An array of bytes32 arrays, where each element is the result of dispatching a respective all messages to the corresponding Reporter. diff --git a/packages/evm/test/04_Yaho.spec.ts b/packages/evm/test/04_Yaho.spec.ts index 695f8256..6e85057e 100644 --- a/packages/evm/test/04_Yaho.spec.ts +++ b/packages/evm/test/04_Yaho.spec.ts @@ -133,9 +133,9 @@ describe("Yaho", () => { describe("dispatchMessageToAdapters", () => { it("should dispatch a single message and call the reporter contracts", async () => { const threshold = 2 - const toChainId = Chains.Gnosis + const targetChainId = Chains.Gnosis const tx = await yaho.dispatchMessageToAdapters( - toChainId, + targetChainId, threshold, receiver1.address, "0x01", @@ -147,9 +147,9 @@ describe("Yaho", () => { .to.emit(yaho, "MessageDispatched") .withArgs(message.id, anyValue) // FIXME: https://github.com/NomicFoundation/hardhat/issues/3833 .and.to.emit(reporter1, "MessageDispatched") - .withArgs(toChainId, adapter1.address, message.id, await yaho.calculateMessageHash(message.serialize())) + .withArgs(targetChainId, adapter1.address, message.id, await yaho.calculateMessageHash(message.serialize())) .and.to.emit(reporter2, "MessageDispatched") - .withArgs(toChainId, adapter2.address, message.id, await yaho.calculateMessageHash(message.serialize())) + .withArgs(targetChainId, adapter2.address, message.id, await yaho.calculateMessageHash(message.serialize())) expect(await yaho.getPendingMessageHash(message.id)).to.be.eq(toBytes32(0)) }) @@ -217,9 +217,9 @@ describe("Yaho", () => { describe("dispatchMessagesToAdapters", () => { it("should dispatch 2 messages and call the reporter contracts", async () => { const threshold = 2 - const toChainId = Chains.Gnosis + const targetChainId = Chains.Gnosis const tx = await yaho.dispatchMessagesToAdapters( - toChainId, + targetChainId, [threshold, threshold], [receiver1.address, receiver2.address], ["0x01", "0x02"], @@ -231,23 +231,23 @@ describe("Yaho", () => { .to.emit(yaho, "MessageDispatched") .withArgs(message1.id, anyValue) // FIXME: https://github.com/NomicFoundation/hardhat/issues/3833 .and.to.emit(reporter1, "MessageDispatched") - .withArgs(toChainId, adapter1.address, message1.id, await yaho.calculateMessageHash(message1.serialize())) + .withArgs(targetChainId, adapter1.address, message1.id, await yaho.calculateMessageHash(message1.serialize())) .and.to.emit(reporter1, "MessageDispatched") - .withArgs(toChainId, adapter1.address, message2.id, await yaho.calculateMessageHash(message2.serialize())) + .withArgs(targetChainId, adapter1.address, message2.id, await yaho.calculateMessageHash(message2.serialize())) .and.to.emit(reporter2, "MessageDispatched") - .withArgs(toChainId, adapter2.address, message1.id, await yaho.calculateMessageHash(message1.serialize())) + .withArgs(targetChainId, adapter2.address, message1.id, await yaho.calculateMessageHash(message1.serialize())) .and.to.emit(reporter2, "MessageDispatched") - .withArgs(toChainId, adapter2.address, message2.id, await yaho.calculateMessageHash(message2.serialize())) + .withArgs(targetChainId, adapter2.address, message2.id, await yaho.calculateMessageHash(message2.serialize())) expect(await yaho.getPendingMessageHash(message1.id)).to.be.eq(toBytes32(0)) expect(await yaho.getPendingMessageHash(message2.id)).to.be.eq(toBytes32(0)) }) it("should fail dispatch 2 messages because thresholds array size does not match te receivers one", async () => { const threshold = 2 - const toChainId = Chains.Gnosis + const targetChainId = Chains.Gnosis await expect( yaho.dispatchMessagesToAdapters( - toChainId, + targetChainId, [threshold], [receiver1.address, receiver2.address], ["0x01", "0x02"], @@ -261,10 +261,10 @@ describe("Yaho", () => { it("should fail dispatch 2 messages because thresholds array size does not match te data one", async () => { const threshold = 2 - const toChainId = Chains.Gnosis + const targetChainId = Chains.Gnosis await expect( yaho.dispatchMessagesToAdapters( - toChainId, + targetChainId, [threshold, threshold], [receiver1.address, receiver2.address], ["0x01"], @@ -338,7 +338,7 @@ describe("Yaho", () => { }) describe("relayMessagesToAdapters", () => { - it("should not relay messages that don't have the same toChainId", async () => { + it("should not relay messages that don't have the same targetChainId", async () => { const [tx1, tx2] = await Promise.all([ yaho.dispatchMessage( Chains.Mainnet, @@ -384,11 +384,11 @@ describe("Yaho", () => { }) it("should not relay messages that don't have the same adapters", async () => { - const toChainId = Chains.Gnosis + const targetChainId = Chains.Gnosis const threshold = 2 const [tx1, tx2] = await Promise.all([ yaho.dispatchMessage( - toChainId, + targetChainId, threshold, receiver1.address, "0x01", @@ -396,7 +396,7 @@ describe("Yaho", () => { [adapter1.address, adapter2.address], ), yaho.dispatchMessage( - toChainId, + targetChainId, threshold, receiver2.address, "0x02", @@ -414,13 +414,13 @@ describe("Yaho", () => { ) await expect(yaho.relayMessagesToAdapters([message1, message2])) .to.emit(reporter1, "MessageDispatched") - .withArgs(toChainId, adapter1.address, message1.id, await yaho.calculateMessageHash(message1.serialize())) + .withArgs(targetChainId, adapter1.address, message1.id, await yaho.calculateMessageHash(message1.serialize())) .and.to.emit(reporter1, "MessageDispatched") - .withArgs(toChainId, adapter1.address, message2.id, await yaho.calculateMessageHash(message2.serialize())) + .withArgs(targetChainId, adapter1.address, message2.id, await yaho.calculateMessageHash(message2.serialize())) .and.to.emit(reporter2, "MessageDispatched") - .withArgs(toChainId, adapter2.address, message1.id, await yaho.calculateMessageHash(message1.serialize())) + .withArgs(targetChainId, adapter2.address, message1.id, await yaho.calculateMessageHash(message1.serialize())) .and.to.emit(reporter2, "MessageDispatched") - .withArgs(toChainId, adapter2.address, message2.id, await yaho.calculateMessageHash(message2.serialize())) + .withArgs(targetChainId, adapter2.address, message2.id, await yaho.calculateMessageHash(message2.serialize())) expect(await yaho.getPendingMessageHash(message1.id)).to.be.eq(toBytes32(0)) expect(await yaho.getPendingMessageHash(message2.id)).to.be.eq(toBytes32(0)) }) diff --git a/packages/evm/test/adapters/03_Reporter.spec.ts b/packages/evm/test/adapters/03_Reporter.spec.ts index 4e05fbde..b35ebcef 100644 --- a/packages/evm/test/adapters/03_Reporter.spec.ts +++ b/packages/evm/test/adapters/03_Reporter.spec.ts @@ -32,38 +32,38 @@ describe("Reporter", () => { describe("dispatchBlocks", () => { it("should be able to dispatch 2 blocks", async () => { - const toChainId = Chains.Gnosis + const targetChainId = Chains.Gnosis const blockNumbers = [998, 999] await mine(1000) - await expect(reporter.dispatchBlocks(toChainId, fakeAdapter.address, blockNumbers)) + await expect(reporter.dispatchBlocks(targetChainId, fakeAdapter.address, blockNumbers)) .to.emit(reporter, "BlockDispatched") - .withArgs(toChainId, fakeAdapter.address, blockNumbers[0], anyValue) + .withArgs(targetChainId, fakeAdapter.address, blockNumbers[0], anyValue) .and.to.emit(reporter, "BlockDispatched") - .withArgs(toChainId, fakeAdapter.address, blockNumbers[1], anyValue) + .withArgs(targetChainId, fakeAdapter.address, blockNumbers[1], anyValue) }) }) describe("dispatchMessages", () => { it("should not be able to call dispatchMessages if it's not yaho", async () => { - const toChainId = Chains.Gnosis + const targetChainId = Chains.Gnosis const messageIds = [1, 2] const messageHashes = [toBytes32(1), toBytes32(2)] - await expect(reporter.dispatchMessages(toChainId, fakeAdapter.address, messageIds, messageHashes)) + await expect(reporter.dispatchMessages(targetChainId, fakeAdapter.address, messageIds, messageHashes)) .to.be.revertedWithCustomError(reporter, "NotYaho") .withArgs(user.address, fakeYaho.address) }) it("should be able to dispatch 2 messages", async () => { - const toChainId = Chains.Gnosis + const targetChainId = Chains.Gnosis const messageIds = [1, 2] const messageHashes = [toBytes32(1), toBytes32(2)] await expect( - reporter.connect(fakeYaho).dispatchMessages(toChainId, fakeAdapter.address, messageIds, messageHashes), + reporter.connect(fakeYaho).dispatchMessages(targetChainId, fakeAdapter.address, messageIds, messageHashes), ) .to.emit(reporter, "MessageDispatched") - .withArgs(toChainId, fakeAdapter.address, messageIds[0], messageHashes[0]) + .withArgs(targetChainId, fakeAdapter.address, messageIds[0], messageHashes[0]) .and.to.emit(reporter, "MessageDispatched") - .withArgs(toChainId, fakeAdapter.address, messageIds[1], messageHashes[1]) + .withArgs(targetChainId, fakeAdapter.address, messageIds[1], messageHashes[1]) }) }) }) diff --git a/packages/evm/test/utils/Message.ts b/packages/evm/test/utils/Message.ts index f7a6c7f2..eefff1c9 100644 --- a/packages/evm/test/utils/Message.ts +++ b/packages/evm/test/utils/Message.ts @@ -6,7 +6,7 @@ type Configs = { threshold: number id: string receiver: `0x${string}` - toChainId: number + targetChainId: number salt: string reporters: `0x${string}`[] adapters: `0x${string}`[] @@ -18,15 +18,15 @@ class Message { public threshold: number public id: string public receiver: `0x${string}` - public toChainId: number + public targetChainId: number public salt: string public reporters: `0x${string}`[] public adapters: `0x${string}`[] - constructor({ data, sender, threshold, id, receiver, toChainId, salt, reporters, adapters }: Configs) { + constructor({ data, sender, threshold, id, receiver, targetChainId, salt, reporters, adapters }: Configs) { this.id = id this.sender = sender - this.toChainId = toChainId + this.targetChainId = targetChainId this.receiver = receiver this.data = data this.salt = salt @@ -43,7 +43,7 @@ class Message { serialize() { return [ this.salt, - this.toChainId, + this.targetChainId, this.threshold, this.sender, this.receiver, From bd6b3741d79681f783c0a6bf1eb52163cb4d1d5c Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 1 Feb 2024 17:11:36 +0100 Subject: [PATCH 125/297] refactor(evm): rn fromChainId into sourceChainId --- packages/evm/contracts/interfaces/IJushin.sol | 4 ++-- packages/evm/contracts/interfaces/IMessageIdCalculator.sol | 4 ++-- packages/evm/contracts/utils/MessageIdCalculator.sol | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/evm/contracts/interfaces/IJushin.sol b/packages/evm/contracts/interfaces/IJushin.sol index dd6bf224..55aecb03 100644 --- a/packages/evm/contracts/interfaces/IJushin.sol +++ b/packages/evm/contracts/interfaces/IJushin.sol @@ -7,14 +7,14 @@ pragma solidity ^0.8.20; interface IJushin { /** * @dev Handles the incoming message from a specified chain. - * @param fromChainId - The ID of the origin chain from which the message originates. + * @param sourceChainId - The ID of the origin chain from which the message originates. * @param messageId - The unique identifier of the message. * @param sender - The address of the sender of the message on the origin chain. * @param data - The data contained in the message, in bytes. * @return result bytes at the user's choice */ function onMessage( - uint256 fromChainId, + uint256 sourceChainId, uint256 messageId, address sender, bytes calldata data diff --git a/packages/evm/contracts/interfaces/IMessageIdCalculator.sol b/packages/evm/contracts/interfaces/IMessageIdCalculator.sol index f316fbb7..ee818fec 100644 --- a/packages/evm/contracts/interfaces/IMessageIdCalculator.sol +++ b/packages/evm/contracts/interfaces/IMessageIdCalculator.sol @@ -8,13 +8,13 @@ interface IMessageIdCalculator { /** * @dev Calculates and returns a unique identifier (ID) for a message. * - * @param fromChainId - The ID of the chain from which the message originates. + * @param sourceChainId - The ID of the chain from which the message originates. * @param dispatcherAddress - The address of the dispatcher sending the message. * @param messageHash - The keccak256 hash of the message, represented as a 32-byte hexadecimal string. * @return messageId The unique identifier for the message, calculated based on the input parameters. */ function calculateMessageId( - uint256 fromChainId, + uint256 sourceChainId, address dispatcherAddress, bytes32 messageHash ) external pure returns (uint256); diff --git a/packages/evm/contracts/utils/MessageIdCalculator.sol b/packages/evm/contracts/utils/MessageIdCalculator.sol index 3d137e07..41ad96ea 100644 --- a/packages/evm/contracts/utils/MessageIdCalculator.sol +++ b/packages/evm/contracts/utils/MessageIdCalculator.sol @@ -6,10 +6,10 @@ import { IMessageIdCalculator } from "../interfaces/IMessageIdCalculator.sol"; contract MessageIdCalculator is IMessageIdCalculator { /// @inheritdoc IMessageIdCalculator function calculateMessageId( - uint256 fromChainId, + uint256 sourceChainId, address dispatcherAddress, bytes32 messageHash ) public pure returns (uint256) { - return uint256(keccak256(abi.encode(fromChainId, dispatcherAddress, messageHash))); + return uint256(keccak256(abi.encode(sourceChainId, dispatcherAddress, messageHash))); } } From 0d441d83762b2a73168b7d605d5a9f793678997d Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 1 Feb 2024 17:28:27 +0100 Subject: [PATCH 126/297] refactor(evm): rm empty comment lint --- packages/evm/contracts/interfaces/IYaho.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/evm/contracts/interfaces/IYaho.sol b/packages/evm/contracts/interfaces/IYaho.sol index 835a15e3..b6d780ec 100644 --- a/packages/evm/contracts/interfaces/IYaho.sol +++ b/packages/evm/contracts/interfaces/IYaho.sol @@ -93,7 +93,6 @@ interface IYaho is IMessageHashCalculator, IMessageIdCalculator { /** * @dev Relays an array of messages to their respective adapters. In order to be able to aggregate messages within the reporter, it's mandatory that all messages have the same targetChainId, reporters and adapters. - * * @param messages - An array of `Message` structures to be relayed to the adapters. * @return result An array of bytes32 arrays, where each element is the result of dispatching a respective all messages to the corresponding Reporter. */ From 29c70891dabb6923b4c4bed914c3bf5724723317 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 6 Feb 2024 16:58:58 +0100 Subject: [PATCH 127/297] chore(evm): rn 02_OracleAdapter.test.ts into 02_Adapter.test.ts and rm not used consts --- packages/evm/test/adapters/01_HeaderStorage.spec.ts | 5 ----- .../{02_OracleAdapter.spec.ts => 02_Adapter.spec.ts} | 0 2 files changed, 5 deletions(-) rename packages/evm/test/adapters/{02_OracleAdapter.spec.ts => 02_Adapter.spec.ts} (100%) diff --git a/packages/evm/test/adapters/01_HeaderStorage.spec.ts b/packages/evm/test/adapters/01_HeaderStorage.spec.ts index 3e78dc34..5f1761eb 100644 --- a/packages/evm/test/adapters/01_HeaderStorage.spec.ts +++ b/packages/evm/test/adapters/01_HeaderStorage.spec.ts @@ -2,11 +2,6 @@ import { mine } from "@nomicfoundation/hardhat-network-helpers" import { expect } from "chai" import { ethers, network } from "hardhat" -const CHAIN_ID = 1 -const HEADER_ZERO = "0x0000000000000000000000000000000000000000000000000000000000000000" -const HEADER_GOOD = "0x0000000000000000000000000000000000000000000000000000000000000001" -const HEADER_BAD = "0x0000000000000000000000000000000000000000000000000000000000000bad" - const setup = async () => { await network.provider.request({ method: "hardhat_reset", params: [] }) const [wallet] = await ethers.getSigners() diff --git a/packages/evm/test/adapters/02_OracleAdapter.spec.ts b/packages/evm/test/adapters/02_Adapter.spec.ts similarity index 100% rename from packages/evm/test/adapters/02_OracleAdapter.spec.ts rename to packages/evm/test/adapters/02_Adapter.spec.ts From bff9b1579ad67f7473fc48d95f8f99918ef08cd2 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 7 Feb 2024 10:19:58 +0100 Subject: [PATCH 128/297] refactor(evm): rm left ref to zodiac --- packages/evm/.solcover.js | 2 +- packages/evm/package.json | 1 - packages/evm/tasks/deploy/replay.ts | 17 ----------------- 3 files changed, 1 insertion(+), 19 deletions(-) diff --git a/packages/evm/.solcover.js b/packages/evm/.solcover.js index e35dfe14..76f763bd 100644 --- a/packages/evm/.solcover.js +++ b/packages/evm/.solcover.js @@ -3,5 +3,5 @@ module.exports = { providerOptions: { mnemonic: process.env.MNEMONIC, }, - skipFiles: ["test", "zodiac/test"], + skipFiles: ["test"], } diff --git a/packages/evm/package.json b/packages/evm/package.json index 1e922fc5..1a5e322d 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -96,7 +96,6 @@ "@axelar-network/axelar-gmp-sdk-solidity": "^5.6.2", "@chainlink/contracts-ccip": "^0.7.6", "@connext/interfaces": "^2.0.0", - "@gnosis.pm/zodiac": "^3.3.2", "@hyperlane-xyz/core": "^3.1.10", "@openzeppelin/contracts-upgradeable": "^4.8.1", "@polytope-labs/solidity-merkle-trees": "^0.2.1", diff --git a/packages/evm/tasks/deploy/replay.ts b/packages/evm/tasks/deploy/replay.ts index 494a5824..f9de100c 100644 --- a/packages/evm/tasks/deploy/replay.ts +++ b/packages/evm/tasks/deploy/replay.ts @@ -8,7 +8,6 @@ import type { Yaru__factory } from "../../types/factories/contracts/Yaru__factor import type { GiriGiriBashi__factory } from "../../types/factories/contracts/ownable/GiriGiriBashi__factory" import type { ShoyuBashi__factory } from "../../types/factories/contracts/ownable/ShoyuBashi__factory" import type { HeaderStorage__factory } from "../../types/factories/contracts/utils/HeaderStorage__factory" -import type { HashiModule__factory } from "../../types/factories/contracts/zodiac/HashiModule__factory" const ADDRESS_ONE = "0x0000000000000000000000000000000000000001" @@ -97,22 +96,6 @@ export const deploy = async ({ networks }: { networks: string[] }, hre: HardhatR } catch (error) { logDeployError(error) } - - // deploy hashi module - try { - console.log(`\x1B[4mHeader Storage\x1B[0m`) - const hashiModuleFactory: HashiModule__factory = ( - await hre.ethers.getContractFactory("HashiModule") - ) - await deployMastercopy( - signer, - hashiModuleFactory, - [ADDRESS_ONE, ADDRESS_ONE, ADDRESS_ONE, ADDRESS_ONE, ADDRESS_ONE, 1], - hre.ethers.constants.HashZero, - ) - } catch (error) { - logDeployError(error) - } } catch (error: any) { console.log(` \x1B[31m✘ Network skipped because:\x1B[0m ${error?.reason || error}`) } From 1b1dd89782b9700fb6a7091ae8b2ee8d6976fffa Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 12 Feb 2024 15:45:18 +0100 Subject: [PATCH 129/297] refactor(contracts & test): rm salt and adds nonce --- packages/evm/contracts/Yaho.sol | 6 +++++- packages/evm/contracts/interfaces/IMessage.sol | 2 +- packages/evm/test/utils/Message.ts | 10 +++++----- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/packages/evm/contracts/Yaho.sol b/packages/evm/contracts/Yaho.sol index 0422b3e9..8eacef42 100644 --- a/packages/evm/contracts/Yaho.sol +++ b/packages/evm/contracts/Yaho.sol @@ -10,6 +10,7 @@ import { IAdapter } from "./interfaces/IAdapter.sol"; contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { mapping(uint256 => bytes32) private _pendingMessageHashes; + uint256 public currentNonce; /// @inheritdoc IYaho function dispatchMessage( @@ -146,7 +147,7 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { ) internal returns (uint256, bytes32) { address sender = msg.sender; Message memory message = Message( - keccak256(abi.encode(blockhash(block.number - 1), gasleft())), + currentNonce, targetChainId, threshold, sender, @@ -158,6 +159,9 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { bytes32 messageHash = calculateMessageHash(message); uint256 messageId = calculateMessageId(block.chainid, address(this), messageHash); _pendingMessageHashes[messageId] = messageHash; + unchecked { + ++currentNonce; + } emit MessageDispatched(messageId, message); return (messageId, messageHash); } diff --git a/packages/evm/contracts/interfaces/IMessage.sol b/packages/evm/contracts/interfaces/IMessage.sol index 751e686d..9ec02029 100644 --- a/packages/evm/contracts/interfaces/IMessage.sol +++ b/packages/evm/contracts/interfaces/IMessage.sol @@ -5,7 +5,7 @@ import { IReporter } from "./IReporter.sol"; import { IAdapter } from "./IAdapter.sol"; struct Message { - bytes32 salt; + uint256 nonce; uint256 targetChainId; uint256 threshold; address sender; diff --git a/packages/evm/test/utils/Message.ts b/packages/evm/test/utils/Message.ts index eefff1c9..8a16c75e 100644 --- a/packages/evm/test/utils/Message.ts +++ b/packages/evm/test/utils/Message.ts @@ -7,7 +7,7 @@ type Configs = { id: string receiver: `0x${string}` targetChainId: number - salt: string + nonce: number reporters: `0x${string}`[] adapters: `0x${string}`[] } @@ -19,17 +19,17 @@ class Message { public id: string public receiver: `0x${string}` public targetChainId: number - public salt: string + public nonce: number public reporters: `0x${string}`[] public adapters: `0x${string}`[] - constructor({ data, sender, threshold, id, receiver, targetChainId, salt, reporters, adapters }: Configs) { + constructor({ data, sender, threshold, id, receiver, targetChainId, nonce, reporters, adapters }: Configs) { this.id = id this.sender = sender this.targetChainId = targetChainId this.receiver = receiver this.data = data - this.salt = salt + this.nonce = nonce this.reporters = reporters this.adapters = adapters this.threshold = threshold @@ -42,7 +42,7 @@ class Message { serialize() { return [ - this.salt, + this.nonce, this.targetChainId, this.threshold, this.sender, From b1cbf2529d8b83395023f7af6d5d50aad9ebb4c3 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 12 Feb 2024 16:44:48 +0100 Subject: [PATCH 130/297] fix(contracts & test): fixes relying the same message more than once --- packages/evm/contracts/Yaho.sol | 15 +++++++++----- packages/evm/test/04_Yaho.spec.ts | 33 +++++++++++++++++++++++++------ 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/packages/evm/contracts/Yaho.sol b/packages/evm/contracts/Yaho.sol index 8eacef42..fd986df1 100644 --- a/packages/evm/contracts/Yaho.sol +++ b/packages/evm/contracts/Yaho.sol @@ -84,6 +84,7 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { } bytes32[] memory reportersReceipts = new bytes32[](reporters.length); + _resetPendingMessageHashesByMessageIds(messageIds); reportersReceipts = _dispatchMessagesToAdapters(targetChainId, messageIds, messageHashes, reporters, adapters); return (messageIds, reportersReceipts); } @@ -114,6 +115,7 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { if (messageHash == bytes32(0)) revert MessageHashNotFound(messageId); messageHashes[i] = messageHash; messageIds[i] = messageId; + delete _pendingMessageHashes[messageId]; } return @@ -177,6 +179,7 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { bytes32[] memory messageHashes = new bytes32[](1); messageIds[0] = messageId; messageHashes[0] = messageHash; + _resetPendingMessageHashesByMessageIds(messageIds); return _dispatchMessagesToAdapters(targetChainId, messageIds, messageHashes, reporters, adapters); } @@ -196,13 +199,15 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { } } - for (uint256 j = 0; j < messageIds.length; ) { - delete _pendingMessageHashes[messageIds[j]]; + return reportersReceipts; + } + + function _resetPendingMessageHashesByMessageIds(uint256[] memory messageIds) internal { + for (uint256 i = 0; i < messageIds.length; ) { + delete _pendingMessageHashes[messageIds[i]]; unchecked { - ++j; + ++i; } } - - return reportersReceipts; } } diff --git a/packages/evm/test/04_Yaho.spec.ts b/packages/evm/test/04_Yaho.spec.ts index 6e85057e..08e1d296 100644 --- a/packages/evm/test/04_Yaho.spec.ts +++ b/packages/evm/test/04_Yaho.spec.ts @@ -143,13 +143,14 @@ describe("Yaho", () => { [adapter1.address, adapter2.address], ) const [message] = Message.fromReceipt(await tx.wait(1)) + const expectedMessageHash = await yaho.calculateMessageHash(message.serialize()) await expect(tx) .to.emit(yaho, "MessageDispatched") .withArgs(message.id, anyValue) // FIXME: https://github.com/NomicFoundation/hardhat/issues/3833 .and.to.emit(reporter1, "MessageDispatched") - .withArgs(targetChainId, adapter1.address, message.id, await yaho.calculateMessageHash(message.serialize())) + .withArgs(targetChainId, adapter1.address, message.id, expectedMessageHash) .and.to.emit(reporter2, "MessageDispatched") - .withArgs(targetChainId, adapter2.address, message.id, await yaho.calculateMessageHash(message.serialize())) + .withArgs(targetChainId, adapter2.address, message.id, expectedMessageHash) expect(await yaho.getPendingMessageHash(message.id)).to.be.eq(toBytes32(0)) }) @@ -227,17 +228,19 @@ describe("Yaho", () => { [adapter1.address, adapter2.address], ) const [message1, message2] = Message.fromReceipt(await tx.wait(1)) + const expectedMessageHash1 = await yaho.calculateMessageHash(message1.serialize()) + const expectedMessageHash2 = await yaho.calculateMessageHash(message2.serialize()) await expect(tx) .to.emit(yaho, "MessageDispatched") .withArgs(message1.id, anyValue) // FIXME: https://github.com/NomicFoundation/hardhat/issues/3833 .and.to.emit(reporter1, "MessageDispatched") - .withArgs(targetChainId, adapter1.address, message1.id, await yaho.calculateMessageHash(message1.serialize())) + .withArgs(targetChainId, adapter1.address, message1.id, expectedMessageHash1) .and.to.emit(reporter1, "MessageDispatched") - .withArgs(targetChainId, adapter1.address, message2.id, await yaho.calculateMessageHash(message2.serialize())) + .withArgs(targetChainId, adapter1.address, message2.id, expectedMessageHash2) .and.to.emit(reporter2, "MessageDispatched") - .withArgs(targetChainId, adapter2.address, message1.id, await yaho.calculateMessageHash(message1.serialize())) + .withArgs(targetChainId, adapter2.address, message1.id, expectedMessageHash1) .and.to.emit(reporter2, "MessageDispatched") - .withArgs(targetChainId, adapter2.address, message2.id, await yaho.calculateMessageHash(message2.serialize())) + .withArgs(targetChainId, adapter2.address, message2.id, expectedMessageHash2) expect(await yaho.getPendingMessageHash(message1.id)).to.be.eq(toBytes32(0)) expect(await yaho.getPendingMessageHash(message2.id)).to.be.eq(toBytes32(0)) }) @@ -424,5 +427,23 @@ describe("Yaho", () => { expect(await yaho.getPendingMessageHash(message1.id)).to.be.eq(toBytes32(0)) expect(await yaho.getPendingMessageHash(message2.id)).to.be.eq(toBytes32(0)) }) + + it("should not be able to relay the same message twice", async () => { + const targetChainId = Chains.Gnosis + const threshold = 2 + const tx = await yaho.dispatchMessage( + targetChainId, + threshold, + receiver1.address, + "0x01", + [reporter1.address, reporter2.address], + [adapter1.address, adapter2.address], + ) + + const [message] = Message.fromReceipt(await tx.wait(1)) + await expect(yaho.relayMessagesToAdapters([message, message])) + .to.be.revertedWithCustomError(yaho, "MessageHashNotFound") + .withArgs(message.id) + }) }) }) From d27848bebec8b34188f55d038a2e69a7e8533f9f Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 13 Feb 2024 14:52:32 +0100 Subject: [PATCH 131/297] refactor(tasks): improves logs --- packages/evm/tasks/deploy/hashi.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/evm/tasks/deploy/hashi.ts b/packages/evm/tasks/deploy/hashi.ts index 8c60dc83..4a9c01cb 100644 --- a/packages/evm/tasks/deploy/hashi.ts +++ b/packages/evm/tasks/deploy/hashi.ts @@ -63,7 +63,7 @@ task("deploy:GiriGiriBashi") await giriGiriBashiFactory.connect(signers[0]).deploy(...constructorArguments) ) await giriGiriBashi.deployed() - console.log("giriGiriBashi deployed to:", giriGiriBashi.address) + console.log("GiriGiriBashi deployed to:", giriGiriBashi.address) if (taskArguments.verify) await verify(hre, giriGiriBashi, constructorArguments) }) @@ -89,7 +89,7 @@ task("deploy:Yaho") const yahoFactory: Yaho__factory = await hre.ethers.getContractFactory("Yaho") const yaho: Yaho = await yahoFactory.connect(signers[0]).deploy() await yaho.deployed() - console.log("yahoBashi deployed to:", yaho.address) + console.log("Yaho deployed to:", yaho.address) if (taskArguments.verify) await verify(hre, yaho) }) @@ -105,6 +105,6 @@ task("deploy:Yaru") const constructorArguments = [taskArguments.hashi, taskArguments.yaho, taskArguments.sourceChainId] as const const yaru: Yaru = await yaruFactory.connect(signers[0]).deploy(...constructorArguments) await yaru.deployed() - console.log("yaru deployed to:", yaru.address) + console.log("Yaru deployed to:", yaru.address) if (taskArguments.verify) await verify(hre, yaru, constructorArguments) }) From fcaa91a6086cf4bae93084b8e8947d3c3fe53a01 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 13 Feb 2024 16:20:25 +0100 Subject: [PATCH 132/297] fix(contracts & test): adds missing onlyOwner and fixes a test --- packages/evm/contracts/ownable/GiriGiriBashi.sol | 2 +- packages/evm/test/03_GiriGiriBashi.spec.ts | 9 +++------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/packages/evm/contracts/ownable/GiriGiriBashi.sol b/packages/evm/contracts/ownable/GiriGiriBashi.sol index 122f8273..fd06d8ae 100644 --- a/packages/evm/contracts/ownable/GiriGiriBashi.sol +++ b/packages/evm/contracts/ownable/GiriGiriBashi.sol @@ -200,7 +200,7 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { } /// @inheritdoc IGiriGiriBashi - function setChallengeRange(uint256 domain, uint256 range) public { + function setChallengeRange(uint256 domain, uint256 range) public onlyOwner { if (challengeRanges[domain] != 0) revert ChallengeRangeAlreadySet(domain); challengeRanges[domain] = range; emit ChallengeRangeUpdated(domain, range); diff --git a/packages/evm/test/03_GiriGiriBashi.spec.ts b/packages/evm/test/03_GiriGiriBashi.spec.ts index 1ccd2e9b..5b58c055 100644 --- a/packages/evm/test/03_GiriGiriBashi.spec.ts +++ b/packages/evm/test/03_GiriGiriBashi.spec.ts @@ -451,12 +451,9 @@ describe("GiriGiriBashi", function () { value: BOND, }) - expect( - await giriGiriBashi.resolveChallenge(DOMAIN_ID, challengeBlock, mockAdapter.address, [ - secondMockAdapter.address, - ]), - ) - expect(await ethers.provider.getBalance(ADDRESS_TWO)).to.equal(BOND) + const balanceBefore = await ethers.provider.getBalance(ADDRESS_TWO) + await giriGiriBashi.resolveChallenge(DOMAIN_ID, challengeBlock, mockAdapter.address, [secondMockAdapter.address]) + expect(await ethers.provider.getBalance(ADDRESS_TWO)).to.equal(balanceBefore.add(BOND)) const quarantined = (await giriGiriBashi.settings(mockAdapter.address)).quarantined expect(quarantined).to.equal(false) }) From aec6df9a10e9d132f3402334c47e36edaa76d811 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 19 Feb 2024 06:21:30 +0100 Subject: [PATCH 133/297] feat(contracts): improves checkHashWithThresholdFromAdapters & _getThresholdHash gas usage --- packages/evm/contracts/Hashi.sol | 4 +++- packages/evm/contracts/ownable/ShuSo.sol | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/evm/contracts/Hashi.sol b/packages/evm/contracts/Hashi.sol index 662cb008..e34624df 100644 --- a/packages/evm/contracts/Hashi.sol +++ b/packages/evm/contracts/Hashi.sol @@ -58,6 +58,8 @@ contract Hashi is IHashi { } for (uint256 i = 0; i < hashes.length; ) { + if (i > hashes.length - threshold) break; + bytes32 baseHash = hashes[i]; if (baseHash == bytes32(0)) { unchecked { @@ -67,7 +69,7 @@ contract Hashi is IHashi { } uint256 num = 0; - for (uint256 j = 0; j < hashes.length; ) { + for (uint256 j = i; j < hashes.length; ) { if (baseHash == hashes[j]) { unchecked { ++num; diff --git a/packages/evm/contracts/ownable/ShuSo.sol b/packages/evm/contracts/ownable/ShuSo.sol index ffdadc9d..1d522532 100644 --- a/packages/evm/contracts/ownable/ShuSo.sol +++ b/packages/evm/contracts/ownable/ShuSo.sol @@ -154,11 +154,13 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { } for (uint i = 0; i < hashes.length; i++) { + if (i > hashes.length - threshold) break; + bytes32 baseHash = hashes[i]; if (baseHash == bytes32(0)) continue; uint256 num = 0; - for (uint j = 0; j < hashes.length; j++) { + for (uint j = i; j < hashes.length; j++) { if (baseHash == hashes[j]) { num++; if (num == threshold) return hashes[i]; From 3b7d3ea867f7f55411b8d2079d3f9fb9362e8967 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 19 Feb 2024 13:15:14 +0100 Subject: [PATCH 134/297] feat(contracts): adds domain to settings --- .../evm/contracts/ownable/GiriGiriBashi.sol | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/evm/contracts/ownable/GiriGiriBashi.sol b/packages/evm/contracts/ownable/GiriGiriBashi.sol index fd06d8ae..b9c320f0 100644 --- a/packages/evm/contracts/ownable/GiriGiriBashi.sol +++ b/packages/evm/contracts/ownable/GiriGiriBashi.sol @@ -10,7 +10,7 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { address payable public bondRecipient; // address that bonds from unsuccessful challenges should be sent to. mapping(uint256 => uint256) public heads; // highest Id reported. mapping(uint256 => uint256) public challengeRanges; // how far beyond the current highestId can a challenged. - mapping(IAdapter => Settings) public settings; + mapping(IAdapter => mapping(uint256 => Settings)) public settings; mapping(bytes32 => Challenge) public challenges; // current challenges. constructor(address _owner, address _hashi, address payable _bondRecipient) ShuSo(_owner, _hashi) { @@ -30,8 +30,8 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { /// @inheritdoc IGiriGiriBashi function challengeAdapter(uint256 domain, uint256 id, IAdapter adapter) public payable { if (adapters[domain][adapter].previous == IAdapter(address(0))) revert AdapterNotEnabled(adapter); - if (msg.value < settings[adapter].minimumBond) revert NotEnoughValue(adapter, msg.value); - if (settings[adapter].quarantined) revert AlreadyQuarantined(adapter); + if (msg.value < settings[adapter][domain].minimumBond) revert NotEnoughValue(adapter, msg.value); + if (settings[adapter][domain].quarantined) revert AlreadyQuarantined(adapter); bytes32 challengeId = getChallengeId(domain, id, adapter); if (challenges[challengeId].challenger != address(0)) @@ -41,10 +41,10 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { // check if id is less than highestId + challengeRange, revert if false // check if id is lower than highestId - idDepth, revert if true uint256 challengeRange = challengeRanges[domain]; - uint256 idDepth = settings[adapter].idDepth; + uint256 idDepth = settings[adapter][domain].idDepth; uint256 head = heads[domain]; if ( - id < settings[adapter].startId || // before start id + id < settings[adapter][domain].startId || // before start id (challengeRange != 0 && id >= head && id - head > challengeRange) || // over domain challenge range (idDepth != 0 && head > idDepth && id <= head - idDepth) // outside of adapter idDepth ) revert OutOfRange(adapter, id); @@ -129,7 +129,7 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { if (currentAdapters.length != newAdapters.length || currentAdapters.length != _settings.length) revert UnequalArrayLengths(); for (uint i = 0; i < currentAdapters.length; i++) { - if (!settings[currentAdapters[i]].quarantined) revert AdapterNotQuarantined(currentAdapters[i]); + if (!settings[currentAdapters[i]][domain].quarantined) revert AdapterNotQuarantined(currentAdapters[i]); } _disableAdapters(domain, currentAdapters); _enableAdapters(domain, newAdapters); @@ -149,7 +149,7 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { revert ChallengeNotFound(challengeId, domain, id, adapter); Challenge storage challenge = challenges[challengeId]; - Settings storage adapterSettings = settings[adapter]; + Settings storage adapterSettings = settings[adapter][domain]; bytes32 storedHash = adapter.getHash(domain, id); if (storedHash == bytes32(0)) { @@ -219,11 +219,11 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { if (_adapters.length != _settings.length) revert UnequalArrayLengths(); for (uint i = 0; i < _adapters.length; i++) { IAdapter adapter = _adapters[i]; - settings[adapter].quarantined = false; - settings[adapter].minimumBond = _settings[i].minimumBond; - settings[adapter].startId = _settings[i].startId; - settings[adapter].idDepth = _settings[i].idDepth; - settings[adapter].timeout = _settings[i].timeout; + settings[adapter][domain].quarantined = false; + settings[adapter][domain].minimumBond = _settings[i].minimumBond; + settings[adapter][domain].startId = _settings[i].startId; + settings[adapter][domain].idDepth = _settings[i].idDepth; + settings[adapter][domain].timeout = _settings[i].timeout; emit SettingsInitialized(domain, adapter, _settings[i]); } } From aafcd2ec9aa22242a4ba46ad8e6d294d03a9e7bd Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 19 Feb 2024 13:22:53 +0100 Subject: [PATCH 135/297] refactor(contracts): rn uint into uint256 --- packages/evm/contracts/ownable/GiriGiriBashi.sol | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/evm/contracts/ownable/GiriGiriBashi.sol b/packages/evm/contracts/ownable/GiriGiriBashi.sol index b9c320f0..3005c64f 100644 --- a/packages/evm/contracts/ownable/GiriGiriBashi.sol +++ b/packages/evm/contracts/ownable/GiriGiriBashi.sol @@ -77,11 +77,11 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { if (confidence >= threshold) revert CannotProveNoConfidence(domain, id, _adapters); bytes32[] memory hashes = new bytes32[](_adapters.length); - for (uint i = 0; i < _adapters.length; i++) hashes[i] = _adapters[i].getHash(domain, id); + for (uint256 i = 0; i < _adapters.length; i++) hashes[i] = _adapters[i].getHash(domain, id); // prove that each member of _adapters disagrees - for (uint i = 0; i < hashes.length; i++) - for (uint j = 0; j < hashes.length; j++) + for (uint256 i = 0; i < hashes.length; i++) + for (uint256 j = 0; j < hashes.length; j++) if (hashes[i] == hashes[j] && i != j) revert AdaptersAgreed(_adapters[i], _adapters[j]); domains[domain].threshold = type(uint256).max; @@ -128,7 +128,7 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { ) public onlyOwner { if (currentAdapters.length != newAdapters.length || currentAdapters.length != _settings.length) revert UnequalArrayLengths(); - for (uint i = 0; i < currentAdapters.length; i++) { + for (uint256 i = 0; i < currentAdapters.length; i++) { if (!settings[currentAdapters[i]][domain].quarantined) revert AdapterNotQuarantined(currentAdapters[i]); } _disableAdapters(domain, currentAdapters); @@ -217,7 +217,7 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { function initSettings(uint256 domain, IAdapter[] memory _adapters, Settings[] memory _settings) private { if (_adapters.length != _settings.length) revert UnequalArrayLengths(); - for (uint i = 0; i < _adapters.length; i++) { + for (uint256 i = 0; i < _adapters.length; i++) { IAdapter adapter = _adapters[i]; settings[adapter][domain].quarantined = false; settings[adapter][domain].minimumBond = _settings[i].minimumBond; From 3557312f7b37b257d49991823506b6eda932f3ac Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 19 Feb 2024 13:46:25 +0100 Subject: [PATCH 136/297] refactor(contracts): changes settings mapping --- .../evm/contracts/ownable/GiriGiriBashi.sol | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/evm/contracts/ownable/GiriGiriBashi.sol b/packages/evm/contracts/ownable/GiriGiriBashi.sol index 3005c64f..f820e998 100644 --- a/packages/evm/contracts/ownable/GiriGiriBashi.sol +++ b/packages/evm/contracts/ownable/GiriGiriBashi.sol @@ -10,7 +10,7 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { address payable public bondRecipient; // address that bonds from unsuccessful challenges should be sent to. mapping(uint256 => uint256) public heads; // highest Id reported. mapping(uint256 => uint256) public challengeRanges; // how far beyond the current highestId can a challenged. - mapping(IAdapter => mapping(uint256 => Settings)) public settings; + mapping(uint256 => mapping(IAdapter => Settings)) public settings; mapping(bytes32 => Challenge) public challenges; // current challenges. constructor(address _owner, address _hashi, address payable _bondRecipient) ShuSo(_owner, _hashi) { @@ -30,8 +30,8 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { /// @inheritdoc IGiriGiriBashi function challengeAdapter(uint256 domain, uint256 id, IAdapter adapter) public payable { if (adapters[domain][adapter].previous == IAdapter(address(0))) revert AdapterNotEnabled(adapter); - if (msg.value < settings[adapter][domain].minimumBond) revert NotEnoughValue(adapter, msg.value); - if (settings[adapter][domain].quarantined) revert AlreadyQuarantined(adapter); + if (msg.value < settings[domain][adapter].minimumBond) revert NotEnoughValue(adapter, msg.value); + if (settings[domain][adapter].quarantined) revert AlreadyQuarantined(adapter); bytes32 challengeId = getChallengeId(domain, id, adapter); if (challenges[challengeId].challenger != address(0)) @@ -41,10 +41,10 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { // check if id is less than highestId + challengeRange, revert if false // check if id is lower than highestId - idDepth, revert if true uint256 challengeRange = challengeRanges[domain]; - uint256 idDepth = settings[adapter][domain].idDepth; + uint256 idDepth = settings[domain][adapter].idDepth; uint256 head = heads[domain]; if ( - id < settings[adapter][domain].startId || // before start id + id < settings[domain][adapter].startId || // before start id (challengeRange != 0 && id >= head && id - head > challengeRange) || // over domain challenge range (idDepth != 0 && head > idDepth && id <= head - idDepth) // outside of adapter idDepth ) revert OutOfRange(adapter, id); @@ -129,7 +129,7 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { if (currentAdapters.length != newAdapters.length || currentAdapters.length != _settings.length) revert UnequalArrayLengths(); for (uint256 i = 0; i < currentAdapters.length; i++) { - if (!settings[currentAdapters[i]][domain].quarantined) revert AdapterNotQuarantined(currentAdapters[i]); + if (!settings[domain][currentAdapters[i]].quarantined) revert AdapterNotQuarantined(currentAdapters[i]); } _disableAdapters(domain, currentAdapters); _enableAdapters(domain, newAdapters); @@ -149,7 +149,7 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { revert ChallengeNotFound(challengeId, domain, id, adapter); Challenge storage challenge = challenges[challengeId]; - Settings storage adapterSettings = settings[adapter][domain]; + Settings storage adapterSettings = settings[domain][adapter]; bytes32 storedHash = adapter.getHash(domain, id); if (storedHash == bytes32(0)) { @@ -219,11 +219,11 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { if (_adapters.length != _settings.length) revert UnequalArrayLengths(); for (uint256 i = 0; i < _adapters.length; i++) { IAdapter adapter = _adapters[i]; - settings[adapter][domain].quarantined = false; - settings[adapter][domain].minimumBond = _settings[i].minimumBond; - settings[adapter][domain].startId = _settings[i].startId; - settings[adapter][domain].idDepth = _settings[i].idDepth; - settings[adapter][domain].timeout = _settings[i].timeout; + settings[domain][adapter].quarantined = false; + settings[domain][adapter].minimumBond = _settings[i].minimumBond; + settings[domain][adapter].startId = _settings[i].startId; + settings[domain][adapter].idDepth = _settings[i].idDepth; + settings[domain][adapter].timeout = _settings[i].timeout; emit SettingsInitialized(domain, adapter, _settings[i]); } } From 5d1d3c03802c0e3165f33175f8746466cb8f4600 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 19 Feb 2024 14:48:11 +0100 Subject: [PATCH 137/297] fix(contracts): adds a check to prevent using the same adapters + order to resolveChallenge --- .../evm/contracts/interfaces/IGiriGiriBashi.sol | 1 + packages/evm/contracts/ownable/GiriGiriBashi.sol | 15 +++++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/packages/evm/contracts/interfaces/IGiriGiriBashi.sol b/packages/evm/contracts/interfaces/IGiriGiriBashi.sol index 2b917028..2f2859c9 100644 --- a/packages/evm/contracts/interfaces/IGiriGiriBashi.sol +++ b/packages/evm/contracts/interfaces/IGiriGiriBashi.sol @@ -32,6 +32,7 @@ interface IGiriGiriBashi is IShuSho { error ChallengeRangeAlreadySet(uint256 domain); error CountMustBeZero(uint256 domain); error DuplicateChallenge(bytes32 challengeId, uint256 domain, uint256 id, IAdapter adapter); + error InvalidAdapters(IAdapter[] adapters, IAdapter adapter); error NoConfidenceRequired(); error NotEnoughValue(IAdapter adapter, uint256 value); error OutOfRange(IAdapter adapter, uint256 id); diff --git a/packages/evm/contracts/ownable/GiriGiriBashi.sol b/packages/evm/contracts/ownable/GiriGiriBashi.sol index f820e998..3a4f76e4 100644 --- a/packages/evm/contracts/ownable/GiriGiriBashi.sol +++ b/packages/evm/contracts/ownable/GiriGiriBashi.sol @@ -148,24 +148,29 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { if (challenges[challengeId].challenger == address(0)) revert ChallengeNotFound(challengeId, domain, id, adapter); + for (uint256 i = 0; i < _adapters.length; ) { + if (_adapters[i] == adapter) revert InvalidAdapters(_adapters, adapter); + unchecked { + ++i; + } + } + Challenge storage challenge = challenges[challengeId]; Settings storage adapterSettings = settings[domain][adapter]; bytes32 storedHash = adapter.getHash(domain, id); if (storedHash == bytes32(0)) { - // check block.timestamp is greater than challenge.timestamp + adapterSettings.timeout, revert if false. if (block.timestamp < challenge.timestamp + adapterSettings.timeout) revert AdapterHasNotYetTimedOut(adapter); adapterSettings.quarantined = true; - // send bond to challenger challenge.challenger.transfer(challenge.bond); success = true; } else { // if _adapters + 1 equals threshold && _adapters + adapter report the same header - if (_adapters.length + 1 == domains[domain].threshold) { + if (_adapters.length == domains[domain].threshold - 1) { + checkAdapterOrderAndValidity(domain, _adapters); bytes32 canonicalHash = hashi.getHash(domain, id, _adapters); if (canonicalHash == storedHash) { - // return bond to recipient bondRecipient.transfer(challenge.bond); success = false; } else { @@ -178,9 +183,7 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { bondRecipient.transfer(challenge.bond); success = false; } else { - // quaratine adapter adapterSettings.quarantined = true; - // return bond to challenger challenge.challenger.transfer(challenge.bond); success = true; } From 35c53d925b084c6d7bd5b020685e852d526a34d0 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 19 Feb 2024 15:38:11 +0100 Subject: [PATCH 138/297] refactor(evm): rn InvalidAdapters into AdaptersCannotContainChallengedAdapter --- packages/evm/contracts/interfaces/IGiriGiriBashi.sol | 2 +- packages/evm/contracts/ownable/GiriGiriBashi.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/evm/contracts/interfaces/IGiriGiriBashi.sol b/packages/evm/contracts/interfaces/IGiriGiriBashi.sol index 2f2859c9..32d60d2a 100644 --- a/packages/evm/contracts/interfaces/IGiriGiriBashi.sol +++ b/packages/evm/contracts/interfaces/IGiriGiriBashi.sol @@ -23,6 +23,7 @@ interface IGiriGiriBashi is IShuSho { uint256 timeout; // grace period in which the adapter must report on an in-range id after being challenged. } + error AdaptersCannotContainChallengedAdapter(IAdapter[] adapters, IAdapter adapter); error AdapterHasNotYetTimedOut(IAdapter adapter); error AdapterNotQuarantined(IAdapter adapter); error AdaptersAgreed(IAdapter adapter1, IAdapter adapter2); @@ -32,7 +33,6 @@ interface IGiriGiriBashi is IShuSho { error ChallengeRangeAlreadySet(uint256 domain); error CountMustBeZero(uint256 domain); error DuplicateChallenge(bytes32 challengeId, uint256 domain, uint256 id, IAdapter adapter); - error InvalidAdapters(IAdapter[] adapters, IAdapter adapter); error NoConfidenceRequired(); error NotEnoughValue(IAdapter adapter, uint256 value); error OutOfRange(IAdapter adapter, uint256 id); diff --git a/packages/evm/contracts/ownable/GiriGiriBashi.sol b/packages/evm/contracts/ownable/GiriGiriBashi.sol index 3a4f76e4..fb3aac56 100644 --- a/packages/evm/contracts/ownable/GiriGiriBashi.sol +++ b/packages/evm/contracts/ownable/GiriGiriBashi.sol @@ -149,7 +149,7 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { revert ChallengeNotFound(challengeId, domain, id, adapter); for (uint256 i = 0; i < _adapters.length; ) { - if (_adapters[i] == adapter) revert InvalidAdapters(_adapters, adapter); + if (_adapters[i] == adapter) revert AdaptersCannotContainChallengedAdapter(_adapters, adapter); unchecked { ++i; } From 872589d8494ba69aceb4668853358b20d7d66d47 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 20 Feb 2024 07:28:37 +0100 Subject: [PATCH 139/297] feat(test): adds GiriGiriBashi tests --- packages/evm/test/03_GiriGiriBashi.spec.ts | 62 +++++++++++++++++++--- 1 file changed, 54 insertions(+), 8 deletions(-) diff --git a/packages/evm/test/03_GiriGiriBashi.spec.ts b/packages/evm/test/03_GiriGiriBashi.spec.ts index 5b58c055..8fc61060 100644 --- a/packages/evm/test/03_GiriGiriBashi.spec.ts +++ b/packages/evm/test/03_GiriGiriBashi.spec.ts @@ -163,13 +163,13 @@ describe("GiriGiriBashi", function () { expect((await giriGiriBashi.adapters(DOMAIN_ID, ADDRESS_TWO)).previous).to.equal(LIST_END) expect((await giriGiriBashi.adapters(DOMAIN_ID, ADDRESS_THREE)).next).to.equal(LIST_END) expect((await giriGiriBashi.adapters(DOMAIN_ID, ADDRESS_THREE)).previous).to.equal(ADDRESS_TWO) - let adapterSettings = await giriGiriBashi.settings(ADDRESS_TWO) + let adapterSettings = await giriGiriBashi.settings(DOMAIN_ID, ADDRESS_TWO) expect(adapterSettings.quarantined).to.deep.equal(settings.quarantined) expect(adapterSettings.minimumBond).to.deep.equal(settings.minimumBond) expect(adapterSettings.startId).to.deep.equal(settings.startId) expect(adapterSettings.idDepth).to.deep.equal(settings.idDepth) expect(adapterSettings.timeout).to.deep.equal(settings.timeout) - adapterSettings = await giriGiriBashi.settings(ADDRESS_THREE) + adapterSettings = await giriGiriBashi.settings(DOMAIN_ID, ADDRESS_THREE) expect(adapterSettings.quarantined).to.deep.equal(settings.quarantined) expect(adapterSettings.minimumBond).to.deep.equal(settings.minimumBond) expect(adapterSettings.startId).to.deep.equal(settings.startId) @@ -300,6 +300,49 @@ describe("GiriGiriBashi", function () { .to.be.revertedWithCustomError(giriGiriBashi, "AlreadyQuarantined") .withArgs(mockAdapter.address) }) + it("Reverts if adapters array contains duplicates", async function () { + const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() + const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) + await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) + + await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) + const head = await giriGiriBashi.heads(DOMAIN_ID) + const challengeBlock = head - CHALLENGE_RANGE + 2 + await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { + value: BOND, + }) + const challengeId = await giriGiriBashi.getChallengeId(DOMAIN_ID, challengeBlock, mockAdapter.address) + const challenge = await giriGiriBashi.challenges(challengeId) + const increaseAmount = challenge.timestamp.add(settings.timeout).add(1) + + await network.provider.send("evm_setNextBlockTimestamp", [increaseAmount.toHexString()]) + await mockAdapter.setHashes(DOMAIN_ID, [challengeBlock], [HASH_GOOD]) + await secondMockAdapter.setHashes(DOMAIN_ID, [challengeBlock], [HASH_GOOD]) + + await expect( + giriGiriBashi.resolveChallenge(DOMAIN_ID, challengeBlock, mockAdapter.address, [ + secondMockAdapter.address, + secondMockAdapter.address, + ]), + ).to.be.revertedWithCustomError(giriGiriBashi, "DuplicateOrOutOfOrderAdapters") + }) + it("Reverts if adapters array contains the challenged adapter", async function () { + const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() + const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) + await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) + + await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) + const head = await giriGiriBashi.heads(DOMAIN_ID) + const challengeBlock = head - CHALLENGE_RANGE + 2 + await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { + value: BOND, + }) + + const wrongAdapters = [secondMockAdapter.address, mockAdapter.address] + await expect(giriGiriBashi.resolveChallenge(DOMAIN_ID, challengeBlock, mockAdapter.address, wrongAdapters)) + .to.revertedWithCustomError(giriGiriBashi, "AdaptersCannotContainChallengedAdapter") + .withArgs(wrongAdapters, mockAdapter.address) + }) it("Reverts if duplicate challenge exists", async function () { const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) @@ -436,7 +479,7 @@ describe("GiriGiriBashi", function () { const newBalance = await ethers.provider.getBalance(wallet.address) await expect(newBalance).to.be.greaterThan(previousBalance) - const quarantined = (await giriGiriBashi.settings(mockAdapter.address)).quarantined + const quarantined = (await giriGiriBashi.settings(DOMAIN_ID, mockAdapter.address)).quarantined await expect(quarantined).to.equal(true) }) it("Keeps bond if _adapters + adapter equals threshold and agree", async function () { @@ -451,10 +494,13 @@ describe("GiriGiriBashi", function () { value: BOND, }) + await mockAdapter.setHashes(DOMAIN_ID, [challengeBlock], [HASH_GOOD]) + await secondMockAdapter.setHashes(DOMAIN_ID, [challengeBlock], [HASH_GOOD]) + const balanceBefore = await ethers.provider.getBalance(ADDRESS_TWO) await giriGiriBashi.resolveChallenge(DOMAIN_ID, challengeBlock, mockAdapter.address, [secondMockAdapter.address]) expect(await ethers.provider.getBalance(ADDRESS_TWO)).to.equal(balanceBefore.add(BOND)) - const quarantined = (await giriGiriBashi.settings(mockAdapter.address)).quarantined + const quarantined = (await giriGiriBashi.settings(DOMAIN_ID, mockAdapter.address)).quarantined expect(quarantined).to.equal(false) }) it("Reverts if _adapters + adapter equals threshold and disagree", async function () { @@ -497,7 +543,7 @@ describe("GiriGiriBashi", function () { [secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses), ) expect(await ethers.provider.getBalance(ADDRESS_TWO)).to.equal(previousBalance.add(BOND)) - const quarantined = (await giriGiriBashi.settings(mockAdapter.address)).quarantined + const quarantined = (await giriGiriBashi.settings(DOMAIN_ID, mockAdapter.address)).quarantined expect(quarantined).to.equal(false) }) it("Quarantines adapter and returns bond if challenged adapter disagrees with canonical hash", async function () { @@ -519,7 +565,7 @@ describe("GiriGiriBashi", function () { mockAdapter.address, [secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses), ) - const quarantined = (await giriGiriBashi.settings(mockAdapter.address)).quarantined + const quarantined = (await giriGiriBashi.settings(DOMAIN_ID, mockAdapter.address)).quarantined await expect(quarantined).to.equal(true) }) it("Clears state after challenge is resolved", async function () { @@ -541,7 +587,7 @@ describe("GiriGiriBashi", function () { mockAdapter.address, [secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses), ) - const quarantined = (await giriGiriBashi.settings(mockAdapter.address)).quarantined + const quarantined = (await giriGiriBashi.settings(DOMAIN_ID, mockAdapter.address)).quarantined expect(quarantined).to.equal(true) const challengeId = await giriGiriBashi.getChallengeId(DOMAIN_ID, challengeBlock, mockAdapter.address) const challenge = await giriGiriBashi.challenges(challengeId) @@ -717,7 +763,7 @@ describe("GiriGiriBashi", function () { expect( await giriGiriBashi.replaceQuarantinedAdapters(DOMAIN_ID, [mockAdapter.address], [ADDRESS_TWO], [settings]), ) - const adapterSettings = await giriGiriBashi.settings(ADDRESS_TWO) + const adapterSettings = await giriGiriBashi.settings(DOMAIN_ID, ADDRESS_TWO) expect(adapterSettings.quarantined).to.deep.equal(settings.quarantined) expect(adapterSettings.minimumBond).to.deep.equal(settings.minimumBond) expect(adapterSettings.startId).to.deep.equal(settings.startId) From 8c9b8af70edcb0cfcaeb8d57cd6514a3026cd8c5 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 20 Feb 2024 14:20:44 +0100 Subject: [PATCH 140/297] feat(contracts): adds notice comment to _setThreshold within ShuSho --- packages/evm/contracts/ownable/ShuSo.sol | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/evm/contracts/ownable/ShuSo.sol b/packages/evm/contracts/ownable/ShuSo.sol index ffdadc9d..5c03fecf 100644 --- a/packages/evm/contracts/ownable/ShuSo.sol +++ b/packages/evm/contracts/ownable/ShuSo.sol @@ -202,6 +202,9 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { * @param threshold - Uint256 threshold to set for the given domain. * @notice Only callable by the owner of this contract. * @notice Reverts if threshold is already set to the given value. + * @notice It's IMPORTANT to set the threshold greater than or equal to _adapters.length + 1. + * Setting it lower would mean that the return value of _getThresholdHash + * would depend on the order of the adapters. */ function _setThreshold(uint256 domain, uint256 threshold) internal onlyOwner { if (domains[domain].threshold == threshold) revert DuplicateThreashold(threshold); From df77641fa58e9549c36eadcbbb33a7ca1d20af0c Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 20 Feb 2024 15:49:11 +0100 Subject: [PATCH 141/297] fix(contracts & test): adds check to prevent settings the threhold less than the majority of the adapters within ShuSho --- packages/evm/contracts/interfaces/IShuSho.sol | 2 + .../evm/contracts/ownable/GiriGiriBashi.sol | 2 +- packages/evm/contracts/ownable/ShuSo.sol | 6 +- packages/evm/test/02_ShoyuBashi.spec.ts | 18 ++-- packages/evm/test/03_GiriGiriBashi.spec.ts | 82 +++++++++++++++---- 5 files changed, 85 insertions(+), 25 deletions(-) diff --git a/packages/evm/contracts/interfaces/IShuSho.sol b/packages/evm/contracts/interfaces/IShuSho.sol index 97feeecf..c573ab43 100644 --- a/packages/evm/contracts/interfaces/IShuSho.sol +++ b/packages/evm/contracts/interfaces/IShuSho.sol @@ -20,10 +20,12 @@ interface IShuSho { error AdapterNotEnabled(IAdapter adapter); error AdapterAlreadyEnabled(IAdapter adapter); + error CountCannotBeZero(); error DuplicateHashiAddress(IHashi hashi); error DuplicateOrOutOfOrderAdapters(IAdapter adapterOne, IAdapter adapterTwo); error DuplicateThreashold(uint256 threshold); error InvalidAdapter(IAdapter adapter); + error InvalidThreshold(uint256 threshold); error NoAdaptersEnabled(uint256 domain); error NoAdaptersGiven(); error ThresholdNotMet(); diff --git a/packages/evm/contracts/ownable/GiriGiriBashi.sol b/packages/evm/contracts/ownable/GiriGiriBashi.sol index fb3aac56..1606b877 100644 --- a/packages/evm/contracts/ownable/GiriGiriBashi.sol +++ b/packages/evm/contracts/ownable/GiriGiriBashi.sol @@ -23,7 +23,7 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { } modifier zeroCount(uint256 domain) { - if (domains[domain].count != 0) revert CountMustBeZero(domain); + if (domains[domain].count != 0 && domains[domain].threshold > 0) revert CountMustBeZero(domain); _; } diff --git a/packages/evm/contracts/ownable/ShuSo.sol b/packages/evm/contracts/ownable/ShuSo.sol index 5c03fecf..78dba4fb 100644 --- a/packages/evm/contracts/ownable/ShuSo.sol +++ b/packages/evm/contracts/ownable/ShuSo.sol @@ -202,11 +202,11 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { * @param threshold - Uint256 threshold to set for the given domain. * @notice Only callable by the owner of this contract. * @notice Reverts if threshold is already set to the given value. - * @notice It's IMPORTANT to set the threshold greater than or equal to _adapters.length + 1. - * Setting it lower would mean that the return value of _getThresholdHash - * would depend on the order of the adapters. */ function _setThreshold(uint256 domain, uint256 threshold) internal onlyOwner { + uint256 count = domains[domain].count; + if (count == 0) revert CountCannotBeZero(); + if (threshold < (count / 2) + 1) revert InvalidThreshold(threshold); if (domains[domain].threshold == threshold) revert DuplicateThreashold(threshold); domains[domain].threshold = threshold; emit ThresholdSet(domain, threshold); diff --git a/packages/evm/test/02_ShoyuBashi.spec.ts b/packages/evm/test/02_ShoyuBashi.spec.ts index af46d28f..3e54f5d4 100644 --- a/packages/evm/test/02_ShoyuBashi.spec.ts +++ b/packages/evm/test/02_ShoyuBashi.spec.ts @@ -22,7 +22,6 @@ const setup = async () => { await mockAdapter.setHashes(DOMAIN_ID, [0, 1, 2], [HASH_ZERO, HASH_GOOD, HASH_GOOD]) await anotherAdapter.setHashes(DOMAIN_ID, [0, 1, 2], [HASH_ZERO, HASH_GOOD, HASH_BAD]) - await shoyuBashi.setThreshold(DOMAIN_ID, 2) return { wallet, @@ -81,6 +80,8 @@ describe("ShoyuBashi", function () { }) it("Reverts if threshold is already set", async function () { const { shoyuBashi } = await setup() + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) + await shoyuBashi.setThreshold(DOMAIN_ID, 2) await expect(shoyuBashi.setThreshold(DOMAIN_ID, 2)).to.be.revertedWithCustomError( shoyuBashi, "DuplicateThreashold", @@ -88,12 +89,14 @@ describe("ShoyuBashi", function () { }) it("Sets threshold for the given ChainID", async function () { const { shoyuBashi } = await setup() - expect(await shoyuBashi.setThreshold(DOMAIN_ID, 3)) - expect((await shoyuBashi.domains(DOMAIN_ID)).threshold).to.equal(3) + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) + expect(await shoyuBashi.setThreshold(DOMAIN_ID, 2)) + expect((await shoyuBashi.domains(DOMAIN_ID)).threshold).to.equal(2) }) it("Emits HashiSet() event", async function () { const { shoyuBashi } = await setup() - await expect(shoyuBashi.setThreshold(DOMAIN_ID, 3)).to.emit(shoyuBashi, "ThresholdSet").withArgs(DOMAIN_ID, 3) + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) + await expect(shoyuBashi.setThreshold(DOMAIN_ID, 2)).to.emit(shoyuBashi, "ThresholdSet").withArgs(DOMAIN_ID, 2) }) }) @@ -246,9 +249,9 @@ describe("ShoyuBashi", function () { it("Returns threshold and count", async function () { const { shoyuBashi } = await setup() await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) - await shoyuBashi.setThreshold(DOMAIN_ID, 1) + await shoyuBashi.setThreshold(DOMAIN_ID, 2) const [threshold] = await shoyuBashi.getThresholdAndCount(DOMAIN_ID) - await expect(threshold).to.equal(1) + await expect(threshold).to.equal(2) }) }) @@ -263,6 +266,7 @@ describe("ShoyuBashi", function () { it("Reverts if threshold is not met", async function () { const { shoyuBashi, mockAdapter } = await setup() await shoyuBashi.enableAdapters(DOMAIN_ID, [mockAdapter.address]) + await shoyuBashi.setThreshold(DOMAIN_ID, 2) await expect(shoyuBashi.getUnanimousHash(DOMAIN_ID, 1)).to.be.revertedWithCustomError( shoyuBashi, "ThresholdNotMet", @@ -286,6 +290,7 @@ describe("ShoyuBashi", function () { it("Reverts if threshold is not met", async function () { const { shoyuBashi, mockAdapter, anotherAdapter } = await setup() await shoyuBashi.enableAdapters(DOMAIN_ID, [mockAdapter.address, anotherAdapter.address]) + await shoyuBashi.setThreshold(DOMAIN_ID, 3) await expect(shoyuBashi.getThresholdHash(DOMAIN_ID, 2)).to.be.revertedWithCustomError( shoyuBashi, "ThresholdNotMet", @@ -310,6 +315,7 @@ describe("ShoyuBashi", function () { it("Reverts if threshold is not met", async function () { const { shoyuBashi, mockAdapter } = await setup() await shoyuBashi.enableAdapters(DOMAIN_ID, [mockAdapter.address]) + await shoyuBashi.setThreshold(DOMAIN_ID, 2) await expect(shoyuBashi.getHash(DOMAIN_ID, 1, [mockAdapter.address])).to.be.revertedWithCustomError( shoyuBashi, "ThresholdNotMet", diff --git a/packages/evm/test/03_GiriGiriBashi.spec.ts b/packages/evm/test/03_GiriGiriBashi.spec.ts index 8fc61060..28aa14ed 100644 --- a/packages/evm/test/03_GiriGiriBashi.spec.ts +++ b/packages/evm/test/03_GiriGiriBashi.spec.ts @@ -49,7 +49,7 @@ const setup = async (_configs?: any) => { [0, 1, 20, 21, 22], [HASH_ZERO, HASH_GOOD, HASH_DEAD, HASH_GOOD, HASH_GOOD], ) - await giriGiriBashi.setThreshold(DOMAIN_ID, _configs?.threshold || 2) + await giriGiriBashi.setChallengeRange(DOMAIN_ID, CHALLENGE_RANGE) const settings = { @@ -111,21 +111,50 @@ describe("GiriGiriBashi", function () { it("Reverts if count is greater than zero", async function () { const { giriGiriBashi, mockAdapter, settings } = await setup() await giriGiriBashi.enableAdapters(DOMAIN_ID, [mockAdapter.address], [settings]) + await giriGiriBashi.setThreshold(DOMAIN_ID, 2) await expect(giriGiriBashi.setThreshold(DOMAIN_ID, 2)).to.be.revertedWithCustomError( giriGiriBashi, "CountMustBeZero", ) }) - it("Sets threshold for the given ChainID", async function () { + it("Reverts if adapters are not enabled", async function () { const { giriGiriBashi } = await setup() - expect(await giriGiriBashi.setThreshold(DOMAIN_ID, 3)) - expect((await giriGiriBashi.domains(DOMAIN_ID)).threshold).to.equal(3) + await expect(giriGiriBashi.setThreshold(DOMAIN_ID, 2)).to.be.revertedWithCustomError( + giriGiriBashi, + "CountCannotBeZero", + ) + }) + it("Reverts if the threshold is less than them majority of adapters", async function () { + const { giriGiriBashi, settings, mockAdapter, secondMockAdapter, thirdMockAdapter } = await setup() + await giriGiriBashi.enableAdapters( + DOMAIN_ID, + [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address], + [settings, settings, settings], + ) + await expect(giriGiriBashi.setThreshold(DOMAIN_ID, 1)) + .to.be.revertedWithCustomError(giriGiriBashi, "InvalidThreshold") + .withArgs(1) + }) + it("Sets threshold for the given ChainID", async function () { + const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() + await giriGiriBashi.enableAdapters( + DOMAIN_ID, + [mockAdapter.address, secondMockAdapter.address], + [settings, settings], + ) + await giriGiriBashi.setThreshold(DOMAIN_ID, 2) + expect((await giriGiriBashi.domains(DOMAIN_ID)).threshold).to.equal(2) }) it("Emits HashiSet() event", async function () { - const { giriGiriBashi } = await setup() - await expect(giriGiriBashi.setThreshold(DOMAIN_ID, 3)) + const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() + await giriGiriBashi.enableAdapters( + DOMAIN_ID, + [mockAdapter.address, secondMockAdapter.address], + [settings, settings], + ) + await expect(giriGiriBashi.setThreshold(DOMAIN_ID, 2)) .to.emit(giriGiriBashi, "ThresholdSet") - .withArgs(DOMAIN_ID, 3) + .withArgs(DOMAIN_ID, 2) }) }) @@ -139,7 +168,8 @@ describe("GiriGiriBashi", function () { }) it("Reverts if any adapters are already enabled", async function () { const { giriGiriBashi, settings } = await setup() - await expect(giriGiriBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO], [settings])) + await giriGiriBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO], [settings]) + await giriGiriBashi.setThreshold(DOMAIN_ID, 1) await expect(giriGiriBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO], [settings])).to.be.revertedWithCustomError( giriGiriBashi, "CountMustBeZero", @@ -153,7 +183,8 @@ describe("GiriGiriBashi", function () { }) it("Enables the given adapters", async function () { const { giriGiriBashi, settings } = await setup() - await expect(giriGiriBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE], [settings, settings])) + await giriGiriBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE], [settings, settings]) + await giriGiriBashi.setThreshold(DOMAIN_ID, 2) const adapters = await giriGiriBashi.getAdapters(DOMAIN_ID) await expect(adapters[0]).to.equal(ADDRESS_TWO) await expect(adapters[1]).to.equal(ADDRESS_THREE) @@ -194,8 +225,8 @@ describe("GiriGiriBashi", function () { }) it("Disables the given adapters", async function () { const { giriGiriBashi, settings } = await setup() - await giriGiriBashi.setThreshold(DOMAIN_ID, ethers.constants.MaxUint256) await giriGiriBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE], [settings, settings]) + await giriGiriBashi.setThreshold(DOMAIN_ID, ethers.constants.MaxUint256) await giriGiriBashi.disableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) const adapters = await giriGiriBashi.getAdapters(DOMAIN_ID) await expect(adapters[0]).to.equal(undefined) @@ -210,6 +241,7 @@ describe("GiriGiriBashi", function () { [mockAdapter.address, secondMockAdapter.address], [settings, settings], ) + await giriGiriBashi.setThreshold(DOMAIN_ID, 2) const oldHead = await giriGiriBashi.heads(DOMAIN_ID) await giriGiriBashi.getUnanimousHash(DOMAIN_ID, 1) const newHead = await giriGiriBashi.heads(DOMAIN_ID) @@ -218,14 +250,15 @@ describe("GiriGiriBashi", function () { }) describe("getThresholdHash()", function () { - for (let threshold = 1; threshold <= 3; threshold++) { + for (let threshold = 2; threshold <= 3; threshold++) { it(`Updates head for given domain with ${threshold}/3`, async function () { - const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup({ threshold }) + const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() await giriGiriBashi.enableAdapters( DOMAIN_ID, [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address], [settings, settings, settings], ) + await giriGiriBashi.setThreshold(DOMAIN_ID, threshold) const oldHead = await giriGiriBashi.heads(DOMAIN_ID) expect(await giriGiriBashi.callStatic.getThresholdHash(DOMAIN_ID, 1)).to.equal(HASH_GOOD) await giriGiriBashi.getThresholdHash(DOMAIN_ID, 1) @@ -243,6 +276,7 @@ describe("GiriGiriBashi", function () { [mockAdapter.address, secondMockAdapter.address], [settings, settings], ) + await giriGiriBashi.setThreshold(DOMAIN_ID, 2) let adapters if (secondMockAdapter.address > mockAdapter.address) { adapters = [mockAdapter.address, secondMockAdapter.address] @@ -270,6 +304,7 @@ describe("GiriGiriBashi", function () { [mockAdapter.address, secondMockAdapter.address], [settings, settings], ) + await giriGiriBashi.setThreshold(DOMAIN_ID, 2) await expect(giriGiriBashi.challengeAdapter(DOMAIN_ID, 1, mockAdapter.address)) .to.be.revertedWithCustomError(giriGiriBashi, "NotEnoughValue") .withArgs(mockAdapter.address, 0) @@ -278,6 +313,7 @@ describe("GiriGiriBashi", function () { const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) + await giriGiriBashi.setThreshold(DOMAIN_ID, 2) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) const head = await giriGiriBashi.heads(DOMAIN_ID) @@ -304,6 +340,7 @@ describe("GiriGiriBashi", function () { const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) + await giriGiriBashi.setThreshold(DOMAIN_ID, 2) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) const head = await giriGiriBashi.heads(DOMAIN_ID) @@ -347,6 +384,7 @@ describe("GiriGiriBashi", function () { const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) + await giriGiriBashi.setThreshold(DOMAIN_ID, 2) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) const head = await giriGiriBashi.heads(DOMAIN_ID) expect( @@ -364,6 +402,7 @@ describe("GiriGiriBashi", function () { const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) + await giriGiriBashi.setThreshold(DOMAIN_ID, 2) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) const head = await giriGiriBashi.heads(DOMAIN_ID) @@ -403,6 +442,7 @@ describe("GiriGiriBashi", function () { const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) + await giriGiriBashi.setThreshold(DOMAIN_ID, 2) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) const head = await giriGiriBashi.heads(DOMAIN_ID) @@ -416,6 +456,7 @@ describe("GiriGiriBashi", function () { const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) + await giriGiriBashi.setThreshold(DOMAIN_ID, 2) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) const head = await giriGiriBashi.heads(DOMAIN_ID) @@ -438,6 +479,7 @@ describe("GiriGiriBashi", function () { const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) + await giriGiriBashi.setThreshold(DOMAIN_ID, 2) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) const head = await giriGiriBashi.heads(DOMAIN_ID) @@ -459,6 +501,7 @@ describe("GiriGiriBashi", function () { const { giriGiriBashi, mockAdapter, secondMockAdapter, settings, wallet } = await setup() const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) + await giriGiriBashi.setThreshold(DOMAIN_ID, 2) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) const head = await giriGiriBashi.heads(DOMAIN_ID) const challengeBlock = head - CHALLENGE_RANGE + 1 @@ -486,6 +529,7 @@ describe("GiriGiriBashi", function () { const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) + await giriGiriBashi.setThreshold(DOMAIN_ID, 2) await giriGiriBashi.getHash(DOMAIN_ID, 1, adapters) const head = await giriGiriBashi.heads(DOMAIN_ID) @@ -494,9 +538,6 @@ describe("GiriGiriBashi", function () { value: BOND, }) - await mockAdapter.setHashes(DOMAIN_ID, [challengeBlock], [HASH_GOOD]) - await secondMockAdapter.setHashes(DOMAIN_ID, [challengeBlock], [HASH_GOOD]) - const balanceBefore = await ethers.provider.getBalance(ADDRESS_TWO) await giriGiriBashi.resolveChallenge(DOMAIN_ID, challengeBlock, mockAdapter.address, [secondMockAdapter.address]) expect(await ethers.provider.getBalance(ADDRESS_TWO)).to.equal(balanceBefore.add(BOND)) @@ -507,6 +548,7 @@ describe("GiriGiriBashi", function () { const { giriGiriBashi, mockAdapter, secondMockAdapter, settings, hashi } = await setup() const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) + await giriGiriBashi.setThreshold(DOMAIN_ID, 2) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) const head = await giriGiriBashi.heads(DOMAIN_ID) @@ -525,6 +567,7 @@ describe("GiriGiriBashi", function () { const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() let adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address] await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) + await giriGiriBashi.setThreshold(DOMAIN_ID, 2) adapters = adapters.sort(compareAddresses) await giriGiriBashi.getHash(DOMAIN_ID, 1, adapters) @@ -550,6 +593,7 @@ describe("GiriGiriBashi", function () { const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() let adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address] await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) + await giriGiriBashi.setThreshold(DOMAIN_ID, 2) adapters = adapters.sort(compareAddresses) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) @@ -572,6 +616,7 @@ describe("GiriGiriBashi", function () { const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() let adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address] await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) + await giriGiriBashi.setThreshold(DOMAIN_ID, 2) adapters = adapters.sort(compareAddresses) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) @@ -599,6 +644,7 @@ describe("GiriGiriBashi", function () { const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings, wallet } = await setup() const adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses) await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) + await giriGiriBashi.setThreshold(DOMAIN_ID, 2) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) const head = await giriGiriBashi.heads(DOMAIN_ID) @@ -626,6 +672,7 @@ describe("GiriGiriBashi", function () { const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() const adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses) await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) + await giriGiriBashi.setThreshold(DOMAIN_ID, 2) await expect(giriGiriBashi.callStatic.declareNoConfidence(DOMAIN_ID, 20, [mockAdapter.address])) .to.be.revertedWithCustomError(giriGiriBashi, "CannotProveNoConfidence") .withArgs(DOMAIN_ID, 20, [mockAdapter.address]) @@ -635,6 +682,7 @@ describe("GiriGiriBashi", function () { const adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses) const adaptersThatAgree = [secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses) await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) + await giriGiriBashi.setThreshold(DOMAIN_ID, 2) await expect(giriGiriBashi.callStatic.declareNoConfidence(DOMAIN_ID, 22, adapters)) .to.be.revertedWithCustomError(giriGiriBashi, "AdaptersAgreed") .withArgs(adaptersThatAgree[0], adaptersThatAgree[1]) @@ -643,6 +691,7 @@ describe("GiriGiriBashi", function () { const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() const adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses) await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) + await giriGiriBashi.setThreshold(DOMAIN_ID, 2) expect(await giriGiriBashi.declareNoConfidence(DOMAIN_ID, 20, adapters)) const domain = await giriGiriBashi.domains(DOMAIN_ID) const challengeRange = await giriGiriBashi.challengeRanges(DOMAIN_ID) @@ -700,6 +749,7 @@ describe("GiriGiriBashi", function () { [mockAdapter.address, secondMockAdapter.address], [settings, settings], ) + await giriGiriBashi.setThreshold(DOMAIN_ID, 2) await expect( giriGiriBashi.replaceQuarantinedAdapters( DOMAIN_ID, @@ -732,6 +782,7 @@ describe("GiriGiriBashi", function () { [mockAdapter.address, secondMockAdapter.address], [settings, settings], ) + await giriGiriBashi.setThreshold(DOMAIN_ID, 2) await expect( giriGiriBashi.replaceQuarantinedAdapters( DOMAIN_ID, @@ -745,6 +796,7 @@ describe("GiriGiriBashi", function () { const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() let adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address] await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) + await giriGiriBashi.setThreshold(DOMAIN_ID, 2) adapters = adapters.sort(compareAddresses) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) From dc5626193f17d99d3150ffaa49a0efc9121127ab Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 20 Feb 2024 16:37:54 +0100 Subject: [PATCH 142/297] fix(contracts & test): fixes declareNoConfidence --- .../evm/contracts/interfaces/IGiriGiriBashi.sol | 2 +- packages/evm/contracts/ownable/GiriGiriBashi.sol | 16 ++++++++++------ packages/evm/test/03_GiriGiriBashi.spec.ts | 8 ++++---- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/packages/evm/contracts/interfaces/IGiriGiriBashi.sol b/packages/evm/contracts/interfaces/IGiriGiriBashi.sol index 32d60d2a..4a3703a8 100644 --- a/packages/evm/contracts/interfaces/IGiriGiriBashi.sol +++ b/packages/evm/contracts/interfaces/IGiriGiriBashi.sol @@ -26,7 +26,7 @@ interface IGiriGiriBashi is IShuSho { error AdaptersCannotContainChallengedAdapter(IAdapter[] adapters, IAdapter adapter); error AdapterHasNotYetTimedOut(IAdapter adapter); error AdapterNotQuarantined(IAdapter adapter); - error AdaptersAgreed(IAdapter adapter1, IAdapter adapter2); + error AdaptersAgreed(); error AlreadyQuarantined(IAdapter adapter); error CannotProveNoConfidence(uint256 domain, uint256 id, IAdapter[] adapters); error ChallengeNotFound(bytes32 challengeId, uint256 domain, uint256 id, IAdapter adapter); diff --git a/packages/evm/contracts/ownable/GiriGiriBashi.sol b/packages/evm/contracts/ownable/GiriGiriBashi.sol index 1606b877..1be375a7 100644 --- a/packages/evm/contracts/ownable/GiriGiriBashi.sol +++ b/packages/evm/contracts/ownable/GiriGiriBashi.sol @@ -72,17 +72,21 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { checkAdapterOrderAndValidity(domain, _adapters); (uint256 threshold, uint256 count) = getThresholdAndCount(domain); - // check that there are enough adapters to prove no confidence - uint256 confidence = (count - _adapters.length) + 1; - if (confidence >= threshold) revert CannotProveNoConfidence(domain, id, _adapters); + if (_adapters.length != count) revert CannotProveNoConfidence(domain, id, _adapters); bytes32[] memory hashes = new bytes32[](_adapters.length); for (uint256 i = 0; i < _adapters.length; i++) hashes[i] = _adapters[i].getHash(domain, id); - // prove that each member of _adapters disagrees - for (uint256 i = 0; i < hashes.length; i++) + for (uint256 i = 0; i < hashes.length; i++) { + uint256 count = 1; for (uint256 j = 0; j < hashes.length; j++) - if (hashes[i] == hashes[j] && i != j) revert AdaptersAgreed(_adapters[i], _adapters[j]); + if (hashes[i] == hashes[j] && i != j) { + count++; + if (count == threshold) { + revert AdaptersAgreed(); + } + } + } domains[domain].threshold = type(uint256).max; delete challengeRanges[domain]; diff --git a/packages/evm/test/03_GiriGiriBashi.spec.ts b/packages/evm/test/03_GiriGiriBashi.spec.ts index 28aa14ed..0d514bf7 100644 --- a/packages/evm/test/03_GiriGiriBashi.spec.ts +++ b/packages/evm/test/03_GiriGiriBashi.spec.ts @@ -680,12 +680,12 @@ describe("GiriGiriBashi", function () { it("Reverts if any of the provided adapters agree", async function () { const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() const adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses) - const adaptersThatAgree = [secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses) await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) await giriGiriBashi.setThreshold(DOMAIN_ID, 2) - await expect(giriGiriBashi.callStatic.declareNoConfidence(DOMAIN_ID, 22, adapters)) - .to.be.revertedWithCustomError(giriGiriBashi, "AdaptersAgreed") - .withArgs(adaptersThatAgree[0], adaptersThatAgree[1]) + await expect(giriGiriBashi.callStatic.declareNoConfidence(DOMAIN_ID, 22, adapters)).to.be.revertedWithCustomError( + giriGiriBashi, + "AdaptersAgreed", + ) }) it("Clears state for domain", async function () { const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() From abb2861d81c241a01c63164c865a083223acd261 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 20 Feb 2024 17:04:30 +0100 Subject: [PATCH 143/297] fix(contracts & test): adds check to prevent declareNoConfidence when the majority of adapters report bytes32(0) --- .../evm/contracts/ownable/GiriGiriBashi.sol | 13 +++++++---- packages/evm/test/03_GiriGiriBashi.spec.ts | 23 +++++++++++++++---- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/packages/evm/contracts/ownable/GiriGiriBashi.sol b/packages/evm/contracts/ownable/GiriGiriBashi.sol index 1be375a7..478ba547 100644 --- a/packages/evm/contracts/ownable/GiriGiriBashi.sol +++ b/packages/evm/contracts/ownable/GiriGiriBashi.sol @@ -75,14 +75,19 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { if (_adapters.length != count) revert CannotProveNoConfidence(domain, id, _adapters); bytes32[] memory hashes = new bytes32[](_adapters.length); - for (uint256 i = 0; i < _adapters.length; i++) hashes[i] = _adapters[i].getHash(domain, id); + uint256 zeroHashes = 0; + for (uint256 i = 0; i < _adapters.length; i++) { + hashes[i] = _adapters[i].getHash(domain, id); + if (hashes[i] == bytes32(0)) zeroHashes++; + if (zeroHashes == threshold) revert CannotProveNoConfidence(domain, id, _adapters); + } for (uint256 i = 0; i < hashes.length; i++) { - uint256 count = 1; + uint256 equalHashes = 1; for (uint256 j = 0; j < hashes.length; j++) if (hashes[i] == hashes[j] && i != j) { - count++; - if (count == threshold) { + equalHashes++; + if (equalHashes == threshold) { revert AdaptersAgreed(); } } diff --git a/packages/evm/test/03_GiriGiriBashi.spec.ts b/packages/evm/test/03_GiriGiriBashi.spec.ts index 0d514bf7..c053aa5f 100644 --- a/packages/evm/test/03_GiriGiriBashi.spec.ts +++ b/packages/evm/test/03_GiriGiriBashi.spec.ts @@ -38,16 +38,20 @@ const setup = async (_configs?: any) => { const secondMockAdapter = await MockAdapter.deploy() const thirdMockAdapter = await MockAdapter.deploy() - await mockAdapter.setHashes(DOMAIN_ID, [0, 1, 20, 21, 22], [HASH_ZERO, HASH_GOOD, HASH_BAD, HASH_GOOD, HASH_BAD]) + await mockAdapter.setHashes( + DOMAIN_ID, + [0, 1, 20, 21, 22, 23], + [HASH_ZERO, HASH_GOOD, HASH_BAD, HASH_GOOD, HASH_BAD, HASH_ZERO], + ) await secondMockAdapter.setHashes( DOMAIN_ID, - [0, 1, 20, 21, 22], - [HASH_ZERO, HASH_GOOD, HASH_GOOD, HASH_GOOD, HASH_GOOD], + [0, 1, 20, 21, 22, 23], + [HASH_ZERO, HASH_GOOD, HASH_GOOD, HASH_GOOD, HASH_GOOD, HASH_ZERO], ) await thirdMockAdapter.setHashes( DOMAIN_ID, - [0, 1, 20, 21, 22], - [HASH_ZERO, HASH_GOOD, HASH_DEAD, HASH_GOOD, HASH_GOOD], + [0, 1, 20, 21, 22, 23], + [HASH_ZERO, HASH_GOOD, HASH_DEAD, HASH_GOOD, HASH_GOOD, HASH_GOOD], ) await giriGiriBashi.setChallengeRange(DOMAIN_ID, CHALLENGE_RANGE) @@ -677,6 +681,15 @@ describe("GiriGiriBashi", function () { .to.be.revertedWithCustomError(giriGiriBashi, "CannotProveNoConfidence") .withArgs(DOMAIN_ID, 20, [mockAdapter.address]) }) + it("Reverts if the majority of adapters report the hash = 0", async function () { + const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() + const adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses) + await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) + await giriGiriBashi.setThreshold(DOMAIN_ID, 2) + await expect(giriGiriBashi.callStatic.declareNoConfidence(DOMAIN_ID, 25, adapters)) + .to.be.revertedWithCustomError(giriGiriBashi, "CannotProveNoConfidence") + .withArgs(DOMAIN_ID, 25, adapters) + }) it("Reverts if any of the provided adapters agree", async function () { const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() const adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses) From d140155538a001b6b3e2cdfa56fc3251f130dbd5 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 21 Feb 2024 05:37:53 +0100 Subject: [PATCH 144/297] ref(contracts): sets solidity version to ^0.8.0 within the interfaces --- packages/evm/contracts/interfaces/IAdapter.sol | 2 +- packages/evm/contracts/interfaces/IBlockHashAdapter.sol | 2 +- packages/evm/contracts/interfaces/IGiriGiriBashi.sol | 2 +- packages/evm/contracts/interfaces/IHashi.sol | 2 +- packages/evm/contracts/interfaces/IHeaderStorage.sol | 2 +- packages/evm/contracts/interfaces/IJushin.sol | 2 +- packages/evm/contracts/interfaces/IMessage.sol | 2 +- packages/evm/contracts/interfaces/IMessageHashCalculator.sol | 2 +- packages/evm/contracts/interfaces/IMessageIdCalculator.sol | 2 +- packages/evm/contracts/interfaces/IReporter.sol | 2 +- packages/evm/contracts/interfaces/IShoyuBashi.sol | 2 +- packages/evm/contracts/interfaces/IShuSho.sol | 2 +- packages/evm/contracts/interfaces/IYaho.sol | 2 +- packages/evm/contracts/interfaces/IYaru.sol | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/evm/contracts/interfaces/IAdapter.sol b/packages/evm/contracts/interfaces/IAdapter.sol index 11ecb4f7..72498484 100644 --- a/packages/evm/contracts/interfaces/IAdapter.sol +++ b/packages/evm/contracts/interfaces/IAdapter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.20; +pragma solidity ^0.8.0; /** * @title IAdapter diff --git a/packages/evm/contracts/interfaces/IBlockHashAdapter.sol b/packages/evm/contracts/interfaces/IBlockHashAdapter.sol index 9073c05b..a6a27ed6 100644 --- a/packages/evm/contracts/interfaces/IBlockHashAdapter.sol +++ b/packages/evm/contracts/interfaces/IBlockHashAdapter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.20; +pragma solidity ^0.8.0; import { IAdapter } from "./IAdapter.sol"; diff --git a/packages/evm/contracts/interfaces/IGiriGiriBashi.sol b/packages/evm/contracts/interfaces/IGiriGiriBashi.sol index 2b917028..20d31209 100644 --- a/packages/evm/contracts/interfaces/IGiriGiriBashi.sol +++ b/packages/evm/contracts/interfaces/IGiriGiriBashi.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.20; +pragma solidity ^0.8.0; import { IAdapter } from "./IAdapter.sol"; import { IHashi } from "./IHashi.sol"; diff --git a/packages/evm/contracts/interfaces/IHashi.sol b/packages/evm/contracts/interfaces/IHashi.sol index fa883171..9af2e961 100644 --- a/packages/evm/contracts/interfaces/IHashi.sol +++ b/packages/evm/contracts/interfaces/IHashi.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.20; +pragma solidity ^0.8.0; import { IAdapter } from "./IAdapter.sol"; diff --git a/packages/evm/contracts/interfaces/IHeaderStorage.sol b/packages/evm/contracts/interfaces/IHeaderStorage.sol index 126857b2..5da04a3d 100644 --- a/packages/evm/contracts/interfaces/IHeaderStorage.sol +++ b/packages/evm/contracts/interfaces/IHeaderStorage.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.20; +pragma solidity ^0.8.0; /** * @title IHeaderStorage diff --git a/packages/evm/contracts/interfaces/IJushin.sol b/packages/evm/contracts/interfaces/IJushin.sol index 55aecb03..a8df2c76 100644 --- a/packages/evm/contracts/interfaces/IJushin.sol +++ b/packages/evm/contracts/interfaces/IJushin.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.20; +pragma solidity ^0.8.0; /** * @title IJushin diff --git a/packages/evm/contracts/interfaces/IMessage.sol b/packages/evm/contracts/interfaces/IMessage.sol index 9ec02029..47babcc8 100644 --- a/packages/evm/contracts/interfaces/IMessage.sol +++ b/packages/evm/contracts/interfaces/IMessage.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.20; +pragma solidity ^0.8.0; import { IReporter } from "./IReporter.sol"; import { IAdapter } from "./IAdapter.sol"; diff --git a/packages/evm/contracts/interfaces/IMessageHashCalculator.sol b/packages/evm/contracts/interfaces/IMessageHashCalculator.sol index acb10fd8..24a41ef3 100644 --- a/packages/evm/contracts/interfaces/IMessageHashCalculator.sol +++ b/packages/evm/contracts/interfaces/IMessageHashCalculator.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.20; +pragma solidity ^0.8.0; import { Message } from "./IMessage.sol"; diff --git a/packages/evm/contracts/interfaces/IMessageIdCalculator.sol b/packages/evm/contracts/interfaces/IMessageIdCalculator.sol index ee818fec..0cfefee8 100644 --- a/packages/evm/contracts/interfaces/IMessageIdCalculator.sol +++ b/packages/evm/contracts/interfaces/IMessageIdCalculator.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.20; +pragma solidity ^0.8.0; /** * @title IMessageIdCalculator diff --git a/packages/evm/contracts/interfaces/IReporter.sol b/packages/evm/contracts/interfaces/IReporter.sol index ced2048a..6f9ad316 100644 --- a/packages/evm/contracts/interfaces/IReporter.sol +++ b/packages/evm/contracts/interfaces/IReporter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.20; +pragma solidity ^0.8.0; import { IAdapter } from "./IAdapter.sol"; diff --git a/packages/evm/contracts/interfaces/IShoyuBashi.sol b/packages/evm/contracts/interfaces/IShoyuBashi.sol index 15f43f46..96a0ea9e 100644 --- a/packages/evm/contracts/interfaces/IShoyuBashi.sol +++ b/packages/evm/contracts/interfaces/IShoyuBashi.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.20; +pragma solidity ^0.8.0; import { IHashi } from "./IHashi.sol"; import { IAdapter } from "./IAdapter.sol"; diff --git a/packages/evm/contracts/interfaces/IShuSho.sol b/packages/evm/contracts/interfaces/IShuSho.sol index 97feeecf..1ce17c4e 100644 --- a/packages/evm/contracts/interfaces/IShuSho.sol +++ b/packages/evm/contracts/interfaces/IShuSho.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.20; +pragma solidity ^0.8.0; import { IHashi } from "./IHashi.sol"; import { IAdapter } from "./IAdapter.sol"; diff --git a/packages/evm/contracts/interfaces/IYaho.sol b/packages/evm/contracts/interfaces/IYaho.sol index b6d780ec..46f8edc1 100644 --- a/packages/evm/contracts/interfaces/IYaho.sol +++ b/packages/evm/contracts/interfaces/IYaho.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.20; +pragma solidity ^0.8.0; import { IMessageHashCalculator } from "./IMessageHashCalculator.sol"; import { IMessageIdCalculator } from "./IMessageIdCalculator.sol"; diff --git a/packages/evm/contracts/interfaces/IYaru.sol b/packages/evm/contracts/interfaces/IYaru.sol index 77258293..150c62fe 100644 --- a/packages/evm/contracts/interfaces/IYaru.sol +++ b/packages/evm/contracts/interfaces/IYaru.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.20; +pragma solidity ^0.8.0; import { Message } from "./IMessage.sol"; import { IMessageHashCalculator } from "./IMessageHashCalculator.sol"; From d8368cb8c49af20f03b61dbcba27fbd8a77c498c Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 21 Feb 2024 07:03:48 +0100 Subject: [PATCH 145/297] ref(contracts & test): adds getter fxs within GiriGiriBashi and ShuSho --- .../contracts/interfaces/IGiriGiriBashi.sol | 29 ++++ packages/evm/contracts/interfaces/IShuSho.sol | 21 +++ .../evm/contracts/ownable/GiriGiriBashi.sol | 146 ++++++++++-------- packages/evm/contracts/ownable/ShoyuBashi.sol | 12 +- packages/evm/contracts/ownable/ShuSo.sol | 146 ++++++++++-------- packages/evm/test/02_ShoyuBashi.spec.ts | 14 +- packages/evm/test/03_GiriGiriBashi.spec.ts | 92 ++++++----- 7 files changed, 272 insertions(+), 188 deletions(-) diff --git a/packages/evm/contracts/interfaces/IGiriGiriBashi.sol b/packages/evm/contracts/interfaces/IGiriGiriBashi.sol index 4a3703a8..c11cc231 100644 --- a/packages/evm/contracts/interfaces/IGiriGiriBashi.sol +++ b/packages/evm/contracts/interfaces/IGiriGiriBashi.sol @@ -144,6 +144,13 @@ interface IGiriGiriBashi is IShuSho { */ function enableAdapters(uint256 domain, IAdapter[] memory adapters, Settings[] memory settings) external; + /** + * @dev Get the current challenge given a challengeId. + * @param challengeId - The Bytes32 identifier for the challenge. + * @return challenge - Challenge indicating the challenge parameters. + */ + function getChallenge(bytes32 challengeId) external view returns (Challenge memory); + /** * @dev Gets the challenge ID for a given domain, ID, and adapter. * @param domain - The Uint256 identifier for the domain. @@ -153,6 +160,13 @@ interface IGiriGiriBashi is IShuSho { */ function getChallengeId(uint256 domain, uint256 id, IAdapter adapter) external pure returns (bytes32); + /** + * @dev Get how far beyond the current highestId can be challenged. + * @param domain - The Uint256 identifier for the domain. + * @return range - Uint256 indicating the challenge range. + */ + function getChallengeRange(uint256 domain) external view returns (uint256); + /** * @dev Returns the hash agreed upon by a threshold of the enabled adapters. * @param domain - Uint256 identifier for the domain to query. @@ -188,6 +202,21 @@ interface IGiriGiriBashi is IShuSho { */ function getHash(uint256 domain, uint256 id, IAdapter[] memory adapters) external returns (bytes32); + /** + * @dev Returns the highest id reported for a given id + * @param domain - Uint256 identifier for the domain to query. + * @return id - Uint256 indicating the highest id reported. + */ + function getHead(uint256 domain) external view returns (uint256); + + /** + * @dev Get the current settings for a given adapter. + * @param domain - Uint256 identifier for the domain to query. + * @param adapter - The adapter. + * @return settings - The Settings for the given adapter. + */ + function getSettings(uint256 domain, IAdapter adapter) external view returns (Settings memory); + /** * @dev Replaces the quarantined adapters for a given domain with new adapters and settings. * @param domain - The Uint256 identifier for the domain. diff --git a/packages/evm/contracts/interfaces/IShuSho.sol b/packages/evm/contracts/interfaces/IShuSho.sol index c573ab43..31c81e3e 100644 --- a/packages/evm/contracts/interfaces/IShuSho.sol +++ b/packages/evm/contracts/interfaces/IShuSho.sol @@ -71,6 +71,14 @@ interface IShuSho { */ function checkAdapterOrderAndValidity(uint256 domain, IAdapter[] memory _adapters) external view; + /** + * @dev Get the previous and the next adapter given a domain and an adapter. + * @param domain - Uint256 identifier for the domain. + * @param adapter - IAdapter value for the adapter. + * @return link - The Link struct containing the previous and the next adapter. + */ + function getAdapterLink(uint256 domain, IAdapter adapter) external view returns (Link memory); + /** * @dev Returns an array of enabled adapters for a given domain. * @param domain - Uint256 identifier for the domain for which to list adapters. @@ -78,6 +86,13 @@ interface IShuSho { */ function getAdapters(uint256 domain) external view returns (IAdapter[] memory); + /** + * @dev Get the current configuration for a given domain. + * @param domain - Uint256 identifier for the domain. + * @return domain - The Domain struct containing the current configuration for a given domain. + */ + function getDomain(uint256 domain) external view returns (Domain memory); + /** * @dev Returns the threshold and count for a given domain. * @param domain - Uint256 identifier for the domain. @@ -86,4 +101,10 @@ interface IShuSho { * @notice If the threshold for a domain has not been set, or is explicitly set to 0, this function will return a threshold equal to the adapters count for the given domain. */ function getThresholdAndCount(uint256 domain) external view returns (uint256, uint256); + + /** + * @dev Returns the address of the specified Hashi. + * @return hashi - The Hashi address. + */ + function hashi() external view returns (IHashi); } diff --git a/packages/evm/contracts/ownable/GiriGiriBashi.sol b/packages/evm/contracts/ownable/GiriGiriBashi.sol index 478ba547..2b296413 100644 --- a/packages/evm/contracts/ownable/GiriGiriBashi.sol +++ b/packages/evm/contracts/ownable/GiriGiriBashi.sol @@ -7,49 +7,51 @@ import { IHashi } from "../interfaces/IHashi.sol"; import { IGiriGiriBashi } from "../interfaces/IGiriGiriBashi.sol"; contract GiriGiriBashi is IGiriGiriBashi, ShuSo { - address payable public bondRecipient; // address that bonds from unsuccessful challenges should be sent to. - mapping(uint256 => uint256) public heads; // highest Id reported. - mapping(uint256 => uint256) public challengeRanges; // how far beyond the current highestId can a challenged. - mapping(uint256 => mapping(IAdapter => Settings)) public settings; - mapping(bytes32 => Challenge) public challenges; // current challenges. + address payable public bondRecipient; + + mapping(uint256 => uint256) private _heads; + mapping(uint256 => uint256) private _challengeRanges; + mapping(uint256 => mapping(IAdapter => Settings)) private _settings; + mapping(bytes32 => Challenge) private _challenges; constructor(address _owner, address _hashi, address payable _bondRecipient) ShuSo(_owner, _hashi) { bondRecipient = _bondRecipient; } modifier noConfidence(uint256 domain) { - if (domains[domain].threshold != type(uint256).max) revert NoConfidenceRequired(); + if (getDomain(domain).threshold != type(uint256).max) revert NoConfidenceRequired(); _; } modifier zeroCount(uint256 domain) { - if (domains[domain].count != 0 && domains[domain].threshold > 0) revert CountMustBeZero(domain); + Domain memory domainConfigs = getDomain(domain); + if (domainConfigs.count != 0 && domainConfigs.threshold > 0) revert CountMustBeZero(domain); _; } /// @inheritdoc IGiriGiriBashi function challengeAdapter(uint256 domain, uint256 id, IAdapter adapter) public payable { - if (adapters[domain][adapter].previous == IAdapter(address(0))) revert AdapterNotEnabled(adapter); - if (msg.value < settings[domain][adapter].minimumBond) revert NotEnoughValue(adapter, msg.value); - if (settings[domain][adapter].quarantined) revert AlreadyQuarantined(adapter); + if (getAdapterLink(domain, adapter).previous == IAdapter(address(0))) revert AdapterNotEnabled(adapter); + if (msg.value < _settings[domain][adapter].minimumBond) revert NotEnoughValue(adapter, msg.value); + if (_settings[domain][adapter].quarantined) revert AlreadyQuarantined(adapter); bytes32 challengeId = getChallengeId(domain, id, adapter); - if (challenges[challengeId].challenger != address(0)) + if (_challenges[challengeId].challenger != address(0)) revert DuplicateChallenge(challengeId, domain, id, adapter); // check if id is lower than startId, revert if true. // check if id is less than highestId + challengeRange, revert if false // check if id is lower than highestId - idDepth, revert if true - uint256 challengeRange = challengeRanges[domain]; - uint256 idDepth = settings[domain][adapter].idDepth; - uint256 head = heads[domain]; + uint256 challengeRange = _challengeRanges[domain]; + uint256 idDepth = _settings[domain][adapter].idDepth; + uint256 head = _heads[domain]; if ( - id < settings[domain][adapter].startId || // before start id + id < _settings[domain][adapter].startId || // before start id (challengeRange != 0 && id >= head && id - head > challengeRange) || // over domain challenge range (idDepth != 0 && head > idDepth && id <= head - idDepth) // outside of adapter idDepth ) revert OutOfRange(adapter, id); - Challenge storage challenge = challenges[challengeId]; + Challenge storage challenge = _challenges[challengeId]; challenge.challenger = payable(msg.sender); challenge.timestamp = block.timestamp; challenge.bond = msg.value; @@ -60,26 +62,26 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { /// @inheritdoc IGiriGiriBashi function enableAdapters( uint256 domain, - IAdapter[] memory _adapters, - Settings[] memory _settings + IAdapter[] memory adapters, + Settings[] memory settings ) public zeroCount(domain) { - _enableAdapters(domain, _adapters); - initSettings(domain, _adapters, _settings); + _enableAdapters(domain, adapters); + initSettings(domain, adapters, settings); } /// @inheritdoc IGiriGiriBashi - function declareNoConfidence(uint256 domain, uint256 id, IAdapter[] memory _adapters) public { - checkAdapterOrderAndValidity(domain, _adapters); + function declareNoConfidence(uint256 domain, uint256 id, IAdapter[] memory adapters) public { + checkAdapterOrderAndValidity(domain, adapters); (uint256 threshold, uint256 count) = getThresholdAndCount(domain); - if (_adapters.length != count) revert CannotProveNoConfidence(domain, id, _adapters); + if (adapters.length != count) revert CannotProveNoConfidence(domain, id, adapters); - bytes32[] memory hashes = new bytes32[](_adapters.length); + bytes32[] memory hashes = new bytes32[](adapters.length); uint256 zeroHashes = 0; - for (uint256 i = 0; i < _adapters.length; i++) { - hashes[i] = _adapters[i].getHash(domain, id); + for (uint256 i = 0; i < adapters.length; i++) { + hashes[i] = adapters[i].getHash(domain, id); if (hashes[i] == bytes32(0)) zeroHashes++; - if (zeroHashes == threshold) revert CannotProveNoConfidence(domain, id, _adapters); + if (zeroHashes == threshold) revert CannotProveNoConfidence(domain, id, adapters); } for (uint256 i = 0; i < hashes.length; i++) { @@ -93,16 +95,26 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { } } - domains[domain].threshold = type(uint256).max; - delete challengeRanges[domain]; + _setDomainThreshold(domain, type(uint256).max); + delete _challengeRanges[domain]; emit NoConfidenceDeclared(domain); } /// @inheritdoc IGiriGiriBashi - function disableAdapters(uint256 domain, IAdapter[] memory _adapters) public noConfidence(domain) { - _disableAdapters(domain, _adapters); - if (domains[domain].count == 0) domains[domain].threshold = 0; + function disableAdapters(uint256 domain, IAdapter[] memory adapters) public noConfidence(domain) { + _disableAdapters(domain, adapters); + if (getDomain(domain).count == 0) _setDomainThreshold(domain, 0); + } + + /// @inheritdoc IGiriGiriBashi + function getSettings(uint256 domain, IAdapter adapter) external view returns (Settings memory) { + return _settings[domain][adapter]; + } + + /// @inheritdoc IGiriGiriBashi + function getChallenge(bytes32 challengeId) external view returns (Challenge memory) { + return _challenges[challengeId]; } /// @inheritdoc IGiriGiriBashi @@ -110,6 +122,16 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { challengeId = keccak256(abi.encodePacked(domain, id, adapter)); } + /// @inheritdoc IGiriGiriBashi + function getChallengeRange(uint256 domain) external view returns (uint256) { + return _challengeRanges[domain]; + } + + /// @inheritdoc IGiriGiriBashi + function getHead(uint256 domain) external view returns (uint256) { + return _heads[domain]; + } + /// @inheritdoc IGiriGiriBashi function getThresholdHash(uint256 domain, uint256 id) public returns (bytes32 hash) { hash = _getThresholdHash(domain, id); @@ -123,8 +145,8 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { } /// @inheritdoc IGiriGiriBashi - function getHash(uint256 domain, uint256 id, IAdapter[] memory _adapters) public returns (bytes32 hash) { - hash = _getHash(domain, id, _adapters); + function getHash(uint256 domain, uint256 id, IAdapter[] memory adapters) public returns (bytes32 hash) { + hash = _getHash(domain, id, adapters); updateHead(domain, id); } @@ -133,16 +155,16 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { uint256 domain, IAdapter[] memory currentAdapters, IAdapter[] memory newAdapters, - Settings[] memory _settings + Settings[] memory settings ) public onlyOwner { - if (currentAdapters.length != newAdapters.length || currentAdapters.length != _settings.length) + if (currentAdapters.length != newAdapters.length || currentAdapters.length != settings.length) revert UnequalArrayLengths(); for (uint256 i = 0; i < currentAdapters.length; i++) { - if (!settings[domain][currentAdapters[i]].quarantined) revert AdapterNotQuarantined(currentAdapters[i]); + if (!_settings[domain][currentAdapters[i]].quarantined) revert AdapterNotQuarantined(currentAdapters[i]); } _disableAdapters(domain, currentAdapters); _enableAdapters(domain, newAdapters); - initSettings(domain, newAdapters, _settings); + initSettings(domain, newAdapters, settings); } /// @inheritdoc IGiriGiriBashi @@ -150,22 +172,22 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { uint256 domain, uint256 id, IAdapter adapter, - IAdapter[] memory _adapters + IAdapter[] memory adapters ) public returns (bool success) { // check if challenge exists, revert if false bytes32 challengeId = getChallengeId(domain, id, adapter); - if (challenges[challengeId].challenger == address(0)) + if (_challenges[challengeId].challenger == address(0)) revert ChallengeNotFound(challengeId, domain, id, adapter); - for (uint256 i = 0; i < _adapters.length; ) { - if (_adapters[i] == adapter) revert AdaptersCannotContainChallengedAdapter(_adapters, adapter); + for (uint256 i = 0; i < adapters.length; ) { + if (adapters[i] == adapter) revert AdaptersCannotContainChallengedAdapter(adapters, adapter); unchecked { ++i; } } - Challenge storage challenge = challenges[challengeId]; - Settings storage adapterSettings = settings[domain][adapter]; + Challenge storage challenge = _challenges[challengeId]; + Settings storage adapterSettings = _settings[domain][adapter]; bytes32 storedHash = adapter.getHash(domain, id); if (storedHash == bytes32(0)) { @@ -175,19 +197,19 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { challenge.challenger.transfer(challenge.bond); success = true; } else { - // if _adapters + 1 equals threshold && _adapters + adapter report the same header - if (_adapters.length == domains[domain].threshold - 1) { - checkAdapterOrderAndValidity(domain, _adapters); - bytes32 canonicalHash = hashi.getHash(domain, id, _adapters); + // if adapters + 1 equals threshold && adapters + adapter report the same header + if (adapters.length == getDomain(domain).threshold - 1) { + checkAdapterOrderAndValidity(domain, adapters); + bytes32 canonicalHash = hashi.getHash(domain, id, adapters); if (canonicalHash == storedHash) { bondRecipient.transfer(challenge.bond); success = false; } else { - revert IHashi.AdaptersDisagree(adapter, _adapters[0]); + revert IHashi.AdaptersDisagree(adapter, adapters[0]); } } else { - // check if _adapters report the same header as adapter - bytes32 canonicalHash = getHash(domain, id, _adapters); + // check if adapters report the same header as adapter + bytes32 canonicalHash = getHash(domain, id, adapters); if (canonicalHash == storedHash) { bondRecipient.transfer(challenge.bond); success = false; @@ -213,8 +235,8 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { /// @inheritdoc IGiriGiriBashi function setChallengeRange(uint256 domain, uint256 range) public onlyOwner { - if (challengeRanges[domain] != 0) revert ChallengeRangeAlreadySet(domain); - challengeRanges[domain] = range; + if (_challengeRanges[domain] != 0) revert ChallengeRangeAlreadySet(domain); + _challengeRanges[domain] = range; emit ChallengeRangeUpdated(domain, range); } @@ -227,21 +249,21 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { _setThreshold(domain, threshold); } - function initSettings(uint256 domain, IAdapter[] memory _adapters, Settings[] memory _settings) private { - if (_adapters.length != _settings.length) revert UnequalArrayLengths(); + function initSettings(uint256 domain, IAdapter[] memory _adapters, Settings[] memory adapters) private { + if (_adapters.length != adapters.length) revert UnequalArrayLengths(); for (uint256 i = 0; i < _adapters.length; i++) { IAdapter adapter = _adapters[i]; - settings[domain][adapter].quarantined = false; - settings[domain][adapter].minimumBond = _settings[i].minimumBond; - settings[domain][adapter].startId = _settings[i].startId; - settings[domain][adapter].idDepth = _settings[i].idDepth; - settings[domain][adapter].timeout = _settings[i].timeout; - emit SettingsInitialized(domain, adapter, _settings[i]); + _settings[domain][adapter].quarantined = false; + _settings[domain][adapter].minimumBond = adapters[i].minimumBond; + _settings[domain][adapter].startId = adapters[i].startId; + _settings[domain][adapter].idDepth = adapters[i].idDepth; + _settings[domain][adapter].timeout = adapters[i].timeout; + emit SettingsInitialized(domain, adapter, adapters[i]); } } function updateHead(uint256 domain, uint256 id) private { - if (id > heads[domain]) heads[domain] = id; + if (id > _heads[domain]) _heads[domain] = id; emit NewHead(domain, id); } } diff --git a/packages/evm/contracts/ownable/ShoyuBashi.sol b/packages/evm/contracts/ownable/ShoyuBashi.sol index ee3e7837..7a6c5ae0 100644 --- a/packages/evm/contracts/ownable/ShoyuBashi.sol +++ b/packages/evm/contracts/ownable/ShoyuBashi.sol @@ -19,13 +19,13 @@ contract ShoyuBashi is IShoyuBashi, ShuSo { } /// @inheritdoc IShoyuBashi - function enableAdapters(uint256 domain, IAdapter[] memory _adapters) public { - _enableAdapters(domain, _adapters); + function enableAdapters(uint256 domain, IAdapter[] memory adapters) public { + _enableAdapters(domain, adapters); } /// @inheritdoc IShoyuBashi - function disableAdapters(uint256 domain, IAdapter[] memory _adapters) public { - _disableAdapters(domain, _adapters); + function disableAdapters(uint256 domain, IAdapter[] memory adapters) public { + _disableAdapters(domain, adapters); } /// @inheritdoc IShoyuBashi @@ -39,7 +39,7 @@ contract ShoyuBashi is IShoyuBashi, ShuSo { } /// @inheritdoc IShoyuBashi - function getHash(uint256 domain, uint256 id, IAdapter[] memory _adapters) public view returns (bytes32) { - return _getHash(domain, id, _adapters); + function getHash(uint256 domain, uint256 id, IAdapter[] memory adapters) public view returns (bytes32) { + return _getHash(domain, id, adapters); } } diff --git a/packages/evm/contracts/ownable/ShuSo.sol b/packages/evm/contracts/ownable/ShuSo.sol index 344b155c..da067e93 100644 --- a/packages/evm/contracts/ownable/ShuSo.sol +++ b/packages/evm/contracts/ownable/ShuSo.sol @@ -10,8 +10,8 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { IAdapter internal constant LIST_END = IAdapter(address(0x1)); IHashi public hashi; - mapping(uint256 => mapping(IAdapter => Link)) public adapters; - mapping(uint256 => Domain) public domains; + mapping(uint256 => mapping(IAdapter => Link)) private _adapters; + mapping(uint256 => Domain) private _domains; constructor(address _owner, address _hashi) { bytes memory initParams = abi.encode(_owner, _hashi); @@ -27,28 +27,38 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { } /// @inheritdoc IShuSho - function checkAdapterOrderAndValidity(uint256 domain, IAdapter[] memory _adapters) public view { - for (uint256 i = 0; i < _adapters.length; i++) { - IAdapter adapter = _adapters[i]; - if (i > 0 && adapter <= _adapters[i - 1]) revert DuplicateOrOutOfOrderAdapters(adapter, _adapters[i - 1]); - if (adapters[domain][adapter].next == IAdapter(address(0))) revert InvalidAdapter(adapter); + function checkAdapterOrderAndValidity(uint256 domain, IAdapter[] memory adapters) public view { + for (uint256 i = 0; i < adapters.length; i++) { + IAdapter adapter = adapters[i]; + if (i > 0 && adapter <= adapters[i - 1]) revert DuplicateOrOutOfOrderAdapters(adapter, adapters[i - 1]); + if (_adapters[domain][adapter].next == IAdapter(address(0))) revert InvalidAdapter(adapter); } } + /// @inheritdoc IShuSho + function getAdapterLink(uint256 domain, IAdapter adapter) public view returns (Link memory) { + return _adapters[domain][adapter]; + } + /// @inheritdoc IShuSho function getAdapters(uint256 domain) public view returns (IAdapter[] memory) { - IAdapter[] memory _adapters = new IAdapter[](domains[domain].count); - IAdapter currentAdapter = adapters[domain][LIST_END].next; - for (uint256 i = 0; i < _adapters.length; i++) { - _adapters[i] = currentAdapter; - currentAdapter = adapters[domain][currentAdapter].next; + IAdapter[] memory adapters = new IAdapter[](_domains[domain].count); + IAdapter currentAdapter = _adapters[domain][LIST_END].next; + for (uint256 i = 0; i < adapters.length; i++) { + adapters[i] = currentAdapter; + currentAdapter = _adapters[domain][currentAdapter].next; } - return _adapters; + return adapters; + } + + /// @inheritdoc IShuSho + function getDomain(uint256 domain) public view returns (Domain memory) { + return _domains[domain]; } /// @inheritdoc IShuSho function getThresholdAndCount(uint256 domain_) public view returns (uint256, uint256) { - Domain storage domain = domains[domain_]; + Domain storage domain = _domains[domain_]; uint256 threshold = domain.threshold; uint256 count = domain.count; if (threshold == 0) threshold = count; @@ -60,75 +70,75 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { /** * @dev Disables the given adapters for a given domain. * @param domain - Uint256 identifier for the domain for which to set adapters. - * @param _adapters - Array of adapter addresses. - * @notice Reverts if _adapters are out of order or contain duplicates. + * @param adapters - Array of adapter addresses. + * @notice Reverts if adapters are out of order or contain duplicates. * @notice Only callable by the owner of this contract. */ - function _disableAdapters(uint256 domain, IAdapter[] memory _adapters) internal onlyOwner { - if (domains[domain].count == 0) revert NoAdaptersEnabled(domain); - if (_adapters.length == 0) revert NoAdaptersGiven(); - for (uint256 i = 0; i < _adapters.length; i++) { - IAdapter adapter = _adapters[i]; + function _disableAdapters(uint256 domain, IAdapter[] memory adapters) internal onlyOwner { + if (_domains[domain].count == 0) revert NoAdaptersEnabled(domain); + if (adapters.length == 0) revert NoAdaptersGiven(); + for (uint256 i = 0; i < adapters.length; i++) { + IAdapter adapter = adapters[i]; if (adapter == IAdapter(address(0)) || adapter == LIST_END) revert InvalidAdapter(adapter); - Link memory current = adapters[domain][adapter]; + Link memory current = _adapters[domain][adapter]; if (current.next == IAdapter(address(0))) revert AdapterNotEnabled(adapter); IAdapter next = current.next; IAdapter previous = current.previous; - adapters[domain][next].previous = previous; - adapters[domain][previous].next = next; - delete adapters[domain][adapter].next; - delete adapters[domain][adapter].previous; - domains[domain].count--; + _adapters[domain][next].previous = previous; + _adapters[domain][previous].next = next; + delete _adapters[domain][adapter].next; + delete _adapters[domain][adapter].previous; + _domains[domain].count--; } - emit AdaptersDisabled(domain, _adapters); + emit AdaptersDisabled(domain, adapters); } /** * @dev Enables the given adapters for a given domain. * @param domain - Uint256 identifier for the domain for which to set adapters. - * @param _adapters - Array of adapter addresses. - * @notice Reverts if _adapters are out of order or contain duplicates. + * @param adapters - Array of adapter addresses. + * @notice Reverts if adapters are out of order or contain duplicates. * @notice Only callable by the owner of this contract. */ - function _enableAdapters(uint256 domain, IAdapter[] memory _adapters) internal onlyOwner { - if (adapters[domain][LIST_END].next == IAdapter(address(0))) { - adapters[domain][LIST_END].next = LIST_END; - adapters[domain][LIST_END].previous = LIST_END; + function _enableAdapters(uint256 domain, IAdapter[] memory adapters) internal onlyOwner { + if (_adapters[domain][LIST_END].next == IAdapter(address(0))) { + _adapters[domain][LIST_END].next = LIST_END; + _adapters[domain][LIST_END].previous = LIST_END; } - if (_adapters.length == 0) revert NoAdaptersGiven(); - for (uint256 i = 0; i < _adapters.length; i++) { - IAdapter adapter = _adapters[i]; + if (adapters.length == 0) revert NoAdaptersGiven(); + for (uint256 i = 0; i < adapters.length; i++) { + IAdapter adapter = adapters[i]; if (adapter == IAdapter(address(0)) || adapter == LIST_END) revert InvalidAdapter(adapter); - if (adapters[domain][adapter].next != IAdapter(address(0))) revert AdapterAlreadyEnabled(adapter); - IAdapter previous = adapters[domain][LIST_END].previous; - adapters[domain][previous].next = adapter; - adapters[domain][adapter].previous = previous; - adapters[domain][LIST_END].previous = adapter; - adapters[domain][adapter].next = LIST_END; - domains[domain].count++; + if (_adapters[domain][adapter].next != IAdapter(address(0))) revert AdapterAlreadyEnabled(adapter); + IAdapter previous = _adapters[domain][LIST_END].previous; + _adapters[domain][previous].next = adapter; + _adapters[domain][adapter].previous = previous; + _adapters[domain][LIST_END].previous = adapter; + _adapters[domain][adapter].next = LIST_END; + _domains[domain].count++; } - emit AdaptersEnabled(domain, _adapters); + emit AdaptersEnabled(domain, adapters); } /** * @dev Returns the hash unanimously agreed upon by all of the given adapters. * @param domain - Uint256 identifier for the domain to query. * @param id - Uint256 identifier to query. - * @param _adapters - Array of adapter addresses to query. + * @param adapters - Array of adapter addresses to query. * @return hash - Bytes32 hash agreed upon by the adapters for the given domain. - * @notice _adapters must be in numerical order from smallest to largest and contain no duplicates. - * @notice Reverts if _adapters are out of order or contain duplicates. + * @notice adapters must be in numerical order from smallest to largest and contain no duplicates. + * @notice Reverts if adapters are out of order or contain duplicates. * @notice Reverts if adapters disagree. * @notice Revert if the adapters do not yet have the hash for the given ID. * @notice Reverts if no adapters are set for the given domain. */ - function _getHash(uint256 domain, uint256 id, IAdapter[] memory _adapters) internal view returns (bytes32) { + function _getHash(uint256 domain, uint256 id, IAdapter[] memory adapters) internal view returns (bytes32) { (uint256 threshold, uint256 count) = getThresholdAndCount(domain); - if (_adapters.length == 0) revert NoAdaptersGiven(); + if (adapters.length == 0) revert NoAdaptersGiven(); if (count == 0) revert NoAdaptersEnabled(domain); - if (_adapters.length < threshold) revert ThresholdNotMet(); - checkAdapterOrderAndValidity(domain, _adapters); - return hashi.getHash(domain, id, _adapters); + if (adapters.length < threshold) revert ThresholdNotMet(); + checkAdapterOrderAndValidity(domain, adapters); + return hashi.getHash(domain, id, adapters); } /** @@ -141,26 +151,26 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { * @notice Reverts if no adapters are set for the given domain. */ function _getThresholdHash(uint256 domain, uint256 id) internal view returns (bytes32 hash) { - IAdapter[] memory _adapters = getAdapters(domain); + IAdapter[] memory adapters = getAdapters(domain); (uint256 threshold, uint256 count) = getThresholdAndCount(domain); if (count == 0) revert NoAdaptersEnabled(domain); - if (_adapters.length < threshold) revert ThresholdNotMet(); + if (adapters.length < threshold) revert ThresholdNotMet(); - bytes32[] memory hashes = new bytes32[](_adapters.length); - for (uint i = 0; i < _adapters.length; i++) { - try _adapters[i].getHash(domain, id) returns (bytes32 currentHash) { + bytes32[] memory hashes = new bytes32[](adapters.length); + for (uint256 i = 0; i < adapters.length; i++) { + try adapters[i].getHash(domain, id) returns (bytes32 currentHash) { hashes[i] = currentHash; } catch {} // solhint-disable no-empty-blocks } - for (uint i = 0; i < hashes.length; i++) { + for (uint256 i = 0; i < hashes.length; i++) { if (i > hashes.length - threshold) break; bytes32 baseHash = hashes[i]; if (baseHash == bytes32(0)) continue; uint256 num = 0; - for (uint j = i; j < hashes.length; j++) { + for (uint256 j = i; j < hashes.length; j++) { if (baseHash == hashes[j]) { num++; if (num == threshold) return hashes[i]; @@ -180,11 +190,11 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { * @notice Reverts if no adapters are set for the given domain. */ function _getUnanimousHash(uint256 domain, uint256 id) internal view returns (bytes32 hash) { - IAdapter[] memory _adapters = getAdapters(domain); + IAdapter[] memory adapters = getAdapters(domain); (uint256 threshold, uint256 count) = getThresholdAndCount(domain); if (count == 0) revert NoAdaptersEnabled(domain); - if (_adapters.length < threshold) revert ThresholdNotMet(); - return hashi.getHash(domain, id, _adapters); + if (adapters.length < threshold) revert ThresholdNotMet(); + return hashi.getHash(domain, id, adapters); } /** @@ -206,11 +216,15 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { * @notice Reverts if threshold is already set to the given value. */ function _setThreshold(uint256 domain, uint256 threshold) internal onlyOwner { - uint256 count = domains[domain].count; + uint256 count = _domains[domain].count; if (count == 0) revert CountCannotBeZero(); if (threshold < (count / 2) + 1) revert InvalidThreshold(threshold); - if (domains[domain].threshold == threshold) revert DuplicateThreashold(threshold); - domains[domain].threshold = threshold; + if (_domains[domain].threshold == threshold) revert DuplicateThreashold(threshold); + _domains[domain].threshold = threshold; emit ThresholdSet(domain, threshold); } + + function _setDomainThreshold(uint256 domainId, uint256 threshold) internal { + _domains[domainId].threshold = threshold; + } } diff --git a/packages/evm/test/02_ShoyuBashi.spec.ts b/packages/evm/test/02_ShoyuBashi.spec.ts index 3e54f5d4..747fb034 100644 --- a/packages/evm/test/02_ShoyuBashi.spec.ts +++ b/packages/evm/test/02_ShoyuBashi.spec.ts @@ -91,7 +91,7 @@ describe("ShoyuBashi", function () { const { shoyuBashi } = await setup() await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) expect(await shoyuBashi.setThreshold(DOMAIN_ID, 2)) - expect((await shoyuBashi.domains(DOMAIN_ID)).threshold).to.equal(2) + expect((await shoyuBashi.getDomain(DOMAIN_ID)).threshold).to.equal(2) }) it("Emits HashiSet() event", async function () { const { shoyuBashi } = await setup() @@ -143,12 +143,12 @@ describe("ShoyuBashi", function () { const adapters = await shoyuBashi.getAdapters(DOMAIN_ID) await expect(adapters[0]).to.equal(ADDRESS_TWO) await expect(adapters[1]).to.equal(ADDRESS_THREE) - expect((await shoyuBashi.adapters(DOMAIN_ID, LIST_END)).next).to.equal(ADDRESS_TWO) - expect((await shoyuBashi.adapters(DOMAIN_ID, LIST_END)).previous).to.equal(ADDRESS_THREE) - expect((await shoyuBashi.adapters(DOMAIN_ID, ADDRESS_TWO)).next).to.equal(ADDRESS_THREE) - expect((await shoyuBashi.adapters(DOMAIN_ID, ADDRESS_TWO)).previous).to.equal(LIST_END) - expect((await shoyuBashi.adapters(DOMAIN_ID, ADDRESS_THREE)).next).to.equal(LIST_END) - expect((await shoyuBashi.adapters(DOMAIN_ID, ADDRESS_THREE)).previous).to.equal(ADDRESS_TWO) + expect((await shoyuBashi.getAdapterLink(DOMAIN_ID, LIST_END)).next).to.equal(ADDRESS_TWO) + expect((await shoyuBashi.getAdapterLink(DOMAIN_ID, LIST_END)).previous).to.equal(ADDRESS_THREE) + expect((await shoyuBashi.getAdapterLink(DOMAIN_ID, ADDRESS_TWO)).next).to.equal(ADDRESS_THREE) + expect((await shoyuBashi.getAdapterLink(DOMAIN_ID, ADDRESS_TWO)).previous).to.equal(LIST_END) + expect((await shoyuBashi.getAdapterLink(DOMAIN_ID, ADDRESS_THREE)).next).to.equal(LIST_END) + expect((await shoyuBashi.getAdapterLink(DOMAIN_ID, ADDRESS_THREE)).previous).to.equal(ADDRESS_TWO) }) it("Emits AdaptersEnabled() event", async function () { const { shoyuBashi } = await setup() diff --git a/packages/evm/test/03_GiriGiriBashi.spec.ts b/packages/evm/test/03_GiriGiriBashi.spec.ts index c053aa5f..df378b2c 100644 --- a/packages/evm/test/03_GiriGiriBashi.spec.ts +++ b/packages/evm/test/03_GiriGiriBashi.spec.ts @@ -147,7 +147,7 @@ describe("GiriGiriBashi", function () { [settings, settings], ) await giriGiriBashi.setThreshold(DOMAIN_ID, 2) - expect((await giriGiriBashi.domains(DOMAIN_ID)).threshold).to.equal(2) + expect((await giriGiriBashi.getDomain(DOMAIN_ID)).threshold).to.equal(2) }) it("Emits HashiSet() event", async function () { const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() @@ -192,19 +192,19 @@ describe("GiriGiriBashi", function () { const adapters = await giriGiriBashi.getAdapters(DOMAIN_ID) await expect(adapters[0]).to.equal(ADDRESS_TWO) await expect(adapters[1]).to.equal(ADDRESS_THREE) - expect((await giriGiriBashi.adapters(DOMAIN_ID, LIST_END)).next).to.equal(ADDRESS_TWO) - expect((await giriGiriBashi.adapters(DOMAIN_ID, LIST_END)).previous).to.equal(ADDRESS_THREE) - expect((await giriGiriBashi.adapters(DOMAIN_ID, ADDRESS_TWO)).next).to.equal(ADDRESS_THREE) - expect((await giriGiriBashi.adapters(DOMAIN_ID, ADDRESS_TWO)).previous).to.equal(LIST_END) - expect((await giriGiriBashi.adapters(DOMAIN_ID, ADDRESS_THREE)).next).to.equal(LIST_END) - expect((await giriGiriBashi.adapters(DOMAIN_ID, ADDRESS_THREE)).previous).to.equal(ADDRESS_TWO) - let adapterSettings = await giriGiriBashi.settings(DOMAIN_ID, ADDRESS_TWO) + expect((await giriGiriBashi.getAdapterLink(DOMAIN_ID, LIST_END)).next).to.equal(ADDRESS_TWO) + expect((await giriGiriBashi.getAdapterLink(DOMAIN_ID, LIST_END)).previous).to.equal(ADDRESS_THREE) + expect((await giriGiriBashi.getAdapterLink(DOMAIN_ID, ADDRESS_TWO)).next).to.equal(ADDRESS_THREE) + expect((await giriGiriBashi.getAdapterLink(DOMAIN_ID, ADDRESS_TWO)).previous).to.equal(LIST_END) + expect((await giriGiriBashi.getAdapterLink(DOMAIN_ID, ADDRESS_THREE)).next).to.equal(LIST_END) + expect((await giriGiriBashi.getAdapterLink(DOMAIN_ID, ADDRESS_THREE)).previous).to.equal(ADDRESS_TWO) + let adapterSettings = await giriGiriBashi.getSettings(DOMAIN_ID, ADDRESS_TWO) expect(adapterSettings.quarantined).to.deep.equal(settings.quarantined) expect(adapterSettings.minimumBond).to.deep.equal(settings.minimumBond) expect(adapterSettings.startId).to.deep.equal(settings.startId) expect(adapterSettings.idDepth).to.deep.equal(settings.idDepth) expect(adapterSettings.timeout).to.deep.equal(settings.timeout) - adapterSettings = await giriGiriBashi.settings(DOMAIN_ID, ADDRESS_THREE) + adapterSettings = await giriGiriBashi.getSettings(DOMAIN_ID, ADDRESS_THREE) expect(adapterSettings.quarantined).to.deep.equal(settings.quarantined) expect(adapterSettings.minimumBond).to.deep.equal(settings.minimumBond) expect(adapterSettings.startId).to.deep.equal(settings.startId) @@ -245,10 +245,9 @@ describe("GiriGiriBashi", function () { [mockAdapter.address, secondMockAdapter.address], [settings, settings], ) - await giriGiriBashi.setThreshold(DOMAIN_ID, 2) - const oldHead = await giriGiriBashi.heads(DOMAIN_ID) + const oldHead = await giriGiriBashi.getHead(DOMAIN_ID) await giriGiriBashi.getUnanimousHash(DOMAIN_ID, 1) - const newHead = await giriGiriBashi.heads(DOMAIN_ID) + const newHead = await giriGiriBashi.getHead(DOMAIN_ID) expect(newHead).not.to.equal(oldHead) }) }) @@ -262,11 +261,10 @@ describe("GiriGiriBashi", function () { [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address], [settings, settings, settings], ) - await giriGiriBashi.setThreshold(DOMAIN_ID, threshold) - const oldHead = await giriGiriBashi.heads(DOMAIN_ID) + const oldHead = await giriGiriBashi.getHead(DOMAIN_ID) expect(await giriGiriBashi.callStatic.getThresholdHash(DOMAIN_ID, 1)).to.equal(HASH_GOOD) await giriGiriBashi.getThresholdHash(DOMAIN_ID, 1) - const newHead = await giriGiriBashi.heads(DOMAIN_ID) + const newHead = await giriGiriBashi.getHead(DOMAIN_ID) expect(newHead).not.to.equal(oldHead) }) } @@ -287,9 +285,9 @@ describe("GiriGiriBashi", function () { } else { adapters = [secondMockAdapter.address, mockAdapter.address] } - const oldHead = await giriGiriBashi.heads(DOMAIN_ID) + const oldHead = await giriGiriBashi.getHead(DOMAIN_ID) await giriGiriBashi.getHash(DOMAIN_ID, 1, adapters) - const newHead = await giriGiriBashi.heads(DOMAIN_ID) + const newHead = await giriGiriBashi.getHead(DOMAIN_ID) expect(newHead).not.to.equal(oldHead) }) }) @@ -320,13 +318,13 @@ describe("GiriGiriBashi", function () { await giriGiriBashi.setThreshold(DOMAIN_ID, 2) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) - const head = await giriGiriBashi.heads(DOMAIN_ID) + const head = await giriGiriBashi.getHead(DOMAIN_ID) const challengeBlock = head - CHALLENGE_RANGE + 2 await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { value: BOND, }) const challengeId = await giriGiriBashi.getChallengeId(DOMAIN_ID, challengeBlock, mockAdapter.address) - const challenge = await giriGiriBashi.challenges(challengeId) + const challenge = await giriGiriBashi.getChallenge(challengeId) const increaseAmount = challenge.timestamp.add(settings.timeout).add(1) await network.provider.send("evm_setNextBlockTimestamp", [increaseAmount.toHexString()]) @@ -347,13 +345,13 @@ describe("GiriGiriBashi", function () { await giriGiriBashi.setThreshold(DOMAIN_ID, 2) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) - const head = await giriGiriBashi.heads(DOMAIN_ID) + const head = await giriGiriBashi.getHead(DOMAIN_ID) const challengeBlock = head - CHALLENGE_RANGE + 2 await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { value: BOND, }) const challengeId = await giriGiriBashi.getChallengeId(DOMAIN_ID, challengeBlock, mockAdapter.address) - const challenge = await giriGiriBashi.challenges(challengeId) + const challenge = await giriGiriBashi.getChallenge(challengeId) const increaseAmount = challenge.timestamp.add(settings.timeout).add(1) await network.provider.send("evm_setNextBlockTimestamp", [increaseAmount.toHexString()]) @@ -373,7 +371,7 @@ describe("GiriGiriBashi", function () { await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) - const head = await giriGiriBashi.heads(DOMAIN_ID) + const head = await giriGiriBashi.getHead(DOMAIN_ID) const challengeBlock = head - CHALLENGE_RANGE + 2 await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { value: BOND, @@ -390,7 +388,7 @@ describe("GiriGiriBashi", function () { await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) await giriGiriBashi.setThreshold(DOMAIN_ID, 2) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) - const head = await giriGiriBashi.heads(DOMAIN_ID) + const head = await giriGiriBashi.getHead(DOMAIN_ID) expect( await giriGiriBashi.challengeAdapter(DOMAIN_ID, head - CHALLENGE_RANGE + 1, mockAdapter.address, { value: BOND, @@ -408,7 +406,7 @@ describe("GiriGiriBashi", function () { await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) await giriGiriBashi.setThreshold(DOMAIN_ID, 2) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) - const head = await giriGiriBashi.heads(DOMAIN_ID) + const head = await giriGiriBashi.getHead(DOMAIN_ID) // revert on block before start ID await expect(giriGiriBashi.callStatic.challengeAdapter(DOMAIN_ID, 0, mockAdapter.address, { value: BOND })) @@ -449,7 +447,7 @@ describe("GiriGiriBashi", function () { await giriGiriBashi.setThreshold(DOMAIN_ID, 2) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) - const head = await giriGiriBashi.heads(DOMAIN_ID) + const head = await giriGiriBashi.getHead(DOMAIN_ID) expect( await giriGiriBashi.challengeAdapter(DOMAIN_ID, head - CHALLENGE_RANGE + 1, mockAdapter.address, { value: BOND, @@ -462,7 +460,7 @@ describe("GiriGiriBashi", function () { await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) await giriGiriBashi.setThreshold(DOMAIN_ID, 2) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) - const head = await giriGiriBashi.heads(DOMAIN_ID) + const head = await giriGiriBashi.getHead(DOMAIN_ID) await expect( giriGiriBashi.challengeAdapter(DOMAIN_ID, head - CHALLENGE_RANGE + 1, mockAdapter.address, { @@ -486,13 +484,13 @@ describe("GiriGiriBashi", function () { await giriGiriBashi.setThreshold(DOMAIN_ID, 2) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) - const head = await giriGiriBashi.heads(DOMAIN_ID) + const head = await giriGiriBashi.getHead(DOMAIN_ID) const challengeBlock = head - CHALLENGE_RANGE + 1 await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { value: BOND, }) const challengeId = await giriGiriBashi.getChallengeId(DOMAIN_ID, challengeBlock, mockAdapter.address) - const challenge = await giriGiriBashi.challenges(challengeId) + const challenge = await giriGiriBashi.getChallenge(challengeId) const increaseAmount = challenge.timestamp.add(settings.timeout).sub(1) await network.provider.send("evm_setNextBlockTimestamp", [increaseAmount.toHexString()]) @@ -507,14 +505,14 @@ describe("GiriGiriBashi", function () { await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) await giriGiriBashi.setThreshold(DOMAIN_ID, 2) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) - const head = await giriGiriBashi.heads(DOMAIN_ID) + const head = await giriGiriBashi.getHead(DOMAIN_ID) const challengeBlock = head - CHALLENGE_RANGE + 1 await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { value: BOND, }) const challengeId = await giriGiriBashi.getChallengeId(DOMAIN_ID, challengeBlock, mockAdapter.address) - const challenge = await giriGiriBashi.challenges(challengeId) + const challenge = await giriGiriBashi.getChallenge(challengeId) const increaseAmount = challenge.timestamp.add(settings.timeout).add(1) await network.provider.send("evm_setNextBlockTimestamp", [increaseAmount.toHexString()]) @@ -526,7 +524,7 @@ describe("GiriGiriBashi", function () { const newBalance = await ethers.provider.getBalance(wallet.address) await expect(newBalance).to.be.greaterThan(previousBalance) - const quarantined = (await giriGiriBashi.settings(DOMAIN_ID, mockAdapter.address)).quarantined + const quarantined = (await giriGiriBashi.getSettings(DOMAIN_ID, mockAdapter.address)).quarantined await expect(quarantined).to.equal(true) }) it("Keeps bond if _adapters + adapter equals threshold and agree", async function () { @@ -536,7 +534,7 @@ describe("GiriGiriBashi", function () { await giriGiriBashi.setThreshold(DOMAIN_ID, 2) await giriGiriBashi.getHash(DOMAIN_ID, 1, adapters) - const head = await giriGiriBashi.heads(DOMAIN_ID) + const head = await giriGiriBashi.getHead(DOMAIN_ID) const challengeBlock = head.add(20) await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { value: BOND, @@ -545,7 +543,7 @@ describe("GiriGiriBashi", function () { const balanceBefore = await ethers.provider.getBalance(ADDRESS_TWO) await giriGiriBashi.resolveChallenge(DOMAIN_ID, challengeBlock, mockAdapter.address, [secondMockAdapter.address]) expect(await ethers.provider.getBalance(ADDRESS_TWO)).to.equal(balanceBefore.add(BOND)) - const quarantined = (await giriGiriBashi.settings(DOMAIN_ID, mockAdapter.address)).quarantined + const quarantined = (await giriGiriBashi.getSettings(DOMAIN_ID, mockAdapter.address)).quarantined expect(quarantined).to.equal(false) }) it("Reverts if _adapters + adapter equals threshold and disagree", async function () { @@ -555,7 +553,7 @@ describe("GiriGiriBashi", function () { await giriGiriBashi.setThreshold(DOMAIN_ID, 2) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) - const head = await giriGiriBashi.heads(DOMAIN_ID) + const head = await giriGiriBashi.getHead(DOMAIN_ID) const challengeBlock = head.add(1) await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { value: BOND, @@ -575,7 +573,7 @@ describe("GiriGiriBashi", function () { adapters = adapters.sort(compareAddresses) await giriGiriBashi.getHash(DOMAIN_ID, 1, adapters) - const head = await giriGiriBashi.heads(DOMAIN_ID) + const head = await giriGiriBashi.getHead(DOMAIN_ID) const challengeBlock = head.add(20) await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { value: BOND, @@ -590,7 +588,7 @@ describe("GiriGiriBashi", function () { [secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses), ) expect(await ethers.provider.getBalance(ADDRESS_TWO)).to.equal(previousBalance.add(BOND)) - const quarantined = (await giriGiriBashi.settings(DOMAIN_ID, mockAdapter.address)).quarantined + const quarantined = (await giriGiriBashi.getSettings(DOMAIN_ID, mockAdapter.address)).quarantined expect(quarantined).to.equal(false) }) it("Quarantines adapter and returns bond if challenged adapter disagrees with canonical hash", async function () { @@ -601,7 +599,7 @@ describe("GiriGiriBashi", function () { adapters = adapters.sort(compareAddresses) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) - const head = await giriGiriBashi.heads(DOMAIN_ID) + const head = await giriGiriBashi.getHead(DOMAIN_ID) const challengeBlock = head.add(1) await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { value: BOND, @@ -613,7 +611,7 @@ describe("GiriGiriBashi", function () { mockAdapter.address, [secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses), ) - const quarantined = (await giriGiriBashi.settings(DOMAIN_ID, mockAdapter.address)).quarantined + const quarantined = (await giriGiriBashi.getSettings(DOMAIN_ID, mockAdapter.address)).quarantined await expect(quarantined).to.equal(true) }) it("Clears state after challenge is resolved", async function () { @@ -624,7 +622,7 @@ describe("GiriGiriBashi", function () { adapters = adapters.sort(compareAddresses) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) - const head = await giriGiriBashi.heads(DOMAIN_ID) + const head = await giriGiriBashi.getHead(DOMAIN_ID) const challengeBlock = head.add(1) await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { value: BOND, @@ -636,10 +634,10 @@ describe("GiriGiriBashi", function () { mockAdapter.address, [secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses), ) - const quarantined = (await giriGiriBashi.settings(DOMAIN_ID, mockAdapter.address)).quarantined + const quarantined = (await giriGiriBashi.getSettings(DOMAIN_ID, mockAdapter.address)).quarantined expect(quarantined).to.equal(true) const challengeId = await giriGiriBashi.getChallengeId(DOMAIN_ID, challengeBlock, mockAdapter.address) - const challenge = await giriGiriBashi.challenges(challengeId) + const challenge = await giriGiriBashi.getChallenge(challengeId) expect(challenge.challenger).to.equal(ADDRESS_ZERO) expect(challenge.timestamp).to.equal(0) expect(challenge.bond).to.equal(0) @@ -651,7 +649,7 @@ describe("GiriGiriBashi", function () { await giriGiriBashi.setThreshold(DOMAIN_ID, 2) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) - const head = await giriGiriBashi.heads(DOMAIN_ID) + const head = await giriGiriBashi.getHead(DOMAIN_ID) const challengeBlock = head.add(1) await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { value: BOND, @@ -706,8 +704,8 @@ describe("GiriGiriBashi", function () { await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) await giriGiriBashi.setThreshold(DOMAIN_ID, 2) expect(await giriGiriBashi.declareNoConfidence(DOMAIN_ID, 20, adapters)) - const domain = await giriGiriBashi.domains(DOMAIN_ID) - const challengeRange = await giriGiriBashi.challengeRanges(DOMAIN_ID) + const domain = await giriGiriBashi.getDomain(DOMAIN_ID) + const challengeRange = await giriGiriBashi.getChallengeRange(DOMAIN_ID) expect(domain.threshold).to.equal(ethers.constants.MaxUint256) expect(challengeRange).to.equal(0) }) @@ -743,7 +741,7 @@ describe("GiriGiriBashi", function () { it("Sets challenge range for given domain", async function () { const { giriGiriBashi } = await setup() expect(await giriGiriBashi.setChallengeRange(2, CHALLENGE_RANGE)) - const challengeRange = await giriGiriBashi.challengeRanges(2) + const challengeRange = await giriGiriBashi.getChallengeRange(2) expect(challengeRange).to.equal(CHALLENGE_RANGE) }) it("Emits the ChallengeRangeUpdated event", async function () { @@ -813,7 +811,7 @@ describe("GiriGiriBashi", function () { adapters = adapters.sort(compareAddresses) await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) - const head = await giriGiriBashi.heads(DOMAIN_ID) + const head = await giriGiriBashi.getHead(DOMAIN_ID) const challengeBlock = head.add(1) await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { value: BOND, @@ -828,7 +826,7 @@ describe("GiriGiriBashi", function () { expect( await giriGiriBashi.replaceQuarantinedAdapters(DOMAIN_ID, [mockAdapter.address], [ADDRESS_TWO], [settings]), ) - const adapterSettings = await giriGiriBashi.settings(DOMAIN_ID, ADDRESS_TWO) + const adapterSettings = await giriGiriBashi.getSettings(DOMAIN_ID, ADDRESS_TWO) expect(adapterSettings.quarantined).to.deep.equal(settings.quarantined) expect(adapterSettings.minimumBond).to.deep.equal(settings.minimumBond) expect(adapterSettings.startId).to.deep.equal(settings.startId) From 5b4f85ff4229236e206fe7412af7296faa1a04c6 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Fri, 23 Feb 2024 10:46:57 +0100 Subject: [PATCH 146/297] feat(contracts & test): adds support for zk adapters within Yaho --- packages/evm/contracts/Yaho.sol | 5 ++++- packages/evm/contracts/interfaces/IYaho.sol | 4 ++++ packages/evm/test/04_Yaho.spec.ts | 19 +++++++++++++++- packages/evm/test/05_Yaru.spec.ts | 25 ++++++++++++++++++++- 4 files changed, 50 insertions(+), 3 deletions(-) diff --git a/packages/evm/contracts/Yaho.sol b/packages/evm/contracts/Yaho.sol index fd986df1..2eeb005f 100644 --- a/packages/evm/contracts/Yaho.sol +++ b/packages/evm/contracts/Yaho.sol @@ -193,7 +193,10 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { bytes32[] memory reportersReceipts = new bytes32[](reporters.length); for (uint256 i = 0; i < reporters.length; ) { - reportersReceipts[i] = reporters[i].dispatchMessages(targetChainId, adapters[i], messageIds, messageHashes); + IReporter reporter = reporters[i]; + if (address(reporter) != address(0)) { + reportersReceipts[i] = reporter.dispatchMessages(targetChainId, adapters[i], messageIds, messageHashes); + } unchecked { ++i; } diff --git a/packages/evm/contracts/interfaces/IYaho.sol b/packages/evm/contracts/interfaces/IYaho.sol index 46f8edc1..2d213161 100644 --- a/packages/evm/contracts/interfaces/IYaho.sol +++ b/packages/evm/contracts/interfaces/IYaho.sol @@ -36,6 +36,8 @@ interface IYaho is IMessageHashCalculator, IMessageIdCalculator { * @param reporters - An array of `IReporter` contracts (not actively used in this step). * @param adapters - An array of `IAdapter` contracts (for later validation use). * @return messageId A unique identifier for the dispatched message, used for tracking and subsequent validation. + * @notice If you intend to use a zk adapter, you need to specify only the adapter and utilize address(0) as the reporter, as the adapter will verify the MessageDispatched event emitted by Yaho. + * */ function dispatchMessage( uint256 targetChainId, @@ -55,6 +57,7 @@ interface IYaho is IMessageHashCalculator, IMessageIdCalculator { * @param reporters - An array of `IReporter` contracts (not actively used in this step). * @param adapters - An array of `IAdapter` contracts (for later validation use). * @return (messageId, result) A unique identifier for the dispatched message and an array of byte arrays, where each element is the result of dispatching a respective message to the corresponding Reporter. + * @notice If you intend to use a zk adapter, you need to specify only the adapter and utilize address(0) as the reporter, as the adapter will verify the MessageDispatched event emitted by Yaho. */ function dispatchMessageToAdapters( uint256 targetChainId, @@ -74,6 +77,7 @@ interface IYaho is IMessageHashCalculator, IMessageIdCalculator { * @param reporters - An array of `IReporter` contracts for reporting the status of each message. * @param adapters - An array of `IAdapter` contracts used for the validation of each message. * @return (messageIds, result) An array of unique identifiers for the dispatched messages and an array of bytes32 arrays, where each element is the result of dispatching a respective message to the corresponding Reporter. + * @notice If you intend to use a zk adapter, you need to specify only the adapter and utilize address(0) as the reporter, as the adapter will verify the MessageDispatched event emitted by Yaho. */ function dispatchMessagesToAdapters( uint256 targetChainId, diff --git a/packages/evm/test/04_Yaho.spec.ts b/packages/evm/test/04_Yaho.spec.ts index 08e1d296..97cfc68c 100644 --- a/packages/evm/test/04_Yaho.spec.ts +++ b/packages/evm/test/04_Yaho.spec.ts @@ -6,7 +6,7 @@ import { ethers } from "hardhat" import { toBytes32 } from "./utils" import Message from "./utils/Message" -import { Chains } from "./utils/constants" +import { Chains, ZERO_ADDRESS } from "./utils/constants" let reporter1: Contract, reporter2: Contract, @@ -128,6 +128,23 @@ describe("Yaho", () => { .to.be.revertedWithCustomError(yaho, "InvalidThreshold") .withArgs(3, 2) }) + + it("should dispatch a single message without calling the reporter because a zk adapter is used", async () => { + const threshold = 2 + const tx = await yaho.dispatchMessage( + Chains.Gnosis, + threshold, + receiver1.address, + "0x01", + [ZERO_ADDRESS, reporter2.address], + [adapter1.address, adapter2.address], + ) + const [message] = Message.fromReceipt(await tx.wait(1)) + await expect(tx).to.emit(yaho, "MessageDispatched").withArgs(message.id, anyValue) // FIXME: https://github.com/NomicFoundation/hardhat/issues/3833 + expect(await yaho.getPendingMessageHash(message.id)).to.be.eq( + await yaho.calculateMessageHash(message.serialize()), + ) + }) }) describe("dispatchMessageToAdapters", () => { diff --git a/packages/evm/test/05_Yaru.spec.ts b/packages/evm/test/05_Yaru.spec.ts index 28f935bd..dff4edd8 100644 --- a/packages/evm/test/05_Yaru.spec.ts +++ b/packages/evm/test/05_Yaru.spec.ts @@ -3,7 +3,7 @@ import { Contract } from "ethers" import { ethers } from "hardhat" import Message from "./utils/Message" -import { Chains } from "./utils/constants" +import { Chains, ZERO_ADDRESS } from "./utils/constants" let reporter1: Contract, reporter2: Contract, @@ -190,5 +190,28 @@ describe("Yaru", () => { .and.to.emit(pingPong2, "Pong") }) } + + it(`should be able to execute a message using 2 zk adapters`, async () => { + const threshold = 4 + const tx = await yaho.dispatchMessagesToAdapters( + Chains.Hardhat, + [threshold, threshold], + [pingPong1.address, pingPong2.address], + ["0x01", "0x02"], + [ZERO_ADDRESS, reporter2.address, ZERO_ADDRESS, reporter4.address], + [adapter1.address, adapter2.address, adapter3.address, adapter4.address], + ) + const [message1, message2] = Message.fromReceipt(await tx.wait(1)) + const hash1 = await yaho.calculateMessageHash(message1.serialize()) + const hash2 = await yaho.calculateMessageHash(message2.serialize()) + const adapters = [adapter1, adapter2, adapter3, adapter4] + for (let i = 0; i < threshold; i++) { + await adapters[i].setHashes(Chains.Hardhat, [message1.id], [hash1]) + await adapters[i].setHashes(Chains.Hardhat, [message2.id], [hash2]) + } + await expect(yaru.executeMessages([message1, message2])) + .to.emit(pingPong1, "Pong") + .and.to.emit(pingPong2, "Pong") + }) }) }) From 0d463ddebbfd1128b7f5870127c727cc65039a4b Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 26 Feb 2024 06:42:41 +0100 Subject: [PATCH 147/297] refactor(contracts): changes comments --- packages/evm/contracts/interfaces/IYaho.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/evm/contracts/interfaces/IYaho.sol b/packages/evm/contracts/interfaces/IYaho.sol index 2d213161..e765f436 100644 --- a/packages/evm/contracts/interfaces/IYaho.sol +++ b/packages/evm/contracts/interfaces/IYaho.sol @@ -36,7 +36,7 @@ interface IYaho is IMessageHashCalculator, IMessageIdCalculator { * @param reporters - An array of `IReporter` contracts (not actively used in this step). * @param adapters - An array of `IAdapter` contracts (for later validation use). * @return messageId A unique identifier for the dispatched message, used for tracking and subsequent validation. - * @notice If you intend to use a zk adapter, you need to specify only the adapter and utilize address(0) as the reporter, as the adapter will verify the MessageDispatched event emitted by Yaho. + * @notice If you plan to use an Adapter that does not have a corresponding Reporter (such as a zk adapter), you need to specify only the adapter and use address(0) as the reporter, since the adapter will verify the MessageDispatched event emitted by Yaho. * */ function dispatchMessage( @@ -57,7 +57,7 @@ interface IYaho is IMessageHashCalculator, IMessageIdCalculator { * @param reporters - An array of `IReporter` contracts (not actively used in this step). * @param adapters - An array of `IAdapter` contracts (for later validation use). * @return (messageId, result) A unique identifier for the dispatched message and an array of byte arrays, where each element is the result of dispatching a respective message to the corresponding Reporter. - * @notice If you intend to use a zk adapter, you need to specify only the adapter and utilize address(0) as the reporter, as the adapter will verify the MessageDispatched event emitted by Yaho. + * @notice If you plan to use an Adapter that does not have a corresponding Reporter (such as a zk adapter), you need to specify only the adapter and use address(0) as the reporter, since the adapter will verify the MessageDispatched event emitted by Yaho. */ function dispatchMessageToAdapters( uint256 targetChainId, @@ -77,7 +77,7 @@ interface IYaho is IMessageHashCalculator, IMessageIdCalculator { * @param reporters - An array of `IReporter` contracts for reporting the status of each message. * @param adapters - An array of `IAdapter` contracts used for the validation of each message. * @return (messageIds, result) An array of unique identifiers for the dispatched messages and an array of bytes32 arrays, where each element is the result of dispatching a respective message to the corresponding Reporter. - * @notice If you intend to use a zk adapter, you need to specify only the adapter and utilize address(0) as the reporter, as the adapter will verify the MessageDispatched event emitted by Yaho. + * @notice If you plan to use an Adapter that does not have a corresponding Reporter (such as a zk adapter), you need to specify only the adapter and use address(0) as the reporter, since the adapter will verify the MessageDispatched event emitted by Yaho. */ function dispatchMessagesToAdapters( uint256 targetChainId, From 5fd107734994fe477d190f23335bcdb37bf6fbde Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 26 Feb 2024 17:22:29 +0100 Subject: [PATCH 148/297] refactor(evm): rn vars --- packages/evm/contracts/adapters/Reporter.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/evm/contracts/adapters/Reporter.sol b/packages/evm/contracts/adapters/Reporter.sol index e1a9a5c0..4e08120f 100644 --- a/packages/evm/contracts/adapters/Reporter.sol +++ b/packages/evm/contracts/adapters/Reporter.sol @@ -54,7 +54,7 @@ abstract contract Reporter is IReporter { function _dispatch( uint256 targetChainId, address adapter, - uint256[] memory messageIds, - bytes32[] memory messageHashes + uint256[] memory ids, + bytes32[] memory hashes ) internal virtual returns (bytes32); } From 2362a45cef0f1d3dba4c5c1513a2977d9cf9a36a Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 27 Feb 2024 13:32:57 +0100 Subject: [PATCH 149/297] refactor(contracts & test): rm try catch within checkHashWithThresholdFromAdapters & _getThresholdHash --- packages/evm/contracts/Hashi.sol | 4 +--- packages/evm/contracts/ownable/ShuSo.sol | 4 +--- packages/evm/test/05_Yaru.spec.ts | 2 +- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/packages/evm/contracts/Hashi.sol b/packages/evm/contracts/Hashi.sol index e34624df..bf315da2 100644 --- a/packages/evm/contracts/Hashi.sol +++ b/packages/evm/contracts/Hashi.sol @@ -49,9 +49,7 @@ contract Hashi is IHashi { bytes32[] memory hashes = new bytes32[](adapters.length); for (uint256 i = 0; i < adapters.length; ) { - try adapters[i].getHash(domain, id) returns (bytes32 hash) { - hashes[i] = hash; - } catch {} // solhint-disable no-empty-blocks + hashes[i] = adapters[i].getHash(domain, id); unchecked { ++i; } diff --git a/packages/evm/contracts/ownable/ShuSo.sol b/packages/evm/contracts/ownable/ShuSo.sol index da067e93..a8d42c05 100644 --- a/packages/evm/contracts/ownable/ShuSo.sol +++ b/packages/evm/contracts/ownable/ShuSo.sol @@ -158,9 +158,7 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { bytes32[] memory hashes = new bytes32[](adapters.length); for (uint256 i = 0; i < adapters.length; i++) { - try adapters[i].getHash(domain, id) returns (bytes32 currentHash) { - hashes[i] = currentHash; - } catch {} // solhint-disable no-empty-blocks + hashes[i] = adapters[i].getHash(domain, id); } for (uint256 i = 0; i < hashes.length; i++) { diff --git a/packages/evm/test/05_Yaru.spec.ts b/packages/evm/test/05_Yaru.spec.ts index 28f935bd..20ee975d 100644 --- a/packages/evm/test/05_Yaru.spec.ts +++ b/packages/evm/test/05_Yaru.spec.ts @@ -98,7 +98,7 @@ describe("Yaru", () => { pingPong1.address, "0x01", [reporter1.address, reporter2.address, reporter3.address], - [adapter1.address, adapter2.address, reporter3.address], + [adapter1.address, adapter2.address, adapter3.address], ) const [message] = Message.fromReceipt(await tx.wait(1)) const hash = await yaho.calculateMessageHash(message.serialize()) From 66a5d99000df050f68862aa2bad7e005cffe57e8 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 27 Feb 2024 16:08:22 +0100 Subject: [PATCH 150/297] fix(contracts & test): fixes declareNoConfidence for case equalHashes + zeroHashes >= threshold --- packages/evm/contracts/interfaces/IGiriGiriBashi.sol | 1 - packages/evm/contracts/ownable/GiriGiriBashi.sol | 8 ++++---- packages/evm/test/03_GiriGiriBashi.spec.ts | 11 ++++++++++- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/packages/evm/contracts/interfaces/IGiriGiriBashi.sol b/packages/evm/contracts/interfaces/IGiriGiriBashi.sol index 403d757c..b1eb1965 100644 --- a/packages/evm/contracts/interfaces/IGiriGiriBashi.sol +++ b/packages/evm/contracts/interfaces/IGiriGiriBashi.sol @@ -26,7 +26,6 @@ interface IGiriGiriBashi is IShuSho { error AdaptersCannotContainChallengedAdapter(IAdapter[] adapters, IAdapter adapter); error AdapterHasNotYetTimedOut(IAdapter adapter); error AdapterNotQuarantined(IAdapter adapter); - error AdaptersAgreed(); error AlreadyQuarantined(IAdapter adapter); error CannotProveNoConfidence(uint256 domain, uint256 id, IAdapter[] adapters); error ChallengeNotFound(bytes32 challengeId, uint256 domain, uint256 id, IAdapter adapter); diff --git a/packages/evm/contracts/ownable/GiriGiriBashi.sol b/packages/evm/contracts/ownable/GiriGiriBashi.sol index 2b296413..260c89a8 100644 --- a/packages/evm/contracts/ownable/GiriGiriBashi.sol +++ b/packages/evm/contracts/ownable/GiriGiriBashi.sol @@ -86,13 +86,13 @@ contract GiriGiriBashi is IGiriGiriBashi, ShuSo { for (uint256 i = 0; i < hashes.length; i++) { uint256 equalHashes = 1; - for (uint256 j = 0; j < hashes.length; j++) + for (uint256 j = 0; j < hashes.length; j++) { if (hashes[i] == hashes[j] && i != j) { equalHashes++; - if (equalHashes == threshold) { - revert AdaptersAgreed(); - } } + } + + if (equalHashes + zeroHashes >= threshold) revert CannotProveNoConfidence(domain, id, adapters); } _setDomainThreshold(domain, type(uint256).max); diff --git a/packages/evm/test/03_GiriGiriBashi.spec.ts b/packages/evm/test/03_GiriGiriBashi.spec.ts index df378b2c..4da60ad9 100644 --- a/packages/evm/test/03_GiriGiriBashi.spec.ts +++ b/packages/evm/test/03_GiriGiriBashi.spec.ts @@ -695,9 +695,18 @@ describe("GiriGiriBashi", function () { await giriGiriBashi.setThreshold(DOMAIN_ID, 2) await expect(giriGiriBashi.callStatic.declareNoConfidence(DOMAIN_ID, 22, adapters)).to.be.revertedWithCustomError( giriGiriBashi, - "AdaptersAgreed", + "CannotProveNoConfidence", ) }) + it("Reverts if number of equal hashes + number of zero hashes are greater than the threshold", async function () { + const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() + const adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses) + await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) + await giriGiriBashi.setThreshold(DOMAIN_ID, 2) + await expect(giriGiriBashi.callStatic.declareNoConfidence(DOMAIN_ID, 23, adapters)) + .to.be.revertedWithCustomError(giriGiriBashi, "CannotProveNoConfidence") + .withArgs(DOMAIN_ID, 23, adapters) + }) it("Clears state for domain", async function () { const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() const adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses) From 29bac5802fe0c0742562865f022fa2a0460520a4 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Fri, 8 Mar 2024 14:37:46 +0100 Subject: [PATCH 151/297] refactor(tasks): refactors amb deploy tasks --- packages/evm/tasks/deploy/adapters/amb.ts | 44 ++++++++++++++------- packages/evm/tasks/deploy/adapters/index.ts | 1 + 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/packages/evm/tasks/deploy/adapters/amb.ts b/packages/evm/tasks/deploy/adapters/amb.ts index b1d6dfac..e2af7511 100644 --- a/packages/evm/tasks/deploy/adapters/amb.ts +++ b/packages/evm/tasks/deploy/adapters/amb.ts @@ -4,15 +4,15 @@ import type { TaskArguments } from "hardhat/types" import { verify } from ".." import type { AMBAdapter } from "../../../types/contracts/adapters/AMB/AMBAdapter" -import type { AMBHeaderReporter } from "../../../types/contracts/adapters/AMB/AMBHeaderReporter" +import type { AMBReporter } from "../../../types/contracts/adapters/AMB/AMBReporter" import type { AMBAdapter__factory } from "../../../types/factories/contracts/adapters/AMB/AMBAdapter__factory" -import { AMBHeaderReporter__factory } from "../../../types/factories/contracts/adapters/AMB/AMBHeaderReporter__factory" +import { AMBReporter__factory } from "../../../types/factories/contracts/adapters/AMB/AMBReporter__factory" // Deploy on destination chain task("deploy:AMB:Adapter") .addParam("amb", "address of the AMB contract", undefined, types.string) .addParam("reporter", "address of the hash reporter", undefined, types.string) - .addParam("chainId", "chainId of the source chain", undefined, types.int) + .addParam("sourceChainId", "sourceChainId of the source chain", undefined, types.int) .addFlag("verify", "whether to verify the contract on Etherscan") .setAction(async function (taskArguments: TaskArguments, hre) { console.log("Deploying AMBAdapter...") @@ -20,7 +20,12 @@ task("deploy:AMB:Adapter") const ambAdapterFactory: AMBAdapter__factory = ( await hre.ethers.getContractFactory("AMBAdapter") ) - const constructorArguments = [taskArguments.amb, taskArguments.reporter, taskArguments.chainId] as const + + const constructorArguments = [ + taskArguments.amb, + taskArguments.reporter, + "0x" + taskArguments.sourceChainId.toString(16).padStart(64, "0"), + ] as const const ambAdapter: AMBAdapter = ( await ambAdapterFactory.connect(signers[0]).deploy(...constructorArguments) ) @@ -30,21 +35,30 @@ task("deploy:AMB:Adapter") }) // Deploy source chain -task("deploy:AMB:HeaderReporter") - .addParam("amb", "address of the AMB contract", undefined, types.string) +task("deploy:AMB:Reporter") .addParam("headerStorage", "address of the header storage contract", undefined, types.string) + .addParam("yaho", "address of the Yaho contract", undefined, types.string) + .addParam("amb", "address of the AMB contract", undefined, types.string) + .addParam("targetChainId", "target chain id", undefined, types.int) + .addParam("gas", "gas limit value used to call requireToPassMessage", 500000, types.int) .addFlag("verify", "whether to verify the contract on Etherscan") .setAction(async function (taskArguments: TaskArguments, hre) { - console.log("Deploying AMBHeaderReporter...") + console.log("Deploying AMBReporter...") const signers: SignerWithAddress[] = await hre.ethers.getSigners() - const ambHeaderReporterFactory: AMBHeaderReporter__factory = ( - await hre.ethers.getContractFactory("AMBHeaderReporter") + const ambReporterFactory: AMBReporter__factory = ( + await hre.ethers.getContractFactory("AMBReporter") ) - const constructorArguments = [taskArguments.amb, taskArguments.reporter, taskArguments.chainId] as const - const ambHeaderReporter: AMBHeaderReporter = ( - await ambHeaderReporterFactory.connect(signers[0]).deploy(...constructorArguments) + const constructorArguments = [ + taskArguments.headerStorage, + taskArguments.yaho, + taskArguments.amb, + taskArguments.targetChainId, + taskArguments.gas, + ] as const + const ambReporter: AMBReporter = ( + await ambReporterFactory.connect(signers[0]).deploy(...constructorArguments) ) - await ambHeaderReporter.deployed() - console.log("AMBHeaderReporter deployed to:", ambHeaderReporter.address) - if (taskArguments.verify) await verify(hre, ambHeaderReporter, constructorArguments) + await ambReporter.deployed() + console.log("AMBReporter deployed to:", ambReporter.address) + if (taskArguments.verify) await verify(hre, ambReporter, constructorArguments) }) diff --git a/packages/evm/tasks/deploy/adapters/index.ts b/packages/evm/tasks/deploy/adapters/index.ts index 4545e873..127e0691 100644 --- a/packages/evm/tasks/deploy/adapters/index.ts +++ b/packages/evm/tasks/deploy/adapters/index.ts @@ -1,3 +1,4 @@ +import "./amb" import "./axelar" import "./axiom" import "./ccip" From d83fd2ab807cbf3743aa59164ac1627face895a0 Mon Sep 17 00:00:00 2001 From: Shivam Agrawal Date: Mon, 11 Mar 2024 16:51:56 +0530 Subject: [PATCH 152/297] added Router adapter --- .../adapters/Router/RouterAdapter.sol | 60 ++++++++++ .../adapters/Router/RouterReporter.sol | 111 ++++++++++++++++++ packages/evm/package.json | 1 + packages/evm/tasks/deploy/adapters/index.ts | 1 + packages/evm/tasks/deploy/adapters/router.ts | 60 ++++++++++ packages/evm/yarn.lock | 56 ++++----- 6 files changed, 255 insertions(+), 34 deletions(-) create mode 100644 packages/evm/contracts/adapters/Router/RouterAdapter.sol create mode 100644 packages/evm/contracts/adapters/Router/RouterReporter.sol create mode 100644 packages/evm/tasks/deploy/adapters/router.ts diff --git a/packages/evm/contracts/adapters/Router/RouterAdapter.sol b/packages/evm/contracts/adapters/Router/RouterAdapter.sol new file mode 100644 index 00000000..2c042040 --- /dev/null +++ b/packages/evm/contracts/adapters/Router/RouterAdapter.sol @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity ^0.8.20; + +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; +import { IDapp } from "@routerprotocol/evm-gateway-contracts/contracts/IDapp.sol"; +import { IGateway } from "@routerprotocol/evm-gateway-contracts/contracts/IGateway.sol"; +import { BlockHashAdapter } from "../BlockHashAdapter.sol"; + +contract RouterAdapter is BlockHashAdapter, Ownable, IDapp { + string public constant PROVIDER = "router"; + + IGateway public immutable ROUTER_GATEWAY; + + mapping(bytes32 => bytes32) public enabledReporters; + mapping(bytes32 => uint256) public chainIds; + + error UnauthorizedRouterReceive(); + error RouterIAckNotSupported(); + + event ReporterSet(uint256 indexed chainId, string name, string indexed reporter); + + constructor(address routerGateway) { + ROUTER_GATEWAY = IGateway(routerGateway); + } + + function setReporterByChain( + uint256 chainId, + string calldata chainIdStr, + string calldata reporter + ) external onlyOwner { + bytes32 chainIdHash = keccak256(bytes(chainIdStr)); + enabledReporters[chainIdHash] = keccak256(bytes(reporter)); + chainIds[chainIdHash] = chainId; + emit ReporterSet(chainId, chainIdStr, reporter); + } + + function iReceive( + string calldata requestSender, + bytes calldata packet, + string calldata srcChainId + ) external override returns (bytes memory) { + bytes32 chainIdHash = keccak256(bytes(srcChainId)); + uint256 sourceChainId = chainIds[chainIdHash]; + + if ( + msg.sender != address(ROUTER_GATEWAY) || + enabledReporters[chainIdHash] != keccak256(bytes(requestSender)) || + sourceChainId == 0 + ) revert UnauthorizedRouterReceive(); + + (uint256[] memory ids, bytes32[] memory hashes) = abi.decode(packet, (uint256[], bytes32[])); + _storeHashes(sourceChainId, ids, hashes); + + return hex""; + } + + function iAck(uint256, bool, bytes memory) external override { + revert RouterIAckNotSupported(); + } +} diff --git a/packages/evm/contracts/adapters/Router/RouterReporter.sol b/packages/evm/contracts/adapters/Router/RouterReporter.sol new file mode 100644 index 00000000..2cc1a68c --- /dev/null +++ b/packages/evm/contracts/adapters/Router/RouterReporter.sol @@ -0,0 +1,111 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity ^0.8.20; + +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; +import { Strings } from "@openzeppelin/contracts/utils/Strings.sol"; +import { Reporter } from "../Reporter.sol"; +import { IGateway } from "@routerprotocol/evm-gateway-contracts/contracts/IGateway.sol"; +import { Strings } from "@openzeppelin/contracts/utils/Strings.sol"; + +interface IRouterGateway is IGateway { + function iSendDefaultFee() external view returns (uint256); + + function currentVersion() external view returns (uint256); +} + +interface IRouterGasStation { + function payFee(string memory destChainId, uint256 destGasLimit) external payable returns (uint256); +} + +contract RouterReporter is Reporter, Ownable { + using Strings for uint256; + + string public constant PROVIDER = "router"; + bytes32 private constant NULL_STRING = keccak256(""); + IRouterGateway public immutable ROUTER_GATEWAY; + IRouterGasStation public immutable ROUTER_GAS_STATION; + uint256 public immutable CURRENT_GATEWAY_VERSION; + string public feePayer; + + mapping(uint256 => string) public chainIds; + + error ChainIdNotSupported(uint256 chainId); + error InsufficientFeePassed(); + + event ChainIdSet(uint256 indexed chainId, string indexed chainIdString); + event FeePayerSet(string oldFeePayer, string feePayer); + + constructor( + address headerStorage, + address yaho, + address routerGateway, + address routerGasStation, + string memory routerFeePayer + ) Reporter(headerStorage, yaho) { + ROUTER_GATEWAY = IRouterGateway(routerGateway); + ROUTER_GAS_STATION = IRouterGasStation(routerGasStation); + + feePayer = routerFeePayer; + + CURRENT_GATEWAY_VERSION = ROUTER_GATEWAY.currentVersion(); + ROUTER_GATEWAY.setDappMetadata(routerFeePayer); + } + + function setRouterFeePayer(string memory routerFeePayer) external onlyOwner { + string memory oldFeePayer = feePayer; + feePayer = routerFeePayer; + ROUTER_GATEWAY.setDappMetadata(routerFeePayer); + + emit FeePayerSet(oldFeePayer, routerFeePayer); + } + + function setChainIdStringByChainId(uint256 chainId, string calldata chainIdString) external onlyOwner { + chainIds[chainId] = chainIdString; + emit ChainIdSet(chainId, chainIdString); + } + + function getRequestMetadata() internal pure returns (bytes memory) { + bytes memory requestMetadata = abi.encodePacked( + uint64(200_000), + uint64(0), + uint64(0), + uint64(0), + uint128(0), + uint8(0), + false, + string("") + ); + return requestMetadata; + } + + function _dispatch( + uint256 targetChainId, + address adapter, + uint256[] memory ids, + bytes32[] memory hashes + ) internal override returns (bytes32) { + string memory targetChainIdStr = chainIds[targetChainId]; + if (keccak256(abi.encode(targetChainIdStr)) == NULL_STRING) revert ChainIdNotSupported(targetChainId); + + bytes memory payload = abi.encode(ids, hashes); + string memory stringAdapter = uint256(uint160(adapter)).toHexString(20); + bytes memory requestPacket = abi.encode(stringAdapter, payload); + bytes memory requestMetadata = getRequestMetadata(); + + uint256 iSendFee = ROUTER_GATEWAY.iSendDefaultFee(); + if (msg.value < iSendFee) revert InsufficientFeePassed(); + + ROUTER_GAS_STATION.payFee{ value: msg.value }(targetChainIdStr, 200_000); + + ROUTER_GATEWAY.iSend{ value: iSendFee }( + CURRENT_GATEWAY_VERSION, + 0, + string(""), + targetChainIdStr, + requestMetadata, + requestPacket + ); + + return bytes32(0); + } +} diff --git a/packages/evm/package.json b/packages/evm/package.json index 1a5e322d..bb3835d3 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -99,6 +99,7 @@ "@hyperlane-xyz/core": "^3.1.10", "@openzeppelin/contracts-upgradeable": "^4.8.1", "@polytope-labs/solidity-merkle-trees": "^0.2.1", + "@routerprotocol/evm-gateway-contracts": "^1.1.13", "hardhat-change-network": "^0.0.7", "hardhat-deploy": "^0.11.31", "openzeppelin": "npm:@openzeppelin/contracts@4.3.3", diff --git a/packages/evm/tasks/deploy/adapters/index.ts b/packages/evm/tasks/deploy/adapters/index.ts index 127e0691..6f0bad60 100644 --- a/packages/evm/tasks/deploy/adapters/index.ts +++ b/packages/evm/tasks/deploy/adapters/index.ts @@ -14,3 +14,4 @@ import "./sygma" import "./telepathy" import "./wormhole" import "./zetachain" +import "./router" diff --git a/packages/evm/tasks/deploy/adapters/router.ts b/packages/evm/tasks/deploy/adapters/router.ts new file mode 100644 index 00000000..22a05c3a --- /dev/null +++ b/packages/evm/tasks/deploy/adapters/router.ts @@ -0,0 +1,60 @@ +import type { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers" +import { task, types } from "hardhat/config" +import type { TaskArguments } from "hardhat/types" +import type { RouterAdapter } from "../../../types/contracts/adapters/Router/RouterAdapter.sol/RouterAdapter" +import type { RouterAdapter__factory } from "../../../types/factories/contracts/adapters/Router/RouterAdapter.sol/RouterAdapter__factory" +import type { RouterReporter } from "../../../types/contracts/adapters/Router/RouterReporter.sol/RouterReporter" +import type { RouterReporter__factory } from "../../../types/factories/contracts/adapters/Router/RouterReporter.sol/RouterReporter__factory" +import { verify } from "../index" + +task("deploy:adapter:RouterAdapter") + .addParam("routerGateway", "address of the Router gateway contract") + .addFlag("verify", "whether to verify the contract on Etherscan") + .setAction(async function (taskArguments: TaskArguments, hre) { + console.log("Deploying RouterAdapter...") + const signers: SignerWithAddress[] = await hre.ethers.getSigners() + const routerAdapterFactory: RouterAdapter__factory = ( + await hre.ethers.getContractFactory("RouterAdapter") + ) + const constructorArguments = [ + taskArguments.routerGateway, + ] as const + const routerAdapter: RouterAdapter = ( + await routerAdapterFactory.connect(signers[0]).deploy(...constructorArguments) + ) + await routerAdapter.deployed() + console.log("RouterAdapter deployed to:", routerAdapter.address) + if (taskArguments.verify) await verify(hre, routerAdapter, constructorArguments) + }) + +task("deploy:adapter:RouterReporter") +.addParam("headerStorage", "address of the header storage contract") + .addParam("yaho", "address of the Yaho contract", undefined, types.string) + .addParam("routerGateway", "address of the Router gateway contract") + .addParam("routerGasStation", "address of the Router gas station contract") + .addParam( + "routerFeePayer", + "address of the fee payer for this contract (https://docs.routerprotocol.com/develop/message-transfer-via-crosstalk/evm-guides/iDapp-functions/setDappMetadata)", + ) + .addFlag("verify", "whether to verify the contract on Etherscan") + .setAction(async function (taskArguments: TaskArguments, hre) { + console.log("Deploying RouterReporter...") + const signers: SignerWithAddress[] = await hre.ethers.getSigners() + const routerReporterFactory: RouterReporter__factory = ( + await hre.ethers.getContractFactory("RouterReporter") + ) + const constructorArguments = [ + taskArguments.headerStorage, + taskArguments.yaho, + taskArguments.routerGateway, + taskArguments.routerGasStation, + taskArguments.routerFeePayer, + ] as const + const routerReporter: RouterReporter = ( + await routerReporterFactory.connect(signers[0]).deploy(...constructorArguments) + ) + await routerReporter.deployed() + console.log("RouterReporter deployed to:", routerReporter.address) + if (taskArguments.verify) await verify(hre, routerReporter, constructorArguments) + }) + diff --git a/packages/evm/yarn.lock b/packages/evm/yarn.lock index 80fdcbef..231c8271 100644 --- a/packages/evm/yarn.lock +++ b/packages/evm/yarn.lock @@ -955,35 +955,6 @@ __metadata: languageName: node linkType: hard -"@gnosis.pm/mock-contract@npm:^4.0.0": - version: 4.0.0 - resolution: "@gnosis.pm/mock-contract@npm:4.0.0" - checksum: ce6f3d6218779a1899f9697dc668ce85c9fcd8b743a8c7cd157124130cc79ba0b2f64faa1a723a03c41134dc617bec2af0a757a381397674e745d694a8cb4bb2 - languageName: node - linkType: hard - -"@gnosis.pm/safe-contracts@npm:1.3.0": - version: 1.3.0 - resolution: "@gnosis.pm/safe-contracts@npm:1.3.0" - peerDependencies: - ethers: ^5.1.4 - checksum: fea331745e3af0ed7322115e5bd4cc37de914253d9f6e1d85a4713e7e1fdc758bdba95cd2c38c6ba2cfd1bb289378d983d40723c3c525331dce0ed30418ab990 - languageName: node - linkType: hard - -"@gnosis.pm/zodiac@npm:^3.3.2": - version: 3.3.2 - resolution: "@gnosis.pm/zodiac@npm:3.3.2" - dependencies: - "@gnosis.pm/mock-contract": ^4.0.0 - "@gnosis.pm/safe-contracts": 1.3.0 - "@openzeppelin/contracts": ^4.8.1 - "@openzeppelin/contracts-upgradeable": ^4.8.1 - ethers: ^5.7.1 - checksum: 796258749d673b552db0cf231ba3968acd2dfe6dfce759f36e91503c6cf29d26bd87c31f883f1ffc6879272ec041c8a7413756364615072339df562c4f90ac31 - languageName: node - linkType: hard - "@gnosis/hashi@workspace:.": version: 0.0.0-use.local resolution: "@gnosis/hashi@workspace:." @@ -998,7 +969,6 @@ __metadata: "@ethersproject/bignumber": ^5.7.0 "@ethersproject/bytes": ^5.7.0 "@ethersproject/providers": ^5.7.2 - "@gnosis.pm/zodiac": ^3.3.2 "@hyperlane-xyz/core": ^3.1.10 "@nomicfoundation/hardhat-chai-matchers": ^1.0.4 "@nomicfoundation/hardhat-network-helpers": ^1.0.8 @@ -1007,6 +977,7 @@ __metadata: "@nomiclabs/hardhat-etherscan": ^3.1.2 "@openzeppelin/contracts-upgradeable": ^4.8.1 "@polytope-labs/solidity-merkle-trees": ^0.2.1 + "@routerprotocol/evm-gateway-contracts": ^1.1.13 "@trivago/prettier-plugin-sort-imports": ^4.0.0 "@typechain/ethers-v5": ^10.1.1 "@typechain/hardhat": ^6.1.4 @@ -1622,6 +1593,13 @@ __metadata: languageName: node linkType: hard +"@openzeppelin/contracts-upgradeable@npm:^4.7.3": + version: 4.9.6 + resolution: "@openzeppelin/contracts-upgradeable@npm:4.9.6" + checksum: 481075e7222cab025ae55304263fca69a2d04305521957bc16d2aece9fa2b86b6914711724822493e3d04df7e793469cd0bcb1e09f0ddd10cb4e360ac7eed12a + languageName: node + linkType: hard + "@openzeppelin/contracts-upgradeable@npm:^4.8.1": version: 4.8.2 resolution: "@openzeppelin/contracts-upgradeable@npm:4.8.2" @@ -1643,10 +1621,10 @@ __metadata: languageName: node linkType: hard -"@openzeppelin/contracts@npm:^4.8.1": - version: 4.8.3 - resolution: "@openzeppelin/contracts@npm:4.8.3" - checksum: aea130d38d46840c5cbe3adbaa9a7ac645e4bd66ad3f3baf2fa78588c408d1a686170b3408c9e2e5e05530fba22ecdc00d7efb6b27852a8b29f91accbc0af255 +"@openzeppelin/contracts@npm:^4.4.1": + version: 4.9.6 + resolution: "@openzeppelin/contracts@npm:4.9.6" + checksum: 274b6e968268294f12d5ca4f0278f6e6357792c8bb4d76664f83dbdc325f780541538a127e6a6e97e4f018088b42f65952014dec9c745c0fa25081f43ef9c4bf languageName: node linkType: hard @@ -1671,6 +1649,16 @@ __metadata: languageName: node linkType: hard +"@routerprotocol/evm-gateway-contracts@npm:^1.1.13": + version: 1.1.13 + resolution: "@routerprotocol/evm-gateway-contracts@npm:1.1.13" + dependencies: + "@openzeppelin/contracts": ^4.4.1 + "@openzeppelin/contracts-upgradeable": ^4.7.3 + checksum: 08898738eaf06d330a96ada9c1760ddc5ee8e3f7871eca425d1ce66a3c1496766d1509f40aec203b6f1dd6f077696fdf5c7e489ba3291f0377261e556d4999cc + languageName: node + linkType: hard + "@scure/base@npm:~1.1.0": version: 1.1.1 resolution: "@scure/base@npm:1.1.1" From d2ab149037e1154f894de946c4c8c75aa7a0ac0f Mon Sep 17 00:00:00 2001 From: Shivam Agrawal Date: Tue, 26 Mar 2024 12:39:43 +0530 Subject: [PATCH 153/297] replaced msg.value check with balance of contract for Router Adapter --- .../evm/contracts/adapters/Router/RouterReporter.sol | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/evm/contracts/adapters/Router/RouterReporter.sol b/packages/evm/contracts/adapters/Router/RouterReporter.sol index 2cc1a68c..0a47779a 100644 --- a/packages/evm/contracts/adapters/Router/RouterReporter.sol +++ b/packages/evm/contracts/adapters/Router/RouterReporter.sol @@ -15,6 +15,10 @@ interface IRouterGateway is IGateway { interface IRouterGasStation { function payFee(string memory destChainId, uint256 destGasLimit) external payable returns (uint256); + function getNativeFees( + string memory destChainId, + uint256 destGasLimit + ) external view returns (uint256) ; } contract RouterReporter is Reporter, Ownable { @@ -93,9 +97,11 @@ contract RouterReporter is Reporter, Ownable { bytes memory requestMetadata = getRequestMetadata(); uint256 iSendFee = ROUTER_GATEWAY.iSendDefaultFee(); - if (msg.value < iSendFee) revert InsufficientFeePassed(); + uint256 crosstalkFee = ROUTER_GAS_STATION.getNativeFees(targetChainIdStr, 200_000); + + if (address(this).balance < (iSendFee + crosstalkFee)) revert InsufficientFeePassed(); - ROUTER_GAS_STATION.payFee{ value: msg.value }(targetChainIdStr, 200_000); + ROUTER_GAS_STATION.payFee{ value: crosstalkFee }(targetChainIdStr, 200_000); ROUTER_GATEWAY.iSend{ value: iSendFee }( CURRENT_GATEWAY_VERSION, @@ -108,4 +114,6 @@ contract RouterReporter is Reporter, Ownable { return bytes32(0); } + + receive() external payable {} } From 3828575b62e3f98eccdf9b3b4ad9713f6054a954 Mon Sep 17 00:00:00 2001 From: Shivam Agrawal Date: Tue, 26 Mar 2024 13:16:03 +0530 Subject: [PATCH 154/297] added pure decorator to iAck function --- packages/evm/contracts/adapters/Router/RouterAdapter.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/evm/contracts/adapters/Router/RouterAdapter.sol b/packages/evm/contracts/adapters/Router/RouterAdapter.sol index 2c042040..1c6afb28 100644 --- a/packages/evm/contracts/adapters/Router/RouterAdapter.sol +++ b/packages/evm/contracts/adapters/Router/RouterAdapter.sol @@ -54,7 +54,7 @@ contract RouterAdapter is BlockHashAdapter, Ownable, IDapp { return hex""; } - function iAck(uint256, bool, bytes memory) external override { + function iAck(uint256, bool, bytes memory) external pure override { revert RouterIAckNotSupported(); } } From f1a9fdb2998c7024268e9c69777f4dc43d2f775e Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 26 Mar 2024 11:21:11 +0100 Subject: [PATCH 155/297] chore(task): rm not used task --- packages/evm/tasks/deploy/index.ts | 1 - packages/evm/tasks/deploy/replay.ts | 110 ---------------------------- 2 files changed, 111 deletions(-) delete mode 100644 packages/evm/tasks/deploy/replay.ts diff --git a/packages/evm/tasks/deploy/index.ts b/packages/evm/tasks/deploy/index.ts index 00ed04e3..befa024b 100644 --- a/packages/evm/tasks/deploy/index.ts +++ b/packages/evm/tasks/deploy/index.ts @@ -3,7 +3,6 @@ import { HardhatRuntimeEnvironment } from "hardhat/types" import "./adapters" import "./hashi" -import "./replay" // eslint-disable-next-line @typescript-eslint/no-explicit-any export const verify = async (hre: HardhatRuntimeEnvironment, contract: Contract, constructorArguments: any = []) => { diff --git a/packages/evm/tasks/deploy/replay.ts b/packages/evm/tasks/deploy/replay.ts deleted file mode 100644 index f9de100c..00000000 --- a/packages/evm/tasks/deploy/replay.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { deployMastercopy } from "@gnosis.pm/zodiac" -import { task } from "hardhat/config" -import { HardhatRuntimeEnvironment } from "hardhat/types" - -import type { Hashi__factory } from "../../types/factories/contracts/Hashi__factory" -import type { Yaho__factory } from "../../types/factories/contracts/Yaho__factory" -import type { Yaru__factory } from "../../types/factories/contracts/Yaru__factory" -import type { GiriGiriBashi__factory } from "../../types/factories/contracts/ownable/GiriGiriBashi__factory" -import type { ShoyuBashi__factory } from "../../types/factories/contracts/ownable/ShoyuBashi__factory" -import type { HeaderStorage__factory } from "../../types/factories/contracts/utils/HeaderStorage__factory" - -const ADDRESS_ONE = "0x0000000000000000000000000000000000000001" - -const logDeployError = function (error: any) { - console.log(` \x1B[31m✘ Deployment failed:\x1B[0m ${error?.reason || error}`) -} - -export const deploy = async ({ networks }: { networks: string[] }, hre: HardhatRuntimeEnvironment) => { - const networkList = networks ? networks : Object.keys(hre.config.networks) - const [deployer] = await hre.ethers.getSigners() - console.log("-----------------") - console.log("Deployer address: ", deployer.address) - console.log("-----------------") - - for (const network of networkList) { - console.log(`\n\x1B[4m\x1B[1m${network.toUpperCase()}\x1B[0m`) - - try { - hre.changeNetwork(network) - const [deployer] = await hre.ethers.getSigners() - const signer = hre.ethers.provider.getSigner(deployer.address) - const balance = await deployer.getBalance() - if (balance.eq(0)) throw new Error("Deployer has zero balance") - - // deploy hashi - try { - console.log(`\x1B[4mHashi\x1B[0m`) - const hashiFactory: Hashi__factory = await hre.ethers.getContractFactory("Hashi") - await deployMastercopy(signer, hashiFactory, [], hre.ethers.constants.HashZero) - } catch (error) { - logDeployError(error) - } - - // deploy yaho - try { - console.log(`\x1B[4mYaho\x1B[0m`) - const yahoFactory: Yaho__factory = await hre.ethers.getContractFactory("Yaho") - await deployMastercopy(signer, yahoFactory, [], hre.ethers.constants.HashZero) - } catch (error) { - logDeployError(error) - } - - // deploy yaru - try { - console.log(`\x1B[4mYaru\x1B[0m`) - const yaruFactory: Yaru__factory = await hre.ethers.getContractFactory("Yaru") - await deployMastercopy(signer, yaruFactory, [ADDRESS_ONE, ADDRESS_ONE, 1], hre.ethers.constants.HashZero) - } catch (error) { - logDeployError(error) - } - - // deploy shoyubashi - try { - console.log(`\x1B[4mShoyuBashi\x1B[0m`) - const shoyuBashiFactory: ShoyuBashi__factory = ( - await hre.ethers.getContractFactory("ShoyuBashi") - ) - await deployMastercopy(signer, shoyuBashiFactory, [ADDRESS_ONE, ADDRESS_ONE], hre.ethers.constants.HashZero) - } catch (error) { - logDeployError(error) - } - - // deploy girigiribashi - try { - console.log(`\x1B[4mGiriGiriBashi\x1B[0m`) - const giriGiriBashiFactory: GiriGiriBashi__factory = ( - await hre.ethers.getContractFactory("GiriGiriBashi") - ) - await deployMastercopy( - signer, - giriGiriBashiFactory, - [ADDRESS_ONE, ADDRESS_ONE, ADDRESS_ONE], - hre.ethers.constants.HashZero, - ) - } catch (error) { - logDeployError(error) - } - - // deploy header storage - try { - console.log(`\x1B[4mHeader Storage\x1B[0m`) - const headerStorageFactory: HeaderStorage__factory = ( - await hre.ethers.getContractFactory("HeaderStorage") - ) - await deployMastercopy(signer, headerStorageFactory, [], hre.ethers.constants.HashZero) - } catch (error) { - logDeployError(error) - } - } catch (error: any) { - console.log(` \x1B[31m✘ Network skipped because:\x1B[0m ${error?.reason || error}`) - } - } -} - -task( - "deploy-replay", - "Replay deployment of all mastercopies on network names provided as arguments. If no networks names are provided, the task will iterate through all networks defined in hardhat.config.ts", -) - .addOptionalVariadicPositionalParam("networks") - .setAction(deploy) From b90c78781f7753123a8487daf2a38d7952e0d769 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 9 Apr 2024 08:57:50 +0200 Subject: [PATCH 156/297] chore(hardhat.config.js): rm mnemonic and adds pk --- packages/evm/hardhat.config.ts | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/packages/evm/hardhat.config.ts b/packages/evm/hardhat.config.ts index dad15240..be5869d6 100644 --- a/packages/evm/hardhat.config.ts +++ b/packages/evm/hardhat.config.ts @@ -13,9 +13,9 @@ const dotenvConfigPath: string = process.env.DOTENV_CONFIG_PATH || "./.env" dotenvConfig({ path: resolve(__dirname, dotenvConfigPath) }) // Ensure that we have all the environment variables we need. -const mnemonic: string | undefined = process.env.MNEMONIC -if (!mnemonic) { - throw new Error("Please set your MNEMONIC in a .env file") +const privateKey: string | undefined = process.env.PRIVATE_KEY +if (!privateKey) { + throw new Error("Please set your PRIVATE_KEY in a .env file") } const infuraApiKey: string | undefined = process.env.INFURA_API_KEY @@ -63,11 +63,7 @@ function getChainConfig(chain: keyof typeof chainIds): NetworkUserConfig { } return { - accounts: { - count: 10, - mnemonic, - path: "m/44'/60'/0'/0", - }, + accounts: [privateKey as string], chainId: chainIds[chain], url: jsonRpcUrl, } From 5618f8fb5d6f86f1b358c2f36bf38a53e6562748 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 9 Apr 2024 09:01:46 +0200 Subject: [PATCH 157/297] feat(contracts): mv MockAdapter and MockReporter under adapters --- .../evm/contracts/{test => adapters/Mock}/MockAdapter.sol | 4 ++-- .../evm/contracts/{test => adapters/Mock}/MockReporter.sol | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) rename packages/evm/contracts/{test => adapters/Mock}/MockAdapter.sol (78%) rename packages/evm/contracts/{test => adapters/Mock}/MockReporter.sol (74%) diff --git a/packages/evm/contracts/test/MockAdapter.sol b/packages/evm/contracts/adapters/Mock/MockAdapter.sol similarity index 78% rename from packages/evm/contracts/test/MockAdapter.sol rename to packages/evm/contracts/adapters/Mock/MockAdapter.sol index 8e318dac..c8440dfb 100644 --- a/packages/evm/contracts/test/MockAdapter.sol +++ b/packages/evm/contracts/adapters/Mock/MockAdapter.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.20; -import { Adapter } from "../adapters/Adapter.sol"; -import { BlockHashAdapter } from "../adapters/BlockHashAdapter.sol"; +import { Adapter } from "../Adapter.sol"; +import { BlockHashAdapter } from "../BlockHashAdapter.sol"; contract MockAdapter is Adapter, BlockHashAdapter { error LengthMismatch(); diff --git a/packages/evm/contracts/test/MockReporter.sol b/packages/evm/contracts/adapters/Mock/MockReporter.sol similarity index 74% rename from packages/evm/contracts/test/MockReporter.sol rename to packages/evm/contracts/adapters/Mock/MockReporter.sol index 275d4d3f..7bdcb7db 100644 --- a/packages/evm/contracts/test/MockReporter.sol +++ b/packages/evm/contracts/adapters/Mock/MockReporter.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.20; -import { Reporter } from "../adapters/Reporter.sol"; -import { IAdapter } from "../interfaces/IAdapter.sol"; +import { Reporter } from "../Reporter.sol"; +import { IAdapter } from "../../interfaces/IAdapter.sol"; contract MockReporter is Reporter { constructor(address headerStorage, address yaho) Reporter(headerStorage, yaho) {} From ec49d9a83d8dc6fe6caee7aee4b98c7352dc5f70 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Mon, 22 Apr 2024 10:15:15 +0800 Subject: [PATCH 158/297] doc: add audit report --- .../contracts/docs/audits/g0-HashiMar2024.pdf | Bin 0 -> 338570 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 packages/evm/contracts/docs/audits/g0-HashiMar2024.pdf diff --git a/packages/evm/contracts/docs/audits/g0-HashiMar2024.pdf b/packages/evm/contracts/docs/audits/g0-HashiMar2024.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1e1af35b17d64a41ed8ab5cac5b008ee0761b47c GIT binary patch literal 338570 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

s5UhrF0EB;`;RM=t%={~0x>&h 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 z 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%0AcR`tQqGotpBJTz@p>4 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

yL_KX~2y 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 ueUD@)w7`?_d@)k-9gVVV$a9Wn^ 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 KE>(Rs;{OBuZV|u$ literal 0 HcmV?d00001 From 9965392fa2ea22a8895dd8a946737f90553f00f3 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Mon, 22 Apr 2024 15:11:38 +0800 Subject: [PATCH 159/297] chore: move audit report --- .../contracts/{docs => }/audits/HashiMay2023.pdf | Bin .../contracts/{docs => }/audits/g0-HashiMar2024.pdf | Bin 2 files changed, 0 insertions(+), 0 deletions(-) rename packages/evm/contracts/{docs => }/audits/HashiMay2023.pdf (100%) rename packages/evm/contracts/{docs => }/audits/g0-HashiMar2024.pdf (100%) diff --git a/packages/evm/contracts/docs/audits/HashiMay2023.pdf b/packages/evm/contracts/audits/HashiMay2023.pdf similarity index 100% rename from packages/evm/contracts/docs/audits/HashiMay2023.pdf rename to packages/evm/contracts/audits/HashiMay2023.pdf diff --git a/packages/evm/contracts/docs/audits/g0-HashiMar2024.pdf b/packages/evm/contracts/audits/g0-HashiMar2024.pdf similarity index 100% rename from packages/evm/contracts/docs/audits/g0-HashiMar2024.pdf rename to packages/evm/contracts/audits/g0-HashiMar2024.pdf From b5b66eeef138245bd597db5ad65f001f7ca1e8e6 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 22 Apr 2024 14:52:07 +0200 Subject: [PATCH 160/297] chore(audits): <- mv them into the root of the repo --- .../contracts/audits => audits}/HashiMay2023.pdf | Bin .../contracts/audits => audits}/g0-HashiMar2024.pdf | Bin 2 files changed, 0 insertions(+), 0 deletions(-) rename {packages/evm/contracts/audits => audits}/HashiMay2023.pdf (100%) rename {packages/evm/contracts/audits => audits}/g0-HashiMar2024.pdf (100%) diff --git a/packages/evm/contracts/audits/HashiMay2023.pdf b/audits/HashiMay2023.pdf similarity index 100% rename from packages/evm/contracts/audits/HashiMay2023.pdf rename to audits/HashiMay2023.pdf diff --git a/packages/evm/contracts/audits/g0-HashiMar2024.pdf b/audits/g0-HashiMar2024.pdf similarity index 100% rename from packages/evm/contracts/audits/g0-HashiMar2024.pdf rename to audits/g0-HashiMar2024.pdf From e2f138c5f2afed1ac4c63402c9afc8bfe1e9aedc Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 23 Apr 2024 06:55:43 +0200 Subject: [PATCH 161/297] refactor(contracts & tasks): formats --- .../evm/contracts/adapters/Router/RouterReporter.sol | 8 +++----- packages/evm/tasks/deploy/adapters/index.ts | 2 +- packages/evm/tasks/deploy/adapters/router.ts | 12 +++++------- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/packages/evm/contracts/adapters/Router/RouterReporter.sol b/packages/evm/contracts/adapters/Router/RouterReporter.sol index 0a47779a..bb0199d3 100644 --- a/packages/evm/contracts/adapters/Router/RouterReporter.sol +++ b/packages/evm/contracts/adapters/Router/RouterReporter.sol @@ -15,10 +15,8 @@ interface IRouterGateway is IGateway { interface IRouterGasStation { function payFee(string memory destChainId, uint256 destGasLimit) external payable returns (uint256); - function getNativeFees( - string memory destChainId, - uint256 destGasLimit - ) external view returns (uint256) ; + + function getNativeFees(string memory destChainId, uint256 destGasLimit) external view returns (uint256); } contract RouterReporter is Reporter, Ownable { @@ -98,7 +96,7 @@ contract RouterReporter is Reporter, Ownable { uint256 iSendFee = ROUTER_GATEWAY.iSendDefaultFee(); uint256 crosstalkFee = ROUTER_GAS_STATION.getNativeFees(targetChainIdStr, 200_000); - + if (address(this).balance < (iSendFee + crosstalkFee)) revert InsufficientFeePassed(); ROUTER_GAS_STATION.payFee{ value: crosstalkFee }(targetChainIdStr, 200_000); diff --git a/packages/evm/tasks/deploy/adapters/index.ts b/packages/evm/tasks/deploy/adapters/index.ts index 6f0bad60..c6130790 100644 --- a/packages/evm/tasks/deploy/adapters/index.ts +++ b/packages/evm/tasks/deploy/adapters/index.ts @@ -10,8 +10,8 @@ import "./hyperlane" import "./layerzero" import "./optimism" import "./pnetwork" +import "./router" import "./sygma" import "./telepathy" import "./wormhole" import "./zetachain" -import "./router" diff --git a/packages/evm/tasks/deploy/adapters/router.ts b/packages/evm/tasks/deploy/adapters/router.ts index 22a05c3a..85b45857 100644 --- a/packages/evm/tasks/deploy/adapters/router.ts +++ b/packages/evm/tasks/deploy/adapters/router.ts @@ -1,9 +1,10 @@ import type { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers" import { task, types } from "hardhat/config" import type { TaskArguments } from "hardhat/types" + import type { RouterAdapter } from "../../../types/contracts/adapters/Router/RouterAdapter.sol/RouterAdapter" -import type { RouterAdapter__factory } from "../../../types/factories/contracts/adapters/Router/RouterAdapter.sol/RouterAdapter__factory" import type { RouterReporter } from "../../../types/contracts/adapters/Router/RouterReporter.sol/RouterReporter" +import type { RouterAdapter__factory } from "../../../types/factories/contracts/adapters/Router/RouterAdapter.sol/RouterAdapter__factory" import type { RouterReporter__factory } from "../../../types/factories/contracts/adapters/Router/RouterReporter.sol/RouterReporter__factory" import { verify } from "../index" @@ -16,9 +17,7 @@ task("deploy:adapter:RouterAdapter") const routerAdapterFactory: RouterAdapter__factory = ( await hre.ethers.getContractFactory("RouterAdapter") ) - const constructorArguments = [ - taskArguments.routerGateway, - ] as const + const constructorArguments = [taskArguments.routerGateway] as const const routerAdapter: RouterAdapter = ( await routerAdapterFactory.connect(signers[0]).deploy(...constructorArguments) ) @@ -28,12 +27,12 @@ task("deploy:adapter:RouterAdapter") }) task("deploy:adapter:RouterReporter") -.addParam("headerStorage", "address of the header storage contract") + .addParam("headerStorage", "address of the header storage contract") .addParam("yaho", "address of the Yaho contract", undefined, types.string) .addParam("routerGateway", "address of the Router gateway contract") .addParam("routerGasStation", "address of the Router gas station contract") .addParam( - "routerFeePayer", + "routerFeePayer", "address of the fee payer for this contract (https://docs.routerprotocol.com/develop/message-transfer-via-crosstalk/evm-guides/iDapp-functions/setDappMetadata)", ) .addFlag("verify", "whether to verify the contract on Etherscan") @@ -57,4 +56,3 @@ task("deploy:adapter:RouterReporter") console.log("RouterReporter deployed to:", routerReporter.address) if (taskArguments.verify) await verify(hre, routerReporter, constructorArguments) }) - From 1424b73dcd53401f860609b912bc3017e8d5091c Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 23 Apr 2024 17:44:00 +0200 Subject: [PATCH 162/297] feat(contracts): adds verifyAndStoreDispatchedMessage within DendrETHAdapter --- .../adapters/DendrETH/DendrETHAdapter.sol | 150 +++++++++++------- 1 file changed, 97 insertions(+), 53 deletions(-) diff --git a/packages/evm/contracts/adapters/DendrETH/DendrETHAdapter.sol b/packages/evm/contracts/adapters/DendrETH/DendrETHAdapter.sol index f4975477..86a28b7e 100644 --- a/packages/evm/contracts/adapters/DendrETH/DendrETHAdapter.sol +++ b/packages/evm/contracts/adapters/DendrETH/DendrETHAdapter.sol @@ -3,93 +3,137 @@ pragma solidity ^0.8.20; import { ILightClient, LightClientUpdate } from "./interfaces/IDendrETH.sol"; import { SSZ } from "../Telepathy/libraries/SimpleSerialize.sol"; +import { Merkle } from "../Electron/lib/Merkle.sol"; +import { Receipt } from "../Electron/lib/Receipt.sol"; import { BlockHashAdapter } from "../BlockHashAdapter.sol"; contract DendrETHAdapter is BlockHashAdapter { + bytes32 internal constant MESSAGE_DISPATCHED_EVENT_SIG = keccak256("TODO"); + + address public immutable DENDRETH_ADDRESS; + address public immutable SOURCE_YAHO; + uint256 public immutable SOURCE_CHAIN_ID; + error InvalidUpdate(); error BlockHeaderNotAvailable(uint256 slot); error InvalidBlockNumberProof(); error InvalidBlockHashProof(); - - address public immutable dendrETHAddress; - - constructor(address _dendrETHAddress) { - dendrETHAddress = _dendrETHAddress; + error InvalidReceiptsRoot(); + error ErrorParseReceipt(); + error InvalidEventSignature(); + error InvalidEventSource(); + + constructor(address dendrETHAddress, uint256 sourceChainId, address sourceYaho) { + DENDRETH_ADDRESS = dendrETHAddress; + SOURCE_CHAIN_ID = sourceChainId; + SOURCE_YAHO = sourceYaho; } /// @notice Stores the block header for a given block only if it exists // in the DendrETH Light Client for the chainId. function storeBlockHeader( - uint32 _chainId, - uint64 _slot, - uint256 _blockNumber, - bytes32[] calldata _blockNumberProof, - bytes32 _blockHash, - bytes32[] calldata _blockHashProof + uint64 slot, + uint256 blockNumber, + bytes32[] calldata blockNumberProof, + bytes32 blockHash, + bytes32[] calldata blockHashProof ) external { - ILightClient lightClient = ILightClient(dendrETHAddress); - - uint256 currentIndex = lightClient.currentIndex(); - uint256 i = currentIndex; - bool found = false; - - do { - if (_slot == lightClient.optimisticSlots(i)) { - found = true; - break; - } - if (i == 0) { - i = 32; - } - i--; - } while (i != currentIndex); - - if (!found) { - revert BlockHeaderNotAvailable(_slot); - } - - bytes32 blockHeaderRoot = lightClient.optimisticHeaders(i); - - if (!SSZ.verifyBlockNumber(_blockNumber, _blockNumberProof, blockHeaderRoot)) { + ILightClient lightClient = ILightClient(DENDRETH_ADDRESS); + bytes32 blockHeaderRoot = lightClient.optimisticHeaders(_getIndex(slot, lightClient)); + if (!SSZ.verifyBlockNumber(blockNumber, blockNumberProof, blockHeaderRoot)) { revert InvalidBlockNumberProof(); } - - if (!SSZ.verifyBlockHash(_blockHash, _blockHashProof, blockHeaderRoot)) { + if (!SSZ.verifyBlockHash(blockHash, blockHashProof, blockHeaderRoot)) { revert InvalidBlockHashProof(); } - _storeHash(uint256(_chainId), _blockNumber, _blockHash); + _storeHash(SOURCE_CHAIN_ID, blockNumber, blockHash); } /// @notice Updates DendrETH Light client and stores the given block // for the update function storeBlockHeader( - uint32 _chainId, - uint64 _slot, - uint256 _blockNumber, - bytes32[] calldata _blockNumberProof, - bytes32 _blockHash, - bytes32[] calldata _blockHashProof, + uint64 slot, + uint256 blockNumber, + bytes32[] calldata blockNumberProof, + bytes32 blockHash, + bytes32[] calldata blockHashProof, LightClientUpdate calldata update ) external { - ILightClient lightClient = ILightClient(dendrETHAddress); - + ILightClient lightClient = ILightClient(DENDRETH_ADDRESS); lightClient.light_client_update(update); - - if (lightClient.optimisticHeaderSlot() != _slot) { + if (lightClient.optimisticHeaderSlot() != slot) { revert InvalidUpdate(); } bytes32 blockHeaderRoot = lightClient.optimisticHeaderRoot(); - - if (!SSZ.verifyBlockNumber(_blockNumber, _blockNumberProof, blockHeaderRoot)) { + if (!SSZ.verifyBlockNumber(blockNumber, blockNumberProof, blockHeaderRoot)) { revert InvalidBlockNumberProof(); } - - if (!SSZ.verifyBlockHash(_blockHash, _blockHashProof, blockHeaderRoot)) { + if (!SSZ.verifyBlockHash(blockHash, blockHashProof, blockHeaderRoot)) { revert InvalidBlockHashProof(); } - _storeHash(uint256(_chainId), _blockNumber, _blockHash); + _storeHash(SOURCE_CHAIN_ID, blockNumber, blockHash); + } + + function verifyAndStoreDispatchedMessage( + uint64 srcSlot, + uint64 txSlot, + bytes32[] memory receiptsRootProof, + bytes32 receiptsRoot, + bytes[] memory receiptProof, + bytes memory txIndexRLPEncoded, + uint256 logIndex + ) external { + ILightClient lightClient = ILightClient(DENDRETH_ADDRESS); + bytes32 blockHeaderRoot = lightClient.optimisticHeaders(_getIndex(srcSlot, lightClient)); + + bool isValidReceiptsRoot = Merkle.verifyReceiptsRoot( + receiptsRootProof, + receiptsRoot, + srcSlot, + txSlot, + blockHeaderRoot + ); + if (!isValidReceiptsRoot) revert InvalidReceiptsRoot(); + + Receipt.ParsedReceipt memory parsedReceipt = Receipt.parseReceipt( + receiptsRoot, + receiptProof, + txIndexRLPEncoded, + logIndex + ); + + if (!parsedReceipt.isValid) revert ErrorParseReceipt(); + if (bytes32(parsedReceipt.topics[0]) != MESSAGE_DISPATCHED_EVENT_SIG) revert InvalidEventSignature(); + if (parsedReceipt.eventSource != SOURCE_YAHO) revert InvalidEventSource(); + + uint256 messageId = uint256(parsedReceipt.topics[1]); + bytes32 messageHash = keccak256(parsedReceipt.data); + + _storeHash(SOURCE_CHAIN_ID, messageId, messageHash); + } + + function _getIndex(uint64 slot, ILightClient lightClient) internal view returns (uint256) { + uint256 currentIndex = lightClient.currentIndex(); + uint256 i = currentIndex; + bool found = false; + + do { + if (slot == lightClient.optimisticSlots(i)) { + found = true; + break; + } + if (i == 0) { + i = 32; + } + i--; + } while (i != currentIndex); + + if (!found) { + revert BlockHeaderNotAvailable(slot); + } + return i; } } From 6f0cf5760342bd5a47d4e52f078d46e46a35cf37 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 23 Apr 2024 18:34:06 +0200 Subject: [PATCH 163/297] refactor(contracts): adds MESSAGE_DISPATCHED_EVENT_SIG real value --- packages/evm/contracts/adapters/DendrETH/DendrETHAdapter.sol | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/evm/contracts/adapters/DendrETH/DendrETHAdapter.sol b/packages/evm/contracts/adapters/DendrETH/DendrETHAdapter.sol index 86a28b7e..e0f91c4f 100644 --- a/packages/evm/contracts/adapters/DendrETH/DendrETHAdapter.sol +++ b/packages/evm/contracts/adapters/DendrETH/DendrETHAdapter.sol @@ -8,7 +8,8 @@ import { Receipt } from "../Electron/lib/Receipt.sol"; import { BlockHashAdapter } from "../BlockHashAdapter.sol"; contract DendrETHAdapter is BlockHashAdapter { - bytes32 internal constant MESSAGE_DISPATCHED_EVENT_SIG = keccak256("TODO"); + bytes32 internal constant MESSAGE_DISPATCHED_EVENT_SIG = + 0x218247aabc759e65b5bb92ccc074f9d62cd187259f2a0984c3c9cf91f67ff7cf; // keccak256("MessageDispatched(uint256,(uint256,uint256,uint256,address,address,bytes,address[],address[]))"); // keccak256("MessageDispatched(uint256,(uint256,uint256,uint256,address,address,bytes,address[],address[]))") address public immutable DENDRETH_ADDRESS; address public immutable SOURCE_YAHO; From 6833c23d6049ad0d6cf2ae512fa9ba128c41c8ab Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 24 Apr 2024 13:34:00 +0200 Subject: [PATCH 164/297] chore(hardhat.config.js): adds support to chiado for verifying contracts --- packages/evm/hardhat.config.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/evm/hardhat.config.ts b/packages/evm/hardhat.config.ts index be5869d6..18fe6036 100644 --- a/packages/evm/hardhat.config.ts +++ b/packages/evm/hardhat.config.ts @@ -76,6 +76,7 @@ const config: HardhatUserConfig = { arbitrumOne: process.env.ARBISCAN_API_KEY || "", avalanche: process.env.SNOWTRACE_API_KEY || "", bsc: process.env.BSCSCAN_API_KEY || "", + chiado: process.env.CHIADO_BLOCKSCOUT_API_KEY || "", gnosis: process.env.GNOSISSCAN_API_KEY || "", goerli: process.env.ETHERSCAN_API_KEY || "", mainnet: process.env.ETHERSCAN_API_KEY || "", @@ -84,6 +85,16 @@ const config: HardhatUserConfig = { polygonMumbai: process.env.POLYGONSCAN_API_KEY || "", sepolia: process.env.ETHERSCAN_API_KEY || "", }, + customChains: [ + { + network: "chiado", + chainId: 10200, + urls: { + apiURL: "https://gnosis-chiado.blockscout.com/api", + browserURL: "https://gnosis-chiado.blockscout.com/" + } + } + ] }, gasReporter: { currency: "USD", From 0dfcef58393edee50333842b3ba59a375954cbb2 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 29 Apr 2024 18:59:52 +0200 Subject: [PATCH 165/297] chore(global): changes workspaces settings --- .husky/commit-msg | 2 +- .husky/pre-commit | 2 +- .yarn/releases/yarn-3.2.1.cjs | 786 -- .yarnrc.yml | 2 - package.json | 17 +- .../adapters/Electron/ElectronAdapter.sol | 2 +- .../adapters/Router/RouterReporter.sol | 1 - packages/evm/package.json | 14 +- packages/evm/yarn.lock | 10541 ---------------- ...ope-labs+solidity-merkle-trees+0.2.1.patch | 13 + yarn.lock | 9229 +++++++++++--- 11 files changed, 7345 insertions(+), 13264 deletions(-) delete mode 100755 .yarn/releases/yarn-3.2.1.cjs delete mode 100644 packages/evm/yarn.lock create mode 100644 patches/@polytope-labs+solidity-merkle-trees+0.2.1.patch diff --git a/.husky/commit-msg b/.husky/commit-msg index 2bf64475..5426a932 100755 --- a/.husky/commit-msg +++ b/.husky/commit-msg @@ -1,4 +1,4 @@ #!/bin/sh . "$(dirname "$0")/_/husky.sh" -yarn dlx commitlint --edit $1 +npx commitlint --edit $1 diff --git a/.husky/pre-commit b/.husky/pre-commit index a3c12e26..36af2198 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1,4 @@ #!/bin/sh . "$(dirname "$0")/_/husky.sh" -yarn dlx lint-staged +npx lint-staged diff --git a/.yarn/releases/yarn-3.2.1.cjs b/.yarn/releases/yarn-3.2.1.cjs deleted file mode 100755 index b3cadff6..00000000 --- a/.yarn/releases/yarn-3.2.1.cjs +++ /dev/null @@ -1,786 +0,0 @@ -#!/usr/bin/env node -/* eslint-disable */ -//prettier-ignore -(()=>{var ofe=Object.create,Kh=Object.defineProperty,afe=Object.defineProperties,Afe=Object.getOwnPropertyDescriptor,lfe=Object.getOwnPropertyDescriptors,cfe=Object.getOwnPropertyNames,ME=Object.getOwnPropertySymbols,ufe=Object.getPrototypeOf,gQ=Object.prototype.hasOwnProperty,nM=Object.prototype.propertyIsEnumerable;var sM=(t,e,r)=>e in t?Kh(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,N=(t,e)=>{for(var r in e||(e={}))gQ.call(e,r)&&sM(t,r,e[r]);if(ME)for(var r of ME(e))nM.call(e,r)&&sM(t,r,e[r]);return t},ie=(t,e)=>afe(t,lfe(e)),gfe=t=>Kh(t,"__esModule",{value:!0});var Tr=(t,e)=>{var r={};for(var i in t)gQ.call(t,i)&&e.indexOf(i)<0&&(r[i]=t[i]);if(t!=null&&ME)for(var i of ME(t))e.indexOf(i)<0&&nM.call(t,i)&&(r[i]=t[i]);return r},ffe=(t,e)=>()=>(t&&(e=t(t=0)),e),w=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),ft=(t,e)=>{for(var r in e)Kh(t,r,{get:e[r],enumerable:!0})},hfe=(t,e,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of cfe(e))!gQ.call(t,i)&&i!=="default"&&Kh(t,i,{get:()=>e[i],enumerable:!(r=Afe(e,i))||r.enumerable});return t},ge=t=>hfe(gfe(Kh(t!=null?ofe(ufe(t)):{},"default",t&&t.__esModule&&"default"in t?{get:()=>t.default,enumerable:!0}:{value:t,enumerable:!0})),t);var DM=w((ZXe,SM)=>{SM.exports=kM;kM.sync=Dfe;var xM=require("fs");function Rfe(t,e){var r=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT;if(!r||(r=r.split(";"),r.indexOf("")!==-1))return!0;for(var i=0;i{RM.exports=FM;FM.sync=Ffe;var NM=require("fs");function FM(t,e,r){NM.stat(t,function(i,n){r(i,i?!1:LM(n,e))})}function Ffe(t,e){return LM(NM.statSync(t),e)}function LM(t,e){return t.isFile()&&Nfe(t,e)}function Nfe(t,e){var r=t.mode,i=t.uid,n=t.gid,s=e.uid!==void 0?e.uid:process.getuid&&process.getuid(),o=e.gid!==void 0?e.gid:process.getgid&&process.getgid(),a=parseInt("100",8),l=parseInt("010",8),c=parseInt("001",8),u=a|l,g=r&c||r&l&&n===o||r&a&&i===s||r&u&&s===0;return g}});var MM=w((tZe,OM)=>{var eZe=require("fs"),ZE;process.platform==="win32"||global.TESTING_WINDOWS?ZE=DM():ZE=TM();OM.exports=xQ;xQ.sync=Lfe;function xQ(t,e,r){if(typeof e=="function"&&(r=e,e={}),!r){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(i,n){xQ(t,e||{},function(s,o){s?n(s):i(o)})})}ZE(t,e||{},function(i,n){i&&(i.code==="EACCES"||e&&e.ignoreErrors)&&(i=null,n=!1),r(i,n)})}function Lfe(t,e){try{return ZE.sync(t,e||{})}catch(r){if(e&&e.ignoreErrors||r.code==="EACCES")return!1;throw r}}});var qM=w((rZe,KM)=>{var zu=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",UM=require("path"),Tfe=zu?";":":",HM=MM(),GM=t=>Object.assign(new Error(`not found: ${t}`),{code:"ENOENT"}),jM=(t,e)=>{let r=e.colon||Tfe,i=t.match(/\//)||zu&&t.match(/\\/)?[""]:[...zu?[process.cwd()]:[],...(e.path||process.env.PATH||"").split(r)],n=zu?e.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",s=zu?n.split(r):[""];return zu&&t.indexOf(".")!==-1&&s[0]!==""&&s.unshift(""),{pathEnv:i,pathExt:s,pathExtExe:n}},YM=(t,e,r)=>{typeof e=="function"&&(r=e,e={}),e||(e={});let{pathEnv:i,pathExt:n,pathExtExe:s}=jM(t,e),o=[],a=c=>new Promise((u,g)=>{if(c===i.length)return e.all&&o.length?u(o):g(GM(t));let f=i[c],h=/^".*"$/.test(f)?f.slice(1,-1):f,p=UM.join(h,t),m=!h&&/^\.[\\\/]/.test(t)?t.slice(0,2)+p:p;u(l(m,c,0))}),l=(c,u,g)=>new Promise((f,h)=>{if(g===n.length)return f(a(u+1));let p=n[g];HM(c+p,{pathExt:s},(m,y)=>{if(!m&&y)if(e.all)o.push(c+p);else return f(c+p);return f(l(c,u,g+1))})});return r?a(0).then(c=>r(null,c),r):a(0)},Ofe=(t,e)=>{e=e||{};let{pathEnv:r,pathExt:i,pathExtExe:n}=jM(t,e),s=[];for(let o=0;o{"use strict";var JM=(t={})=>{let e=t.env||process.env;return(t.platform||process.platform)!=="win32"?"PATH":Object.keys(e).reverse().find(i=>i.toUpperCase()==="PATH")||"Path"};PQ.exports=JM;PQ.exports.default=JM});var XM=w((nZe,zM)=>{"use strict";var _M=require("path"),Mfe=qM(),Kfe=WM();function VM(t,e){let r=t.options.env||process.env,i=process.cwd(),n=t.options.cwd!=null,s=n&&process.chdir!==void 0&&!process.chdir.disabled;if(s)try{process.chdir(t.options.cwd)}catch(a){}let o;try{o=Mfe.sync(t.command,{path:r[Kfe({env:r})],pathExt:e?_M.delimiter:void 0})}catch(a){}finally{s&&process.chdir(i)}return o&&(o=_M.resolve(n?t.options.cwd:"",o)),o}function Ufe(t){return VM(t)||VM(t,!0)}zM.exports=Ufe});var ZM=w((sZe,DQ)=>{"use strict";var RQ=/([()\][%!^"`<>&|;, *?])/g;function Hfe(t){return t=t.replace(RQ,"^$1"),t}function Gfe(t,e){return t=`${t}`,t=t.replace(/(\\*)"/g,'$1$1\\"'),t=t.replace(/(\\*)$/,"$1$1"),t=`"${t}"`,t=t.replace(RQ,"^$1"),e&&(t=t.replace(RQ,"^$1")),t}DQ.exports.command=Hfe;DQ.exports.argument=Gfe});var eK=w((oZe,$M)=>{"use strict";$M.exports=/^#!(.*)/});var rK=w((aZe,tK)=>{"use strict";var jfe=eK();tK.exports=(t="")=>{let e=t.match(jfe);if(!e)return null;let[r,i]=e[0].replace(/#! ?/,"").split(" "),n=r.split("/").pop();return n==="env"?i:i?`${n} ${i}`:n}});var nK=w((AZe,iK)=>{"use strict";var FQ=require("fs"),Yfe=rK();function qfe(t){let e=150,r=Buffer.alloc(e),i;try{i=FQ.openSync(t,"r"),FQ.readSync(i,r,0,e,0),FQ.closeSync(i)}catch(n){}return Yfe(r.toString())}iK.exports=qfe});var AK=w((lZe,sK)=>{"use strict";var Jfe=require("path"),oK=XM(),aK=ZM(),Wfe=nK(),zfe=process.platform==="win32",_fe=/\.(?:com|exe)$/i,Vfe=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function Xfe(t){t.file=oK(t);let e=t.file&&Wfe(t.file);return e?(t.args.unshift(t.file),t.command=e,oK(t)):t.file}function Zfe(t){if(!zfe)return t;let e=Xfe(t),r=!_fe.test(e);if(t.options.forceShell||r){let i=Vfe.test(e);t.command=Jfe.normalize(t.command),t.command=aK.command(t.command),t.args=t.args.map(s=>aK.argument(s,i));let n=[t.command].concat(t.args).join(" ");t.args=["/d","/s","/c",`"${n}"`],t.command=process.env.comspec||"cmd.exe",t.options.windowsVerbatimArguments=!0}return t}function $fe(t,e,r){e&&!Array.isArray(e)&&(r=e,e=null),e=e?e.slice(0):[],r=Object.assign({},r);let i={command:t,args:e,options:r,file:void 0,original:{command:t,args:e}};return r.shell?i:Zfe(i)}sK.exports=$fe});var uK=w((cZe,lK)=>{"use strict";var NQ=process.platform==="win32";function LQ(t,e){return Object.assign(new Error(`${e} ${t.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${e} ${t.command}`,path:t.command,spawnargs:t.args})}function ehe(t,e){if(!NQ)return;let r=t.emit;t.emit=function(i,n){if(i==="exit"){let s=cK(n,e,"spawn");if(s)return r.call(t,"error",s)}return r.apply(t,arguments)}}function cK(t,e){return NQ&&t===1&&!e.file?LQ(e.original,"spawn"):null}function the(t,e){return NQ&&t===1&&!e.file?LQ(e.original,"spawnSync"):null}lK.exports={hookChildProcess:ehe,verifyENOENT:cK,verifyENOENTSync:the,notFoundError:LQ}});var MQ=w((uZe,_u)=>{"use strict";var gK=require("child_process"),TQ=AK(),OQ=uK();function fK(t,e,r){let i=TQ(t,e,r),n=gK.spawn(i.command,i.args,i.options);return OQ.hookChildProcess(n,i),n}function rhe(t,e,r){let i=TQ(t,e,r),n=gK.spawnSync(i.command,i.args,i.options);return n.error=n.error||OQ.verifyENOENTSync(n.status,i),n}_u.exports=fK;_u.exports.spawn=fK;_u.exports.sync=rhe;_u.exports._parse=TQ;_u.exports._enoent=OQ});var pK=w((gZe,hK)=>{"use strict";function ihe(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function sc(t,e,r,i){this.message=t,this.expected=e,this.found=r,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,sc)}ihe(sc,Error);sc.buildMessage=function(t,e){var r={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;g>",ce=Ee(">>",!1),fe=">&",gt=Ee(">&",!1),Ht=">",Mt=Ee(">",!1),mi="<<<",Gt=Ee("<<<",!1),Qr="<&",Ti=Ee("<&",!1),Vs="<",Un=Ee("<",!1),Hn=function(C){return{type:"argument",segments:[].concat(...C)}},vr=function(C){return C},Gn="$'",gs=Ee("$'",!1),ya="'",kA=Ee("'",!1),Ru=function(C){return[{type:"text",text:C}]},fs='""',xA=Ee('""',!1),wa=function(){return{type:"text",text:""}},Fu='"',PA=Ee('"',!1),DA=function(C){return C},Sr=function(C){return{type:"arithmetic",arithmetic:C,quoted:!0}},jl=function(C){return{type:"shell",shell:C,quoted:!0}},Nu=function(C){return ie(N({type:"variable"},C),{quoted:!0})},So=function(C){return{type:"text",text:C}},Lu=function(C){return{type:"arithmetic",arithmetic:C,quoted:!1}},Sh=function(C){return{type:"shell",shell:C,quoted:!1}},kh=function(C){return ie(N({type:"variable"},C),{quoted:!1})},ae=function(C){return{type:"glob",pattern:C}},Oi=/^[^']/,ko=_e(["'"],!0,!1),jn=function(C){return C.join("")},Tu=/^[^$"]/,vt=_e(["$",'"'],!0,!1),Yl=`\\ -`,Yn=Ee(`\\ -`,!1),hs=function(){return""},ps="\\",pt=Ee("\\",!1),xo=/^[\\$"`]/,lt=_e(["\\","$",'"',"`"],!1,!1),mn=function(C){return C},v="\\a",Tt=Ee("\\a",!1),Ou=function(){return"a"},ql="\\b",xh=Ee("\\b",!1),Ph=function(){return"\b"},Dh=/^[Ee]/,Rh=_e(["E","e"],!1,!1),Fh=function(){return""},G="\\f",yt=Ee("\\f",!1),RA=function(){return"\f"},$i="\\n",Jl=Ee("\\n",!1),$e=function(){return` -`},Ba="\\r",Mu=Ee("\\r",!1),kE=function(){return"\r"},Nh="\\t",xE=Ee("\\t",!1),gr=function(){return" "},qn="\\v",Wl=Ee("\\v",!1),Lh=function(){return"\v"},Xs=/^[\\'"?]/,ba=_e(["\\","'",'"',"?"],!1,!1),En=function(C){return String.fromCharCode(parseInt(C,16))},Me="\\x",Ku=Ee("\\x",!1),zl="\\u",Zs=Ee("\\u",!1),_l="\\U",FA=Ee("\\U",!1),Uu=function(C){return String.fromCodePoint(parseInt(C,16))},Hu=/^[0-7]/,Qa=_e([["0","7"]],!1,!1),va=/^[0-9a-fA-f]/,it=_e([["0","9"],["a","f"],["A","f"]],!1,!1),Po=ot(),NA="-",Vl=Ee("-",!1),$s="+",Xl=Ee("+",!1),PE=".",Th=Ee(".",!1),Gu=function(C,Q,F){return{type:"number",value:(C==="-"?-1:1)*parseFloat(Q.join("")+"."+F.join(""))}},Oh=function(C,Q){return{type:"number",value:(C==="-"?-1:1)*parseInt(Q.join(""))}},DE=function(C){return N({type:"variable"},C)},Zl=function(C){return{type:"variable",name:C}},RE=function(C){return C},ju="*",LA=Ee("*",!1),Lr="/",FE=Ee("/",!1),eo=function(C,Q,F){return{type:Q==="*"?"multiplication":"division",right:F}},to=function(C,Q){return Q.reduce((F,U)=>N({left:F},U),C)},Yu=function(C,Q,F){return{type:Q==="+"?"addition":"subtraction",right:F}},TA="$((",R=Ee("$((",!1),q="))",me=Ee("))",!1),Ge=function(C){return C},Te="$(",Xe=Ee("$(",!1),Et=function(C){return C},Rt="${",Jn=Ee("${",!1),_b=":-",PO=Ee(":-",!1),DO=function(C,Q){return{name:C,defaultValue:Q}},Vb=":-}",RO=Ee(":-}",!1),FO=function(C){return{name:C,defaultValue:[]}},Xb=":+",NO=Ee(":+",!1),LO=function(C,Q){return{name:C,alternativeValue:Q}},Zb=":+}",TO=Ee(":+}",!1),OO=function(C){return{name:C,alternativeValue:[]}},$b=function(C){return{name:C}},MO="$",KO=Ee("$",!1),UO=function(C){return e.isGlobPattern(C)},HO=function(C){return C},eQ=/^[a-zA-Z0-9_]/,tQ=_e([["a","z"],["A","Z"],["0","9"],"_"],!1,!1),rQ=function(){return M()},iQ=/^[$@*?#a-zA-Z0-9_\-]/,nQ=_e(["$","@","*","?","#",["a","z"],["A","Z"],["0","9"],"_","-"],!1,!1),GO=/^[(){}<>$|&; \t"']/,qu=_e(["(",")","{","}","<",">","$","|","&",";"," "," ",'"',"'"],!1,!1),sQ=/^[<>&; \t"']/,oQ=_e(["<",">","&",";"," "," ",'"',"'"],!1,!1),NE=/^[ \t]/,LE=_e([" "," "],!1,!1),B=0,He=0,OA=[{line:1,column:1}],d=0,E=[],I=0,D;if("startRule"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');n=i[e.startRule]}function M(){return t.substring(He,B)}function _(){return It(He,B)}function ne(C,Q){throw Q=Q!==void 0?Q:It(He,B),Mi([ut(C)],t.substring(He,B),Q)}function Be(C,Q){throw Q=Q!==void 0?Q:It(He,B),Wn(C,Q)}function Ee(C,Q){return{type:"literal",text:C,ignoreCase:Q}}function _e(C,Q,F){return{type:"class",parts:C,inverted:Q,ignoreCase:F}}function ot(){return{type:"any"}}function wt(){return{type:"end"}}function ut(C){return{type:"other",description:C}}function nt(C){var Q=OA[C],F;if(Q)return Q;for(F=C-1;!OA[F];)F--;for(Q=OA[F],Q={line:Q.line,column:Q.column};Fd&&(d=B,E=[]),E.push(C))}function Wn(C,Q){return new sc(C,null,null,Q)}function Mi(C,Q,F){return new sc(sc.buildMessage(C,Q),C,Q,F)}function MA(){var C,Q;return C=B,Q=Yr(),Q===r&&(Q=null),Q!==r&&(He=C,Q=s(Q)),C=Q,C}function Yr(){var C,Q,F,U,ue;if(C=B,Q=qr(),Q!==r){for(F=[],U=je();U!==r;)F.push(U),U=je();F!==r?(U=Sa(),U!==r?(ue=ds(),ue===r&&(ue=null),ue!==r?(He=C,Q=o(Q,U,ue),C=Q):(B=C,C=r)):(B=C,C=r)):(B=C,C=r)}else B=C,C=r;if(C===r)if(C=B,Q=qr(),Q!==r){for(F=[],U=je();U!==r;)F.push(U),U=je();F!==r?(U=Sa(),U===r&&(U=null),U!==r?(He=C,Q=a(Q,U),C=Q):(B=C,C=r)):(B=C,C=r)}else B=C,C=r;return C}function ds(){var C,Q,F,U,ue;for(C=B,Q=[],F=je();F!==r;)Q.push(F),F=je();if(Q!==r)if(F=Yr(),F!==r){for(U=[],ue=je();ue!==r;)U.push(ue),ue=je();U!==r?(He=C,Q=l(F),C=Q):(B=C,C=r)}else B=C,C=r;else B=C,C=r;return C}function Sa(){var C;return t.charCodeAt(B)===59?(C=c,B++):(C=r,I===0&&ke(u)),C===r&&(t.charCodeAt(B)===38?(C=g,B++):(C=r,I===0&&ke(f))),C}function qr(){var C,Q,F;return C=B,Q=jO(),Q!==r?(F=jge(),F===r&&(F=null),F!==r?(He=C,Q=h(Q,F),C=Q):(B=C,C=r)):(B=C,C=r),C}function jge(){var C,Q,F,U,ue,De,Ct;for(C=B,Q=[],F=je();F!==r;)Q.push(F),F=je();if(Q!==r)if(F=Yge(),F!==r){for(U=[],ue=je();ue!==r;)U.push(ue),ue=je();if(U!==r)if(ue=qr(),ue!==r){for(De=[],Ct=je();Ct!==r;)De.push(Ct),Ct=je();De!==r?(He=C,Q=p(F,ue),C=Q):(B=C,C=r)}else B=C,C=r;else B=C,C=r}else B=C,C=r;else B=C,C=r;return C}function Yge(){var C;return t.substr(B,2)===m?(C=m,B+=2):(C=r,I===0&&ke(y)),C===r&&(t.substr(B,2)===b?(C=b,B+=2):(C=r,I===0&&ke(S))),C}function jO(){var C,Q,F;return C=B,Q=Wge(),Q!==r?(F=qge(),F===r&&(F=null),F!==r?(He=C,Q=k(Q,F),C=Q):(B=C,C=r)):(B=C,C=r),C}function qge(){var C,Q,F,U,ue,De,Ct;for(C=B,Q=[],F=je();F!==r;)Q.push(F),F=je();if(Q!==r)if(F=Jge(),F!==r){for(U=[],ue=je();ue!==r;)U.push(ue),ue=je();if(U!==r)if(ue=jO(),ue!==r){for(De=[],Ct=je();Ct!==r;)De.push(Ct),Ct=je();De!==r?(He=C,Q=T(F,ue),C=Q):(B=C,C=r)}else B=C,C=r;else B=C,C=r}else B=C,C=r;else B=C,C=r;return C}function Jge(){var C;return t.substr(B,2)===Y?(C=Y,B+=2):(C=r,I===0&&ke(j)),C===r&&(t.charCodeAt(B)===124?(C=Z,B++):(C=r,I===0&&ke(J))),C}function TE(){var C,Q,F,U,ue,De;if(C=B,Q=tM(),Q!==r)if(t.charCodeAt(B)===61?(F=re,B++):(F=r,I===0&&ke(ee)),F!==r)if(U=JO(),U!==r){for(ue=[],De=je();De!==r;)ue.push(De),De=je();ue!==r?(He=C,Q=A(Q,U),C=Q):(B=C,C=r)}else B=C,C=r;else B=C,C=r;else B=C,C=r;if(C===r)if(C=B,Q=tM(),Q!==r)if(t.charCodeAt(B)===61?(F=re,B++):(F=r,I===0&&ke(ee)),F!==r){for(U=[],ue=je();ue!==r;)U.push(ue),ue=je();U!==r?(He=C,Q=oe(Q),C=Q):(B=C,C=r)}else B=C,C=r;else B=C,C=r;return C}function Wge(){var C,Q,F,U,ue,De,Ct,bt,$r,Ei,Cs;for(C=B,Q=[],F=je();F!==r;)Q.push(F),F=je();if(Q!==r)if(t.charCodeAt(B)===40?(F=le,B++):(F=r,I===0&&ke(X)),F!==r){for(U=[],ue=je();ue!==r;)U.push(ue),ue=je();if(U!==r)if(ue=Yr(),ue!==r){for(De=[],Ct=je();Ct!==r;)De.push(Ct),Ct=je();if(De!==r)if(t.charCodeAt(B)===41?(Ct=O,B++):(Ct=r,I===0&&ke(L)),Ct!==r){for(bt=[],$r=je();$r!==r;)bt.push($r),$r=je();if(bt!==r){for($r=[],Ei=Mh();Ei!==r;)$r.push(Ei),Ei=Mh();if($r!==r){for(Ei=[],Cs=je();Cs!==r;)Ei.push(Cs),Cs=je();Ei!==r?(He=C,Q=pe(ue,$r),C=Q):(B=C,C=r)}else B=C,C=r}else B=C,C=r}else B=C,C=r;else B=C,C=r}else B=C,C=r;else B=C,C=r}else B=C,C=r;else B=C,C=r;if(C===r){for(C=B,Q=[],F=je();F!==r;)Q.push(F),F=je();if(Q!==r)if(t.charCodeAt(B)===123?(F=Ce,B++):(F=r,I===0&&ke(Oe)),F!==r){for(U=[],ue=je();ue!==r;)U.push(ue),ue=je();if(U!==r)if(ue=Yr(),ue!==r){for(De=[],Ct=je();Ct!==r;)De.push(Ct),Ct=je();if(De!==r)if(t.charCodeAt(B)===125?(Ct=te,B++):(Ct=r,I===0&&ke(se)),Ct!==r){for(bt=[],$r=je();$r!==r;)bt.push($r),$r=je();if(bt!==r){for($r=[],Ei=Mh();Ei!==r;)$r.push(Ei),Ei=Mh();if($r!==r){for(Ei=[],Cs=je();Cs!==r;)Ei.push(Cs),Cs=je();Ei!==r?(He=C,Q=be(ue,$r),C=Q):(B=C,C=r)}else B=C,C=r}else B=C,C=r}else B=C,C=r;else B=C,C=r}else B=C,C=r;else B=C,C=r}else B=C,C=r;else B=C,C=r;if(C===r){for(C=B,Q=[],F=je();F!==r;)Q.push(F),F=je();if(Q!==r){for(F=[],U=TE();U!==r;)F.push(U),U=TE();if(F!==r){for(U=[],ue=je();ue!==r;)U.push(ue),ue=je();if(U!==r){if(ue=[],De=qO(),De!==r)for(;De!==r;)ue.push(De),De=qO();else ue=r;if(ue!==r){for(De=[],Ct=je();Ct!==r;)De.push(Ct),Ct=je();De!==r?(He=C,Q=he(F,ue),C=Q):(B=C,C=r)}else B=C,C=r}else B=C,C=r}else B=C,C=r}else B=C,C=r;if(C===r){for(C=B,Q=[],F=je();F!==r;)Q.push(F),F=je();if(Q!==r){if(F=[],U=TE(),U!==r)for(;U!==r;)F.push(U),U=TE();else F=r;if(F!==r){for(U=[],ue=je();ue!==r;)U.push(ue),ue=je();U!==r?(He=C,Q=Fe(F),C=Q):(B=C,C=r)}else B=C,C=r}else B=C,C=r}}}return C}function YO(){var C,Q,F,U,ue;for(C=B,Q=[],F=je();F!==r;)Q.push(F),F=je();if(Q!==r){if(F=[],U=OE(),U!==r)for(;U!==r;)F.push(U),U=OE();else F=r;if(F!==r){for(U=[],ue=je();ue!==r;)U.push(ue),ue=je();U!==r?(He=C,Q=Ue(F),C=Q):(B=C,C=r)}else B=C,C=r}else B=C,C=r;return C}function qO(){var C,Q,F;for(C=B,Q=[],F=je();F!==r;)Q.push(F),F=je();if(Q!==r?(F=Mh(),F!==r?(He=C,Q=xe(F),C=Q):(B=C,C=r)):(B=C,C=r),C===r){for(C=B,Q=[],F=je();F!==r;)Q.push(F),F=je();Q!==r?(F=OE(),F!==r?(He=C,Q=xe(F),C=Q):(B=C,C=r)):(B=C,C=r)}return C}function Mh(){var C,Q,F,U,ue;for(C=B,Q=[],F=je();F!==r;)Q.push(F),F=je();return Q!==r?(Se.test(t.charAt(B))?(F=t.charAt(B),B++):(F=r,I===0&&ke(de)),F===r&&(F=null),F!==r?(U=zge(),U!==r?(ue=OE(),ue!==r?(He=C,Q=V(F,U,ue),C=Q):(B=C,C=r)):(B=C,C=r)):(B=C,C=r)):(B=C,C=r),C}function zge(){var C;return t.substr(B,2)===Qe?(C=Qe,B+=2):(C=r,I===0&&ke(ce)),C===r&&(t.substr(B,2)===fe?(C=fe,B+=2):(C=r,I===0&&ke(gt)),C===r&&(t.charCodeAt(B)===62?(C=Ht,B++):(C=r,I===0&&ke(Mt)),C===r&&(t.substr(B,3)===mi?(C=mi,B+=3):(C=r,I===0&&ke(Gt)),C===r&&(t.substr(B,2)===Qr?(C=Qr,B+=2):(C=r,I===0&&ke(Ti)),C===r&&(t.charCodeAt(B)===60?(C=Vs,B++):(C=r,I===0&&ke(Un))))))),C}function OE(){var C,Q,F;for(C=B,Q=[],F=je();F!==r;)Q.push(F),F=je();return Q!==r?(F=JO(),F!==r?(He=C,Q=xe(F),C=Q):(B=C,C=r)):(B=C,C=r),C}function JO(){var C,Q,F;if(C=B,Q=[],F=WO(),F!==r)for(;F!==r;)Q.push(F),F=WO();else Q=r;return Q!==r&&(He=C,Q=Hn(Q)),C=Q,C}function WO(){var C,Q;return C=B,Q=_ge(),Q!==r&&(He=C,Q=vr(Q)),C=Q,C===r&&(C=B,Q=Vge(),Q!==r&&(He=C,Q=vr(Q)),C=Q,C===r&&(C=B,Q=Xge(),Q!==r&&(He=C,Q=vr(Q)),C=Q,C===r&&(C=B,Q=Zge(),Q!==r&&(He=C,Q=vr(Q)),C=Q))),C}function _ge(){var C,Q,F,U;return C=B,t.substr(B,2)===Gn?(Q=Gn,B+=2):(Q=r,I===0&&ke(gs)),Q!==r?(F=tfe(),F!==r?(t.charCodeAt(B)===39?(U=ya,B++):(U=r,I===0&&ke(kA)),U!==r?(He=C,Q=Ru(F),C=Q):(B=C,C=r)):(B=C,C=r)):(B=C,C=r),C}function Vge(){var C,Q,F,U;return C=B,t.charCodeAt(B)===39?(Q=ya,B++):(Q=r,I===0&&ke(kA)),Q!==r?(F=$ge(),F!==r?(t.charCodeAt(B)===39?(U=ya,B++):(U=r,I===0&&ke(kA)),U!==r?(He=C,Q=Ru(F),C=Q):(B=C,C=r)):(B=C,C=r)):(B=C,C=r),C}function Xge(){var C,Q,F,U;if(C=B,t.substr(B,2)===fs?(Q=fs,B+=2):(Q=r,I===0&&ke(xA)),Q!==r&&(He=C,Q=wa()),C=Q,C===r)if(C=B,t.charCodeAt(B)===34?(Q=Fu,B++):(Q=r,I===0&&ke(PA)),Q!==r){for(F=[],U=zO();U!==r;)F.push(U),U=zO();F!==r?(t.charCodeAt(B)===34?(U=Fu,B++):(U=r,I===0&&ke(PA)),U!==r?(He=C,Q=DA(F),C=Q):(B=C,C=r)):(B=C,C=r)}else B=C,C=r;return C}function Zge(){var C,Q,F;if(C=B,Q=[],F=_O(),F!==r)for(;F!==r;)Q.push(F),F=_O();else Q=r;return Q!==r&&(He=C,Q=DA(Q)),C=Q,C}function zO(){var C,Q;return C=B,Q=$O(),Q!==r&&(He=C,Q=Sr(Q)),C=Q,C===r&&(C=B,Q=eM(),Q!==r&&(He=C,Q=jl(Q)),C=Q,C===r&&(C=B,Q=cQ(),Q!==r&&(He=C,Q=Nu(Q)),C=Q,C===r&&(C=B,Q=efe(),Q!==r&&(He=C,Q=So(Q)),C=Q))),C}function _O(){var C,Q;return C=B,Q=$O(),Q!==r&&(He=C,Q=Lu(Q)),C=Q,C===r&&(C=B,Q=eM(),Q!==r&&(He=C,Q=Sh(Q)),C=Q,C===r&&(C=B,Q=cQ(),Q!==r&&(He=C,Q=kh(Q)),C=Q,C===r&&(C=B,Q=nfe(),Q!==r&&(He=C,Q=ae(Q)),C=Q,C===r&&(C=B,Q=ife(),Q!==r&&(He=C,Q=So(Q)),C=Q)))),C}function $ge(){var C,Q,F;for(C=B,Q=[],Oi.test(t.charAt(B))?(F=t.charAt(B),B++):(F=r,I===0&&ke(ko));F!==r;)Q.push(F),Oi.test(t.charAt(B))?(F=t.charAt(B),B++):(F=r,I===0&&ke(ko));return Q!==r&&(He=C,Q=jn(Q)),C=Q,C}function efe(){var C,Q,F;if(C=B,Q=[],F=VO(),F===r&&(Tu.test(t.charAt(B))?(F=t.charAt(B),B++):(F=r,I===0&&ke(vt))),F!==r)for(;F!==r;)Q.push(F),F=VO(),F===r&&(Tu.test(t.charAt(B))?(F=t.charAt(B),B++):(F=r,I===0&&ke(vt)));else Q=r;return Q!==r&&(He=C,Q=jn(Q)),C=Q,C}function VO(){var C,Q,F;return C=B,t.substr(B,2)===Yl?(Q=Yl,B+=2):(Q=r,I===0&&ke(Yn)),Q!==r&&(He=C,Q=hs()),C=Q,C===r&&(C=B,t.charCodeAt(B)===92?(Q=ps,B++):(Q=r,I===0&&ke(pt)),Q!==r?(xo.test(t.charAt(B))?(F=t.charAt(B),B++):(F=r,I===0&&ke(lt)),F!==r?(He=C,Q=mn(F),C=Q):(B=C,C=r)):(B=C,C=r)),C}function tfe(){var C,Q,F;for(C=B,Q=[],F=XO(),F===r&&(Oi.test(t.charAt(B))?(F=t.charAt(B),B++):(F=r,I===0&&ke(ko)));F!==r;)Q.push(F),F=XO(),F===r&&(Oi.test(t.charAt(B))?(F=t.charAt(B),B++):(F=r,I===0&&ke(ko)));return Q!==r&&(He=C,Q=jn(Q)),C=Q,C}function XO(){var C,Q,F;return C=B,t.substr(B,2)===v?(Q=v,B+=2):(Q=r,I===0&&ke(Tt)),Q!==r&&(He=C,Q=Ou()),C=Q,C===r&&(C=B,t.substr(B,2)===ql?(Q=ql,B+=2):(Q=r,I===0&&ke(xh)),Q!==r&&(He=C,Q=Ph()),C=Q,C===r&&(C=B,t.charCodeAt(B)===92?(Q=ps,B++):(Q=r,I===0&&ke(pt)),Q!==r?(Dh.test(t.charAt(B))?(F=t.charAt(B),B++):(F=r,I===0&&ke(Rh)),F!==r?(He=C,Q=Fh(),C=Q):(B=C,C=r)):(B=C,C=r),C===r&&(C=B,t.substr(B,2)===G?(Q=G,B+=2):(Q=r,I===0&&ke(yt)),Q!==r&&(He=C,Q=RA()),C=Q,C===r&&(C=B,t.substr(B,2)===$i?(Q=$i,B+=2):(Q=r,I===0&&ke(Jl)),Q!==r&&(He=C,Q=$e()),C=Q,C===r&&(C=B,t.substr(B,2)===Ba?(Q=Ba,B+=2):(Q=r,I===0&&ke(Mu)),Q!==r&&(He=C,Q=kE()),C=Q,C===r&&(C=B,t.substr(B,2)===Nh?(Q=Nh,B+=2):(Q=r,I===0&&ke(xE)),Q!==r&&(He=C,Q=gr()),C=Q,C===r&&(C=B,t.substr(B,2)===qn?(Q=qn,B+=2):(Q=r,I===0&&ke(Wl)),Q!==r&&(He=C,Q=Lh()),C=Q,C===r&&(C=B,t.charCodeAt(B)===92?(Q=ps,B++):(Q=r,I===0&&ke(pt)),Q!==r?(Xs.test(t.charAt(B))?(F=t.charAt(B),B++):(F=r,I===0&&ke(ba)),F!==r?(He=C,Q=mn(F),C=Q):(B=C,C=r)):(B=C,C=r),C===r&&(C=rfe()))))))))),C}function rfe(){var C,Q,F,U,ue,De,Ct,bt,$r,Ei,Cs,uQ;return C=B,t.charCodeAt(B)===92?(Q=ps,B++):(Q=r,I===0&&ke(pt)),Q!==r?(F=aQ(),F!==r?(He=C,Q=En(F),C=Q):(B=C,C=r)):(B=C,C=r),C===r&&(C=B,t.substr(B,2)===Me?(Q=Me,B+=2):(Q=r,I===0&&ke(Ku)),Q!==r?(F=B,U=B,ue=aQ(),ue!==r?(De=zn(),De!==r?(ue=[ue,De],U=ue):(B=U,U=r)):(B=U,U=r),U===r&&(U=aQ()),U!==r?F=t.substring(F,B):F=U,F!==r?(He=C,Q=En(F),C=Q):(B=C,C=r)):(B=C,C=r),C===r&&(C=B,t.substr(B,2)===zl?(Q=zl,B+=2):(Q=r,I===0&&ke(Zs)),Q!==r?(F=B,U=B,ue=zn(),ue!==r?(De=zn(),De!==r?(Ct=zn(),Ct!==r?(bt=zn(),bt!==r?(ue=[ue,De,Ct,bt],U=ue):(B=U,U=r)):(B=U,U=r)):(B=U,U=r)):(B=U,U=r),U!==r?F=t.substring(F,B):F=U,F!==r?(He=C,Q=En(F),C=Q):(B=C,C=r)):(B=C,C=r),C===r&&(C=B,t.substr(B,2)===_l?(Q=_l,B+=2):(Q=r,I===0&&ke(FA)),Q!==r?(F=B,U=B,ue=zn(),ue!==r?(De=zn(),De!==r?(Ct=zn(),Ct!==r?(bt=zn(),bt!==r?($r=zn(),$r!==r?(Ei=zn(),Ei!==r?(Cs=zn(),Cs!==r?(uQ=zn(),uQ!==r?(ue=[ue,De,Ct,bt,$r,Ei,Cs,uQ],U=ue):(B=U,U=r)):(B=U,U=r)):(B=U,U=r)):(B=U,U=r)):(B=U,U=r)):(B=U,U=r)):(B=U,U=r)):(B=U,U=r),U!==r?F=t.substring(F,B):F=U,F!==r?(He=C,Q=Uu(F),C=Q):(B=C,C=r)):(B=C,C=r)))),C}function aQ(){var C;return Hu.test(t.charAt(B))?(C=t.charAt(B),B++):(C=r,I===0&&ke(Qa)),C}function zn(){var C;return va.test(t.charAt(B))?(C=t.charAt(B),B++):(C=r,I===0&&ke(it)),C}function ife(){var C,Q,F,U,ue;if(C=B,Q=[],F=B,t.charCodeAt(B)===92?(U=ps,B++):(U=r,I===0&&ke(pt)),U!==r?(t.length>B?(ue=t.charAt(B),B++):(ue=r,I===0&&ke(Po)),ue!==r?(He=F,U=mn(ue),F=U):(B=F,F=r)):(B=F,F=r),F===r&&(F=B,U=B,I++,ue=rM(),I--,ue===r?U=void 0:(B=U,U=r),U!==r?(t.length>B?(ue=t.charAt(B),B++):(ue=r,I===0&&ke(Po)),ue!==r?(He=F,U=mn(ue),F=U):(B=F,F=r)):(B=F,F=r)),F!==r)for(;F!==r;)Q.push(F),F=B,t.charCodeAt(B)===92?(U=ps,B++):(U=r,I===0&&ke(pt)),U!==r?(t.length>B?(ue=t.charAt(B),B++):(ue=r,I===0&&ke(Po)),ue!==r?(He=F,U=mn(ue),F=U):(B=F,F=r)):(B=F,F=r),F===r&&(F=B,U=B,I++,ue=rM(),I--,ue===r?U=void 0:(B=U,U=r),U!==r?(t.length>B?(ue=t.charAt(B),B++):(ue=r,I===0&&ke(Po)),ue!==r?(He=F,U=mn(ue),F=U):(B=F,F=r)):(B=F,F=r));else Q=r;return Q!==r&&(He=C,Q=jn(Q)),C=Q,C}function AQ(){var C,Q,F,U,ue,De;if(C=B,t.charCodeAt(B)===45?(Q=NA,B++):(Q=r,I===0&&ke(Vl)),Q===r&&(t.charCodeAt(B)===43?(Q=$s,B++):(Q=r,I===0&&ke(Xl))),Q===r&&(Q=null),Q!==r){if(F=[],Se.test(t.charAt(B))?(U=t.charAt(B),B++):(U=r,I===0&&ke(de)),U!==r)for(;U!==r;)F.push(U),Se.test(t.charAt(B))?(U=t.charAt(B),B++):(U=r,I===0&&ke(de));else F=r;if(F!==r)if(t.charCodeAt(B)===46?(U=PE,B++):(U=r,I===0&&ke(Th)),U!==r){if(ue=[],Se.test(t.charAt(B))?(De=t.charAt(B),B++):(De=r,I===0&&ke(de)),De!==r)for(;De!==r;)ue.push(De),Se.test(t.charAt(B))?(De=t.charAt(B),B++):(De=r,I===0&&ke(de));else ue=r;ue!==r?(He=C,Q=Gu(Q,F,ue),C=Q):(B=C,C=r)}else B=C,C=r;else B=C,C=r}else B=C,C=r;if(C===r){if(C=B,t.charCodeAt(B)===45?(Q=NA,B++):(Q=r,I===0&&ke(Vl)),Q===r&&(t.charCodeAt(B)===43?(Q=$s,B++):(Q=r,I===0&&ke(Xl))),Q===r&&(Q=null),Q!==r){if(F=[],Se.test(t.charAt(B))?(U=t.charAt(B),B++):(U=r,I===0&&ke(de)),U!==r)for(;U!==r;)F.push(U),Se.test(t.charAt(B))?(U=t.charAt(B),B++):(U=r,I===0&&ke(de));else F=r;F!==r?(He=C,Q=Oh(Q,F),C=Q):(B=C,C=r)}else B=C,C=r;if(C===r&&(C=B,Q=cQ(),Q!==r&&(He=C,Q=DE(Q)),C=Q,C===r&&(C=B,Q=$l(),Q!==r&&(He=C,Q=Zl(Q)),C=Q,C===r)))if(C=B,t.charCodeAt(B)===40?(Q=le,B++):(Q=r,I===0&&ke(X)),Q!==r){for(F=[],U=je();U!==r;)F.push(U),U=je();if(F!==r)if(U=ZO(),U!==r){for(ue=[],De=je();De!==r;)ue.push(De),De=je();ue!==r?(t.charCodeAt(B)===41?(De=O,B++):(De=r,I===0&&ke(L)),De!==r?(He=C,Q=RE(U),C=Q):(B=C,C=r)):(B=C,C=r)}else B=C,C=r;else B=C,C=r}else B=C,C=r}return C}function lQ(){var C,Q,F,U,ue,De,Ct,bt;if(C=B,Q=AQ(),Q!==r){for(F=[],U=B,ue=[],De=je();De!==r;)ue.push(De),De=je();if(ue!==r)if(t.charCodeAt(B)===42?(De=ju,B++):(De=r,I===0&&ke(LA)),De===r&&(t.charCodeAt(B)===47?(De=Lr,B++):(De=r,I===0&&ke(FE))),De!==r){for(Ct=[],bt=je();bt!==r;)Ct.push(bt),bt=je();Ct!==r?(bt=AQ(),bt!==r?(He=U,ue=eo(Q,De,bt),U=ue):(B=U,U=r)):(B=U,U=r)}else B=U,U=r;else B=U,U=r;for(;U!==r;){for(F.push(U),U=B,ue=[],De=je();De!==r;)ue.push(De),De=je();if(ue!==r)if(t.charCodeAt(B)===42?(De=ju,B++):(De=r,I===0&&ke(LA)),De===r&&(t.charCodeAt(B)===47?(De=Lr,B++):(De=r,I===0&&ke(FE))),De!==r){for(Ct=[],bt=je();bt!==r;)Ct.push(bt),bt=je();Ct!==r?(bt=AQ(),bt!==r?(He=U,ue=eo(Q,De,bt),U=ue):(B=U,U=r)):(B=U,U=r)}else B=U,U=r;else B=U,U=r}F!==r?(He=C,Q=to(Q,F),C=Q):(B=C,C=r)}else B=C,C=r;return C}function ZO(){var C,Q,F,U,ue,De,Ct,bt;if(C=B,Q=lQ(),Q!==r){for(F=[],U=B,ue=[],De=je();De!==r;)ue.push(De),De=je();if(ue!==r)if(t.charCodeAt(B)===43?(De=$s,B++):(De=r,I===0&&ke(Xl)),De===r&&(t.charCodeAt(B)===45?(De=NA,B++):(De=r,I===0&&ke(Vl))),De!==r){for(Ct=[],bt=je();bt!==r;)Ct.push(bt),bt=je();Ct!==r?(bt=lQ(),bt!==r?(He=U,ue=Yu(Q,De,bt),U=ue):(B=U,U=r)):(B=U,U=r)}else B=U,U=r;else B=U,U=r;for(;U!==r;){for(F.push(U),U=B,ue=[],De=je();De!==r;)ue.push(De),De=je();if(ue!==r)if(t.charCodeAt(B)===43?(De=$s,B++):(De=r,I===0&&ke(Xl)),De===r&&(t.charCodeAt(B)===45?(De=NA,B++):(De=r,I===0&&ke(Vl))),De!==r){for(Ct=[],bt=je();bt!==r;)Ct.push(bt),bt=je();Ct!==r?(bt=lQ(),bt!==r?(He=U,ue=Yu(Q,De,bt),U=ue):(B=U,U=r)):(B=U,U=r)}else B=U,U=r;else B=U,U=r}F!==r?(He=C,Q=to(Q,F),C=Q):(B=C,C=r)}else B=C,C=r;return C}function $O(){var C,Q,F,U,ue,De;if(C=B,t.substr(B,3)===TA?(Q=TA,B+=3):(Q=r,I===0&&ke(R)),Q!==r){for(F=[],U=je();U!==r;)F.push(U),U=je();if(F!==r)if(U=ZO(),U!==r){for(ue=[],De=je();De!==r;)ue.push(De),De=je();ue!==r?(t.substr(B,2)===q?(De=q,B+=2):(De=r,I===0&&ke(me)),De!==r?(He=C,Q=Ge(U),C=Q):(B=C,C=r)):(B=C,C=r)}else B=C,C=r;else B=C,C=r}else B=C,C=r;return C}function eM(){var C,Q,F,U;return C=B,t.substr(B,2)===Te?(Q=Te,B+=2):(Q=r,I===0&&ke(Xe)),Q!==r?(F=Yr(),F!==r?(t.charCodeAt(B)===41?(U=O,B++):(U=r,I===0&&ke(L)),U!==r?(He=C,Q=Et(F),C=Q):(B=C,C=r)):(B=C,C=r)):(B=C,C=r),C}function cQ(){var C,Q,F,U,ue,De;return C=B,t.substr(B,2)===Rt?(Q=Rt,B+=2):(Q=r,I===0&&ke(Jn)),Q!==r?(F=$l(),F!==r?(t.substr(B,2)===_b?(U=_b,B+=2):(U=r,I===0&&ke(PO)),U!==r?(ue=YO(),ue!==r?(t.charCodeAt(B)===125?(De=te,B++):(De=r,I===0&&ke(se)),De!==r?(He=C,Q=DO(F,ue),C=Q):(B=C,C=r)):(B=C,C=r)):(B=C,C=r)):(B=C,C=r)):(B=C,C=r),C===r&&(C=B,t.substr(B,2)===Rt?(Q=Rt,B+=2):(Q=r,I===0&&ke(Jn)),Q!==r?(F=$l(),F!==r?(t.substr(B,3)===Vb?(U=Vb,B+=3):(U=r,I===0&&ke(RO)),U!==r?(He=C,Q=FO(F),C=Q):(B=C,C=r)):(B=C,C=r)):(B=C,C=r),C===r&&(C=B,t.substr(B,2)===Rt?(Q=Rt,B+=2):(Q=r,I===0&&ke(Jn)),Q!==r?(F=$l(),F!==r?(t.substr(B,2)===Xb?(U=Xb,B+=2):(U=r,I===0&&ke(NO)),U!==r?(ue=YO(),ue!==r?(t.charCodeAt(B)===125?(De=te,B++):(De=r,I===0&&ke(se)),De!==r?(He=C,Q=LO(F,ue),C=Q):(B=C,C=r)):(B=C,C=r)):(B=C,C=r)):(B=C,C=r)):(B=C,C=r),C===r&&(C=B,t.substr(B,2)===Rt?(Q=Rt,B+=2):(Q=r,I===0&&ke(Jn)),Q!==r?(F=$l(),F!==r?(t.substr(B,3)===Zb?(U=Zb,B+=3):(U=r,I===0&&ke(TO)),U!==r?(He=C,Q=OO(F),C=Q):(B=C,C=r)):(B=C,C=r)):(B=C,C=r),C===r&&(C=B,t.substr(B,2)===Rt?(Q=Rt,B+=2):(Q=r,I===0&&ke(Jn)),Q!==r?(F=$l(),F!==r?(t.charCodeAt(B)===125?(U=te,B++):(U=r,I===0&&ke(se)),U!==r?(He=C,Q=$b(F),C=Q):(B=C,C=r)):(B=C,C=r)):(B=C,C=r),C===r&&(C=B,t.charCodeAt(B)===36?(Q=MO,B++):(Q=r,I===0&&ke(KO)),Q!==r?(F=$l(),F!==r?(He=C,Q=$b(F),C=Q):(B=C,C=r)):(B=C,C=r)))))),C}function nfe(){var C,Q,F;return C=B,Q=sfe(),Q!==r?(He=B,F=UO(Q),F?F=void 0:F=r,F!==r?(He=C,Q=HO(Q),C=Q):(B=C,C=r)):(B=C,C=r),C}function sfe(){var C,Q,F,U,ue;if(C=B,Q=[],F=B,U=B,I++,ue=iM(),I--,ue===r?U=void 0:(B=U,U=r),U!==r?(t.length>B?(ue=t.charAt(B),B++):(ue=r,I===0&&ke(Po)),ue!==r?(He=F,U=mn(ue),F=U):(B=F,F=r)):(B=F,F=r),F!==r)for(;F!==r;)Q.push(F),F=B,U=B,I++,ue=iM(),I--,ue===r?U=void 0:(B=U,U=r),U!==r?(t.length>B?(ue=t.charAt(B),B++):(ue=r,I===0&&ke(Po)),ue!==r?(He=F,U=mn(ue),F=U):(B=F,F=r)):(B=F,F=r);else Q=r;return Q!==r&&(He=C,Q=jn(Q)),C=Q,C}function tM(){var C,Q,F;if(C=B,Q=[],eQ.test(t.charAt(B))?(F=t.charAt(B),B++):(F=r,I===0&&ke(tQ)),F!==r)for(;F!==r;)Q.push(F),eQ.test(t.charAt(B))?(F=t.charAt(B),B++):(F=r,I===0&&ke(tQ));else Q=r;return Q!==r&&(He=C,Q=rQ()),C=Q,C}function $l(){var C,Q,F;if(C=B,Q=[],iQ.test(t.charAt(B))?(F=t.charAt(B),B++):(F=r,I===0&&ke(nQ)),F!==r)for(;F!==r;)Q.push(F),iQ.test(t.charAt(B))?(F=t.charAt(B),B++):(F=r,I===0&&ke(nQ));else Q=r;return Q!==r&&(He=C,Q=rQ()),C=Q,C}function rM(){var C;return GO.test(t.charAt(B))?(C=t.charAt(B),B++):(C=r,I===0&&ke(qu)),C}function iM(){var C;return sQ.test(t.charAt(B))?(C=t.charAt(B),B++):(C=r,I===0&&ke(oQ)),C}function je(){var C,Q;if(C=[],NE.test(t.charAt(B))?(Q=t.charAt(B),B++):(Q=r,I===0&&ke(LE)),Q!==r)for(;Q!==r;)C.push(Q),NE.test(t.charAt(B))?(Q=t.charAt(B),B++):(Q=r,I===0&&ke(LE));else C=r;return C}if(D=n(),D!==r&&B===t.length)return D;throw D!==r&&B{"use strict";function she(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function ac(t,e,r,i){this.message=t,this.expected=e,this.found=r,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,ac)}she(ac,Error);ac.buildMessage=function(t,e){var r={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;gY&&(Y=S,j=[]),j.push(de))}function se(de,V){return new ac(de,null,null,V)}function be(de,V,Qe){return new ac(ac.buildMessage(de,V),de,V,Qe)}function he(){var de,V,Qe,ce;return de=S,V=Fe(),V!==r?(t.charCodeAt(S)===47?(Qe=s,S++):(Qe=r,Z===0&&te(o)),Qe!==r?(ce=Fe(),ce!==r?(k=de,V=a(V,ce),de=V):(S=de,de=r)):(S=de,de=r)):(S=de,de=r),de===r&&(de=S,V=Fe(),V!==r&&(k=de,V=l(V)),de=V),de}function Fe(){var de,V,Qe,ce;return de=S,V=Ue(),V!==r?(t.charCodeAt(S)===64?(Qe=c,S++):(Qe=r,Z===0&&te(u)),Qe!==r?(ce=Se(),ce!==r?(k=de,V=g(V,ce),de=V):(S=de,de=r)):(S=de,de=r)):(S=de,de=r),de===r&&(de=S,V=Ue(),V!==r&&(k=de,V=f(V)),de=V),de}function Ue(){var de,V,Qe,ce,fe;return de=S,t.charCodeAt(S)===64?(V=c,S++):(V=r,Z===0&&te(u)),V!==r?(Qe=xe(),Qe!==r?(t.charCodeAt(S)===47?(ce=s,S++):(ce=r,Z===0&&te(o)),ce!==r?(fe=xe(),fe!==r?(k=de,V=h(),de=V):(S=de,de=r)):(S=de,de=r)):(S=de,de=r)):(S=de,de=r),de===r&&(de=S,V=xe(),V!==r&&(k=de,V=h()),de=V),de}function xe(){var de,V,Qe;if(de=S,V=[],p.test(t.charAt(S))?(Qe=t.charAt(S),S++):(Qe=r,Z===0&&te(m)),Qe!==r)for(;Qe!==r;)V.push(Qe),p.test(t.charAt(S))?(Qe=t.charAt(S),S++):(Qe=r,Z===0&&te(m));else V=r;return V!==r&&(k=de,V=h()),de=V,de}function Se(){var de,V,Qe;if(de=S,V=[],y.test(t.charAt(S))?(Qe=t.charAt(S),S++):(Qe=r,Z===0&&te(b)),Qe!==r)for(;Qe!==r;)V.push(Qe),y.test(t.charAt(S))?(Qe=t.charAt(S),S++):(Qe=r,Z===0&&te(b));else V=r;return V!==r&&(k=de,V=h()),de=V,de}if(J=n(),J!==r&&S===t.length)return J;throw J!==r&&S{"use strict";function IK(t){return typeof t=="undefined"||t===null}function ahe(t){return typeof t=="object"&&t!==null}function Ahe(t){return Array.isArray(t)?t:IK(t)?[]:[t]}function lhe(t,e){var r,i,n,s;if(e)for(s=Object.keys(e),r=0,i=s.length;r{"use strict";function tp(t,e){Error.call(this),this.name="YAMLException",this.reason=t,this.mark=e,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():""),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}tp.prototype=Object.create(Error.prototype);tp.prototype.constructor=tp;tp.prototype.toString=function(e){var r=this.name+": ";return r+=this.reason||"(unknown reason)",!e&&this.mark&&(r+=" "+this.mark.toString()),r};yK.exports=tp});var bK=w((PZe,wK)=>{"use strict";var BK=lc();function YQ(t,e,r,i,n){this.name=t,this.buffer=e,this.position=r,this.line=i,this.column=n}YQ.prototype.getSnippet=function(e,r){var i,n,s,o,a;if(!this.buffer)return null;for(e=e||4,r=r||75,i="",n=this.position;n>0&&`\0\r -\x85\u2028\u2029`.indexOf(this.buffer.charAt(n-1))===-1;)if(n-=1,this.position-n>r/2-1){i=" ... ",n+=5;break}for(s="",o=this.position;or/2-1){s=" ... ",o-=5;break}return a=this.buffer.slice(n,o),BK.repeat(" ",e)+i+a+s+` -`+BK.repeat(" ",e+this.position-n+i.length)+"^"};YQ.prototype.toString=function(e){var r,i="";return this.name&&(i+='in "'+this.name+'" '),i+="at line "+(this.line+1)+", column "+(this.column+1),e||(r=this.getSnippet(),r&&(i+=`: -`+r)),i};wK.exports=YQ});var li=w((DZe,QK)=>{"use strict";var vK=Zu(),ghe=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],fhe=["scalar","sequence","mapping"];function hhe(t){var e={};return t!==null&&Object.keys(t).forEach(function(r){t[r].forEach(function(i){e[String(i)]=r})}),e}function phe(t,e){if(e=e||{},Object.keys(e).forEach(function(r){if(ghe.indexOf(r)===-1)throw new vK('Unknown option "'+r+'" is met in definition of "'+t+'" YAML type.')}),this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(r){return r},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.defaultStyle=e.defaultStyle||null,this.styleAliases=hhe(e.styleAliases||null),fhe.indexOf(this.kind)===-1)throw new vK('Unknown kind "'+this.kind+'" is specified for "'+t+'" YAML type.')}QK.exports=phe});var cc=w((RZe,SK)=>{"use strict";var kK=lc(),sI=Zu(),dhe=li();function qQ(t,e,r){var i=[];return t.include.forEach(function(n){r=qQ(n,e,r)}),t[e].forEach(function(n){r.forEach(function(s,o){s.tag===n.tag&&s.kind===n.kind&&i.push(o)}),r.push(n)}),r.filter(function(n,s){return i.indexOf(s)===-1})}function Che(){var t={scalar:{},sequence:{},mapping:{},fallback:{}},e,r;function i(n){t[n.kind][n.tag]=t.fallback[n.tag]=n}for(e=0,r=arguments.length;e{"use strict";var mhe=li();xK.exports=new mhe("tag:yaml.org,2002:str",{kind:"scalar",construct:function(t){return t!==null?t:""}})});var RK=w((NZe,DK)=>{"use strict";var Ehe=li();DK.exports=new Ehe("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(t){return t!==null?t:[]}})});var NK=w((LZe,FK)=>{"use strict";var Ihe=li();FK.exports=new Ihe("tag:yaml.org,2002:map",{kind:"mapping",construct:function(t){return t!==null?t:{}}})});var oI=w((TZe,LK)=>{"use strict";var yhe=cc();LK.exports=new yhe({explicit:[PK(),RK(),NK()]})});var OK=w((OZe,TK)=>{"use strict";var whe=li();function Bhe(t){if(t===null)return!0;var e=t.length;return e===1&&t==="~"||e===4&&(t==="null"||t==="Null"||t==="NULL")}function bhe(){return null}function Qhe(t){return t===null}TK.exports=new whe("tag:yaml.org,2002:null",{kind:"scalar",resolve:Bhe,construct:bhe,predicate:Qhe,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})});var KK=w((MZe,MK)=>{"use strict";var vhe=li();function She(t){if(t===null)return!1;var e=t.length;return e===4&&(t==="true"||t==="True"||t==="TRUE")||e===5&&(t==="false"||t==="False"||t==="FALSE")}function khe(t){return t==="true"||t==="True"||t==="TRUE"}function xhe(t){return Object.prototype.toString.call(t)==="[object Boolean]"}MK.exports=new vhe("tag:yaml.org,2002:bool",{kind:"scalar",resolve:She,construct:khe,predicate:xhe,represent:{lowercase:function(t){return t?"true":"false"},uppercase:function(t){return t?"TRUE":"FALSE"},camelcase:function(t){return t?"True":"False"}},defaultStyle:"lowercase"})});var HK=w((KZe,UK)=>{"use strict";var Phe=lc(),Dhe=li();function Rhe(t){return 48<=t&&t<=57||65<=t&&t<=70||97<=t&&t<=102}function Fhe(t){return 48<=t&&t<=55}function Nhe(t){return 48<=t&&t<=57}function Lhe(t){if(t===null)return!1;var e=t.length,r=0,i=!1,n;if(!e)return!1;if(n=t[r],(n==="-"||n==="+")&&(n=t[++r]),n==="0"){if(r+1===e)return!0;if(n=t[++r],n==="b"){for(r++;r=0?"0b"+t.toString(2):"-0b"+t.toString(2).slice(1)},octal:function(t){return t>=0?"0"+t.toString(8):"-0"+t.toString(8).slice(1)},decimal:function(t){return t.toString(10)},hexadecimal:function(t){return t>=0?"0x"+t.toString(16).toUpperCase():"-0x"+t.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})});var YK=w((UZe,GK)=>{"use strict";var jK=lc(),Mhe=li(),Khe=new RegExp("^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");function Uhe(t){return!(t===null||!Khe.test(t)||t[t.length-1]==="_")}function Hhe(t){var e,r,i,n;return e=t.replace(/_/g,"").toLowerCase(),r=e[0]==="-"?-1:1,n=[],"+-".indexOf(e[0])>=0&&(e=e.slice(1)),e===".inf"?r===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===".nan"?NaN:e.indexOf(":")>=0?(e.split(":").forEach(function(s){n.unshift(parseFloat(s,10))}),e=0,i=1,n.forEach(function(s){e+=s*i,i*=60}),r*e):r*parseFloat(e,10)}var Ghe=/^[-+]?[0-9]+e/;function jhe(t,e){var r;if(isNaN(t))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===t)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===t)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(jK.isNegativeZero(t))return"-0.0";return r=t.toString(10),Ghe.test(r)?r.replace("e",".e"):r}function Yhe(t){return Object.prototype.toString.call(t)==="[object Number]"&&(t%1!=0||jK.isNegativeZero(t))}GK.exports=new Mhe("tag:yaml.org,2002:float",{kind:"scalar",resolve:Uhe,construct:Hhe,predicate:Yhe,represent:jhe,defaultStyle:"lowercase"})});var JQ=w((HZe,qK)=>{"use strict";var qhe=cc();qK.exports=new qhe({include:[oI()],implicit:[OK(),KK(),HK(),YK()]})});var WQ=w((GZe,JK)=>{"use strict";var Jhe=cc();JK.exports=new Jhe({include:[JQ()]})});var VK=w((jZe,WK)=>{"use strict";var Whe=li(),zK=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),_K=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function zhe(t){return t===null?!1:zK.exec(t)!==null||_K.exec(t)!==null}function _he(t){var e,r,i,n,s,o,a,l=0,c=null,u,g,f;if(e=zK.exec(t),e===null&&(e=_K.exec(t)),e===null)throw new Error("Date resolve error");if(r=+e[1],i=+e[2]-1,n=+e[3],!e[4])return new Date(Date.UTC(r,i,n));if(s=+e[4],o=+e[5],a=+e[6],e[7]){for(l=e[7].slice(0,3);l.length<3;)l+="0";l=+l}return e[9]&&(u=+e[10],g=+(e[11]||0),c=(u*60+g)*6e4,e[9]==="-"&&(c=-c)),f=new Date(Date.UTC(r,i,n,s,o,a,l)),c&&f.setTime(f.getTime()-c),f}function Vhe(t){return t.toISOString()}WK.exports=new Whe("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:zhe,construct:_he,instanceOf:Date,represent:Vhe})});var ZK=w((YZe,XK)=>{"use strict";var Xhe=li();function Zhe(t){return t==="<<"||t===null}XK.exports=new Xhe("tag:yaml.org,2002:merge",{kind:"scalar",resolve:Zhe})});var t1=w((qZe,$K)=>{"use strict";var uc;try{e1=require,uc=e1("buffer").Buffer}catch(t){}var e1,$he=li(),zQ=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= -\r`;function epe(t){if(t===null)return!1;var e,r,i=0,n=t.length,s=zQ;for(r=0;r64)){if(e<0)return!1;i+=6}return i%8==0}function tpe(t){var e,r,i=t.replace(/[\r\n=]/g,""),n=i.length,s=zQ,o=0,a=[];for(e=0;e>16&255),a.push(o>>8&255),a.push(o&255)),o=o<<6|s.indexOf(i.charAt(e));return r=n%4*6,r===0?(a.push(o>>16&255),a.push(o>>8&255),a.push(o&255)):r===18?(a.push(o>>10&255),a.push(o>>2&255)):r===12&&a.push(o>>4&255),uc?uc.from?uc.from(a):new uc(a):a}function rpe(t){var e="",r=0,i,n,s=t.length,o=zQ;for(i=0;i>18&63],e+=o[r>>12&63],e+=o[r>>6&63],e+=o[r&63]),r=(r<<8)+t[i];return n=s%3,n===0?(e+=o[r>>18&63],e+=o[r>>12&63],e+=o[r>>6&63],e+=o[r&63]):n===2?(e+=o[r>>10&63],e+=o[r>>4&63],e+=o[r<<2&63],e+=o[64]):n===1&&(e+=o[r>>2&63],e+=o[r<<4&63],e+=o[64],e+=o[64]),e}function ipe(t){return uc&&uc.isBuffer(t)}$K.exports=new $he("tag:yaml.org,2002:binary",{kind:"scalar",resolve:epe,construct:tpe,predicate:ipe,represent:rpe})});var i1=w((JZe,r1)=>{"use strict";var npe=li(),spe=Object.prototype.hasOwnProperty,ope=Object.prototype.toString;function ape(t){if(t===null)return!0;var e=[],r,i,n,s,o,a=t;for(r=0,i=a.length;r{"use strict";var lpe=li(),cpe=Object.prototype.toString;function upe(t){if(t===null)return!0;var e,r,i,n,s,o=t;for(s=new Array(o.length),e=0,r=o.length;e{"use strict";var fpe=li(),hpe=Object.prototype.hasOwnProperty;function ppe(t){if(t===null)return!0;var e,r=t;for(e in r)if(hpe.call(r,e)&&r[e]!==null)return!1;return!0}function dpe(t){return t!==null?t:{}}o1.exports=new fpe("tag:yaml.org,2002:set",{kind:"mapping",resolve:ppe,construct:dpe})});var eg=w((_Ze,A1)=>{"use strict";var Cpe=cc();A1.exports=new Cpe({include:[WQ()],implicit:[VK(),ZK()],explicit:[t1(),i1(),s1(),a1()]})});var c1=w((VZe,l1)=>{"use strict";var mpe=li();function Epe(){return!0}function Ipe(){}function ype(){return""}function wpe(t){return typeof t=="undefined"}l1.exports=new mpe("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:Epe,construct:Ipe,predicate:wpe,represent:ype})});var g1=w((XZe,u1)=>{"use strict";var Bpe=li();function bpe(t){if(t===null||t.length===0)return!1;var e=t,r=/\/([gim]*)$/.exec(t),i="";return!(e[0]==="/"&&(r&&(i=r[1]),i.length>3||e[e.length-i.length-1]!=="/"))}function Qpe(t){var e=t,r=/\/([gim]*)$/.exec(t),i="";return e[0]==="/"&&(r&&(i=r[1]),e=e.slice(1,e.length-i.length-1)),new RegExp(e,i)}function vpe(t){var e="/"+t.source+"/";return t.global&&(e+="g"),t.multiline&&(e+="m"),t.ignoreCase&&(e+="i"),e}function Spe(t){return Object.prototype.toString.call(t)==="[object RegExp]"}u1.exports=new Bpe("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:bpe,construct:Qpe,predicate:Spe,represent:vpe})});var p1=w((ZZe,f1)=>{"use strict";var aI;try{h1=require,aI=h1("esprima")}catch(t){typeof window!="undefined"&&(aI=window.esprima)}var h1,kpe=li();function xpe(t){if(t===null)return!1;try{var e="("+t+")",r=aI.parse(e,{range:!0});return!(r.type!=="Program"||r.body.length!==1||r.body[0].type!=="ExpressionStatement"||r.body[0].expression.type!=="ArrowFunctionExpression"&&r.body[0].expression.type!=="FunctionExpression")}catch(i){return!1}}function Ppe(t){var e="("+t+")",r=aI.parse(e,{range:!0}),i=[],n;if(r.type!=="Program"||r.body.length!==1||r.body[0].type!=="ExpressionStatement"||r.body[0].expression.type!=="ArrowFunctionExpression"&&r.body[0].expression.type!=="FunctionExpression")throw new Error("Failed to resolve function");return r.body[0].expression.params.forEach(function(s){i.push(s.name)}),n=r.body[0].expression.body.range,r.body[0].expression.body.type==="BlockStatement"?new Function(i,e.slice(n[0]+1,n[1]-1)):new Function(i,"return "+e.slice(n[0],n[1]))}function Dpe(t){return t.toString()}function Rpe(t){return Object.prototype.toString.call(t)==="[object Function]"}f1.exports=new kpe("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:xpe,construct:Ppe,predicate:Rpe,represent:Dpe})});var rp=w(($Ze,d1)=>{"use strict";var C1=cc();d1.exports=C1.DEFAULT=new C1({include:[eg()],explicit:[c1(),g1(),p1()]})});var T1=w((e$e,ip)=>{"use strict";var Na=lc(),m1=Zu(),Fpe=bK(),E1=eg(),Npe=rp(),GA=Object.prototype.hasOwnProperty,AI=1,I1=2,y1=3,lI=4,_Q=1,Lpe=2,w1=3,Tpe=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,Ope=/[\x85\u2028\u2029]/,Mpe=/[,\[\]\{\}]/,B1=/^(?:!|!!|![a-z\-]+!)$/i,b1=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function Q1(t){return Object.prototype.toString.call(t)}function Ro(t){return t===10||t===13}function gc(t){return t===9||t===32}function yn(t){return t===9||t===32||t===10||t===13}function tg(t){return t===44||t===91||t===93||t===123||t===125}function Kpe(t){var e;return 48<=t&&t<=57?t-48:(e=t|32,97<=e&&e<=102?e-97+10:-1)}function Upe(t){return t===120?2:t===117?4:t===85?8:0}function Hpe(t){return 48<=t&&t<=57?t-48:-1}function v1(t){return t===48?"\0":t===97?"\x07":t===98?"\b":t===116||t===9?" ":t===110?` -`:t===118?"\v":t===102?"\f":t===114?"\r":t===101?"":t===32?" ":t===34?'"':t===47?"/":t===92?"\\":t===78?"\x85":t===95?"\xA0":t===76?"\u2028":t===80?"\u2029":""}function Gpe(t){return t<=65535?String.fromCharCode(t):String.fromCharCode((t-65536>>10)+55296,(t-65536&1023)+56320)}var S1=new Array(256),k1=new Array(256);for(var rg=0;rg<256;rg++)S1[rg]=v1(rg)?1:0,k1[rg]=v1(rg);function jpe(t,e){this.input=t,this.filename=e.filename||null,this.schema=e.schema||Npe,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=t.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function x1(t,e){return new m1(e,new Fpe(t.filename,t.input,t.position,t.line,t.position-t.lineStart))}function dt(t,e){throw x1(t,e)}function cI(t,e){t.onWarning&&t.onWarning.call(null,x1(t,e))}var P1={YAML:function(e,r,i){var n,s,o;e.version!==null&&dt(e,"duplication of %YAML directive"),i.length!==1&&dt(e,"YAML directive accepts exactly one argument"),n=/^([0-9]+)\.([0-9]+)$/.exec(i[0]),n===null&&dt(e,"ill-formed argument of the YAML directive"),s=parseInt(n[1],10),o=parseInt(n[2],10),s!==1&&dt(e,"unacceptable YAML version of the document"),e.version=i[0],e.checkLineBreaks=o<2,o!==1&&o!==2&&cI(e,"unsupported YAML version of the document")},TAG:function(e,r,i){var n,s;i.length!==2&&dt(e,"TAG directive accepts exactly two arguments"),n=i[0],s=i[1],B1.test(n)||dt(e,"ill-formed tag handle (first argument) of the TAG directive"),GA.call(e.tagMap,n)&&dt(e,'there is a previously declared suffix for "'+n+'" tag handle'),b1.test(s)||dt(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[n]=s}};function jA(t,e,r,i){var n,s,o,a;if(e1&&(t.result+=Na.repeat(` -`,e-1))}function Ype(t,e,r){var i,n,s,o,a,l,c,u,g=t.kind,f=t.result,h;if(h=t.input.charCodeAt(t.position),yn(h)||tg(h)||h===35||h===38||h===42||h===33||h===124||h===62||h===39||h===34||h===37||h===64||h===96||(h===63||h===45)&&(n=t.input.charCodeAt(t.position+1),yn(n)||r&&tg(n)))return!1;for(t.kind="scalar",t.result="",s=o=t.position,a=!1;h!==0;){if(h===58){if(n=t.input.charCodeAt(t.position+1),yn(n)||r&&tg(n))break}else if(h===35){if(i=t.input.charCodeAt(t.position-1),yn(i))break}else{if(t.position===t.lineStart&&uI(t)||r&&tg(h))break;if(Ro(h))if(l=t.line,c=t.lineStart,u=t.lineIndent,ei(t,!1,-1),t.lineIndent>=e){a=!0,h=t.input.charCodeAt(t.position);continue}else{t.position=o,t.line=l,t.lineStart=c,t.lineIndent=u;break}}a&&(jA(t,s,o,!1),XQ(t,t.line-l),s=o=t.position,a=!1),gc(h)||(o=t.position+1),h=t.input.charCodeAt(++t.position)}return jA(t,s,o,!1),t.result?!0:(t.kind=g,t.result=f,!1)}function qpe(t,e){var r,i,n;if(r=t.input.charCodeAt(t.position),r!==39)return!1;for(t.kind="scalar",t.result="",t.position++,i=n=t.position;(r=t.input.charCodeAt(t.position))!==0;)if(r===39)if(jA(t,i,t.position,!0),r=t.input.charCodeAt(++t.position),r===39)i=t.position,t.position++,n=t.position;else return!0;else Ro(r)?(jA(t,i,n,!0),XQ(t,ei(t,!1,e)),i=n=t.position):t.position===t.lineStart&&uI(t)?dt(t,"unexpected end of the document within a single quoted scalar"):(t.position++,n=t.position);dt(t,"unexpected end of the stream within a single quoted scalar")}function Jpe(t,e){var r,i,n,s,o,a;if(a=t.input.charCodeAt(t.position),a!==34)return!1;for(t.kind="scalar",t.result="",t.position++,r=i=t.position;(a=t.input.charCodeAt(t.position))!==0;){if(a===34)return jA(t,r,t.position,!0),t.position++,!0;if(a===92){if(jA(t,r,t.position,!0),a=t.input.charCodeAt(++t.position),Ro(a))ei(t,!1,e);else if(a<256&&S1[a])t.result+=k1[a],t.position++;else if((o=Upe(a))>0){for(n=o,s=0;n>0;n--)a=t.input.charCodeAt(++t.position),(o=Kpe(a))>=0?s=(s<<4)+o:dt(t,"expected hexadecimal character");t.result+=Gpe(s),t.position++}else dt(t,"unknown escape sequence");r=i=t.position}else Ro(a)?(jA(t,r,i,!0),XQ(t,ei(t,!1,e)),r=i=t.position):t.position===t.lineStart&&uI(t)?dt(t,"unexpected end of the document within a double quoted scalar"):(t.position++,i=t.position)}dt(t,"unexpected end of the stream within a double quoted scalar")}function Wpe(t,e){var r=!0,i,n=t.tag,s,o=t.anchor,a,l,c,u,g,f={},h,p,m,y;if(y=t.input.charCodeAt(t.position),y===91)l=93,g=!1,s=[];else if(y===123)l=125,g=!0,s={};else return!1;for(t.anchor!==null&&(t.anchorMap[t.anchor]=s),y=t.input.charCodeAt(++t.position);y!==0;){if(ei(t,!0,e),y=t.input.charCodeAt(t.position),y===l)return t.position++,t.tag=n,t.anchor=o,t.kind=g?"mapping":"sequence",t.result=s,!0;r||dt(t,"missed comma between flow collection entries"),p=h=m=null,c=u=!1,y===63&&(a=t.input.charCodeAt(t.position+1),yn(a)&&(c=u=!0,t.position++,ei(t,!0,e))),i=t.line,ng(t,e,AI,!1,!0),p=t.tag,h=t.result,ei(t,!0,e),y=t.input.charCodeAt(t.position),(u||t.line===i)&&y===58&&(c=!0,y=t.input.charCodeAt(++t.position),ei(t,!0,e),ng(t,e,AI,!1,!0),m=t.result),g?ig(t,s,f,p,h,m):c?s.push(ig(t,null,f,p,h,m)):s.push(h),ei(t,!0,e),y=t.input.charCodeAt(t.position),y===44?(r=!0,y=t.input.charCodeAt(++t.position)):r=!1}dt(t,"unexpected end of the stream within a flow collection")}function zpe(t,e){var r,i,n=_Q,s=!1,o=!1,a=e,l=0,c=!1,u,g;if(g=t.input.charCodeAt(t.position),g===124)i=!1;else if(g===62)i=!0;else return!1;for(t.kind="scalar",t.result="";g!==0;)if(g=t.input.charCodeAt(++t.position),g===43||g===45)_Q===n?n=g===43?w1:Lpe:dt(t,"repeat of a chomping mode identifier");else if((u=Hpe(g))>=0)u===0?dt(t,"bad explicit indentation width of a block scalar; it cannot be less than one"):o?dt(t,"repeat of an indentation width identifier"):(a=e+u-1,o=!0);else break;if(gc(g)){do g=t.input.charCodeAt(++t.position);while(gc(g));if(g===35)do g=t.input.charCodeAt(++t.position);while(!Ro(g)&&g!==0)}for(;g!==0;){for(VQ(t),t.lineIndent=0,g=t.input.charCodeAt(t.position);(!o||t.lineIndenta&&(a=t.lineIndent),Ro(g)){l++;continue}if(t.lineIndente)&&l!==0)dt(t,"bad indentation of a sequence entry");else if(t.lineIndente)&&(ng(t,e,lI,!0,n)&&(p?f=t.result:h=t.result),p||(ig(t,c,u,g,f,h,s,o),g=f=h=null),ei(t,!0,-1),y=t.input.charCodeAt(t.position)),t.lineIndent>e&&y!==0)dt(t,"bad indentation of a mapping entry");else if(t.lineIndente?l=1:t.lineIndent===e?l=0:t.lineIndente?l=1:t.lineIndent===e?l=0:t.lineIndent tag; it should be "scalar", not "'+t.kind+'"'),g=0,f=t.implicitTypes.length;g tag; it should be "'+h.kind+'", not "'+t.kind+'"'),h.resolve(t.result)?(t.result=h.construct(t.result),t.anchor!==null&&(t.anchorMap[t.anchor]=t.result)):dt(t,"cannot resolve a node with !<"+t.tag+"> explicit tag")):dt(t,"unknown tag !<"+t.tag+">");return t.listener!==null&&t.listener("close",t),t.tag!==null||t.anchor!==null||u}function $pe(t){var e=t.position,r,i,n,s=!1,o;for(t.version=null,t.checkLineBreaks=t.legacy,t.tagMap={},t.anchorMap={};(o=t.input.charCodeAt(t.position))!==0&&(ei(t,!0,-1),o=t.input.charCodeAt(t.position),!(t.lineIndent>0||o!==37));){for(s=!0,o=t.input.charCodeAt(++t.position),r=t.position;o!==0&&!yn(o);)o=t.input.charCodeAt(++t.position);for(i=t.input.slice(r,t.position),n=[],i.length<1&&dt(t,"directive name must not be less than one character in length");o!==0;){for(;gc(o);)o=t.input.charCodeAt(++t.position);if(o===35){do o=t.input.charCodeAt(++t.position);while(o!==0&&!Ro(o));break}if(Ro(o))break;for(r=t.position;o!==0&&!yn(o);)o=t.input.charCodeAt(++t.position);n.push(t.input.slice(r,t.position))}o!==0&&VQ(t),GA.call(P1,i)?P1[i](t,i,n):cI(t,'unknown document directive "'+i+'"')}if(ei(t,!0,-1),t.lineIndent===0&&t.input.charCodeAt(t.position)===45&&t.input.charCodeAt(t.position+1)===45&&t.input.charCodeAt(t.position+2)===45?(t.position+=3,ei(t,!0,-1)):s&&dt(t,"directives end mark is expected"),ng(t,t.lineIndent-1,lI,!1,!0),ei(t,!0,-1),t.checkLineBreaks&&Ope.test(t.input.slice(e,t.position))&&cI(t,"non-ASCII line breaks are interpreted as content"),t.documents.push(t.result),t.position===t.lineStart&&uI(t)){t.input.charCodeAt(t.position)===46&&(t.position+=3,ei(t,!0,-1));return}if(t.position{"use strict";var np=lc(),sp=Zu(),rde=rp(),ide=eg(),O1=Object.prototype.toString,M1=Object.prototype.hasOwnProperty,nde=9,op=10,sde=13,ode=32,ade=33,Ade=34,K1=35,lde=37,cde=38,ude=39,gde=42,U1=44,fde=45,H1=58,hde=61,pde=62,dde=63,Cde=64,G1=91,j1=93,mde=96,Y1=123,Ede=124,q1=125,Ki={};Ki[0]="\\0";Ki[7]="\\a";Ki[8]="\\b";Ki[9]="\\t";Ki[10]="\\n";Ki[11]="\\v";Ki[12]="\\f";Ki[13]="\\r";Ki[27]="\\e";Ki[34]='\\"';Ki[92]="\\\\";Ki[133]="\\N";Ki[160]="\\_";Ki[8232]="\\L";Ki[8233]="\\P";var Ide=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"];function yde(t,e){var r,i,n,s,o,a,l;if(e===null)return{};for(r={},i=Object.keys(e),n=0,s=i.length;n0?t.charCodeAt(s-1):null,f=f&&z1(o,a)}else{for(s=0;si&&t[g+1]!==" ",g=s);else if(!sg(o))return gI;a=s>0?t.charCodeAt(s-1):null,f=f&&z1(o,a)}c=c||u&&s-g-1>i&&t[g+1]!==" "}return!l&&!c?f&&!n(t)?V1:X1:r>9&&_1(t)?gI:c?$1:Z1}function xde(t,e,r,i){t.dump=function(){if(e.length===0)return"''";if(!t.noCompatMode&&Ide.indexOf(e)!==-1)return"'"+e+"'";var n=t.indent*Math.max(1,r),s=t.lineWidth===-1?-1:Math.max(Math.min(t.lineWidth,40),t.lineWidth-n),o=i||t.flowLevel>-1&&r>=t.flowLevel;function a(l){return Bde(t,l)}switch(vde(e,o,t.indent,s,a)){case V1:return e;case X1:return"'"+e.replace(/'/g,"''")+"'";case Z1:return"|"+eU(e,t.indent)+tU(W1(e,n));case $1:return">"+eU(e,t.indent)+tU(W1(Sde(e,s),n));case gI:return'"'+kde(e,s)+'"';default:throw new sp("impossible error: invalid scalar style")}}()}function eU(t,e){var r=_1(t)?String(e):"",i=t[t.length-1]===` -`,n=i&&(t[t.length-2]===` -`||t===` -`),s=n?"+":i?"":"-";return r+s+` -`}function tU(t){return t[t.length-1]===` -`?t.slice(0,-1):t}function Sde(t,e){for(var r=/(\n+)([^\n]*)/g,i=function(){var c=t.indexOf(` -`);return c=c!==-1?c:t.length,r.lastIndex=c,rU(t.slice(0,c),e)}(),n=t[0]===` -`||t[0]===" ",s,o;o=r.exec(t);){var a=o[1],l=o[2];s=l[0]===" ",i+=a+(!n&&!s&&l!==""?` -`:"")+rU(l,e),n=s}return i}function rU(t,e){if(t===""||t[0]===" ")return t;for(var r=/ [^ ]/g,i,n=0,s,o=0,a=0,l="";i=r.exec(t);)a=i.index,a-n>e&&(s=o>n?o:a,l+=` -`+t.slice(n,s),n=s+1),o=a;return l+=` -`,t.length-n>e&&o>n?l+=t.slice(n,o)+` -`+t.slice(o+1):l+=t.slice(n),l.slice(1)}function kde(t){for(var e="",r,i,n,s=0;s=55296&&r<=56319&&(i=t.charCodeAt(s+1),i>=56320&&i<=57343)){e+=J1((r-55296)*1024+i-56320+65536),s++;continue}n=Ki[r],e+=!n&&sg(r)?t[s]:n||J1(r)}return e}function Pde(t,e,r){var i="",n=t.tag,s,o;for(s=0,o=r.length;s1024&&(u+="? "),u+=t.dump+(t.condenseFlow?'"':"")+":"+(t.condenseFlow?"":" "),!!fc(t,e,c,!1,!1)&&(u+=t.dump,i+=u));t.tag=n,t.dump="{"+i+"}"}function Fde(t,e,r,i){var n="",s=t.tag,o=Object.keys(r),a,l,c,u,g,f;if(t.sortKeys===!0)o.sort();else if(typeof t.sortKeys=="function")o.sort(t.sortKeys);else if(t.sortKeys)throw new sp("sortKeys must be a boolean or a function");for(a=0,l=o.length;a1024,g&&(t.dump&&op===t.dump.charCodeAt(0)?f+="?":f+="? "),f+=t.dump,g&&(f+=$Q(t,e)),!!fc(t,e+1,u,!0,g)&&(t.dump&&op===t.dump.charCodeAt(0)?f+=":":f+=": ",f+=t.dump,n+=f));t.tag=s,t.dump=n||"{}"}function iU(t,e,r){var i,n,s,o,a,l;for(n=r?t.explicitTypes:t.implicitTypes,s=0,o=n.length;s tag resolver accepts not "'+l+'" style');t.dump=i}return!0}return!1}function fc(t,e,r,i,n,s){t.tag=null,t.dump=r,iU(t,r,!1)||iU(t,r,!0);var o=O1.call(t.dump);i&&(i=t.flowLevel<0||t.flowLevel>e);var a=o==="[object Object]"||o==="[object Array]",l,c;if(a&&(l=t.duplicates.indexOf(r),c=l!==-1),(t.tag!==null&&t.tag!=="?"||c||t.indent!==2&&e>0)&&(n=!1),c&&t.usedDuplicates[l])t.dump="*ref_"+l;else{if(a&&c&&!t.usedDuplicates[l]&&(t.usedDuplicates[l]=!0),o==="[object Object]")i&&Object.keys(t.dump).length!==0?(Fde(t,e,t.dump,n),c&&(t.dump="&ref_"+l+t.dump)):(Rde(t,e,t.dump),c&&(t.dump="&ref_"+l+" "+t.dump));else if(o==="[object Array]"){var u=t.noArrayIndent&&e>0?e-1:e;i&&t.dump.length!==0?(Dde(t,u,t.dump,n),c&&(t.dump="&ref_"+l+t.dump)):(Pde(t,u,t.dump),c&&(t.dump="&ref_"+l+" "+t.dump))}else if(o==="[object String]")t.tag!=="?"&&xde(t,t.dump,e,s);else{if(t.skipInvalid)return!1;throw new sp("unacceptable kind of an object to dump "+o)}t.tag!==null&&t.tag!=="?"&&(t.dump="!<"+t.tag+"> "+t.dump)}return!0}function Nde(t,e){var r=[],i=[],n,s;for(tv(t,r,i),n=0,s=i.length;n{"use strict";var fI=T1(),oU=sU();function hI(t){return function(){throw new Error("Function "+t+" is deprecated and cannot be used.")}}Or.exports.Type=li();Or.exports.Schema=cc();Or.exports.FAILSAFE_SCHEMA=oI();Or.exports.JSON_SCHEMA=JQ();Or.exports.CORE_SCHEMA=WQ();Or.exports.DEFAULT_SAFE_SCHEMA=eg();Or.exports.DEFAULT_FULL_SCHEMA=rp();Or.exports.load=fI.load;Or.exports.loadAll=fI.loadAll;Or.exports.safeLoad=fI.safeLoad;Or.exports.safeLoadAll=fI.safeLoadAll;Or.exports.dump=oU.dump;Or.exports.safeDump=oU.safeDump;Or.exports.YAMLException=Zu();Or.exports.MINIMAL_SCHEMA=oI();Or.exports.SAFE_SCHEMA=eg();Or.exports.DEFAULT_SCHEMA=rp();Or.exports.scan=hI("scan");Or.exports.parse=hI("parse");Or.exports.compose=hI("compose");Or.exports.addConstructor=hI("addConstructor")});var lU=w((i$e,AU)=>{"use strict";var Tde=aU();AU.exports=Tde});var uU=w((n$e,cU)=>{"use strict";function Ode(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function hc(t,e,r,i){this.message=t,this.expected=e,this.found=r,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,hc)}Ode(hc,Error);hc.buildMessage=function(t,e){var r={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;g({[Ge]:me})))},Y=function(R){return R},j=function(R){return R},Z=Xs("correct indentation"),J=" ",re=gr(" ",!1),ee=function(R){return R.length===TA*Yu},A=function(R){return R.length===(TA+1)*Yu},oe=function(){return TA++,!0},le=function(){return TA--,!0},X=function(){return Mu()},O=Xs("pseudostring"),L=/^[^\r\n\t ?:,\][{}#&*!|>'"%@`\-]/,pe=qn(["\r",` -`," "," ","?",":",",","]","[","{","}","#","&","*","!","|",">","'",'"',"%","@","`","-"],!0,!1),Ce=/^[^\r\n\t ,\][{}:#"']/,Oe=qn(["\r",` -`," "," ",",","]","[","{","}",":","#",'"',"'"],!0,!1),te=function(){return Mu().replace(/^ *| *$/g,"")},se="--",be=gr("--",!1),he=/^[a-zA-Z\/0-9]/,Fe=qn([["a","z"],["A","Z"],"/",["0","9"]],!1,!1),Ue=/^[^\r\n\t :,]/,xe=qn(["\r",` -`," "," ",":",","],!0,!1),Se="null",de=gr("null",!1),V=function(){return null},Qe="true",ce=gr("true",!1),fe=function(){return!0},gt="false",Ht=gr("false",!1),Mt=function(){return!1},mi=Xs("string"),Gt='"',Qr=gr('"',!1),Ti=function(){return""},Vs=function(R){return R},Un=function(R){return R.join("")},Hn=/^[^"\\\0-\x1F\x7F]/,vr=qn(['"',"\\",["\0",""],"\x7F"],!0,!1),Gn='\\"',gs=gr('\\"',!1),ya=function(){return'"'},kA="\\\\",Ru=gr("\\\\",!1),fs=function(){return"\\"},xA="\\/",wa=gr("\\/",!1),Fu=function(){return"/"},PA="\\b",DA=gr("\\b",!1),Sr=function(){return"\b"},jl="\\f",Nu=gr("\\f",!1),So=function(){return"\f"},Lu="\\n",Sh=gr("\\n",!1),kh=function(){return` -`},ae="\\r",Oi=gr("\\r",!1),ko=function(){return"\r"},jn="\\t",Tu=gr("\\t",!1),vt=function(){return" "},Yl="\\u",Yn=gr("\\u",!1),hs=function(R,q,me,Ge){return String.fromCharCode(parseInt(`0x${R}${q}${me}${Ge}`))},ps=/^[0-9a-fA-F]/,pt=qn([["0","9"],["a","f"],["A","F"]],!1,!1),xo=Xs("blank space"),lt=/^[ \t]/,mn=qn([" "," "],!1,!1),v=Xs("white space"),Tt=/^[ \t\n\r]/,Ou=qn([" "," ",` -`,"\r"],!1,!1),ql=`\r -`,xh=gr(`\r -`,!1),Ph=` -`,Dh=gr(` -`,!1),Rh="\r",Fh=gr("\r",!1),G=0,yt=0,RA=[{line:1,column:1}],$i=0,Jl=[],$e=0,Ba;if("startRule"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');n=i[e.startRule]}function Mu(){return t.substring(yt,G)}function kE(){return En(yt,G)}function Nh(R,q){throw q=q!==void 0?q:En(yt,G),zl([Xs(R)],t.substring(yt,G),q)}function xE(R,q){throw q=q!==void 0?q:En(yt,G),Ku(R,q)}function gr(R,q){return{type:"literal",text:R,ignoreCase:q}}function qn(R,q,me){return{type:"class",parts:R,inverted:q,ignoreCase:me}}function Wl(){return{type:"any"}}function Lh(){return{type:"end"}}function Xs(R){return{type:"other",description:R}}function ba(R){var q=RA[R],me;if(q)return q;for(me=R-1;!RA[me];)me--;for(q=RA[me],q={line:q.line,column:q.column};me$i&&($i=G,Jl=[]),Jl.push(R))}function Ku(R,q){return new hc(R,null,null,q)}function zl(R,q,me){return new hc(hc.buildMessage(R,q),R,q,me)}function Zs(){var R;return R=Uu(),R}function _l(){var R,q,me;for(R=G,q=[],me=FA();me!==r;)q.push(me),me=FA();return q!==r&&(yt=R,q=s(q)),R=q,R}function FA(){var R,q,me,Ge,Te;return R=G,q=va(),q!==r?(t.charCodeAt(G)===45?(me=o,G++):(me=r,$e===0&&Me(a)),me!==r?(Ge=Lr(),Ge!==r?(Te=Qa(),Te!==r?(yt=R,q=l(Te),R=q):(G=R,R=r)):(G=R,R=r)):(G=R,R=r)):(G=R,R=r),R}function Uu(){var R,q,me;for(R=G,q=[],me=Hu();me!==r;)q.push(me),me=Hu();return q!==r&&(yt=R,q=c(q)),R=q,R}function Hu(){var R,q,me,Ge,Te,Xe,Et,Rt,Jn;if(R=G,q=Lr(),q===r&&(q=null),q!==r){if(me=G,t.charCodeAt(G)===35?(Ge=u,G++):(Ge=r,$e===0&&Me(g)),Ge!==r){if(Te=[],Xe=G,Et=G,$e++,Rt=to(),$e--,Rt===r?Et=void 0:(G=Et,Et=r),Et!==r?(t.length>G?(Rt=t.charAt(G),G++):(Rt=r,$e===0&&Me(f)),Rt!==r?(Et=[Et,Rt],Xe=Et):(G=Xe,Xe=r)):(G=Xe,Xe=r),Xe!==r)for(;Xe!==r;)Te.push(Xe),Xe=G,Et=G,$e++,Rt=to(),$e--,Rt===r?Et=void 0:(G=Et,Et=r),Et!==r?(t.length>G?(Rt=t.charAt(G),G++):(Rt=r,$e===0&&Me(f)),Rt!==r?(Et=[Et,Rt],Xe=Et):(G=Xe,Xe=r)):(G=Xe,Xe=r);else Te=r;Te!==r?(Ge=[Ge,Te],me=Ge):(G=me,me=r)}else G=me,me=r;if(me===r&&(me=null),me!==r){if(Ge=[],Te=eo(),Te!==r)for(;Te!==r;)Ge.push(Te),Te=eo();else Ge=r;Ge!==r?(yt=R,q=h(),R=q):(G=R,R=r)}else G=R,R=r}else G=R,R=r;if(R===r&&(R=G,q=va(),q!==r?(me=Vl(),me!==r?(Ge=Lr(),Ge===r&&(Ge=null),Ge!==r?(t.charCodeAt(G)===58?(Te=p,G++):(Te=r,$e===0&&Me(m)),Te!==r?(Xe=Lr(),Xe===r&&(Xe=null),Xe!==r?(Et=Qa(),Et!==r?(yt=R,q=y(me,Et),R=q):(G=R,R=r)):(G=R,R=r)):(G=R,R=r)):(G=R,R=r)):(G=R,R=r)):(G=R,R=r),R===r&&(R=G,q=va(),q!==r?(me=$s(),me!==r?(Ge=Lr(),Ge===r&&(Ge=null),Ge!==r?(t.charCodeAt(G)===58?(Te=p,G++):(Te=r,$e===0&&Me(m)),Te!==r?(Xe=Lr(),Xe===r&&(Xe=null),Xe!==r?(Et=Qa(),Et!==r?(yt=R,q=y(me,Et),R=q):(G=R,R=r)):(G=R,R=r)):(G=R,R=r)):(G=R,R=r)):(G=R,R=r)):(G=R,R=r),R===r))){if(R=G,q=va(),q!==r)if(me=$s(),me!==r)if(Ge=Lr(),Ge!==r)if(Te=PE(),Te!==r){if(Xe=[],Et=eo(),Et!==r)for(;Et!==r;)Xe.push(Et),Et=eo();else Xe=r;Xe!==r?(yt=R,q=y(me,Te),R=q):(G=R,R=r)}else G=R,R=r;else G=R,R=r;else G=R,R=r;else G=R,R=r;if(R===r)if(R=G,q=va(),q!==r)if(me=$s(),me!==r){if(Ge=[],Te=G,Xe=Lr(),Xe===r&&(Xe=null),Xe!==r?(t.charCodeAt(G)===44?(Et=b,G++):(Et=r,$e===0&&Me(S)),Et!==r?(Rt=Lr(),Rt===r&&(Rt=null),Rt!==r?(Jn=$s(),Jn!==r?(yt=Te,Xe=k(me,Jn),Te=Xe):(G=Te,Te=r)):(G=Te,Te=r)):(G=Te,Te=r)):(G=Te,Te=r),Te!==r)for(;Te!==r;)Ge.push(Te),Te=G,Xe=Lr(),Xe===r&&(Xe=null),Xe!==r?(t.charCodeAt(G)===44?(Et=b,G++):(Et=r,$e===0&&Me(S)),Et!==r?(Rt=Lr(),Rt===r&&(Rt=null),Rt!==r?(Jn=$s(),Jn!==r?(yt=Te,Xe=k(me,Jn),Te=Xe):(G=Te,Te=r)):(G=Te,Te=r)):(G=Te,Te=r)):(G=Te,Te=r);else Ge=r;Ge!==r?(Te=Lr(),Te===r&&(Te=null),Te!==r?(t.charCodeAt(G)===58?(Xe=p,G++):(Xe=r,$e===0&&Me(m)),Xe!==r?(Et=Lr(),Et===r&&(Et=null),Et!==r?(Rt=Qa(),Rt!==r?(yt=R,q=T(me,Ge,Rt),R=q):(G=R,R=r)):(G=R,R=r)):(G=R,R=r)):(G=R,R=r)):(G=R,R=r)}else G=R,R=r;else G=R,R=r}return R}function Qa(){var R,q,me,Ge,Te,Xe,Et;if(R=G,q=G,$e++,me=G,Ge=to(),Ge!==r?(Te=it(),Te!==r?(t.charCodeAt(G)===45?(Xe=o,G++):(Xe=r,$e===0&&Me(a)),Xe!==r?(Et=Lr(),Et!==r?(Ge=[Ge,Te,Xe,Et],me=Ge):(G=me,me=r)):(G=me,me=r)):(G=me,me=r)):(G=me,me=r),$e--,me!==r?(G=q,q=void 0):q=r,q!==r?(me=eo(),me!==r?(Ge=Po(),Ge!==r?(Te=_l(),Te!==r?(Xe=NA(),Xe!==r?(yt=R,q=Y(Te),R=q):(G=R,R=r)):(G=R,R=r)):(G=R,R=r)):(G=R,R=r)):(G=R,R=r),R===r&&(R=G,q=to(),q!==r?(me=Po(),me!==r?(Ge=Uu(),Ge!==r?(Te=NA(),Te!==r?(yt=R,q=Y(Ge),R=q):(G=R,R=r)):(G=R,R=r)):(G=R,R=r)):(G=R,R=r),R===r))if(R=G,q=Xl(),q!==r){if(me=[],Ge=eo(),Ge!==r)for(;Ge!==r;)me.push(Ge),Ge=eo();else me=r;me!==r?(yt=R,q=j(q),R=q):(G=R,R=r)}else G=R,R=r;return R}function va(){var R,q,me;for($e++,R=G,q=[],t.charCodeAt(G)===32?(me=J,G++):(me=r,$e===0&&Me(re));me!==r;)q.push(me),t.charCodeAt(G)===32?(me=J,G++):(me=r,$e===0&&Me(re));return q!==r?(yt=G,me=ee(q),me?me=void 0:me=r,me!==r?(q=[q,me],R=q):(G=R,R=r)):(G=R,R=r),$e--,R===r&&(q=r,$e===0&&Me(Z)),R}function it(){var R,q,me;for(R=G,q=[],t.charCodeAt(G)===32?(me=J,G++):(me=r,$e===0&&Me(re));me!==r;)q.push(me),t.charCodeAt(G)===32?(me=J,G++):(me=r,$e===0&&Me(re));return q!==r?(yt=G,me=A(q),me?me=void 0:me=r,me!==r?(q=[q,me],R=q):(G=R,R=r)):(G=R,R=r),R}function Po(){var R;return yt=G,R=oe(),R?R=void 0:R=r,R}function NA(){var R;return yt=G,R=le(),R?R=void 0:R=r,R}function Vl(){var R;return R=Zl(),R===r&&(R=Th()),R}function $s(){var R,q,me;if(R=Zl(),R===r){if(R=G,q=[],me=Gu(),me!==r)for(;me!==r;)q.push(me),me=Gu();else q=r;q!==r&&(yt=R,q=X()),R=q}return R}function Xl(){var R;return R=Oh(),R===r&&(R=DE(),R===r&&(R=Zl(),R===r&&(R=Th()))),R}function PE(){var R;return R=Oh(),R===r&&(R=Zl(),R===r&&(R=Gu())),R}function Th(){var R,q,me,Ge,Te,Xe;if($e++,R=G,L.test(t.charAt(G))?(q=t.charAt(G),G++):(q=r,$e===0&&Me(pe)),q!==r){for(me=[],Ge=G,Te=Lr(),Te===r&&(Te=null),Te!==r?(Ce.test(t.charAt(G))?(Xe=t.charAt(G),G++):(Xe=r,$e===0&&Me(Oe)),Xe!==r?(Te=[Te,Xe],Ge=Te):(G=Ge,Ge=r)):(G=Ge,Ge=r);Ge!==r;)me.push(Ge),Ge=G,Te=Lr(),Te===r&&(Te=null),Te!==r?(Ce.test(t.charAt(G))?(Xe=t.charAt(G),G++):(Xe=r,$e===0&&Me(Oe)),Xe!==r?(Te=[Te,Xe],Ge=Te):(G=Ge,Ge=r)):(G=Ge,Ge=r);me!==r?(yt=R,q=te(),R=q):(G=R,R=r)}else G=R,R=r;return $e--,R===r&&(q=r,$e===0&&Me(O)),R}function Gu(){var R,q,me,Ge,Te;if(R=G,t.substr(G,2)===se?(q=se,G+=2):(q=r,$e===0&&Me(be)),q===r&&(q=null),q!==r)if(he.test(t.charAt(G))?(me=t.charAt(G),G++):(me=r,$e===0&&Me(Fe)),me!==r){for(Ge=[],Ue.test(t.charAt(G))?(Te=t.charAt(G),G++):(Te=r,$e===0&&Me(xe));Te!==r;)Ge.push(Te),Ue.test(t.charAt(G))?(Te=t.charAt(G),G++):(Te=r,$e===0&&Me(xe));Ge!==r?(yt=R,q=te(),R=q):(G=R,R=r)}else G=R,R=r;else G=R,R=r;return R}function Oh(){var R,q;return R=G,t.substr(G,4)===Se?(q=Se,G+=4):(q=r,$e===0&&Me(de)),q!==r&&(yt=R,q=V()),R=q,R}function DE(){var R,q;return R=G,t.substr(G,4)===Qe?(q=Qe,G+=4):(q=r,$e===0&&Me(ce)),q!==r&&(yt=R,q=fe()),R=q,R===r&&(R=G,t.substr(G,5)===gt?(q=gt,G+=5):(q=r,$e===0&&Me(Ht)),q!==r&&(yt=R,q=Mt()),R=q),R}function Zl(){var R,q,me,Ge;return $e++,R=G,t.charCodeAt(G)===34?(q=Gt,G++):(q=r,$e===0&&Me(Qr)),q!==r?(t.charCodeAt(G)===34?(me=Gt,G++):(me=r,$e===0&&Me(Qr)),me!==r?(yt=R,q=Ti(),R=q):(G=R,R=r)):(G=R,R=r),R===r&&(R=G,t.charCodeAt(G)===34?(q=Gt,G++):(q=r,$e===0&&Me(Qr)),q!==r?(me=RE(),me!==r?(t.charCodeAt(G)===34?(Ge=Gt,G++):(Ge=r,$e===0&&Me(Qr)),Ge!==r?(yt=R,q=Vs(me),R=q):(G=R,R=r)):(G=R,R=r)):(G=R,R=r)),$e--,R===r&&(q=r,$e===0&&Me(mi)),R}function RE(){var R,q,me;if(R=G,q=[],me=ju(),me!==r)for(;me!==r;)q.push(me),me=ju();else q=r;return q!==r&&(yt=R,q=Un(q)),R=q,R}function ju(){var R,q,me,Ge,Te,Xe;return Hn.test(t.charAt(G))?(R=t.charAt(G),G++):(R=r,$e===0&&Me(vr)),R===r&&(R=G,t.substr(G,2)===Gn?(q=Gn,G+=2):(q=r,$e===0&&Me(gs)),q!==r&&(yt=R,q=ya()),R=q,R===r&&(R=G,t.substr(G,2)===kA?(q=kA,G+=2):(q=r,$e===0&&Me(Ru)),q!==r&&(yt=R,q=fs()),R=q,R===r&&(R=G,t.substr(G,2)===xA?(q=xA,G+=2):(q=r,$e===0&&Me(wa)),q!==r&&(yt=R,q=Fu()),R=q,R===r&&(R=G,t.substr(G,2)===PA?(q=PA,G+=2):(q=r,$e===0&&Me(DA)),q!==r&&(yt=R,q=Sr()),R=q,R===r&&(R=G,t.substr(G,2)===jl?(q=jl,G+=2):(q=r,$e===0&&Me(Nu)),q!==r&&(yt=R,q=So()),R=q,R===r&&(R=G,t.substr(G,2)===Lu?(q=Lu,G+=2):(q=r,$e===0&&Me(Sh)),q!==r&&(yt=R,q=kh()),R=q,R===r&&(R=G,t.substr(G,2)===ae?(q=ae,G+=2):(q=r,$e===0&&Me(Oi)),q!==r&&(yt=R,q=ko()),R=q,R===r&&(R=G,t.substr(G,2)===jn?(q=jn,G+=2):(q=r,$e===0&&Me(Tu)),q!==r&&(yt=R,q=vt()),R=q,R===r&&(R=G,t.substr(G,2)===Yl?(q=Yl,G+=2):(q=r,$e===0&&Me(Yn)),q!==r?(me=LA(),me!==r?(Ge=LA(),Ge!==r?(Te=LA(),Te!==r?(Xe=LA(),Xe!==r?(yt=R,q=hs(me,Ge,Te,Xe),R=q):(G=R,R=r)):(G=R,R=r)):(G=R,R=r)):(G=R,R=r)):(G=R,R=r)))))))))),R}function LA(){var R;return ps.test(t.charAt(G))?(R=t.charAt(G),G++):(R=r,$e===0&&Me(pt)),R}function Lr(){var R,q;if($e++,R=[],lt.test(t.charAt(G))?(q=t.charAt(G),G++):(q=r,$e===0&&Me(mn)),q!==r)for(;q!==r;)R.push(q),lt.test(t.charAt(G))?(q=t.charAt(G),G++):(q=r,$e===0&&Me(mn));else R=r;return $e--,R===r&&(q=r,$e===0&&Me(xo)),R}function FE(){var R,q;if($e++,R=[],Tt.test(t.charAt(G))?(q=t.charAt(G),G++):(q=r,$e===0&&Me(Ou)),q!==r)for(;q!==r;)R.push(q),Tt.test(t.charAt(G))?(q=t.charAt(G),G++):(q=r,$e===0&&Me(Ou));else R=r;return $e--,R===r&&(q=r,$e===0&&Me(v)),R}function eo(){var R,q,me,Ge,Te,Xe;if(R=G,q=to(),q!==r){for(me=[],Ge=G,Te=Lr(),Te===r&&(Te=null),Te!==r?(Xe=to(),Xe!==r?(Te=[Te,Xe],Ge=Te):(G=Ge,Ge=r)):(G=Ge,Ge=r);Ge!==r;)me.push(Ge),Ge=G,Te=Lr(),Te===r&&(Te=null),Te!==r?(Xe=to(),Xe!==r?(Te=[Te,Xe],Ge=Te):(G=Ge,Ge=r)):(G=Ge,Ge=r);me!==r?(q=[q,me],R=q):(G=R,R=r)}else G=R,R=r;return R}function to(){var R;return t.substr(G,2)===ql?(R=ql,G+=2):(R=r,$e===0&&Me(xh)),R===r&&(t.charCodeAt(G)===10?(R=Ph,G++):(R=r,$e===0&&Me(Dh)),R===r&&(t.charCodeAt(G)===13?(R=Rh,G++):(R=r,$e===0&&Me(Fh)))),R}let Yu=2,TA=0;if(Ba=n(),Ba!==r&&G===t.length)return Ba;throw Ba!==r&&G{"use strict";var jde=t=>{let e=!1,r=!1,i=!1;for(let n=0;n{if(!(typeof t=="string"||Array.isArray(t)))throw new TypeError("Expected the input to be `string | string[]`");e=Object.assign({pascalCase:!1},e);let r=n=>e.pascalCase?n.charAt(0).toUpperCase()+n.slice(1):n;return Array.isArray(t)?t=t.map(n=>n.trim()).filter(n=>n.length).join("-"):t=t.trim(),t.length===0?"":t.length===1?e.pascalCase?t.toUpperCase():t.toLowerCase():(t!==t.toLowerCase()&&(t=jde(t)),t=t.replace(/^[_.\- ]+/,"").toLowerCase().replace(/[_.\- ]+(\w|$)/g,(n,s)=>s.toUpperCase()).replace(/\d+(\w|$)/g,n=>n.toUpperCase()),r(t))};nv.exports=dU;nv.exports.default=dU});var EU=w((c$e,mU)=>{mU.exports=[{name:"AppVeyor",constant:"APPVEYOR",env:"APPVEYOR",pr:"APPVEYOR_PULL_REQUEST_NUMBER"},{name:"Azure Pipelines",constant:"AZURE_PIPELINES",env:"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI",pr:"SYSTEM_PULLREQUEST_PULLREQUESTID"},{name:"Appcircle",constant:"APPCIRCLE",env:"AC_APPCIRCLE"},{name:"Bamboo",constant:"BAMBOO",env:"bamboo_planKey"},{name:"Bitbucket Pipelines",constant:"BITBUCKET",env:"BITBUCKET_COMMIT",pr:"BITBUCKET_PR_ID"},{name:"Bitrise",constant:"BITRISE",env:"BITRISE_IO",pr:"BITRISE_PULL_REQUEST"},{name:"Buddy",constant:"BUDDY",env:"BUDDY_WORKSPACE_ID",pr:"BUDDY_EXECUTION_PULL_REQUEST_ID"},{name:"Buildkite",constant:"BUILDKITE",env:"BUILDKITE",pr:{env:"BUILDKITE_PULL_REQUEST",ne:"false"}},{name:"CircleCI",constant:"CIRCLE",env:"CIRCLECI",pr:"CIRCLE_PULL_REQUEST"},{name:"Cirrus CI",constant:"CIRRUS",env:"CIRRUS_CI",pr:"CIRRUS_PR"},{name:"AWS CodeBuild",constant:"CODEBUILD",env:"CODEBUILD_BUILD_ARN"},{name:"Codefresh",constant:"CODEFRESH",env:"CF_BUILD_ID",pr:{any:["CF_PULL_REQUEST_NUMBER","CF_PULL_REQUEST_ID"]}},{name:"Codeship",constant:"CODESHIP",env:{CI_NAME:"codeship"}},{name:"Drone",constant:"DRONE",env:"DRONE",pr:{DRONE_BUILD_EVENT:"pull_request"}},{name:"dsari",constant:"DSARI",env:"DSARI"},{name:"GitHub Actions",constant:"GITHUB_ACTIONS",env:"GITHUB_ACTIONS",pr:{GITHUB_EVENT_NAME:"pull_request"}},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI",pr:"CI_MERGE_REQUEST_ID"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"LayerCI",constant:"LAYERCI",env:"LAYERCI",pr:"LAYERCI_PULL_REQUEST"},{name:"Hudson",constant:"HUDSON",env:"HUDSON_URL"},{name:"Jenkins",constant:"JENKINS",env:["JENKINS_URL","BUILD_ID"],pr:{any:["ghprbPullId","CHANGE_ID"]}},{name:"Magnum CI",constant:"MAGNUM",env:"MAGNUM"},{name:"Netlify CI",constant:"NETLIFY",env:"NETLIFY",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Nevercode",constant:"NEVERCODE",env:"NEVERCODE",pr:{env:"NEVERCODE_PULL_REQUEST",ne:"false"}},{name:"Render",constant:"RENDER",env:"RENDER",pr:{IS_PULL_REQUEST:"true"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Screwdriver",constant:"SCREWDRIVER",env:"SCREWDRIVER",pr:{env:"SD_PULL_REQUEST",ne:"false"}},{name:"Shippable",constant:"SHIPPABLE",env:"SHIPPABLE",pr:{IS_PULL_REQUEST:"true"}},{name:"Solano CI",constant:"SOLANO",env:"TDDIUM",pr:"TDDIUM_PR_ID"},{name:"Strider CD",constant:"STRIDER",env:"STRIDER"},{name:"TaskCluster",constant:"TASKCLUSTER",env:["TASK_ID","RUN_ID"]},{name:"TeamCity",constant:"TEAMCITY",env:"TEAMCITY_VERSION"},{name:"Travis CI",constant:"TRAVIS",env:"TRAVIS",pr:{env:"TRAVIS_PULL_REQUEST",ne:"false"}},{name:"Vercel",constant:"VERCEL",env:"NOW_BUILDER"},{name:"Visual Studio App Center",constant:"APPCENTER",env:"APPCENTER_BUILD_ID"}]});var pc=w(Vn=>{"use strict";var IU=EU(),Fo=process.env;Object.defineProperty(Vn,"_vendors",{value:IU.map(function(t){return t.constant})});Vn.name=null;Vn.isPR=null;IU.forEach(function(t){let r=(Array.isArray(t.env)?t.env:[t.env]).every(function(i){return yU(i)});if(Vn[t.constant]=r,r)switch(Vn.name=t.name,typeof t.pr){case"string":Vn.isPR=!!Fo[t.pr];break;case"object":"env"in t.pr?Vn.isPR=t.pr.env in Fo&&Fo[t.pr.env]!==t.pr.ne:"any"in t.pr?Vn.isPR=t.pr.any.some(function(i){return!!Fo[i]}):Vn.isPR=yU(t.pr);break;default:Vn.isPR=null}});Vn.isCI=!!(Fo.CI||Fo.CONTINUOUS_INTEGRATION||Fo.BUILD_NUMBER||Fo.RUN_ID||Vn.name);function yU(t){return typeof t=="string"?!!Fo[t]:Object.keys(t).every(function(e){return Fo[e]===t[e]})}});var ag={};ft(ag,{KeyRelationship:()=>mc,applyCascade:()=>hp,base64RegExp:()=>vU,colorStringAlphaRegExp:()=>QU,colorStringRegExp:()=>bU,computeKey:()=>YA,getPrintable:()=>ti,hasExactLength:()=>DU,hasForbiddenKeys:()=>yCe,hasKeyRelationship:()=>gv,hasMaxLength:()=>nCe,hasMinLength:()=>iCe,hasMutuallyExclusiveKeys:()=>wCe,hasRequiredKeys:()=>ICe,hasUniqueItems:()=>sCe,isArray:()=>_de,isAtLeast:()=>ACe,isAtMost:()=>lCe,isBase64:()=>mCe,isBoolean:()=>Jde,isDate:()=>zde,isDict:()=>Xde,isEnum:()=>nn,isHexColor:()=>CCe,isISO8601:()=>dCe,isInExclusiveRange:()=>uCe,isInInclusiveRange:()=>cCe,isInstanceOf:()=>$de,isInteger:()=>gCe,isJSON:()=>ECe,isLiteral:()=>Yde,isLowerCase:()=>fCe,isNegative:()=>oCe,isNullable:()=>rCe,isNumber:()=>Wde,isObject:()=>Zde,isOneOf:()=>eCe,isOptional:()=>tCe,isPositive:()=>aCe,isString:()=>fp,isTuple:()=>Vde,isUUID4:()=>pCe,isUnknown:()=>PU,isUpperCase:()=>hCe,iso8601RegExp:()=>uv,makeCoercionFn:()=>Cc,makeSetter:()=>xU,makeTrait:()=>kU,makeValidator:()=>St,matchesRegExp:()=>pp,plural:()=>mI,pushError:()=>mt,simpleKeyRegExp:()=>BU,uuid4RegExp:()=>SU});function St({test:t}){return kU(t)()}function ti(t){return t===null?"null":t===void 0?"undefined":t===""?"an empty string":JSON.stringify(t)}function YA(t,e){var r,i,n;return typeof e=="number"?`${(r=t==null?void 0:t.p)!==null&&r!==void 0?r:"."}[${e}]`:BU.test(e)?`${(i=t==null?void 0:t.p)!==null&&i!==void 0?i:""}.${e}`:`${(n=t==null?void 0:t.p)!==null&&n!==void 0?n:"."}[${JSON.stringify(e)}]`}function Cc(t,e){return r=>{let i=t[e];return t[e]=r,Cc(t,e).bind(null,i)}}function xU(t,e){return r=>{t[e]=r}}function mI(t,e,r){return t===1?e:r}function mt({errors:t,p:e}={},r){return t==null||t.push(`${e!=null?e:"."}: ${r}`),!1}function Yde(t){return St({test:(e,r)=>e!==t?mt(r,`Expected a literal (got ${ti(t)})`):!0})}function nn(t){let e=Array.isArray(t)?t:Object.values(t),r=new Set(e);return St({test:(i,n)=>r.has(i)?!0:mt(n,`Expected a valid enumeration value (got ${ti(i)})`)})}var BU,bU,QU,vU,SU,uv,kU,PU,fp,qde,Jde,Wde,zde,_de,Vde,Xde,Zde,$de,eCe,hp,tCe,rCe,iCe,nCe,DU,sCe,oCe,aCe,ACe,lCe,cCe,uCe,gCe,pp,fCe,hCe,pCe,dCe,CCe,mCe,ECe,ICe,yCe,wCe,mc,BCe,gv,Is=ffe(()=>{BU=/^[a-zA-Z_][a-zA-Z0-9_]*$/,bU=/^#[0-9a-f]{6}$/i,QU=/^#[0-9a-f]{6}([0-9a-f]{2})?$/i,vU=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,SU=/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}$/i,uv=/^(?:[1-9]\d{3}(-?)(?:(?:0[1-9]|1[0-2])\1(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])\1(?:29|30)|(?:0[13578]|1[02])(?:\1)31|00[1-9]|0[1-9]\d|[12]\d{2}|3(?:[0-5]\d|6[0-5]))|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)(?:(-?)02(?:\2)29|-?366))T(?:[01]\d|2[0-3])(:?)[0-5]\d(?:\3[0-5]\d)?(?:Z|[+-][01]\d(?:\3[0-5]\d)?)$/,kU=t=>()=>t;PU=()=>St({test:(t,e)=>!0});fp=()=>St({test:(t,e)=>typeof t!="string"?mt(e,`Expected a string (got ${ti(t)})`):!0});qde=new Map([["true",!0],["True",!0],["1",!0],[1,!0],["false",!1],["False",!1],["0",!1],[0,!1]]),Jde=()=>St({test:(t,e)=>{var r;if(typeof t!="boolean"){if(typeof(e==null?void 0:e.coercions)!="undefined"){if(typeof(e==null?void 0:e.coercion)=="undefined")return mt(e,"Unbound coercion result");let i=qde.get(t);if(typeof i!="undefined")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,i)]),!0}return mt(e,`Expected a boolean (got ${ti(t)})`)}return!0}}),Wde=()=>St({test:(t,e)=>{var r;if(typeof t!="number"){if(typeof(e==null?void 0:e.coercions)!="undefined"){if(typeof(e==null?void 0:e.coercion)=="undefined")return mt(e,"Unbound coercion result");let i;if(typeof t=="string"){let n;try{n=JSON.parse(t)}catch(s){}if(typeof n=="number")if(JSON.stringify(n)===t)i=n;else return mt(e,`Received a number that can't be safely represented by the runtime (${t})`)}if(typeof i!="undefined")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,i)]),!0}return mt(e,`Expected a number (got ${ti(t)})`)}return!0}}),zde=()=>St({test:(t,e)=>{var r;if(!(t instanceof Date)){if(typeof(e==null?void 0:e.coercions)!="undefined"){if(typeof(e==null?void 0:e.coercion)=="undefined")return mt(e,"Unbound coercion result");let i;if(typeof t=="string"&&uv.test(t))i=new Date(t);else{let n;if(typeof t=="string"){let s;try{s=JSON.parse(t)}catch(o){}typeof s=="number"&&(n=s)}else typeof t=="number"&&(n=t);if(typeof n!="undefined")if(Number.isSafeInteger(n)||!Number.isSafeInteger(n*1e3))i=new Date(n*1e3);else return mt(e,`Received a timestamp that can't be safely represented by the runtime (${t})`)}if(typeof i!="undefined")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,i)]),!0}return mt(e,`Expected a date (got ${ti(t)})`)}return!0}}),_de=(t,{delimiter:e}={})=>St({test:(r,i)=>{var n;if(typeof r=="string"&&typeof e!="undefined"&&typeof(i==null?void 0:i.coercions)!="undefined"){if(typeof(i==null?void 0:i.coercion)=="undefined")return mt(i,"Unbound coercion result");r=r.split(e),i.coercions.push([(n=i.p)!==null&&n!==void 0?n:".",i.coercion.bind(null,r)])}if(!Array.isArray(r))return mt(i,`Expected an array (got ${ti(r)})`);let s=!0;for(let o=0,a=r.length;o{let r=DU(t.length);return St({test:(i,n)=>{var s;if(typeof i=="string"&&typeof e!="undefined"&&typeof(n==null?void 0:n.coercions)!="undefined"){if(typeof(n==null?void 0:n.coercion)=="undefined")return mt(n,"Unbound coercion result");i=i.split(e),n.coercions.push([(s=n.p)!==null&&s!==void 0?s:".",n.coercion.bind(null,i)])}if(!Array.isArray(i))return mt(n,`Expected a tuple (got ${ti(i)})`);let o=r(i,Object.assign({},n));for(let a=0,l=i.length;aSt({test:(r,i)=>{if(typeof r!="object"||r===null)return mt(i,`Expected an object (got ${ti(r)})`);let n=Object.keys(r),s=!0;for(let o=0,a=n.length;o{let r=Object.keys(t);return St({test:(i,n)=>{if(typeof i!="object"||i===null)return mt(n,`Expected an object (got ${ti(i)})`);let s=new Set([...r,...Object.keys(i)]),o={},a=!0;for(let l of s){if(l==="constructor"||l==="__proto__")a=mt(Object.assign(Object.assign({},n),{p:YA(n,l)}),"Unsafe property name");else{let c=Object.prototype.hasOwnProperty.call(t,l)?t[l]:void 0,u=Object.prototype.hasOwnProperty.call(i,l)?i[l]:void 0;typeof c!="undefined"?a=c(u,Object.assign(Object.assign({},n),{p:YA(n,l),coercion:Cc(i,l)}))&&a:e===null?a=mt(Object.assign(Object.assign({},n),{p:YA(n,l)}),`Extraneous property (got ${ti(u)})`):Object.defineProperty(o,l,{enumerable:!0,get:()=>u,set:xU(i,l)})}if(!a&&(n==null?void 0:n.errors)==null)break}return e!==null&&(a||(n==null?void 0:n.errors)!=null)&&(a=e(o,n)&&a),a}})},$de=t=>St({test:(e,r)=>e instanceof t?!0:mt(r,`Expected an instance of ${t.name} (got ${ti(e)})`)}),eCe=(t,{exclusive:e=!1}={})=>St({test:(r,i)=>{var n,s,o;let a=[],l=typeof(i==null?void 0:i.errors)!="undefined"?[]:void 0;for(let c=0,u=t.length;c1?mt(i,`Expected to match exactly a single predicate (matched ${a.join(", ")})`):(o=i==null?void 0:i.errors)===null||o===void 0||o.push(...l),!1}}),hp=(t,e)=>St({test:(r,i)=>{var n,s;let o={value:r},a=typeof(i==null?void 0:i.coercions)!="undefined"?Cc(o,"value"):void 0,l=typeof(i==null?void 0:i.coercions)!="undefined"?[]:void 0;if(!t(r,Object.assign(Object.assign({},i),{coercion:a,coercions:l})))return!1;let c=[];if(typeof l!="undefined")for(let[,u]of l)c.push(u());try{if(typeof(i==null?void 0:i.coercions)!="undefined"){if(o.value!==r){if(typeof(i==null?void 0:i.coercion)=="undefined")return mt(i,"Unbound coercion result");i.coercions.push([(n=i.p)!==null&&n!==void 0?n:".",i.coercion.bind(null,o.value)])}(s=i==null?void 0:i.coercions)===null||s===void 0||s.push(...l)}return e.every(u=>u(o.value,i))}finally{for(let u of c)u()}}}),tCe=t=>St({test:(e,r)=>typeof e=="undefined"?!0:t(e,r)}),rCe=t=>St({test:(e,r)=>e===null?!0:t(e,r)}),iCe=t=>St({test:(e,r)=>e.length>=t?!0:mt(r,`Expected to have a length of at least ${t} elements (got ${e.length})`)}),nCe=t=>St({test:(e,r)=>e.length<=t?!0:mt(r,`Expected to have a length of at most ${t} elements (got ${e.length})`)}),DU=t=>St({test:(e,r)=>e.length!==t?mt(r,`Expected to have a length of exactly ${t} elements (got ${e.length})`):!0}),sCe=({map:t}={})=>St({test:(e,r)=>{let i=new Set,n=new Set;for(let s=0,o=e.length;sSt({test:(t,e)=>t<=0?!0:mt(e,`Expected to be negative (got ${t})`)}),aCe=()=>St({test:(t,e)=>t>=0?!0:mt(e,`Expected to be positive (got ${t})`)}),ACe=t=>St({test:(e,r)=>e>=t?!0:mt(r,`Expected to be at least ${t} (got ${e})`)}),lCe=t=>St({test:(e,r)=>e<=t?!0:mt(r,`Expected to be at most ${t} (got ${e})`)}),cCe=(t,e)=>St({test:(r,i)=>r>=t&&r<=e?!0:mt(i,`Expected to be in the [${t}; ${e}] range (got ${r})`)}),uCe=(t,e)=>St({test:(r,i)=>r>=t&&rSt({test:(e,r)=>e!==Math.round(e)?mt(r,`Expected to be an integer (got ${e})`):Number.isSafeInteger(e)?!0:mt(r,`Expected to be a safe integer (got ${e})`)}),pp=t=>St({test:(e,r)=>t.test(e)?!0:mt(r,`Expected to match the pattern ${t.toString()} (got ${ti(e)})`)}),fCe=()=>St({test:(t,e)=>t!==t.toLowerCase()?mt(e,`Expected to be all-lowercase (got ${t})`):!0}),hCe=()=>St({test:(t,e)=>t!==t.toUpperCase()?mt(e,`Expected to be all-uppercase (got ${t})`):!0}),pCe=()=>St({test:(t,e)=>SU.test(t)?!0:mt(e,`Expected to be a valid UUID v4 (got ${ti(t)})`)}),dCe=()=>St({test:(t,e)=>uv.test(t)?!1:mt(e,`Expected to be a valid ISO 8601 date string (got ${ti(t)})`)}),CCe=({alpha:t=!1})=>St({test:(e,r)=>(t?bU.test(e):QU.test(e))?!0:mt(r,`Expected to be a valid hexadecimal color string (got ${ti(e)})`)}),mCe=()=>St({test:(t,e)=>vU.test(t)?!0:mt(e,`Expected to be a valid base 64 string (got ${ti(t)})`)}),ECe=(t=PU())=>St({test:(e,r)=>{let i;try{i=JSON.parse(e)}catch(n){return mt(r,`Expected to be a valid JSON string (got ${ti(e)})`)}return t(i,r)}}),ICe=t=>{let e=new Set(t);return St({test:(r,i)=>{let n=new Set(Object.keys(r)),s=[];for(let o of e)n.has(o)||s.push(o);return s.length>0?mt(i,`Missing required ${mI(s.length,"property","properties")} ${s.map(o=>`"${o}"`).join(", ")}`):!0}})},yCe=t=>{let e=new Set(t);return St({test:(r,i)=>{let n=new Set(Object.keys(r)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>0?mt(i,`Forbidden ${mI(s.length,"property","properties")} ${s.map(o=>`"${o}"`).join(", ")}`):!0}})},wCe=t=>{let e=new Set(t);return St({test:(r,i)=>{let n=new Set(Object.keys(r)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>1?mt(i,`Mutually exclusive properties ${s.map(o=>`"${o}"`).join(", ")}`):!0}})};(function(t){t.Forbids="Forbids",t.Requires="Requires"})(mc||(mc={}));BCe={[mc.Forbids]:{expect:!1,message:"forbids using"},[mc.Requires]:{expect:!0,message:"requires using"}},gv=(t,e,r,{ignore:i=[]}={})=>{let n=new Set(i),s=new Set(r),o=BCe[e];return St({test:(a,l)=>{let c=new Set(Object.keys(a));if(!c.has(t)||n.has(a[t]))return!0;let u=[];for(let g of s)(c.has(g)&&!n.has(a[g]))!==o.expect&&u.push(g);return u.length>=1?mt(l,`Property "${t}" ${o.message} ${mI(u.length,"property","properties")} ${u.map(g=>`"${g}"`).join(", ")}`):!0}})}});var VU=w((get,_U)=>{"use strict";_U.exports=(t,...e)=>new Promise(r=>{r(t(...e))})});var lg=w((fet,Ev)=>{"use strict";var UCe=VU(),XU=t=>{if(t<1)throw new TypeError("Expected `concurrency` to be a number from 1 and up");let e=[],r=0,i=()=>{r--,e.length>0&&e.shift()()},n=(a,l,...c)=>{r++;let u=UCe(a,...c);l(u),u.then(i,i)},s=(a,l,...c)=>{rnew Promise(c=>s(a,c,...l));return Object.defineProperties(o,{activeCount:{get:()=>r},pendingCount:{get:()=>e.length}}),o};Ev.exports=XU;Ev.exports.default=XU});var Ep=w((pet,ZU)=>{var HCe="2.0.0",GCe=256,jCe=Number.MAX_SAFE_INTEGER||9007199254740991,YCe=16;ZU.exports={SEMVER_SPEC_VERSION:HCe,MAX_LENGTH:GCe,MAX_SAFE_INTEGER:jCe,MAX_SAFE_COMPONENT_LENGTH:YCe}});var Ip=w((det,$U)=>{var qCe=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...t)=>console.error("SEMVER",...t):()=>{};$U.exports=qCe});var Ec=w((JA,e2)=>{var{MAX_SAFE_COMPONENT_LENGTH:Iv}=Ep(),JCe=Ip();JA=e2.exports={};var WCe=JA.re=[],tt=JA.src=[],rt=JA.t={},zCe=0,kt=(t,e,r)=>{let i=zCe++;JCe(i,e),rt[t]=i,tt[i]=e,WCe[i]=new RegExp(e,r?"g":void 0)};kt("NUMERICIDENTIFIER","0|[1-9]\\d*");kt("NUMERICIDENTIFIERLOOSE","[0-9]+");kt("NONNUMERICIDENTIFIER","\\d*[a-zA-Z-][a-zA-Z0-9-]*");kt("MAINVERSION",`(${tt[rt.NUMERICIDENTIFIER]})\\.(${tt[rt.NUMERICIDENTIFIER]})\\.(${tt[rt.NUMERICIDENTIFIER]})`);kt("MAINVERSIONLOOSE",`(${tt[rt.NUMERICIDENTIFIERLOOSE]})\\.(${tt[rt.NUMERICIDENTIFIERLOOSE]})\\.(${tt[rt.NUMERICIDENTIFIERLOOSE]})`);kt("PRERELEASEIDENTIFIER",`(?:${tt[rt.NUMERICIDENTIFIER]}|${tt[rt.NONNUMERICIDENTIFIER]})`);kt("PRERELEASEIDENTIFIERLOOSE",`(?:${tt[rt.NUMERICIDENTIFIERLOOSE]}|${tt[rt.NONNUMERICIDENTIFIER]})`);kt("PRERELEASE",`(?:-(${tt[rt.PRERELEASEIDENTIFIER]}(?:\\.${tt[rt.PRERELEASEIDENTIFIER]})*))`);kt("PRERELEASELOOSE",`(?:-?(${tt[rt.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${tt[rt.PRERELEASEIDENTIFIERLOOSE]})*))`);kt("BUILDIDENTIFIER","[0-9A-Za-z-]+");kt("BUILD",`(?:\\+(${tt[rt.BUILDIDENTIFIER]}(?:\\.${tt[rt.BUILDIDENTIFIER]})*))`);kt("FULLPLAIN",`v?${tt[rt.MAINVERSION]}${tt[rt.PRERELEASE]}?${tt[rt.BUILD]}?`);kt("FULL",`^${tt[rt.FULLPLAIN]}$`);kt("LOOSEPLAIN",`[v=\\s]*${tt[rt.MAINVERSIONLOOSE]}${tt[rt.PRERELEASELOOSE]}?${tt[rt.BUILD]}?`);kt("LOOSE",`^${tt[rt.LOOSEPLAIN]}$`);kt("GTLT","((?:<|>)?=?)");kt("XRANGEIDENTIFIERLOOSE",`${tt[rt.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);kt("XRANGEIDENTIFIER",`${tt[rt.NUMERICIDENTIFIER]}|x|X|\\*`);kt("XRANGEPLAIN",`[v=\\s]*(${tt[rt.XRANGEIDENTIFIER]})(?:\\.(${tt[rt.XRANGEIDENTIFIER]})(?:\\.(${tt[rt.XRANGEIDENTIFIER]})(?:${tt[rt.PRERELEASE]})?${tt[rt.BUILD]}?)?)?`);kt("XRANGEPLAINLOOSE",`[v=\\s]*(${tt[rt.XRANGEIDENTIFIERLOOSE]})(?:\\.(${tt[rt.XRANGEIDENTIFIERLOOSE]})(?:\\.(${tt[rt.XRANGEIDENTIFIERLOOSE]})(?:${tt[rt.PRERELEASELOOSE]})?${tt[rt.BUILD]}?)?)?`);kt("XRANGE",`^${tt[rt.GTLT]}\\s*${tt[rt.XRANGEPLAIN]}$`);kt("XRANGELOOSE",`^${tt[rt.GTLT]}\\s*${tt[rt.XRANGEPLAINLOOSE]}$`);kt("COERCE",`(^|[^\\d])(\\d{1,${Iv}})(?:\\.(\\d{1,${Iv}}))?(?:\\.(\\d{1,${Iv}}))?(?:$|[^\\d])`);kt("COERCERTL",tt[rt.COERCE],!0);kt("LONETILDE","(?:~>?)");kt("TILDETRIM",`(\\s*)${tt[rt.LONETILDE]}\\s+`,!0);JA.tildeTrimReplace="$1~";kt("TILDE",`^${tt[rt.LONETILDE]}${tt[rt.XRANGEPLAIN]}$`);kt("TILDELOOSE",`^${tt[rt.LONETILDE]}${tt[rt.XRANGEPLAINLOOSE]}$`);kt("LONECARET","(?:\\^)");kt("CARETTRIM",`(\\s*)${tt[rt.LONECARET]}\\s+`,!0);JA.caretTrimReplace="$1^";kt("CARET",`^${tt[rt.LONECARET]}${tt[rt.XRANGEPLAIN]}$`);kt("CARETLOOSE",`^${tt[rt.LONECARET]}${tt[rt.XRANGEPLAINLOOSE]}$`);kt("COMPARATORLOOSE",`^${tt[rt.GTLT]}\\s*(${tt[rt.LOOSEPLAIN]})$|^$`);kt("COMPARATOR",`^${tt[rt.GTLT]}\\s*(${tt[rt.FULLPLAIN]})$|^$`);kt("COMPARATORTRIM",`(\\s*)${tt[rt.GTLT]}\\s*(${tt[rt.LOOSEPLAIN]}|${tt[rt.XRANGEPLAIN]})`,!0);JA.comparatorTrimReplace="$1$2$3";kt("HYPHENRANGE",`^\\s*(${tt[rt.XRANGEPLAIN]})\\s+-\\s+(${tt[rt.XRANGEPLAIN]})\\s*$`);kt("HYPHENRANGELOOSE",`^\\s*(${tt[rt.XRANGEPLAINLOOSE]})\\s+-\\s+(${tt[rt.XRANGEPLAINLOOSE]})\\s*$`);kt("STAR","(<|>)?=?\\s*\\*");kt("GTE0","^\\s*>=\\s*0.0.0\\s*$");kt("GTE0PRE","^\\s*>=\\s*0.0.0-0\\s*$")});var yp=w((Cet,t2)=>{var _Ce=["includePrerelease","loose","rtl"],VCe=t=>t?typeof t!="object"?{loose:!0}:_Ce.filter(e=>t[e]).reduce((e,r)=>(e[r]=!0,e),{}):{};t2.exports=VCe});var QI=w((met,r2)=>{var i2=/^[0-9]+$/,n2=(t,e)=>{let r=i2.test(t),i=i2.test(e);return r&&i&&(t=+t,e=+e),t===e?0:r&&!i?-1:i&&!r?1:tn2(e,t);r2.exports={compareIdentifiers:n2,rcompareIdentifiers:XCe}});var Hi=w((Eet,s2)=>{var vI=Ip(),{MAX_LENGTH:o2,MAX_SAFE_INTEGER:SI}=Ep(),{re:a2,t:A2}=Ec(),ZCe=yp(),{compareIdentifiers:wp}=QI(),ws=class{constructor(e,r){if(r=ZCe(r),e instanceof ws){if(e.loose===!!r.loose&&e.includePrerelease===!!r.includePrerelease)return e;e=e.version}else if(typeof e!="string")throw new TypeError(`Invalid Version: ${e}`);if(e.length>o2)throw new TypeError(`version is longer than ${o2} characters`);vI("SemVer",e,r),this.options=r,this.loose=!!r.loose,this.includePrerelease=!!r.includePrerelease;let i=e.trim().match(r.loose?a2[A2.LOOSE]:a2[A2.FULL]);if(!i)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+i[1],this.minor=+i[2],this.patch=+i[3],this.major>SI||this.major<0)throw new TypeError("Invalid major version");if(this.minor>SI||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>SI||this.patch<0)throw new TypeError("Invalid patch version");i[4]?this.prerelease=i[4].split(".").map(n=>{if(/^[0-9]+$/.test(n)){let s=+n;if(s>=0&&s=0;)typeof this.prerelease[i]=="number"&&(this.prerelease[i]++,i=-2);i===-1&&this.prerelease.push(0)}r&&(this.prerelease[0]===r?isNaN(this.prerelease[1])&&(this.prerelease=[r,0]):this.prerelease=[r,0]);break;default:throw new Error(`invalid increment argument: ${e}`)}return this.format(),this.raw=this.version,this}};s2.exports=ws});var Ic=w((Iet,l2)=>{var{MAX_LENGTH:$Ce}=Ep(),{re:c2,t:u2}=Ec(),g2=Hi(),eme=yp(),tme=(t,e)=>{if(e=eme(e),t instanceof g2)return t;if(typeof t!="string"||t.length>$Ce||!(e.loose?c2[u2.LOOSE]:c2[u2.FULL]).test(t))return null;try{return new g2(t,e)}catch(i){return null}};l2.exports=tme});var h2=w((yet,f2)=>{var rme=Ic(),ime=(t,e)=>{let r=rme(t,e);return r?r.version:null};f2.exports=ime});var d2=w((wet,p2)=>{var nme=Ic(),sme=(t,e)=>{let r=nme(t.trim().replace(/^[=v]+/,""),e);return r?r.version:null};p2.exports=sme});var m2=w((Bet,C2)=>{var ome=Hi(),ame=(t,e,r,i)=>{typeof r=="string"&&(i=r,r=void 0);try{return new ome(t,r).inc(e,i).version}catch(n){return null}};C2.exports=ame});var Bs=w((bet,E2)=>{var I2=Hi(),Ame=(t,e,r)=>new I2(t,r).compare(new I2(e,r));E2.exports=Ame});var kI=w((Qet,y2)=>{var lme=Bs(),cme=(t,e,r)=>lme(t,e,r)===0;y2.exports=cme});var b2=w((vet,w2)=>{var B2=Ic(),ume=kI(),gme=(t,e)=>{if(ume(t,e))return null;{let r=B2(t),i=B2(e),n=r.prerelease.length||i.prerelease.length,s=n?"pre":"",o=n?"prerelease":"";for(let a in r)if((a==="major"||a==="minor"||a==="patch")&&r[a]!==i[a])return s+a;return o}};w2.exports=gme});var v2=w((ket,Q2)=>{var fme=Hi(),hme=(t,e)=>new fme(t,e).major;Q2.exports=hme});var k2=w((xet,S2)=>{var pme=Hi(),dme=(t,e)=>new pme(t,e).minor;S2.exports=dme});var P2=w((Pet,x2)=>{var Cme=Hi(),mme=(t,e)=>new Cme(t,e).patch;x2.exports=mme});var R2=w((Det,D2)=>{var Eme=Ic(),Ime=(t,e)=>{let r=Eme(t,e);return r&&r.prerelease.length?r.prerelease:null};D2.exports=Ime});var N2=w((Ret,F2)=>{var yme=Bs(),wme=(t,e,r)=>yme(e,t,r);F2.exports=wme});var T2=w((Fet,L2)=>{var Bme=Bs(),bme=(t,e)=>Bme(t,e,!0);L2.exports=bme});var xI=w((Net,O2)=>{var M2=Hi(),Qme=(t,e,r)=>{let i=new M2(t,r),n=new M2(e,r);return i.compare(n)||i.compareBuild(n)};O2.exports=Qme});var U2=w((Let,K2)=>{var vme=xI(),Sme=(t,e)=>t.sort((r,i)=>vme(r,i,e));K2.exports=Sme});var G2=w((Tet,H2)=>{var kme=xI(),xme=(t,e)=>t.sort((r,i)=>kme(i,r,e));H2.exports=xme});var Bp=w((Oet,j2)=>{var Pme=Bs(),Dme=(t,e,r)=>Pme(t,e,r)>0;j2.exports=Dme});var PI=w((Met,Y2)=>{var Rme=Bs(),Fme=(t,e,r)=>Rme(t,e,r)<0;Y2.exports=Fme});var yv=w((Ket,q2)=>{var Nme=Bs(),Lme=(t,e,r)=>Nme(t,e,r)!==0;q2.exports=Lme});var DI=w((Uet,J2)=>{var Tme=Bs(),Ome=(t,e,r)=>Tme(t,e,r)>=0;J2.exports=Ome});var RI=w((Het,W2)=>{var Mme=Bs(),Kme=(t,e,r)=>Mme(t,e,r)<=0;W2.exports=Kme});var wv=w((Get,z2)=>{var Ume=kI(),Hme=yv(),Gme=Bp(),jme=DI(),Yme=PI(),qme=RI(),Jme=(t,e,r,i)=>{switch(e){case"===":return typeof t=="object"&&(t=t.version),typeof r=="object"&&(r=r.version),t===r;case"!==":return typeof t=="object"&&(t=t.version),typeof r=="object"&&(r=r.version),t!==r;case"":case"=":case"==":return Ume(t,r,i);case"!=":return Hme(t,r,i);case">":return Gme(t,r,i);case">=":return jme(t,r,i);case"<":return Yme(t,r,i);case"<=":return qme(t,r,i);default:throw new TypeError(`Invalid operator: ${e}`)}};z2.exports=Jme});var V2=w((jet,_2)=>{var Wme=Hi(),zme=Ic(),{re:FI,t:NI}=Ec(),_me=(t,e)=>{if(t instanceof Wme)return t;if(typeof t=="number"&&(t=String(t)),typeof t!="string")return null;e=e||{};let r=null;if(!e.rtl)r=t.match(FI[NI.COERCE]);else{let i;for(;(i=FI[NI.COERCERTL].exec(t))&&(!r||r.index+r[0].length!==t.length);)(!r||i.index+i[0].length!==r.index+r[0].length)&&(r=i),FI[NI.COERCERTL].lastIndex=i.index+i[1].length+i[2].length;FI[NI.COERCERTL].lastIndex=-1}return r===null?null:zme(`${r[2]}.${r[3]||"0"}.${r[4]||"0"}`,e)};_2.exports=_me});var Z2=w((Yet,X2)=>{"use strict";X2.exports=function(t){t.prototype[Symbol.iterator]=function*(){for(let e=this.head;e;e=e.next)yield e.value}}});var bp=w((qet,$2)=>{"use strict";$2.exports=jt;jt.Node=yc;jt.create=jt;function jt(t){var e=this;if(e instanceof jt||(e=new jt),e.tail=null,e.head=null,e.length=0,t&&typeof t.forEach=="function")t.forEach(function(n){e.push(n)});else if(arguments.length>0)for(var r=0,i=arguments.length;r1)r=e;else if(this.head)i=this.head.next,r=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=0;i!==null;n++)r=t(r,i.value,n),i=i.next;return r};jt.prototype.reduceReverse=function(t,e){var r,i=this.tail;if(arguments.length>1)r=e;else if(this.tail)i=this.tail.prev,r=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=this.length-1;i!==null;n--)r=t(r,i.value,n),i=i.prev;return r};jt.prototype.toArray=function(){for(var t=new Array(this.length),e=0,r=this.head;r!==null;e++)t[e]=r.value,r=r.next;return t};jt.prototype.toArrayReverse=function(){for(var t=new Array(this.length),e=0,r=this.tail;r!==null;e++)t[e]=r.value,r=r.prev;return t};jt.prototype.slice=function(t,e){e=e||this.length,e<0&&(e+=this.length),t=t||0,t<0&&(t+=this.length);var r=new jt;if(ethis.length&&(e=this.length);for(var i=0,n=this.head;n!==null&&ithis.length&&(e=this.length);for(var i=this.length,n=this.tail;n!==null&&i>e;i--)n=n.prev;for(;n!==null&&i>t;i--,n=n.prev)r.push(n.value);return r};jt.prototype.splice=function(t,e,...r){t>this.length&&(t=this.length-1),t<0&&(t=this.length+t);for(var i=0,n=this.head;n!==null&&i{"use strict";var $me=bp(),wc=Symbol("max"),Oa=Symbol("length"),cg=Symbol("lengthCalculator"),Qp=Symbol("allowStale"),Bc=Symbol("maxAge"),Ma=Symbol("dispose"),tH=Symbol("noDisposeOnSet"),Ii=Symbol("lruList"),so=Symbol("cache"),rH=Symbol("updateAgeOnGet"),Bv=()=>1,iH=class{constructor(e){if(typeof e=="number"&&(e={max:e}),e||(e={}),e.max&&(typeof e.max!="number"||e.max<0))throw new TypeError("max must be a non-negative number");let r=this[wc]=e.max||Infinity,i=e.length||Bv;if(this[cg]=typeof i!="function"?Bv:i,this[Qp]=e.stale||!1,e.maxAge&&typeof e.maxAge!="number")throw new TypeError("maxAge must be a number");this[Bc]=e.maxAge||0,this[Ma]=e.dispose,this[tH]=e.noDisposeOnSet||!1,this[rH]=e.updateAgeOnGet||!1,this.reset()}set max(e){if(typeof e!="number"||e<0)throw new TypeError("max must be a non-negative number");this[wc]=e||Infinity,vp(this)}get max(){return this[wc]}set allowStale(e){this[Qp]=!!e}get allowStale(){return this[Qp]}set maxAge(e){if(typeof e!="number")throw new TypeError("maxAge must be a non-negative number");this[Bc]=e,vp(this)}get maxAge(){return this[Bc]}set lengthCalculator(e){typeof e!="function"&&(e=Bv),e!==this[cg]&&(this[cg]=e,this[Oa]=0,this[Ii].forEach(r=>{r.length=this[cg](r.value,r.key),this[Oa]+=r.length})),vp(this)}get lengthCalculator(){return this[cg]}get length(){return this[Oa]}get itemCount(){return this[Ii].length}rforEach(e,r){r=r||this;for(let i=this[Ii].tail;i!==null;){let n=i.prev;sH(this,e,i,r),i=n}}forEach(e,r){r=r||this;for(let i=this[Ii].head;i!==null;){let n=i.next;sH(this,e,i,r),i=n}}keys(){return this[Ii].toArray().map(e=>e.key)}values(){return this[Ii].toArray().map(e=>e.value)}reset(){this[Ma]&&this[Ii]&&this[Ii].length&&this[Ii].forEach(e=>this[Ma](e.key,e.value)),this[so]=new Map,this[Ii]=new $me,this[Oa]=0}dump(){return this[Ii].map(e=>LI(this,e)?!1:{k:e.key,v:e.value,e:e.now+(e.maxAge||0)}).toArray().filter(e=>e)}dumpLru(){return this[Ii]}set(e,r,i){if(i=i||this[Bc],i&&typeof i!="number")throw new TypeError("maxAge must be a number");let n=i?Date.now():0,s=this[cg](r,e);if(this[so].has(e)){if(s>this[wc])return ug(this,this[so].get(e)),!1;let l=this[so].get(e).value;return this[Ma]&&(this[tH]||this[Ma](e,l.value)),l.now=n,l.maxAge=i,l.value=r,this[Oa]+=s-l.length,l.length=s,this.get(e),vp(this),!0}let o=new nH(e,r,s,n,i);return o.length>this[wc]?(this[Ma]&&this[Ma](e,r),!1):(this[Oa]+=o.length,this[Ii].unshift(o),this[so].set(e,this[Ii].head),vp(this),!0)}has(e){if(!this[so].has(e))return!1;let r=this[so].get(e).value;return!LI(this,r)}get(e){return bv(this,e,!0)}peek(e){return bv(this,e,!1)}pop(){let e=this[Ii].tail;return e?(ug(this,e),e.value):null}del(e){ug(this,this[so].get(e))}load(e){this.reset();let r=Date.now();for(let i=e.length-1;i>=0;i--){let n=e[i],s=n.e||0;if(s===0)this.set(n.k,n.v);else{let o=s-r;o>0&&this.set(n.k,n.v,o)}}}prune(){this[so].forEach((e,r)=>bv(this,r,!1))}},bv=(t,e,r)=>{let i=t[so].get(e);if(i){let n=i.value;if(LI(t,n)){if(ug(t,i),!t[Qp])return}else r&&(t[rH]&&(i.value.now=Date.now()),t[Ii].unshiftNode(i));return n.value}},LI=(t,e)=>{if(!e||!e.maxAge&&!t[Bc])return!1;let r=Date.now()-e.now;return e.maxAge?r>e.maxAge:t[Bc]&&r>t[Bc]},vp=t=>{if(t[Oa]>t[wc])for(let e=t[Ii].tail;t[Oa]>t[wc]&&e!==null;){let r=e.prev;ug(t,e),e=r}},ug=(t,e)=>{if(e){let r=e.value;t[Ma]&&t[Ma](r.key,r.value),t[Oa]-=r.length,t[so].delete(r.key),t[Ii].removeNode(e)}},nH=class{constructor(e,r,i,n,s){this.key=e,this.value=r,this.length=i,this.now=n,this.maxAge=s||0}},sH=(t,e,r,i)=>{let n=r.value;LI(t,n)&&(ug(t,r),t[Qp]||(n=void 0)),n&&e.call(i,n.value,n.key,t)};eH.exports=iH});var bs=w((Wet,aH)=>{var gg=class{constructor(e,r){if(r=eEe(r),e instanceof gg)return e.loose===!!r.loose&&e.includePrerelease===!!r.includePrerelease?e:new gg(e.raw,r);if(e instanceof Qv)return this.raw=e.value,this.set=[[e]],this.format(),this;if(this.options=r,this.loose=!!r.loose,this.includePrerelease=!!r.includePrerelease,this.raw=e,this.set=e.split(/\s*\|\|\s*/).map(i=>this.parseRange(i.trim())).filter(i=>i.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${e}`);if(this.set.length>1){let i=this.set[0];if(this.set=this.set.filter(n=>!lH(n[0])),this.set.length===0)this.set=[i];else if(this.set.length>1){for(let n of this.set)if(n.length===1&&sEe(n[0])){this.set=[n];break}}}this.format()}format(){return this.range=this.set.map(e=>e.join(" ").trim()).join("||").trim(),this.range}toString(){return this.range}parseRange(e){e=e.trim();let i=`parseRange:${Object.keys(this.options).join(",")}:${e}`,n=AH.get(i);if(n)return n;let s=this.options.loose,o=s?Gi[ki.HYPHENRANGELOOSE]:Gi[ki.HYPHENRANGE];e=e.replace(o,AEe(this.options.includePrerelease)),zr("hyphen replace",e),e=e.replace(Gi[ki.COMPARATORTRIM],rEe),zr("comparator trim",e,Gi[ki.COMPARATORTRIM]),e=e.replace(Gi[ki.TILDETRIM],iEe),e=e.replace(Gi[ki.CARETTRIM],nEe),e=e.split(/\s+/).join(" ");let a=s?Gi[ki.COMPARATORLOOSE]:Gi[ki.COMPARATOR],l=e.split(" ").map(f=>oEe(f,this.options)).join(" ").split(/\s+/).map(f=>aEe(f,this.options)).filter(this.options.loose?f=>!!f.match(a):()=>!0).map(f=>new Qv(f,this.options)),c=l.length,u=new Map;for(let f of l){if(lH(f))return[f];u.set(f.value,f)}u.size>1&&u.has("")&&u.delete("");let g=[...u.values()];return AH.set(i,g),g}intersects(e,r){if(!(e instanceof gg))throw new TypeError("a Range is required");return this.set.some(i=>cH(i,r)&&e.set.some(n=>cH(n,r)&&i.every(s=>n.every(o=>s.intersects(o,r)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new tEe(e,this.options)}catch(r){return!1}for(let r=0;rt.value==="<0.0.0-0",sEe=t=>t.value==="",cH=(t,e)=>{let r=!0,i=t.slice(),n=i.pop();for(;r&&i.length;)r=i.every(s=>n.intersects(s,e)),n=i.pop();return r},oEe=(t,e)=>(zr("comp",t,e),t=gEe(t,e),zr("caret",t),t=uEe(t,e),zr("tildes",t),t=fEe(t,e),zr("xrange",t),t=hEe(t,e),zr("stars",t),t),on=t=>!t||t.toLowerCase()==="x"||t==="*",uEe=(t,e)=>t.trim().split(/\s+/).map(r=>pEe(r,e)).join(" "),pEe=(t,e)=>{let r=e.loose?Gi[ki.TILDELOOSE]:Gi[ki.TILDE];return t.replace(r,(i,n,s,o,a)=>{zr("tilde",t,i,n,s,o,a);let l;return on(n)?l="":on(s)?l=`>=${n}.0.0 <${+n+1}.0.0-0`:on(o)?l=`>=${n}.${s}.0 <${n}.${+s+1}.0-0`:a?(zr("replaceTilde pr",a),l=`>=${n}.${s}.${o}-${a} <${n}.${+s+1}.0-0`):l=`>=${n}.${s}.${o} <${n}.${+s+1}.0-0`,zr("tilde return",l),l})},gEe=(t,e)=>t.trim().split(/\s+/).map(r=>dEe(r,e)).join(" "),dEe=(t,e)=>{zr("caret",t,e);let r=e.loose?Gi[ki.CARETLOOSE]:Gi[ki.CARET],i=e.includePrerelease?"-0":"";return t.replace(r,(n,s,o,a,l)=>{zr("caret",t,n,s,o,a,l);let c;return on(s)?c="":on(o)?c=`>=${s}.0.0${i} <${+s+1}.0.0-0`:on(a)?s==="0"?c=`>=${s}.${o}.0${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.0${i} <${+s+1}.0.0-0`:l?(zr("replaceCaret pr",l),s==="0"?o==="0"?c=`>=${s}.${o}.${a}-${l} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}-${l} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a}-${l} <${+s+1}.0.0-0`):(zr("no pr"),s==="0"?o==="0"?c=`>=${s}.${o}.${a}${i} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a} <${+s+1}.0.0-0`),zr("caret return",c),c})},fEe=(t,e)=>(zr("replaceXRanges",t,e),t.split(/\s+/).map(r=>CEe(r,e)).join(" ")),CEe=(t,e)=>{t=t.trim();let r=e.loose?Gi[ki.XRANGELOOSE]:Gi[ki.XRANGE];return t.replace(r,(i,n,s,o,a,l)=>{zr("xRange",t,i,n,s,o,a,l);let c=on(s),u=c||on(o),g=u||on(a),f=g;return n==="="&&f&&(n=""),l=e.includePrerelease?"-0":"",c?n===">"||n==="<"?i="<0.0.0-0":i="*":n&&f?(u&&(o=0),a=0,n===">"?(n=">=",u?(s=+s+1,o=0,a=0):(o=+o+1,a=0)):n==="<="&&(n="<",u?s=+s+1:o=+o+1),n==="<"&&(l="-0"),i=`${n+s}.${o}.${a}${l}`):u?i=`>=${s}.0.0${l} <${+s+1}.0.0-0`:g&&(i=`>=${s}.${o}.0${l} <${s}.${+o+1}.0-0`),zr("xRange return",i),i})},hEe=(t,e)=>(zr("replaceStars",t,e),t.trim().replace(Gi[ki.STAR],"")),aEe=(t,e)=>(zr("replaceGTE0",t,e),t.trim().replace(Gi[e.includePrerelease?ki.GTE0PRE:ki.GTE0],"")),AEe=t=>(e,r,i,n,s,o,a,l,c,u,g,f,h)=>(on(i)?r="":on(n)?r=`>=${i}.0.0${t?"-0":""}`:on(s)?r=`>=${i}.${n}.0${t?"-0":""}`:o?r=`>=${r}`:r=`>=${r}${t?"-0":""}`,on(c)?l="":on(u)?l=`<${+c+1}.0.0-0`:on(g)?l=`<${c}.${+u+1}.0-0`:f?l=`<=${c}.${u}.${g}-${f}`:t?l=`<${c}.${u}.${+g+1}-0`:l=`<=${l}`,`${r} ${l}`.trim()),lEe=(t,e,r)=>{for(let i=0;i0){let n=t[i].semver;if(n.major===e.major&&n.minor===e.minor&&n.patch===e.patch)return!0}return!1}return!0}});var Sp=w((zet,uH)=>{var kp=Symbol("SemVer ANY"),xp=class{static get ANY(){return kp}constructor(e,r){if(r=mEe(r),e instanceof xp){if(e.loose===!!r.loose)return e;e=e.value}Sv("comparator",e,r),this.options=r,this.loose=!!r.loose,this.parse(e),this.semver===kp?this.value="":this.value=this.operator+this.semver.version,Sv("comp",this)}parse(e){let r=this.options.loose?gH[fH.COMPARATORLOOSE]:gH[fH.COMPARATOR],i=e.match(r);if(!i)throw new TypeError(`Invalid comparator: ${e}`);this.operator=i[1]!==void 0?i[1]:"",this.operator==="="&&(this.operator=""),i[2]?this.semver=new hH(i[2],this.options.loose):this.semver=kp}toString(){return this.value}test(e){if(Sv("Comparator.test",e,this.options.loose),this.semver===kp||e===kp)return!0;if(typeof e=="string")try{e=new hH(e,this.options)}catch(r){return!1}return vv(e,this.operator,this.semver,this.options)}intersects(e,r){if(!(e instanceof xp))throw new TypeError("a Comparator is required");if((!r||typeof r!="object")&&(r={loose:!!r,includePrerelease:!1}),this.operator==="")return this.value===""?!0:new pH(e.value,r).test(this.value);if(e.operator==="")return e.value===""?!0:new pH(this.value,r).test(e.semver);let i=(this.operator===">="||this.operator===">")&&(e.operator===">="||e.operator===">"),n=(this.operator==="<="||this.operator==="<")&&(e.operator==="<="||e.operator==="<"),s=this.semver.version===e.semver.version,o=(this.operator===">="||this.operator==="<=")&&(e.operator===">="||e.operator==="<="),a=vv(this.semver,"<",e.semver,r)&&(this.operator===">="||this.operator===">")&&(e.operator==="<="||e.operator==="<"),l=vv(this.semver,">",e.semver,r)&&(this.operator==="<="||this.operator==="<")&&(e.operator===">="||e.operator===">");return i||n||s&&o||a||l}};uH.exports=xp;var mEe=yp(),{re:gH,t:fH}=Ec(),vv=wv(),Sv=Ip(),hH=Hi(),pH=bs()});var Pp=w((_et,dH)=>{var EEe=bs(),IEe=(t,e,r)=>{try{e=new EEe(e,r)}catch(i){return!1}return e.test(t)};dH.exports=IEe});var mH=w((Vet,CH)=>{var yEe=bs(),wEe=(t,e)=>new yEe(t,e).set.map(r=>r.map(i=>i.value).join(" ").trim().split(" "));CH.exports=wEe});var IH=w((Xet,EH)=>{var BEe=Hi(),bEe=bs(),QEe=(t,e,r)=>{let i=null,n=null,s=null;try{s=new bEe(e,r)}catch(o){return null}return t.forEach(o=>{s.test(o)&&(!i||n.compare(o)===-1)&&(i=o,n=new BEe(i,r))}),i};EH.exports=QEe});var wH=w((Zet,yH)=>{var vEe=Hi(),SEe=bs(),kEe=(t,e,r)=>{let i=null,n=null,s=null;try{s=new SEe(e,r)}catch(o){return null}return t.forEach(o=>{s.test(o)&&(!i||n.compare(o)===1)&&(i=o,n=new vEe(i,r))}),i};yH.exports=kEe});var QH=w(($et,BH)=>{var kv=Hi(),xEe=bs(),bH=Bp(),PEe=(t,e)=>{t=new xEe(t,e);let r=new kv("0.0.0");if(t.test(r)||(r=new kv("0.0.0-0"),t.test(r)))return r;r=null;for(let i=0;i{let a=new kv(o.semver.version);switch(o.operator){case">":a.prerelease.length===0?a.patch++:a.prerelease.push(0),a.raw=a.format();case"":case">=":(!s||bH(a,s))&&(s=a);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${o.operator}`)}}),s&&(!r||bH(r,s))&&(r=s)}return r&&t.test(r)?r:null};BH.exports=PEe});var SH=w((ett,vH)=>{var DEe=bs(),REe=(t,e)=>{try{return new DEe(t,e).range||"*"}catch(r){return null}};vH.exports=REe});var TI=w((ttt,kH)=>{var FEe=Hi(),xH=Sp(),{ANY:NEe}=xH,LEe=bs(),TEe=Pp(),PH=Bp(),DH=PI(),OEe=RI(),MEe=DI(),KEe=(t,e,r,i)=>{t=new FEe(t,i),e=new LEe(e,i);let n,s,o,a,l;switch(r){case">":n=PH,s=OEe,o=DH,a=">",l=">=";break;case"<":n=DH,s=MEe,o=PH,a="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(TEe(t,e,i))return!1;for(let c=0;c{h.semver===NEe&&(h=new xH(">=0.0.0")),g=g||h,f=f||h,n(h.semver,g.semver,i)?g=h:o(h.semver,f.semver,i)&&(f=h)}),g.operator===a||g.operator===l||(!f.operator||f.operator===a)&&s(t,f.semver))return!1;if(f.operator===l&&o(t,f.semver))return!1}return!0};kH.exports=KEe});var FH=w((rtt,RH)=>{var UEe=TI(),HEe=(t,e,r)=>UEe(t,e,">",r);RH.exports=HEe});var LH=w((itt,NH)=>{var GEe=TI(),jEe=(t,e,r)=>GEe(t,e,"<",r);NH.exports=jEe});var MH=w((ntt,TH)=>{var OH=bs(),YEe=(t,e,r)=>(t=new OH(t,r),e=new OH(e,r),t.intersects(e));TH.exports=YEe});var UH=w((stt,KH)=>{var qEe=Pp(),JEe=Bs();KH.exports=(t,e,r)=>{let i=[],n=null,s=null,o=t.sort((u,g)=>JEe(u,g,r));for(let u of o)qEe(u,e,r)?(s=u,n||(n=u)):(s&&i.push([n,s]),s=null,n=null);n&&i.push([n,null]);let a=[];for(let[u,g]of i)u===g?a.push(u):!g&&u===o[0]?a.push("*"):g?u===o[0]?a.push(`<=${g}`):a.push(`${u} - ${g}`):a.push(`>=${u}`);let l=a.join(" || "),c=typeof e.raw=="string"?e.raw:String(e);return l.length{var GH=bs(),OI=Sp(),{ANY:xv}=OI,Dp=Pp(),Pv=Bs(),zEe=(t,e,r={})=>{if(t===e)return!0;t=new GH(t,r),e=new GH(e,r);let i=!1;e:for(let n of t.set){for(let s of e.set){let o=WEe(n,s,r);if(i=i||o!==null,o)continue e}if(i)return!1}return!0},WEe=(t,e,r)=>{if(t===e)return!0;if(t.length===1&&t[0].semver===xv){if(e.length===1&&e[0].semver===xv)return!0;r.includePrerelease?t=[new OI(">=0.0.0-0")]:t=[new OI(">=0.0.0")]}if(e.length===1&&e[0].semver===xv){if(r.includePrerelease)return!0;e=[new OI(">=0.0.0")]}let i=new Set,n,s;for(let h of t)h.operator===">"||h.operator===">="?n=jH(n,h,r):h.operator==="<"||h.operator==="<="?s=YH(s,h,r):i.add(h.semver);if(i.size>1)return null;let o;if(n&&s){if(o=Pv(n.semver,s.semver,r),o>0)return null;if(o===0&&(n.operator!==">="||s.operator!=="<="))return null}for(let h of i){if(n&&!Dp(h,String(n),r)||s&&!Dp(h,String(s),r))return null;for(let p of e)if(!Dp(h,String(p),r))return!1;return!0}let a,l,c,u,g=s&&!r.includePrerelease&&s.semver.prerelease.length?s.semver:!1,f=n&&!r.includePrerelease&&n.semver.prerelease.length?n.semver:!1;g&&g.prerelease.length===1&&s.operator==="<"&&g.prerelease[0]===0&&(g=!1);for(let h of e){if(u=u||h.operator===">"||h.operator===">=",c=c||h.operator==="<"||h.operator==="<=",n){if(f&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===f.major&&h.semver.minor===f.minor&&h.semver.patch===f.patch&&(f=!1),h.operator===">"||h.operator===">="){if(a=jH(n,h,r),a===h&&a!==n)return!1}else if(n.operator===">="&&!Dp(n.semver,String(h),r))return!1}if(s){if(g&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===g.major&&h.semver.minor===g.minor&&h.semver.patch===g.patch&&(g=!1),h.operator==="<"||h.operator==="<="){if(l=YH(s,h,r),l===h&&l!==s)return!1}else if(s.operator==="<="&&!Dp(s.semver,String(h),r))return!1}if(!h.operator&&(s||n)&&o!==0)return!1}return!(n&&c&&!s&&o!==0||s&&u&&!n&&o!==0||f||g)},jH=(t,e,r)=>{if(!t)return e;let i=Pv(t.semver,e.semver,r);return i>0?t:i<0||e.operator===">"&&t.operator===">="?e:t},YH=(t,e,r)=>{if(!t)return e;let i=Pv(t.semver,e.semver,r);return i<0?t:i>0||e.operator==="<"&&t.operator==="<="?e:t};HH.exports=zEe});var ri=w((att,JH)=>{var Dv=Ec();JH.exports={re:Dv.re,src:Dv.src,tokens:Dv.t,SEMVER_SPEC_VERSION:Ep().SEMVER_SPEC_VERSION,SemVer:Hi(),compareIdentifiers:QI().compareIdentifiers,rcompareIdentifiers:QI().rcompareIdentifiers,parse:Ic(),valid:h2(),clean:d2(),inc:m2(),diff:b2(),major:v2(),minor:k2(),patch:P2(),prerelease:R2(),compare:Bs(),rcompare:N2(),compareLoose:T2(),compareBuild:xI(),sort:U2(),rsort:G2(),gt:Bp(),lt:PI(),eq:kI(),neq:yv(),gte:DI(),lte:RI(),cmp:wv(),coerce:V2(),Comparator:Sp(),Range:bs(),satisfies:Pp(),toComparators:mH(),maxSatisfying:IH(),minSatisfying:wH(),minVersion:QH(),validRange:SH(),outside:TI(),gtr:FH(),ltr:LH(),intersects:MH(),simplifyRange:UH(),subset:qH()}});var Rv=w(MI=>{"use strict";Object.defineProperty(MI,"__esModule",{value:!0});MI.VERSION=void 0;MI.VERSION="9.1.0"});var Yt=w((exports,module)=>{"use strict";var __spreadArray=exports&&exports.__spreadArray||function(t,e,r){if(r||arguments.length===2)for(var i=0,n=e.length,s;i{(function(t,e){typeof define=="function"&&define.amd?define([],e):typeof KI=="object"&&KI.exports?KI.exports=e():t.regexpToAst=e()})(typeof self!="undefined"?self:WH,function(){function t(){}t.prototype.saveState=function(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}},t.prototype.restoreState=function(p){this.idx=p.idx,this.input=p.input,this.groupIdx=p.groupIdx},t.prototype.pattern=function(p){this.idx=0,this.input=p,this.groupIdx=0,this.consumeChar("/");var m=this.disjunction();this.consumeChar("/");for(var y={type:"Flags",loc:{begin:this.idx,end:p.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};this.isRegExpFlag();)switch(this.popChar()){case"g":o(y,"global");break;case"i":o(y,"ignoreCase");break;case"m":o(y,"multiLine");break;case"u":o(y,"unicode");break;case"y":o(y,"sticky");break}if(this.idx!==this.input.length)throw Error("Redundant input: "+this.input.substring(this.idx));return{type:"Pattern",flags:y,value:m,loc:this.loc(0)}},t.prototype.disjunction=function(){var p=[],m=this.idx;for(p.push(this.alternative());this.peekChar()==="|";)this.consumeChar("|"),p.push(this.alternative());return{type:"Disjunction",value:p,loc:this.loc(m)}},t.prototype.alternative=function(){for(var p=[],m=this.idx;this.isTerm();)p.push(this.term());return{type:"Alternative",value:p,loc:this.loc(m)}},t.prototype.term=function(){return this.isAssertion()?this.assertion():this.atom()},t.prototype.assertion=function(){var p=this.idx;switch(this.popChar()){case"^":return{type:"StartAnchor",loc:this.loc(p)};case"$":return{type:"EndAnchor",loc:this.loc(p)};case"\\":switch(this.popChar()){case"b":return{type:"WordBoundary",loc:this.loc(p)};case"B":return{type:"NonWordBoundary",loc:this.loc(p)}}throw Error("Invalid Assertion Escape");case"(":this.consumeChar("?");var m;switch(this.popChar()){case"=":m="Lookahead";break;case"!":m="NegativeLookahead";break}a(m);var y=this.disjunction();return this.consumeChar(")"),{type:m,value:y,loc:this.loc(p)}}l()},t.prototype.quantifier=function(p){var m,y=this.idx;switch(this.popChar()){case"*":m={atLeast:0,atMost:Infinity};break;case"+":m={atLeast:1,atMost:Infinity};break;case"?":m={atLeast:0,atMost:1};break;case"{":var b=this.integerIncludingZero();switch(this.popChar()){case"}":m={atLeast:b,atMost:b};break;case",":var S;this.isDigit()?(S=this.integerIncludingZero(),m={atLeast:b,atMost:S}):m={atLeast:b,atMost:Infinity},this.consumeChar("}");break}if(p===!0&&m===void 0)return;a(m);break}if(!(p===!0&&m===void 0))return a(m),this.peekChar(0)==="?"?(this.consumeChar("?"),m.greedy=!1):m.greedy=!0,m.type="Quantifier",m.loc=this.loc(y),m},t.prototype.atom=function(){var p,m=this.idx;switch(this.peekChar()){case".":p=this.dotAll();break;case"\\":p=this.atomEscape();break;case"[":p=this.characterClass();break;case"(":p=this.group();break}return p===void 0&&this.isPatternCharacter()&&(p=this.patternCharacter()),a(p),p.loc=this.loc(m),this.isQuantifier()&&(p.quantifier=this.quantifier()),p},t.prototype.dotAll=function(){return this.consumeChar("."),{type:"Set",complement:!0,value:[n(` -`),n("\r"),n("\u2028"),n("\u2029")]}},t.prototype.atomEscape=function(){switch(this.consumeChar("\\"),this.peekChar()){case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return this.decimalEscapeAtom();case"d":case"D":case"s":case"S":case"w":case"W":return this.characterClassEscape();case"f":case"n":case"r":case"t":case"v":return this.controlEscapeAtom();case"c":return this.controlLetterEscapeAtom();case"0":return this.nulCharacterAtom();case"x":return this.hexEscapeSequenceAtom();case"u":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}},t.prototype.decimalEscapeAtom=function(){var p=this.positiveInteger();return{type:"GroupBackReference",value:p}},t.prototype.characterClassEscape=function(){var p,m=!1;switch(this.popChar()){case"d":p=u;break;case"D":p=u,m=!0;break;case"s":p=f;break;case"S":p=f,m=!0;break;case"w":p=g;break;case"W":p=g,m=!0;break}return a(p),{type:"Set",value:p,complement:m}},t.prototype.controlEscapeAtom=function(){var p;switch(this.popChar()){case"f":p=n("\f");break;case"n":p=n(` -`);break;case"r":p=n("\r");break;case"t":p=n(" ");break;case"v":p=n("\v");break}return a(p),{type:"Character",value:p}},t.prototype.controlLetterEscapeAtom=function(){this.consumeChar("c");var p=this.popChar();if(/[a-zA-Z]/.test(p)===!1)throw Error("Invalid ");var m=p.toUpperCase().charCodeAt(0)-64;return{type:"Character",value:m}},t.prototype.nulCharacterAtom=function(){return this.consumeChar("0"),{type:"Character",value:n("\0")}},t.prototype.hexEscapeSequenceAtom=function(){return this.consumeChar("x"),this.parseHexDigits(2)},t.prototype.regExpUnicodeEscapeSequenceAtom=function(){return this.consumeChar("u"),this.parseHexDigits(4)},t.prototype.identityEscapeAtom=function(){var p=this.popChar();return{type:"Character",value:n(p)}},t.prototype.classPatternCharacterAtom=function(){switch(this.peekChar()){case` -`:case"\r":case"\u2028":case"\u2029":case"\\":case"]":throw Error("TBD");default:var p=this.popChar();return{type:"Character",value:n(p)}}},t.prototype.characterClass=function(){var p=[],m=!1;for(this.consumeChar("["),this.peekChar(0)==="^"&&(this.consumeChar("^"),m=!0);this.isClassAtom();){var y=this.classAtom(),b=y.type==="Character";if(b&&this.isRangeDash()){this.consumeChar("-");var S=this.classAtom(),k=S.type==="Character";if(k){if(S.value=this.input.length)throw Error("Unexpected end of input");this.idx++},t.prototype.loc=function(p){return{begin:p,end:this.idx}};var e=/[0-9a-fA-F]/,r=/[0-9]/,i=/[1-9]/;function n(p){return p.charCodeAt(0)}function s(p,m){p.length!==void 0?p.forEach(function(y){m.push(y)}):m.push(p)}function o(p,m){if(p[m]===!0)throw"duplicate flag "+m;p[m]=!0}function a(p){if(p===void 0)throw Error("Internal Error - Should never get here!")}function l(){throw Error("Internal Error - Should never get here!")}var c,u=[];for(c=n("0");c<=n("9");c++)u.push(c);var g=[n("_")].concat(u);for(c=n("a");c<=n("z");c++)g.push(c);for(c=n("A");c<=n("Z");c++)g.push(c);var f=[n(" "),n("\f"),n(` -`),n("\r"),n(" "),n("\v"),n(" "),n("\xA0"),n("\u1680"),n("\u2000"),n("\u2001"),n("\u2002"),n("\u2003"),n("\u2004"),n("\u2005"),n("\u2006"),n("\u2007"),n("\u2008"),n("\u2009"),n("\u200A"),n("\u2028"),n("\u2029"),n("\u202F"),n("\u205F"),n("\u3000"),n("\uFEFF")];function h(){}return h.prototype.visitChildren=function(p){for(var m in p){var y=p[m];p.hasOwnProperty(m)&&(y.type!==void 0?this.visit(y):Array.isArray(y)&&y.forEach(function(b){this.visit(b)},this))}},h.prototype.visit=function(p){switch(p.type){case"Pattern":this.visitPattern(p);break;case"Flags":this.visitFlags(p);break;case"Disjunction":this.visitDisjunction(p);break;case"Alternative":this.visitAlternative(p);break;case"StartAnchor":this.visitStartAnchor(p);break;case"EndAnchor":this.visitEndAnchor(p);break;case"WordBoundary":this.visitWordBoundary(p);break;case"NonWordBoundary":this.visitNonWordBoundary(p);break;case"Lookahead":this.visitLookahead(p);break;case"NegativeLookahead":this.visitNegativeLookahead(p);break;case"Character":this.visitCharacter(p);break;case"Set":this.visitSet(p);break;case"Group":this.visitGroup(p);break;case"GroupBackReference":this.visitGroupBackReference(p);break;case"Quantifier":this.visitQuantifier(p);break}this.visitChildren(p)},h.prototype.visitPattern=function(p){},h.prototype.visitFlags=function(p){},h.prototype.visitDisjunction=function(p){},h.prototype.visitAlternative=function(p){},h.prototype.visitStartAnchor=function(p){},h.prototype.visitEndAnchor=function(p){},h.prototype.visitWordBoundary=function(p){},h.prototype.visitNonWordBoundary=function(p){},h.prototype.visitLookahead=function(p){},h.prototype.visitNegativeLookahead=function(p){},h.prototype.visitCharacter=function(p){},h.prototype.visitSet=function(p){},h.prototype.visitGroup=function(p){},h.prototype.visitGroupBackReference=function(p){},h.prototype.visitQuantifier=function(p){},{RegExpParser:t,BaseRegExpVisitor:h,VERSION:"0.5.0"}})});var GI=w(fg=>{"use strict";Object.defineProperty(fg,"__esModule",{value:!0});fg.clearRegExpParserCache=fg.getRegExpAst=void 0;var _Ee=UI(),HI={},VEe=new _Ee.RegExpParser;function XEe(t){var e=t.toString();if(HI.hasOwnProperty(e))return HI[e];var r=VEe.pattern(e);return HI[e]=r,r}fg.getRegExpAst=XEe;function ZEe(){HI={}}fg.clearRegExpParserCache=ZEe});var ZH=w(Bn=>{"use strict";var $Ee=Bn&&Bn.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(Bn,"__esModule",{value:!0});Bn.canMatchCharCode=Bn.firstCharOptimizedIndices=Bn.getOptimizedStartCodesIndices=Bn.failedOptimizationPrefixMsg=void 0;var zH=UI(),Qs=Yt(),_H=GI(),Ka=Fv(),VH="Complement Sets are not supported for first char optimization";Bn.failedOptimizationPrefixMsg=`Unable to use "first char" lexer optimizations: -`;function eIe(t,e){e===void 0&&(e=!1);try{var r=(0,_H.getRegExpAst)(t),i=jI(r.value,{},r.flags.ignoreCase);return i}catch(s){if(s.message===VH)e&&(0,Qs.PRINT_WARNING)(""+Bn.failedOptimizationPrefixMsg+(" Unable to optimize: < "+t.toString()+` > -`)+` Complement Sets cannot be automatically optimized. - This will disable the lexer's first char optimizations. - See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.`);else{var n="";e&&(n=` - This will disable the lexer's first char optimizations. - See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.`),(0,Qs.PRINT_ERROR)(Bn.failedOptimizationPrefixMsg+` -`+(" Failed parsing: < "+t.toString()+` > -`)+(" Using the regexp-to-ast library version: "+zH.VERSION+` -`)+" Please open an issue at: https://github.com/bd82/regexp-to-ast/issues"+n)}}return[]}Bn.getOptimizedStartCodesIndices=eIe;function jI(t,e,r){switch(t.type){case"Disjunction":for(var i=0;i=Ka.minOptimizationVal)for(var f=u.from>=Ka.minOptimizationVal?u.from:Ka.minOptimizationVal,h=u.to,p=(0,Ka.charCodeToOptimizedIndex)(f),m=(0,Ka.charCodeToOptimizedIndex)(h),y=p;y<=m;y++)e[y]=y}}});break;case"Group":jI(o.value,e,r);break;default:throw Error("Non Exhaustive Match")}var a=o.quantifier!==void 0&&o.quantifier.atLeast===0;if(o.type==="Group"&&Nv(o)===!1||o.type!=="Group"&&a===!1)break}break;default:throw Error("non exhaustive match!")}return(0,Qs.values)(e)}Bn.firstCharOptimizedIndices=jI;function YI(t,e,r){var i=(0,Ka.charCodeToOptimizedIndex)(t);e[i]=i,r===!0&&tIe(t,e)}function tIe(t,e){var r=String.fromCharCode(t),i=r.toUpperCase();if(i!==r){var n=(0,Ka.charCodeToOptimizedIndex)(i.charCodeAt(0));e[n]=n}else{var s=r.toLowerCase();if(s!==r){var n=(0,Ka.charCodeToOptimizedIndex)(s.charCodeAt(0));e[n]=n}}}function XH(t,e){return(0,Qs.find)(t.value,function(r){if(typeof r=="number")return(0,Qs.contains)(e,r);var i=r;return(0,Qs.find)(e,function(n){return i.from<=n&&n<=i.to})!==void 0})}function Nv(t){return t.quantifier&&t.quantifier.atLeast===0?!0:t.value?(0,Qs.isArray)(t.value)?(0,Qs.every)(t.value,Nv):Nv(t.value):!1}var rIe=function(t){$Ee(e,t);function e(r){var i=t.call(this)||this;return i.targetCharCodes=r,i.found=!1,i}return e.prototype.visitChildren=function(r){if(this.found!==!0){switch(r.type){case"Lookahead":this.visitLookahead(r);return;case"NegativeLookahead":this.visitNegativeLookahead(r);return}t.prototype.visitChildren.call(this,r)}},e.prototype.visitCharacter=function(r){(0,Qs.contains)(this.targetCharCodes,r.value)&&(this.found=!0)},e.prototype.visitSet=function(r){r.complement?XH(r,this.targetCharCodes)===void 0&&(this.found=!0):XH(r,this.targetCharCodes)!==void 0&&(this.found=!0)},e}(zH.BaseRegExpVisitor);function iIe(t,e){if(e instanceof RegExp){var r=(0,_H.getRegExpAst)(e),i=new rIe(t);return i.visit(r),i.found}else return(0,Qs.find)(e,function(n){return(0,Qs.contains)(t,n.charCodeAt(0))})!==void 0}Bn.canMatchCharCode=iIe});var Fv=w(Ze=>{"use strict";var $H=Ze&&Ze.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(Ze,"__esModule",{value:!0});Ze.charCodeToOptimizedIndex=Ze.minOptimizationVal=Ze.buildLineBreakIssueMessage=Ze.LineTerminatorOptimizedTester=Ze.isShortPattern=Ze.isCustomPattern=Ze.cloneEmptyGroups=Ze.performWarningRuntimeChecks=Ze.performRuntimeChecks=Ze.addStickyFlag=Ze.addStartOfInput=Ze.findUnreachablePatterns=Ze.findModesThatDoNotExist=Ze.findInvalidGroupType=Ze.findDuplicatePatterns=Ze.findUnsupportedFlags=Ze.findStartOfInputAnchor=Ze.findEmptyMatchRegExps=Ze.findEndOfInputAnchor=Ze.findInvalidPatterns=Ze.findMissingPatterns=Ze.validatePatterns=Ze.analyzeTokenTypes=Ze.enableSticky=Ze.disableSticky=Ze.SUPPORT_STICKY=Ze.MODES=Ze.DEFAULT_MODE=void 0;var eG=UI(),Ar=Rp(),Ne=Yt(),hg=ZH(),tG=GI(),Lo="PATTERN";Ze.DEFAULT_MODE="defaultMode";Ze.MODES="modes";Ze.SUPPORT_STICKY=typeof new RegExp("(?:)").sticky=="boolean";function nIe(){Ze.SUPPORT_STICKY=!1}Ze.disableSticky=nIe;function sIe(){Ze.SUPPORT_STICKY=!0}Ze.enableSticky=sIe;function aIe(t,e){e=(0,Ne.defaults)(e,{useSticky:Ze.SUPPORT_STICKY,debug:!1,safeMode:!1,positionTracking:"full",lineTerminatorCharacters:["\r",` -`],tracer:function(S,k){return k()}});var r=e.tracer;r("initCharCodeToOptimizedIndexMap",function(){oIe()});var i;r("Reject Lexer.NA",function(){i=(0,Ne.reject)(t,function(S){return S[Lo]===Ar.Lexer.NA})});var n=!1,s;r("Transform Patterns",function(){n=!1,s=(0,Ne.map)(i,function(S){var k=S[Lo];if((0,Ne.isRegExp)(k)){var T=k.source;return T.length===1&&T!=="^"&&T!=="$"&&T!=="."&&!k.ignoreCase?T:T.length===2&&T[0]==="\\"&&!(0,Ne.contains)(["d","D","s","S","t","r","n","t","0","c","b","B","f","v","w","W"],T[1])?T[1]:e.useSticky?Tv(k):Lv(k)}else{if((0,Ne.isFunction)(k))return n=!0,{exec:k};if((0,Ne.has)(k,"exec"))return n=!0,k;if(typeof k=="string"){if(k.length===1)return k;var Y=k.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&"),j=new RegExp(Y);return e.useSticky?Tv(j):Lv(j)}else throw Error("non exhaustive match")}})});var o,a,l,c,u;r("misc mapping",function(){o=(0,Ne.map)(i,function(S){return S.tokenTypeIdx}),a=(0,Ne.map)(i,function(S){var k=S.GROUP;if(k!==Ar.Lexer.SKIPPED){if((0,Ne.isString)(k))return k;if((0,Ne.isUndefined)(k))return!1;throw Error("non exhaustive match")}}),l=(0,Ne.map)(i,function(S){var k=S.LONGER_ALT;if(k){var T=(0,Ne.isArray)(k)?(0,Ne.map)(k,function(Y){return(0,Ne.indexOf)(i,Y)}):[(0,Ne.indexOf)(i,k)];return T}}),c=(0,Ne.map)(i,function(S){return S.PUSH_MODE}),u=(0,Ne.map)(i,function(S){return(0,Ne.has)(S,"POP_MODE")})});var g;r("Line Terminator Handling",function(){var S=nG(e.lineTerminatorCharacters);g=(0,Ne.map)(i,function(k){return!1}),e.positionTracking!=="onlyOffset"&&(g=(0,Ne.map)(i,function(k){if((0,Ne.has)(k,"LINE_BREAKS"))return k.LINE_BREAKS;if(iG(k,S)===!1)return(0,hg.canMatchCharCode)(S,k.PATTERN)}))});var f,h,p,m;r("Misc Mapping #2",function(){f=(0,Ne.map)(i,Ov),h=(0,Ne.map)(s,rG),p=(0,Ne.reduce)(i,function(S,k){var T=k.GROUP;return(0,Ne.isString)(T)&&T!==Ar.Lexer.SKIPPED&&(S[T]=[]),S},{}),m=(0,Ne.map)(s,function(S,k){return{pattern:s[k],longerAlt:l[k],canLineTerminator:g[k],isCustom:f[k],short:h[k],group:a[k],push:c[k],pop:u[k],tokenTypeIdx:o[k],tokenType:i[k]}})});var y=!0,b=[];return e.safeMode||r("First Char Optimization",function(){b=(0,Ne.reduce)(i,function(S,k,T){if(typeof k.PATTERN=="string"){var Y=k.PATTERN.charCodeAt(0),j=Kv(Y);Mv(S,j,m[T])}else if((0,Ne.isArray)(k.START_CHARS_HINT)){var Z;(0,Ne.forEach)(k.START_CHARS_HINT,function(re){var ee=typeof re=="string"?re.charCodeAt(0):re,A=Kv(ee);Z!==A&&(Z=A,Mv(S,A,m[T]))})}else if((0,Ne.isRegExp)(k.PATTERN))if(k.PATTERN.unicode)y=!1,e.ensureOptimizations&&(0,Ne.PRINT_ERROR)(""+hg.failedOptimizationPrefixMsg+(" Unable to analyze < "+k.PATTERN.toString()+` > pattern. -`)+` The regexp unicode flag is not currently supported by the regexp-to-ast library. - This will disable the lexer's first char optimizations. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE`);else{var J=(0,hg.getOptimizedStartCodesIndices)(k.PATTERN,e.ensureOptimizations);(0,Ne.isEmpty)(J)&&(y=!1),(0,Ne.forEach)(J,function(re){Mv(S,re,m[T])})}else e.ensureOptimizations&&(0,Ne.PRINT_ERROR)(""+hg.failedOptimizationPrefixMsg+(" TokenType: <"+k.name+`> is using a custom token pattern without providing parameter. -`)+` This will disable the lexer's first char optimizations. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE`),y=!1;return S},[])}),r("ArrayPacking",function(){b=(0,Ne.packArray)(b)}),{emptyGroups:p,patternIdxToConfig:m,charCodeToPatternIdxToConfig:b,hasCustom:n,canBeOptimized:y}}Ze.analyzeTokenTypes=aIe;function lIe(t,e){var r=[],i=sG(t);r=r.concat(i.errors);var n=oG(i.valid),s=n.valid;return r=r.concat(n.errors),r=r.concat(AIe(s)),r=r.concat(aG(s)),r=r.concat(AG(s,e)),r=r.concat(lG(s)),r}Ze.validatePatterns=lIe;function AIe(t){var e=[],r=(0,Ne.filter)(t,function(i){return(0,Ne.isRegExp)(i[Lo])});return e=e.concat(cG(r)),e=e.concat(gG(r)),e=e.concat(fG(r)),e=e.concat(hG(r)),e=e.concat(uG(r)),e}function sG(t){var e=(0,Ne.filter)(t,function(n){return!(0,Ne.has)(n,Lo)}),r=(0,Ne.map)(e,function(n){return{message:"Token Type: ->"+n.name+"<- missing static 'PATTERN' property",type:Ar.LexerDefinitionErrorType.MISSING_PATTERN,tokenTypes:[n]}}),i=(0,Ne.difference)(t,e);return{errors:r,valid:i}}Ze.findMissingPatterns=sG;function oG(t){var e=(0,Ne.filter)(t,function(n){var s=n[Lo];return!(0,Ne.isRegExp)(s)&&!(0,Ne.isFunction)(s)&&!(0,Ne.has)(s,"exec")&&!(0,Ne.isString)(s)}),r=(0,Ne.map)(e,function(n){return{message:"Token Type: ->"+n.name+"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.",type:Ar.LexerDefinitionErrorType.INVALID_PATTERN,tokenTypes:[n]}}),i=(0,Ne.difference)(t,e);return{errors:r,valid:i}}Ze.findInvalidPatterns=oG;var cIe=/[^\\][\$]/;function cG(t){var e=function(n){$H(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitEndAnchor=function(o){this.found=!0},s}(eG.BaseRegExpVisitor),r=(0,Ne.filter)(t,function(n){var s=n[Lo];try{var o=(0,tG.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch(l){return cIe.test(s.source)}}),i=(0,Ne.map)(r,function(n){return{message:`Unexpected RegExp Anchor Error: - Token Type: ->`+n.name+`<- static 'PATTERN' cannot contain end of input anchor '$' - See chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:Ar.LexerDefinitionErrorType.EOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}Ze.findEndOfInputAnchor=cG;function uG(t){var e=(0,Ne.filter)(t,function(i){var n=i[Lo];return n.test("")}),r=(0,Ne.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'PATTERN' must not match an empty string",type:Ar.LexerDefinitionErrorType.EMPTY_MATCH_PATTERN,tokenTypes:[i]}});return r}Ze.findEmptyMatchRegExps=uG;var uIe=/[^\\[][\^]|^\^/;function gG(t){var e=function(n){$H(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitStartAnchor=function(o){this.found=!0},s}(eG.BaseRegExpVisitor),r=(0,Ne.filter)(t,function(n){var s=n[Lo];try{var o=(0,tG.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch(l){return uIe.test(s.source)}}),i=(0,Ne.map)(r,function(n){return{message:`Unexpected RegExp Anchor Error: - Token Type: ->`+n.name+`<- static 'PATTERN' cannot contain start of input anchor '^' - See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:Ar.LexerDefinitionErrorType.SOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}Ze.findStartOfInputAnchor=gG;function fG(t){var e=(0,Ne.filter)(t,function(i){var n=i[Lo];return n instanceof RegExp&&(n.multiline||n.global)}),r=(0,Ne.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'PATTERN' may NOT contain global('g') or multiline('m')",type:Ar.LexerDefinitionErrorType.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[i]}});return r}Ze.findUnsupportedFlags=fG;function hG(t){var e=[],r=(0,Ne.map)(t,function(s){return(0,Ne.reduce)(t,function(o,a){return s.PATTERN.source===a.PATTERN.source&&!(0,Ne.contains)(e,a)&&a.PATTERN!==Ar.Lexer.NA&&(e.push(a),o.push(a)),o},[])});r=(0,Ne.compact)(r);var i=(0,Ne.filter)(r,function(s){return s.length>1}),n=(0,Ne.map)(i,function(s){var o=(0,Ne.map)(s,function(l){return l.name}),a=(0,Ne.first)(s).PATTERN;return{message:"The same RegExp pattern ->"+a+"<-"+("has been used in all of the following Token Types: "+o.join(", ")+" <-"),type:Ar.LexerDefinitionErrorType.DUPLICATE_PATTERNS_FOUND,tokenTypes:s}});return n}Ze.findDuplicatePatterns=hG;function aG(t){var e=(0,Ne.filter)(t,function(i){if(!(0,Ne.has)(i,"GROUP"))return!1;var n=i.GROUP;return n!==Ar.Lexer.SKIPPED&&n!==Ar.Lexer.NA&&!(0,Ne.isString)(n)}),r=(0,Ne.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String",type:Ar.LexerDefinitionErrorType.INVALID_GROUP_TYPE_FOUND,tokenTypes:[i]}});return r}Ze.findInvalidGroupType=aG;function AG(t,e){var r=(0,Ne.filter)(t,function(n){return n.PUSH_MODE!==void 0&&!(0,Ne.contains)(e,n.PUSH_MODE)}),i=(0,Ne.map)(r,function(n){var s="Token Type: ->"+n.name+"<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->"+n.PUSH_MODE+"<-which does not exist";return{message:s,type:Ar.LexerDefinitionErrorType.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[n]}});return i}Ze.findModesThatDoNotExist=AG;function lG(t){var e=[],r=(0,Ne.reduce)(t,function(i,n,s){var o=n.PATTERN;return o===Ar.Lexer.NA||((0,Ne.isString)(o)?i.push({str:o,idx:s,tokenType:n}):(0,Ne.isRegExp)(o)&&fIe(o)&&i.push({str:o.source,idx:s,tokenType:n})),i},[]);return(0,Ne.forEach)(t,function(i,n){(0,Ne.forEach)(r,function(s){var o=s.str,a=s.idx,l=s.tokenType;if(n"+i.name+"<-")+`in the lexer's definition. -See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;e.push({message:c,type:Ar.LexerDefinitionErrorType.UNREACHABLE_PATTERN,tokenTypes:[i,l]})}})}),e}Ze.findUnreachablePatterns=lG;function gIe(t,e){if((0,Ne.isRegExp)(e)){var r=e.exec(t);return r!==null&&r.index===0}else{if((0,Ne.isFunction)(e))return e(t,0,[],{});if((0,Ne.has)(e,"exec"))return e.exec(t,0,[],{});if(typeof e=="string")return e===t;throw Error("non exhaustive match")}}function fIe(t){var e=[".","\\","[","]","|","^","$","(",")","?","*","+","{"];return(0,Ne.find)(e,function(r){return t.source.indexOf(r)!==-1})===void 0}function Lv(t){var e=t.ignoreCase?"i":"";return new RegExp("^(?:"+t.source+")",e)}Ze.addStartOfInput=Lv;function Tv(t){var e=t.ignoreCase?"iy":"y";return new RegExp(""+t.source,e)}Ze.addStickyFlag=Tv;function hIe(t,e,r){var i=[];return(0,Ne.has)(t,Ze.DEFAULT_MODE)||i.push({message:"A MultiMode Lexer cannot be initialized without a <"+Ze.DEFAULT_MODE+`> property in its definition -`,type:Ar.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),(0,Ne.has)(t,Ze.MODES)||i.push({message:"A MultiMode Lexer cannot be initialized without a <"+Ze.MODES+`> property in its definition -`,type:Ar.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),(0,Ne.has)(t,Ze.MODES)&&(0,Ne.has)(t,Ze.DEFAULT_MODE)&&!(0,Ne.has)(t.modes,t.defaultMode)&&i.push({message:"A MultiMode Lexer cannot be initialized with a "+Ze.DEFAULT_MODE+": <"+t.defaultMode+`>which does not exist -`,type:Ar.LexerDefinitionErrorType.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),(0,Ne.has)(t,Ze.MODES)&&(0,Ne.forEach)(t.modes,function(n,s){(0,Ne.forEach)(n,function(o,a){(0,Ne.isUndefined)(o)&&i.push({message:"A Lexer cannot be initialized using an undefined Token Type. Mode:"+("<"+s+"> at index: <"+a+`> -`),type:Ar.LexerDefinitionErrorType.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED})})}),i}Ze.performRuntimeChecks=hIe;function pIe(t,e,r){var i=[],n=!1,s=(0,Ne.compact)((0,Ne.flatten)((0,Ne.mapValues)(t.modes,function(l){return l}))),o=(0,Ne.reject)(s,function(l){return l[Lo]===Ar.Lexer.NA}),a=nG(r);return e&&(0,Ne.forEach)(o,function(l){var c=iG(l,a);if(c!==!1){var u=pG(l,c),g={message:u,type:c.issue,tokenType:l};i.push(g)}else(0,Ne.has)(l,"LINE_BREAKS")?l.LINE_BREAKS===!0&&(n=!0):(0,hg.canMatchCharCode)(a,l.PATTERN)&&(n=!0)}),e&&!n&&i.push({message:`Warning: No LINE_BREAKS Found. - This Lexer has been defined to track line and column information, - But none of the Token Types can be identified as matching a line terminator. - See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS - for details.`,type:Ar.LexerDefinitionErrorType.NO_LINE_BREAKS_FLAGS}),i}Ze.performWarningRuntimeChecks=pIe;function dIe(t){var e={},r=(0,Ne.keys)(t);return(0,Ne.forEach)(r,function(i){var n=t[i];if((0,Ne.isArray)(n))e[i]=[];else throw Error("non exhaustive match")}),e}Ze.cloneEmptyGroups=dIe;function Ov(t){var e=t.PATTERN;if((0,Ne.isRegExp)(e))return!1;if((0,Ne.isFunction)(e))return!0;if((0,Ne.has)(e,"exec"))return!0;if((0,Ne.isString)(e))return!1;throw Error("non exhaustive match")}Ze.isCustomPattern=Ov;function rG(t){return(0,Ne.isString)(t)&&t.length===1?t.charCodeAt(0):!1}Ze.isShortPattern=rG;Ze.LineTerminatorOptimizedTester={test:function(t){for(var e=t.length,r=this.lastIndex;r Token Type -`)+(" Root cause: "+e.errMsg+`. -`)+" For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR";if(e.issue===Ar.LexerDefinitionErrorType.CUSTOM_LINE_BREAK)return`Warning: A Custom Token Pattern should specify the option. -`+(" The problem is in the <"+t.name+`> Token Type -`)+" For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK";throw Error("non exhaustive match")}Ze.buildLineBreakIssueMessage=pG;function nG(t){var e=(0,Ne.map)(t,function(r){return(0,Ne.isString)(r)&&r.length>0?r.charCodeAt(0):r});return e}function Mv(t,e,r){t[e]===void 0?t[e]=[r]:t[e].push(r)}Ze.minOptimizationVal=256;var qI=[];function Kv(t){return t255?255+~~(t/255):t}}});var pg=w(Ft=>{"use strict";Object.defineProperty(Ft,"__esModule",{value:!0});Ft.isTokenType=Ft.hasExtendingTokensTypesMapProperty=Ft.hasExtendingTokensTypesProperty=Ft.hasCategoriesProperty=Ft.hasShortKeyProperty=Ft.singleAssignCategoriesToksMap=Ft.assignCategoriesMapProp=Ft.assignCategoriesTokensProp=Ft.assignTokenDefaultProps=Ft.expandCategories=Ft.augmentTokenTypes=Ft.tokenIdxToClass=Ft.tokenShortNameIdx=Ft.tokenStructuredMatcherNoCategories=Ft.tokenStructuredMatcher=void 0;var ii=Yt();function CIe(t,e){var r=t.tokenTypeIdx;return r===e.tokenTypeIdx?!0:e.isParent===!0&&e.categoryMatchesMap[r]===!0}Ft.tokenStructuredMatcher=CIe;function mIe(t,e){return t.tokenTypeIdx===e.tokenTypeIdx}Ft.tokenStructuredMatcherNoCategories=mIe;Ft.tokenShortNameIdx=1;Ft.tokenIdxToClass={};function EIe(t){var e=dG(t);CG(e),EG(e),mG(e),(0,ii.forEach)(e,function(r){r.isParent=r.categoryMatches.length>0})}Ft.augmentTokenTypes=EIe;function dG(t){for(var e=(0,ii.cloneArr)(t),r=t,i=!0;i;){r=(0,ii.compact)((0,ii.flatten)((0,ii.map)(r,function(s){return s.CATEGORIES})));var n=(0,ii.difference)(r,e);e=e.concat(n),(0,ii.isEmpty)(n)?i=!1:r=n}return e}Ft.expandCategories=dG;function CG(t){(0,ii.forEach)(t,function(e){IG(e)||(Ft.tokenIdxToClass[Ft.tokenShortNameIdx]=e,e.tokenTypeIdx=Ft.tokenShortNameIdx++),Uv(e)&&!(0,ii.isArray)(e.CATEGORIES)&&(e.CATEGORIES=[e.CATEGORIES]),Uv(e)||(e.CATEGORIES=[]),yG(e)||(e.categoryMatches=[]),wG(e)||(e.categoryMatchesMap={})})}Ft.assignTokenDefaultProps=CG;function mG(t){(0,ii.forEach)(t,function(e){e.categoryMatches=[],(0,ii.forEach)(e.categoryMatchesMap,function(r,i){e.categoryMatches.push(Ft.tokenIdxToClass[i].tokenTypeIdx)})})}Ft.assignCategoriesTokensProp=mG;function EG(t){(0,ii.forEach)(t,function(e){Hv([],e)})}Ft.assignCategoriesMapProp=EG;function Hv(t,e){(0,ii.forEach)(t,function(r){e.categoryMatchesMap[r.tokenTypeIdx]=!0}),(0,ii.forEach)(e.CATEGORIES,function(r){var i=t.concat(e);(0,ii.contains)(i,r)||Hv(i,r)})}Ft.singleAssignCategoriesToksMap=Hv;function IG(t){return(0,ii.has)(t,"tokenTypeIdx")}Ft.hasShortKeyProperty=IG;function Uv(t){return(0,ii.has)(t,"CATEGORIES")}Ft.hasCategoriesProperty=Uv;function yG(t){return(0,ii.has)(t,"categoryMatches")}Ft.hasExtendingTokensTypesProperty=yG;function wG(t){return(0,ii.has)(t,"categoryMatchesMap")}Ft.hasExtendingTokensTypesMapProperty=wG;function IIe(t){return(0,ii.has)(t,"tokenTypeIdx")}Ft.isTokenType=IIe});var Gv=w(JI=>{"use strict";Object.defineProperty(JI,"__esModule",{value:!0});JI.defaultLexerErrorProvider=void 0;JI.defaultLexerErrorProvider={buildUnableToPopLexerModeMessage:function(t){return"Unable to pop Lexer Mode after encountering Token ->"+t.image+"<- The Mode Stack is empty"},buildUnexpectedCharactersMessage:function(t,e,r,i,n){return"unexpected character: ->"+t.charAt(e)+"<- at offset: "+e+","+(" skipped "+r+" characters.")}}});var Rp=w(bc=>{"use strict";Object.defineProperty(bc,"__esModule",{value:!0});bc.Lexer=bc.LexerDefinitionErrorType=void 0;var oo=Fv(),lr=Yt(),yIe=pg(),wIe=Gv(),BIe=GI(),bIe;(function(t){t[t.MISSING_PATTERN=0]="MISSING_PATTERN",t[t.INVALID_PATTERN=1]="INVALID_PATTERN",t[t.EOI_ANCHOR_FOUND=2]="EOI_ANCHOR_FOUND",t[t.UNSUPPORTED_FLAGS_FOUND=3]="UNSUPPORTED_FLAGS_FOUND",t[t.DUPLICATE_PATTERNS_FOUND=4]="DUPLICATE_PATTERNS_FOUND",t[t.INVALID_GROUP_TYPE_FOUND=5]="INVALID_GROUP_TYPE_FOUND",t[t.PUSH_MODE_DOES_NOT_EXIST=6]="PUSH_MODE_DOES_NOT_EXIST",t[t.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]="MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE",t[t.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]="MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY",t[t.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]="MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST",t[t.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]="LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED",t[t.SOI_ANCHOR_FOUND=11]="SOI_ANCHOR_FOUND",t[t.EMPTY_MATCH_PATTERN=12]="EMPTY_MATCH_PATTERN",t[t.NO_LINE_BREAKS_FLAGS=13]="NO_LINE_BREAKS_FLAGS",t[t.UNREACHABLE_PATTERN=14]="UNREACHABLE_PATTERN",t[t.IDENTIFY_TERMINATOR=15]="IDENTIFY_TERMINATOR",t[t.CUSTOM_LINE_BREAK=16]="CUSTOM_LINE_BREAK"})(bIe=bc.LexerDefinitionErrorType||(bc.LexerDefinitionErrorType={}));var Fp={deferDefinitionErrorsHandling:!1,positionTracking:"full",lineTerminatorsPattern:/\n|\r\n?/g,lineTerminatorCharacters:[` -`,"\r"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:wIe.defaultLexerErrorProvider,traceInitPerf:!1,skipValidations:!1};Object.freeze(Fp);var QIe=function(){function t(e,r){var i=this;if(r===void 0&&(r=Fp),this.lexerDefinition=e,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.config=void 0,this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},typeof r=="boolean")throw Error(`The second argument to the Lexer constructor is now an ILexerConfig Object. -a boolean 2nd argument is no longer supported`);this.config=(0,lr.merge)(Fp,r);var n=this.config.traceInitPerf;n===!0?(this.traceInitMaxIdent=Infinity,this.traceInitPerf=!0):typeof n=="number"&&(this.traceInitMaxIdent=n,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT("Lexer Constructor",function(){var s,o=!0;i.TRACE_INIT("Lexer Config handling",function(){if(i.config.lineTerminatorsPattern===Fp.lineTerminatorsPattern)i.config.lineTerminatorsPattern=oo.LineTerminatorOptimizedTester;else if(i.config.lineTerminatorCharacters===Fp.lineTerminatorCharacters)throw Error(`Error: Missing property on the Lexer config. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS`);if(r.safeMode&&r.ensureOptimizations)throw Error('"safeMode" and "ensureOptimizations" flags are mutually exclusive.');i.trackStartLines=/full|onlyStart/i.test(i.config.positionTracking),i.trackEndLines=/full/i.test(i.config.positionTracking),(0,lr.isArray)(e)?(s={modes:{}},s.modes[oo.DEFAULT_MODE]=(0,lr.cloneArr)(e),s[oo.DEFAULT_MODE]=oo.DEFAULT_MODE):(o=!1,s=(0,lr.cloneObj)(e))}),i.config.skipValidations===!1&&(i.TRACE_INIT("performRuntimeChecks",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,oo.performRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))}),i.TRACE_INIT("performWarningRuntimeChecks",function(){i.lexerDefinitionWarning=i.lexerDefinitionWarning.concat((0,oo.performWarningRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))})),s.modes=s.modes?s.modes:{},(0,lr.forEach)(s.modes,function(u,g){s.modes[g]=(0,lr.reject)(u,function(f){return(0,lr.isUndefined)(f)})});var a=(0,lr.keys)(s.modes);if((0,lr.forEach)(s.modes,function(u,g){i.TRACE_INIT("Mode: <"+g+"> processing",function(){if(i.modes.push(g),i.config.skipValidations===!1&&i.TRACE_INIT("validatePatterns",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,oo.validatePatterns)(u,a))}),(0,lr.isEmpty)(i.lexerDefinitionErrors)){(0,yIe.augmentTokenTypes)(u);var f;i.TRACE_INIT("analyzeTokenTypes",function(){f=(0,oo.analyzeTokenTypes)(u,{lineTerminatorCharacters:i.config.lineTerminatorCharacters,positionTracking:r.positionTracking,ensureOptimizations:r.ensureOptimizations,safeMode:r.safeMode,tracer:i.TRACE_INIT.bind(i)})}),i.patternIdxToConfig[g]=f.patternIdxToConfig,i.charCodeToPatternIdxToConfig[g]=f.charCodeToPatternIdxToConfig,i.emptyGroups=(0,lr.merge)(i.emptyGroups,f.emptyGroups),i.hasCustom=f.hasCustom||i.hasCustom,i.canModeBeOptimized[g]=f.canBeOptimized}})}),i.defaultMode=s.defaultMode,!(0,lr.isEmpty)(i.lexerDefinitionErrors)&&!i.config.deferDefinitionErrorsHandling){var l=(0,lr.map)(i.lexerDefinitionErrors,function(u){return u.message}),c=l.join(`----------------------- -`);throw new Error(`Errors detected in definition of Lexer: -`+c)}(0,lr.forEach)(i.lexerDefinitionWarning,function(u){(0,lr.PRINT_WARNING)(u.message)}),i.TRACE_INIT("Choosing sub-methods implementations",function(){if(oo.SUPPORT_STICKY?(i.chopInput=lr.IDENTITY,i.match=i.matchWithTest):(i.updateLastIndex=lr.NOOP,i.match=i.matchWithExec),o&&(i.handleModes=lr.NOOP),i.trackStartLines===!1&&(i.computeNewColumn=lr.IDENTITY),i.trackEndLines===!1&&(i.updateTokenEndLineColumnLocation=lr.NOOP),/full/i.test(i.config.positionTracking))i.createTokenInstance=i.createFullToken;else if(/onlyStart/i.test(i.config.positionTracking))i.createTokenInstance=i.createStartOnlyToken;else if(/onlyOffset/i.test(i.config.positionTracking))i.createTokenInstance=i.createOffsetOnlyToken;else throw Error('Invalid config option: "'+i.config.positionTracking+'"');i.hasCustom?(i.addToken=i.addTokenUsingPush,i.handlePayload=i.handlePayloadWithCustom):(i.addToken=i.addTokenUsingMemberAccess,i.handlePayload=i.handlePayloadNoCustom)}),i.TRACE_INIT("Failed Optimization Warnings",function(){var u=(0,lr.reduce)(i.canModeBeOptimized,function(g,f,h){return f===!1&&g.push(h),g},[]);if(r.ensureOptimizations&&!(0,lr.isEmpty)(u))throw Error("Lexer Modes: < "+u.join(", ")+` > cannot be optimized. - Disable the "ensureOptimizations" lexer config flag to silently ignore this and run the lexer in an un-optimized mode. - Or inspect the console log for details on how to resolve these issues.`)}),i.TRACE_INIT("clearRegExpParserCache",function(){(0,BIe.clearRegExpParserCache)()}),i.TRACE_INIT("toFastProperties",function(){(0,lr.toFastProperties)(i)})})}return t.prototype.tokenize=function(e,r){if(r===void 0&&(r=this.defaultMode),!(0,lr.isEmpty)(this.lexerDefinitionErrors)){var i=(0,lr.map)(this.lexerDefinitionErrors,function(o){return o.message}),n=i.join(`----------------------- -`);throw new Error(`Unable to Tokenize because Errors detected in definition of Lexer: -`+n)}var s=this.tokenizeInternal(e,r);return s},t.prototype.tokenizeInternal=function(e,r){var i=this,n,s,o,a,l,c,u,g,f,h,p,m,y,b,S,k,T=e,Y=T.length,j=0,Z=0,J=this.hasCustom?0:Math.floor(e.length/10),re=new Array(J),ee=[],A=this.trackStartLines?1:void 0,oe=this.trackStartLines?1:void 0,le=(0,oo.cloneEmptyGroups)(this.emptyGroups),X=this.trackStartLines,O=this.config.lineTerminatorsPattern,L=0,pe=[],Ce=[],Oe=[],te=[];Object.freeze(te);var se=void 0;function be(){return pe}function he(vr){var Gn=(0,oo.charCodeToOptimizedIndex)(vr),gs=Ce[Gn];return gs===void 0?te:gs}var Fe=function(vr){if(Oe.length===1&&vr.tokenType.PUSH_MODE===void 0){var Gn=i.config.errorMessageProvider.buildUnableToPopLexerModeMessage(vr);ee.push({offset:vr.startOffset,line:vr.startLine!==void 0?vr.startLine:void 0,column:vr.startColumn!==void 0?vr.startColumn:void 0,length:vr.image.length,message:Gn})}else{Oe.pop();var gs=(0,lr.last)(Oe);pe=i.patternIdxToConfig[gs],Ce=i.charCodeToPatternIdxToConfig[gs],L=pe.length;var ya=i.canModeBeOptimized[gs]&&i.config.safeMode===!1;Ce&&ya?se=he:se=be}};function Ue(vr){Oe.push(vr),Ce=this.charCodeToPatternIdxToConfig[vr],pe=this.patternIdxToConfig[vr],L=pe.length,L=pe.length;var Gn=this.canModeBeOptimized[vr]&&this.config.safeMode===!1;Ce&&Gn?se=he:se=be}Ue.call(this,r);for(var xe;jc.length){c=a,u=g,xe=gt;break}}}break}}if(c!==null){if(f=c.length,h=xe.group,h!==void 0&&(p=xe.tokenTypeIdx,m=this.createTokenInstance(c,j,p,xe.tokenType,A,oe,f),this.handlePayload(m,u),h===!1?Z=this.addToken(re,Z,m):le[h].push(m)),e=this.chopInput(e,f),j=j+f,oe=this.computeNewColumn(oe,f),X===!0&&xe.canLineTerminator===!0){var Mt=0,mi=void 0,Gt=void 0;O.lastIndex=0;do mi=O.test(c),mi===!0&&(Gt=O.lastIndex-1,Mt++);while(mi===!0);Mt!==0&&(A=A+Mt,oe=f-Gt,this.updateTokenEndLineColumnLocation(m,h,Gt,Mt,A,oe,f))}this.handleModes(xe,Fe,Ue,m)}else{for(var Qr=j,Ti=A,Vs=oe,Un=!1;!Un&&j <"+e+">");var n=(0,lr.timer)(r),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent time: "+s+"ms"),this.traceInitIndent--,o}else return r()},t.SKIPPED="This marks a skipped Token pattern, this means each token identified by it willbe consumed and then thrown into oblivion, this can be used to for example to completely ignore whitespace.",t.NA=/NOT_APPLICABLE/,t}();bc.Lexer=QIe});var WA=w(xi=>{"use strict";Object.defineProperty(xi,"__esModule",{value:!0});xi.tokenMatcher=xi.createTokenInstance=xi.EOF=xi.createToken=xi.hasTokenLabel=xi.tokenName=xi.tokenLabel=void 0;var ao=Yt(),vIe=Rp(),jv=pg();function SIe(t){return BG(t)?t.LABEL:t.name}xi.tokenLabel=SIe;function kIe(t){return t.name}xi.tokenName=kIe;function BG(t){return(0,ao.isString)(t.LABEL)&&t.LABEL!==""}xi.hasTokenLabel=BG;var xIe="parent",bG="categories",QG="label",vG="group",SG="push_mode",kG="pop_mode",xG="longer_alt",PG="line_breaks",DG="start_chars_hint";function RG(t){return PIe(t)}xi.createToken=RG;function PIe(t){var e=t.pattern,r={};if(r.name=t.name,(0,ao.isUndefined)(e)||(r.PATTERN=e),(0,ao.has)(t,xIe))throw`The parent property is no longer supported. -See: https://github.com/chevrotain/chevrotain/issues/564#issuecomment-349062346 for details.`;return(0,ao.has)(t,bG)&&(r.CATEGORIES=t[bG]),(0,jv.augmentTokenTypes)([r]),(0,ao.has)(t,QG)&&(r.LABEL=t[QG]),(0,ao.has)(t,vG)&&(r.GROUP=t[vG]),(0,ao.has)(t,kG)&&(r.POP_MODE=t[kG]),(0,ao.has)(t,SG)&&(r.PUSH_MODE=t[SG]),(0,ao.has)(t,xG)&&(r.LONGER_ALT=t[xG]),(0,ao.has)(t,PG)&&(r.LINE_BREAKS=t[PG]),(0,ao.has)(t,DG)&&(r.START_CHARS_HINT=t[DG]),r}xi.EOF=RG({name:"EOF",pattern:vIe.Lexer.NA});(0,jv.augmentTokenTypes)([xi.EOF]);function DIe(t,e,r,i,n,s,o,a){return{image:e,startOffset:r,endOffset:i,startLine:n,endLine:s,startColumn:o,endColumn:a,tokenTypeIdx:t.tokenTypeIdx,tokenType:t}}xi.createTokenInstance=DIe;function RIe(t,e){return(0,jv.tokenStructuredMatcher)(t,e)}xi.tokenMatcher=RIe});var bn=w(Vt=>{"use strict";var Ua=Vt&&Vt.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(Vt,"__esModule",{value:!0});Vt.serializeProduction=Vt.serializeGrammar=Vt.Terminal=Vt.Alternation=Vt.RepetitionWithSeparator=Vt.Repetition=Vt.RepetitionMandatoryWithSeparator=Vt.RepetitionMandatory=Vt.Option=Vt.Alternative=Vt.Rule=Vt.NonTerminal=Vt.AbstractProduction=void 0;var fr=Yt(),FIe=WA(),To=function(){function t(e){this._definition=e}return Object.defineProperty(t.prototype,"definition",{get:function(){return this._definition},set:function(e){this._definition=e},enumerable:!1,configurable:!0}),t.prototype.accept=function(e){e.visit(this),(0,fr.forEach)(this.definition,function(r){r.accept(e)})},t}();Vt.AbstractProduction=To;var FG=function(t){Ua(e,t);function e(r){var i=t.call(this,[])||this;return i.idx=1,(0,fr.assign)(i,(0,fr.pick)(r,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,"definition",{get:function(){return this.referencedRule!==void 0?this.referencedRule.definition:[]},set:function(r){},enumerable:!1,configurable:!0}),e.prototype.accept=function(r){r.visit(this)},e}(To);Vt.NonTerminal=FG;var NG=function(t){Ua(e,t);function e(r){var i=t.call(this,r.definition)||this;return i.orgText="",(0,fr.assign)(i,(0,fr.pick)(r,function(n){return n!==void 0})),i}return e}(To);Vt.Rule=NG;var LG=function(t){Ua(e,t);function e(r){var i=t.call(this,r.definition)||this;return i.ignoreAmbiguities=!1,(0,fr.assign)(i,(0,fr.pick)(r,function(n){return n!==void 0})),i}return e}(To);Vt.Alternative=LG;var TG=function(t){Ua(e,t);function e(r){var i=t.call(this,r.definition)||this;return i.idx=1,(0,fr.assign)(i,(0,fr.pick)(r,function(n){return n!==void 0})),i}return e}(To);Vt.Option=TG;var OG=function(t){Ua(e,t);function e(r){var i=t.call(this,r.definition)||this;return i.idx=1,(0,fr.assign)(i,(0,fr.pick)(r,function(n){return n!==void 0})),i}return e}(To);Vt.RepetitionMandatory=OG;var MG=function(t){Ua(e,t);function e(r){var i=t.call(this,r.definition)||this;return i.idx=1,(0,fr.assign)(i,(0,fr.pick)(r,function(n){return n!==void 0})),i}return e}(To);Vt.RepetitionMandatoryWithSeparator=MG;var KG=function(t){Ua(e,t);function e(r){var i=t.call(this,r.definition)||this;return i.idx=1,(0,fr.assign)(i,(0,fr.pick)(r,function(n){return n!==void 0})),i}return e}(To);Vt.Repetition=KG;var UG=function(t){Ua(e,t);function e(r){var i=t.call(this,r.definition)||this;return i.idx=1,(0,fr.assign)(i,(0,fr.pick)(r,function(n){return n!==void 0})),i}return e}(To);Vt.RepetitionWithSeparator=UG;var HG=function(t){Ua(e,t);function e(r){var i=t.call(this,r.definition)||this;return i.idx=1,i.ignoreAmbiguities=!1,i.hasPredicates=!1,(0,fr.assign)(i,(0,fr.pick)(r,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,"definition",{get:function(){return this._definition},set:function(r){this._definition=r},enumerable:!1,configurable:!0}),e}(To);Vt.Alternation=HG;var WI=function(){function t(e){this.idx=1,(0,fr.assign)(this,(0,fr.pick)(e,function(r){return r!==void 0}))}return t.prototype.accept=function(e){e.visit(this)},t}();Vt.Terminal=WI;function NIe(t){return(0,fr.map)(t,Np)}Vt.serializeGrammar=NIe;function Np(t){function e(s){return(0,fr.map)(s,Np)}if(t instanceof FG){var r={type:"NonTerminal",name:t.nonTerminalName,idx:t.idx};return(0,fr.isString)(t.label)&&(r.label=t.label),r}else{if(t instanceof LG)return{type:"Alternative",definition:e(t.definition)};if(t instanceof TG)return{type:"Option",idx:t.idx,definition:e(t.definition)};if(t instanceof OG)return{type:"RepetitionMandatory",idx:t.idx,definition:e(t.definition)};if(t instanceof MG)return{type:"RepetitionMandatoryWithSeparator",idx:t.idx,separator:Np(new WI({terminalType:t.separator})),definition:e(t.definition)};if(t instanceof UG)return{type:"RepetitionWithSeparator",idx:t.idx,separator:Np(new WI({terminalType:t.separator})),definition:e(t.definition)};if(t instanceof KG)return{type:"Repetition",idx:t.idx,definition:e(t.definition)};if(t instanceof HG)return{type:"Alternation",idx:t.idx,definition:e(t.definition)};if(t instanceof WI){var i={type:"Terminal",name:t.terminalType.name,label:(0,FIe.tokenLabel)(t.terminalType),idx:t.idx};(0,fr.isString)(t.label)&&(i.terminalLabel=t.label);var n=t.terminalType.PATTERN;return t.terminalType.PATTERN&&(i.pattern=(0,fr.isRegExp)(n)?n.source:n),i}else{if(t instanceof NG)return{type:"Rule",name:t.name,orgText:t.orgText,definition:e(t.definition)};throw Error("non exhaustive match")}}}Vt.serializeProduction=Np});var _I=w(zI=>{"use strict";Object.defineProperty(zI,"__esModule",{value:!0});zI.RestWalker=void 0;var Yv=Yt(),Qn=bn(),LIe=function(){function t(){}return t.prototype.walk=function(e,r){var i=this;r===void 0&&(r=[]),(0,Yv.forEach)(e.definition,function(n,s){var o=(0,Yv.drop)(e.definition,s+1);if(n instanceof Qn.NonTerminal)i.walkProdRef(n,o,r);else if(n instanceof Qn.Terminal)i.walkTerminal(n,o,r);else if(n instanceof Qn.Alternative)i.walkFlat(n,o,r);else if(n instanceof Qn.Option)i.walkOption(n,o,r);else if(n instanceof Qn.RepetitionMandatory)i.walkAtLeastOne(n,o,r);else if(n instanceof Qn.RepetitionMandatoryWithSeparator)i.walkAtLeastOneSep(n,o,r);else if(n instanceof Qn.RepetitionWithSeparator)i.walkManySep(n,o,r);else if(n instanceof Qn.Repetition)i.walkMany(n,o,r);else if(n instanceof Qn.Alternation)i.walkOr(n,o,r);else throw Error("non exhaustive match")})},t.prototype.walkTerminal=function(e,r,i){},t.prototype.walkProdRef=function(e,r,i){},t.prototype.walkFlat=function(e,r,i){var n=r.concat(i);this.walk(e,n)},t.prototype.walkOption=function(e,r,i){var n=r.concat(i);this.walk(e,n)},t.prototype.walkAtLeastOne=function(e,r,i){var n=[new Qn.Option({definition:e.definition})].concat(r,i);this.walk(e,n)},t.prototype.walkAtLeastOneSep=function(e,r,i){var n=GG(e,r,i);this.walk(e,n)},t.prototype.walkMany=function(e,r,i){var n=[new Qn.Option({definition:e.definition})].concat(r,i);this.walk(e,n)},t.prototype.walkManySep=function(e,r,i){var n=GG(e,r,i);this.walk(e,n)},t.prototype.walkOr=function(e,r,i){var n=this,s=r.concat(i);(0,Yv.forEach)(e.definition,function(o){var a=new Qn.Alternative({definition:[o]});n.walk(a,s)})},t}();zI.RestWalker=LIe;function GG(t,e,r){var i=[new Qn.Option({definition:[new Qn.Terminal({terminalType:t.separator})].concat(t.definition)})],n=i.concat(e,r);return n}});var dg=w(VI=>{"use strict";Object.defineProperty(VI,"__esModule",{value:!0});VI.GAstVisitor=void 0;var Oo=bn(),TIe=function(){function t(){}return t.prototype.visit=function(e){var r=e;switch(r.constructor){case Oo.NonTerminal:return this.visitNonTerminal(r);case Oo.Alternative:return this.visitAlternative(r);case Oo.Option:return this.visitOption(r);case Oo.RepetitionMandatory:return this.visitRepetitionMandatory(r);case Oo.RepetitionMandatoryWithSeparator:return this.visitRepetitionMandatoryWithSeparator(r);case Oo.RepetitionWithSeparator:return this.visitRepetitionWithSeparator(r);case Oo.Repetition:return this.visitRepetition(r);case Oo.Alternation:return this.visitAlternation(r);case Oo.Terminal:return this.visitTerminal(r);case Oo.Rule:return this.visitRule(r);default:throw Error("non exhaustive match")}},t.prototype.visitNonTerminal=function(e){},t.prototype.visitAlternative=function(e){},t.prototype.visitOption=function(e){},t.prototype.visitRepetition=function(e){},t.prototype.visitRepetitionMandatory=function(e){},t.prototype.visitRepetitionMandatoryWithSeparator=function(e){},t.prototype.visitRepetitionWithSeparator=function(e){},t.prototype.visitAlternation=function(e){},t.prototype.visitTerminal=function(e){},t.prototype.visitRule=function(e){},t}();VI.GAstVisitor=TIe});var Tp=w(ji=>{"use strict";var OIe=ji&&ji.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(ji,"__esModule",{value:!0});ji.collectMethods=ji.DslMethodsCollectorVisitor=ji.getProductionDslName=ji.isBranchingProd=ji.isOptionalProd=ji.isSequenceProd=void 0;var Lp=Yt(),kr=bn(),MIe=dg();function KIe(t){return t instanceof kr.Alternative||t instanceof kr.Option||t instanceof kr.Repetition||t instanceof kr.RepetitionMandatory||t instanceof kr.RepetitionMandatoryWithSeparator||t instanceof kr.RepetitionWithSeparator||t instanceof kr.Terminal||t instanceof kr.Rule}ji.isSequenceProd=KIe;function qv(t,e){e===void 0&&(e=[]);var r=t instanceof kr.Option||t instanceof kr.Repetition||t instanceof kr.RepetitionWithSeparator;return r?!0:t instanceof kr.Alternation?(0,Lp.some)(t.definition,function(i){return qv(i,e)}):t instanceof kr.NonTerminal&&(0,Lp.contains)(e,t)?!1:t instanceof kr.AbstractProduction?(t instanceof kr.NonTerminal&&e.push(t),(0,Lp.every)(t.definition,function(i){return qv(i,e)})):!1}ji.isOptionalProd=qv;function UIe(t){return t instanceof kr.Alternation}ji.isBranchingProd=UIe;function HIe(t){if(t instanceof kr.NonTerminal)return"SUBRULE";if(t instanceof kr.Option)return"OPTION";if(t instanceof kr.Alternation)return"OR";if(t instanceof kr.RepetitionMandatory)return"AT_LEAST_ONE";if(t instanceof kr.RepetitionMandatoryWithSeparator)return"AT_LEAST_ONE_SEP";if(t instanceof kr.RepetitionWithSeparator)return"MANY_SEP";if(t instanceof kr.Repetition)return"MANY";if(t instanceof kr.Terminal)return"CONSUME";throw Error("non exhaustive match")}ji.getProductionDslName=HIe;var jG=function(t){OIe(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.separator="-",r.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]},r}return e.prototype.reset=function(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}},e.prototype.visitTerminal=function(r){var i=r.terminalType.name+this.separator+"Terminal";(0,Lp.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(r)},e.prototype.visitNonTerminal=function(r){var i=r.nonTerminalName+this.separator+"Terminal";(0,Lp.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(r)},e.prototype.visitOption=function(r){this.dslMethods.option.push(r)},e.prototype.visitRepetitionWithSeparator=function(r){this.dslMethods.repetitionWithSeparator.push(r)},e.prototype.visitRepetitionMandatory=function(r){this.dslMethods.repetitionMandatory.push(r)},e.prototype.visitRepetitionMandatoryWithSeparator=function(r){this.dslMethods.repetitionMandatoryWithSeparator.push(r)},e.prototype.visitRepetition=function(r){this.dslMethods.repetition.push(r)},e.prototype.visitAlternation=function(r){this.dslMethods.alternation.push(r)},e}(MIe.GAstVisitor);ji.DslMethodsCollectorVisitor=jG;var XI=new jG;function GIe(t){XI.reset(),t.accept(XI);var e=XI.dslMethods;return XI.reset(),e}ji.collectMethods=GIe});var Wv=w(Mo=>{"use strict";Object.defineProperty(Mo,"__esModule",{value:!0});Mo.firstForTerminal=Mo.firstForBranching=Mo.firstForSequence=Mo.first=void 0;var ZI=Yt(),YG=bn(),Jv=Tp();function $I(t){if(t instanceof YG.NonTerminal)return $I(t.referencedRule);if(t instanceof YG.Terminal)return WG(t);if((0,Jv.isSequenceProd)(t))return qG(t);if((0,Jv.isBranchingProd)(t))return JG(t);throw Error("non exhaustive match")}Mo.first=$I;function qG(t){for(var e=[],r=t.definition,i=0,n=r.length>i,s,o=!0;n&&o;)s=r[i],o=(0,Jv.isOptionalProd)(s),e=e.concat($I(s)),i=i+1,n=r.length>i;return(0,ZI.uniq)(e)}Mo.firstForSequence=qG;function JG(t){var e=(0,ZI.map)(t.definition,function(r){return $I(r)});return(0,ZI.uniq)((0,ZI.flatten)(e))}Mo.firstForBranching=JG;function WG(t){return[t.terminalType]}Mo.firstForTerminal=WG});var zv=w(ey=>{"use strict";Object.defineProperty(ey,"__esModule",{value:!0});ey.IN=void 0;ey.IN="_~IN~_"});var ZG=w(vs=>{"use strict";var jIe=vs&&vs.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(vs,"__esModule",{value:!0});vs.buildInProdFollowPrefix=vs.buildBetweenProdsFollowPrefix=vs.computeAllProdsFollows=vs.ResyncFollowsWalker=void 0;var YIe=_I(),qIe=Wv(),zG=Yt(),_G=zv(),JIe=bn(),XG=function(t){jIe(e,t);function e(r){var i=t.call(this)||this;return i.topProd=r,i.follows={},i}return e.prototype.startWalking=function(){return this.walk(this.topProd),this.follows},e.prototype.walkTerminal=function(r,i,n){},e.prototype.walkProdRef=function(r,i,n){var s=VG(r.referencedRule,r.idx)+this.topProd.name,o=i.concat(n),a=new JIe.Alternative({definition:o}),l=(0,qIe.first)(a);this.follows[s]=l},e}(YIe.RestWalker);vs.ResyncFollowsWalker=XG;function WIe(t){var e={};return(0,zG.forEach)(t,function(r){var i=new XG(r).startWalking();(0,zG.assign)(e,i)}),e}vs.computeAllProdsFollows=WIe;function VG(t,e){return t.name+e+_G.IN}vs.buildBetweenProdsFollowPrefix=VG;function zIe(t){var e=t.terminalType.name;return e+t.idx+_G.IN}vs.buildInProdFollowPrefix=zIe});var Op=w(Ha=>{"use strict";Object.defineProperty(Ha,"__esModule",{value:!0});Ha.defaultGrammarValidatorErrorProvider=Ha.defaultGrammarResolverErrorProvider=Ha.defaultParserErrorProvider=void 0;var Cg=WA(),_Ie=Yt(),Ao=Yt(),_v=bn(),$G=Tp();Ha.defaultParserErrorProvider={buildMismatchTokenMessage:function(t){var e=t.expected,r=t.actual,i=t.previous,n=t.ruleName,s=(0,Cg.hasTokenLabel)(e),o=s?"--> "+(0,Cg.tokenLabel)(e)+" <--":"token of type --> "+e.name+" <--",a="Expecting "+o+" but found --> '"+r.image+"' <--";return a},buildNotAllInputParsedMessage:function(t){var e=t.firstRedundant,r=t.ruleName;return"Redundant input, expecting EOF but found: "+e.image},buildNoViableAltMessage:function(t){var e=t.expectedPathsPerAlt,r=t.actual,i=t.previous,n=t.customUserDescription,s=t.ruleName,o="Expecting: ",a=(0,Ao.first)(r).image,l=` -but found: '`+a+"'";if(n)return o+n+l;var c=(0,Ao.reduce)(e,function(h,p){return h.concat(p)},[]),u=(0,Ao.map)(c,function(h){return"["+(0,Ao.map)(h,function(p){return(0,Cg.tokenLabel)(p)}).join(", ")+"]"}),g=(0,Ao.map)(u,function(h,p){return" "+(p+1)+". "+h}),f=`one of these possible Token sequences: -`+g.join(` -`);return o+f+l},buildEarlyExitMessage:function(t){var e=t.expectedIterationPaths,r=t.actual,i=t.customUserDescription,n=t.ruleName,s="Expecting: ",o=(0,Ao.first)(r).image,a=` -but found: '`+o+"'";if(i)return s+i+a;var l=(0,Ao.map)(e,function(u){return"["+(0,Ao.map)(u,function(g){return(0,Cg.tokenLabel)(g)}).join(",")+"]"}),c=`expecting at least one iteration which starts with one of these possible Token sequences:: - `+("<"+l.join(" ,")+">");return s+c+a}};Object.freeze(Ha.defaultParserErrorProvider);Ha.defaultGrammarResolverErrorProvider={buildRuleNotFoundError:function(t,e){var r="Invalid grammar, reference to a rule which is not defined: ->"+e.nonTerminalName+`<- -inside top level rule: ->`+t.name+"<-";return r}};Ha.defaultGrammarValidatorErrorProvider={buildDuplicateFoundError:function(t,e){function r(u){return u instanceof _v.Terminal?u.terminalType.name:u instanceof _v.NonTerminal?u.nonTerminalName:""}var i=t.name,n=(0,Ao.first)(e),s=n.idx,o=(0,$G.getProductionDslName)(n),a=r(n),l=s>0,c="->"+o+(l?s:"")+"<- "+(a?"with argument: ->"+a+"<-":"")+` - appears more than once (`+e.length+" times) in the top level rule: ->"+i+`<-. - For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES - `;return c=c.replace(/[ \t]+/g," "),c=c.replace(/\s\s+/g,` -`),c},buildNamespaceConflictError:function(t){var e=`Namespace conflict found in grammar. -`+("The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <"+t.name+`>. -`)+`To resolve this make sure each Terminal and Non-Terminal names are unique -This is easy to accomplish by using the convention that Terminal names start with an uppercase letter -and Non-Terminal names start with a lower case letter.`;return e},buildAlternationPrefixAmbiguityError:function(t){var e=(0,Ao.map)(t.prefixPath,function(n){return(0,Cg.tokenLabel)(n)}).join(", "),r=t.alternation.idx===0?"":t.alternation.idx,i="Ambiguous alternatives: <"+t.ambiguityIndices.join(" ,")+`> due to common lookahead prefix -`+("in inside <"+t.topLevelRule.name+`> Rule, -`)+("<"+e+`> may appears as a prefix path in all these alternatives. -`)+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX -For Further details.`;return i},buildAlternationAmbiguityError:function(t){var e=(0,Ao.map)(t.prefixPath,function(n){return(0,Cg.tokenLabel)(n)}).join(", "),r=t.alternation.idx===0?"":t.alternation.idx,i="Ambiguous Alternatives Detected: <"+t.ambiguityIndices.join(" ,")+"> in "+(" inside <"+t.topLevelRule.name+`> Rule, -`)+("<"+e+`> may appears as a prefix path in all these alternatives. -`);return i=i+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES -For Further details.`,i},buildEmptyRepetitionError:function(t){var e=(0,$G.getProductionDslName)(t.repetition);t.repetition.idx!==0&&(e+=t.repetition.idx);var r="The repetition <"+e+"> within Rule <"+t.topLevelRule.name+`> can never consume any tokens. -This could lead to an infinite loop.`;return r},buildTokenNameError:function(t){return"deprecated"},buildEmptyAlternationError:function(t){var e="Ambiguous empty alternative: <"+(t.emptyChoiceIdx+1)+">"+(" in inside <"+t.topLevelRule.name+`> Rule. -`)+"Only the last alternative may be an empty alternative.";return e},buildTooManyAlternativesError:function(t){var e=`An Alternation cannot have more than 256 alternatives: -`+(" inside <"+t.topLevelRule.name+`> Rule. - has `+(t.alternation.definition.length+1)+" alternatives.");return e},buildLeftRecursionError:function(t){var e=t.topLevelRule.name,r=_Ie.map(t.leftRecursionPath,function(s){return s.name}),i=e+" --> "+r.concat([e]).join(" --> "),n=`Left Recursion found in grammar. -`+("rule: <"+e+`> can be invoked from itself (directly or indirectly) -`)+(`without consuming any Tokens. The grammar path that causes this is: - `+i+` -`)+` To fix this refactor your grammar to remove the left recursion. -see: https://en.wikipedia.org/wiki/LL_parser#Left_Factoring.`;return n},buildInvalidRuleNameError:function(t){return"deprecated"},buildDuplicateRuleNameError:function(t){var e;t.topLevelRule instanceof _v.Rule?e=t.topLevelRule.name:e=t.topLevelRule;var r="Duplicate definition, rule: ->"+e+"<- is already defined in the grammar: ->"+t.grammarName+"<-";return r}}});var rj=w(zA=>{"use strict";var VIe=zA&&zA.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(zA,"__esModule",{value:!0});zA.GastRefResolverVisitor=zA.resolveGrammar=void 0;var XIe=Zn(),ej=Yt(),ZIe=dg();function $Ie(t,e){var r=new tj(t,e);return r.resolveRefs(),r.errors}zA.resolveGrammar=$Ie;var tj=function(t){VIe(e,t);function e(r,i){var n=t.call(this)||this;return n.nameToTopRule=r,n.errMsgProvider=i,n.errors=[],n}return e.prototype.resolveRefs=function(){var r=this;(0,ej.forEach)((0,ej.values)(this.nameToTopRule),function(i){r.currTopLevel=i,i.accept(r)})},e.prototype.visitNonTerminal=function(r){var i=this.nameToTopRule[r.nonTerminalName];if(i)r.referencedRule=i;else{var n=this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel,r);this.errors.push({message:n,type:XIe.ParserDefinitionErrorType.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:r.nonTerminalName})}},e}(ZIe.GAstVisitor);zA.GastRefResolverVisitor=tj});var Kp=w(Mr=>{"use strict";var Qc=Mr&&Mr.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(Mr,"__esModule",{value:!0});Mr.nextPossibleTokensAfter=Mr.possiblePathsFrom=Mr.NextTerminalAfterAtLeastOneSepWalker=Mr.NextTerminalAfterAtLeastOneWalker=Mr.NextTerminalAfterManySepWalker=Mr.NextTerminalAfterManyWalker=Mr.AbstractNextTerminalAfterProductionWalker=Mr.NextAfterTokenWalker=Mr.AbstractNextPossibleTokensWalker=void 0;var ij=_I(),Kt=Yt(),eye=Wv(),Dt=bn(),nj=function(t){Qc(e,t);function e(r,i){var n=t.call(this)||this;return n.topProd=r,n.path=i,n.possibleTokTypes=[],n.nextProductionName="",n.nextProductionOccurrence=0,n.found=!1,n.isAtEndOfPath=!1,n}return e.prototype.startWalking=function(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error("The path does not start with the walker's top Rule!");return this.ruleStack=(0,Kt.cloneArr)(this.path.ruleStack).reverse(),this.occurrenceStack=(0,Kt.cloneArr)(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes},e.prototype.walk=function(r,i){i===void 0&&(i=[]),this.found||t.prototype.walk.call(this,r,i)},e.prototype.walkProdRef=function(r,i,n){if(r.referencedRule.name===this.nextProductionName&&r.idx===this.nextProductionOccurrence){var s=i.concat(n);this.updateExpectedNext(),this.walk(r.referencedRule,s)}},e.prototype.updateExpectedNext=function(){(0,Kt.isEmpty)(this.ruleStack)?(this.nextProductionName="",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())},e}(ij.RestWalker);Mr.AbstractNextPossibleTokensWalker=nj;var tye=function(t){Qc(e,t);function e(r,i){var n=t.call(this,r,i)||this;return n.path=i,n.nextTerminalName="",n.nextTerminalOccurrence=0,n.nextTerminalName=n.path.lastTok.name,n.nextTerminalOccurrence=n.path.lastTokOccurrence,n}return e.prototype.walkTerminal=function(r,i,n){if(this.isAtEndOfPath&&r.terminalType.name===this.nextTerminalName&&r.idx===this.nextTerminalOccurrence&&!this.found){var s=i.concat(n),o=new Dt.Alternative({definition:s});this.possibleTokTypes=(0,eye.first)(o),this.found=!0}},e}(nj);Mr.NextAfterTokenWalker=tye;var Mp=function(t){Qc(e,t);function e(r,i){var n=t.call(this)||this;return n.topRule=r,n.occurrence=i,n.result={token:void 0,occurrence:void 0,isEndOfRule:void 0},n}return e.prototype.startWalking=function(){return this.walk(this.topRule),this.result},e}(ij.RestWalker);Mr.AbstractNextTerminalAfterProductionWalker=Mp;var rye=function(t){Qc(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.walkMany=function(r,i,n){if(r.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof Dt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else t.prototype.walkMany.call(this,r,i,n)},e}(Mp);Mr.NextTerminalAfterManyWalker=rye;var iye=function(t){Qc(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.walkManySep=function(r,i,n){if(r.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof Dt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else t.prototype.walkManySep.call(this,r,i,n)},e}(Mp);Mr.NextTerminalAfterManySepWalker=iye;var nye=function(t){Qc(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.walkAtLeastOne=function(r,i,n){if(r.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof Dt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else t.prototype.walkAtLeastOne.call(this,r,i,n)},e}(Mp);Mr.NextTerminalAfterAtLeastOneWalker=nye;var sye=function(t){Qc(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.walkAtLeastOneSep=function(r,i,n){if(r.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof Dt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else t.prototype.walkAtLeastOneSep.call(this,r,i,n)},e}(Mp);Mr.NextTerminalAfterAtLeastOneSepWalker=sye;function sj(t,e,r){r===void 0&&(r=[]),r=(0,Kt.cloneArr)(r);var i=[],n=0;function s(c){return c.concat((0,Kt.drop)(t,n+1))}function o(c){var u=sj(s(c),e,r);return i.concat(u)}for(;r.length=0;le--){var X=b.definition[le],O={idx:p,def:X.definition.concat((0,Kt.drop)(h)),ruleStack:m,occurrenceStack:y};g.push(O),g.push(o)}else if(b instanceof Dt.Alternative)g.push({idx:p,def:b.definition.concat((0,Kt.drop)(h)),ruleStack:m,occurrenceStack:y});else if(b instanceof Dt.Rule)g.push(oye(b,p,m,y));else throw Error("non exhaustive match")}}return u}Mr.nextPossibleTokensAfter=aye;function oye(t,e,r,i){var n=(0,Kt.cloneArr)(r);n.push(t.name);var s=(0,Kt.cloneArr)(i);return s.push(1),{idx:e,def:t.definition,ruleStack:n,occurrenceStack:s}}});var Up=w(tr=>{"use strict";var oj=tr&&tr.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(tr,"__esModule",{value:!0});tr.areTokenCategoriesNotUsed=tr.isStrictPrefixOfPath=tr.containsPath=tr.getLookaheadPathsForOptionalProd=tr.getLookaheadPathsForOr=tr.lookAheadSequenceFromAlternatives=tr.buildSingleAlternativeLookaheadFunction=tr.buildAlternativesLookAheadFunc=tr.buildLookaheadFuncForOptionalProd=tr.buildLookaheadFuncForOr=tr.getProdType=tr.PROD_TYPE=void 0;var cr=Yt(),aj=Kp(),Aye=_I(),ty=pg(),_A=bn(),lye=dg(),ci;(function(t){t[t.OPTION=0]="OPTION",t[t.REPETITION=1]="REPETITION",t[t.REPETITION_MANDATORY=2]="REPETITION_MANDATORY",t[t.REPETITION_MANDATORY_WITH_SEPARATOR=3]="REPETITION_MANDATORY_WITH_SEPARATOR",t[t.REPETITION_WITH_SEPARATOR=4]="REPETITION_WITH_SEPARATOR",t[t.ALTERNATION=5]="ALTERNATION"})(ci=tr.PROD_TYPE||(tr.PROD_TYPE={}));function cye(t){if(t instanceof _A.Option)return ci.OPTION;if(t instanceof _A.Repetition)return ci.REPETITION;if(t instanceof _A.RepetitionMandatory)return ci.REPETITION_MANDATORY;if(t instanceof _A.RepetitionMandatoryWithSeparator)return ci.REPETITION_MANDATORY_WITH_SEPARATOR;if(t instanceof _A.RepetitionWithSeparator)return ci.REPETITION_WITH_SEPARATOR;if(t instanceof _A.Alternation)return ci.ALTERNATION;throw Error("non exhaustive match")}tr.getProdType=cye;function uye(t,e,r,i,n,s){var o=Aj(t,e,r),a=Vv(o)?ty.tokenStructuredMatcherNoCategories:ty.tokenStructuredMatcher;return s(o,i,a,n)}tr.buildLookaheadFuncForOr=uye;function gye(t,e,r,i,n,s){var o=lj(t,e,n,r),a=Vv(o)?ty.tokenStructuredMatcherNoCategories:ty.tokenStructuredMatcher;return s(o[0],a,i)}tr.buildLookaheadFuncForOptionalProd=gye;function fye(t,e,r,i){var n=t.length,s=(0,cr.every)(t,function(l){return(0,cr.every)(l,function(c){return c.length===1})});if(e)return function(l){for(var c=(0,cr.map)(l,function(k){return k.GATE}),u=0;u{"use strict";var $v=Xt&&Xt.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(Xt,"__esModule",{value:!0});Xt.checkPrefixAlternativesAmbiguities=Xt.validateSomeNonEmptyLookaheadPath=Xt.validateTooManyAlts=Xt.RepetionCollector=Xt.validateAmbiguousAlternationAlternatives=Xt.validateEmptyOrAlternative=Xt.getFirstNoneTerminal=Xt.validateNoLeftRecursion=Xt.validateRuleIsOverridden=Xt.validateRuleDoesNotAlreadyExist=Xt.OccurrenceValidationCollector=Xt.identifyProductionForDuplicates=Xt.validateGrammar=void 0;var nr=Yt(),xr=Yt(),Ko=Zn(),eS=Tp(),mg=Up(),mye=Kp(),lo=bn(),tS=dg();function yye(t,e,r,i,n){var s=nr.map(t,function(h){return Eye(h,i)}),o=nr.map(t,function(h){return rS(h,h,i)}),a=[],l=[],c=[];(0,xr.every)(o,xr.isEmpty)&&(a=(0,xr.map)(t,function(h){return hj(h,i)}),l=(0,xr.map)(t,function(h){return pj(h,e,i)}),c=Cj(t,e,i));var u=Iye(t,r,i),g=(0,xr.map)(t,function(h){return dj(h,i)}),f=(0,xr.map)(t,function(h){return fj(h,t,n,i)});return nr.flatten(s.concat(c,o,a,l,u,g,f))}Xt.validateGrammar=yye;function Eye(t,e){var r=new Ij;t.accept(r);var i=r.allProductions,n=nr.groupBy(i,mj),s=nr.pick(n,function(a){return a.length>1}),o=nr.map(nr.values(s),function(a){var l=nr.first(a),c=e.buildDuplicateFoundError(t,a),u=(0,eS.getProductionDslName)(l),g={message:c,type:Ko.ParserDefinitionErrorType.DUPLICATE_PRODUCTIONS,ruleName:t.name,dslName:u,occurrence:l.idx},f=Ej(l);return f&&(g.parameter=f),g});return o}function mj(t){return(0,eS.getProductionDslName)(t)+"_#_"+t.idx+"_#_"+Ej(t)}Xt.identifyProductionForDuplicates=mj;function Ej(t){return t instanceof lo.Terminal?t.terminalType.name:t instanceof lo.NonTerminal?t.nonTerminalName:""}var Ij=function(t){$v(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.allProductions=[],r}return e.prototype.visitNonTerminal=function(r){this.allProductions.push(r)},e.prototype.visitOption=function(r){this.allProductions.push(r)},e.prototype.visitRepetitionWithSeparator=function(r){this.allProductions.push(r)},e.prototype.visitRepetitionMandatory=function(r){this.allProductions.push(r)},e.prototype.visitRepetitionMandatoryWithSeparator=function(r){this.allProductions.push(r)},e.prototype.visitRepetition=function(r){this.allProductions.push(r)},e.prototype.visitAlternation=function(r){this.allProductions.push(r)},e.prototype.visitTerminal=function(r){this.allProductions.push(r)},e}(tS.GAstVisitor);Xt.OccurrenceValidationCollector=Ij;function fj(t,e,r,i){var n=[],s=(0,xr.reduce)(e,function(a,l){return l.name===t.name?a+1:a},0);if(s>1){var o=i.buildDuplicateRuleNameError({topLevelRule:t,grammarName:r});n.push({message:o,type:Ko.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:t.name})}return n}Xt.validateRuleDoesNotAlreadyExist=fj;function wye(t,e,r){var i=[],n;return nr.contains(e,t)||(n="Invalid rule override, rule: ->"+t+"<- cannot be overridden in the grammar: ->"+r+"<-as it is not defined in any of the super grammars ",i.push({message:n,type:Ko.ParserDefinitionErrorType.INVALID_RULE_OVERRIDE,ruleName:t})),i}Xt.validateRuleIsOverridden=wye;function rS(t,e,r,i){i===void 0&&(i=[]);var n=[],s=Hp(e.definition);if(nr.isEmpty(s))return[];var o=t.name,a=nr.contains(s,t);a&&n.push({message:r.buildLeftRecursionError({topLevelRule:t,leftRecursionPath:i}),type:Ko.ParserDefinitionErrorType.LEFT_RECURSION,ruleName:o});var l=nr.difference(s,i.concat([t])),c=nr.map(l,function(u){var g=nr.cloneArr(i);return g.push(u),rS(t,u,r,g)});return n.concat(nr.flatten(c))}Xt.validateNoLeftRecursion=rS;function Hp(t){var e=[];if(nr.isEmpty(t))return e;var r=nr.first(t);if(r instanceof lo.NonTerminal)e.push(r.referencedRule);else if(r instanceof lo.Alternative||r instanceof lo.Option||r instanceof lo.RepetitionMandatory||r instanceof lo.RepetitionMandatoryWithSeparator||r instanceof lo.RepetitionWithSeparator||r instanceof lo.Repetition)e=e.concat(Hp(r.definition));else if(r instanceof lo.Alternation)e=nr.flatten(nr.map(r.definition,function(o){return Hp(o.definition)}));else if(!(r instanceof lo.Terminal))throw Error("non exhaustive match");var i=(0,eS.isOptionalProd)(r),n=t.length>1;if(i&&n){var s=nr.drop(t);return e.concat(Hp(s))}else return e}Xt.getFirstNoneTerminal=Hp;var iS=function(t){$v(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.alternations=[],r}return e.prototype.visitAlternation=function(r){this.alternations.push(r)},e}(tS.GAstVisitor);function hj(t,e){var r=new iS;t.accept(r);var i=r.alternations,n=nr.reduce(i,function(s,o){var a=nr.dropRight(o.definition),l=nr.map(a,function(c,u){var g=(0,mye.nextPossibleTokensAfter)([c],[],null,1);return nr.isEmpty(g)?{message:e.buildEmptyAlternationError({topLevelRule:t,alternation:o,emptyChoiceIdx:u}),type:Ko.ParserDefinitionErrorType.NONE_LAST_EMPTY_ALT,ruleName:t.name,occurrence:o.idx,alternative:u+1}:null});return s.concat(nr.compact(l))},[]);return n}Xt.validateEmptyOrAlternative=hj;function pj(t,e,r){var i=new iS;t.accept(i);var n=i.alternations;n=(0,xr.reject)(n,function(o){return o.ignoreAmbiguities===!0});var s=nr.reduce(n,function(o,a){var l=a.idx,c=a.maxLookahead||e,u=(0,mg.getLookaheadPathsForOr)(l,t,c,a),g=Bye(u,a,t,r),f=yj(u,a,t,r);return o.concat(g,f)},[]);return s}Xt.validateAmbiguousAlternationAlternatives=pj;var wj=function(t){$v(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.allProductions=[],r}return e.prototype.visitRepetitionWithSeparator=function(r){this.allProductions.push(r)},e.prototype.visitRepetitionMandatory=function(r){this.allProductions.push(r)},e.prototype.visitRepetitionMandatoryWithSeparator=function(r){this.allProductions.push(r)},e.prototype.visitRepetition=function(r){this.allProductions.push(r)},e}(tS.GAstVisitor);Xt.RepetionCollector=wj;function dj(t,e){var r=new iS;t.accept(r);var i=r.alternations,n=nr.reduce(i,function(s,o){return o.definition.length>255&&s.push({message:e.buildTooManyAlternativesError({topLevelRule:t,alternation:o}),type:Ko.ParserDefinitionErrorType.TOO_MANY_ALTS,ruleName:t.name,occurrence:o.idx}),s},[]);return n}Xt.validateTooManyAlts=dj;function Cj(t,e,r){var i=[];return(0,xr.forEach)(t,function(n){var s=new wj;n.accept(s);var o=s.allProductions;(0,xr.forEach)(o,function(a){var l=(0,mg.getProdType)(a),c=a.maxLookahead||e,u=a.idx,g=(0,mg.getLookaheadPathsForOptionalProd)(u,n,l,c),f=g[0];if((0,xr.isEmpty)((0,xr.flatten)(f))){var h=r.buildEmptyRepetitionError({topLevelRule:n,repetition:a});i.push({message:h,type:Ko.ParserDefinitionErrorType.NO_NON_EMPTY_LOOKAHEAD,ruleName:n.name})}})}),i}Xt.validateSomeNonEmptyLookaheadPath=Cj;function Bye(t,e,r,i){var n=[],s=(0,xr.reduce)(t,function(a,l,c){return e.definition[c].ignoreAmbiguities===!0||(0,xr.forEach)(l,function(u){var g=[c];(0,xr.forEach)(t,function(f,h){c!==h&&(0,mg.containsPath)(f,u)&&e.definition[h].ignoreAmbiguities!==!0&&g.push(h)}),g.length>1&&!(0,mg.containsPath)(n,u)&&(n.push(u),a.push({alts:g,path:u}))}),a},[]),o=nr.map(s,function(a){var l=(0,xr.map)(a.alts,function(u){return u+1}),c=i.buildAlternationAmbiguityError({topLevelRule:r,alternation:e,ambiguityIndices:l,prefixPath:a.path});return{message:c,type:Ko.ParserDefinitionErrorType.AMBIGUOUS_ALTS,ruleName:r.name,occurrence:e.idx,alternatives:[a.alts]}});return o}function yj(t,e,r,i){var n=[],s=(0,xr.reduce)(t,function(o,a,l){var c=(0,xr.map)(a,function(u){return{idx:l,path:u}});return o.concat(c)},[]);return(0,xr.forEach)(s,function(o){var a=e.definition[o.idx];if(a.ignoreAmbiguities!==!0){var l=o.idx,c=o.path,u=(0,xr.findAll)(s,function(f){return e.definition[f.idx].ignoreAmbiguities!==!0&&f.idx{"use strict";Object.defineProperty(Eg,"__esModule",{value:!0});Eg.validateGrammar=Eg.resolveGrammar=void 0;var sS=Yt(),bye=rj(),Qye=nS(),Bj=Op();function vye(t){t=(0,sS.defaults)(t,{errMsgProvider:Bj.defaultGrammarResolverErrorProvider});var e={};return(0,sS.forEach)(t.rules,function(r){e[r.name]=r}),(0,bye.resolveGrammar)(e,t.errMsgProvider)}Eg.resolveGrammar=vye;function Sye(t){return t=(0,sS.defaults)(t,{errMsgProvider:Bj.defaultGrammarValidatorErrorProvider}),(0,Qye.validateGrammar)(t.rules,t.maxLookahead,t.tokenTypes,t.errMsgProvider,t.grammarName)}Eg.validateGrammar=Sye});var Ig=w(vn=>{"use strict";var Gp=vn&&vn.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(vn,"__esModule",{value:!0});vn.EarlyExitException=vn.NotAllInputParsedException=vn.NoViableAltException=vn.MismatchedTokenException=vn.isRecognitionException=void 0;var kye=Yt(),Qj="MismatchedTokenException",vj="NoViableAltException",Sj="EarlyExitException",kj="NotAllInputParsedException",xj=[Qj,vj,Sj,kj];Object.freeze(xj);function xye(t){return(0,kye.contains)(xj,t.name)}vn.isRecognitionException=xye;var ry=function(t){Gp(e,t);function e(r,i){var n=this.constructor,s=t.call(this,r)||this;return s.token=i,s.resyncedTokens=[],Object.setPrototypeOf(s,n.prototype),Error.captureStackTrace&&Error.captureStackTrace(s,s.constructor),s}return e}(Error),Pye=function(t){Gp(e,t);function e(r,i,n){var s=t.call(this,r,i)||this;return s.previousToken=n,s.name=Qj,s}return e}(ry);vn.MismatchedTokenException=Pye;var Dye=function(t){Gp(e,t);function e(r,i,n){var s=t.call(this,r,i)||this;return s.previousToken=n,s.name=vj,s}return e}(ry);vn.NoViableAltException=Dye;var Rye=function(t){Gp(e,t);function e(r,i){var n=t.call(this,r,i)||this;return n.name=kj,n}return e}(ry);vn.NotAllInputParsedException=Rye;var Fye=function(t){Gp(e,t);function e(r,i,n){var s=t.call(this,r,i)||this;return s.previousToken=n,s.name=Sj,s}return e}(ry);vn.EarlyExitException=Fye});var aS=w(Yi=>{"use strict";Object.defineProperty(Yi,"__esModule",{value:!0});Yi.attemptInRepetitionRecovery=Yi.Recoverable=Yi.InRuleRecoveryException=Yi.IN_RULE_RECOVERY_EXCEPTION=Yi.EOF_FOLLOW_KEY=void 0;var iy=WA(),Ss=Yt(),Nye=Ig(),Lye=zv(),Tye=Zn();Yi.EOF_FOLLOW_KEY={};Yi.IN_RULE_RECOVERY_EXCEPTION="InRuleRecoveryException";function oS(t){this.name=Yi.IN_RULE_RECOVERY_EXCEPTION,this.message=t}Yi.InRuleRecoveryException=oS;oS.prototype=Error.prototype;var Oye=function(){function t(){}return t.prototype.initRecoverable=function(e){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=(0,Ss.has)(e,"recoveryEnabled")?e.recoveryEnabled:Tye.DEFAULT_PARSER_CONFIG.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=Pj)},t.prototype.getTokenToInsert=function(e){var r=(0,iy.createTokenInstance)(e,"",NaN,NaN,NaN,NaN,NaN,NaN);return r.isInsertedInRecovery=!0,r},t.prototype.canTokenTypeBeInsertedInRecovery=function(e){return!0},t.prototype.tryInRepetitionRecovery=function(e,r,i,n){for(var s=this,o=this.findReSyncTokenType(),a=this.exportLexerState(),l=[],c=!1,u=this.LA(1),g=this.LA(1),f=function(){var h=s.LA(0),p=s.errorMessageProvider.buildMismatchTokenMessage({expected:n,actual:u,previous:h,ruleName:s.getCurrRuleFullName()}),m=new Nye.MismatchedTokenException(p,u,s.LA(0));m.resyncedTokens=(0,Ss.dropRight)(l),s.SAVE_ERROR(m)};!c;)if(this.tokenMatcher(g,n)){f();return}else if(i.call(this)){f(),e.apply(this,r);return}else this.tokenMatcher(g,o)?c=!0:(g=this.SKIP_TOKEN(),this.addToResyncTokens(g,l));this.importLexerState(a)},t.prototype.shouldInRepetitionRecoveryBeTried=function(e,r,i){return!(i===!1||e===void 0||r===void 0||this.tokenMatcher(this.LA(1),e)||this.isBackTracking()||this.canPerformInRuleRecovery(e,this.getFollowsForInRuleRecovery(e,r)))},t.prototype.getFollowsForInRuleRecovery=function(e,r){var i=this.getCurrentGrammarPath(e,r),n=this.getNextPossibleTokenTypes(i);return n},t.prototype.tryInRuleRecovery=function(e,r){if(this.canRecoverWithSingleTokenInsertion(e,r)){var i=this.getTokenToInsert(e);return i}if(this.canRecoverWithSingleTokenDeletion(e)){var n=this.SKIP_TOKEN();return this.consumeToken(),n}throw new oS("sad sad panda")},t.prototype.canPerformInRuleRecovery=function(e,r){return this.canRecoverWithSingleTokenInsertion(e,r)||this.canRecoverWithSingleTokenDeletion(e)},t.prototype.canRecoverWithSingleTokenInsertion=function(e,r){var i=this;if(!this.canTokenTypeBeInsertedInRecovery(e)||(0,Ss.isEmpty)(r))return!1;var n=this.LA(1),s=(0,Ss.find)(r,function(o){return i.tokenMatcher(n,o)})!==void 0;return s},t.prototype.canRecoverWithSingleTokenDeletion=function(e){var r=this.tokenMatcher(this.LA(2),e);return r},t.prototype.isInCurrentRuleReSyncSet=function(e){var r=this.getCurrFollowKey(),i=this.getFollowSetFromFollowKey(r);return(0,Ss.contains)(i,e)},t.prototype.findReSyncTokenType=function(){for(var e=this.flattenFollowSet(),r=this.LA(1),i=2;;){var n=r.tokenType;if((0,Ss.contains)(e,n))return n;r=this.LA(i),i++}},t.prototype.getCurrFollowKey=function(){if(this.RULE_STACK.length===1)return Yi.EOF_FOLLOW_KEY;var e=this.getLastExplicitRuleShortName(),r=this.getLastExplicitRuleOccurrenceIndex(),i=this.getPreviousExplicitRuleShortName();return{ruleName:this.shortRuleNameToFullName(e),idxInCallingRule:r,inRule:this.shortRuleNameToFullName(i)}},t.prototype.buildFullFollowKeyStack=function(){var e=this,r=this.RULE_STACK,i=this.RULE_OCCURRENCE_STACK;return(0,Ss.map)(r,function(n,s){return s===0?Yi.EOF_FOLLOW_KEY:{ruleName:e.shortRuleNameToFullName(n),idxInCallingRule:i[s],inRule:e.shortRuleNameToFullName(r[s-1])}})},t.prototype.flattenFollowSet=function(){var e=this,r=(0,Ss.map)(this.buildFullFollowKeyStack(),function(i){return e.getFollowSetFromFollowKey(i)});return(0,Ss.flatten)(r)},t.prototype.getFollowSetFromFollowKey=function(e){if(e===Yi.EOF_FOLLOW_KEY)return[iy.EOF];var r=e.ruleName+e.idxInCallingRule+Lye.IN+e.inRule;return this.resyncFollows[r]},t.prototype.addToResyncTokens=function(e,r){return this.tokenMatcher(e,iy.EOF)||r.push(e),r},t.prototype.reSyncTo=function(e){for(var r=[],i=this.LA(1);this.tokenMatcher(i,e)===!1;)i=this.SKIP_TOKEN(),this.addToResyncTokens(i,r);return(0,Ss.dropRight)(r)},t.prototype.attemptInRepetitionRecovery=function(e,r,i,n,s,o,a){},t.prototype.getCurrentGrammarPath=function(e,r){var i=this.getHumanReadableRuleStack(),n=(0,Ss.cloneArr)(this.RULE_OCCURRENCE_STACK),s={ruleStack:i,occurrenceStack:n,lastTok:e,lastTokOccurrence:r};return s},t.prototype.getHumanReadableRuleStack=function(){var e=this;return(0,Ss.map)(this.RULE_STACK,function(r){return e.shortRuleNameToFullName(r)})},t}();Yi.Recoverable=Oye;function Pj(t,e,r,i,n,s,o){var a=this.getKeyForAutomaticLookahead(i,n),l=this.firstAfterRepMap[a];if(l===void 0){var c=this.getCurrRuleFullName(),u=this.getGAstProductions()[c],g=new s(u,n);l=g.startWalking(),this.firstAfterRepMap[a]=l}var f=l.token,h=l.occurrence,p=l.isEndOfRule;this.RULE_STACK.length===1&&p&&f===void 0&&(f=iy.EOF,h=1),this.shouldInRepetitionRecoveryBeTried(f,h,o)&&this.tryInRepetitionRecovery(t,e,r,f)}Yi.attemptInRepetitionRecovery=Pj});var ny=w(Jt=>{"use strict";Object.defineProperty(Jt,"__esModule",{value:!0});Jt.getKeyForAutomaticLookahead=Jt.AT_LEAST_ONE_SEP_IDX=Jt.MANY_SEP_IDX=Jt.AT_LEAST_ONE_IDX=Jt.MANY_IDX=Jt.OPTION_IDX=Jt.OR_IDX=Jt.BITS_FOR_ALT_IDX=Jt.BITS_FOR_RULE_IDX=Jt.BITS_FOR_OCCURRENCE_IDX=Jt.BITS_FOR_METHOD_TYPE=void 0;Jt.BITS_FOR_METHOD_TYPE=4;Jt.BITS_FOR_OCCURRENCE_IDX=8;Jt.BITS_FOR_RULE_IDX=12;Jt.BITS_FOR_ALT_IDX=8;Jt.OR_IDX=1<{"use strict";Object.defineProperty(sy,"__esModule",{value:!0});sy.LooksAhead=void 0;var Ga=Up(),co=Yt(),Dj=Zn(),ja=ny(),vc=Tp(),Kye=function(){function t(){}return t.prototype.initLooksAhead=function(e){this.dynamicTokensEnabled=(0,co.has)(e,"dynamicTokensEnabled")?e.dynamicTokensEnabled:Dj.DEFAULT_PARSER_CONFIG.dynamicTokensEnabled,this.maxLookahead=(0,co.has)(e,"maxLookahead")?e.maxLookahead:Dj.DEFAULT_PARSER_CONFIG.maxLookahead,this.lookAheadFuncsCache=(0,co.isES2015MapSupported)()?new Map:[],(0,co.isES2015MapSupported)()?(this.getLaFuncFromCache=this.getLaFuncFromMap,this.setLaFuncCache=this.setLaFuncCacheUsingMap):(this.getLaFuncFromCache=this.getLaFuncFromObj,this.setLaFuncCache=this.setLaFuncUsingObj)},t.prototype.preComputeLookaheadFunctions=function(e){var r=this;(0,co.forEach)(e,function(i){r.TRACE_INIT(i.name+" Rule Lookahead",function(){var n=(0,vc.collectMethods)(i),s=n.alternation,o=n.repetition,a=n.option,l=n.repetitionMandatory,c=n.repetitionMandatoryWithSeparator,u=n.repetitionWithSeparator;(0,co.forEach)(s,function(g){var f=g.idx===0?"":g.idx;r.TRACE_INIT(""+(0,vc.getProductionDslName)(g)+f,function(){var h=(0,Ga.buildLookaheadFuncForOr)(g.idx,i,g.maxLookahead||r.maxLookahead,g.hasPredicates,r.dynamicTokensEnabled,r.lookAheadBuilderForAlternatives),p=(0,ja.getKeyForAutomaticLookahead)(r.fullRuleNameToShort[i.name],ja.OR_IDX,g.idx);r.setLaFuncCache(p,h)})}),(0,co.forEach)(o,function(g){r.computeLookaheadFunc(i,g.idx,ja.MANY_IDX,Ga.PROD_TYPE.REPETITION,g.maxLookahead,(0,vc.getProductionDslName)(g))}),(0,co.forEach)(a,function(g){r.computeLookaheadFunc(i,g.idx,ja.OPTION_IDX,Ga.PROD_TYPE.OPTION,g.maxLookahead,(0,vc.getProductionDslName)(g))}),(0,co.forEach)(l,function(g){r.computeLookaheadFunc(i,g.idx,ja.AT_LEAST_ONE_IDX,Ga.PROD_TYPE.REPETITION_MANDATORY,g.maxLookahead,(0,vc.getProductionDslName)(g))}),(0,co.forEach)(c,function(g){r.computeLookaheadFunc(i,g.idx,ja.AT_LEAST_ONE_SEP_IDX,Ga.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR,g.maxLookahead,(0,vc.getProductionDslName)(g))}),(0,co.forEach)(u,function(g){r.computeLookaheadFunc(i,g.idx,ja.MANY_SEP_IDX,Ga.PROD_TYPE.REPETITION_WITH_SEPARATOR,g.maxLookahead,(0,vc.getProductionDslName)(g))})})})},t.prototype.computeLookaheadFunc=function(e,r,i,n,s,o){var a=this;this.TRACE_INIT(""+o+(r===0?"":r),function(){var l=(0,Ga.buildLookaheadFuncForOptionalProd)(r,e,s||a.maxLookahead,a.dynamicTokensEnabled,n,a.lookAheadBuilderForOptional),c=(0,ja.getKeyForAutomaticLookahead)(a.fullRuleNameToShort[e.name],i,r);a.setLaFuncCache(c,l)})},t.prototype.lookAheadBuilderForOptional=function(e,r,i){return(0,Ga.buildSingleAlternativeLookaheadFunction)(e,r,i)},t.prototype.lookAheadBuilderForAlternatives=function(e,r,i,n){return(0,Ga.buildAlternativesLookAheadFunc)(e,r,i,n)},t.prototype.getKeyForAutomaticLookahead=function(e,r){var i=this.getLastExplicitRuleShortName();return(0,ja.getKeyForAutomaticLookahead)(i,e,r)},t.prototype.getLaFuncFromCache=function(e){},t.prototype.getLaFuncFromMap=function(e){return this.lookAheadFuncsCache.get(e)},t.prototype.getLaFuncFromObj=function(e){return this.lookAheadFuncsCache[e]},t.prototype.setLaFuncCache=function(e,r){},t.prototype.setLaFuncCacheUsingMap=function(e,r){this.lookAheadFuncsCache.set(e,r)},t.prototype.setLaFuncUsingObj=function(e,r){this.lookAheadFuncsCache[e]=r},t}();sy.LooksAhead=Kye});var Fj=w(Uo=>{"use strict";Object.defineProperty(Uo,"__esModule",{value:!0});Uo.addNoneTerminalToCst=Uo.addTerminalToCst=Uo.setNodeLocationFull=Uo.setNodeLocationOnlyOffset=void 0;function Uye(t,e){isNaN(t.startOffset)===!0?(t.startOffset=e.startOffset,t.endOffset=e.endOffset):t.endOffset{"use strict";Object.defineProperty(VA,"__esModule",{value:!0});VA.defineNameProp=VA.functionName=VA.classNameFromInstance=void 0;var Yye=Yt();function qye(t){return Nj(t.constructor)}VA.classNameFromInstance=qye;var Lj="name";function Nj(t){var e=t.name;return e||"anonymous"}VA.functionName=Nj;function Jye(t,e){var r=Object.getOwnPropertyDescriptor(t,Lj);return(0,Yye.isUndefined)(r)||r.configurable?(Object.defineProperty(t,Lj,{enumerable:!1,configurable:!0,writable:!1,value:e}),!0):!1}VA.defineNameProp=Jye});var Uj=w(Pi=>{"use strict";Object.defineProperty(Pi,"__esModule",{value:!0});Pi.validateRedundantMethods=Pi.validateMissingCstMethods=Pi.validateVisitor=Pi.CstVisitorDefinitionError=Pi.createBaseVisitorConstructorWithDefaults=Pi.createBaseSemanticVisitorConstructor=Pi.defaultVisit=void 0;var ks=Yt(),jp=AS();function Tj(t,e){for(var r=(0,ks.keys)(t),i=r.length,n=0;n: - `+(""+s.join(` - -`).replace(/\n/g,` - `)))}}};return r.prototype=i,r.prototype.constructor=r,r._RULE_NAMES=e,r}Pi.createBaseSemanticVisitorConstructor=Wye;function zye(t,e,r){var i=function(){};(0,jp.defineNameProp)(i,t+"BaseSemanticsWithDefaults");var n=Object.create(r.prototype);return(0,ks.forEach)(e,function(s){n[s]=Tj}),i.prototype=n,i.prototype.constructor=i,i}Pi.createBaseVisitorConstructorWithDefaults=zye;var lS;(function(t){t[t.REDUNDANT_METHOD=0]="REDUNDANT_METHOD",t[t.MISSING_METHOD=1]="MISSING_METHOD"})(lS=Pi.CstVisitorDefinitionError||(Pi.CstVisitorDefinitionError={}));function Oj(t,e){var r=Mj(t,e),i=Kj(t,e);return r.concat(i)}Pi.validateVisitor=Oj;function Mj(t,e){var r=(0,ks.map)(e,function(i){if(!(0,ks.isFunction)(t[i]))return{msg:"Missing visitor method: <"+i+"> on "+(0,jp.functionName)(t.constructor)+" CST Visitor.",type:lS.MISSING_METHOD,methodName:i}});return(0,ks.compact)(r)}Pi.validateMissingCstMethods=Mj;var _ye=["constructor","visit","validateVisitor"];function Kj(t,e){var r=[];for(var i in t)(0,ks.isFunction)(t[i])&&!(0,ks.contains)(_ye,i)&&!(0,ks.contains)(e,i)&&r.push({msg:"Redundant visitor method: <"+i+"> on "+(0,jp.functionName)(t.constructor)+` CST Visitor -There is no Grammar Rule corresponding to this method's name. -`,type:lS.REDUNDANT_METHOD,methodName:i});return r}Pi.validateRedundantMethods=Kj});var Gj=w(oy=>{"use strict";Object.defineProperty(oy,"__esModule",{value:!0});oy.TreeBuilder=void 0;var yg=Fj(),ni=Yt(),Hj=Uj(),Vye=Zn(),Xye=function(){function t(){}return t.prototype.initTreeBuilder=function(e){if(this.CST_STACK=[],this.outputCst=e.outputCst,this.nodeLocationTracking=(0,ni.has)(e,"nodeLocationTracking")?e.nodeLocationTracking:Vye.DEFAULT_PARSER_CONFIG.nodeLocationTracking,!this.outputCst)this.cstInvocationStateUpdate=ni.NOOP,this.cstFinallyStateUpdate=ni.NOOP,this.cstPostTerminal=ni.NOOP,this.cstPostNonTerminal=ni.NOOP,this.cstPostRule=ni.NOOP;else if(/full/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=yg.setNodeLocationFull,this.setNodeLocationFromNode=yg.setNodeLocationFull,this.cstPostRule=ni.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationFullRecovery):(this.setNodeLocationFromToken=ni.NOOP,this.setNodeLocationFromNode=ni.NOOP,this.cstPostRule=this.cstPostRuleFull,this.setInitialNodeLocation=this.setInitialNodeLocationFullRegular);else if(/onlyOffset/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=yg.setNodeLocationOnlyOffset,this.setNodeLocationFromNode=yg.setNodeLocationOnlyOffset,this.cstPostRule=ni.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRecovery):(this.setNodeLocationFromToken=ni.NOOP,this.setNodeLocationFromNode=ni.NOOP,this.cstPostRule=this.cstPostRuleOnlyOffset,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRegular);else if(/none/i.test(this.nodeLocationTracking))this.setNodeLocationFromToken=ni.NOOP,this.setNodeLocationFromNode=ni.NOOP,this.cstPostRule=ni.NOOP,this.setInitialNodeLocation=ni.NOOP;else throw Error('Invalid config option: "'+e.nodeLocationTracking+'"')},t.prototype.setInitialNodeLocationOnlyOffsetRecovery=function(e){e.location={startOffset:NaN,endOffset:NaN}},t.prototype.setInitialNodeLocationOnlyOffsetRegular=function(e){e.location={startOffset:this.LA(1).startOffset,endOffset:NaN}},t.prototype.setInitialNodeLocationFullRecovery=function(e){e.location={startOffset:NaN,startLine:NaN,startColumn:NaN,endOffset:NaN,endLine:NaN,endColumn:NaN}},t.prototype.setInitialNodeLocationFullRegular=function(e){var r=this.LA(1);e.location={startOffset:r.startOffset,startLine:r.startLine,startColumn:r.startColumn,endOffset:NaN,endLine:NaN,endColumn:NaN}},t.prototype.cstInvocationStateUpdate=function(e,r){var i={name:e,children:{}};this.setInitialNodeLocation(i),this.CST_STACK.push(i)},t.prototype.cstFinallyStateUpdate=function(){this.CST_STACK.pop()},t.prototype.cstPostRuleFull=function(e){var r=this.LA(0),i=e.location;i.startOffset<=r.startOffset?(i.endOffset=r.endOffset,i.endLine=r.endLine,i.endColumn=r.endColumn):(i.startOffset=NaN,i.startLine=NaN,i.startColumn=NaN)},t.prototype.cstPostRuleOnlyOffset=function(e){var r=this.LA(0),i=e.location;i.startOffset<=r.startOffset?i.endOffset=r.endOffset:i.startOffset=NaN},t.prototype.cstPostTerminal=function(e,r){var i=this.CST_STACK[this.CST_STACK.length-1];(0,yg.addTerminalToCst)(i,r,e),this.setNodeLocationFromToken(i.location,r)},t.prototype.cstPostNonTerminal=function(e,r){var i=this.CST_STACK[this.CST_STACK.length-1];(0,yg.addNoneTerminalToCst)(i,r,e),this.setNodeLocationFromNode(i.location,e.location)},t.prototype.getBaseCstVisitorConstructor=function(){if((0,ni.isUndefined)(this.baseCstVisitorConstructor)){var e=(0,Hj.createBaseSemanticVisitorConstructor)(this.className,(0,ni.keys)(this.gastProductionsCache));return this.baseCstVisitorConstructor=e,e}return this.baseCstVisitorConstructor},t.prototype.getBaseCstVisitorConstructorWithDefaults=function(){if((0,ni.isUndefined)(this.baseCstVisitorWithDefaultsConstructor)){var e=(0,Hj.createBaseVisitorConstructorWithDefaults)(this.className,(0,ni.keys)(this.gastProductionsCache),this.getBaseCstVisitorConstructor());return this.baseCstVisitorWithDefaultsConstructor=e,e}return this.baseCstVisitorWithDefaultsConstructor},t.prototype.getLastExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-1]},t.prototype.getPreviousExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-2]},t.prototype.getLastExplicitRuleOccurrenceIndex=function(){var e=this.RULE_OCCURRENCE_STACK;return e[e.length-1]},t}();oy.TreeBuilder=Xye});var Yj=w(ay=>{"use strict";Object.defineProperty(ay,"__esModule",{value:!0});ay.LexerAdapter=void 0;var jj=Zn(),Zye=function(){function t(){}return t.prototype.initLexerAdapter=function(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1},Object.defineProperty(t.prototype,"input",{get:function(){return this.tokVector},set:function(e){if(this.selfAnalysisDone!==!0)throw Error("Missing invocation at the end of the Parser's constructor.");this.reset(),this.tokVector=e,this.tokVectorLength=e.length},enumerable:!1,configurable:!0}),t.prototype.SKIP_TOKEN=function(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):jj.END_OF_FILE},t.prototype.LA=function(e){var r=this.currIdx+e;return r<0||this.tokVectorLength<=r?jj.END_OF_FILE:this.tokVector[r]},t.prototype.consumeToken=function(){this.currIdx++},t.prototype.exportLexerState=function(){return this.currIdx},t.prototype.importLexerState=function(e){this.currIdx=e},t.prototype.resetLexerState=function(){this.currIdx=-1},t.prototype.moveToTerminatedState=function(){this.currIdx=this.tokVector.length-1},t.prototype.getLexerPosition=function(){return this.exportLexerState()},t}();ay.LexerAdapter=Zye});var Jj=w(Ay=>{"use strict";Object.defineProperty(Ay,"__esModule",{value:!0});Ay.RecognizerApi=void 0;var qj=Yt(),$ye=Ig(),cS=Zn(),ewe=Op(),twe=nS(),rwe=bn(),iwe=function(){function t(){}return t.prototype.ACTION=function(e){return e.call(this)},t.prototype.consume=function(e,r,i){return this.consumeInternal(r,e,i)},t.prototype.subrule=function(e,r,i){return this.subruleInternal(r,e,i)},t.prototype.option=function(e,r){return this.optionInternal(r,e)},t.prototype.or=function(e,r){return this.orInternal(r,e)},t.prototype.many=function(e,r){return this.manyInternal(e,r)},t.prototype.atLeastOne=function(e,r){return this.atLeastOneInternal(e,r)},t.prototype.CONSUME=function(e,r){return this.consumeInternal(e,0,r)},t.prototype.CONSUME1=function(e,r){return this.consumeInternal(e,1,r)},t.prototype.CONSUME2=function(e,r){return this.consumeInternal(e,2,r)},t.prototype.CONSUME3=function(e,r){return this.consumeInternal(e,3,r)},t.prototype.CONSUME4=function(e,r){return this.consumeInternal(e,4,r)},t.prototype.CONSUME5=function(e,r){return this.consumeInternal(e,5,r)},t.prototype.CONSUME6=function(e,r){return this.consumeInternal(e,6,r)},t.prototype.CONSUME7=function(e,r){return this.consumeInternal(e,7,r)},t.prototype.CONSUME8=function(e,r){return this.consumeInternal(e,8,r)},t.prototype.CONSUME9=function(e,r){return this.consumeInternal(e,9,r)},t.prototype.SUBRULE=function(e,r){return this.subruleInternal(e,0,r)},t.prototype.SUBRULE1=function(e,r){return this.subruleInternal(e,1,r)},t.prototype.SUBRULE2=function(e,r){return this.subruleInternal(e,2,r)},t.prototype.SUBRULE3=function(e,r){return this.subruleInternal(e,3,r)},t.prototype.SUBRULE4=function(e,r){return this.subruleInternal(e,4,r)},t.prototype.SUBRULE5=function(e,r){return this.subruleInternal(e,5,r)},t.prototype.SUBRULE6=function(e,r){return this.subruleInternal(e,6,r)},t.prototype.SUBRULE7=function(e,r){return this.subruleInternal(e,7,r)},t.prototype.SUBRULE8=function(e,r){return this.subruleInternal(e,8,r)},t.prototype.SUBRULE9=function(e,r){return this.subruleInternal(e,9,r)},t.prototype.OPTION=function(e){return this.optionInternal(e,0)},t.prototype.OPTION1=function(e){return this.optionInternal(e,1)},t.prototype.OPTION2=function(e){return this.optionInternal(e,2)},t.prototype.OPTION3=function(e){return this.optionInternal(e,3)},t.prototype.OPTION4=function(e){return this.optionInternal(e,4)},t.prototype.OPTION5=function(e){return this.optionInternal(e,5)},t.prototype.OPTION6=function(e){return this.optionInternal(e,6)},t.prototype.OPTION7=function(e){return this.optionInternal(e,7)},t.prototype.OPTION8=function(e){return this.optionInternal(e,8)},t.prototype.OPTION9=function(e){return this.optionInternal(e,9)},t.prototype.OR=function(e){return this.orInternal(e,0)},t.prototype.OR1=function(e){return this.orInternal(e,1)},t.prototype.OR2=function(e){return this.orInternal(e,2)},t.prototype.OR3=function(e){return this.orInternal(e,3)},t.prototype.OR4=function(e){return this.orInternal(e,4)},t.prototype.OR5=function(e){return this.orInternal(e,5)},t.prototype.OR6=function(e){return this.orInternal(e,6)},t.prototype.OR7=function(e){return this.orInternal(e,7)},t.prototype.OR8=function(e){return this.orInternal(e,8)},t.prototype.OR9=function(e){return this.orInternal(e,9)},t.prototype.MANY=function(e){this.manyInternal(0,e)},t.prototype.MANY1=function(e){this.manyInternal(1,e)},t.prototype.MANY2=function(e){this.manyInternal(2,e)},t.prototype.MANY3=function(e){this.manyInternal(3,e)},t.prototype.MANY4=function(e){this.manyInternal(4,e)},t.prototype.MANY5=function(e){this.manyInternal(5,e)},t.prototype.MANY6=function(e){this.manyInternal(6,e)},t.prototype.MANY7=function(e){this.manyInternal(7,e)},t.prototype.MANY8=function(e){this.manyInternal(8,e)},t.prototype.MANY9=function(e){this.manyInternal(9,e)},t.prototype.MANY_SEP=function(e){this.manySepFirstInternal(0,e)},t.prototype.MANY_SEP1=function(e){this.manySepFirstInternal(1,e)},t.prototype.MANY_SEP2=function(e){this.manySepFirstInternal(2,e)},t.prototype.MANY_SEP3=function(e){this.manySepFirstInternal(3,e)},t.prototype.MANY_SEP4=function(e){this.manySepFirstInternal(4,e)},t.prototype.MANY_SEP5=function(e){this.manySepFirstInternal(5,e)},t.prototype.MANY_SEP6=function(e){this.manySepFirstInternal(6,e)},t.prototype.MANY_SEP7=function(e){this.manySepFirstInternal(7,e)},t.prototype.MANY_SEP8=function(e){this.manySepFirstInternal(8,e)},t.prototype.MANY_SEP9=function(e){this.manySepFirstInternal(9,e)},t.prototype.AT_LEAST_ONE=function(e){this.atLeastOneInternal(0,e)},t.prototype.AT_LEAST_ONE1=function(e){return this.atLeastOneInternal(1,e)},t.prototype.AT_LEAST_ONE2=function(e){this.atLeastOneInternal(2,e)},t.prototype.AT_LEAST_ONE3=function(e){this.atLeastOneInternal(3,e)},t.prototype.AT_LEAST_ONE4=function(e){this.atLeastOneInternal(4,e)},t.prototype.AT_LEAST_ONE5=function(e){this.atLeastOneInternal(5,e)},t.prototype.AT_LEAST_ONE6=function(e){this.atLeastOneInternal(6,e)},t.prototype.AT_LEAST_ONE7=function(e){this.atLeastOneInternal(7,e)},t.prototype.AT_LEAST_ONE8=function(e){this.atLeastOneInternal(8,e)},t.prototype.AT_LEAST_ONE9=function(e){this.atLeastOneInternal(9,e)},t.prototype.AT_LEAST_ONE_SEP=function(e){this.atLeastOneSepFirstInternal(0,e)},t.prototype.AT_LEAST_ONE_SEP1=function(e){this.atLeastOneSepFirstInternal(1,e)},t.prototype.AT_LEAST_ONE_SEP2=function(e){this.atLeastOneSepFirstInternal(2,e)},t.prototype.AT_LEAST_ONE_SEP3=function(e){this.atLeastOneSepFirstInternal(3,e)},t.prototype.AT_LEAST_ONE_SEP4=function(e){this.atLeastOneSepFirstInternal(4,e)},t.prototype.AT_LEAST_ONE_SEP5=function(e){this.atLeastOneSepFirstInternal(5,e)},t.prototype.AT_LEAST_ONE_SEP6=function(e){this.atLeastOneSepFirstInternal(6,e)},t.prototype.AT_LEAST_ONE_SEP7=function(e){this.atLeastOneSepFirstInternal(7,e)},t.prototype.AT_LEAST_ONE_SEP8=function(e){this.atLeastOneSepFirstInternal(8,e)},t.prototype.AT_LEAST_ONE_SEP9=function(e){this.atLeastOneSepFirstInternal(9,e)},t.prototype.RULE=function(e,r,i){if(i===void 0&&(i=cS.DEFAULT_RULE_CONFIG),(0,qj.contains)(this.definedRulesNames,e)){var n=ewe.defaultGrammarValidatorErrorProvider.buildDuplicateRuleNameError({topLevelRule:e,grammarName:this.className}),s={message:n,type:cS.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:e};this.definitionErrors.push(s)}this.definedRulesNames.push(e);var o=this.defineRule(e,r,i);return this[e]=o,o},t.prototype.OVERRIDE_RULE=function(e,r,i){i===void 0&&(i=cS.DEFAULT_RULE_CONFIG);var n=[];n=n.concat((0,twe.validateRuleIsOverridden)(e,this.definedRulesNames,this.className)),this.definitionErrors=this.definitionErrors.concat(n);var s=this.defineRule(e,r,i);return this[e]=s,s},t.prototype.BACKTRACK=function(e,r){return function(){this.isBackTrackingStack.push(1);var i=this.saveRecogState();try{return e.apply(this,r),!0}catch(n){if((0,$ye.isRecognitionException)(n))return!1;throw n}finally{this.reloadRecogState(i),this.isBackTrackingStack.pop()}}},t.prototype.getGAstProductions=function(){return this.gastProductionsCache},t.prototype.getSerializedGastProductions=function(){return(0,rwe.serializeGrammar)((0,qj.values)(this.gastProductionsCache))},t}();Ay.RecognizerApi=iwe});var Vj=w(ly=>{"use strict";Object.defineProperty(ly,"__esModule",{value:!0});ly.RecognizerEngine=void 0;var Rr=Yt(),$n=ny(),cy=Ig(),Wj=Up(),wg=Kp(),zj=Zn(),nwe=aS(),_j=WA(),Yp=pg(),swe=AS(),owe=function(){function t(){}return t.prototype.initRecognizerEngine=function(e,r){if(this.className=(0,swe.classNameFromInstance)(this),this.shortRuleNameToFull={},this.fullRuleNameToShort={},this.ruleShortNameIdx=256,this.tokenMatcher=Yp.tokenStructuredMatcherNoCategories,this.definedRulesNames=[],this.tokensMap={},this.isBackTrackingStack=[],this.RULE_STACK=[],this.RULE_OCCURRENCE_STACK=[],this.gastProductionsCache={},(0,Rr.has)(r,"serializedGrammar"))throw Error(`The Parser's configuration can no longer contain a property. - See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0 - For Further details.`);if((0,Rr.isArray)(e)){if((0,Rr.isEmpty)(e))throw Error(`A Token Vocabulary cannot be empty. - Note that the first argument for the parser constructor - is no longer a Token vector (since v4.0).`);if(typeof e[0].startOffset=="number")throw Error(`The Parser constructor no longer accepts a token vector as the first argument. - See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0 - For Further details.`)}if((0,Rr.isArray)(e))this.tokensMap=(0,Rr.reduce)(e,function(o,a){return o[a.name]=a,o},{});else if((0,Rr.has)(e,"modes")&&(0,Rr.every)((0,Rr.flatten)((0,Rr.values)(e.modes)),Yp.isTokenType)){var i=(0,Rr.flatten)((0,Rr.values)(e.modes)),n=(0,Rr.uniq)(i);this.tokensMap=(0,Rr.reduce)(n,function(o,a){return o[a.name]=a,o},{})}else if((0,Rr.isObject)(e))this.tokensMap=(0,Rr.cloneObj)(e);else throw new Error(" argument must be An Array of Token constructors, A dictionary of Token constructors or an IMultiModeLexerDefinition");this.tokensMap.EOF=_j.EOF;var s=(0,Rr.every)((0,Rr.values)(e),function(o){return(0,Rr.isEmpty)(o.categoryMatches)});this.tokenMatcher=s?Yp.tokenStructuredMatcherNoCategories:Yp.tokenStructuredMatcher,(0,Yp.augmentTokenTypes)((0,Rr.values)(this.tokensMap))},t.prototype.defineRule=function(e,r,i){if(this.selfAnalysisDone)throw Error("Grammar rule <"+e+`> may not be defined after the 'performSelfAnalysis' method has been called' -Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`);var n=(0,Rr.has)(i,"resyncEnabled")?i.resyncEnabled:zj.DEFAULT_RULE_CONFIG.resyncEnabled,s=(0,Rr.has)(i,"recoveryValueFunc")?i.recoveryValueFunc:zj.DEFAULT_RULE_CONFIG.recoveryValueFunc,o=this.ruleShortNameIdx<<$n.BITS_FOR_METHOD_TYPE+$n.BITS_FOR_OCCURRENCE_IDX;this.ruleShortNameIdx++,this.shortRuleNameToFull[o]=e,this.fullRuleNameToShort[e]=o;function a(u){try{if(this.outputCst===!0){r.apply(this,u);var g=this.CST_STACK[this.CST_STACK.length-1];return this.cstPostRule(g),g}else return r.apply(this,u)}catch(f){return this.invokeRuleCatch(f,n,s)}finally{this.ruleFinallyStateUpdate()}}var l=function(u,g){return u===void 0&&(u=0),this.ruleInvocationStateUpdate(o,e,u),a.call(this,g)},c="ruleName";return l[c]=e,l.originalGrammarAction=r,l},t.prototype.invokeRuleCatch=function(e,r,i){var n=this.RULE_STACK.length===1,s=r&&!this.isBackTracking()&&this.recoveryEnabled;if((0,cy.isRecognitionException)(e)){var o=e;if(s){var a=this.findReSyncTokenType();if(this.isInCurrentRuleReSyncSet(a))if(o.resyncedTokens=this.reSyncTo(a),this.outputCst){var l=this.CST_STACK[this.CST_STACK.length-1];return l.recoveredNode=!0,l}else return i();else{if(this.outputCst){var l=this.CST_STACK[this.CST_STACK.length-1];l.recoveredNode=!0,o.partialCstResult=l}throw o}}else{if(n)return this.moveToTerminatedState(),i();throw o}}else throw e},t.prototype.optionInternal=function(e,r){var i=this.getKeyForAutomaticLookahead($n.OPTION_IDX,r);return this.optionInternalLogic(e,r,i)},t.prototype.optionInternalLogic=function(e,r,i){var n=this,s=this.getLaFuncFromCache(i),o,a;if(e.DEF!==void 0){if(o=e.DEF,a=e.GATE,a!==void 0){var l=s;s=function(){return a.call(n)&&l.call(n)}}}else o=e;if(s.call(this)===!0)return o.call(this)},t.prototype.atLeastOneInternal=function(e,r){var i=this.getKeyForAutomaticLookahead($n.AT_LEAST_ONE_IDX,e);return this.atLeastOneInternalLogic(e,r,i)},t.prototype.atLeastOneInternalLogic=function(e,r,i){var n=this,s=this.getLaFuncFromCache(i),o,a;if(r.DEF!==void 0){if(o=r.DEF,a=r.GATE,a!==void 0){var l=s;s=function(){return a.call(n)&&l.call(n)}}}else o=r;if(s.call(this)===!0)for(var c=this.doSingleRepetition(o);s.call(this)===!0&&c===!0;)c=this.doSingleRepetition(o);else throw this.raiseEarlyExitException(e,Wj.PROD_TYPE.REPETITION_MANDATORY,r.ERR_MSG);this.attemptInRepetitionRecovery(this.atLeastOneInternal,[e,r],s,$n.AT_LEAST_ONE_IDX,e,wg.NextTerminalAfterAtLeastOneWalker)},t.prototype.atLeastOneSepFirstInternal=function(e,r){var i=this.getKeyForAutomaticLookahead($n.AT_LEAST_ONE_SEP_IDX,e);this.atLeastOneSepFirstInternalLogic(e,r,i)},t.prototype.atLeastOneSepFirstInternalLogic=function(e,r,i){var n=this,s=r.DEF,o=r.SEP,a=this.getLaFuncFromCache(i);if(a.call(this)===!0){s.call(this);for(var l=function(){return n.tokenMatcher(n.LA(1),o)};this.tokenMatcher(this.LA(1),o)===!0;)this.CONSUME(o),s.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,o,l,s,wg.NextTerminalAfterAtLeastOneSepWalker],l,$n.AT_LEAST_ONE_SEP_IDX,e,wg.NextTerminalAfterAtLeastOneSepWalker)}else throw this.raiseEarlyExitException(e,Wj.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR,r.ERR_MSG)},t.prototype.manyInternal=function(e,r){var i=this.getKeyForAutomaticLookahead($n.MANY_IDX,e);return this.manyInternalLogic(e,r,i)},t.prototype.manyInternalLogic=function(e,r,i){var n=this,s=this.getLaFuncFromCache(i),o,a;if(r.DEF!==void 0){if(o=r.DEF,a=r.GATE,a!==void 0){var l=s;s=function(){return a.call(n)&&l.call(n)}}}else o=r;for(var c=!0;s.call(this)===!0&&c===!0;)c=this.doSingleRepetition(o);this.attemptInRepetitionRecovery(this.manyInternal,[e,r],s,$n.MANY_IDX,e,wg.NextTerminalAfterManyWalker,c)},t.prototype.manySepFirstInternal=function(e,r){var i=this.getKeyForAutomaticLookahead($n.MANY_SEP_IDX,e);this.manySepFirstInternalLogic(e,r,i)},t.prototype.manySepFirstInternalLogic=function(e,r,i){var n=this,s=r.DEF,o=r.SEP,a=this.getLaFuncFromCache(i);if(a.call(this)===!0){s.call(this);for(var l=function(){return n.tokenMatcher(n.LA(1),o)};this.tokenMatcher(this.LA(1),o)===!0;)this.CONSUME(o),s.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,o,l,s,wg.NextTerminalAfterManySepWalker],l,$n.MANY_SEP_IDX,e,wg.NextTerminalAfterManySepWalker)}},t.prototype.repetitionSepSecondInternal=function(e,r,i,n,s){for(;i();)this.CONSUME(r),n.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,r,i,n,s],i,$n.AT_LEAST_ONE_SEP_IDX,e,s)},t.prototype.doSingleRepetition=function(e){var r=this.getLexerPosition();e.call(this);var i=this.getLexerPosition();return i>r},t.prototype.orInternal=function(e,r){var i=this.getKeyForAutomaticLookahead($n.OR_IDX,r),n=(0,Rr.isArray)(e)?e:e.DEF,s=this.getLaFuncFromCache(i),o=s.call(this,n);if(o!==void 0){var a=n[o];return a.ALT.call(this)}this.raiseNoAltException(r,e.ERR_MSG)},t.prototype.ruleFinallyStateUpdate=function(){if(this.RULE_STACK.pop(),this.RULE_OCCURRENCE_STACK.pop(),this.cstFinallyStateUpdate(),this.RULE_STACK.length===0&&this.isAtEndOfInput()===!1){var e=this.LA(1),r=this.errorMessageProvider.buildNotAllInputParsedMessage({firstRedundant:e,ruleName:this.getCurrRuleFullName()});this.SAVE_ERROR(new cy.NotAllInputParsedException(r,e))}},t.prototype.subruleInternal=function(e,r,i){var n;try{var s=i!==void 0?i.ARGS:void 0;return n=e.call(this,r,s),this.cstPostNonTerminal(n,i!==void 0&&i.LABEL!==void 0?i.LABEL:e.ruleName),n}catch(o){this.subruleInternalError(o,i,e.ruleName)}},t.prototype.subruleInternalError=function(e,r,i){throw(0,cy.isRecognitionException)(e)&&e.partialCstResult!==void 0&&(this.cstPostNonTerminal(e.partialCstResult,r!==void 0&&r.LABEL!==void 0?r.LABEL:i),delete e.partialCstResult),e},t.prototype.consumeInternal=function(e,r,i){var n;try{var s=this.LA(1);this.tokenMatcher(s,e)===!0?(this.consumeToken(),n=s):this.consumeInternalError(e,s,i)}catch(o){n=this.consumeInternalRecovery(e,r,o)}return this.cstPostTerminal(i!==void 0&&i.LABEL!==void 0?i.LABEL:e.name,n),n},t.prototype.consumeInternalError=function(e,r,i){var n,s=this.LA(0);throw i!==void 0&&i.ERR_MSG?n=i.ERR_MSG:n=this.errorMessageProvider.buildMismatchTokenMessage({expected:e,actual:r,previous:s,ruleName:this.getCurrRuleFullName()}),this.SAVE_ERROR(new cy.MismatchedTokenException(n,r,s))},t.prototype.consumeInternalRecovery=function(e,r,i){if(this.recoveryEnabled&&i.name==="MismatchedTokenException"&&!this.isBackTracking()){var n=this.getFollowsForInRuleRecovery(e,r);try{return this.tryInRuleRecovery(e,n)}catch(s){throw s.name===nwe.IN_RULE_RECOVERY_EXCEPTION?i:s}}else throw i},t.prototype.saveRecogState=function(){var e=this.errors,r=(0,Rr.cloneArr)(this.RULE_STACK);return{errors:e,lexerState:this.exportLexerState(),RULE_STACK:r,CST_STACK:this.CST_STACK}},t.prototype.reloadRecogState=function(e){this.errors=e.errors,this.importLexerState(e.lexerState),this.RULE_STACK=e.RULE_STACK},t.prototype.ruleInvocationStateUpdate=function(e,r,i){this.RULE_OCCURRENCE_STACK.push(i),this.RULE_STACK.push(e),this.cstInvocationStateUpdate(r,e)},t.prototype.isBackTracking=function(){return this.isBackTrackingStack.length!==0},t.prototype.getCurrRuleFullName=function(){var e=this.getLastExplicitRuleShortName();return this.shortRuleNameToFull[e]},t.prototype.shortRuleNameToFullName=function(e){return this.shortRuleNameToFull[e]},t.prototype.isAtEndOfInput=function(){return this.tokenMatcher(this.LA(1),_j.EOF)},t.prototype.reset=function(){this.resetLexerState(),this.isBackTrackingStack=[],this.errors=[],this.RULE_STACK=[],this.CST_STACK=[],this.RULE_OCCURRENCE_STACK=[]},t}();ly.RecognizerEngine=owe});var Zj=w(uy=>{"use strict";Object.defineProperty(uy,"__esModule",{value:!0});uy.ErrorHandler=void 0;var uS=Ig(),gS=Yt(),Xj=Up(),awe=Zn(),Awe=function(){function t(){}return t.prototype.initErrorHandler=function(e){this._errors=[],this.errorMessageProvider=(0,gS.has)(e,"errorMessageProvider")?e.errorMessageProvider:awe.DEFAULT_PARSER_CONFIG.errorMessageProvider},t.prototype.SAVE_ERROR=function(e){if((0,uS.isRecognitionException)(e))return e.context={ruleStack:this.getHumanReadableRuleStack(),ruleOccurrenceStack:(0,gS.cloneArr)(this.RULE_OCCURRENCE_STACK)},this._errors.push(e),e;throw Error("Trying to save an Error which is not a RecognitionException")},Object.defineProperty(t.prototype,"errors",{get:function(){return(0,gS.cloneArr)(this._errors)},set:function(e){this._errors=e},enumerable:!1,configurable:!0}),t.prototype.raiseEarlyExitException=function(e,r,i){for(var n=this.getCurrRuleFullName(),s=this.getGAstProductions()[n],o=(0,Xj.getLookaheadPathsForOptionalProd)(e,s,r,this.maxLookahead),a=o[0],l=[],c=1;c<=this.maxLookahead;c++)l.push(this.LA(c));var u=this.errorMessageProvider.buildEarlyExitMessage({expectedIterationPaths:a,actual:l,previous:this.LA(0),customUserDescription:i,ruleName:n});throw this.SAVE_ERROR(new uS.EarlyExitException(u,this.LA(1),this.LA(0)))},t.prototype.raiseNoAltException=function(e,r){for(var i=this.getCurrRuleFullName(),n=this.getGAstProductions()[i],s=(0,Xj.getLookaheadPathsForOr)(e,n,this.maxLookahead),o=[],a=1;a<=this.maxLookahead;a++)o.push(this.LA(a));var l=this.LA(0),c=this.errorMessageProvider.buildNoViableAltMessage({expectedPathsPerAlt:s,actual:o,previous:l,customUserDescription:r,ruleName:this.getCurrRuleFullName()});throw this.SAVE_ERROR(new uS.NoViableAltException(c,this.LA(1),l))},t}();uy.ErrorHandler=Awe});var tY=w(gy=>{"use strict";Object.defineProperty(gy,"__esModule",{value:!0});gy.ContentAssist=void 0;var $j=Kp(),eY=Yt(),lwe=function(){function t(){}return t.prototype.initContentAssist=function(){},t.prototype.computeContentAssist=function(e,r){var i=this.gastProductionsCache[e];if((0,eY.isUndefined)(i))throw Error("Rule ->"+e+"<- does not exist in this grammar.");return(0,$j.nextPossibleTokensAfter)([i],r,this.tokenMatcher,this.maxLookahead)},t.prototype.getNextPossibleTokenTypes=function(e){var r=(0,eY.first)(e.ruleStack),i=this.getGAstProductions(),n=i[r],s=new $j.NextAfterTokenWalker(n,e).startWalking();return s},t}();gy.ContentAssist=lwe});var lY=w(fy=>{"use strict";Object.defineProperty(fy,"__esModule",{value:!0});fy.GastRecorder=void 0;var Sn=Yt(),Ho=bn(),cwe=Rp(),rY=pg(),iY=WA(),uwe=Zn(),gwe=ny(),hy={description:"This Object indicates the Parser is during Recording Phase"};Object.freeze(hy);var nY=!0,sY=Math.pow(2,gwe.BITS_FOR_OCCURRENCE_IDX)-1,oY=(0,iY.createToken)({name:"RECORDING_PHASE_TOKEN",pattern:cwe.Lexer.NA});(0,rY.augmentTokenTypes)([oY]);var aY=(0,iY.createTokenInstance)(oY,`This IToken indicates the Parser is in Recording Phase - See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,-1,-1,-1,-1,-1,-1);Object.freeze(aY);var fwe={name:`This CSTNode indicates the Parser is in Recording Phase - See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,children:{}},pwe=function(){function t(){}return t.prototype.initGastRecorder=function(e){this.recordingProdStack=[],this.RECORDING_PHASE=!1},t.prototype.enableRecording=function(){var e=this;this.RECORDING_PHASE=!0,this.TRACE_INIT("Enable Recording",function(){for(var r=function(n){var s=n>0?n:"";e["CONSUME"+s]=function(o,a){return this.consumeInternalRecord(o,n,a)},e["SUBRULE"+s]=function(o,a){return this.subruleInternalRecord(o,n,a)},e["OPTION"+s]=function(o){return this.optionInternalRecord(o,n)},e["OR"+s]=function(o){return this.orInternalRecord(o,n)},e["MANY"+s]=function(o){this.manyInternalRecord(n,o)},e["MANY_SEP"+s]=function(o){this.manySepFirstInternalRecord(n,o)},e["AT_LEAST_ONE"+s]=function(o){this.atLeastOneInternalRecord(n,o)},e["AT_LEAST_ONE_SEP"+s]=function(o){this.atLeastOneSepFirstInternalRecord(n,o)}},i=0;i<10;i++)r(i);e.consume=function(n,s,o){return this.consumeInternalRecord(s,n,o)},e.subrule=function(n,s,o){return this.subruleInternalRecord(s,n,o)},e.option=function(n,s){return this.optionInternalRecord(s,n)},e.or=function(n,s){return this.orInternalRecord(s,n)},e.many=function(n,s){this.manyInternalRecord(n,s)},e.atLeastOne=function(n,s){this.atLeastOneInternalRecord(n,s)},e.ACTION=e.ACTION_RECORD,e.BACKTRACK=e.BACKTRACK_RECORD,e.LA=e.LA_RECORD})},t.prototype.disableRecording=function(){var e=this;this.RECORDING_PHASE=!1,this.TRACE_INIT("Deleting Recording methods",function(){for(var r=0;r<10;r++){var i=r>0?r:"";delete e["CONSUME"+i],delete e["SUBRULE"+i],delete e["OPTION"+i],delete e["OR"+i],delete e["MANY"+i],delete e["MANY_SEP"+i],delete e["AT_LEAST_ONE"+i],delete e["AT_LEAST_ONE_SEP"+i]}delete e.consume,delete e.subrule,delete e.option,delete e.or,delete e.many,delete e.atLeastOne,delete e.ACTION,delete e.BACKTRACK,delete e.LA})},t.prototype.ACTION_RECORD=function(e){},t.prototype.BACKTRACK_RECORD=function(e,r){return function(){return!0}},t.prototype.LA_RECORD=function(e){return uwe.END_OF_FILE},t.prototype.topLevelRuleRecord=function(e,r){try{var i=new Ho.Rule({definition:[],name:e});return i.name=e,this.recordingProdStack.push(i),r.call(this),this.recordingProdStack.pop(),i}catch(n){if(n.KNOWN_RECORDER_ERROR!==!0)try{n.message=n.message+` - This error was thrown during the "grammar recording phase" For more info see: - https://chevrotain.io/docs/guide/internals.html#grammar-recording`}catch(s){throw n}throw n}},t.prototype.optionInternalRecord=function(e,r){return qp.call(this,Ho.Option,e,r)},t.prototype.atLeastOneInternalRecord=function(e,r){qp.call(this,Ho.RepetitionMandatory,r,e)},t.prototype.atLeastOneSepFirstInternalRecord=function(e,r){qp.call(this,Ho.RepetitionMandatoryWithSeparator,r,e,nY)},t.prototype.manyInternalRecord=function(e,r){qp.call(this,Ho.Repetition,r,e)},t.prototype.manySepFirstInternalRecord=function(e,r){qp.call(this,Ho.RepetitionWithSeparator,r,e,nY)},t.prototype.orInternalRecord=function(e,r){return hwe.call(this,e,r)},t.prototype.subruleInternalRecord=function(e,r,i){if(py(r),!e||(0,Sn.has)(e,"ruleName")===!1){var n=new Error(" argument is invalid"+(" expecting a Parser method reference but got: <"+JSON.stringify(e)+">")+(` - inside top level rule: <`+this.recordingProdStack[0].name+">"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,Sn.peek)(this.recordingProdStack),o=e.ruleName,a=new Ho.NonTerminal({idx:r,nonTerminalName:o,label:i==null?void 0:i.LABEL,referencedRule:void 0});return s.definition.push(a),this.outputCst?fwe:hy},t.prototype.consumeInternalRecord=function(e,r,i){if(py(r),!(0,rY.hasShortKeyProperty)(e)){var n=new Error(" argument is invalid"+(" expecting a TokenType reference but got: <"+JSON.stringify(e)+">")+(` - inside top level rule: <`+this.recordingProdStack[0].name+">"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,Sn.peek)(this.recordingProdStack),o=new Ho.Terminal({idx:r,terminalType:e,label:i==null?void 0:i.LABEL});return s.definition.push(o),aY},t}();fy.GastRecorder=pwe;function qp(t,e,r,i){i===void 0&&(i=!1),py(r);var n=(0,Sn.peek)(this.recordingProdStack),s=(0,Sn.isFunction)(e)?e:e.DEF,o=new t({definition:[],idx:r});return i&&(o.separator=e.SEP),(0,Sn.has)(e,"MAX_LOOKAHEAD")&&(o.maxLookahead=e.MAX_LOOKAHEAD),this.recordingProdStack.push(o),s.call(this),n.definition.push(o),this.recordingProdStack.pop(),hy}function hwe(t,e){var r=this;py(e);var i=(0,Sn.peek)(this.recordingProdStack),n=(0,Sn.isArray)(t)===!1,s=n===!1?t:t.DEF,o=new Ho.Alternation({definition:[],idx:e,ignoreAmbiguities:n&&t.IGNORE_AMBIGUITIES===!0});(0,Sn.has)(t,"MAX_LOOKAHEAD")&&(o.maxLookahead=t.MAX_LOOKAHEAD);var a=(0,Sn.some)(s,function(l){return(0,Sn.isFunction)(l.GATE)});return o.hasPredicates=a,i.definition.push(o),(0,Sn.forEach)(s,function(l){var c=new Ho.Alternative({definition:[]});o.definition.push(c),(0,Sn.has)(l,"IGNORE_AMBIGUITIES")?c.ignoreAmbiguities=l.IGNORE_AMBIGUITIES:(0,Sn.has)(l,"GATE")&&(c.ignoreAmbiguities=!0),r.recordingProdStack.push(c),l.ALT.call(r),r.recordingProdStack.pop()}),hy}function AY(t){return t===0?"":""+t}function py(t){if(t<0||t>sY){var e=new Error("Invalid DSL Method idx value: <"+t+`> - `+("Idx value must be a none negative value smaller than "+(sY+1)));throw e.KNOWN_RECORDER_ERROR=!0,e}}});var uY=w(dy=>{"use strict";Object.defineProperty(dy,"__esModule",{value:!0});dy.PerformanceTracer=void 0;var cY=Yt(),dwe=Zn(),Cwe=function(){function t(){}return t.prototype.initPerformanceTracer=function(e){if((0,cY.has)(e,"traceInitPerf")){var r=e.traceInitPerf,i=typeof r=="number";this.traceInitMaxIdent=i?r:Infinity,this.traceInitPerf=i?r>0:r}else this.traceInitMaxIdent=0,this.traceInitPerf=dwe.DEFAULT_PARSER_CONFIG.traceInitPerf;this.traceInitIndent=-1},t.prototype.TRACE_INIT=function(e,r){if(this.traceInitPerf===!0){this.traceInitIndent++;var i=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <"+e+">");var n=(0,cY.timer)(r),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent time: "+s+"ms"),this.traceInitIndent--,o}else return r()},t}();dy.PerformanceTracer=Cwe});var gY=w(Cy=>{"use strict";Object.defineProperty(Cy,"__esModule",{value:!0});Cy.applyMixins=void 0;function mwe(t,e){e.forEach(function(r){var i=r.prototype;Object.getOwnPropertyNames(i).forEach(function(n){if(n!=="constructor"){var s=Object.getOwnPropertyDescriptor(i,n);s&&(s.get||s.set)?Object.defineProperty(t.prototype,n,s):t.prototype[n]=r.prototype[n]}})})}Cy.applyMixins=mwe});var Zn=w(Er=>{"use strict";var fY=Er&&Er.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(Er,"__esModule",{value:!0});Er.EmbeddedActionsParser=Er.CstParser=Er.Parser=Er.EMPTY_ALT=Er.ParserDefinitionErrorType=Er.DEFAULT_RULE_CONFIG=Er.DEFAULT_PARSER_CONFIG=Er.END_OF_FILE=void 0;var an=Yt(),Ewe=ZG(),hY=WA(),pY=Op(),dY=bj(),Iwe=aS(),ywe=Rj(),wwe=Gj(),Bwe=Yj(),bwe=Jj(),Qwe=Vj(),vwe=Zj(),Swe=tY(),kwe=lY(),xwe=uY(),Pwe=gY();Er.END_OF_FILE=(0,hY.createTokenInstance)(hY.EOF,"",NaN,NaN,NaN,NaN,NaN,NaN);Object.freeze(Er.END_OF_FILE);Er.DEFAULT_PARSER_CONFIG=Object.freeze({recoveryEnabled:!1,maxLookahead:3,dynamicTokensEnabled:!1,outputCst:!0,errorMessageProvider:pY.defaultParserErrorProvider,nodeLocationTracking:"none",traceInitPerf:!1,skipValidations:!1});Er.DEFAULT_RULE_CONFIG=Object.freeze({recoveryValueFunc:function(){},resyncEnabled:!0});var Dwe;(function(t){t[t.INVALID_RULE_NAME=0]="INVALID_RULE_NAME",t[t.DUPLICATE_RULE_NAME=1]="DUPLICATE_RULE_NAME",t[t.INVALID_RULE_OVERRIDE=2]="INVALID_RULE_OVERRIDE",t[t.DUPLICATE_PRODUCTIONS=3]="DUPLICATE_PRODUCTIONS",t[t.UNRESOLVED_SUBRULE_REF=4]="UNRESOLVED_SUBRULE_REF",t[t.LEFT_RECURSION=5]="LEFT_RECURSION",t[t.NONE_LAST_EMPTY_ALT=6]="NONE_LAST_EMPTY_ALT",t[t.AMBIGUOUS_ALTS=7]="AMBIGUOUS_ALTS",t[t.CONFLICT_TOKENS_RULES_NAMESPACE=8]="CONFLICT_TOKENS_RULES_NAMESPACE",t[t.INVALID_TOKEN_NAME=9]="INVALID_TOKEN_NAME",t[t.NO_NON_EMPTY_LOOKAHEAD=10]="NO_NON_EMPTY_LOOKAHEAD",t[t.AMBIGUOUS_PREFIX_ALTS=11]="AMBIGUOUS_PREFIX_ALTS",t[t.TOO_MANY_ALTS=12]="TOO_MANY_ALTS"})(Dwe=Er.ParserDefinitionErrorType||(Er.ParserDefinitionErrorType={}));function Rwe(t){return t===void 0&&(t=void 0),function(){return t}}Er.EMPTY_ALT=Rwe;var my=function(){function t(e,r){this.definitionErrors=[],this.selfAnalysisDone=!1;var i=this;if(i.initErrorHandler(r),i.initLexerAdapter(),i.initLooksAhead(r),i.initRecognizerEngine(e,r),i.initRecoverable(r),i.initTreeBuilder(r),i.initContentAssist(),i.initGastRecorder(r),i.initPerformanceTracer(r),(0,an.has)(r,"ignoredIssues"))throw new Error(`The IParserConfig property has been deprecated. - Please use the flag on the relevant DSL method instead. - See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES - For further details.`);this.skipValidations=(0,an.has)(r,"skipValidations")?r.skipValidations:Er.DEFAULT_PARSER_CONFIG.skipValidations}return t.performSelfAnalysis=function(e){throw Error("The **static** `performSelfAnalysis` method has been deprecated. \nUse the **instance** method with the same name instead.")},t.prototype.performSelfAnalysis=function(){var e=this;this.TRACE_INIT("performSelfAnalysis",function(){var r;e.selfAnalysisDone=!0;var i=e.className;e.TRACE_INIT("toFastProps",function(){(0,an.toFastProperties)(e)}),e.TRACE_INIT("Grammar Recording",function(){try{e.enableRecording(),(0,an.forEach)(e.definedRulesNames,function(s){var o=e[s],a=o.originalGrammarAction,l=void 0;e.TRACE_INIT(s+" Rule",function(){l=e.topLevelRuleRecord(s,a)}),e.gastProductionsCache[s]=l})}finally{e.disableRecording()}});var n=[];if(e.TRACE_INIT("Grammar Resolving",function(){n=(0,dY.resolveGrammar)({rules:(0,an.values)(e.gastProductionsCache)}),e.definitionErrors=e.definitionErrors.concat(n)}),e.TRACE_INIT("Grammar Validations",function(){if((0,an.isEmpty)(n)&&e.skipValidations===!1){var s=(0,dY.validateGrammar)({rules:(0,an.values)(e.gastProductionsCache),maxLookahead:e.maxLookahead,tokenTypes:(0,an.values)(e.tokensMap),errMsgProvider:pY.defaultGrammarValidatorErrorProvider,grammarName:i});e.definitionErrors=e.definitionErrors.concat(s)}}),(0,an.isEmpty)(e.definitionErrors)&&(e.recoveryEnabled&&e.TRACE_INIT("computeAllProdsFollows",function(){var s=(0,Ewe.computeAllProdsFollows)((0,an.values)(e.gastProductionsCache));e.resyncFollows=s}),e.TRACE_INIT("ComputeLookaheadFunctions",function(){e.preComputeLookaheadFunctions((0,an.values)(e.gastProductionsCache))})),!t.DEFER_DEFINITION_ERRORS_HANDLING&&!(0,an.isEmpty)(e.definitionErrors))throw r=(0,an.map)(e.definitionErrors,function(s){return s.message}),new Error(`Parser Definition Errors detected: - `+r.join(` -------------------------------- -`))})},t.DEFER_DEFINITION_ERRORS_HANDLING=!1,t}();Er.Parser=my;(0,Pwe.applyMixins)(my,[Iwe.Recoverable,ywe.LooksAhead,wwe.TreeBuilder,Bwe.LexerAdapter,Qwe.RecognizerEngine,bwe.RecognizerApi,vwe.ErrorHandler,Swe.ContentAssist,kwe.GastRecorder,xwe.PerformanceTracer]);var Fwe=function(t){fY(e,t);function e(r,i){i===void 0&&(i=Er.DEFAULT_PARSER_CONFIG);var n=this,s=(0,an.cloneObj)(i);return s.outputCst=!0,n=t.call(this,r,s)||this,n}return e}(my);Er.CstParser=Fwe;var Nwe=function(t){fY(e,t);function e(r,i){i===void 0&&(i=Er.DEFAULT_PARSER_CONFIG);var n=this,s=(0,an.cloneObj)(i);return s.outputCst=!1,n=t.call(this,r,s)||this,n}return e}(my);Er.EmbeddedActionsParser=Nwe});var mY=w(Ey=>{"use strict";Object.defineProperty(Ey,"__esModule",{value:!0});Ey.createSyntaxDiagramsCode=void 0;var CY=Rv();function Lwe(t,e){var r=e===void 0?{}:e,i=r.resourceBase,n=i===void 0?"https://unpkg.com/chevrotain@"+CY.VERSION+"/diagrams/":i,s=r.css,o=s===void 0?"https://unpkg.com/chevrotain@"+CY.VERSION+"/diagrams/diagrams.css":s,a=` - - - - - -`,l=` - -`,c=` - - - - -`,u=` -

-`,g=` - -`,f=` - -`;return a+l+c+u+g+f}Ey.createSyntaxDiagramsCode=Lwe});var yY=w(Ve=>{"use strict";Object.defineProperty(Ve,"__esModule",{value:!0});Ve.Parser=Ve.createSyntaxDiagramsCode=Ve.clearCache=Ve.GAstVisitor=Ve.serializeProduction=Ve.serializeGrammar=Ve.Terminal=Ve.Rule=Ve.RepetitionWithSeparator=Ve.RepetitionMandatoryWithSeparator=Ve.RepetitionMandatory=Ve.Repetition=Ve.Option=Ve.NonTerminal=Ve.Alternative=Ve.Alternation=Ve.defaultLexerErrorProvider=Ve.NoViableAltException=Ve.NotAllInputParsedException=Ve.MismatchedTokenException=Ve.isRecognitionException=Ve.EarlyExitException=Ve.defaultParserErrorProvider=Ve.tokenName=Ve.tokenMatcher=Ve.tokenLabel=Ve.EOF=Ve.createTokenInstance=Ve.createToken=Ve.LexerDefinitionErrorType=Ve.Lexer=Ve.EMPTY_ALT=Ve.ParserDefinitionErrorType=Ve.EmbeddedActionsParser=Ve.CstParser=Ve.VERSION=void 0;var Twe=Rv();Object.defineProperty(Ve,"VERSION",{enumerable:!0,get:function(){return Twe.VERSION}});var Iy=Zn();Object.defineProperty(Ve,"CstParser",{enumerable:!0,get:function(){return Iy.CstParser}});Object.defineProperty(Ve,"EmbeddedActionsParser",{enumerable:!0,get:function(){return Iy.EmbeddedActionsParser}});Object.defineProperty(Ve,"ParserDefinitionErrorType",{enumerable:!0,get:function(){return Iy.ParserDefinitionErrorType}});Object.defineProperty(Ve,"EMPTY_ALT",{enumerable:!0,get:function(){return Iy.EMPTY_ALT}});var EY=Rp();Object.defineProperty(Ve,"Lexer",{enumerable:!0,get:function(){return EY.Lexer}});Object.defineProperty(Ve,"LexerDefinitionErrorType",{enumerable:!0,get:function(){return EY.LexerDefinitionErrorType}});var Bg=WA();Object.defineProperty(Ve,"createToken",{enumerable:!0,get:function(){return Bg.createToken}});Object.defineProperty(Ve,"createTokenInstance",{enumerable:!0,get:function(){return Bg.createTokenInstance}});Object.defineProperty(Ve,"EOF",{enumerable:!0,get:function(){return Bg.EOF}});Object.defineProperty(Ve,"tokenLabel",{enumerable:!0,get:function(){return Bg.tokenLabel}});Object.defineProperty(Ve,"tokenMatcher",{enumerable:!0,get:function(){return Bg.tokenMatcher}});Object.defineProperty(Ve,"tokenName",{enumerable:!0,get:function(){return Bg.tokenName}});var Owe=Op();Object.defineProperty(Ve,"defaultParserErrorProvider",{enumerable:!0,get:function(){return Owe.defaultParserErrorProvider}});var Jp=Ig();Object.defineProperty(Ve,"EarlyExitException",{enumerable:!0,get:function(){return Jp.EarlyExitException}});Object.defineProperty(Ve,"isRecognitionException",{enumerable:!0,get:function(){return Jp.isRecognitionException}});Object.defineProperty(Ve,"MismatchedTokenException",{enumerable:!0,get:function(){return Jp.MismatchedTokenException}});Object.defineProperty(Ve,"NotAllInputParsedException",{enumerable:!0,get:function(){return Jp.NotAllInputParsedException}});Object.defineProperty(Ve,"NoViableAltException",{enumerable:!0,get:function(){return Jp.NoViableAltException}});var Mwe=Gv();Object.defineProperty(Ve,"defaultLexerErrorProvider",{enumerable:!0,get:function(){return Mwe.defaultLexerErrorProvider}});var Go=bn();Object.defineProperty(Ve,"Alternation",{enumerable:!0,get:function(){return Go.Alternation}});Object.defineProperty(Ve,"Alternative",{enumerable:!0,get:function(){return Go.Alternative}});Object.defineProperty(Ve,"NonTerminal",{enumerable:!0,get:function(){return Go.NonTerminal}});Object.defineProperty(Ve,"Option",{enumerable:!0,get:function(){return Go.Option}});Object.defineProperty(Ve,"Repetition",{enumerable:!0,get:function(){return Go.Repetition}});Object.defineProperty(Ve,"RepetitionMandatory",{enumerable:!0,get:function(){return Go.RepetitionMandatory}});Object.defineProperty(Ve,"RepetitionMandatoryWithSeparator",{enumerable:!0,get:function(){return Go.RepetitionMandatoryWithSeparator}});Object.defineProperty(Ve,"RepetitionWithSeparator",{enumerable:!0,get:function(){return Go.RepetitionWithSeparator}});Object.defineProperty(Ve,"Rule",{enumerable:!0,get:function(){return Go.Rule}});Object.defineProperty(Ve,"Terminal",{enumerable:!0,get:function(){return Go.Terminal}});var IY=bn();Object.defineProperty(Ve,"serializeGrammar",{enumerable:!0,get:function(){return IY.serializeGrammar}});Object.defineProperty(Ve,"serializeProduction",{enumerable:!0,get:function(){return IY.serializeProduction}});var Kwe=dg();Object.defineProperty(Ve,"GAstVisitor",{enumerable:!0,get:function(){return Kwe.GAstVisitor}});function Uwe(){console.warn(`The clearCache function was 'soft' removed from the Chevrotain API. - It performs no action other than printing this message. - Please avoid using it as it will be completely removed in the future`)}Ve.clearCache=Uwe;var Hwe=mY();Object.defineProperty(Ve,"createSyntaxDiagramsCode",{enumerable:!0,get:function(){return Hwe.createSyntaxDiagramsCode}});var Gwe=function(){function t(){throw new Error(`The Parser class has been deprecated, use CstParser or EmbeddedActionsParser instead. -See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_7-0-0`)}return t}();Ve.Parser=Gwe});var bY=w((_tt,wY)=>{var yy=yY(),Ya=yy.createToken,BY=yy.tokenMatcher,fS=yy.Lexer,jwe=yy.EmbeddedActionsParser;wY.exports=t=>{let e=Ya({name:"LogicalOperator",pattern:fS.NA}),r=Ya({name:"Or",pattern:/\|/,categories:e}),i=Ya({name:"Xor",pattern:/\^/,categories:e}),n=Ya({name:"And",pattern:/&/,categories:e}),s=Ya({name:"Not",pattern:/!/}),o=Ya({name:"LParen",pattern:/\(/}),a=Ya({name:"RParen",pattern:/\)/}),l=Ya({name:"Query",pattern:t}),u=[Ya({name:"WhiteSpace",pattern:/\s+/,group:fS.SKIPPED}),r,i,n,o,a,s,e,l],g=new fS(u);class f extends jwe{constructor(p){super(u);this.RULE("expression",()=>this.SUBRULE(this.logicalExpression)),this.RULE("logicalExpression",()=>{let y=this.SUBRULE(this.atomicExpression);return this.MANY(()=>{let b=y,S=this.CONSUME(e),k=this.SUBRULE2(this.atomicExpression);BY(S,r)?y=T=>b(T)||k(T):BY(S,i)?y=T=>!!(b(T)^k(T)):y=T=>b(T)&&k(T)}),y}),this.RULE("atomicExpression",()=>this.OR([{ALT:()=>this.SUBRULE(this.parenthesisExpression)},{ALT:()=>{let{image:m}=this.CONSUME(l);return y=>y(m)}},{ALT:()=>{this.CONSUME(s);let m=this.SUBRULE(this.atomicExpression);return y=>!m(y)}}])),this.RULE("parenthesisExpression",()=>{let m;return this.CONSUME(o),m=this.SUBRULE(this.expression),this.CONSUME(a),m}),this.performSelfAnalysis()}}return{TinylogicLexer:g,TinylogicParser:f}}});var QY=w(wy=>{var Ywe=bY();wy.makeParser=(t=/[a-z]+/)=>{let{TinylogicLexer:e,TinylogicParser:r}=Ywe(t),i=new r;return(n,s)=>{let o=e.tokenize(n);return i.input=o.tokens,i.expression()(s)}};wy.parse=wy.makeParser()});var SY=w((Xtt,vY)=>{"use strict";vY.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}});var hS=w((Ztt,kY)=>{var Wp=SY(),xY={};for(let t of Object.keys(Wp))xY[Wp[t]]=t;var at={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};kY.exports=at;for(let t of Object.keys(at)){if(!("channels"in at[t]))throw new Error("missing channels property: "+t);if(!("labels"in at[t]))throw new Error("missing channel labels property: "+t);if(at[t].labels.length!==at[t].channels)throw new Error("channel and label counts mismatch: "+t);let{channels:e,labels:r}=at[t];delete at[t].channels,delete at[t].labels,Object.defineProperty(at[t],"channels",{value:e}),Object.defineProperty(at[t],"labels",{value:r})}at.rgb.hsl=function(t){let e=t[0]/255,r=t[1]/255,i=t[2]/255,n=Math.min(e,r,i),s=Math.max(e,r,i),o=s-n,a,l;s===n?a=0:e===s?a=(r-i)/o:r===s?a=2+(i-e)/o:i===s&&(a=4+(e-r)/o),a=Math.min(a*60,360),a<0&&(a+=360);let c=(n+s)/2;return s===n?l=0:c<=.5?l=o/(s+n):l=o/(2-s-n),[a,l*100,c*100]};at.rgb.hsv=function(t){let e,r,i,n,s,o=t[0]/255,a=t[1]/255,l=t[2]/255,c=Math.max(o,a,l),u=c-Math.min(o,a,l),g=function(f){return(c-f)/6/u+1/2};return u===0?(n=0,s=0):(s=u/c,e=g(o),r=g(a),i=g(l),o===c?n=i-r:a===c?n=1/3+e-i:l===c&&(n=2/3+r-e),n<0?n+=1:n>1&&(n-=1)),[n*360,s*100,c*100]};at.rgb.hwb=function(t){let e=t[0],r=t[1],i=t[2],n=at.rgb.hsl(t)[0],s=1/255*Math.min(e,Math.min(r,i));return i=1-1/255*Math.max(e,Math.max(r,i)),[n,s*100,i*100]};at.rgb.cmyk=function(t){let e=t[0]/255,r=t[1]/255,i=t[2]/255,n=Math.min(1-e,1-r,1-i),s=(1-e-n)/(1-n)||0,o=(1-r-n)/(1-n)||0,a=(1-i-n)/(1-n)||0;return[s*100,o*100,a*100,n*100]};function qwe(t,e){return(t[0]-e[0])**2+(t[1]-e[1])**2+(t[2]-e[2])**2}at.rgb.keyword=function(t){let e=xY[t];if(e)return e;let r=Infinity,i;for(let n of Object.keys(Wp)){let s=Wp[n],o=qwe(t,s);o.04045?((e+.055)/1.055)**2.4:e/12.92,r=r>.04045?((r+.055)/1.055)**2.4:r/12.92,i=i>.04045?((i+.055)/1.055)**2.4:i/12.92;let n=e*.4124+r*.3576+i*.1805,s=e*.2126+r*.7152+i*.0722,o=e*.0193+r*.1192+i*.9505;return[n*100,s*100,o*100]};at.rgb.lab=function(t){let e=at.rgb.xyz(t),r=e[0],i=e[1],n=e[2];r/=95.047,i/=100,n/=108.883,r=r>.008856?r**(1/3):7.787*r+16/116,i=i>.008856?i**(1/3):7.787*i+16/116,n=n>.008856?n**(1/3):7.787*n+16/116;let s=116*i-16,o=500*(r-i),a=200*(i-n);return[s,o,a]};at.hsl.rgb=function(t){let e=t[0]/360,r=t[1]/100,i=t[2]/100,n,s,o;if(r===0)return o=i*255,[o,o,o];i<.5?n=i*(1+r):n=i+r-i*r;let a=2*i-n,l=[0,0,0];for(let c=0;c<3;c++)s=e+1/3*-(c-1),s<0&&s++,s>1&&s--,6*s<1?o=a+(n-a)*6*s:2*s<1?o=n:3*s<2?o=a+(n-a)*(2/3-s)*6:o=a,l[c]=o*255;return l};at.hsl.hsv=function(t){let e=t[0],r=t[1]/100,i=t[2]/100,n=r,s=Math.max(i,.01);i*=2,r*=i<=1?i:2-i,n*=s<=1?s:2-s;let o=(i+r)/2,a=i===0?2*n/(s+n):2*r/(i+r);return[e,a*100,o*100]};at.hsv.rgb=function(t){let e=t[0]/60,r=t[1]/100,i=t[2]/100,n=Math.floor(e)%6,s=e-Math.floor(e),o=255*i*(1-r),a=255*i*(1-r*s),l=255*i*(1-r*(1-s));switch(i*=255,n){case 0:return[i,l,o];case 1:return[a,i,o];case 2:return[o,i,l];case 3:return[o,a,i];case 4:return[l,o,i];case 5:return[i,o,a]}};at.hsv.hsl=function(t){let e=t[0],r=t[1]/100,i=t[2]/100,n=Math.max(i,.01),s,o;o=(2-r)*i;let a=(2-r)*n;return s=r*n,s/=a<=1?a:2-a,s=s||0,o/=2,[e,s*100,o*100]};at.hwb.rgb=function(t){let e=t[0]/360,r=t[1]/100,i=t[2]/100,n=r+i,s;n>1&&(r/=n,i/=n);let o=Math.floor(6*e),a=1-i;s=6*e-o,(o&1)!=0&&(s=1-s);let l=r+s*(a-r),c,u,g;switch(o){default:case 6:case 0:c=a,u=l,g=r;break;case 1:c=l,u=a,g=r;break;case 2:c=r,u=a,g=l;break;case 3:c=r,u=l,g=a;break;case 4:c=l,u=r,g=a;break;case 5:c=a,u=r,g=l;break}return[c*255,u*255,g*255]};at.cmyk.rgb=function(t){let e=t[0]/100,r=t[1]/100,i=t[2]/100,n=t[3]/100,s=1-Math.min(1,e*(1-n)+n),o=1-Math.min(1,r*(1-n)+n),a=1-Math.min(1,i*(1-n)+n);return[s*255,o*255,a*255]};at.xyz.rgb=function(t){let e=t[0]/100,r=t[1]/100,i=t[2]/100,n,s,o;return n=e*3.2406+r*-1.5372+i*-.4986,s=e*-.9689+r*1.8758+i*.0415,o=e*.0557+r*-.204+i*1.057,n=n>.0031308?1.055*n**(1/2.4)-.055:n*12.92,s=s>.0031308?1.055*s**(1/2.4)-.055:s*12.92,o=o>.0031308?1.055*o**(1/2.4)-.055:o*12.92,n=Math.min(Math.max(0,n),1),s=Math.min(Math.max(0,s),1),o=Math.min(Math.max(0,o),1),[n*255,s*255,o*255]};at.xyz.lab=function(t){let e=t[0],r=t[1],i=t[2];e/=95.047,r/=100,i/=108.883,e=e>.008856?e**(1/3):7.787*e+16/116,r=r>.008856?r**(1/3):7.787*r+16/116,i=i>.008856?i**(1/3):7.787*i+16/116;let n=116*r-16,s=500*(e-r),o=200*(r-i);return[n,s,o]};at.lab.xyz=function(t){let e=t[0],r=t[1],i=t[2],n,s,o;s=(e+16)/116,n=r/500+s,o=s-i/200;let a=s**3,l=n**3,c=o**3;return s=a>.008856?a:(s-16/116)/7.787,n=l>.008856?l:(n-16/116)/7.787,o=c>.008856?c:(o-16/116)/7.787,n*=95.047,s*=100,o*=108.883,[n,s,o]};at.lab.lch=function(t){let e=t[0],r=t[1],i=t[2],n;n=Math.atan2(i,r)*360/2/Math.PI,n<0&&(n+=360);let o=Math.sqrt(r*r+i*i);return[e,o,n]};at.lch.lab=function(t){let e=t[0],r=t[1],n=t[2]/360*2*Math.PI,s=r*Math.cos(n),o=r*Math.sin(n);return[e,s,o]};at.rgb.ansi16=function(t,e=null){let[r,i,n]=t,s=e===null?at.rgb.hsv(t)[2]:e;if(s=Math.round(s/50),s===0)return 30;let o=30+(Math.round(n/255)<<2|Math.round(i/255)<<1|Math.round(r/255));return s===2&&(o+=60),o};at.hsv.ansi16=function(t){return at.rgb.ansi16(at.hsv.rgb(t),t[2])};at.rgb.ansi256=function(t){let e=t[0],r=t[1],i=t[2];return e===r&&r===i?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(r/255*5)+Math.round(i/255*5)};at.ansi16.rgb=function(t){let e=t%10;if(e===0||e===7)return t>50&&(e+=3.5),e=e/10.5*255,[e,e,e];let r=(~~(t>50)+1)*.5,i=(e&1)*r*255,n=(e>>1&1)*r*255,s=(e>>2&1)*r*255;return[i,n,s]};at.ansi256.rgb=function(t){if(t>=232){let s=(t-232)*10+8;return[s,s,s]}t-=16;let e,r=Math.floor(t/36)/5*255,i=Math.floor((e=t%36)/6)/5*255,n=e%6/5*255;return[r,i,n]};at.rgb.hex=function(t){let r=(((Math.round(t[0])&255)<<16)+((Math.round(t[1])&255)<<8)+(Math.round(t[2])&255)).toString(16).toUpperCase();return"000000".substring(r.length)+r};at.hex.rgb=function(t){let e=t.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];let r=e[0];e[0].length===3&&(r=r.split("").map(a=>a+a).join(""));let i=parseInt(r,16),n=i>>16&255,s=i>>8&255,o=i&255;return[n,s,o]};at.rgb.hcg=function(t){let e=t[0]/255,r=t[1]/255,i=t[2]/255,n=Math.max(Math.max(e,r),i),s=Math.min(Math.min(e,r),i),o=n-s,a,l;return o<1?a=s/(1-o):a=0,o<=0?l=0:n===e?l=(r-i)/o%6:n===r?l=2+(i-e)/o:l=4+(e-r)/o,l/=6,l%=1,[l*360,o*100,a*100]};at.hsl.hcg=function(t){let e=t[1]/100,r=t[2]/100,i=r<.5?2*e*r:2*e*(1-r),n=0;return i<1&&(n=(r-.5*i)/(1-i)),[t[0],i*100,n*100]};at.hsv.hcg=function(t){let e=t[1]/100,r=t[2]/100,i=e*r,n=0;return i<1&&(n=(r-i)/(1-i)),[t[0],i*100,n*100]};at.hcg.rgb=function(t){let e=t[0]/360,r=t[1]/100,i=t[2]/100;if(r===0)return[i*255,i*255,i*255];let n=[0,0,0],s=e%1*6,o=s%1,a=1-o,l=0;switch(Math.floor(s)){case 0:n[0]=1,n[1]=o,n[2]=0;break;case 1:n[0]=a,n[1]=1,n[2]=0;break;case 2:n[0]=0,n[1]=1,n[2]=o;break;case 3:n[0]=0,n[1]=a,n[2]=1;break;case 4:n[0]=o,n[1]=0,n[2]=1;break;default:n[0]=1,n[1]=0,n[2]=a}return l=(1-r)*i,[(r*n[0]+l)*255,(r*n[1]+l)*255,(r*n[2]+l)*255]};at.hcg.hsv=function(t){let e=t[1]/100,r=t[2]/100,i=e+r*(1-e),n=0;return i>0&&(n=e/i),[t[0],n*100,i*100]};at.hcg.hsl=function(t){let e=t[1]/100,i=t[2]/100*(1-e)+.5*e,n=0;return i>0&&i<.5?n=e/(2*i):i>=.5&&i<1&&(n=e/(2*(1-i))),[t[0],n*100,i*100]};at.hcg.hwb=function(t){let e=t[1]/100,r=t[2]/100,i=e+r*(1-e);return[t[0],(i-e)*100,(1-i)*100]};at.hwb.hcg=function(t){let e=t[1]/100,r=t[2]/100,i=1-r,n=i-e,s=0;return n<1&&(s=(i-n)/(1-n)),[t[0],n*100,s*100]};at.apple.rgb=function(t){return[t[0]/65535*255,t[1]/65535*255,t[2]/65535*255]};at.rgb.apple=function(t){return[t[0]/255*65535,t[1]/255*65535,t[2]/255*65535]};at.gray.rgb=function(t){return[t[0]/100*255,t[0]/100*255,t[0]/100*255]};at.gray.hsl=function(t){return[0,0,t[0]]};at.gray.hsv=at.gray.hsl;at.gray.hwb=function(t){return[0,100,t[0]]};at.gray.cmyk=function(t){return[0,0,0,t[0]]};at.gray.lab=function(t){return[t[0],0,0]};at.gray.hex=function(t){let e=Math.round(t[0]/100*255)&255,i=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return"000000".substring(i.length)+i};at.rgb.gray=function(t){return[(t[0]+t[1]+t[2])/3/255*100]}});var DY=w(($tt,PY)=>{var By=hS();function Jwe(){let t={},e=Object.keys(By);for(let r=e.length,i=0;i{var pS=hS(),Vwe=DY(),bg={},Xwe=Object.keys(pS);function Zwe(t){let e=function(...r){let i=r[0];return i==null?i:(i.length>1&&(r=i),t(r))};return"conversion"in t&&(e.conversion=t.conversion),e}function $we(t){let e=function(...r){let i=r[0];if(i==null)return i;i.length>1&&(r=i);let n=t(r);if(typeof n=="object")for(let s=n.length,o=0;o{bg[t]={},Object.defineProperty(bg[t],"channels",{value:pS[t].channels}),Object.defineProperty(bg[t],"labels",{value:pS[t].labels});let e=Vwe(t);Object.keys(e).forEach(i=>{let n=e[i];bg[t][i]=$we(n),bg[t][i].raw=Zwe(n)})});RY.exports=bg});var KY=w((trt,NY)=>{"use strict";var LY=(t,e)=>(...r)=>`[${t(...r)+e}m`,TY=(t,e)=>(...r)=>{let i=t(...r);return`[${38+e};5;${i}m`},OY=(t,e)=>(...r)=>{let i=t(...r);return`[${38+e};2;${i[0]};${i[1]};${i[2]}m`},by=t=>t,MY=(t,e,r)=>[t,e,r],Qg=(t,e,r)=>{Object.defineProperty(t,e,{get:()=>{let i=r();return Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0}),i},enumerable:!0,configurable:!0})},dS,vg=(t,e,r,i)=>{dS===void 0&&(dS=FY());let n=i?10:0,s={};for(let[o,a]of Object.entries(dS)){let l=o==="ansi16"?"ansi":o;o===e?s[l]=t(r,n):typeof a=="object"&&(s[l]=t(a[e],n))}return s};function eBe(){let t=new Map,e={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};e.color.gray=e.color.blackBright,e.bgColor.bgGray=e.bgColor.bgBlackBright,e.color.grey=e.color.blackBright,e.bgColor.bgGrey=e.bgColor.bgBlackBright;for(let[r,i]of Object.entries(e)){for(let[n,s]of Object.entries(i))e[n]={open:`[${s[0]}m`,close:`[${s[1]}m`},i[n]=e[n],t.set(s[0],s[1]);Object.defineProperty(e,r,{value:i,enumerable:!1})}return Object.defineProperty(e,"codes",{value:t,enumerable:!1}),e.color.close="",e.bgColor.close="",Qg(e.color,"ansi",()=>vg(LY,"ansi16",by,!1)),Qg(e.color,"ansi256",()=>vg(TY,"ansi256",by,!1)),Qg(e.color,"ansi16m",()=>vg(OY,"rgb",MY,!1)),Qg(e.bgColor,"ansi",()=>vg(LY,"ansi16",by,!0)),Qg(e.bgColor,"ansi256",()=>vg(TY,"ansi256",by,!0)),Qg(e.bgColor,"ansi16m",()=>vg(OY,"rgb",MY,!0)),e}Object.defineProperty(NY,"exports",{enumerable:!0,get:eBe})});var HY=w((rrt,UY)=>{"use strict";UY.exports=(t,e=process.argv)=>{let r=t.startsWith("-")?"":t.length===1?"-":"--",i=e.indexOf(r+t),n=e.indexOf("--");return i!==-1&&(n===-1||i{"use strict";var tBe=require("os"),jY=require("tty"),xs=HY(),{env:ui}=process,XA;xs("no-color")||xs("no-colors")||xs("color=false")||xs("color=never")?XA=0:(xs("color")||xs("colors")||xs("color=true")||xs("color=always"))&&(XA=1);"FORCE_COLOR"in ui&&(ui.FORCE_COLOR==="true"?XA=1:ui.FORCE_COLOR==="false"?XA=0:XA=ui.FORCE_COLOR.length===0?1:Math.min(parseInt(ui.FORCE_COLOR,10),3));function CS(t){return t===0?!1:{level:t,hasBasic:!0,has256:t>=2,has16m:t>=3}}function mS(t,e){if(XA===0)return 0;if(xs("color=16m")||xs("color=full")||xs("color=truecolor"))return 3;if(xs("color=256"))return 2;if(t&&!e&&XA===void 0)return 0;let r=XA||0;if(ui.TERM==="dumb")return r;if(process.platform==="win32"){let i=tBe.release().split(".");return Number(i[0])>=10&&Number(i[2])>=10586?Number(i[2])>=14931?3:2:1}if("CI"in ui)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI"].some(i=>i in ui)||ui.CI_NAME==="codeship"?1:r;if("TEAMCITY_VERSION"in ui)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(ui.TEAMCITY_VERSION)?1:0;if("GITHUB_ACTIONS"in ui)return 1;if(ui.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in ui){let i=parseInt((ui.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(ui.TERM_PROGRAM){case"iTerm.app":return i>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(ui.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(ui.TERM)||"COLORTERM"in ui?1:r}function rBe(t){let e=mS(t,t&&t.isTTY);return CS(e)}GY.exports={supportsColor:rBe,stdout:CS(mS(!0,jY.isatty(1))),stderr:CS(mS(!0,jY.isatty(2)))}});var JY=w((nrt,qY)=>{"use strict";var iBe=(t,e,r)=>{let i=t.indexOf(e);if(i===-1)return t;let n=e.length,s=0,o="";do o+=t.substr(s,i-s)+e+r,s=i+n,i=t.indexOf(e,s);while(i!==-1);return o+=t.substr(s),o},nBe=(t,e,r,i)=>{let n=0,s="";do{let o=t[i-1]==="\r";s+=t.substr(n,(o?i-1:i)-n)+e+(o?`\r -`:` -`)+r,n=i+1,i=t.indexOf(` -`,n)}while(i!==-1);return s+=t.substr(n),s};qY.exports={stringReplaceAll:iBe,stringEncaseCRLFWithFirstIndex:nBe}});var XY=w((srt,WY)=>{"use strict";var sBe=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,zY=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,oBe=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,aBe=/\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.)|([^\\])/gi,ABe=new Map([["n",` -`],["r","\r"],["t"," "],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e",""],["a","\x07"]]);function _Y(t){let e=t[0]==="u",r=t[1]==="{";return e&&!r&&t.length===5||t[0]==="x"&&t.length===3?String.fromCharCode(parseInt(t.slice(1),16)):e&&r?String.fromCodePoint(parseInt(t.slice(2,-1),16)):ABe.get(t)||t}function lBe(t,e){let r=[],i=e.trim().split(/\s*,\s*/g),n;for(let s of i){let o=Number(s);if(!Number.isNaN(o))r.push(o);else if(n=s.match(oBe))r.push(n[2].replace(aBe,(a,l,c)=>l?_Y(l):c));else throw new Error(`Invalid Chalk template style argument: ${s} (in style '${t}')`)}return r}function cBe(t){zY.lastIndex=0;let e=[],r;for(;(r=zY.exec(t))!==null;){let i=r[1];if(r[2]){let n=lBe(i,r[2]);e.push([i].concat(n))}else e.push([i])}return e}function VY(t,e){let r={};for(let n of e)for(let s of n.styles)r[s[0]]=n.inverse?null:s.slice(1);let i=t;for(let[n,s]of Object.entries(r))if(!!Array.isArray(s)){if(!(n in i))throw new Error(`Unknown Chalk style: ${n}`);i=s.length>0?i[n](...s):i[n]}return i}WY.exports=(t,e)=>{let r=[],i=[],n=[];if(e.replace(sBe,(s,o,a,l,c,u)=>{if(o)n.push(_Y(o));else if(l){let g=n.join("");n=[],i.push(r.length===0?g:VY(t,r)(g)),r.push({inverse:a,styles:cBe(l)})}else if(c){if(r.length===0)throw new Error("Found extraneous } in Chalk template literal");i.push(VY(t,r)(n.join(""))),n=[],r.pop()}else n.push(u)}),i.push(n.join("")),r.length>0){let s=`Chalk template literal is missing ${r.length} closing bracket${r.length===1?"":"s"} (\`}\`)`;throw new Error(s)}return i.join("")}});var BS=w((ort,ZY)=>{"use strict";var zp=KY(),{stdout:ES,stderr:IS}=YY(),{stringReplaceAll:uBe,stringEncaseCRLFWithFirstIndex:gBe}=JY(),$Y=["ansi","ansi","ansi256","ansi16m"],Sg=Object.create(null),fBe=(t,e={})=>{if(e.level>3||e.level<0)throw new Error("The `level` option should be an integer from 0 to 3");let r=ES?ES.level:0;t.level=e.level===void 0?r:e.level},eq=class{constructor(e){return tq(e)}},tq=t=>{let e={};return fBe(e,t),e.template=(...r)=>hBe(e.template,...r),Object.setPrototypeOf(e,Qy.prototype),Object.setPrototypeOf(e.template,e),e.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},e.template.Instance=eq,e.template};function Qy(t){return tq(t)}for(let[t,e]of Object.entries(zp))Sg[t]={get(){let r=vy(this,yS(e.open,e.close,this._styler),this._isEmpty);return Object.defineProperty(this,t,{value:r}),r}};Sg.visible={get(){let t=vy(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:t}),t}};var rq=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(let t of rq)Sg[t]={get(){let{level:e}=this;return function(...r){let i=yS(zp.color[$Y[e]][t](...r),zp.color.close,this._styler);return vy(this,i,this._isEmpty)}}};for(let t of rq){let e="bg"+t[0].toUpperCase()+t.slice(1);Sg[e]={get(){let{level:r}=this;return function(...i){let n=yS(zp.bgColor[$Y[r]][t](...i),zp.bgColor.close,this._styler);return vy(this,n,this._isEmpty)}}}}var pBe=Object.defineProperties(()=>{},ie(N({},Sg),{level:{enumerable:!0,get(){return this._generator.level},set(t){this._generator.level=t}}})),yS=(t,e,r)=>{let i,n;return r===void 0?(i=t,n=e):(i=r.openAll+t,n=e+r.closeAll),{open:t,close:e,openAll:i,closeAll:n,parent:r}},vy=(t,e,r)=>{let i=(...n)=>dBe(i,n.length===1?""+n[0]:n.join(" "));return i.__proto__=pBe,i._generator=t,i._styler=e,i._isEmpty=r,i},dBe=(t,e)=>{if(t.level<=0||!e)return t._isEmpty?"":e;let r=t._styler;if(r===void 0)return e;let{openAll:i,closeAll:n}=r;if(e.indexOf("")!==-1)for(;r!==void 0;)e=uBe(e,r.close,r.open),r=r.parent;let s=e.indexOf(` -`);return s!==-1&&(e=gBe(e,n,i,s)),i+e+n},wS,hBe=(t,...e)=>{let[r]=e;if(!Array.isArray(r))return e.join(" ");let i=e.slice(1),n=[r.raw[0]];for(let s=1;s{"use strict";Ps.isInteger=t=>typeof t=="number"?Number.isInteger(t):typeof t=="string"&&t.trim()!==""?Number.isInteger(Number(t)):!1;Ps.find=(t,e)=>t.nodes.find(r=>r.type===e);Ps.exceedsLimit=(t,e,r=1,i)=>i===!1||!Ps.isInteger(t)||!Ps.isInteger(e)?!1:(Number(e)-Number(t))/Number(r)>=i;Ps.escapeNode=(t,e=0,r)=>{let i=t.nodes[e];!i||(r&&i.type===r||i.type==="open"||i.type==="close")&&i.escaped!==!0&&(i.value="\\"+i.value,i.escaped=!0)};Ps.encloseBrace=t=>t.type!=="brace"?!1:t.commas>>0+t.ranges>>0==0?(t.invalid=!0,!0):!1;Ps.isInvalidBrace=t=>t.type!=="brace"?!1:t.invalid===!0||t.dollar?!0:t.commas>>0+t.ranges>>0==0||t.open!==!0||t.close!==!0?(t.invalid=!0,!0):!1;Ps.isOpenOrClose=t=>t.type==="open"||t.type==="close"?!0:t.open===!0||t.close===!0;Ps.reduce=t=>t.reduce((e,r)=>(r.type==="text"&&e.push(r.value),r.type==="range"&&(r.type="text"),e),[]);Ps.flatten=(...t)=>{let e=[],r=i=>{for(let n=0;n{"use strict";var nq=Sy();iq.exports=(t,e={})=>{let r=(i,n={})=>{let s=e.escapeInvalid&&nq.isInvalidBrace(n),o=i.invalid===!0&&e.escapeInvalid===!0,a="";if(i.value)return(s||o)&&nq.isOpenOrClose(i)?"\\"+i.value:i.value;if(i.value)return i.value;if(i.nodes)for(let l of i.nodes)a+=r(l);return a};return r(t)}});var oq=w((lrt,sq)=>{"use strict";sq.exports=function(t){return typeof t=="number"?t-t==0:typeof t=="string"&&t.trim()!==""?Number.isFinite?Number.isFinite(+t):isFinite(+t):!1}});var pq=w((crt,aq)=>{"use strict";var Aq=oq(),Sc=(t,e,r)=>{if(Aq(t)===!1)throw new TypeError("toRegexRange: expected the first argument to be a number");if(e===void 0||t===e)return String(t);if(Aq(e)===!1)throw new TypeError("toRegexRange: expected the second argument to be a number.");let i=N({relaxZeros:!0},r);typeof i.strictZeros=="boolean"&&(i.relaxZeros=i.strictZeros===!1);let n=String(i.relaxZeros),s=String(i.shorthand),o=String(i.capture),a=String(i.wrap),l=t+":"+e+"="+n+s+o+a;if(Sc.cache.hasOwnProperty(l))return Sc.cache[l].result;let c=Math.min(t,e),u=Math.max(t,e);if(Math.abs(c-u)===1){let m=t+"|"+e;return i.capture?`(${m})`:i.wrap===!1?m:`(?:${m})`}let g=cq(t)||cq(e),f={min:t,max:e,a:c,b:u},h=[],p=[];if(g&&(f.isPadded=g,f.maxLen=String(f.max).length),c<0){let m=u<0?Math.abs(u):1;p=lq(m,Math.abs(c),f,i),c=f.a=0}return u>=0&&(h=lq(c,u,f,i)),f.negatives=p,f.positives=h,f.result=CBe(p,h,i),i.capture===!0?f.result=`(${f.result})`:i.wrap!==!1&&h.length+p.length>1&&(f.result=`(?:${f.result})`),Sc.cache[l]=f,f.result};function CBe(t,e,r){let i=bS(t,e,"-",!1,r)||[],n=bS(e,t,"",!1,r)||[],s=bS(t,e,"-?",!0,r)||[];return i.concat(s).concat(n).join("|")}function EBe(t,e){let r=1,i=1,n=uq(t,r),s=new Set([e]);for(;t<=n&&n<=e;)s.add(n),r+=1,n=uq(t,r);for(n=gq(e+1,i)-1;t1&&a.count.pop(),a.count.push(u.count[0]),a.string=a.pattern+fq(a.count),o=c+1;continue}r.isPadded&&(g=BBe(c,r,i)),u.string=g+u.pattern+fq(u.count),s.push(u),o=c+1,a=u}return s}function bS(t,e,r,i,n){let s=[];for(let o of t){let{string:a}=o;!i&&!hq(e,"string",a)&&s.push(r+a),i&&hq(e,"string",a)&&s.push(r+a)}return s}function IBe(t,e){let r=[];for(let i=0;ie?1:e>t?-1:0}function hq(t,e,r){return t.some(i=>i[e]===r)}function uq(t,e){return Number(String(t).slice(0,-e)+"9".repeat(e))}function gq(t,e){return t-t%Math.pow(10,e)}function fq(t){let[e=0,r=""]=t;return r||e>1?`{${e+(r?","+r:"")}}`:""}function yBe(t,e,r){return`[${t}${e-t==1?"":"-"}${e}]`}function cq(t){return/^-?(0+)\d/.test(t)}function BBe(t,e,r){if(!e.isPadded)return t;let i=Math.abs(e.maxLen-String(t).length),n=r.relaxZeros!==!1;switch(i){case 0:return"";case 1:return n?"0?":"0";case 2:return n?"0{0,2}":"00";default:return n?`0{0,${i}}`:`0{${i}}`}}Sc.cache={};Sc.clearCache=()=>Sc.cache={};aq.exports=Sc});var SS=w((urt,dq)=>{"use strict";var bBe=require("util"),Cq=pq(),mq=t=>t!==null&&typeof t=="object"&&!Array.isArray(t),QBe=t=>e=>t===!0?Number(e):String(e),QS=t=>typeof t=="number"||typeof t=="string"&&t!=="",Vp=t=>Number.isInteger(+t),vS=t=>{let e=`${t}`,r=-1;if(e[0]==="-"&&(e=e.slice(1)),e==="0")return!1;for(;e[++r]==="0";);return r>0},vBe=(t,e,r)=>typeof t=="string"||typeof e=="string"?!0:r.stringify===!0,SBe=(t,e,r)=>{if(e>0){let i=t[0]==="-"?"-":"";i&&(t=t.slice(1)),t=i+t.padStart(i?e-1:e,"0")}return r===!1?String(t):t},Eq=(t,e)=>{let r=t[0]==="-"?"-":"";for(r&&(t=t.slice(1),e--);t.length{t.negatives.sort((o,a)=>oa?1:0),t.positives.sort((o,a)=>oa?1:0);let r=e.capture?"":"?:",i="",n="",s;return t.positives.length&&(i=t.positives.join("|")),t.negatives.length&&(n=`-(${r}${t.negatives.join("|")})`),i&&n?s=`${i}|${n}`:s=i||n,e.wrap?`(${r}${s})`:s},Iq=(t,e,r,i)=>{if(r)return Cq(t,e,N({wrap:!1},i));let n=String.fromCharCode(t);if(t===e)return n;let s=String.fromCharCode(e);return`[${n}-${s}]`},yq=(t,e,r)=>{if(Array.isArray(t)){let i=r.wrap===!0,n=r.capture?"":"?:";return i?`(${n}${t.join("|")})`:t.join("|")}return Cq(t,e,r)},wq=(...t)=>new RangeError("Invalid range arguments: "+bBe.inspect(...t)),Bq=(t,e,r)=>{if(r.strictRanges===!0)throw wq([t,e]);return[]},xBe=(t,e)=>{if(e.strictRanges===!0)throw new TypeError(`Expected step "${t}" to be a number`);return[]},PBe=(t,e,r=1,i={})=>{let n=Number(t),s=Number(e);if(!Number.isInteger(n)||!Number.isInteger(s)){if(i.strictRanges===!0)throw wq([t,e]);return[]}n===0&&(n=0),s===0&&(s=0);let o=n>s,a=String(t),l=String(e),c=String(r);r=Math.max(Math.abs(r),1);let u=vS(a)||vS(l)||vS(c),g=u?Math.max(a.length,l.length,c.length):0,f=u===!1&&vBe(t,e,i)===!1,h=i.transform||QBe(f);if(i.toRegex&&r===1)return Iq(Eq(t,g),Eq(e,g),!0,i);let p={negatives:[],positives:[]},m=S=>p[S<0?"negatives":"positives"].push(Math.abs(S)),y=[],b=0;for(;o?n>=s:n<=s;)i.toRegex===!0&&r>1?m(n):y.push(SBe(h(n,b),g,f)),n=o?n-r:n+r,b++;return i.toRegex===!0?r>1?kBe(p,i):yq(y,null,N({wrap:!1},i)):y},DBe=(t,e,r=1,i={})=>{if(!Vp(t)&&t.length>1||!Vp(e)&&e.length>1)return Bq(t,e,i);let n=i.transform||(f=>String.fromCharCode(f)),s=`${t}`.charCodeAt(0),o=`${e}`.charCodeAt(0),a=s>o,l=Math.min(s,o),c=Math.max(s,o);if(i.toRegex&&r===1)return Iq(l,c,!1,i);let u=[],g=0;for(;a?s>=o:s<=o;)u.push(n(s,g)),s=a?s-r:s+r,g++;return i.toRegex===!0?yq(u,null,{wrap:!1,options:i}):u},xy=(t,e,r,i={})=>{if(e==null&&QS(t))return[t];if(!QS(t)||!QS(e))return Bq(t,e,i);if(typeof r=="function")return xy(t,e,1,{transform:r});if(mq(r))return xy(t,e,0,r);let n=N({},i);return n.capture===!0&&(n.wrap=!0),r=r||n.step||1,Vp(r)?Vp(t)&&Vp(e)?PBe(t,e,r,n):DBe(t,e,Math.max(Math.abs(r),1),n):r!=null&&!mq(r)?xBe(r,n):xy(t,e,1,r)};dq.exports=xy});var vq=w((grt,bq)=>{"use strict";var RBe=SS(),Qq=Sy(),FBe=(t,e={})=>{let r=(i,n={})=>{let s=Qq.isInvalidBrace(n),o=i.invalid===!0&&e.escapeInvalid===!0,a=s===!0||o===!0,l=e.escapeInvalid===!0?"\\":"",c="";if(i.isOpen===!0||i.isClose===!0)return l+i.value;if(i.type==="open")return a?l+i.value:"(";if(i.type==="close")return a?l+i.value:")";if(i.type==="comma")return i.prev.type==="comma"?"":a?i.value:"|";if(i.value)return i.value;if(i.nodes&&i.ranges>0){let u=Qq.reduce(i.nodes),g=RBe(...u,ie(N({},e),{wrap:!1,toRegex:!0}));if(g.length!==0)return u.length>1&&g.length>1?`(${g})`:g}if(i.nodes)for(let u of i.nodes)c+=r(u,i);return c};return r(t)};bq.exports=FBe});var xq=w((frt,Sq)=>{"use strict";var NBe=SS(),kq=ky(),kg=Sy(),kc=(t="",e="",r=!1)=>{let i=[];if(t=[].concat(t),e=[].concat(e),!e.length)return t;if(!t.length)return r?kg.flatten(e).map(n=>`{${n}}`):e;for(let n of t)if(Array.isArray(n))for(let s of n)i.push(kc(s,e,r));else for(let s of e)r===!0&&typeof s=="string"&&(s=`{${s}}`),i.push(Array.isArray(s)?kc(n,s,r):n+s);return kg.flatten(i)},LBe=(t,e={})=>{let r=e.rangeLimit===void 0?1e3:e.rangeLimit,i=(n,s={})=>{n.queue=[];let o=s,a=s.queue;for(;o.type!=="brace"&&o.type!=="root"&&o.parent;)o=o.parent,a=o.queue;if(n.invalid||n.dollar){a.push(kc(a.pop(),kq(n,e)));return}if(n.type==="brace"&&n.invalid!==!0&&n.nodes.length===2){a.push(kc(a.pop(),["{}"]));return}if(n.nodes&&n.ranges>0){let g=kg.reduce(n.nodes);if(kg.exceedsLimit(...g,e.step,r))throw new RangeError("expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.");let f=NBe(...g,e);f.length===0&&(f=kq(n,e)),a.push(kc(a.pop(),f)),n.nodes=[];return}let l=kg.encloseBrace(n),c=n.queue,u=n;for(;u.type!=="brace"&&u.type!=="root"&&u.parent;)u=u.parent,c=u.queue;for(let g=0;g{"use strict";Pq.exports={MAX_LENGTH:1024*64,CHAR_0:"0",CHAR_9:"9",CHAR_UPPERCASE_A:"A",CHAR_LOWERCASE_A:"a",CHAR_UPPERCASE_Z:"Z",CHAR_LOWERCASE_Z:"z",CHAR_LEFT_PARENTHESES:"(",CHAR_RIGHT_PARENTHESES:")",CHAR_ASTERISK:"*",CHAR_AMPERSAND:"&",CHAR_AT:"@",CHAR_BACKSLASH:"\\",CHAR_BACKTICK:"`",CHAR_CARRIAGE_RETURN:"\r",CHAR_CIRCUMFLEX_ACCENT:"^",CHAR_COLON:":",CHAR_COMMA:",",CHAR_DOLLAR:"$",CHAR_DOT:".",CHAR_DOUBLE_QUOTE:'"',CHAR_EQUAL:"=",CHAR_EXCLAMATION_MARK:"!",CHAR_FORM_FEED:"\f",CHAR_FORWARD_SLASH:"/",CHAR_HASH:"#",CHAR_HYPHEN_MINUS:"-",CHAR_LEFT_ANGLE_BRACKET:"<",CHAR_LEFT_CURLY_BRACE:"{",CHAR_LEFT_SQUARE_BRACKET:"[",CHAR_LINE_FEED:` -`,CHAR_NO_BREAK_SPACE:"\xA0",CHAR_PERCENT:"%",CHAR_PLUS:"+",CHAR_QUESTION_MARK:"?",CHAR_RIGHT_ANGLE_BRACKET:">",CHAR_RIGHT_CURLY_BRACE:"}",CHAR_RIGHT_SQUARE_BRACKET:"]",CHAR_SEMICOLON:";",CHAR_SINGLE_QUOTE:"'",CHAR_SPACE:" ",CHAR_TAB:" ",CHAR_UNDERSCORE:"_",CHAR_VERTICAL_LINE:"|",CHAR_ZERO_WIDTH_NOBREAK_SPACE:"\uFEFF"}});var Tq=w((prt,Rq)=>{"use strict";var TBe=ky(),{MAX_LENGTH:Fq,CHAR_BACKSLASH:kS,CHAR_BACKTICK:OBe,CHAR_COMMA:MBe,CHAR_DOT:KBe,CHAR_LEFT_PARENTHESES:UBe,CHAR_RIGHT_PARENTHESES:HBe,CHAR_LEFT_CURLY_BRACE:GBe,CHAR_RIGHT_CURLY_BRACE:jBe,CHAR_LEFT_SQUARE_BRACKET:Nq,CHAR_RIGHT_SQUARE_BRACKET:Lq,CHAR_DOUBLE_QUOTE:YBe,CHAR_SINGLE_QUOTE:qBe,CHAR_NO_BREAK_SPACE:JBe,CHAR_ZERO_WIDTH_NOBREAK_SPACE:WBe}=Dq(),zBe=(t,e={})=>{if(typeof t!="string")throw new TypeError("Expected a string");let r=e||{},i=typeof r.maxLength=="number"?Math.min(Fq,r.maxLength):Fq;if(t.length>i)throw new SyntaxError(`Input length (${t.length}), exceeds max characters (${i})`);let n={type:"root",input:t,nodes:[]},s=[n],o=n,a=n,l=0,c=t.length,u=0,g=0,f,h={},p=()=>t[u++],m=y=>{if(y.type==="text"&&a.type==="dot"&&(a.type="text"),a&&a.type==="text"&&y.type==="text"){a.value+=y.value;return}return o.nodes.push(y),y.parent=o,y.prev=a,a=y,y};for(m({type:"bos"});u0){if(o.ranges>0){o.ranges=0;let y=o.nodes.shift();o.nodes=[y,{type:"text",value:TBe(o)}]}m({type:"comma",value:f}),o.commas++;continue}if(f===KBe&&g>0&&o.commas===0){let y=o.nodes;if(g===0||y.length===0){m({type:"text",value:f});continue}if(a.type==="dot"){if(o.range=[],a.value+=f,a.type="range",o.nodes.length!==3&&o.nodes.length!==5){o.invalid=!0,o.ranges=0,a.type="text";continue}o.ranges++,o.args=[];continue}if(a.type==="range"){y.pop();let b=y[y.length-1];b.value+=a.value+f,a=b,o.ranges--;continue}m({type:"dot",value:f});continue}m({type:"text",value:f})}do if(o=s.pop(),o.type!=="root"){o.nodes.forEach(S=>{S.nodes||(S.type==="open"&&(S.isOpen=!0),S.type==="close"&&(S.isClose=!0),S.nodes||(S.type="text"),S.invalid=!0)});let y=s[s.length-1],b=y.nodes.indexOf(o);y.nodes.splice(b,1,...o.nodes)}while(s.length>0);return m({type:"eos"}),n};Rq.exports=zBe});var Kq=w((drt,Oq)=>{"use strict";var Mq=ky(),_Be=vq(),VBe=xq(),XBe=Tq(),es=(t,e={})=>{let r=[];if(Array.isArray(t))for(let i of t){let n=es.create(i,e);Array.isArray(n)?r.push(...n):r.push(n)}else r=[].concat(es.create(t,e));return e&&e.expand===!0&&e.nodupes===!0&&(r=[...new Set(r)]),r};es.parse=(t,e={})=>XBe(t,e);es.stringify=(t,e={})=>typeof t=="string"?Mq(es.parse(t,e),e):Mq(t,e);es.compile=(t,e={})=>(typeof t=="string"&&(t=es.parse(t,e)),_Be(t,e));es.expand=(t,e={})=>{typeof t=="string"&&(t=es.parse(t,e));let r=VBe(t,e);return e.noempty===!0&&(r=r.filter(Boolean)),e.nodupes===!0&&(r=[...new Set(r)]),r};es.create=(t,e={})=>t===""||t.length<3?[t]:e.expand!==!0?es.compile(t,e):es.expand(t,e);Oq.exports=es});var Xp=w((Crt,Uq)=>{"use strict";var ZBe=require("path"),jo="\\\\/",Hq=`[^${jo}]`,qa="\\.",$Be="\\+",e0e="\\?",Py="\\/",t0e="(?=.)",Gq="[^/]",xS=`(?:${Py}|$)`,jq=`(?:^|${Py})`,PS=`${qa}{1,2}${xS}`,r0e=`(?!${qa})`,i0e=`(?!${jq}${PS})`,n0e=`(?!${qa}{0,1}${xS})`,s0e=`(?!${PS})`,o0e=`[^.${Py}]`,a0e=`${Gq}*?`,Yq={DOT_LITERAL:qa,PLUS_LITERAL:$Be,QMARK_LITERAL:e0e,SLASH_LITERAL:Py,ONE_CHAR:t0e,QMARK:Gq,END_ANCHOR:xS,DOTS_SLASH:PS,NO_DOT:r0e,NO_DOTS:i0e,NO_DOT_SLASH:n0e,NO_DOTS_SLASH:s0e,QMARK_NO_DOT:o0e,STAR:a0e,START_ANCHOR:jq},A0e=ie(N({},Yq),{SLASH_LITERAL:`[${jo}]`,QMARK:Hq,STAR:`${Hq}*?`,DOTS_SLASH:`${qa}{1,2}(?:[${jo}]|$)`,NO_DOT:`(?!${qa})`,NO_DOTS:`(?!(?:^|[${jo}])${qa}{1,2}(?:[${jo}]|$))`,NO_DOT_SLASH:`(?!${qa}{0,1}(?:[${jo}]|$))`,NO_DOTS_SLASH:`(?!${qa}{1,2}(?:[${jo}]|$))`,QMARK_NO_DOT:`[^.${jo}]`,START_ANCHOR:`(?:^|[${jo}])`,END_ANCHOR:`(?:[${jo}]|$)`}),l0e={alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"};Uq.exports={MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE:l0e,REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,SEP:ZBe.sep,extglobChars(t){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${t.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(t){return t===!0?A0e:Yq}}});var Zp=w(kn=>{"use strict";var c0e=require("path"),u0e=process.platform==="win32",{REGEX_BACKSLASH:g0e,REGEX_REMOVE_BACKSLASH:f0e,REGEX_SPECIAL_CHARS:h0e,REGEX_SPECIAL_CHARS_GLOBAL:p0e}=Xp();kn.isObject=t=>t!==null&&typeof t=="object"&&!Array.isArray(t);kn.hasRegexChars=t=>h0e.test(t);kn.isRegexChar=t=>t.length===1&&kn.hasRegexChars(t);kn.escapeRegex=t=>t.replace(p0e,"\\$1");kn.toPosixSlashes=t=>t.replace(g0e,"/");kn.removeBackslashes=t=>t.replace(f0e,e=>e==="\\"?"":e);kn.supportsLookbehinds=()=>{let t=process.version.slice(1).split(".").map(Number);return t.length===3&&t[0]>=9||t[0]===8&&t[1]>=10};kn.isWindows=t=>t&&typeof t.windows=="boolean"?t.windows:u0e===!0||c0e.sep==="\\";kn.escapeLast=(t,e,r)=>{let i=t.lastIndexOf(e,r);return i===-1?t:t[i-1]==="\\"?kn.escapeLast(t,e,i-1):`${t.slice(0,i)}\\${t.slice(i)}`};kn.removePrefix=(t,e={})=>{let r=t;return r.startsWith("./")&&(r=r.slice(2),e.prefix="./"),r};kn.wrapOutput=(t,e={},r={})=>{let i=r.contains?"":"^",n=r.contains?"":"$",s=`${i}(?:${t})${n}`;return e.negated===!0&&(s=`(?:^(?!${s}).*$)`),s}});var Zq=w((Ert,qq)=>{"use strict";var Jq=Zp(),{CHAR_ASTERISK:DS,CHAR_AT:d0e,CHAR_BACKWARD_SLASH:$p,CHAR_COMMA:C0e,CHAR_DOT:RS,CHAR_EXCLAMATION_MARK:FS,CHAR_FORWARD_SLASH:Wq,CHAR_LEFT_CURLY_BRACE:NS,CHAR_LEFT_PARENTHESES:LS,CHAR_LEFT_SQUARE_BRACKET:m0e,CHAR_PLUS:E0e,CHAR_QUESTION_MARK:zq,CHAR_RIGHT_CURLY_BRACE:I0e,CHAR_RIGHT_PARENTHESES:_q,CHAR_RIGHT_SQUARE_BRACKET:y0e}=Xp(),Vq=t=>t===Wq||t===$p,Xq=t=>{t.isPrefix!==!0&&(t.depth=t.isGlobstar?Infinity:1)},w0e=(t,e)=>{let r=e||{},i=t.length-1,n=r.parts===!0||r.scanToEnd===!0,s=[],o=[],a=[],l=t,c=-1,u=0,g=0,f=!1,h=!1,p=!1,m=!1,y=!1,b=!1,S=!1,k=!1,T=!1,Y=!1,j=0,Z,J,re={value:"",depth:0,isGlob:!1},ee=()=>c>=i,A=()=>l.charCodeAt(c+1),oe=()=>(Z=J,l.charCodeAt(++c));for(;c0&&(X=l.slice(0,u),l=l.slice(u),g-=u),le&&p===!0&&g>0?(le=l.slice(0,g),O=l.slice(g)):p===!0?(le="",O=l):le=l,le&&le!==""&&le!=="/"&&le!==l&&Vq(le.charCodeAt(le.length-1))&&(le=le.slice(0,-1)),r.unescape===!0&&(O&&(O=Jq.removeBackslashes(O)),le&&S===!0&&(le=Jq.removeBackslashes(le)));let L={prefix:X,input:t,start:u,base:le,glob:O,isBrace:f,isBracket:h,isGlob:p,isExtglob:m,isGlobstar:y,negated:k,negatedExtglob:T};if(r.tokens===!0&&(L.maxDepth=0,Vq(J)||o.push(re),L.tokens=o),r.parts===!0||r.tokens===!0){let pe;for(let Ce=0;Ce{"use strict";var Dy=Xp(),ts=Zp(),{MAX_LENGTH:Ry,POSIX_REGEX_SOURCE:B0e,REGEX_NON_SPECIAL_CHARS:b0e,REGEX_SPECIAL_CHARS_BACKREF:Q0e,REPLACEMENTS:eJ}=Dy,v0e=(t,e)=>{if(typeof e.expandRange=="function")return e.expandRange(...t,e);t.sort();let r=`[${t.join("-")}]`;try{new RegExp(r)}catch(i){return t.map(n=>ts.escapeRegex(n)).join("..")}return r},xg=(t,e)=>`Missing ${t}: "${e}" - use "\\\\${e}" to match literal characters`,tJ=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");t=eJ[t]||t;let r=N({},e),i=typeof r.maxLength=="number"?Math.min(Ry,r.maxLength):Ry,n=t.length;if(n>i)throw new SyntaxError(`Input length: ${n}, exceeds maximum allowed length: ${i}`);let s={type:"bos",value:"",output:r.prepend||""},o=[s],a=r.capture?"":"?:",l=ts.isWindows(e),c=Dy.globChars(l),u=Dy.extglobChars(c),{DOT_LITERAL:g,PLUS_LITERAL:f,SLASH_LITERAL:h,ONE_CHAR:p,DOTS_SLASH:m,NO_DOT:y,NO_DOT_SLASH:b,NO_DOTS_SLASH:S,QMARK:k,QMARK_NO_DOT:T,STAR:Y,START_ANCHOR:j}=c,Z=V=>`(${a}(?:(?!${j}${V.dot?m:g}).)*?)`,J=r.dot?"":y,re=r.dot?k:T,ee=r.bash===!0?Z(r):Y;r.capture&&(ee=`(${ee})`),typeof r.noext=="boolean"&&(r.noextglob=r.noext);let A={input:t,index:-1,start:0,dot:r.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens:o};t=ts.removePrefix(t,A),n=t.length;let oe=[],le=[],X=[],O=s,L,pe=()=>A.index===n-1,Ce=A.peek=(V=1)=>t[A.index+V],Oe=A.advance=()=>t[++A.index]||"",te=()=>t.slice(A.index+1),se=(V="",Qe=0)=>{A.consumed+=V,A.index+=Qe},be=V=>{A.output+=V.output!=null?V.output:V.value,se(V.value)},he=()=>{let V=1;for(;Ce()==="!"&&(Ce(2)!=="("||Ce(3)==="?");)Oe(),A.start++,V++;return V%2==0?!1:(A.negated=!0,A.start++,!0)},Fe=V=>{A[V]++,X.push(V)},Ue=V=>{A[V]--,X.pop()},xe=V=>{if(O.type==="globstar"){let Qe=A.braces>0&&(V.type==="comma"||V.type==="brace"),ce=V.extglob===!0||oe.length&&(V.type==="pipe"||V.type==="paren");V.type!=="slash"&&V.type!=="paren"&&!Qe&&!ce&&(A.output=A.output.slice(0,-O.output.length),O.type="star",O.value="*",O.output=ee,A.output+=O.output)}if(oe.length&&V.type!=="paren"&&(oe[oe.length-1].inner+=V.value),(V.value||V.output)&&be(V),O&&O.type==="text"&&V.type==="text"){O.value+=V.value,O.output=(O.output||"")+V.value;return}V.prev=O,o.push(V),O=V},Se=(V,Qe)=>{let ce=ie(N({},u[Qe]),{conditions:1,inner:""});ce.prev=O,ce.parens=A.parens,ce.output=A.output;let fe=(r.capture?"(":"")+ce.open;Fe("parens"),xe({type:V,value:Qe,output:A.output?"":p}),xe({type:"paren",extglob:!0,value:Oe(),output:fe}),oe.push(ce)},de=V=>{let Qe=V.close+(r.capture?")":""),ce;if(V.type==="negate"){let fe=ee;V.inner&&V.inner.length>1&&V.inner.includes("/")&&(fe=Z(r)),(fe!==ee||pe()||/^\)+$/.test(te()))&&(Qe=V.close=`)$))${fe}`),V.inner.includes("*")&&(ce=te())&&/^\.[^\\/.]+$/.test(ce)&&(Qe=V.close=`)${ce})${fe})`),V.prev.type==="bos"&&(A.negatedExtglob=!0)}xe({type:"paren",extglob:!0,value:L,output:Qe}),Ue("parens")};if(r.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(t)){let V=!1,Qe=t.replace(Q0e,(ce,fe,gt,Ht,Mt,mi)=>Ht==="\\"?(V=!0,ce):Ht==="?"?fe?fe+Ht+(Mt?k.repeat(Mt.length):""):mi===0?re+(Mt?k.repeat(Mt.length):""):k.repeat(gt.length):Ht==="."?g.repeat(gt.length):Ht==="*"?fe?fe+Ht+(Mt?ee:""):ee:fe?ce:`\\${ce}`);return V===!0&&(r.unescape===!0?Qe=Qe.replace(/\\/g,""):Qe=Qe.replace(/\\+/g,ce=>ce.length%2==0?"\\\\":ce?"\\":"")),Qe===t&&r.contains===!0?(A.output=t,A):(A.output=ts.wrapOutput(Qe,A,e),A)}for(;!pe();){if(L=Oe(),L==="\0")continue;if(L==="\\"){let ce=Ce();if(ce==="/"&&r.bash!==!0||ce==="."||ce===";")continue;if(!ce){L+="\\",xe({type:"text",value:L});continue}let fe=/^\\+/.exec(te()),gt=0;if(fe&&fe[0].length>2&&(gt=fe[0].length,A.index+=gt,gt%2!=0&&(L+="\\")),r.unescape===!0?L=Oe():L+=Oe(),A.brackets===0){xe({type:"text",value:L});continue}}if(A.brackets>0&&(L!=="]"||O.value==="["||O.value==="[^")){if(r.posix!==!1&&L===":"){let ce=O.value.slice(1);if(ce.includes("[")&&(O.posix=!0,ce.includes(":"))){let fe=O.value.lastIndexOf("["),gt=O.value.slice(0,fe),Ht=O.value.slice(fe+2),Mt=B0e[Ht];if(Mt){O.value=gt+Mt,A.backtrack=!0,Oe(),!s.output&&o.indexOf(O)===1&&(s.output=p);continue}}}(L==="["&&Ce()!==":"||L==="-"&&Ce()==="]")&&(L=`\\${L}`),L==="]"&&(O.value==="["||O.value==="[^")&&(L=`\\${L}`),r.posix===!0&&L==="!"&&O.value==="["&&(L="^"),O.value+=L,be({value:L});continue}if(A.quotes===1&&L!=='"'){L=ts.escapeRegex(L),O.value+=L,be({value:L});continue}if(L==='"'){A.quotes=A.quotes===1?0:1,r.keepQuotes===!0&&xe({type:"text",value:L});continue}if(L==="("){Fe("parens"),xe({type:"paren",value:L});continue}if(L===")"){if(A.parens===0&&r.strictBrackets===!0)throw new SyntaxError(xg("opening","("));let ce=oe[oe.length-1];if(ce&&A.parens===ce.parens+1){de(oe.pop());continue}xe({type:"paren",value:L,output:A.parens?")":"\\)"}),Ue("parens");continue}if(L==="["){if(r.nobracket===!0||!te().includes("]")){if(r.nobracket!==!0&&r.strictBrackets===!0)throw new SyntaxError(xg("closing","]"));L=`\\${L}`}else Fe("brackets");xe({type:"bracket",value:L});continue}if(L==="]"){if(r.nobracket===!0||O&&O.type==="bracket"&&O.value.length===1){xe({type:"text",value:L,output:`\\${L}`});continue}if(A.brackets===0){if(r.strictBrackets===!0)throw new SyntaxError(xg("opening","["));xe({type:"text",value:L,output:`\\${L}`});continue}Ue("brackets");let ce=O.value.slice(1);if(O.posix!==!0&&ce[0]==="^"&&!ce.includes("/")&&(L=`/${L}`),O.value+=L,be({value:L}),r.literalBrackets===!1||ts.hasRegexChars(ce))continue;let fe=ts.escapeRegex(O.value);if(A.output=A.output.slice(0,-O.value.length),r.literalBrackets===!0){A.output+=fe,O.value=fe;continue}O.value=`(${a}${fe}|${O.value})`,A.output+=O.value;continue}if(L==="{"&&r.nobrace!==!0){Fe("braces");let ce={type:"brace",value:L,output:"(",outputIndex:A.output.length,tokensIndex:A.tokens.length};le.push(ce),xe(ce);continue}if(L==="}"){let ce=le[le.length-1];if(r.nobrace===!0||!ce){xe({type:"text",value:L,output:L});continue}let fe=")";if(ce.dots===!0){let gt=o.slice(),Ht=[];for(let Mt=gt.length-1;Mt>=0&&(o.pop(),gt[Mt].type!=="brace");Mt--)gt[Mt].type!=="dots"&&Ht.unshift(gt[Mt].value);fe=v0e(Ht,r),A.backtrack=!0}if(ce.comma!==!0&&ce.dots!==!0){let gt=A.output.slice(0,ce.outputIndex),Ht=A.tokens.slice(ce.tokensIndex);ce.value=ce.output="\\{",L=fe="\\}",A.output=gt;for(let Mt of Ht)A.output+=Mt.output||Mt.value}xe({type:"brace",value:L,output:fe}),Ue("braces"),le.pop();continue}if(L==="|"){oe.length>0&&oe[oe.length-1].conditions++,xe({type:"text",value:L});continue}if(L===","){let ce=L,fe=le[le.length-1];fe&&X[X.length-1]==="braces"&&(fe.comma=!0,ce="|"),xe({type:"comma",value:L,output:ce});continue}if(L==="/"){if(O.type==="dot"&&A.index===A.start+1){A.start=A.index+1,A.consumed="",A.output="",o.pop(),O=s;continue}xe({type:"slash",value:L,output:h});continue}if(L==="."){if(A.braces>0&&O.type==="dot"){O.value==="."&&(O.output=g);let ce=le[le.length-1];O.type="dots",O.output+=L,O.value+=L,ce.dots=!0;continue}if(A.braces+A.parens===0&&O.type!=="bos"&&O.type!=="slash"){xe({type:"text",value:L,output:g});continue}xe({type:"dot",value:L,output:g});continue}if(L==="?"){if(!(O&&O.value==="(")&&r.noextglob!==!0&&Ce()==="("&&Ce(2)!=="?"){Se("qmark",L);continue}if(O&&O.type==="paren"){let fe=Ce(),gt=L;if(fe==="<"&&!ts.supportsLookbehinds())throw new Error("Node.js v10 or higher is required for regex lookbehinds");(O.value==="("&&!/[!=<:]/.test(fe)||fe==="<"&&!/<([!=]|\w+>)/.test(te()))&&(gt=`\\${L}`),xe({type:"text",value:L,output:gt});continue}if(r.dot!==!0&&(O.type==="slash"||O.type==="bos")){xe({type:"qmark",value:L,output:T});continue}xe({type:"qmark",value:L,output:k});continue}if(L==="!"){if(r.noextglob!==!0&&Ce()==="("&&(Ce(2)!=="?"||!/[!=<:]/.test(Ce(3)))){Se("negate",L);continue}if(r.nonegate!==!0&&A.index===0){he();continue}}if(L==="+"){if(r.noextglob!==!0&&Ce()==="("&&Ce(2)!=="?"){Se("plus",L);continue}if(O&&O.value==="("||r.regex===!1){xe({type:"plus",value:L,output:f});continue}if(O&&(O.type==="bracket"||O.type==="paren"||O.type==="brace")||A.parens>0){xe({type:"plus",value:L});continue}xe({type:"plus",value:f});continue}if(L==="@"){if(r.noextglob!==!0&&Ce()==="("&&Ce(2)!=="?"){xe({type:"at",extglob:!0,value:L,output:""});continue}xe({type:"text",value:L});continue}if(L!=="*"){(L==="$"||L==="^")&&(L=`\\${L}`);let ce=b0e.exec(te());ce&&(L+=ce[0],A.index+=ce[0].length),xe({type:"text",value:L});continue}if(O&&(O.type==="globstar"||O.star===!0)){O.type="star",O.star=!0,O.value+=L,O.output=ee,A.backtrack=!0,A.globstar=!0,se(L);continue}let V=te();if(r.noextglob!==!0&&/^\([^?]/.test(V)){Se("star",L);continue}if(O.type==="star"){if(r.noglobstar===!0){se(L);continue}let ce=O.prev,fe=ce.prev,gt=ce.type==="slash"||ce.type==="bos",Ht=fe&&(fe.type==="star"||fe.type==="globstar");if(r.bash===!0&&(!gt||V[0]&&V[0]!=="/")){xe({type:"star",value:L,output:""});continue}let Mt=A.braces>0&&(ce.type==="comma"||ce.type==="brace"),mi=oe.length&&(ce.type==="pipe"||ce.type==="paren");if(!gt&&ce.type!=="paren"&&!Mt&&!mi){xe({type:"star",value:L,output:""});continue}for(;V.slice(0,3)==="/**";){let Gt=t[A.index+4];if(Gt&&Gt!=="/")break;V=V.slice(3),se("/**",3)}if(ce.type==="bos"&&pe()){O.type="globstar",O.value+=L,O.output=Z(r),A.output=O.output,A.globstar=!0,se(L);continue}if(ce.type==="slash"&&ce.prev.type!=="bos"&&!Ht&&pe()){A.output=A.output.slice(0,-(ce.output+O.output).length),ce.output=`(?:${ce.output}`,O.type="globstar",O.output=Z(r)+(r.strictSlashes?")":"|$)"),O.value+=L,A.globstar=!0,A.output+=ce.output+O.output,se(L);continue}if(ce.type==="slash"&&ce.prev.type!=="bos"&&V[0]==="/"){let Gt=V[1]!==void 0?"|$":"";A.output=A.output.slice(0,-(ce.output+O.output).length),ce.output=`(?:${ce.output}`,O.type="globstar",O.output=`${Z(r)}${h}|${h}${Gt})`,O.value+=L,A.output+=ce.output+O.output,A.globstar=!0,se(L+Oe()),xe({type:"slash",value:"/",output:""});continue}if(ce.type==="bos"&&V[0]==="/"){O.type="globstar",O.value+=L,O.output=`(?:^|${h}|${Z(r)}${h})`,A.output=O.output,A.globstar=!0,se(L+Oe()),xe({type:"slash",value:"/",output:""});continue}A.output=A.output.slice(0,-O.output.length),O.type="globstar",O.output=Z(r),O.value+=L,A.output+=O.output,A.globstar=!0,se(L);continue}let Qe={type:"star",value:L,output:ee};if(r.bash===!0){Qe.output=".*?",(O.type==="bos"||O.type==="slash")&&(Qe.output=J+Qe.output),xe(Qe);continue}if(O&&(O.type==="bracket"||O.type==="paren")&&r.regex===!0){Qe.output=L,xe(Qe);continue}(A.index===A.start||O.type==="slash"||O.type==="dot")&&(O.type==="dot"?(A.output+=b,O.output+=b):r.dot===!0?(A.output+=S,O.output+=S):(A.output+=J,O.output+=J),Ce()!=="*"&&(A.output+=p,O.output+=p)),xe(Qe)}for(;A.brackets>0;){if(r.strictBrackets===!0)throw new SyntaxError(xg("closing","]"));A.output=ts.escapeLast(A.output,"["),Ue("brackets")}for(;A.parens>0;){if(r.strictBrackets===!0)throw new SyntaxError(xg("closing",")"));A.output=ts.escapeLast(A.output,"("),Ue("parens")}for(;A.braces>0;){if(r.strictBrackets===!0)throw new SyntaxError(xg("closing","}"));A.output=ts.escapeLast(A.output,"{"),Ue("braces")}if(r.strictSlashes!==!0&&(O.type==="star"||O.type==="bracket")&&xe({type:"maybe_slash",value:"",output:`${h}?`}),A.backtrack===!0){A.output="";for(let V of A.tokens)A.output+=V.output!=null?V.output:V.value,V.suffix&&(A.output+=V.suffix)}return A};tJ.fastpaths=(t,e)=>{let r=N({},e),i=typeof r.maxLength=="number"?Math.min(Ry,r.maxLength):Ry,n=t.length;if(n>i)throw new SyntaxError(`Input length: ${n}, exceeds maximum allowed length: ${i}`);t=eJ[t]||t;let s=ts.isWindows(e),{DOT_LITERAL:o,SLASH_LITERAL:a,ONE_CHAR:l,DOTS_SLASH:c,NO_DOT:u,NO_DOTS:g,NO_DOTS_SLASH:f,STAR:h,START_ANCHOR:p}=Dy.globChars(s),m=r.dot?g:u,y=r.dot?f:u,b=r.capture?"":"?:",S={negated:!1,prefix:""},k=r.bash===!0?".*?":h;r.capture&&(k=`(${k})`);let T=J=>J.noglobstar===!0?k:`(${b}(?:(?!${p}${J.dot?c:o}).)*?)`,Y=J=>{switch(J){case"*":return`${m}${l}${k}`;case".*":return`${o}${l}${k}`;case"*.*":return`${m}${k}${o}${l}${k}`;case"*/*":return`${m}${k}${a}${l}${y}${k}`;case"**":return m+T(r);case"**/*":return`(?:${m}${T(r)}${a})?${y}${l}${k}`;case"**/*.*":return`(?:${m}${T(r)}${a})?${y}${k}${o}${l}${k}`;case"**/.*":return`(?:${m}${T(r)}${a})?${o}${l}${k}`;default:{let re=/^(.*?)\.(\w+)$/.exec(J);if(!re)return;let ee=Y(re[1]);return ee?ee+o+re[2]:void 0}}},j=ts.removePrefix(t,S),Z=Y(j);return Z&&r.strictSlashes!==!0&&(Z+=`${a}?`),Z};$q.exports=tJ});var nJ=w((yrt,iJ)=>{"use strict";var S0e=require("path"),k0e=Zq(),TS=rJ(),OS=Zp(),x0e=Xp(),P0e=t=>t&&typeof t=="object"&&!Array.isArray(t),_r=(t,e,r=!1)=>{if(Array.isArray(t)){let u=t.map(f=>_r(f,e,r));return f=>{for(let h of u){let p=h(f);if(p)return p}return!1}}let i=P0e(t)&&t.tokens&&t.input;if(t===""||typeof t!="string"&&!i)throw new TypeError("Expected pattern to be a non-empty string");let n=e||{},s=OS.isWindows(e),o=i?_r.compileRe(t,e):_r.makeRe(t,e,!1,!0),a=o.state;delete o.state;let l=()=>!1;if(n.ignore){let u=ie(N({},e),{ignore:null,onMatch:null,onResult:null});l=_r(n.ignore,u,r)}let c=(u,g=!1)=>{let{isMatch:f,match:h,output:p}=_r.test(u,o,e,{glob:t,posix:s}),m={glob:t,state:a,regex:o,posix:s,input:u,output:p,match:h,isMatch:f};return typeof n.onResult=="function"&&n.onResult(m),f===!1?(m.isMatch=!1,g?m:!1):l(u)?(typeof n.onIgnore=="function"&&n.onIgnore(m),m.isMatch=!1,g?m:!1):(typeof n.onMatch=="function"&&n.onMatch(m),g?m:!0)};return r&&(c.state=a),c};_r.test=(t,e,r,{glob:i,posix:n}={})=>{if(typeof t!="string")throw new TypeError("Expected input to be a string");if(t==="")return{isMatch:!1,output:""};let s=r||{},o=s.format||(n?OS.toPosixSlashes:null),a=t===i,l=a&&o?o(t):t;return a===!1&&(l=o?o(t):t,a=l===i),(a===!1||s.capture===!0)&&(s.matchBase===!0||s.basename===!0?a=_r.matchBase(t,e,r,n):a=e.exec(l)),{isMatch:Boolean(a),match:a,output:l}};_r.matchBase=(t,e,r,i=OS.isWindows(r))=>(e instanceof RegExp?e:_r.makeRe(e,r)).test(S0e.basename(t));_r.isMatch=(t,e,r)=>_r(e,r)(t);_r.parse=(t,e)=>Array.isArray(t)?t.map(r=>_r.parse(r,e)):TS(t,ie(N({},e),{fastpaths:!1}));_r.scan=(t,e)=>k0e(t,e);_r.compileRe=(t,e,r=!1,i=!1)=>{if(r===!0)return t.output;let n=e||{},s=n.contains?"":"^",o=n.contains?"":"$",a=`${s}(?:${t.output})${o}`;t&&t.negated===!0&&(a=`^(?!${a}).*$`);let l=_r.toRegex(a,e);return i===!0&&(l.state=t),l};_r.makeRe=(t,e={},r=!1,i=!1)=>{if(!t||typeof t!="string")throw new TypeError("Expected a non-empty string");let n={negated:!1,fastpaths:!0};return e.fastpaths!==!1&&(t[0]==="."||t[0]==="*")&&(n.output=TS.fastpaths(t,e)),n.output||(n=TS(t,e)),_r.compileRe(n,e,r,i)};_r.toRegex=(t,e)=>{try{let r=e||{};return new RegExp(t,r.flags||(r.nocase?"i":""))}catch(r){if(e&&e.debug===!0)throw r;return/$^/}};_r.constants=x0e;iJ.exports=_r});var MS=w((wrt,sJ)=>{"use strict";sJ.exports=nJ()});var rs=w((Brt,oJ)=>{"use strict";var aJ=require("util"),AJ=Kq(),Yo=MS(),KS=Zp(),lJ=t=>t===""||t==="./",Pr=(t,e,r)=>{e=[].concat(e),t=[].concat(t);let i=new Set,n=new Set,s=new Set,o=0,a=u=>{s.add(u.output),r&&r.onResult&&r.onResult(u)};for(let u=0;u!i.has(u));if(r&&c.length===0){if(r.failglob===!0)throw new Error(`No matches found for "${e.join(", ")}"`);if(r.nonull===!0||r.nullglob===!0)return r.unescape?e.map(u=>u.replace(/\\/g,"")):e}return c};Pr.match=Pr;Pr.matcher=(t,e)=>Yo(t,e);Pr.isMatch=(t,e,r)=>Yo(e,r)(t);Pr.any=Pr.isMatch;Pr.not=(t,e,r={})=>{e=[].concat(e).map(String);let i=new Set,n=[],s=a=>{r.onResult&&r.onResult(a),n.push(a.output)},o=Pr(t,e,ie(N({},r),{onResult:s}));for(let a of n)o.includes(a)||i.add(a);return[...i]};Pr.contains=(t,e,r)=>{if(typeof t!="string")throw new TypeError(`Expected a string: "${aJ.inspect(t)}"`);if(Array.isArray(e))return e.some(i=>Pr.contains(t,i,r));if(typeof e=="string"){if(lJ(t)||lJ(e))return!1;if(t.includes(e)||t.startsWith("./")&&t.slice(2).includes(e))return!0}return Pr.isMatch(t,e,ie(N({},r),{contains:!0}))};Pr.matchKeys=(t,e,r)=>{if(!KS.isObject(t))throw new TypeError("Expected the first argument to be an object");let i=Pr(Object.keys(t),e,r),n={};for(let s of i)n[s]=t[s];return n};Pr.some=(t,e,r)=>{let i=[].concat(t);for(let n of[].concat(e)){let s=Yo(String(n),r);if(i.some(o=>s(o)))return!0}return!1};Pr.every=(t,e,r)=>{let i=[].concat(t);for(let n of[].concat(e)){let s=Yo(String(n),r);if(!i.every(o=>s(o)))return!1}return!0};Pr.all=(t,e,r)=>{if(typeof t!="string")throw new TypeError(`Expected a string: "${aJ.inspect(t)}"`);return[].concat(e).every(i=>Yo(i,r)(t))};Pr.capture=(t,e,r)=>{let i=KS.isWindows(r),s=Yo.makeRe(String(t),ie(N({},r),{capture:!0})).exec(i?KS.toPosixSlashes(e):e);if(s)return s.slice(1).map(o=>o===void 0?"":o)};Pr.makeRe=(...t)=>Yo.makeRe(...t);Pr.scan=(...t)=>Yo.scan(...t);Pr.parse=(t,e)=>{let r=[];for(let i of[].concat(t||[]))for(let n of AJ(String(i),e))r.push(Yo.parse(n,e));return r};Pr.braces=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");return e&&e.nobrace===!0||!/\{.*\}/.test(t)?[t]:AJ(t,e)};Pr.braceExpand=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");return Pr.braces(t,ie(N({},e),{expand:!0}))};oJ.exports=Pr});var uJ=w((brt,cJ)=>{"use strict";cJ.exports=({onlyFirst:t=!1}={})=>{let e=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(e,t?void 0:"g")}});var fJ=w((Qrt,gJ)=>{"use strict";var D0e=uJ();gJ.exports=t=>typeof t=="string"?t.replace(D0e(),""):t});var xJ=w((jrt,kJ)=>{"use strict";kJ.exports=(...t)=>[...new Set([].concat(...t))]});var ek=w((Yrt,PJ)=>{"use strict";var j0e=require("stream"),DJ=j0e.PassThrough,Y0e=Array.prototype.slice;PJ.exports=q0e;function q0e(){let t=[],e=!1,r=Y0e.call(arguments),i=r[r.length-1];i&&!Array.isArray(i)&&i.pipe==null?r.pop():i={};let n=i.end!==!1;i.objectMode==null&&(i.objectMode=!0),i.highWaterMark==null&&(i.highWaterMark=64*1024);let s=DJ(i);function o(){for(let c=0,u=arguments.length;c0||(e=!1,a())}function f(h){function p(){h.removeListener("merge2UnpipeEnd",p),h.removeListener("end",p),g()}if(h._readableState.endEmitted)return g();h.on("merge2UnpipeEnd",p),h.on("end",p),h.pipe(s,{end:!1}),h.resume()}for(let h=0;h{"use strict";Object.defineProperty(Oy,"__esModule",{value:!0});function J0e(t){return t.reduce((e,r)=>[].concat(e,r),[])}Oy.flatten=J0e;function W0e(t,e){let r=[[]],i=0;for(let n of t)e(n)?(i++,r[i]=[]):r[i].push(n);return r}Oy.splitWhen=W0e});var NJ=w(tk=>{"use strict";Object.defineProperty(tk,"__esModule",{value:!0});function z0e(t){return t.code==="ENOENT"}tk.isEnoentCodeError=z0e});var TJ=w(rk=>{"use strict";Object.defineProperty(rk,"__esModule",{value:!0});var LJ=class{constructor(e,r){this.name=e,this.isBlockDevice=r.isBlockDevice.bind(r),this.isCharacterDevice=r.isCharacterDevice.bind(r),this.isDirectory=r.isDirectory.bind(r),this.isFIFO=r.isFIFO.bind(r),this.isFile=r.isFile.bind(r),this.isSocket=r.isSocket.bind(r),this.isSymbolicLink=r.isSymbolicLink.bind(r)}};function _0e(t,e){return new LJ(t,e)}rk.createDirentFromStats=_0e});var OJ=w(Tg=>{"use strict";Object.defineProperty(Tg,"__esModule",{value:!0});var V0e=require("path"),X0e=2,Z0e=/(\\?)([()*?[\]{|}]|^!|[!+@](?=\())/g;function $0e(t){return t.replace(/\\/g,"/")}Tg.unixify=$0e;function ebe(t,e){return V0e.resolve(t,e)}Tg.makeAbsolute=ebe;function tbe(t){return t.replace(Z0e,"\\$2")}Tg.escape=tbe;function rbe(t){if(t.charAt(0)==="."){let e=t.charAt(1);if(e==="/"||e==="\\")return t.slice(X0e)}return t}Tg.removeLeadingDotSegment=rbe});var KJ=w((_rt,MJ)=>{MJ.exports=function(e){if(typeof e!="string"||e==="")return!1;for(var r;r=/(\\).|([@?!+*]\(.*\))/g.exec(e);){if(r[2])return!0;e=e.slice(r.index+r[0].length)}return!1}});var GJ=w((Vrt,UJ)=>{var ibe=KJ(),HJ={"{":"}","(":")","[":"]"},nbe=function(t){if(t[0]==="!")return!0;for(var e=0,r=-2,i=-2,n=-2,s=-2,o=-2;ee&&(o===-1||o>i||(o=t.indexOf("\\",e),o===-1||o>i)))||n!==-1&&t[e]==="{"&&t[e+1]!=="}"&&(n=t.indexOf("}",e),n>e&&(o=t.indexOf("\\",e),o===-1||o>n))||s!==-1&&t[e]==="("&&t[e+1]==="?"&&/[:!=]/.test(t[e+2])&&t[e+3]!==")"&&(s=t.indexOf(")",e),s>e&&(o=t.indexOf("\\",e),o===-1||o>s))||r!==-1&&t[e]==="("&&t[e+1]!=="|"&&(rr&&(o=t.indexOf("\\",r),o===-1||o>s))))return!0;if(t[e]==="\\"){var a=t[e+1];e+=2;var l=HJ[a];if(l){var c=t.indexOf(l,e);c!==-1&&(e=c+1)}if(t[e]==="!")return!0}else e++}return!1},sbe=function(t){if(t[0]==="!")return!0;for(var e=0;e{"use strict";var obe=GJ(),abe=require("path").posix.dirname,Abe=require("os").platform()==="win32",ik="/",lbe=/\\/g,cbe=/[\{\[].*[\}\]]$/,ube=/(^|[^\\])([\{\[]|\([^\)]+$)/,gbe=/\\([\!\*\?\|\[\]\(\)\{\}])/g;jJ.exports=function(e,r){var i=Object.assign({flipBackslashes:!0},r);i.flipBackslashes&&Abe&&e.indexOf(ik)<0&&(e=e.replace(lbe,ik)),cbe.test(e)&&(e+=ik),e+="a";do e=abe(e);while(obe(e)||ube.test(e));return e.replace(gbe,"$1")}});var $J=w(si=>{"use strict";Object.defineProperty(si,"__esModule",{value:!0});var fbe=require("path"),hbe=YJ(),qJ=rs(),pbe=MS(),JJ="**",dbe="\\",Cbe=/[*?]|^!/,mbe=/\[.*]/,Ebe=/(?:^|[^!*+?@])\(.*\|.*\)/,Ibe=/[!*+?@]\(.*\)/,ybe=/{.*(?:,|\.\.).*}/;function zJ(t,e={}){return!WJ(t,e)}si.isStaticPattern=zJ;function WJ(t,e={}){return!!(e.caseSensitiveMatch===!1||t.includes(dbe)||Cbe.test(t)||mbe.test(t)||Ebe.test(t)||e.extglob!==!1&&Ibe.test(t)||e.braceExpansion!==!1&&ybe.test(t))}si.isDynamicPattern=WJ;function wbe(t){return My(t)?t.slice(1):t}si.convertToPositivePattern=wbe;function Bbe(t){return"!"+t}si.convertToNegativePattern=Bbe;function My(t){return t.startsWith("!")&&t[1]!=="("}si.isNegativePattern=My;function _J(t){return!My(t)}si.isPositivePattern=_J;function bbe(t){return t.filter(My)}si.getNegativePatterns=bbe;function Qbe(t){return t.filter(_J)}si.getPositivePatterns=Qbe;function vbe(t){return hbe(t,{flipBackslashes:!1})}si.getBaseDirectory=vbe;function Sbe(t){return t.includes(JJ)}si.hasGlobStar=Sbe;function VJ(t){return t.endsWith("/"+JJ)}si.endsWithSlashGlobStar=VJ;function kbe(t){let e=fbe.basename(t);return VJ(t)||zJ(e)}si.isAffectDepthOfReadingPattern=kbe;function xbe(t){return t.reduce((e,r)=>e.concat(XJ(r)),[])}si.expandPatternsWithBraceExpansion=xbe;function XJ(t){return qJ.braces(t,{expand:!0,nodupes:!0})}si.expandBraceExpansion=XJ;function Pbe(t,e){let r=pbe.scan(t,Object.assign(Object.assign({},e),{parts:!0}));return r.parts.length===0?[t]:r.parts}si.getPatternParts=Pbe;function ZJ(t,e){return qJ.makeRe(t,e)}si.makeRe=ZJ;function Dbe(t,e){return t.map(r=>ZJ(r,e))}si.convertPatternsToRe=Dbe;function Rbe(t,e){return e.some(r=>r.test(t))}si.matchAny=Rbe});var t3=w(nk=>{"use strict";Object.defineProperty(nk,"__esModule",{value:!0});var Fbe=ek();function Nbe(t){let e=Fbe(t);return t.forEach(r=>{r.once("error",i=>e.emit("error",i))}),e.once("close",()=>e3(t)),e.once("end",()=>e3(t)),e}nk.merge=Nbe;function e3(t){t.forEach(e=>e.emit("close"))}});var r3=w(Ky=>{"use strict";Object.defineProperty(Ky,"__esModule",{value:!0});function Lbe(t){return typeof t=="string"}Ky.isString=Lbe;function Tbe(t){return t===""}Ky.isEmpty=Tbe});var za=w(Wa=>{"use strict";Object.defineProperty(Wa,"__esModule",{value:!0});var Obe=FJ();Wa.array=Obe;var Mbe=NJ();Wa.errno=Mbe;var Kbe=TJ();Wa.fs=Kbe;var Ube=OJ();Wa.path=Ube;var Hbe=$J();Wa.pattern=Hbe;var Gbe=t3();Wa.stream=Gbe;var jbe=r3();Wa.string=jbe});var a3=w(_a=>{"use strict";Object.defineProperty(_a,"__esModule",{value:!0});var Fc=za();function Ybe(t,e){let r=i3(t),i=n3(t,e.ignore),n=r.filter(l=>Fc.pattern.isStaticPattern(l,e)),s=r.filter(l=>Fc.pattern.isDynamicPattern(l,e)),o=sk(n,i,!1),a=sk(s,i,!0);return o.concat(a)}_a.generate=Ybe;function sk(t,e,r){let i=s3(t);return"."in i?[ok(".",t,e,r)]:o3(i,e,r)}_a.convertPatternsToTasks=sk;function i3(t){return Fc.pattern.getPositivePatterns(t)}_a.getPositivePatterns=i3;function n3(t,e){return Fc.pattern.getNegativePatterns(t).concat(e).map(Fc.pattern.convertToPositivePattern)}_a.getNegativePatternsAsPositive=n3;function s3(t){let e={};return t.reduce((r,i)=>{let n=Fc.pattern.getBaseDirectory(i);return n in r?r[n].push(i):r[n]=[i],r},e)}_a.groupPatternsByBaseDirectory=s3;function o3(t,e,r){return Object.keys(t).map(i=>ok(i,t[i],e,r))}_a.convertPatternGroupsToTasks=o3;function ok(t,e,r,i){return{dynamic:i,positive:e,negative:r,base:t,patterns:[].concat(e,r.map(Fc.pattern.convertToNegativePattern))}}_a.convertPatternGroupToTask=ok});var l3=w(Uy=>{"use strict";Object.defineProperty(Uy,"__esModule",{value:!0});Uy.read=void 0;function qbe(t,e,r){e.fs.lstat(t,(i,n)=>{if(i!==null){A3(r,i);return}if(!n.isSymbolicLink()||!e.followSymbolicLink){ak(r,n);return}e.fs.stat(t,(s,o)=>{if(s!==null){if(e.throwErrorOnBrokenSymbolicLink){A3(r,s);return}ak(r,n);return}e.markSymbolicLink&&(o.isSymbolicLink=()=>!0),ak(r,o)})})}Uy.read=qbe;function A3(t,e){t(e)}function ak(t,e){t(null,e)}});var c3=w(Hy=>{"use strict";Object.defineProperty(Hy,"__esModule",{value:!0});Hy.read=void 0;function Jbe(t,e){let r=e.fs.lstatSync(t);if(!r.isSymbolicLink()||!e.followSymbolicLink)return r;try{let i=e.fs.statSync(t);return e.markSymbolicLink&&(i.isSymbolicLink=()=>!0),i}catch(i){if(!e.throwErrorOnBrokenSymbolicLink)return r;throw i}}Hy.read=Jbe});var u3=w(ZA=>{"use strict";Object.defineProperty(ZA,"__esModule",{value:!0});ZA.createFileSystemAdapter=ZA.FILE_SYSTEM_ADAPTER=void 0;var Gy=require("fs");ZA.FILE_SYSTEM_ADAPTER={lstat:Gy.lstat,stat:Gy.stat,lstatSync:Gy.lstatSync,statSync:Gy.statSync};function Wbe(t){return t===void 0?ZA.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},ZA.FILE_SYSTEM_ADAPTER),t)}ZA.createFileSystemAdapter=Wbe});var f3=w(Ak=>{"use strict";Object.defineProperty(Ak,"__esModule",{value:!0});var zbe=u3(),g3=class{constructor(e={}){this._options=e,this.followSymbolicLink=this._getValue(this._options.followSymbolicLink,!0),this.fs=zbe.createFileSystemAdapter(this._options.fs),this.markSymbolicLink=this._getValue(this._options.markSymbolicLink,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0)}_getValue(e,r){return e!=null?e:r}};Ak.default=g3});var Nc=w($A=>{"use strict";Object.defineProperty($A,"__esModule",{value:!0});$A.statSync=$A.stat=$A.Settings=void 0;var h3=l3(),_be=c3(),lk=f3();$A.Settings=lk.default;function Vbe(t,e,r){if(typeof e=="function"){h3.read(t,ck(),e);return}h3.read(t,ck(e),r)}$A.stat=Vbe;function Xbe(t,e){let r=ck(e);return _be.read(t,r)}$A.statSync=Xbe;function ck(t={}){return t instanceof lk.default?t:new lk.default(t)}});var d3=w((Ait,p3)=>{p3.exports=Zbe;function Zbe(t,e){var r,i,n,s=!0;Array.isArray(t)?(r=[],i=t.length):(n=Object.keys(t),r={},i=n.length);function o(l){function c(){e&&e(l,r),e=null}s?process.nextTick(c):c()}function a(l,c,u){r[l]=u,(--i==0||c)&&o(c)}i?n?n.forEach(function(l){t[l](function(c,u){a(l,c,u)})}):t.forEach(function(l,c){l(function(u,g){a(c,u,g)})}):o(null),s=!1}});var uk=w(jy=>{"use strict";Object.defineProperty(jy,"__esModule",{value:!0});jy.IS_SUPPORT_READDIR_WITH_FILE_TYPES=void 0;var Yy=process.versions.node.split(".");if(Yy[0]===void 0||Yy[1]===void 0)throw new Error(`Unexpected behavior. The 'process.versions.node' variable has invalid value: ${process.versions.node}`);var C3=Number.parseInt(Yy[0],10),$be=Number.parseInt(Yy[1],10),m3=10,eQe=10,tQe=C3>m3,rQe=C3===m3&&$be>=eQe;jy.IS_SUPPORT_READDIR_WITH_FILE_TYPES=tQe||rQe});var I3=w(qy=>{"use strict";Object.defineProperty(qy,"__esModule",{value:!0});qy.createDirentFromStats=void 0;var E3=class{constructor(e,r){this.name=e,this.isBlockDevice=r.isBlockDevice.bind(r),this.isCharacterDevice=r.isCharacterDevice.bind(r),this.isDirectory=r.isDirectory.bind(r),this.isFIFO=r.isFIFO.bind(r),this.isFile=r.isFile.bind(r),this.isSocket=r.isSocket.bind(r),this.isSymbolicLink=r.isSymbolicLink.bind(r)}};function iQe(t,e){return new E3(t,e)}qy.createDirentFromStats=iQe});var gk=w(Jy=>{"use strict";Object.defineProperty(Jy,"__esModule",{value:!0});Jy.fs=void 0;var nQe=I3();Jy.fs=nQe});var fk=w(Wy=>{"use strict";Object.defineProperty(Wy,"__esModule",{value:!0});Wy.joinPathSegments=void 0;function sQe(t,e,r){return t.endsWith(r)?t+e:t+r+e}Wy.joinPathSegments=sQe});var v3=w(el=>{"use strict";Object.defineProperty(el,"__esModule",{value:!0});el.readdir=el.readdirWithFileTypes=el.read=void 0;var oQe=Nc(),y3=d3(),aQe=uk(),w3=gk(),B3=fk();function AQe(t,e,r){if(!e.stats&&aQe.IS_SUPPORT_READDIR_WITH_FILE_TYPES){b3(t,e,r);return}Q3(t,e,r)}el.read=AQe;function b3(t,e,r){e.fs.readdir(t,{withFileTypes:!0},(i,n)=>{if(i!==null){zy(r,i);return}let s=n.map(a=>({dirent:a,name:a.name,path:B3.joinPathSegments(t,a.name,e.pathSegmentSeparator)}));if(!e.followSymbolicLinks){hk(r,s);return}let o=s.map(a=>lQe(a,e));y3(o,(a,l)=>{if(a!==null){zy(r,a);return}hk(r,l)})})}el.readdirWithFileTypes=b3;function lQe(t,e){return r=>{if(!t.dirent.isSymbolicLink()){r(null,t);return}e.fs.stat(t.path,(i,n)=>{if(i!==null){if(e.throwErrorOnBrokenSymbolicLink){r(i);return}r(null,t);return}t.dirent=w3.fs.createDirentFromStats(t.name,n),r(null,t)})}}function Q3(t,e,r){e.fs.readdir(t,(i,n)=>{if(i!==null){zy(r,i);return}let s=n.map(o=>{let a=B3.joinPathSegments(t,o,e.pathSegmentSeparator);return l=>{oQe.stat(a,e.fsStatSettings,(c,u)=>{if(c!==null){l(c);return}let g={name:o,path:a,dirent:w3.fs.createDirentFromStats(o,u)};e.stats&&(g.stats=u),l(null,g)})}});y3(s,(o,a)=>{if(o!==null){zy(r,o);return}hk(r,a)})})}el.readdir=Q3;function zy(t,e){t(e)}function hk(t,e){t(null,e)}});var D3=w(tl=>{"use strict";Object.defineProperty(tl,"__esModule",{value:!0});tl.readdir=tl.readdirWithFileTypes=tl.read=void 0;var cQe=Nc(),uQe=uk(),S3=gk(),k3=fk();function gQe(t,e){return!e.stats&&uQe.IS_SUPPORT_READDIR_WITH_FILE_TYPES?x3(t,e):P3(t,e)}tl.read=gQe;function x3(t,e){return e.fs.readdirSync(t,{withFileTypes:!0}).map(i=>{let n={dirent:i,name:i.name,path:k3.joinPathSegments(t,i.name,e.pathSegmentSeparator)};if(n.dirent.isSymbolicLink()&&e.followSymbolicLinks)try{let s=e.fs.statSync(n.path);n.dirent=S3.fs.createDirentFromStats(n.name,s)}catch(s){if(e.throwErrorOnBrokenSymbolicLink)throw s}return n})}tl.readdirWithFileTypes=x3;function P3(t,e){return e.fs.readdirSync(t).map(i=>{let n=k3.joinPathSegments(t,i,e.pathSegmentSeparator),s=cQe.statSync(n,e.fsStatSettings),o={name:i,path:n,dirent:S3.fs.createDirentFromStats(i,s)};return e.stats&&(o.stats=s),o})}tl.readdir=P3});var R3=w(rl=>{"use strict";Object.defineProperty(rl,"__esModule",{value:!0});rl.createFileSystemAdapter=rl.FILE_SYSTEM_ADAPTER=void 0;var Og=require("fs");rl.FILE_SYSTEM_ADAPTER={lstat:Og.lstat,stat:Og.stat,lstatSync:Og.lstatSync,statSync:Og.statSync,readdir:Og.readdir,readdirSync:Og.readdirSync};function fQe(t){return t===void 0?rl.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},rl.FILE_SYSTEM_ADAPTER),t)}rl.createFileSystemAdapter=fQe});var N3=w(pk=>{"use strict";Object.defineProperty(pk,"__esModule",{value:!0});var hQe=require("path"),pQe=Nc(),dQe=R3(),F3=class{constructor(e={}){this._options=e,this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!1),this.fs=dQe.createFileSystemAdapter(this._options.fs),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,hQe.sep),this.stats=this._getValue(this._options.stats,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0),this.fsStatSettings=new pQe.Settings({followSymbolicLink:this.followSymbolicLinks,fs:this.fs,throwErrorOnBrokenSymbolicLink:this.throwErrorOnBrokenSymbolicLink})}_getValue(e,r){return e!=null?e:r}};pk.default=F3});var _y=w(il=>{"use strict";Object.defineProperty(il,"__esModule",{value:!0});il.Settings=il.scandirSync=il.scandir=void 0;var L3=v3(),CQe=D3(),dk=N3();il.Settings=dk.default;function mQe(t,e,r){if(typeof e=="function"){L3.read(t,Ck(),e);return}L3.read(t,Ck(e),r)}il.scandir=mQe;function EQe(t,e){let r=Ck(e);return CQe.read(t,r)}il.scandirSync=EQe;function Ck(t={}){return t instanceof dk.default?t:new dk.default(t)}});var O3=w((mit,T3)=>{"use strict";function IQe(t){var e=new t,r=e;function i(){var s=e;return s.next?e=s.next:(e=new t,r=e),s.next=null,s}function n(s){r.next=s,r=s}return{get:i,release:n}}T3.exports=IQe});var K3=w((Eit,mk)=>{"use strict";var yQe=O3();function M3(t,e,r){if(typeof t=="function"&&(r=e,e=t,t=null),r<1)throw new Error("fastqueue concurrency must be greater than 1");var i=yQe(wQe),n=null,s=null,o=0,a=null,l={push:m,drain:Wo,saturated:Wo,pause:u,paused:!1,concurrency:r,running:c,resume:h,idle:p,length:g,getQueue:f,unshift:y,empty:Wo,kill:S,killAndDrain:k,error:T};return l;function c(){return o}function u(){l.paused=!0}function g(){for(var Y=n,j=0;Y;)Y=Y.next,j++;return j}function f(){for(var Y=n,j=[];Y;)j.push(Y.value),Y=Y.next;return j}function h(){if(!!l.paused){l.paused=!1;for(var Y=0;Y{"use strict";Object.defineProperty(zo,"__esModule",{value:!0});zo.joinPathSegments=zo.replacePathSegmentSeparator=zo.isAppliedFilter=zo.isFatalError=void 0;function bQe(t,e){return t.errorFilter===null?!0:!t.errorFilter(e)}zo.isFatalError=bQe;function QQe(t,e){return t===null||t(e)}zo.isAppliedFilter=QQe;function vQe(t,e){return t.split(/[/\\]/).join(e)}zo.replacePathSegmentSeparator=vQe;function SQe(t,e,r){return t===""?e:t.endsWith(r)?t+e:t+r+e}zo.joinPathSegments=SQe});var Ik=w(Ek=>{"use strict";Object.defineProperty(Ek,"__esModule",{value:!0});var kQe=Vy(),U3=class{constructor(e,r){this._root=e,this._settings=r,this._root=kQe.replacePathSegmentSeparator(e,r.pathSegmentSeparator)}};Ek.default=U3});var wk=w(yk=>{"use strict";Object.defineProperty(yk,"__esModule",{value:!0});var xQe=require("events"),PQe=_y(),DQe=K3(),Xy=Vy(),RQe=Ik(),H3=class extends RQe.default{constructor(e,r){super(e,r);this._settings=r,this._scandir=PQe.scandir,this._emitter=new xQe.EventEmitter,this._queue=DQe(this._worker.bind(this),this._settings.concurrency),this._isFatalError=!1,this._isDestroyed=!1,this._queue.drain=()=>{this._isFatalError||this._emitter.emit("end")}}read(){return this._isFatalError=!1,this._isDestroyed=!1,setImmediate(()=>{this._pushToQueue(this._root,this._settings.basePath)}),this._emitter}get isDestroyed(){return this._isDestroyed}destroy(){if(this._isDestroyed)throw new Error("The reader is already destroyed");this._isDestroyed=!0,this._queue.killAndDrain()}onEntry(e){this._emitter.on("entry",e)}onError(e){this._emitter.once("error",e)}onEnd(e){this._emitter.once("end",e)}_pushToQueue(e,r){let i={directory:e,base:r};this._queue.push(i,n=>{n!==null&&this._handleError(n)})}_worker(e,r){this._scandir(e.directory,this._settings.fsScandirSettings,(i,n)=>{if(i!==null){r(i,void 0);return}for(let s of n)this._handleEntry(s,e.base);r(null,void 0)})}_handleError(e){this._isDestroyed||!Xy.isFatalError(this._settings,e)||(this._isFatalError=!0,this._isDestroyed=!0,this._emitter.emit("error",e))}_handleEntry(e,r){if(this._isDestroyed||this._isFatalError)return;let i=e.path;r!==void 0&&(e.path=Xy.joinPathSegments(r,e.name,this._settings.pathSegmentSeparator)),Xy.isAppliedFilter(this._settings.entryFilter,e)&&this._emitEntry(e),e.dirent.isDirectory()&&Xy.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(i,e.path)}_emitEntry(e){this._emitter.emit("entry",e)}};yk.default=H3});var j3=w(Bk=>{"use strict";Object.defineProperty(Bk,"__esModule",{value:!0});var FQe=wk(),G3=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new FQe.default(this._root,this._settings),this._storage=new Set}read(e){this._reader.onError(r=>{NQe(e,r)}),this._reader.onEntry(r=>{this._storage.add(r)}),this._reader.onEnd(()=>{LQe(e,[...this._storage])}),this._reader.read()}};Bk.default=G3;function NQe(t,e){t(e)}function LQe(t,e){t(null,e)}});var q3=w(bk=>{"use strict";Object.defineProperty(bk,"__esModule",{value:!0});var TQe=require("stream"),OQe=wk(),Y3=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new OQe.default(this._root,this._settings),this._stream=new TQe.Readable({objectMode:!0,read:()=>{},destroy:()=>{this._reader.isDestroyed||this._reader.destroy()}})}read(){return this._reader.onError(e=>{this._stream.emit("error",e)}),this._reader.onEntry(e=>{this._stream.push(e)}),this._reader.onEnd(()=>{this._stream.push(null)}),this._reader.read(),this._stream}};bk.default=Y3});var W3=w(Qk=>{"use strict";Object.defineProperty(Qk,"__esModule",{value:!0});var MQe=_y(),Zy=Vy(),KQe=Ik(),J3=class extends KQe.default{constructor(){super(...arguments);this._scandir=MQe.scandirSync,this._storage=new Set,this._queue=new Set}read(){return this._pushToQueue(this._root,this._settings.basePath),this._handleQueue(),[...this._storage]}_pushToQueue(e,r){this._queue.add({directory:e,base:r})}_handleQueue(){for(let e of this._queue.values())this._handleDirectory(e.directory,e.base)}_handleDirectory(e,r){try{let i=this._scandir(e,this._settings.fsScandirSettings);for(let n of i)this._handleEntry(n,r)}catch(i){this._handleError(i)}}_handleError(e){if(!!Zy.isFatalError(this._settings,e))throw e}_handleEntry(e,r){let i=e.path;r!==void 0&&(e.path=Zy.joinPathSegments(r,e.name,this._settings.pathSegmentSeparator)),Zy.isAppliedFilter(this._settings.entryFilter,e)&&this._pushToStorage(e),e.dirent.isDirectory()&&Zy.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(i,e.path)}_pushToStorage(e){this._storage.add(e)}};Qk.default=J3});var _3=w(vk=>{"use strict";Object.defineProperty(vk,"__esModule",{value:!0});var UQe=W3(),z3=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new UQe.default(this._root,this._settings)}read(){return this._reader.read()}};vk.default=z3});var X3=w(Sk=>{"use strict";Object.defineProperty(Sk,"__esModule",{value:!0});var HQe=require("path"),GQe=_y(),V3=class{constructor(e={}){this._options=e,this.basePath=this._getValue(this._options.basePath,void 0),this.concurrency=this._getValue(this._options.concurrency,Number.POSITIVE_INFINITY),this.deepFilter=this._getValue(this._options.deepFilter,null),this.entryFilter=this._getValue(this._options.entryFilter,null),this.errorFilter=this._getValue(this._options.errorFilter,null),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,HQe.sep),this.fsScandirSettings=new GQe.Settings({followSymbolicLinks:this._options.followSymbolicLinks,fs:this._options.fs,pathSegmentSeparator:this._options.pathSegmentSeparator,stats:this._options.stats,throwErrorOnBrokenSymbolicLink:this._options.throwErrorOnBrokenSymbolicLink})}_getValue(e,r){return e!=null?e:r}};Sk.default=V3});var xk=w(_o=>{"use strict";Object.defineProperty(_o,"__esModule",{value:!0});_o.Settings=_o.walkStream=_o.walkSync=_o.walk=void 0;var Z3=j3(),jQe=q3(),YQe=_3(),kk=X3();_o.Settings=kk.default;function qQe(t,e,r){if(typeof e=="function"){new Z3.default(t,$y()).read(e);return}new Z3.default(t,$y(e)).read(r)}_o.walk=qQe;function JQe(t,e){let r=$y(e);return new YQe.default(t,r).read()}_o.walkSync=JQe;function WQe(t,e){let r=$y(e);return new jQe.default(t,r).read()}_o.walkStream=WQe;function $y(t={}){return t instanceof kk.default?t:new kk.default(t)}});var Dk=w(Pk=>{"use strict";Object.defineProperty(Pk,"__esModule",{value:!0});var zQe=require("path"),_Qe=Nc(),$3=za(),eW=class{constructor(e){this._settings=e,this._fsStatSettings=new _Qe.Settings({followSymbolicLink:this._settings.followSymbolicLinks,fs:this._settings.fs,throwErrorOnBrokenSymbolicLink:this._settings.followSymbolicLinks})}_getFullEntryPath(e){return zQe.resolve(this._settings.cwd,e)}_makeEntry(e,r){let i={name:r,path:r,dirent:$3.fs.createDirentFromStats(r,e)};return this._settings.stats&&(i.stats=e),i}_isFatalError(e){return!$3.errno.isEnoentCodeError(e)&&!this._settings.suppressErrors}};Pk.default=eW});var Fk=w(Rk=>{"use strict";Object.defineProperty(Rk,"__esModule",{value:!0});var VQe=require("stream"),XQe=Nc(),ZQe=xk(),$Qe=Dk(),tW=class extends $Qe.default{constructor(){super(...arguments);this._walkStream=ZQe.walkStream,this._stat=XQe.stat}dynamic(e,r){return this._walkStream(e,r)}static(e,r){let i=e.map(this._getFullEntryPath,this),n=new VQe.PassThrough({objectMode:!0});n._write=(s,o,a)=>this._getEntry(i[s],e[s],r).then(l=>{l!==null&&r.entryFilter(l)&&n.push(l),s===i.length-1&&n.end(),a()}).catch(a);for(let s=0;sthis._makeEntry(n,r)).catch(n=>{if(i.errorFilter(n))return null;throw n})}_getStat(e){return new Promise((r,i)=>{this._stat(e,this._fsStatSettings,(n,s)=>n===null?r(s):i(n))})}};Rk.default=tW});var iW=w(Nk=>{"use strict";Object.defineProperty(Nk,"__esModule",{value:!0});var Mg=za(),rW=class{constructor(e,r,i){this._patterns=e,this._settings=r,this._micromatchOptions=i,this._storage=[],this._fillStorage()}_fillStorage(){let e=Mg.pattern.expandPatternsWithBraceExpansion(this._patterns);for(let r of e){let i=this._getPatternSegments(r),n=this._splitSegmentsIntoSections(i);this._storage.push({complete:n.length<=1,pattern:r,segments:i,sections:n})}}_getPatternSegments(e){return Mg.pattern.getPatternParts(e,this._micromatchOptions).map(i=>Mg.pattern.isDynamicPattern(i,this._settings)?{dynamic:!0,pattern:i,patternRe:Mg.pattern.makeRe(i,this._micromatchOptions)}:{dynamic:!1,pattern:i})}_splitSegmentsIntoSections(e){return Mg.array.splitWhen(e,r=>r.dynamic&&Mg.pattern.hasGlobStar(r.pattern))}};Nk.default=rW});var sW=w(Lk=>{"use strict";Object.defineProperty(Lk,"__esModule",{value:!0});var eve=iW(),nW=class extends eve.default{match(e){let r=e.split("/"),i=r.length,n=this._storage.filter(s=>!s.complete||s.segments.length>i);for(let s of n){let o=s.sections[0];if(!s.complete&&i>o.length||r.every((l,c)=>{let u=s.segments[c];return!!(u.dynamic&&u.patternRe.test(l)||!u.dynamic&&u.pattern===l)}))return!0}return!1}};Lk.default=nW});var aW=w(Tk=>{"use strict";Object.defineProperty(Tk,"__esModule",{value:!0});var ew=za(),tve=sW(),oW=class{constructor(e,r){this._settings=e,this._micromatchOptions=r}getFilter(e,r,i){let n=this._getMatcher(r),s=this._getNegativePatternsRe(i);return o=>this._filter(e,o,n,s)}_getMatcher(e){return new tve.default(e,this._settings,this._micromatchOptions)}_getNegativePatternsRe(e){let r=e.filter(ew.pattern.isAffectDepthOfReadingPattern);return ew.pattern.convertPatternsToRe(r,this._micromatchOptions)}_filter(e,r,i,n){let s=this._getEntryLevel(e,r.path);if(this._isSkippedByDeep(s)||this._isSkippedSymbolicLink(r))return!1;let o=ew.path.removeLeadingDotSegment(r.path);return this._isSkippedByPositivePatterns(o,i)?!1:this._isSkippedByNegativePatterns(o,n)}_isSkippedByDeep(e){return e>=this._settings.deep}_isSkippedSymbolicLink(e){return!this._settings.followSymbolicLinks&&e.dirent.isSymbolicLink()}_getEntryLevel(e,r){let i=e.split("/").length;return r.split("/").length-(e===""?0:i)}_isSkippedByPositivePatterns(e,r){return!this._settings.baseNameMatch&&!r.match(e)}_isSkippedByNegativePatterns(e,r){return!ew.pattern.matchAny(e,r)}};Tk.default=oW});var lW=w(Ok=>{"use strict";Object.defineProperty(Ok,"__esModule",{value:!0});var od=za(),AW=class{constructor(e,r){this._settings=e,this._micromatchOptions=r,this.index=new Map}getFilter(e,r){let i=od.pattern.convertPatternsToRe(e,this._micromatchOptions),n=od.pattern.convertPatternsToRe(r,this._micromatchOptions);return s=>this._filter(s,i,n)}_filter(e,r,i){if(this._settings.unique){if(this._isDuplicateEntry(e))return!1;this._createIndexRecord(e)}if(this._onlyFileFilter(e)||this._onlyDirectoryFilter(e)||this._isSkippedByAbsoluteNegativePatterns(e,i))return!1;let n=this._settings.baseNameMatch?e.name:e.path;return this._isMatchToPatterns(n,r)&&!this._isMatchToPatterns(e.path,i)}_isDuplicateEntry(e){return this.index.has(e.path)}_createIndexRecord(e){this.index.set(e.path,void 0)}_onlyFileFilter(e){return this._settings.onlyFiles&&!e.dirent.isFile()}_onlyDirectoryFilter(e){return this._settings.onlyDirectories&&!e.dirent.isDirectory()}_isSkippedByAbsoluteNegativePatterns(e,r){if(!this._settings.absolute)return!1;let i=od.path.makeAbsolute(this._settings.cwd,e.path);return this._isMatchToPatterns(i,r)}_isMatchToPatterns(e,r){let i=od.path.removeLeadingDotSegment(e);return od.pattern.matchAny(i,r)}};Ok.default=AW});var uW=w(Mk=>{"use strict";Object.defineProperty(Mk,"__esModule",{value:!0});var rve=za(),cW=class{constructor(e){this._settings=e}getFilter(){return e=>this._isNonFatalError(e)}_isNonFatalError(e){return rve.errno.isEnoentCodeError(e)||this._settings.suppressErrors}};Mk.default=cW});var hW=w(Kk=>{"use strict";Object.defineProperty(Kk,"__esModule",{value:!0});var gW=za(),fW=class{constructor(e){this._settings=e}getTransformer(){return e=>this._transform(e)}_transform(e){let r=e.path;return this._settings.absolute&&(r=gW.path.makeAbsolute(this._settings.cwd,r),r=gW.path.unixify(r)),this._settings.markDirectories&&e.dirent.isDirectory()&&(r+="/"),this._settings.objectMode?Object.assign(Object.assign({},e),{path:r}):r}};Kk.default=fW});var tw=w(Uk=>{"use strict";Object.defineProperty(Uk,"__esModule",{value:!0});var ive=require("path"),nve=aW(),sve=lW(),ove=uW(),ave=hW(),pW=class{constructor(e){this._settings=e,this.errorFilter=new ove.default(this._settings),this.entryFilter=new sve.default(this._settings,this._getMicromatchOptions()),this.deepFilter=new nve.default(this._settings,this._getMicromatchOptions()),this.entryTransformer=new ave.default(this._settings)}_getRootDirectory(e){return ive.resolve(this._settings.cwd,e.base)}_getReaderOptions(e){let r=e.base==="."?"":e.base;return{basePath:r,pathSegmentSeparator:"/",concurrency:this._settings.concurrency,deepFilter:this.deepFilter.getFilter(r,e.positive,e.negative),entryFilter:this.entryFilter.getFilter(e.positive,e.negative),errorFilter:this.errorFilter.getFilter(),followSymbolicLinks:this._settings.followSymbolicLinks,fs:this._settings.fs,stats:this._settings.stats,throwErrorOnBrokenSymbolicLink:this._settings.throwErrorOnBrokenSymbolicLink,transform:this.entryTransformer.getTransformer()}}_getMicromatchOptions(){return{dot:this._settings.dot,matchBase:this._settings.baseNameMatch,nobrace:!this._settings.braceExpansion,nocase:!this._settings.caseSensitiveMatch,noext:!this._settings.extglob,noglobstar:!this._settings.globstar,posix:!0,strictSlashes:!1}}};Uk.default=pW});var CW=w(Hk=>{"use strict";Object.defineProperty(Hk,"__esModule",{value:!0});var Ave=Fk(),lve=tw(),dW=class extends lve.default{constructor(){super(...arguments);this._reader=new Ave.default(this._settings)}read(e){let r=this._getRootDirectory(e),i=this._getReaderOptions(e),n=[];return new Promise((s,o)=>{let a=this.api(r,e,i);a.once("error",o),a.on("data",l=>n.push(i.transform(l))),a.once("end",()=>s(n))})}api(e,r,i){return r.dynamic?this._reader.dynamic(e,i):this._reader.static(r.patterns,i)}};Hk.default=dW});var EW=w(Gk=>{"use strict";Object.defineProperty(Gk,"__esModule",{value:!0});var cve=require("stream"),uve=Fk(),gve=tw(),mW=class extends gve.default{constructor(){super(...arguments);this._reader=new uve.default(this._settings)}read(e){let r=this._getRootDirectory(e),i=this._getReaderOptions(e),n=this.api(r,e,i),s=new cve.Readable({objectMode:!0,read:()=>{}});return n.once("error",o=>s.emit("error",o)).on("data",o=>s.emit("data",i.transform(o))).once("end",()=>s.emit("end")),s.once("close",()=>n.destroy()),s}api(e,r,i){return r.dynamic?this._reader.dynamic(e,i):this._reader.static(r.patterns,i)}};Gk.default=mW});var yW=w(jk=>{"use strict";Object.defineProperty(jk,"__esModule",{value:!0});var fve=Nc(),hve=xk(),pve=Dk(),IW=class extends pve.default{constructor(){super(...arguments);this._walkSync=hve.walkSync,this._statSync=fve.statSync}dynamic(e,r){return this._walkSync(e,r)}static(e,r){let i=[];for(let n of e){let s=this._getFullEntryPath(n),o=this._getEntry(s,n,r);o===null||!r.entryFilter(o)||i.push(o)}return i}_getEntry(e,r,i){try{let n=this._getStat(e);return this._makeEntry(n,r)}catch(n){if(i.errorFilter(n))return null;throw n}}_getStat(e){return this._statSync(e,this._fsStatSettings)}};jk.default=IW});var BW=w(Yk=>{"use strict";Object.defineProperty(Yk,"__esModule",{value:!0});var dve=yW(),Cve=tw(),wW=class extends Cve.default{constructor(){super(...arguments);this._reader=new dve.default(this._settings)}read(e){let r=this._getRootDirectory(e),i=this._getReaderOptions(e);return this.api(r,e,i).map(i.transform)}api(e,r,i){return r.dynamic?this._reader.dynamic(e,i):this._reader.static(r.patterns,i)}};Yk.default=wW});var QW=w(ad=>{"use strict";Object.defineProperty(ad,"__esModule",{value:!0});var Kg=require("fs"),mve=require("os"),Eve=mve.cpus().length;ad.DEFAULT_FILE_SYSTEM_ADAPTER={lstat:Kg.lstat,lstatSync:Kg.lstatSync,stat:Kg.stat,statSync:Kg.statSync,readdir:Kg.readdir,readdirSync:Kg.readdirSync};var bW=class{constructor(e={}){this._options=e,this.absolute=this._getValue(this._options.absolute,!1),this.baseNameMatch=this._getValue(this._options.baseNameMatch,!1),this.braceExpansion=this._getValue(this._options.braceExpansion,!0),this.caseSensitiveMatch=this._getValue(this._options.caseSensitiveMatch,!0),this.concurrency=this._getValue(this._options.concurrency,Eve),this.cwd=this._getValue(this._options.cwd,process.cwd()),this.deep=this._getValue(this._options.deep,Infinity),this.dot=this._getValue(this._options.dot,!1),this.extglob=this._getValue(this._options.extglob,!0),this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!0),this.fs=this._getFileSystemMethods(this._options.fs),this.globstar=this._getValue(this._options.globstar,!0),this.ignore=this._getValue(this._options.ignore,[]),this.markDirectories=this._getValue(this._options.markDirectories,!1),this.objectMode=this._getValue(this._options.objectMode,!1),this.onlyDirectories=this._getValue(this._options.onlyDirectories,!1),this.onlyFiles=this._getValue(this._options.onlyFiles,!0),this.stats=this._getValue(this._options.stats,!1),this.suppressErrors=this._getValue(this._options.suppressErrors,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!1),this.unique=this._getValue(this._options.unique,!0),this.onlyDirectories&&(this.onlyFiles=!1),this.stats&&(this.objectMode=!0)}_getValue(e,r){return e===void 0?r:e}_getFileSystemMethods(e={}){return Object.assign(Object.assign({},ad.DEFAULT_FILE_SYSTEM_ADAPTER),e)}};ad.default=bW});var rw=w((jit,vW)=>{"use strict";var SW=a3(),Ive=CW(),yve=EW(),wve=BW(),qk=QW(),Lc=za();async function Wk(t,e){Ug(t);let r=Jk(t,Ive.default,e),i=await Promise.all(r);return Lc.array.flatten(i)}(function(t){function e(o,a){Ug(o);let l=Jk(o,wve.default,a);return Lc.array.flatten(l)}t.sync=e;function r(o,a){Ug(o);let l=Jk(o,yve.default,a);return Lc.stream.merge(l)}t.stream=r;function i(o,a){Ug(o);let l=[].concat(o),c=new qk.default(a);return SW.generate(l,c)}t.generateTasks=i;function n(o,a){Ug(o);let l=new qk.default(a);return Lc.pattern.isDynamicPattern(o,l)}t.isDynamicPattern=n;function s(o){return Ug(o),Lc.path.escape(o)}t.escapePath=s})(Wk||(Wk={}));function Jk(t,e,r){let i=[].concat(t),n=new qk.default(r),s=SW.generate(i,n),o=new e(n);return s.map(o.read,o)}function Ug(t){if(![].concat(t).every(i=>Lc.string.isString(i)&&!Lc.string.isEmpty(i)))throw new TypeError("Patterns must be a string (non empty) or an array of strings")}vW.exports=Wk});var xW=w(Tc=>{"use strict";var{promisify:Bve}=require("util"),kW=require("fs");async function zk(t,e,r){if(typeof r!="string")throw new TypeError(`Expected a string, got ${typeof r}`);try{return(await Bve(kW[t])(r))[e]()}catch(i){if(i.code==="ENOENT")return!1;throw i}}function _k(t,e,r){if(typeof r!="string")throw new TypeError(`Expected a string, got ${typeof r}`);try{return kW[t](r)[e]()}catch(i){if(i.code==="ENOENT")return!1;throw i}}Tc.isFile=zk.bind(null,"stat","isFile");Tc.isDirectory=zk.bind(null,"stat","isDirectory");Tc.isSymlink=zk.bind(null,"lstat","isSymbolicLink");Tc.isFileSync=_k.bind(null,"statSync","isFile");Tc.isDirectorySync=_k.bind(null,"statSync","isDirectory");Tc.isSymlinkSync=_k.bind(null,"lstatSync","isSymbolicLink")});var NW=w((qit,Vk)=>{"use strict";var Oc=require("path"),PW=xW(),DW=t=>t.length>1?`{${t.join(",")}}`:t[0],RW=(t,e)=>{let r=t[0]==="!"?t.slice(1):t;return Oc.isAbsolute(r)?r:Oc.join(e,r)},bve=(t,e)=>Oc.extname(t)?`**/${t}`:`**/${t}.${DW(e)}`,FW=(t,e)=>{if(e.files&&!Array.isArray(e.files))throw new TypeError(`Expected \`files\` to be of type \`Array\` but received type \`${typeof e.files}\``);if(e.extensions&&!Array.isArray(e.extensions))throw new TypeError(`Expected \`extensions\` to be of type \`Array\` but received type \`${typeof e.extensions}\``);return e.files&&e.extensions?e.files.map(r=>Oc.posix.join(t,bve(r,e.extensions))):e.files?e.files.map(r=>Oc.posix.join(t,`**/${r}`)):e.extensions?[Oc.posix.join(t,`**/*.${DW(e.extensions)}`)]:[Oc.posix.join(t,"**")]};Vk.exports=async(t,e)=>{if(e=N({cwd:process.cwd()},e),typeof e.cwd!="string")throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof e.cwd}\``);let r=await Promise.all([].concat(t).map(async i=>await PW.isDirectory(RW(i,e.cwd))?FW(i,e):i));return[].concat.apply([],r)};Vk.exports.sync=(t,e)=>{if(e=N({cwd:process.cwd()},e),typeof e.cwd!="string")throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof e.cwd}\``);let r=[].concat(t).map(i=>PW.isDirectorySync(RW(i,e.cwd))?FW(i,e):i);return[].concat.apply([],r)}});var YW=w((Jit,LW)=>{function TW(t){return Array.isArray(t)?t:[t]}var OW="",MW=" ",Xk="\\",Qve=/^\s+$/,vve=/^\\!/,Sve=/^\\#/,kve=/\r?\n/g,xve=/^\.*\/|^\.+$/,Zk="/",KW=typeof Symbol!="undefined"?Symbol.for("node-ignore"):"node-ignore",Pve=(t,e,r)=>Object.defineProperty(t,e,{value:r}),Dve=/([0-z])-([0-z])/g,Rve=t=>t.replace(Dve,(e,r,i)=>r.charCodeAt(0)<=i.charCodeAt(0)?e:OW),Fve=t=>{let{length:e}=t;return t.slice(0,e-e%2)},Nve=[[/\\?\s+$/,t=>t.indexOf("\\")===0?MW:OW],[/\\\s/g,()=>MW],[/[\\$.|*+(){^]/g,t=>`\\${t}`],[/(?!\\)\?/g,()=>"[^/]"],[/^\//,()=>"^"],[/\//g,()=>"\\/"],[/^\^*\\\*\\\*\\\//,()=>"^(?:.*\\/)?"],[/^(?=[^^])/,function(){return/\/(?!$)/.test(this)?"^":"(?:^|\\/)"}],[/\\\/\\\*\\\*(?=\\\/|$)/g,(t,e,r)=>e+6`${e}[^\\/]*`],[/\\\\\\(?=[$.|*+(){^])/g,()=>Xk],[/\\\\/g,()=>Xk],[/(\\)?\[([^\]/]*?)(\\*)($|\])/g,(t,e,r,i,n)=>e===Xk?`\\[${r}${Fve(i)}${n}`:n==="]"&&i.length%2==0?`[${Rve(r)}${i}]`:"[]"],[/(?:[^*])$/,t=>/\/$/.test(t)?`${t}$`:`${t}(?=$|\\/$)`],[/(\^|\\\/)?\\\*$/,(t,e)=>`${e?`${e}[^/]+`:"[^/]*"}(?=$|\\/$)`]],UW=Object.create(null),Lve=(t,e)=>{let r=UW[t];return r||(r=Nve.reduce((i,n)=>i.replace(n[0],n[1].bind(t)),t),UW[t]=r),e?new RegExp(r,"i"):new RegExp(r)},$k=t=>typeof t=="string",Tve=t=>t&&$k(t)&&!Qve.test(t)&&t.indexOf("#")!==0,Ove=t=>t.split(kve),HW=class{constructor(e,r,i,n){this.origin=e,this.pattern=r,this.negative=i,this.regex=n}},Mve=(t,e)=>{let r=t,i=!1;t.indexOf("!")===0&&(i=!0,t=t.substr(1)),t=t.replace(vve,"!").replace(Sve,"#");let n=Lve(t,e);return new HW(r,t,i,n)},Kve=(t,e)=>{throw new e(t)},Va=(t,e,r)=>$k(t)?t?Va.isNotRelative(t)?r(`path should be a \`path.relative()\`d string, but got "${e}"`,RangeError):!0:r("path must not be empty",TypeError):r(`path must be a string, but got \`${e}\``,TypeError),GW=t=>xve.test(t);Va.isNotRelative=GW;Va.convert=t=>t;var jW=class{constructor({ignorecase:e=!0}={}){Pve(this,KW,!0),this._rules=[],this._ignorecase=e,this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}_addPattern(e){if(e&&e[KW]){this._rules=this._rules.concat(e._rules),this._added=!0;return}if(Tve(e)){let r=Mve(e,this._ignorecase);this._added=!0,this._rules.push(r)}}add(e){return this._added=!1,TW($k(e)?Ove(e):e).forEach(this._addPattern,this),this._added&&this._initCache(),this}addPattern(e){return this.add(e)}_testOne(e,r){let i=!1,n=!1;return this._rules.forEach(s=>{let{negative:o}=s;if(n===o&&i!==n||o&&!i&&!n&&!r)return;s.regex.test(e)&&(i=!o,n=o)}),{ignored:i,unignored:n}}_test(e,r,i,n){let s=e&&Va.convert(e);return Va(s,e,Kve),this._t(s,r,i,n)}_t(e,r,i,n){if(e in r)return r[e];if(n||(n=e.split(Zk)),n.pop(),!n.length)return r[e]=this._testOne(e,i);let s=this._t(n.join(Zk)+Zk,r,i,n);return r[e]=s.ignored?s:this._testOne(e,i)}ignores(e){return this._test(e,this._ignoreCache,!1).ignored}createFilter(){return e=>!this.ignores(e)}filter(e){return TW(e).filter(this.createFilter())}test(e){return this._test(e,this._testCache,!0)}},iw=t=>new jW(t),Uve=()=>!1,Hve=t=>Va(t&&Va.convert(t),t,Uve);iw.isPathValid=Hve;iw.default=iw;LW.exports=iw;if(typeof process!="undefined"&&(process.env&&process.env.IGNORE_TEST_WIN32||process.platform==="win32")){let t=r=>/^\\\\\?\\/.test(r)||/["<>|\u0000-\u001F]+/u.test(r)?r:r.replace(/\\/g,"/");Va.convert=t;let e=/^[a-z]:\//i;Va.isNotRelative=r=>e.test(r)||GW(r)}});var JW=w((Wit,qW)=>{"use strict";qW.exports=t=>{let e=/^\\\\\?\\/.test(t),r=/[^\u0000-\u0080]+/.test(t);return e||r?t:t.replace(/\\/g,"/")}});var $W=w((zit,ex)=>{"use strict";var{promisify:Gve}=require("util"),WW=require("fs"),Xa=require("path"),zW=rw(),jve=YW(),Ad=JW(),_W=["**/node_modules/**","**/flow-typed/**","**/coverage/**","**/.git"],Yve=Gve(WW.readFile),qve=t=>e=>e.startsWith("!")?"!"+Xa.posix.join(t,e.slice(1)):Xa.posix.join(t,e),Jve=(t,e)=>{let r=Ad(Xa.relative(e.cwd,Xa.dirname(e.fileName)));return t.split(/\r?\n/).filter(Boolean).filter(i=>!i.startsWith("#")).map(qve(r))},VW=t=>{let e=jve();for(let r of t)e.add(Jve(r.content,{cwd:r.cwd,fileName:r.filePath}));return e},Wve=(t,e)=>{if(t=Ad(t),Xa.isAbsolute(e)){if(Ad(e).startsWith(t))return e;throw new Error(`Path ${e} is not in cwd ${t}`)}return Xa.join(t,e)},XW=(t,e)=>r=>t.ignores(Ad(Xa.relative(e,Wve(e,r.path||r)))),zve=async(t,e)=>{let r=Xa.join(e,t),i=await Yve(r,"utf8");return{cwd:e,filePath:r,content:i}},_ve=(t,e)=>{let r=Xa.join(e,t),i=WW.readFileSync(r,"utf8");return{cwd:e,filePath:r,content:i}},ZW=({ignore:t=[],cwd:e=Ad(process.cwd())}={})=>({ignore:t,cwd:e});ex.exports=async t=>{t=ZW(t);let e=await zW("**/.gitignore",{ignore:_W.concat(t.ignore),cwd:t.cwd}),r=await Promise.all(e.map(n=>zve(n,t.cwd))),i=VW(r);return XW(i,t.cwd)};ex.exports.sync=t=>{t=ZW(t);let r=zW.sync("**/.gitignore",{ignore:_W.concat(t.ignore),cwd:t.cwd}).map(n=>_ve(n,t.cwd)),i=VW(r);return XW(i,t.cwd)}});var i8=w((_it,e8)=>{"use strict";var{Transform:Vve}=require("stream"),tx=class extends Vve{constructor(){super({objectMode:!0})}},t8=class extends tx{constructor(e){super();this._filter=e}_transform(e,r,i){this._filter(e)&&this.push(e),i()}},r8=class extends tx{constructor(){super();this._pushed=new Set}_transform(e,r,i){this._pushed.has(e)||(this.push(e),this._pushed.add(e)),i()}};e8.exports={FilterStream:t8,UniqueStream:r8}});var sx=w((Vit,Mc)=>{"use strict";var n8=require("fs"),nw=xJ(),Xve=ek(),sw=rw(),ow=NW(),rx=$W(),{FilterStream:Zve,UniqueStream:$ve}=i8(),s8=()=>!1,o8=t=>t[0]==="!",eSe=t=>{if(!t.every(e=>typeof e=="string"))throw new TypeError("Patterns must be a string or an array of strings")},tSe=(t={})=>{if(!t.cwd)return;let e;try{e=n8.statSync(t.cwd)}catch{return}if(!e.isDirectory())throw new Error("The `cwd` option must be a path to a directory")},rSe=t=>t.stats instanceof n8.Stats?t.path:t,aw=(t,e)=>{t=nw([].concat(t)),eSe(t),tSe(e);let r=[];e=N({ignore:[],expandDirectories:!0},e);for(let[i,n]of t.entries()){if(o8(n))continue;let s=t.slice(i).filter(a=>o8(a)).map(a=>a.slice(1)),o=ie(N({},e),{ignore:e.ignore.concat(s)});r.push({pattern:n,options:o})}return r},iSe=(t,e)=>{let r={};return t.options.cwd&&(r.cwd=t.options.cwd),Array.isArray(t.options.expandDirectories)?r=ie(N({},r),{files:t.options.expandDirectories}):typeof t.options.expandDirectories=="object"&&(r=N(N({},r),t.options.expandDirectories)),e(t.pattern,r)},ix=(t,e)=>t.options.expandDirectories?iSe(t,e):[t.pattern],a8=t=>t&&t.gitignore?rx.sync({cwd:t.cwd,ignore:t.ignore}):s8,nx=t=>e=>{let{options:r}=t;return r.ignore&&Array.isArray(r.ignore)&&r.expandDirectories&&(r.ignore=ow.sync(r.ignore)),{pattern:e,options:r}};Mc.exports=async(t,e)=>{let r=aw(t,e),i=async()=>e&&e.gitignore?rx({cwd:e.cwd,ignore:e.ignore}):s8,n=async()=>{let l=await Promise.all(r.map(async c=>{let u=await ix(c,ow);return Promise.all(u.map(nx(c)))}));return nw(...l)},[s,o]=await Promise.all([i(),n()]),a=await Promise.all(o.map(l=>sw(l.pattern,l.options)));return nw(...a).filter(l=>!s(rSe(l)))};Mc.exports.sync=(t,e)=>{let r=aw(t,e),i=[];for(let o of r){let a=ix(o,ow.sync).map(nx(o));i.push(...a)}let n=a8(e),s=[];for(let o of i)s=nw(s,sw.sync(o.pattern,o.options));return s.filter(o=>!n(o))};Mc.exports.stream=(t,e)=>{let r=aw(t,e),i=[];for(let a of r){let l=ix(a,ow.sync).map(nx(a));i.push(...l)}let n=a8(e),s=new Zve(a=>!n(a)),o=new $ve;return Xve(i.map(a=>sw.stream(a.pattern,a.options))).pipe(s).pipe(o)};Mc.exports.generateGlobTasks=aw;Mc.exports.hasMagic=(t,e)=>[].concat(t).some(r=>sw.isDynamicPattern(r,e));Mc.exports.gitignore=rx});var Rn=w((Bnt,w8)=>{function dSe(t){var e=typeof t;return t!=null&&(e=="object"||e=="function")}w8.exports=dSe});var hx=w((bnt,B8)=>{var CSe=typeof global=="object"&&global&&global.Object===Object&&global;B8.exports=CSe});var Fs=w((Qnt,b8)=>{var mSe=hx(),ESe=typeof self=="object"&&self&&self.Object===Object&&self,ISe=mSe||ESe||Function("return this")();b8.exports=ISe});var v8=w((vnt,Q8)=>{var ySe=Fs(),wSe=function(){return ySe.Date.now()};Q8.exports=wSe});var k8=w((Snt,S8)=>{var BSe=/\s/;function bSe(t){for(var e=t.length;e--&&BSe.test(t.charAt(e)););return e}S8.exports=bSe});var P8=w((knt,x8)=>{var QSe=k8(),vSe=/^\s+/;function SSe(t){return t&&t.slice(0,QSe(t)+1).replace(vSe,"")}x8.exports=SSe});var Hc=w((xnt,D8)=>{var kSe=Fs(),xSe=kSe.Symbol;D8.exports=xSe});var L8=w((Pnt,R8)=>{var F8=Hc(),N8=Object.prototype,PSe=N8.hasOwnProperty,DSe=N8.toString,Id=F8?F8.toStringTag:void 0;function RSe(t){var e=PSe.call(t,Id),r=t[Id];try{t[Id]=void 0;var i=!0}catch(s){}var n=DSe.call(t);return i&&(e?t[Id]=r:delete t[Id]),n}R8.exports=RSe});var O8=w((Dnt,T8)=>{var FSe=Object.prototype,NSe=FSe.toString;function LSe(t){return NSe.call(t)}T8.exports=LSe});var Gc=w((Rnt,M8)=>{var K8=Hc(),TSe=L8(),OSe=O8(),MSe="[object Null]",KSe="[object Undefined]",U8=K8?K8.toStringTag:void 0;function USe(t){return t==null?t===void 0?KSe:MSe:U8&&U8 in Object(t)?TSe(t):OSe(t)}M8.exports=USe});var Zo=w((Fnt,H8)=>{function HSe(t){return t!=null&&typeof t=="object"}H8.exports=HSe});var yd=w((Nnt,G8)=>{var GSe=Gc(),jSe=Zo(),YSe="[object Symbol]";function qSe(t){return typeof t=="symbol"||jSe(t)&&GSe(t)==YSe}G8.exports=qSe});var J8=w((Lnt,j8)=>{var JSe=P8(),Y8=Rn(),WSe=yd(),q8=0/0,zSe=/^[-+]0x[0-9a-f]+$/i,_Se=/^0b[01]+$/i,VSe=/^0o[0-7]+$/i,XSe=parseInt;function ZSe(t){if(typeof t=="number")return t;if(WSe(t))return q8;if(Y8(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=Y8(e)?e+"":e}if(typeof t!="string")return t===0?t:+t;t=JSe(t);var r=_Se.test(t);return r||VSe.test(t)?XSe(t.slice(2),r?2:8):zSe.test(t)?q8:+t}j8.exports=ZSe});var _8=w((Tnt,W8)=>{var $Se=Rn(),px=v8(),z8=J8(),eke="Expected a function",tke=Math.max,rke=Math.min;function ike(t,e,r){var i,n,s,o,a,l,c=0,u=!1,g=!1,f=!0;if(typeof t!="function")throw new TypeError(eke);e=z8(e)||0,$Se(r)&&(u=!!r.leading,g="maxWait"in r,s=g?tke(z8(r.maxWait)||0,e):s,f="trailing"in r?!!r.trailing:f);function h(j){var Z=i,J=n;return i=n=void 0,c=j,o=t.apply(J,Z),o}function p(j){return c=j,a=setTimeout(b,e),u?h(j):o}function m(j){var Z=j-l,J=j-c,re=e-Z;return g?rke(re,s-J):re}function y(j){var Z=j-l,J=j-c;return l===void 0||Z>=e||Z<0||g&&J>=s}function b(){var j=px();if(y(j))return S(j);a=setTimeout(b,m(j))}function S(j){return a=void 0,f&&i?h(j):(i=n=void 0,o)}function k(){a!==void 0&&clearTimeout(a),c=0,i=l=n=a=void 0}function T(){return a===void 0?o:S(px())}function Y(){var j=px(),Z=y(j);if(i=arguments,n=this,l=j,Z){if(a===void 0)return p(l);if(g)return clearTimeout(a),a=setTimeout(b,e),h(l)}return a===void 0&&(a=setTimeout(b,e)),o}return Y.cancel=k,Y.flush=T,Y}W8.exports=ike});var X8=w((Ont,V8)=>{var nke=_8(),ske=Rn(),oke="Expected a function";function ake(t,e,r){var i=!0,n=!0;if(typeof t!="function")throw new TypeError(oke);return ske(r)&&(i="leading"in r?!!r.leading:i,n="trailing"in r?!!r.trailing:n),nke(t,e,{leading:i,maxWait:e,trailing:n})}V8.exports=ake});var eA=w(($a,Sw)=>{"use strict";Object.defineProperty($a,"__esModule",{value:!0});var s4=["Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","BigInt64Array","BigUint64Array"];function Ike(t){return s4.includes(t)}var yke=["Function","Generator","AsyncGenerator","GeneratorFunction","AsyncGeneratorFunction","AsyncFunction","Observable","Array","Buffer","Object","RegExp","Date","Error","Map","Set","WeakMap","WeakSet","ArrayBuffer","SharedArrayBuffer","DataView","Promise","URL","FormData","URLSearchParams","HTMLElement",...s4];function wke(t){return yke.includes(t)}var Bke=["null","undefined","string","number","bigint","boolean","symbol"];function bke(t){return Bke.includes(t)}function zg(t){return e=>typeof e===t}var{toString:o4}=Object.prototype,kd=t=>{let e=o4.call(t).slice(8,-1);if(/HTML\w+Element/.test(e)&&z.domElement(t))return"HTMLElement";if(wke(e))return e},hr=t=>e=>kd(e)===t;function z(t){if(t===null)return"null";switch(typeof t){case"undefined":return"undefined";case"string":return"string";case"number":return"number";case"boolean":return"boolean";case"function":return"Function";case"bigint":return"bigint";case"symbol":return"symbol";default:}if(z.observable(t))return"Observable";if(z.array(t))return"Array";if(z.buffer(t))return"Buffer";let e=kd(t);if(e)return e;if(t instanceof String||t instanceof Boolean||t instanceof Number)throw new TypeError("Please don't use object wrappers for primitive types");return"Object"}z.undefined=zg("undefined");z.string=zg("string");var Qke=zg("number");z.number=t=>Qke(t)&&!z.nan(t);z.bigint=zg("bigint");z.function_=zg("function");z.null_=t=>t===null;z.class_=t=>z.function_(t)&&t.toString().startsWith("class ");z.boolean=t=>t===!0||t===!1;z.symbol=zg("symbol");z.numericString=t=>z.string(t)&&!z.emptyStringOrWhitespace(t)&&!Number.isNaN(Number(t));z.array=(t,e)=>Array.isArray(t)?z.function_(e)?t.every(e):!0:!1;z.buffer=t=>{var e,r,i,n;return(n=(i=(r=(e=t)===null||e===void 0?void 0:e.constructor)===null||r===void 0?void 0:r.isBuffer)===null||i===void 0?void 0:i.call(r,t))!==null&&n!==void 0?n:!1};z.nullOrUndefined=t=>z.null_(t)||z.undefined(t);z.object=t=>!z.null_(t)&&(typeof t=="object"||z.function_(t));z.iterable=t=>{var e;return z.function_((e=t)===null||e===void 0?void 0:e[Symbol.iterator])};z.asyncIterable=t=>{var e;return z.function_((e=t)===null||e===void 0?void 0:e[Symbol.asyncIterator])};z.generator=t=>z.iterable(t)&&z.function_(t.next)&&z.function_(t.throw);z.asyncGenerator=t=>z.asyncIterable(t)&&z.function_(t.next)&&z.function_(t.throw);z.nativePromise=t=>hr("Promise")(t);var vke=t=>{var e,r;return z.function_((e=t)===null||e===void 0?void 0:e.then)&&z.function_((r=t)===null||r===void 0?void 0:r.catch)};z.promise=t=>z.nativePromise(t)||vke(t);z.generatorFunction=hr("GeneratorFunction");z.asyncGeneratorFunction=t=>kd(t)==="AsyncGeneratorFunction";z.asyncFunction=t=>kd(t)==="AsyncFunction";z.boundFunction=t=>z.function_(t)&&!t.hasOwnProperty("prototype");z.regExp=hr("RegExp");z.date=hr("Date");z.error=hr("Error");z.map=t=>hr("Map")(t);z.set=t=>hr("Set")(t);z.weakMap=t=>hr("WeakMap")(t);z.weakSet=t=>hr("WeakSet")(t);z.int8Array=hr("Int8Array");z.uint8Array=hr("Uint8Array");z.uint8ClampedArray=hr("Uint8ClampedArray");z.int16Array=hr("Int16Array");z.uint16Array=hr("Uint16Array");z.int32Array=hr("Int32Array");z.uint32Array=hr("Uint32Array");z.float32Array=hr("Float32Array");z.float64Array=hr("Float64Array");z.bigInt64Array=hr("BigInt64Array");z.bigUint64Array=hr("BigUint64Array");z.arrayBuffer=hr("ArrayBuffer");z.sharedArrayBuffer=hr("SharedArrayBuffer");z.dataView=hr("DataView");z.directInstanceOf=(t,e)=>Object.getPrototypeOf(t)===e.prototype;z.urlInstance=t=>hr("URL")(t);z.urlString=t=>{if(!z.string(t))return!1;try{return new URL(t),!0}catch(e){return!1}};z.truthy=t=>Boolean(t);z.falsy=t=>!t;z.nan=t=>Number.isNaN(t);z.primitive=t=>z.null_(t)||bke(typeof t);z.integer=t=>Number.isInteger(t);z.safeInteger=t=>Number.isSafeInteger(t);z.plainObject=t=>{if(o4.call(t)!=="[object Object]")return!1;let e=Object.getPrototypeOf(t);return e===null||e===Object.getPrototypeOf({})};z.typedArray=t=>Ike(kd(t));var Ske=t=>z.safeInteger(t)&&t>=0;z.arrayLike=t=>!z.nullOrUndefined(t)&&!z.function_(t)&&Ske(t.length);z.inRange=(t,e)=>{if(z.number(e))return t>=Math.min(0,e)&&t<=Math.max(e,0);if(z.array(e)&&e.length===2)return t>=Math.min(...e)&&t<=Math.max(...e);throw new TypeError(`Invalid range: ${JSON.stringify(e)}`)};var kke=1,xke=["innerHTML","ownerDocument","style","attributes","nodeValue"];z.domElement=t=>z.object(t)&&t.nodeType===kke&&z.string(t.nodeName)&&!z.plainObject(t)&&xke.every(e=>e in t);z.observable=t=>{var e,r,i,n;return t?t===((r=(e=t)[Symbol.observable])===null||r===void 0?void 0:r.call(e))||t===((n=(i=t)["@@observable"])===null||n===void 0?void 0:n.call(i)):!1};z.nodeStream=t=>z.object(t)&&z.function_(t.pipe)&&!z.observable(t);z.infinite=t=>t===Infinity||t===-Infinity;var a4=t=>e=>z.integer(e)&&Math.abs(e%2)===t;z.evenInteger=a4(0);z.oddInteger=a4(1);z.emptyArray=t=>z.array(t)&&t.length===0;z.nonEmptyArray=t=>z.array(t)&&t.length>0;z.emptyString=t=>z.string(t)&&t.length===0;z.nonEmptyString=t=>z.string(t)&&t.length>0;var Pke=t=>z.string(t)&&!/\S/.test(t);z.emptyStringOrWhitespace=t=>z.emptyString(t)||Pke(t);z.emptyObject=t=>z.object(t)&&!z.map(t)&&!z.set(t)&&Object.keys(t).length===0;z.nonEmptyObject=t=>z.object(t)&&!z.map(t)&&!z.set(t)&&Object.keys(t).length>0;z.emptySet=t=>z.set(t)&&t.size===0;z.nonEmptySet=t=>z.set(t)&&t.size>0;z.emptyMap=t=>z.map(t)&&t.size===0;z.nonEmptyMap=t=>z.map(t)&&t.size>0;z.propertyKey=t=>z.any([z.string,z.number,z.symbol],t);z.formData=t=>hr("FormData")(t);z.urlSearchParams=t=>hr("URLSearchParams")(t);var A4=(t,e,r)=>{if(!z.function_(e))throw new TypeError(`Invalid predicate: ${JSON.stringify(e)}`);if(r.length===0)throw new TypeError("Invalid number of values");return t.call(r,e)};z.any=(t,...e)=>(z.array(t)?t:[t]).some(i=>A4(Array.prototype.some,i,e));z.all=(t,...e)=>A4(Array.prototype.every,t,e);var We=(t,e,r,i={})=>{if(!t){let{multipleValues:n}=i,s=n?`received values of types ${[...new Set(r.map(o=>`\`${z(o)}\``))].join(", ")}`:`received value of type \`${z(r)}\``;throw new TypeError(`Expected value which is \`${e}\`, ${s}.`)}};$a.assert={undefined:t=>We(z.undefined(t),"undefined",t),string:t=>We(z.string(t),"string",t),number:t=>We(z.number(t),"number",t),bigint:t=>We(z.bigint(t),"bigint",t),function_:t=>We(z.function_(t),"Function",t),null_:t=>We(z.null_(t),"null",t),class_:t=>We(z.class_(t),"Class",t),boolean:t=>We(z.boolean(t),"boolean",t),symbol:t=>We(z.symbol(t),"symbol",t),numericString:t=>We(z.numericString(t),"string with a number",t),array:(t,e)=>{We(z.array(t),"Array",t),e&&t.forEach(e)},buffer:t=>We(z.buffer(t),"Buffer",t),nullOrUndefined:t=>We(z.nullOrUndefined(t),"null or undefined",t),object:t=>We(z.object(t),"Object",t),iterable:t=>We(z.iterable(t),"Iterable",t),asyncIterable:t=>We(z.asyncIterable(t),"AsyncIterable",t),generator:t=>We(z.generator(t),"Generator",t),asyncGenerator:t=>We(z.asyncGenerator(t),"AsyncGenerator",t),nativePromise:t=>We(z.nativePromise(t),"native Promise",t),promise:t=>We(z.promise(t),"Promise",t),generatorFunction:t=>We(z.generatorFunction(t),"GeneratorFunction",t),asyncGeneratorFunction:t=>We(z.asyncGeneratorFunction(t),"AsyncGeneratorFunction",t),asyncFunction:t=>We(z.asyncFunction(t),"AsyncFunction",t),boundFunction:t=>We(z.boundFunction(t),"Function",t),regExp:t=>We(z.regExp(t),"RegExp",t),date:t=>We(z.date(t),"Date",t),error:t=>We(z.error(t),"Error",t),map:t=>We(z.map(t),"Map",t),set:t=>We(z.set(t),"Set",t),weakMap:t=>We(z.weakMap(t),"WeakMap",t),weakSet:t=>We(z.weakSet(t),"WeakSet",t),int8Array:t=>We(z.int8Array(t),"Int8Array",t),uint8Array:t=>We(z.uint8Array(t),"Uint8Array",t),uint8ClampedArray:t=>We(z.uint8ClampedArray(t),"Uint8ClampedArray",t),int16Array:t=>We(z.int16Array(t),"Int16Array",t),uint16Array:t=>We(z.uint16Array(t),"Uint16Array",t),int32Array:t=>We(z.int32Array(t),"Int32Array",t),uint32Array:t=>We(z.uint32Array(t),"Uint32Array",t),float32Array:t=>We(z.float32Array(t),"Float32Array",t),float64Array:t=>We(z.float64Array(t),"Float64Array",t),bigInt64Array:t=>We(z.bigInt64Array(t),"BigInt64Array",t),bigUint64Array:t=>We(z.bigUint64Array(t),"BigUint64Array",t),arrayBuffer:t=>We(z.arrayBuffer(t),"ArrayBuffer",t),sharedArrayBuffer:t=>We(z.sharedArrayBuffer(t),"SharedArrayBuffer",t),dataView:t=>We(z.dataView(t),"DataView",t),urlInstance:t=>We(z.urlInstance(t),"URL",t),urlString:t=>We(z.urlString(t),"string with a URL",t),truthy:t=>We(z.truthy(t),"truthy",t),falsy:t=>We(z.falsy(t),"falsy",t),nan:t=>We(z.nan(t),"NaN",t),primitive:t=>We(z.primitive(t),"primitive",t),integer:t=>We(z.integer(t),"integer",t),safeInteger:t=>We(z.safeInteger(t),"integer",t),plainObject:t=>We(z.plainObject(t),"plain object",t),typedArray:t=>We(z.typedArray(t),"TypedArray",t),arrayLike:t=>We(z.arrayLike(t),"array-like",t),domElement:t=>We(z.domElement(t),"HTMLElement",t),observable:t=>We(z.observable(t),"Observable",t),nodeStream:t=>We(z.nodeStream(t),"Node.js Stream",t),infinite:t=>We(z.infinite(t),"infinite number",t),emptyArray:t=>We(z.emptyArray(t),"empty array",t),nonEmptyArray:t=>We(z.nonEmptyArray(t),"non-empty array",t),emptyString:t=>We(z.emptyString(t),"empty string",t),nonEmptyString:t=>We(z.nonEmptyString(t),"non-empty string",t),emptyStringOrWhitespace:t=>We(z.emptyStringOrWhitespace(t),"empty string or whitespace",t),emptyObject:t=>We(z.emptyObject(t),"empty object",t),nonEmptyObject:t=>We(z.nonEmptyObject(t),"non-empty object",t),emptySet:t=>We(z.emptySet(t),"empty set",t),nonEmptySet:t=>We(z.nonEmptySet(t),"non-empty set",t),emptyMap:t=>We(z.emptyMap(t),"empty map",t),nonEmptyMap:t=>We(z.nonEmptyMap(t),"non-empty map",t),propertyKey:t=>We(z.propertyKey(t),"PropertyKey",t),formData:t=>We(z.formData(t),"FormData",t),urlSearchParams:t=>We(z.urlSearchParams(t),"URLSearchParams",t),evenInteger:t=>We(z.evenInteger(t),"even integer",t),oddInteger:t=>We(z.oddInteger(t),"odd integer",t),directInstanceOf:(t,e)=>We(z.directInstanceOf(t,e),"T",t),inRange:(t,e)=>We(z.inRange(t,e),"in range",t),any:(t,...e)=>We(z.any(t,...e),"predicate returns truthy for any value",e,{multipleValues:!0}),all:(t,...e)=>We(z.all(t,...e),"predicate returns truthy for all values",e,{multipleValues:!0})};Object.defineProperties(z,{class:{value:z.class_},function:{value:z.function_},null:{value:z.null_}});Object.defineProperties($a.assert,{class:{value:$a.assert.class_},function:{value:$a.assert.function_},null:{value:$a.assert.null_}});$a.default=z;Sw.exports=z;Sw.exports.default=z;Sw.exports.assert=$a.assert});var l4=w((Gst,Lx)=>{"use strict";var Tx=class extends Error{constructor(e){super(e||"Promise was canceled");this.name="CancelError"}get isCanceled(){return!0}},xd=class{static fn(e){return(...r)=>new xd((i,n,s)=>{r.push(s),e(...r).then(i,n)})}constructor(e){this._cancelHandlers=[],this._isPending=!0,this._isCanceled=!1,this._rejectOnCancel=!0,this._promise=new Promise((r,i)=>{this._reject=i;let n=a=>{this._isPending=!1,r(a)},s=a=>{this._isPending=!1,i(a)},o=a=>{if(!this._isPending)throw new Error("The `onCancel` handler was attached after the promise settled.");this._cancelHandlers.push(a)};return Object.defineProperties(o,{shouldReject:{get:()=>this._rejectOnCancel,set:a=>{this._rejectOnCancel=a}}}),e(n,s,o)})}then(e,r){return this._promise.then(e,r)}catch(e){return this._promise.catch(e)}finally(e){return this._promise.finally(e)}cancel(e){if(!(!this._isPending||this._isCanceled)){if(this._cancelHandlers.length>0)try{for(let r of this._cancelHandlers)r()}catch(r){this._reject(r)}this._isCanceled=!0,this._rejectOnCancel&&this._reject(new Tx(e))}}get isCanceled(){return this._isCanceled}};Object.setPrototypeOf(xd.prototype,Promise.prototype);Lx.exports=xd;Lx.exports.CancelError=Tx});var c4=w((Ox,Mx)=>{"use strict";Object.defineProperty(Ox,"__esModule",{value:!0});var Dke=require("tls"),Kx=(t,e)=>{let r;typeof e=="function"?r={connect:e}:r=e;let i=typeof r.connect=="function",n=typeof r.secureConnect=="function",s=typeof r.close=="function",o=()=>{i&&r.connect(),t instanceof Dke.TLSSocket&&n&&(t.authorized?r.secureConnect():t.authorizationError||t.once("secureConnect",r.secureConnect)),s&&t.once("close",r.close)};t.writable&&!t.connecting?o():t.connecting?t.once("connect",o):t.destroyed&&s&&r.close(t._hadError)};Ox.default=Kx;Mx.exports=Kx;Mx.exports.default=Kx});var u4=w((Ux,Hx)=>{"use strict";Object.defineProperty(Ux,"__esModule",{value:!0});var Rke=c4(),Fke=Number(process.versions.node.split(".")[0]),Gx=t=>{let e={start:Date.now(),socket:void 0,lookup:void 0,connect:void 0,secureConnect:void 0,upload:void 0,response:void 0,end:void 0,error:void 0,abort:void 0,phases:{wait:void 0,dns:void 0,tcp:void 0,tls:void 0,request:void 0,firstByte:void 0,download:void 0,total:void 0}};t.timings=e;let r=o=>{let a=o.emit.bind(o);o.emit=(l,...c)=>(l==="error"&&(e.error=Date.now(),e.phases.total=e.error-e.start,o.emit=a),a(l,...c))};r(t),t.prependOnceListener("abort",()=>{e.abort=Date.now(),(!e.response||Fke>=13)&&(e.phases.total=Date.now()-e.start)});let i=o=>{e.socket=Date.now(),e.phases.wait=e.socket-e.start;let a=()=>{e.lookup=Date.now(),e.phases.dns=e.lookup-e.socket};o.prependOnceListener("lookup",a),Rke.default(o,{connect:()=>{e.connect=Date.now(),e.lookup===void 0&&(o.removeListener("lookup",a),e.lookup=e.connect,e.phases.dns=e.lookup-e.socket),e.phases.tcp=e.connect-e.lookup},secureConnect:()=>{e.secureConnect=Date.now(),e.phases.tls=e.secureConnect-e.connect}})};t.socket?i(t.socket):t.prependOnceListener("socket",i);let n=()=>{var o;e.upload=Date.now(),e.phases.request=e.upload-(o=e.secureConnect,o!=null?o:e.connect)};return(()=>typeof t.writableFinished=="boolean"?t.writableFinished:t.finished&&t.outputSize===0&&(!t.socket||t.socket.writableLength===0))()?n():t.prependOnceListener("finish",n),t.prependOnceListener("response",o=>{e.response=Date.now(),e.phases.firstByte=e.response-e.upload,o.timings=e,r(o),o.prependOnceListener("end",()=>{e.end=Date.now(),e.phases.download=e.end-e.response,e.phases.total=e.end-e.start})}),e};Ux.default=Gx;Hx.exports=Gx;Hx.exports.default=Gx});var m4=w((jst,jx)=>{"use strict";var{V4MAPPED:Nke,ADDRCONFIG:Lke,ALL:g4,promises:{Resolver:f4},lookup:Tke}=require("dns"),{promisify:Yx}=require("util"),Oke=require("os"),_g=Symbol("cacheableLookupCreateConnection"),qx=Symbol("cacheableLookupInstance"),h4=Symbol("expires"),Mke=typeof g4=="number",p4=t=>{if(!(t&&typeof t.createConnection=="function"))throw new Error("Expected an Agent instance as the first argument")},Kke=t=>{for(let e of t)e.family!==6&&(e.address=`::ffff:${e.address}`,e.family=6)},d4=()=>{let t=!1,e=!1;for(let r of Object.values(Oke.networkInterfaces()))for(let i of r)if(!i.internal&&(i.family==="IPv6"?e=!0:t=!0,t&&e))return{has4:t,has6:e};return{has4:t,has6:e}},Uke=t=>Symbol.iterator in t,C4={ttl:!0},Hke={all:!0},Jx=class{constructor({cache:e=new Map,maxTtl:r=Infinity,fallbackDuration:i=3600,errorTtl:n=.15,resolver:s=new f4,lookup:o=Tke}={}){if(this.maxTtl=r,this.errorTtl=n,this._cache=e,this._resolver=s,this._dnsLookup=Yx(o),this._resolver instanceof f4?(this._resolve4=this._resolver.resolve4.bind(this._resolver),this._resolve6=this._resolver.resolve6.bind(this._resolver)):(this._resolve4=Yx(this._resolver.resolve4.bind(this._resolver)),this._resolve6=Yx(this._resolver.resolve6.bind(this._resolver))),this._iface=d4(),this._pending={},this._nextRemovalTime=!1,this._hostnamesToFallback=new Set,i<1)this._fallback=!1;else{this._fallback=!0;let a=setInterval(()=>{this._hostnamesToFallback.clear()},i*1e3);a.unref&&a.unref()}this.lookup=this.lookup.bind(this),this.lookupAsync=this.lookupAsync.bind(this)}set servers(e){this.clear(),this._resolver.setServers(e)}get servers(){return this._resolver.getServers()}lookup(e,r,i){if(typeof r=="function"?(i=r,r={}):typeof r=="number"&&(r={family:r}),!i)throw new Error("Callback must be a function.");this.lookupAsync(e,r).then(n=>{r.all?i(null,n):i(null,n.address,n.family,n.expires,n.ttl)},i)}async lookupAsync(e,r={}){typeof r=="number"&&(r={family:r});let i=await this.query(e);if(r.family===6){let n=i.filter(s=>s.family===6);r.hints&Nke&&(Mke&&r.hints&g4||n.length===0)?Kke(i):i=n}else r.family===4&&(i=i.filter(n=>n.family===4));if(r.hints&Lke){let{_iface:n}=this;i=i.filter(s=>s.family===6?n.has6:n.has4)}if(i.length===0){let n=new Error(`cacheableLookup ENOTFOUND ${e}`);throw n.code="ENOTFOUND",n.hostname=e,n}return r.all?i:i[0]}async query(e){let r=await this._cache.get(e);if(!r){let i=this._pending[e];if(i)r=await i;else{let n=this.queryAndCache(e);this._pending[e]=n,r=await n}}return r=r.map(i=>N({},i)),r}async _resolve(e){let r=async c=>{try{return await c}catch(u){if(u.code==="ENODATA"||u.code==="ENOTFOUND")return[];throw u}},[i,n]=await Promise.all([this._resolve4(e,C4),this._resolve6(e,C4)].map(c=>r(c))),s=0,o=0,a=0,l=Date.now();for(let c of i)c.family=4,c.expires=l+c.ttl*1e3,s=Math.max(s,c.ttl);for(let c of n)c.family=6,c.expires=l+c.ttl*1e3,o=Math.max(o,c.ttl);return i.length>0?n.length>0?a=Math.min(s,o):a=s:a=o,{entries:[...i,...n],cacheTtl:a}}async _lookup(e){try{return{entries:await this._dnsLookup(e,{all:!0}),cacheTtl:0}}catch(r){return{entries:[],cacheTtl:0}}}async _set(e,r,i){if(this.maxTtl>0&&i>0){i=Math.min(i,this.maxTtl)*1e3,r[h4]=Date.now()+i;try{await this._cache.set(e,r,i)}catch(n){this.lookupAsync=async()=>{let s=new Error("Cache Error. Please recreate the CacheableLookup instance.");throw s.cause=n,s}}Uke(this._cache)&&this._tick(i)}}async queryAndCache(e){if(this._hostnamesToFallback.has(e))return this._dnsLookup(e,Hke);try{let r=await this._resolve(e);r.entries.length===0&&this._fallback&&(r=await this._lookup(e),r.entries.length!==0&&this._hostnamesToFallback.add(e));let i=r.entries.length===0?this.errorTtl:r.cacheTtl;return await this._set(e,r.entries,i),delete this._pending[e],r.entries}catch(r){throw delete this._pending[e],r}}_tick(e){let r=this._nextRemovalTime;(!r||e{this._nextRemovalTime=!1;let i=Infinity,n=Date.now();for(let[s,o]of this._cache){let a=o[h4];n>=a?this._cache.delete(s):a("lookup"in r||(r.lookup=this.lookup),e[_g](r,i))}uninstall(e){if(p4(e),e[_g]){if(e[qx]!==this)throw new Error("The agent is not owned by this CacheableLookup instance");e.createConnection=e[_g],delete e[_g],delete e[qx]}}updateInterfaceInfo(){let{_iface:e}=this;this._iface=d4(),(e.has4&&!this._iface.has4||e.has6&&!this._iface.has6)&&this._cache.clear()}clear(e){if(e){this._cache.delete(e);return}this._cache.clear()}};jx.exports=Jx;jx.exports.default=Jx});var y4=w((Yst,Wx)=>{"use strict";var Gke=typeof URL=="undefined"?require("url").URL:URL,jke="text/plain",Yke="us-ascii",E4=(t,e)=>e.some(r=>r instanceof RegExp?r.test(t):r===t),qke=(t,{stripHash:e})=>{let r=t.match(/^data:([^,]*?),([^#]*?)(?:#(.*))?$/);if(!r)throw new Error(`Invalid URL: ${t}`);let i=r[1].split(";"),n=r[2],s=e?"":r[3],o=!1;i[i.length-1]==="base64"&&(i.pop(),o=!0);let a=(i.shift()||"").toLowerCase(),c=[...i.map(u=>{let[g,f=""]=u.split("=").map(h=>h.trim());return g==="charset"&&(f=f.toLowerCase(),f===Yke)?"":`${g}${f?`=${f}`:""}`}).filter(Boolean)];return o&&c.push("base64"),(c.length!==0||a&&a!==jke)&&c.unshift(a),`data:${c.join(";")},${o?n.trim():n}${s?`#${s}`:""}`},I4=(t,e)=>{if(e=N({defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0},e),Reflect.has(e,"normalizeHttps"))throw new Error("options.normalizeHttps is renamed to options.forceHttp");if(Reflect.has(e,"normalizeHttp"))throw new Error("options.normalizeHttp is renamed to options.forceHttps");if(Reflect.has(e,"stripFragment"))throw new Error("options.stripFragment is renamed to options.stripHash");if(t=t.trim(),/^data:/i.test(t))return qke(t,e);let r=t.startsWith("//");!r&&/^\.*\//.test(t)||(t=t.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let n=new Gke(t);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&n.protocol==="https:"&&(n.protocol="http:"),e.forceHttps&&n.protocol==="http:"&&(n.protocol="https:"),e.stripAuthentication&&(n.username="",n.password=""),e.stripHash&&(n.hash=""),n.pathname&&(n.pathname=n.pathname.replace(/((?!:).|^)\/{2,}/g,(s,o)=>/^(?!\/)/g.test(o)?`${o}/`:"/")),n.pathname&&(n.pathname=decodeURI(n.pathname)),e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let s=n.pathname.split("/"),o=s[s.length-1];E4(o,e.removeDirectoryIndex)&&(s=s.slice(0,s.length-1),n.pathname=s.slice(1).join("/")+"/")}if(n.hostname&&(n.hostname=n.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.([a-z\-\d]{2,63})\.([a-z.]{2,5})$/.test(n.hostname)&&(n.hostname=n.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let s of[...n.searchParams.keys()])E4(s,e.removeQueryParameters)&&n.searchParams.delete(s);return e.sortQueryParameters&&n.searchParams.sort(),e.removeTrailingSlash&&(n.pathname=n.pathname.replace(/\/$/,"")),t=n.toString(),(e.removeTrailingSlash||n.pathname==="/")&&n.hash===""&&(t=t.replace(/\/$/,"")),r&&!e.normalizeProtocol&&(t=t.replace(/^http:\/\//,"//")),e.stripProtocol&&(t=t.replace(/^(?:https?:)?\/\//,"")),t};Wx.exports=I4;Wx.exports.default=I4});var b4=w((qst,w4)=>{w4.exports=B4;function B4(t,e){if(t&&e)return B4(t)(e);if(typeof t!="function")throw new TypeError("need wrapper function");return Object.keys(t).forEach(function(i){r[i]=t[i]}),r;function r(){for(var i=new Array(arguments.length),n=0;n{var Q4=b4();zx.exports=Q4(kw);zx.exports.strict=Q4(v4);kw.proto=kw(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return kw(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return v4(this)},configurable:!0})});function kw(t){var e=function(){return e.called?e.value:(e.called=!0,e.value=t.apply(this,arguments))};return e.called=!1,e}function v4(t){var e=function(){if(e.called)throw new Error(e.onceError);return e.called=!0,e.value=t.apply(this,arguments)},r=t.name||"Function wrapped with `once`";return e.onceError=r+" shouldn't be called more than once",e.called=!1,e}});var Vx=w((Wst,S4)=>{var Jke=_x(),Wke=function(){},zke=function(t){return t.setHeader&&typeof t.abort=="function"},_ke=function(t){return t.stdio&&Array.isArray(t.stdio)&&t.stdio.length===3},k4=function(t,e,r){if(typeof e=="function")return k4(t,null,e);e||(e={}),r=Jke(r||Wke);var i=t._writableState,n=t._readableState,s=e.readable||e.readable!==!1&&t.readable,o=e.writable||e.writable!==!1&&t.writable,a=function(){t.writable||l()},l=function(){o=!1,s||r.call(t)},c=function(){s=!1,o||r.call(t)},u=function(p){r.call(t,p?new Error("exited with error code: "+p):null)},g=function(p){r.call(t,p)},f=function(){if(s&&!(n&&n.ended))return r.call(t,new Error("premature close"));if(o&&!(i&&i.ended))return r.call(t,new Error("premature close"))},h=function(){t.req.on("finish",l)};return zke(t)?(t.on("complete",l),t.on("abort",f),t.req?h():t.on("request",h)):o&&!i&&(t.on("end",a),t.on("close",a)),_ke(t)&&t.on("exit",u),t.on("end",c),t.on("finish",l),e.error!==!1&&t.on("error",g),t.on("close",f),function(){t.removeListener("complete",l),t.removeListener("abort",f),t.removeListener("request",h),t.req&&t.req.removeListener("finish",l),t.removeListener("end",a),t.removeListener("close",a),t.removeListener("finish",l),t.removeListener("exit",u),t.removeListener("end",c),t.removeListener("error",g),t.removeListener("close",f)}};S4.exports=k4});var D4=w((zst,x4)=>{var Vke=_x(),Xke=Vx(),Xx=require("fs"),Pd=function(){},Zke=/^v?\.0/.test(process.version),xw=function(t){return typeof t=="function"},$ke=function(t){return!Zke||!Xx?!1:(t instanceof(Xx.ReadStream||Pd)||t instanceof(Xx.WriteStream||Pd))&&xw(t.close)},exe=function(t){return t.setHeader&&xw(t.abort)},txe=function(t,e,r,i){i=Vke(i);var n=!1;t.on("close",function(){n=!0}),Xke(t,{readable:e,writable:r},function(o){if(o)return i(o);n=!0,i()});var s=!1;return function(o){if(!n&&!s){if(s=!0,$ke(t))return t.close(Pd);if(exe(t))return t.abort();if(xw(t.destroy))return t.destroy();i(o||new Error("stream was destroyed"))}}},P4=function(t){t()},rxe=function(t,e){return t.pipe(e)},ixe=function(){var t=Array.prototype.slice.call(arguments),e=xw(t[t.length-1]||Pd)&&t.pop()||Pd;if(Array.isArray(t[0])&&(t=t[0]),t.length<2)throw new Error("pump requires two streams per minimum");var r,i=t.map(function(n,s){var o=s0;return txe(n,o,a,function(l){r||(r=l),l&&i.forEach(P4),!o&&(i.forEach(P4),e(r))})});return t.reduce(rxe)};x4.exports=ixe});var F4=w((_st,R4)=>{"use strict";var{PassThrough:nxe}=require("stream");R4.exports=t=>{t=N({},t);let{array:e}=t,{encoding:r}=t,i=r==="buffer",n=!1;e?n=!(r||i):r=r||"utf8",i&&(r=null);let s=new nxe({objectMode:n});r&&s.setEncoding(r);let o=0,a=[];return s.on("data",l=>{a.push(l),n?o=a.length:o+=l.length}),s.getBufferedValue=()=>e?a:i?Buffer.concat(a,o):a.join(""),s.getBufferedLength=()=>o,s}});var N4=w((Vst,Vg)=>{"use strict";var sxe=D4(),oxe=F4(),Zx=class extends Error{constructor(){super("maxBuffer exceeded");this.name="MaxBufferError"}};async function Pw(t,e){if(!t)return Promise.reject(new Error("Expected a stream"));e=N({maxBuffer:Infinity},e);let{maxBuffer:r}=e,i;return await new Promise((n,s)=>{let o=a=>{a&&(a.bufferedData=i.getBufferedValue()),s(a)};i=sxe(t,oxe(e),a=>{if(a){o(a);return}n()}),i.on("data",()=>{i.getBufferedLength()>r&&o(new Zx)})}),i.getBufferedValue()}Vg.exports=Pw;Vg.exports.default=Pw;Vg.exports.buffer=(t,e)=>Pw(t,ie(N({},e),{encoding:"buffer"}));Vg.exports.array=(t,e)=>Pw(t,ie(N({},e),{array:!0}));Vg.exports.MaxBufferError=Zx});var T4=w((Zst,L4)=>{"use strict";var axe=[200,203,204,206,300,301,404,405,410,414,501],Axe=[200,203,204,300,301,302,303,307,308,404,405,410,414,501],lxe={date:!0,connection:!0,"keep-alive":!0,"proxy-authenticate":!0,"proxy-authorization":!0,te:!0,trailer:!0,"transfer-encoding":!0,upgrade:!0},cxe={"content-length":!0,"content-encoding":!0,"transfer-encoding":!0,"content-range":!0};function $x(t){let e={};if(!t)return e;let r=t.trim().split(/\s*,\s*/);for(let i of r){let[n,s]=i.split(/\s*=\s*/,2);e[n]=s===void 0?!0:s.replace(/^"|"$/g,"")}return e}function uxe(t){let e=[];for(let r in t){let i=t[r];e.push(i===!0?r:r+"="+i)}if(!!e.length)return e.join(", ")}L4.exports=class{constructor(e,r,{shared:i,cacheHeuristic:n,immutableMinTimeToLive:s,ignoreCargoCult:o,trustServerDate:a,_fromObject:l}={}){if(l){this._fromObject(l);return}if(!r||!r.headers)throw Error("Response headers missing");this._assertRequestHasHeaders(e),this._responseTime=this.now(),this._isShared=i!==!1,this._trustServerDate=a!==void 0?a:!0,this._cacheHeuristic=n!==void 0?n:.1,this._immutableMinTtl=s!==void 0?s:24*3600*1e3,this._status="status"in r?r.status:200,this._resHeaders=r.headers,this._rescc=$x(r.headers["cache-control"]),this._method="method"in e?e.method:"GET",this._url=e.url,this._host=e.headers.host,this._noAuthorization=!e.headers.authorization,this._reqHeaders=r.headers.vary?e.headers:null,this._reqcc=$x(e.headers["cache-control"]),o&&"pre-check"in this._rescc&&"post-check"in this._rescc&&(delete this._rescc["pre-check"],delete this._rescc["post-check"],delete this._rescc["no-cache"],delete this._rescc["no-store"],delete this._rescc["must-revalidate"],this._resHeaders=Object.assign({},this._resHeaders,{"cache-control":uxe(this._rescc)}),delete this._resHeaders.expires,delete this._resHeaders.pragma),!r.headers["cache-control"]&&/no-cache/.test(r.headers.pragma)&&(this._rescc["no-cache"]=!0)}now(){return Date.now()}storable(){return!!(!this._reqcc["no-store"]&&(this._method==="GET"||this._method==="HEAD"||this._method==="POST"&&this._hasExplicitExpiration())&&Axe.indexOf(this._status)!==-1&&!this._rescc["no-store"]&&(!this._isShared||!this._rescc.private)&&(!this._isShared||this._noAuthorization||this._allowsStoringAuthenticated())&&(this._resHeaders.expires||this._rescc.public||this._rescc["max-age"]||this._rescc["s-maxage"]||axe.indexOf(this._status)!==-1))}_hasExplicitExpiration(){return this._isShared&&this._rescc["s-maxage"]||this._rescc["max-age"]||this._resHeaders.expires}_assertRequestHasHeaders(e){if(!e||!e.headers)throw Error("Request headers missing")}satisfiesWithoutRevalidation(e){this._assertRequestHasHeaders(e);let r=$x(e.headers["cache-control"]);return r["no-cache"]||/no-cache/.test(e.headers.pragma)||r["max-age"]&&this.age()>r["max-age"]||r["min-fresh"]&&this.timeToLive()<1e3*r["min-fresh"]||this.stale()&&!(r["max-stale"]&&!this._rescc["must-revalidate"]&&(r["max-stale"]===!0||r["max-stale"]>this.age()-this.maxAge()))?!1:this._requestMatches(e,!1)}_requestMatches(e,r){return(!this._url||this._url===e.url)&&this._host===e.headers.host&&(!e.method||this._method===e.method||r&&e.method==="HEAD")&&this._varyMatches(e)}_allowsStoringAuthenticated(){return this._rescc["must-revalidate"]||this._rescc.public||this._rescc["s-maxage"]}_varyMatches(e){if(!this._resHeaders.vary)return!0;if(this._resHeaders.vary==="*")return!1;let r=this._resHeaders.vary.trim().toLowerCase().split(/\s*,\s*/);for(let i of r)if(e.headers[i]!==this._reqHeaders[i])return!1;return!0}_copyWithoutHopByHopHeaders(e){let r={};for(let i in e)lxe[i]||(r[i]=e[i]);if(e.connection){let i=e.connection.trim().split(/\s*,\s*/);for(let n of i)delete r[n]}if(r.warning){let i=r.warning.split(/,/).filter(n=>!/^\s*1[0-9][0-9]/.test(n));i.length?r.warning=i.join(",").trim():delete r.warning}return r}responseHeaders(){let e=this._copyWithoutHopByHopHeaders(this._resHeaders),r=this.age();return r>3600*24&&!this._hasExplicitExpiration()&&this.maxAge()>3600*24&&(e.warning=(e.warning?`${e.warning}, `:"")+'113 - "rfc7234 5.5.4"'),e.age=`${Math.round(r)}`,e.date=new Date(this.now()).toUTCString(),e}date(){return this._trustServerDate?this._serverDate():this._responseTime}_serverDate(){let e=Date.parse(this._resHeaders.date);if(isFinite(e)){let r=8*3600*1e3;if(Math.abs(this._responseTime-e)e&&(e=i)}let r=(this.now()-this._responseTime)/1e3;return e+r}_ageValue(){let e=parseInt(this._resHeaders.age);return isFinite(e)?e:0}maxAge(){if(!this.storable()||this._rescc["no-cache"]||this._isShared&&this._resHeaders["set-cookie"]&&!this._rescc.public&&!this._rescc.immutable||this._resHeaders.vary==="*")return 0;if(this._isShared){if(this._rescc["proxy-revalidate"])return 0;if(this._rescc["s-maxage"])return parseInt(this._rescc["s-maxage"],10)}if(this._rescc["max-age"])return parseInt(this._rescc["max-age"],10);let e=this._rescc.immutable?this._immutableMinTtl:0,r=this._serverDate();if(this._resHeaders.expires){let i=Date.parse(this._resHeaders.expires);return Number.isNaN(i)||ii)return Math.max(e,(r-i)/1e3*this._cacheHeuristic)}return e}timeToLive(){return Math.max(0,this.maxAge()-this.age())*1e3}stale(){return this.maxAge()<=this.age()}static fromObject(e){return new this(void 0,void 0,{_fromObject:e})}_fromObject(e){if(this._responseTime)throw Error("Reinitialized");if(!e||e.v!==1)throw Error("Invalid serialization");this._responseTime=e.t,this._isShared=e.sh,this._cacheHeuristic=e.ch,this._immutableMinTtl=e.imm!==void 0?e.imm:24*3600*1e3,this._status=e.st,this._resHeaders=e.resh,this._rescc=e.rescc,this._method=e.m,this._url=e.u,this._host=e.h,this._noAuthorization=e.a,this._reqHeaders=e.reqh,this._reqcc=e.reqcc}toObject(){return{v:1,t:this._responseTime,sh:this._isShared,ch:this._cacheHeuristic,imm:this._immutableMinTtl,st:this._status,resh:this._resHeaders,rescc:this._rescc,m:this._method,u:this._url,h:this._host,a:this._noAuthorization,reqh:this._reqHeaders,reqcc:this._reqcc}}revalidationHeaders(e){this._assertRequestHasHeaders(e);let r=this._copyWithoutHopByHopHeaders(e.headers);if(delete r["if-range"],!this._requestMatches(e,!0)||!this.storable())return delete r["if-none-match"],delete r["if-modified-since"],r;if(this._resHeaders.etag&&(r["if-none-match"]=r["if-none-match"]?`${r["if-none-match"]}, ${this._resHeaders.etag}`:this._resHeaders.etag),r["accept-ranges"]||r["if-match"]||r["if-unmodified-since"]||this._method&&this._method!="GET"){if(delete r["if-modified-since"],r["if-none-match"]){let n=r["if-none-match"].split(/,/).filter(s=>!/^\s*W\//.test(s));n.length?r["if-none-match"]=n.join(",").trim():delete r["if-none-match"]}}else this._resHeaders["last-modified"]&&!r["if-modified-since"]&&(r["if-modified-since"]=this._resHeaders["last-modified"]);return r}revalidatedPolicy(e,r){if(this._assertRequestHasHeaders(e),!r||!r.headers)throw Error("Response headers missing");let i=!1;if(r.status!==void 0&&r.status!=304?i=!1:r.headers.etag&&!/^\s*W\//.test(r.headers.etag)?i=this._resHeaders.etag&&this._resHeaders.etag.replace(/^\s*W\//,"")===r.headers.etag:this._resHeaders.etag&&r.headers.etag?i=this._resHeaders.etag.replace(/^\s*W\//,"")===r.headers.etag.replace(/^\s*W\//,""):this._resHeaders["last-modified"]?i=this._resHeaders["last-modified"]===r.headers["last-modified"]:!this._resHeaders.etag&&!this._resHeaders["last-modified"]&&!r.headers.etag&&!r.headers["last-modified"]&&(i=!0),!i)return{policy:new this.constructor(e,r),modified:r.status!=304,matches:!1};let n={};for(let o in this._resHeaders)n[o]=o in r.headers&&!cxe[o]?r.headers[o]:this._resHeaders[o];let s=Object.assign({},r,{status:this._status,method:this._method,headers:n});return{policy:new this.constructor(e,s,{shared:this._isShared,cacheHeuristic:this._cacheHeuristic,immutableMinTimeToLive:this._immutableMinTtl,trustServerDate:this._trustServerDate}),modified:!1,matches:!0}}}});var Dw=w(($st,O4)=>{"use strict";O4.exports=t=>{let e={};for(let[r,i]of Object.entries(t))e[r.toLowerCase()]=i;return e}});var U4=w((eot,M4)=>{"use strict";var gxe=require("stream").Readable,fxe=Dw(),K4=class extends gxe{constructor(e,r,i,n){if(typeof e!="number")throw new TypeError("Argument `statusCode` should be a number");if(typeof r!="object")throw new TypeError("Argument `headers` should be an object");if(!(i instanceof Buffer))throw new TypeError("Argument `body` should be a buffer");if(typeof n!="string")throw new TypeError("Argument `url` should be a string");super();this.statusCode=e,this.headers=fxe(r),this.body=i,this.url=n}_read(){this.push(this.body),this.push(null)}};M4.exports=K4});var G4=w((tot,H4)=>{"use strict";var hxe=["destroy","setTimeout","socket","headers","trailers","rawHeaders","statusCode","httpVersion","httpVersionMinor","httpVersionMajor","rawTrailers","statusMessage"];H4.exports=(t,e)=>{let r=new Set(Object.keys(t).concat(hxe));for(let i of r)i in e||(e[i]=typeof t[i]=="function"?t[i].bind(t):t[i])}});var Y4=w((rot,j4)=>{"use strict";var pxe=require("stream").PassThrough,dxe=G4(),Cxe=t=>{if(!(t&&t.pipe))throw new TypeError("Parameter `response` must be a response stream.");let e=new pxe;return dxe(t,e),t.pipe(e)};j4.exports=Cxe});var q4=w(eP=>{eP.stringify=function t(e){if(typeof e=="undefined")return e;if(e&&Buffer.isBuffer(e))return JSON.stringify(":base64:"+e.toString("base64"));if(e&&e.toJSON&&(e=e.toJSON()),e&&typeof e=="object"){var r="",i=Array.isArray(e);r=i?"[":"{";var n=!0;for(var s in e){var o=typeof e[s]=="function"||!i&&typeof e[s]=="undefined";Object.hasOwnProperty.call(e,s)&&!o&&(n||(r+=","),n=!1,i?e[s]==null?r+="null":r+=t(e[s]):e[s]!==void 0&&(r+=t(s)+":"+t(e[s])))}return r+=i?"]":"}",r}else return typeof e=="string"?JSON.stringify(/^:/.test(e)?":"+e:e):typeof e=="undefined"?"null":JSON.stringify(e)};eP.parse=function(t){return JSON.parse(t,function(e,r){return typeof r=="string"?/^:base64:/.test(r)?Buffer.from(r.substring(8),"base64"):/^:/.test(r)?r.substring(1):r:r})}});var _4=w((not,J4)=>{"use strict";var mxe=require("events"),W4=q4(),Exe=t=>{let e={redis:"@keyv/redis",mongodb:"@keyv/mongo",mongo:"@keyv/mongo",sqlite:"@keyv/sqlite",postgresql:"@keyv/postgres",postgres:"@keyv/postgres",mysql:"@keyv/mysql"};if(t.adapter||t.uri){let r=t.adapter||/^[^:]*/.exec(t.uri)[0];return new(require(e[r]))(t)}return new Map},z4=class extends mxe{constructor(e,r){super();if(this.opts=Object.assign({namespace:"keyv",serialize:W4.stringify,deserialize:W4.parse},typeof e=="string"?{uri:e}:e,r),!this.opts.store){let i=Object.assign({},this.opts);this.opts.store=Exe(i)}typeof this.opts.store.on=="function"&&this.opts.store.on("error",i=>this.emit("error",i)),this.opts.store.namespace=this.opts.namespace}_getKeyPrefix(e){return`${this.opts.namespace}:${e}`}get(e,r){e=this._getKeyPrefix(e);let{store:i}=this.opts;return Promise.resolve().then(()=>i.get(e)).then(n=>typeof n=="string"?this.opts.deserialize(n):n).then(n=>{if(n!==void 0){if(typeof n.expires=="number"&&Date.now()>n.expires){this.delete(e);return}return r&&r.raw?n:n.value}})}set(e,r,i){e=this._getKeyPrefix(e),typeof i=="undefined"&&(i=this.opts.ttl),i===0&&(i=void 0);let{store:n}=this.opts;return Promise.resolve().then(()=>{let s=typeof i=="number"?Date.now()+i:null;return r={value:r,expires:s},this.opts.serialize(r)}).then(s=>n.set(e,s,i)).then(()=>!0)}delete(e){e=this._getKeyPrefix(e);let{store:r}=this.opts;return Promise.resolve().then(()=>r.delete(e))}clear(){let{store:e}=this.opts;return Promise.resolve().then(()=>e.clear())}};J4.exports=z4});var Z4=w((sot,V4)=>{"use strict";var Ixe=require("events"),Rw=require("url"),yxe=y4(),wxe=N4(),tP=T4(),X4=U4(),Bxe=Dw(),bxe=Y4(),Qxe=_4(),ea=class{constructor(e,r){if(typeof e!="function")throw new TypeError("Parameter `request` must be a function");return this.cache=new Qxe({uri:typeof r=="string"&&r,store:typeof r!="string"&&r,namespace:"cacheable-request"}),this.createCacheableRequest(e)}createCacheableRequest(e){return(r,i)=>{let n;if(typeof r=="string")n=rP(Rw.parse(r)),r={};else if(r instanceof Rw.URL)n=rP(Rw.parse(r.toString())),r={};else{let[g,...f]=(r.path||"").split("?"),h=f.length>0?`?${f.join("?")}`:"";n=rP(ie(N({},r),{pathname:g,search:h}))}r=N(N({headers:{},method:"GET",cache:!0,strictTtl:!1,automaticFailover:!1},r),vxe(n)),r.headers=Bxe(r.headers);let s=new Ixe,o=yxe(Rw.format(n),{stripWWW:!1,removeTrailingSlash:!1,stripAuthentication:!1}),a=`${r.method}:${o}`,l=!1,c=!1,u=g=>{c=!0;let f=!1,h,p=new Promise(y=>{h=()=>{f||(f=!0,y())}}),m=y=>{if(l&&!g.forceRefresh){y.status=y.statusCode;let S=tP.fromObject(l.cachePolicy).revalidatedPolicy(g,y);if(!S.modified){let k=S.policy.responseHeaders();y=new X4(l.statusCode,k,l.body,l.url),y.cachePolicy=S.policy,y.fromCache=!0}}y.fromCache||(y.cachePolicy=new tP(g,y,g),y.fromCache=!1);let b;g.cache&&y.cachePolicy.storable()?(b=bxe(y),(async()=>{try{let S=wxe.buffer(y);if(await Promise.race([p,new Promise(j=>y.once("end",j))]),f)return;let k=await S,T={cachePolicy:y.cachePolicy.toObject(),url:y.url,statusCode:y.fromCache?l.statusCode:y.statusCode,body:k},Y=g.strictTtl?y.cachePolicy.timeToLive():void 0;g.maxTtl&&(Y=Y?Math.min(Y,g.maxTtl):g.maxTtl),await this.cache.set(a,T,Y)}catch(S){s.emit("error",new ea.CacheError(S))}})()):g.cache&&l&&(async()=>{try{await this.cache.delete(a)}catch(S){s.emit("error",new ea.CacheError(S))}})(),s.emit("response",b||y),typeof i=="function"&&i(b||y)};try{let y=e(g,m);y.once("error",h),y.once("abort",h),s.emit("request",y)}catch(y){s.emit("error",new ea.RequestError(y))}};return(async()=>{let g=async h=>{await Promise.resolve();let p=h.cache?await this.cache.get(a):void 0;if(typeof p=="undefined")return u(h);let m=tP.fromObject(p.cachePolicy);if(m.satisfiesWithoutRevalidation(h)&&!h.forceRefresh){let y=m.responseHeaders(),b=new X4(p.statusCode,y,p.body,p.url);b.cachePolicy=m,b.fromCache=!0,s.emit("response",b),typeof i=="function"&&i(b)}else l=p,h.headers=m.revalidationHeaders(h),u(h)},f=h=>s.emit("error",new ea.CacheError(h));this.cache.once("error",f),s.on("response",()=>this.cache.removeListener("error",f));try{await g(r)}catch(h){r.automaticFailover&&!c&&u(r),s.emit("error",new ea.CacheError(h))}})(),s}}};function vxe(t){let e=N({},t);return e.path=`${t.pathname||"/"}${t.search||""}`,delete e.pathname,delete e.search,e}function rP(t){return{protocol:t.protocol,auth:t.auth,hostname:t.hostname||t.host||"localhost",port:t.port,pathname:t.pathname,search:t.search}}ea.RequestError=class extends Error{constructor(t){super(t.message);this.name="RequestError",Object.assign(this,t)}};ea.CacheError=class extends Error{constructor(t){super(t.message);this.name="CacheError",Object.assign(this,t)}};V4.exports=ea});var ez=w((oot,$4)=>{"use strict";var Sxe=["aborted","complete","headers","httpVersion","httpVersionMinor","httpVersionMajor","method","rawHeaders","rawTrailers","setTimeout","socket","statusCode","statusMessage","trailers","url"];$4.exports=(t,e)=>{if(e._readableState.autoDestroy)throw new Error("The second stream must have the `autoDestroy` option set to `false`");let r=new Set(Object.keys(t).concat(Sxe)),i={};for(let n of r)n in e||(i[n]={get(){let s=t[n];return typeof s=="function"?s.bind(t):s},set(s){t[n]=s},enumerable:!0,configurable:!1});return Object.defineProperties(e,i),t.once("aborted",()=>{e.destroy(),e.emit("aborted")}),t.once("close",()=>{t.complete&&e.readable?e.once("end",()=>{e.emit("close")}):e.emit("close")}),e}});var rz=w((aot,tz)=>{"use strict";var{Transform:kxe,PassThrough:xxe}=require("stream"),iP=require("zlib"),Pxe=ez();tz.exports=t=>{let e=(t.headers["content-encoding"]||"").toLowerCase();if(!["gzip","deflate","br"].includes(e))return t;let r=e==="br";if(r&&typeof iP.createBrotliDecompress!="function")return t.destroy(new Error("Brotli is not supported on Node.js < 12")),t;let i=!0,n=new kxe({transform(a,l,c){i=!1,c(null,a)},flush(a){a()}}),s=new xxe({autoDestroy:!1,destroy(a,l){t.destroy(),l(a)}}),o=r?iP.createBrotliDecompress():iP.createUnzip();return o.once("error",a=>{if(i&&!t.readable){s.end();return}s.destroy(a)}),Pxe(t,s),t.pipe(n).pipe(o).pipe(s),s}});var nP=w((Aot,iz)=>{"use strict";var nz=class{constructor(e={}){if(!(e.maxSize&&e.maxSize>0))throw new TypeError("`maxSize` must be a number greater than 0");this.maxSize=e.maxSize,this.onEviction=e.onEviction,this.cache=new Map,this.oldCache=new Map,this._size=0}_set(e,r){if(this.cache.set(e,r),this._size++,this._size>=this.maxSize){if(this._size=0,typeof this.onEviction=="function")for(let[i,n]of this.oldCache.entries())this.onEviction(i,n);this.oldCache=this.cache,this.cache=new Map}}get(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e)){let r=this.oldCache.get(e);return this.oldCache.delete(e),this._set(e,r),r}}set(e,r){return this.cache.has(e)?this.cache.set(e,r):this._set(e,r),this}has(e){return this.cache.has(e)||this.oldCache.has(e)}peek(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e))return this.oldCache.get(e)}delete(e){let r=this.cache.delete(e);return r&&this._size--,this.oldCache.delete(e)||r}clear(){this.cache.clear(),this.oldCache.clear(),this._size=0}*keys(){for(let[e]of this)yield e}*values(){for(let[,e]of this)yield e}*[Symbol.iterator](){for(let e of this.cache)yield e;for(let e of this.oldCache){let[r]=e;this.cache.has(r)||(yield e)}}get size(){let e=0;for(let r of this.oldCache.keys())this.cache.has(r)||e++;return Math.min(this._size+e,this.maxSize)}};iz.exports=nz});var oP=w((lot,sz)=>{"use strict";var Dxe=require("events"),Rxe=require("tls"),Fxe=require("http2"),Nxe=nP(),gn=Symbol("currentStreamsCount"),oz=Symbol("request"),Ns=Symbol("cachedOriginSet"),Xg=Symbol("gracefullyClosing"),Lxe=["maxDeflateDynamicTableSize","maxSessionMemory","maxHeaderListPairs","maxOutstandingPings","maxReservedRemoteStreams","maxSendHeaderBlockLength","paddingStrategy","localAddress","path","rejectUnauthorized","minDHSize","ca","cert","clientCertEngine","ciphers","key","pfx","servername","minVersion","maxVersion","secureProtocol","crl","honorCipherOrder","ecdhCurve","dhparam","secureOptions","sessionIdContext"],Txe=(t,e,r)=>{let i=0,n=t.length;for(;i>>1;r(t[s],e)?i=s+1:n=s}return i},Oxe=(t,e)=>t.remoteSettings.maxConcurrentStreams>e.remoteSettings.maxConcurrentStreams,sP=(t,e)=>{for(let r of t)r[Ns].lengthe[Ns].includes(i))&&r[gn]+e[gn]<=e.remoteSettings.maxConcurrentStreams&&az(r)},Mxe=(t,e)=>{for(let r of t)e[Ns].lengthr[Ns].includes(i))&&e[gn]+r[gn]<=r.remoteSettings.maxConcurrentStreams&&az(e)},Az=({agent:t,isFree:e})=>{let r={};for(let i in t.sessions){let s=t.sessions[i].filter(o=>{let a=o[tA.kCurrentStreamsCount]{t[Xg]=!0,t[gn]===0&&t.close()},tA=class extends Dxe{constructor({timeout:e=6e4,maxSessions:r=Infinity,maxFreeSessions:i=10,maxCachedTlsSessions:n=100}={}){super();this.sessions={},this.queue={},this.timeout=e,this.maxSessions=r,this.maxFreeSessions=i,this._freeSessionsCount=0,this._sessionsCount=0,this.settings={enablePush:!1},this.tlsSessionCache=new Nxe({maxSize:n})}static normalizeOrigin(e,r){return typeof e=="string"&&(e=new URL(e)),r&&e.hostname!==r&&(e.hostname=r),e.origin}normalizeOptions(e){let r="";if(e)for(let i of Lxe)e[i]&&(r+=`:${e[i]}`);return r}_tryToCreateNewSession(e,r){if(!(e in this.queue)||!(r in this.queue[e]))return;let i=this.queue[e][r];this._sessionsCount{Array.isArray(i)?(i=[...i],n()):i=[{resolve:n,reject:s}];let o=this.normalizeOptions(r),a=tA.normalizeOrigin(e,r&&r.servername);if(a===void 0){for(let{reject:u}of i)u(new TypeError("The `origin` argument needs to be a string or an URL object"));return}if(o in this.sessions){let u=this.sessions[o],g=-1,f=-1,h;for(let p of u){let m=p.remoteSettings.maxConcurrentStreams;if(m=m||p[Xg]||p.destroyed)continue;h||(g=m),y>f&&(h=p,f=y)}}if(h){if(i.length!==1){for(let{reject:p}of i){let m=new Error(`Expected the length of listeners to be 1, got ${i.length}. -Please report this to https://github.com/szmarczak/http2-wrapper/`);p(m)}return}i[0].resolve(h);return}}if(o in this.queue){if(a in this.queue[o]){this.queue[o][a].listeners.push(...i),this._tryToCreateNewSession(o,a);return}}else this.queue[o]={};let l=()=>{o in this.queue&&this.queue[o][a]===c&&(delete this.queue[o][a],Object.keys(this.queue[o]).length===0&&delete this.queue[o])},c=()=>{let u=`${a}:${o}`,g=!1;try{let f=Fxe.connect(e,N({createConnection:this.createConnection,settings:this.settings,session:this.tlsSessionCache.get(u)},r));f[gn]=0,f[Xg]=!1;let h=()=>f[gn]{this.tlsSessionCache.set(u,y)}),f.once("error",y=>{for(let{reject:b}of i)b(y);this.tlsSessionCache.delete(u)}),f.setTimeout(this.timeout,()=>{f.destroy()}),f.once("close",()=>{if(g){p&&this._freeSessionsCount--,this._sessionsCount--;let y=this.sessions[o];y.splice(y.indexOf(f),1),y.length===0&&delete this.sessions[o]}else{let y=new Error("Session closed without receiving a SETTINGS frame");y.code="HTTP2WRAPPER_NOSETTINGS";for(let{reject:b}of i)b(y);l()}this._tryToCreateNewSession(o,a)});let m=()=>{if(!(!(o in this.queue)||!h())){for(let y of f[Ns])if(y in this.queue[o]){let{listeners:b}=this.queue[o][y];for(;b.length!==0&&h();)b.shift().resolve(f);let S=this.queue[o];if(S[y].listeners.length===0&&(delete S[y],Object.keys(S).length===0)){delete this.queue[o];break}if(!h())break}}};f.on("origin",()=>{f[Ns]=f.originSet,!!h()&&(m(),sP(this.sessions[o],f))}),f.once("remoteSettings",()=>{if(f.ref(),f.unref(),this._sessionsCount++,c.destroyed){let y=new Error("Agent has been destroyed");for(let b of i)b.reject(y);f.destroy();return}f[Ns]=f.originSet;{let y=this.sessions;if(o in y){let b=y[o];b.splice(Txe(b,f,Oxe),0,f)}else y[o]=[f]}this._freeSessionsCount+=1,g=!0,this.emit("session",f),m(),l(),f[gn]===0&&this._freeSessionsCount>this.maxFreeSessions&&f.close(),i.length!==0&&(this.getSession(a,r,i),i.length=0),f.on("remoteSettings",()=>{m(),sP(this.sessions[o],f)})}),f[oz]=f.request,f.request=(y,b)=>{if(f[Xg])throw new Error("The session is gracefully closing. No new streams are allowed.");let S=f[oz](y,b);return f.ref(),++f[gn],f[gn]===f.remoteSettings.maxConcurrentStreams&&this._freeSessionsCount--,S.once("close",()=>{if(p=h(),--f[gn],!f.destroyed&&!f.closed&&(Mxe(this.sessions[o],f),h()&&!f.closed)){p||(this._freeSessionsCount++,p=!0);let k=f[gn]===0;k&&f.unref(),k&&(this._freeSessionsCount>this.maxFreeSessions||f[Xg])?f.close():(sP(this.sessions[o],f),m())}}),S}}catch(f){for(let h of i)h.reject(f);l()}};c.listeners=i,c.completed=!1,c.destroyed=!1,this.queue[o][a]=c,this._tryToCreateNewSession(o,a)})}request(e,r,i,n){return new Promise((s,o)=>{this.getSession(e,r,[{reject:o,resolve:a=>{try{s(a.request(i,n))}catch(l){o(l)}}}])})}createConnection(e,r){return tA.connect(e,r)}static connect(e,r){r.ALPNProtocols=["h2"];let i=e.port||443,n=e.hostname||e.host;return typeof r.servername=="undefined"&&(r.servername=n),Rxe.connect(i,n,r)}closeFreeSessions(){for(let e of Object.values(this.sessions))for(let r of e)r[gn]===0&&r.close()}destroy(e){for(let r of Object.values(this.sessions))for(let i of r)i.destroy(e);for(let r of Object.values(this.queue))for(let i of Object.values(r))i.destroyed=!0;this.queue={}}get freeSessions(){return Az({agent:this,isFree:!0})}get busySessions(){return Az({agent:this,isFree:!1})}};tA.kCurrentStreamsCount=gn;tA.kGracefullyClosing=Xg;sz.exports={Agent:tA,globalAgent:new tA}});var aP=w((cot,lz)=>{"use strict";var{Readable:Kxe}=require("stream"),cz=class extends Kxe{constructor(e,r){super({highWaterMark:r,autoDestroy:!1});this.statusCode=null,this.statusMessage="",this.httpVersion="2.0",this.httpVersionMajor=2,this.httpVersionMinor=0,this.headers={},this.trailers={},this.req=null,this.aborted=!1,this.complete=!1,this.upgrade=null,this.rawHeaders=[],this.rawTrailers=[],this.socket=e,this.connection=e,this._dumped=!1}_destroy(e){this.req._request.destroy(e)}setTimeout(e,r){return this.req.setTimeout(e,r),this}_dump(){this._dumped||(this._dumped=!0,this.removeAllListeners("data"),this.resume())}_read(){this.req&&this.req._request.resume()}};lz.exports=cz});var AP=w((uot,uz)=>{"use strict";uz.exports=t=>{let e={protocol:t.protocol,hostname:typeof t.hostname=="string"&&t.hostname.startsWith("[")?t.hostname.slice(1,-1):t.hostname,host:t.host,hash:t.hash,search:t.search,pathname:t.pathname,href:t.href,path:`${t.pathname||""}${t.search||""}`};return typeof t.port=="string"&&t.port.length!==0&&(e.port=Number(t.port)),(t.username||t.password)&&(e.auth=`${t.username||""}:${t.password||""}`),e}});var fz=w((got,gz)=>{"use strict";gz.exports=(t,e,r)=>{for(let i of r)t.on(i,(...n)=>e.emit(i,...n))}});var pz=w((fot,hz)=>{"use strict";hz.exports=t=>{switch(t){case":method":case":scheme":case":authority":case":path":return!0;default:return!1}}});var Cz=w((pot,dz)=>{"use strict";var Zg=(t,e,r)=>{dz.exports[e]=class extends t{constructor(...n){super(typeof r=="string"?r:r(n));this.name=`${super.name} [${e}]`,this.code=e}}};Zg(TypeError,"ERR_INVALID_ARG_TYPE",t=>{let e=t[0].includes(".")?"property":"argument",r=t[1],i=Array.isArray(r);return i&&(r=`${r.slice(0,-1).join(", ")} or ${r.slice(-1)}`),`The "${t[0]}" ${e} must be ${i?"one of":"of"} type ${r}. Received ${typeof t[2]}`});Zg(TypeError,"ERR_INVALID_PROTOCOL",t=>`Protocol "${t[0]}" not supported. Expected "${t[1]}"`);Zg(Error,"ERR_HTTP_HEADERS_SENT",t=>`Cannot ${t[0]} headers after they are sent to the client`);Zg(TypeError,"ERR_INVALID_HTTP_TOKEN",t=>`${t[0]} must be a valid HTTP token [${t[1]}]`);Zg(TypeError,"ERR_HTTP_INVALID_HEADER_VALUE",t=>`Invalid value "${t[0]} for header "${t[1]}"`);Zg(TypeError,"ERR_INVALID_CHAR",t=>`Invalid character in ${t[0]} [${t[1]}]`)});var gP=w((dot,mz)=>{"use strict";var Uxe=require("http2"),{Writable:Hxe}=require("stream"),{Agent:Ez,globalAgent:Gxe}=oP(),jxe=aP(),Yxe=AP(),qxe=fz(),Jxe=pz(),{ERR_INVALID_ARG_TYPE:lP,ERR_INVALID_PROTOCOL:Wxe,ERR_HTTP_HEADERS_SENT:Iz,ERR_INVALID_HTTP_TOKEN:zxe,ERR_HTTP_INVALID_HEADER_VALUE:_xe,ERR_INVALID_CHAR:Vxe}=Cz(),{HTTP2_HEADER_STATUS:yz,HTTP2_HEADER_METHOD:wz,HTTP2_HEADER_PATH:Bz,HTTP2_METHOD_CONNECT:Xxe}=Uxe.constants,Wi=Symbol("headers"),cP=Symbol("origin"),uP=Symbol("session"),bz=Symbol("options"),Fw=Symbol("flushedHeaders"),Dd=Symbol("jobs"),Zxe=/^[\^`\-\w!#$%&*+.|~]+$/,$xe=/[^\t\u0020-\u007E\u0080-\u00FF]/,Qz=class extends Hxe{constructor(e,r,i){super({autoDestroy:!1});let n=typeof e=="string"||e instanceof URL;if(n&&(e=Yxe(e instanceof URL?e:new URL(e))),typeof r=="function"||r===void 0?(i=r,r=n?e:N({},e)):r=N(N({},e),r),r.h2session)this[uP]=r.h2session;else if(r.agent===!1)this.agent=new Ez({maxFreeSessions:0});else if(typeof r.agent=="undefined"||r.agent===null)typeof r.createConnection=="function"?(this.agent=new Ez({maxFreeSessions:0}),this.agent.createConnection=r.createConnection):this.agent=Gxe;else if(typeof r.agent.request=="function")this.agent=r.agent;else throw new lP("options.agent",["Agent-like Object","undefined","false"],r.agent);if(r.protocol&&r.protocol!=="https:")throw new Wxe(r.protocol,"https:");let s=r.port||r.defaultPort||this.agent&&this.agent.defaultPort||443,o=r.hostname||r.host||"localhost";delete r.hostname,delete r.host,delete r.port;let{timeout:a}=r;if(r.timeout=void 0,this[Wi]=Object.create(null),this[Dd]=[],this.socket=null,this.connection=null,this.method=r.method||"GET",this.path=r.path,this.res=null,this.aborted=!1,this.reusedSocket=!1,r.headers)for(let[l,c]of Object.entries(r.headers))this.setHeader(l,c);r.auth&&!("authorization"in this[Wi])&&(this[Wi].authorization="Basic "+Buffer.from(r.auth).toString("base64")),r.session=r.tlsSession,r.path=r.socketPath,this[bz]=r,s===443?(this[cP]=`https://${o}`,":authority"in this[Wi]||(this[Wi][":authority"]=o)):(this[cP]=`https://${o}:${s}`,":authority"in this[Wi]||(this[Wi][":authority"]=`${o}:${s}`)),a&&this.setTimeout(a),i&&this.once("response",i),this[Fw]=!1}get method(){return this[Wi][wz]}set method(e){e&&(this[Wi][wz]=e.toUpperCase())}get path(){return this[Wi][Bz]}set path(e){e&&(this[Wi][Bz]=e)}get _mustNotHaveABody(){return this.method==="GET"||this.method==="HEAD"||this.method==="DELETE"}_write(e,r,i){if(this._mustNotHaveABody){i(new Error("The GET, HEAD and DELETE methods must NOT have a body"));return}this.flushHeaders();let n=()=>this._request.write(e,r,i);this._request?n():this[Dd].push(n)}_final(e){if(this.destroyed)return;this.flushHeaders();let r=()=>{if(this._mustNotHaveABody){e();return}this._request.end(e)};this._request?r():this[Dd].push(r)}abort(){this.res&&this.res.complete||(this.aborted||process.nextTick(()=>this.emit("abort")),this.aborted=!0,this.destroy())}_destroy(e,r){this.res&&this.res._dump(),this._request&&this._request.destroy(),r(e)}async flushHeaders(){if(this[Fw]||this.destroyed)return;this[Fw]=!0;let e=this.method===Xxe,r=i=>{if(this._request=i,this.destroyed){i.destroy();return}e||qxe(i,this,["timeout","continue","close","error"]);let n=o=>(...a)=>{!this.writable&&!this.destroyed?o(...a):this.once("finish",()=>{o(...a)})};i.once("response",n((o,a,l)=>{let c=new jxe(this.socket,i.readableHighWaterMark);this.res=c,c.req=this,c.statusCode=o[yz],c.headers=o,c.rawHeaders=l,c.once("end",()=>{this.aborted?(c.aborted=!0,c.emit("aborted")):(c.complete=!0,c.socket=null,c.connection=null)}),e?(c.upgrade=!0,this.emit("connect",c,i,Buffer.alloc(0))?this.emit("close"):i.destroy()):(i.on("data",u=>{!c._dumped&&!c.push(u)&&i.pause()}),i.once("end",()=>{c.push(null)}),this.emit("response",c)||c._dump())})),i.once("headers",n(o=>this.emit("information",{statusCode:o[yz]}))),i.once("trailers",n((o,a,l)=>{let{res:c}=this;c.trailers=o,c.rawTrailers=l}));let{socket:s}=i.session;this.socket=s,this.connection=s;for(let o of this[Dd])o();this.emit("socket",this.socket)};if(this[uP])try{r(this[uP].request(this[Wi]))}catch(i){this.emit("error",i)}else{this.reusedSocket=!0;try{r(await this.agent.request(this[cP],this[bz],this[Wi]))}catch(i){this.emit("error",i)}}}getHeader(e){if(typeof e!="string")throw new lP("name","string",e);return this[Wi][e.toLowerCase()]}get headersSent(){return this[Fw]}removeHeader(e){if(typeof e!="string")throw new lP("name","string",e);if(this.headersSent)throw new Iz("remove");delete this[Wi][e.toLowerCase()]}setHeader(e,r){if(this.headersSent)throw new Iz("set");if(typeof e!="string"||!Zxe.test(e)&&!Jxe(e))throw new zxe("Header name",e);if(typeof r=="undefined")throw new _xe(r,e);if($xe.test(r))throw new Vxe("header content",e);this[Wi][e.toLowerCase()]=r}setNoDelay(){}setSocketKeepAlive(){}setTimeout(e,r){let i=()=>this._request.setTimeout(e,r);return this._request?i():this[Dd].push(i),this}get maxHeadersCount(){if(!this.destroyed&&this._request)return this._request.session.localSettings.maxHeaderListSize}set maxHeadersCount(e){}};mz.exports=Qz});var Sz=w((Cot,vz)=>{"use strict";var ePe=require("tls");vz.exports=(t={})=>new Promise((e,r)=>{let i=ePe.connect(t,()=>{t.resolveSocket?(i.off("error",r),e({alpnProtocol:i.alpnProtocol,socket:i})):(i.destroy(),e({alpnProtocol:i.alpnProtocol}))});i.on("error",r)})});var xz=w((mot,kz)=>{"use strict";var tPe=require("net");kz.exports=t=>{let e=t.host,r=t.headers&&t.headers.host;return r&&(r.startsWith("[")?r.indexOf("]")===-1?e=r:e=r.slice(1,-1):e=r.split(":",1)[0]),tPe.isIP(e)?"":e}});var Rz=w((Eot,fP)=>{"use strict";var Pz=require("http"),hP=require("https"),rPe=Sz(),iPe=nP(),nPe=gP(),sPe=xz(),oPe=AP(),Nw=new iPe({maxSize:100}),Rd=new Map,Dz=(t,e,r)=>{e._httpMessage={shouldKeepAlive:!0};let i=()=>{t.emit("free",e,r)};e.on("free",i);let n=()=>{t.removeSocket(e,r)};e.on("close",n);let s=()=>{t.removeSocket(e,r),e.off("close",n),e.off("free",i),e.off("agentRemove",s)};e.on("agentRemove",s),t.emit("free",e,r)},aPe=async t=>{let e=`${t.host}:${t.port}:${t.ALPNProtocols.sort()}`;if(!Nw.has(e)){if(Rd.has(e))return(await Rd.get(e)).alpnProtocol;let{path:r,agent:i}=t;t.path=t.socketPath;let n=rPe(t);Rd.set(e,n);try{let{socket:s,alpnProtocol:o}=await n;if(Nw.set(e,o),t.path=r,o==="h2")s.destroy();else{let{globalAgent:a}=hP,l=hP.Agent.prototype.createConnection;i?i.createConnection===l?Dz(i,s,t):s.destroy():a.createConnection===l?Dz(a,s,t):s.destroy()}return Rd.delete(e),o}catch(s){throw Rd.delete(e),s}}return Nw.get(e)};fP.exports=async(t,e,r)=>{if((typeof t=="string"||t instanceof URL)&&(t=oPe(new URL(t))),typeof e=="function"&&(r=e,e=void 0),e=ie(N(N({ALPNProtocols:["h2","http/1.1"]},t),e),{resolveSocket:!0}),!Array.isArray(e.ALPNProtocols)||e.ALPNProtocols.length===0)throw new Error("The `ALPNProtocols` option must be an Array with at least one entry");e.protocol=e.protocol||"https:";let i=e.protocol==="https:";e.host=e.hostname||e.host||"localhost",e.session=e.tlsSession,e.servername=e.servername||sPe(e),e.port=e.port||(i?443:80),e._defaultAgent=i?hP.globalAgent:Pz.globalAgent;let n=e.agent;if(n){if(n.addRequest)throw new Error("The `options.agent` object can contain only `http`, `https` or `http2` properties");e.agent=n[i?"https":"http"]}return i&&await aPe(e)==="h2"?(n&&(e.agent=n.http2),new nPe(e,r)):Pz.request(e,r)};fP.exports.protocolCache=Nw});var Nz=w((Iot,Fz)=>{"use strict";var APe=require("http2"),lPe=oP(),pP=gP(),cPe=aP(),uPe=Rz(),gPe=(t,e,r)=>new pP(t,e,r),fPe=(t,e,r)=>{let i=new pP(t,e,r);return i.end(),i};Fz.exports=ie(N(ie(N({},APe),{ClientRequest:pP,IncomingMessage:cPe}),lPe),{request:gPe,get:fPe,auto:uPe})});var CP=w(dP=>{"use strict";Object.defineProperty(dP,"__esModule",{value:!0});var Lz=eA();dP.default=t=>Lz.default.nodeStream(t)&&Lz.default.function_(t.getBoundary)});var Kz=w(mP=>{"use strict";Object.defineProperty(mP,"__esModule",{value:!0});var Tz=require("fs"),Oz=require("util"),Mz=eA(),hPe=CP(),pPe=Oz.promisify(Tz.stat);mP.default=async(t,e)=>{if(e&&"content-length"in e)return Number(e["content-length"]);if(!t)return 0;if(Mz.default.string(t))return Buffer.byteLength(t);if(Mz.default.buffer(t))return t.length;if(hPe.default(t))return Oz.promisify(t.getLength.bind(t))();if(t instanceof Tz.ReadStream){let{size:r}=await pPe(t.path);return r===0?void 0:r}}});var IP=w(EP=>{"use strict";Object.defineProperty(EP,"__esModule",{value:!0});function dPe(t,e,r){let i={};for(let n of r)i[n]=(...s)=>{e.emit(n,...s)},t.on(n,i[n]);return()=>{for(let n of r)t.off(n,i[n])}}EP.default=dPe});var Uz=w(yP=>{"use strict";Object.defineProperty(yP,"__esModule",{value:!0});yP.default=()=>{let t=[];return{once(e,r,i){e.once(r,i),t.push({origin:e,event:r,fn:i})},unhandleAll(){for(let e of t){let{origin:r,event:i,fn:n}=e;r.removeListener(i,n)}t.length=0}}}});var Gz=w(Fd=>{"use strict";Object.defineProperty(Fd,"__esModule",{value:!0});Fd.TimeoutError=void 0;var CPe=require("net"),mPe=Uz(),Hz=Symbol("reentry"),EPe=()=>{},wP=class extends Error{constructor(e,r){super(`Timeout awaiting '${r}' for ${e}ms`);this.event=r,this.name="TimeoutError",this.code="ETIMEDOUT"}};Fd.TimeoutError=wP;Fd.default=(t,e,r)=>{if(Hz in t)return EPe;t[Hz]=!0;let i=[],{once:n,unhandleAll:s}=mPe.default(),o=(g,f,h)=>{var p;let m=setTimeout(f,g,g,h);(p=m.unref)===null||p===void 0||p.call(m);let y=()=>{clearTimeout(m)};return i.push(y),y},{host:a,hostname:l}=r,c=(g,f)=>{t.destroy(new wP(g,f))},u=()=>{for(let g of i)g();s()};if(t.once("error",g=>{if(u(),t.listenerCount("error")===0)throw g}),t.once("close",u),n(t,"response",g=>{n(g,"end",u)}),typeof e.request!="undefined"&&o(e.request,c,"request"),typeof e.socket!="undefined"){let g=()=>{c(e.socket,"socket")};t.setTimeout(e.socket,g),i.push(()=>{t.removeListener("timeout",g)})}return n(t,"socket",g=>{var f;let{socketPath:h}=t;if(g.connecting){let p=Boolean(h!=null?h:CPe.isIP((f=l!=null?l:a)!==null&&f!==void 0?f:"")!==0);if(typeof e.lookup!="undefined"&&!p&&typeof g.address().address=="undefined"){let m=o(e.lookup,c,"lookup");n(g,"lookup",m)}if(typeof e.connect!="undefined"){let m=()=>o(e.connect,c,"connect");p?n(g,"connect",m()):n(g,"lookup",y=>{y===null&&n(g,"connect",m())})}typeof e.secureConnect!="undefined"&&r.protocol==="https:"&&n(g,"connect",()=>{let m=o(e.secureConnect,c,"secureConnect");n(g,"secureConnect",m)})}if(typeof e.send!="undefined"){let p=()=>o(e.send,c,"send");g.connecting?n(g,"connect",()=>{n(t,"upload-complete",p())}):n(t,"upload-complete",p())}}),typeof e.response!="undefined"&&n(t,"upload-complete",()=>{let g=o(e.response,c,"response");n(t,"response",g)}),u}});var Yz=w(BP=>{"use strict";Object.defineProperty(BP,"__esModule",{value:!0});var jz=eA();BP.default=t=>{t=t;let e={protocol:t.protocol,hostname:jz.default.string(t.hostname)&&t.hostname.startsWith("[")?t.hostname.slice(1,-1):t.hostname,host:t.host,hash:t.hash,search:t.search,pathname:t.pathname,href:t.href,path:`${t.pathname||""}${t.search||""}`};return jz.default.string(t.port)&&t.port.length>0&&(e.port=Number(t.port)),(t.username||t.password)&&(e.auth=`${t.username||""}:${t.password||""}`),e}});var qz=w(bP=>{"use strict";Object.defineProperty(bP,"__esModule",{value:!0});var IPe=require("url"),yPe=["protocol","host","hostname","port","pathname","search"];bP.default=(t,e)=>{var r,i;if(e.path){if(e.pathname)throw new TypeError("Parameters `path` and `pathname` are mutually exclusive.");if(e.search)throw new TypeError("Parameters `path` and `search` are mutually exclusive.");if(e.searchParams)throw new TypeError("Parameters `path` and `searchParams` are mutually exclusive.")}if(e.search&&e.searchParams)throw new TypeError("Parameters `search` and `searchParams` are mutually exclusive.");if(!t){if(!e.protocol)throw new TypeError("No URL protocol specified");t=`${e.protocol}//${(i=(r=e.hostname)!==null&&r!==void 0?r:e.host)!==null&&i!==void 0?i:""}`}let n=new IPe.URL(t);if(e.path){let s=e.path.indexOf("?");s===-1?e.pathname=e.path:(e.pathname=e.path.slice(0,s),e.search=e.path.slice(s+1)),delete e.path}for(let s of yPe)e[s]&&(n[s]=e[s].toString());return n}});var Wz=w(QP=>{"use strict";Object.defineProperty(QP,"__esModule",{value:!0});var Jz=class{constructor(){this.weakMap=new WeakMap,this.map=new Map}set(e,r){typeof e=="object"?this.weakMap.set(e,r):this.map.set(e,r)}get(e){return typeof e=="object"?this.weakMap.get(e):this.map.get(e)}has(e){return typeof e=="object"?this.weakMap.has(e):this.map.has(e)}};QP.default=Jz});var SP=w(vP=>{"use strict";Object.defineProperty(vP,"__esModule",{value:!0});var wPe=async t=>{let e=[],r=0;for await(let i of t)e.push(i),r+=Buffer.byteLength(i);return Buffer.isBuffer(e[0])?Buffer.concat(e,r):Buffer.from(e.join(""))};vP.default=wPe});var _z=w(qc=>{"use strict";Object.defineProperty(qc,"__esModule",{value:!0});qc.dnsLookupIpVersionToFamily=qc.isDnsLookupIpVersion=void 0;var zz={auto:0,ipv4:4,ipv6:6};qc.isDnsLookupIpVersion=t=>t in zz;qc.dnsLookupIpVersionToFamily=t=>{if(qc.isDnsLookupIpVersion(t))return zz[t];throw new Error("Invalid DNS lookup IP version")}});var kP=w(Lw=>{"use strict";Object.defineProperty(Lw,"__esModule",{value:!0});Lw.isResponseOk=void 0;Lw.isResponseOk=t=>{let{statusCode:e}=t,r=t.request.options.followRedirect?299:399;return e>=200&&e<=r||e===304}});var Xz=w(xP=>{"use strict";Object.defineProperty(xP,"__esModule",{value:!0});var Vz=new Set;xP.default=t=>{Vz.has(t)||(Vz.add(t),process.emitWarning(`Got: ${t}`,{type:"DeprecationWarning"}))}});var Zz=w(PP=>{"use strict";Object.defineProperty(PP,"__esModule",{value:!0});var Ir=eA(),BPe=(t,e)=>{if(Ir.default.null_(t.encoding))throw new TypeError("To get a Buffer, set `options.responseType` to `buffer` instead");Ir.assert.any([Ir.default.string,Ir.default.undefined],t.encoding),Ir.assert.any([Ir.default.boolean,Ir.default.undefined],t.resolveBodyOnly),Ir.assert.any([Ir.default.boolean,Ir.default.undefined],t.methodRewriting),Ir.assert.any([Ir.default.boolean,Ir.default.undefined],t.isStream),Ir.assert.any([Ir.default.string,Ir.default.undefined],t.responseType),t.responseType===void 0&&(t.responseType="text");let{retry:r}=t;if(e?t.retry=N({},e.retry):t.retry={calculateDelay:i=>i.computedValue,limit:0,methods:[],statusCodes:[],errorCodes:[],maxRetryAfter:void 0},Ir.default.object(r)?(t.retry=N(N({},t.retry),r),t.retry.methods=[...new Set(t.retry.methods.map(i=>i.toUpperCase()))],t.retry.statusCodes=[...new Set(t.retry.statusCodes)],t.retry.errorCodes=[...new Set(t.retry.errorCodes)]):Ir.default.number(r)&&(t.retry.limit=r),Ir.default.undefined(t.retry.maxRetryAfter)&&(t.retry.maxRetryAfter=Math.min(...[t.timeout.request,t.timeout.connect].filter(Ir.default.number))),Ir.default.object(t.pagination)){e&&(t.pagination=N(N({},e.pagination),t.pagination));let{pagination:i}=t;if(!Ir.default.function_(i.transform))throw new Error("`options.pagination.transform` must be implemented");if(!Ir.default.function_(i.shouldContinue))throw new Error("`options.pagination.shouldContinue` must be implemented");if(!Ir.default.function_(i.filter))throw new TypeError("`options.pagination.filter` must be implemented");if(!Ir.default.function_(i.paginate))throw new Error("`options.pagination.paginate` must be implemented")}return t.responseType==="json"&&t.headers.accept===void 0&&(t.headers.accept="application/json"),t};PP.default=BPe});var $z=w(Nd=>{"use strict";Object.defineProperty(Nd,"__esModule",{value:!0});Nd.retryAfterStatusCodes=void 0;Nd.retryAfterStatusCodes=new Set([413,429,503]);var bPe=({attemptCount:t,retryOptions:e,error:r,retryAfter:i})=>{if(t>e.limit)return 0;let n=e.methods.includes(r.options.method),s=e.errorCodes.includes(r.code),o=r.response&&e.statusCodes.includes(r.response.statusCode);if(!n||!s&&!o)return 0;if(r.response){if(i)return e.maxRetryAfter===void 0||i>e.maxRetryAfter?0:i;if(r.response.statusCode===413)return 0}let a=Math.random()*100;return 2**(t-1)*1e3+a};Nd.default=bPe});var Td=w(qt=>{"use strict";Object.defineProperty(qt,"__esModule",{value:!0});qt.UnsupportedProtocolError=qt.ReadError=qt.TimeoutError=qt.UploadError=qt.CacheError=qt.HTTPError=qt.MaxRedirectsError=qt.RequestError=qt.setNonEnumerableProperties=qt.knownHookEvents=qt.withoutBody=qt.kIsNormalizedAlready=void 0;var e5=require("util"),t5=require("stream"),QPe=require("fs"),Al=require("url"),r5=require("http"),DP=require("http"),vPe=require("https"),SPe=u4(),kPe=m4(),i5=Z4(),xPe=rz(),PPe=Nz(),DPe=Dw(),Ie=eA(),RPe=Kz(),n5=CP(),FPe=IP(),s5=Gz(),NPe=Yz(),o5=qz(),LPe=Wz(),TPe=SP(),a5=_z(),OPe=kP(),ll=Xz(),MPe=Zz(),KPe=$z(),RP,Ri=Symbol("request"),Tw=Symbol("response"),$g=Symbol("responseSize"),ef=Symbol("downloadedSize"),tf=Symbol("bodySize"),rf=Symbol("uploadedSize"),Ow=Symbol("serverResponsesPiped"),A5=Symbol("unproxyEvents"),l5=Symbol("isFromCache"),FP=Symbol("cancelTimeouts"),c5=Symbol("startedReading"),nf=Symbol("stopReading"),Mw=Symbol("triggerRead"),cl=Symbol("body"),Ld=Symbol("jobs"),u5=Symbol("originalResponse"),g5=Symbol("retryTimeout");qt.kIsNormalizedAlready=Symbol("isNormalizedAlready");var UPe=Ie.default.string(process.versions.brotli);qt.withoutBody=new Set(["GET","HEAD"]);qt.knownHookEvents=["init","beforeRequest","beforeRedirect","beforeError","beforeRetry","afterResponse"];function HPe(t){for(let e in t){let r=t[e];if(!Ie.default.string(r)&&!Ie.default.number(r)&&!Ie.default.boolean(r)&&!Ie.default.null_(r)&&!Ie.default.undefined(r))throw new TypeError(`The \`searchParams\` value '${String(r)}' must be a string, number, boolean or null`)}}function GPe(t){return Ie.default.object(t)&&!("statusCode"in t)}var NP=new LPe.default,jPe=async t=>new Promise((e,r)=>{let i=n=>{r(n)};t.pending||e(),t.once("error",i),t.once("ready",()=>{t.off("error",i),e()})}),YPe=new Set([300,301,302,303,304,307,308]),qPe=["context","body","json","form"];qt.setNonEnumerableProperties=(t,e)=>{let r={};for(let i of t)if(!!i)for(let n of qPe)n in i&&(r[n]={writable:!0,configurable:!0,enumerable:!1,value:i[n]});Object.defineProperties(e,r)};var fi=class extends Error{constructor(e,r,i){var n;super(e);if(Error.captureStackTrace(this,this.constructor),this.name="RequestError",this.code=r.code,i instanceof LP?(Object.defineProperty(this,"request",{enumerable:!1,value:i}),Object.defineProperty(this,"response",{enumerable:!1,value:i[Tw]}),Object.defineProperty(this,"options",{enumerable:!1,value:i.options})):Object.defineProperty(this,"options",{enumerable:!1,value:i}),this.timings=(n=this.request)===null||n===void 0?void 0:n.timings,Ie.default.string(r.stack)&&Ie.default.string(this.stack)){let s=this.stack.indexOf(this.message)+this.message.length,o=this.stack.slice(s).split(` -`).reverse(),a=r.stack.slice(r.stack.indexOf(r.message)+r.message.length).split(` -`).reverse();for(;a.length!==0&&a[0]===o[0];)o.shift();this.stack=`${this.stack.slice(0,s)}${o.reverse().join(` -`)}${a.reverse().join(` -`)}`}}};qt.RequestError=fi;var TP=class extends fi{constructor(e){super(`Redirected ${e.options.maxRedirects} times. Aborting.`,{},e);this.name="MaxRedirectsError"}};qt.MaxRedirectsError=TP;var OP=class extends fi{constructor(e){super(`Response code ${e.statusCode} (${e.statusMessage})`,{},e.request);this.name="HTTPError"}};qt.HTTPError=OP;var MP=class extends fi{constructor(e,r){super(e.message,e,r);this.name="CacheError"}};qt.CacheError=MP;var KP=class extends fi{constructor(e,r){super(e.message,e,r);this.name="UploadError"}};qt.UploadError=KP;var UP=class extends fi{constructor(e,r,i){super(e.message,e,i);this.name="TimeoutError",this.event=e.event,this.timings=r}};qt.TimeoutError=UP;var Kw=class extends fi{constructor(e,r){super(e.message,e,r);this.name="ReadError"}};qt.ReadError=Kw;var HP=class extends fi{constructor(e){super(`Unsupported protocol "${e.url.protocol}"`,{},e);this.name="UnsupportedProtocolError"}};qt.UnsupportedProtocolError=HP;var JPe=["socket","connect","continue","information","upgrade","timeout"],LP=class extends t5.Duplex{constructor(e,r={},i){super({autoDestroy:!1,highWaterMark:0});this[ef]=0,this[rf]=0,this.requestInitialized=!1,this[Ow]=new Set,this.redirects=[],this[nf]=!1,this[Mw]=!1,this[Ld]=[],this.retryCount=0,this._progressCallbacks=[];let n=()=>this._unlockWrite(),s=()=>this._lockWrite();this.on("pipe",c=>{c.prependListener("data",n),c.on("data",s),c.prependListener("end",n),c.on("end",s)}),this.on("unpipe",c=>{c.off("data",n),c.off("data",s),c.off("end",n),c.off("end",s)}),this.on("pipe",c=>{c instanceof DP.IncomingMessage&&(this.options.headers=N(N({},c.headers),this.options.headers))});let{json:o,body:a,form:l}=r;if((o||a||l)&&this._lockWrite(),qt.kIsNormalizedAlready in r)this.options=r;else try{this.options=this.constructor.normalizeArguments(e,r,i)}catch(c){Ie.default.nodeStream(r.body)&&r.body.destroy(),this.destroy(c);return}(async()=>{var c;try{this.options.body instanceof QPe.ReadStream&&await jPe(this.options.body);let{url:u}=this.options;if(!u)throw new TypeError("Missing `url` property");if(this.requestUrl=u.toString(),decodeURI(this.requestUrl),await this._finalizeBody(),await this._makeRequest(),this.destroyed){(c=this[Ri])===null||c===void 0||c.destroy();return}for(let g of this[Ld])g();this[Ld].length=0,this.requestInitialized=!0}catch(u){if(u instanceof fi){this._beforeError(u);return}this.destroyed||this.destroy(u)}})()}static normalizeArguments(e,r,i){var n,s,o,a,l;let c=r;if(Ie.default.object(e)&&!Ie.default.urlInstance(e))r=N(N(N({},i),e),r);else{if(e&&r&&r.url!==void 0)throw new TypeError("The `url` option is mutually exclusive with the `input` argument");r=N(N({},i),r),e!==void 0&&(r.url=e),Ie.default.urlInstance(r.url)&&(r.url=new Al.URL(r.url.toString()))}if(r.cache===!1&&(r.cache=void 0),r.dnsCache===!1&&(r.dnsCache=void 0),Ie.assert.any([Ie.default.string,Ie.default.undefined],r.method),Ie.assert.any([Ie.default.object,Ie.default.undefined],r.headers),Ie.assert.any([Ie.default.string,Ie.default.urlInstance,Ie.default.undefined],r.prefixUrl),Ie.assert.any([Ie.default.object,Ie.default.undefined],r.cookieJar),Ie.assert.any([Ie.default.object,Ie.default.string,Ie.default.undefined],r.searchParams),Ie.assert.any([Ie.default.object,Ie.default.string,Ie.default.undefined],r.cache),Ie.assert.any([Ie.default.object,Ie.default.number,Ie.default.undefined],r.timeout),Ie.assert.any([Ie.default.object,Ie.default.undefined],r.context),Ie.assert.any([Ie.default.object,Ie.default.undefined],r.hooks),Ie.assert.any([Ie.default.boolean,Ie.default.undefined],r.decompress),Ie.assert.any([Ie.default.boolean,Ie.default.undefined],r.ignoreInvalidCookies),Ie.assert.any([Ie.default.boolean,Ie.default.undefined],r.followRedirect),Ie.assert.any([Ie.default.number,Ie.default.undefined],r.maxRedirects),Ie.assert.any([Ie.default.boolean,Ie.default.undefined],r.throwHttpErrors),Ie.assert.any([Ie.default.boolean,Ie.default.undefined],r.http2),Ie.assert.any([Ie.default.boolean,Ie.default.undefined],r.allowGetBody),Ie.assert.any([Ie.default.string,Ie.default.undefined],r.localAddress),Ie.assert.any([a5.isDnsLookupIpVersion,Ie.default.undefined],r.dnsLookupIpVersion),Ie.assert.any([Ie.default.object,Ie.default.undefined],r.https),Ie.assert.any([Ie.default.boolean,Ie.default.undefined],r.rejectUnauthorized),r.https&&(Ie.assert.any([Ie.default.boolean,Ie.default.undefined],r.https.rejectUnauthorized),Ie.assert.any([Ie.default.function_,Ie.default.undefined],r.https.checkServerIdentity),Ie.assert.any([Ie.default.string,Ie.default.object,Ie.default.array,Ie.default.undefined],r.https.certificateAuthority),Ie.assert.any([Ie.default.string,Ie.default.object,Ie.default.array,Ie.default.undefined],r.https.key),Ie.assert.any([Ie.default.string,Ie.default.object,Ie.default.array,Ie.default.undefined],r.https.certificate),Ie.assert.any([Ie.default.string,Ie.default.undefined],r.https.passphrase),Ie.assert.any([Ie.default.string,Ie.default.buffer,Ie.default.array,Ie.default.undefined],r.https.pfx)),Ie.assert.any([Ie.default.object,Ie.default.undefined],r.cacheOptions),Ie.default.string(r.method)?r.method=r.method.toUpperCase():r.method="GET",r.headers===(i==null?void 0:i.headers)?r.headers=N({},r.headers):r.headers=DPe(N(N({},i==null?void 0:i.headers),r.headers)),"slashes"in r)throw new TypeError("The legacy `url.Url` has been deprecated. Use `URL` instead.");if("auth"in r)throw new TypeError("Parameter `auth` is deprecated. Use `username` / `password` instead.");if("searchParams"in r&&r.searchParams&&r.searchParams!==(i==null?void 0:i.searchParams)){let h;if(Ie.default.string(r.searchParams)||r.searchParams instanceof Al.URLSearchParams)h=new Al.URLSearchParams(r.searchParams);else{HPe(r.searchParams),h=new Al.URLSearchParams;for(let p in r.searchParams){let m=r.searchParams[p];m===null?h.append(p,""):m!==void 0&&h.append(p,m)}}(n=i==null?void 0:i.searchParams)===null||n===void 0||n.forEach((p,m)=>{h.has(m)||h.append(m,p)}),r.searchParams=h}if(r.username=(s=r.username)!==null&&s!==void 0?s:"",r.password=(o=r.password)!==null&&o!==void 0?o:"",Ie.default.undefined(r.prefixUrl)?r.prefixUrl=(a=i==null?void 0:i.prefixUrl)!==null&&a!==void 0?a:"":(r.prefixUrl=r.prefixUrl.toString(),r.prefixUrl!==""&&!r.prefixUrl.endsWith("/")&&(r.prefixUrl+="/")),Ie.default.string(r.url)){if(r.url.startsWith("/"))throw new Error("`input` must not start with a slash when using `prefixUrl`");r.url=o5.default(r.prefixUrl+r.url,r)}else(Ie.default.undefined(r.url)&&r.prefixUrl!==""||r.protocol)&&(r.url=o5.default(r.prefixUrl,r));if(r.url){"port"in r&&delete r.port;let{prefixUrl:h}=r;Object.defineProperty(r,"prefixUrl",{set:m=>{let y=r.url;if(!y.href.startsWith(m))throw new Error(`Cannot change \`prefixUrl\` from ${h} to ${m}: ${y.href}`);r.url=new Al.URL(m+y.href.slice(h.length)),h=m},get:()=>h});let{protocol:p}=r.url;if(p==="unix:"&&(p="http:",r.url=new Al.URL(`http://unix${r.url.pathname}${r.url.search}`)),r.searchParams&&(r.url.search=r.searchParams.toString()),p!=="http:"&&p!=="https:")throw new HP(r);r.username===""?r.username=r.url.username:r.url.username=r.username,r.password===""?r.password=r.url.password:r.url.password=r.password}let{cookieJar:u}=r;if(u){let{setCookie:h,getCookieString:p}=u;Ie.assert.function_(h),Ie.assert.function_(p),h.length===4&&p.length===0&&(h=e5.promisify(h.bind(r.cookieJar)),p=e5.promisify(p.bind(r.cookieJar)),r.cookieJar={setCookie:h,getCookieString:p})}let{cache:g}=r;if(g&&(NP.has(g)||NP.set(g,new i5((h,p)=>{let m=h[Ri](h,p);return Ie.default.promise(m)&&(m.once=(y,b)=>{if(y==="error")m.catch(b);else if(y==="abort")(async()=>{try{(await m).once("abort",b)}catch(S){}})();else throw new Error(`Unknown HTTP2 promise event: ${y}`);return m}),m},g))),r.cacheOptions=N({},r.cacheOptions),r.dnsCache===!0)RP||(RP=new kPe.default),r.dnsCache=RP;else if(!Ie.default.undefined(r.dnsCache)&&!r.dnsCache.lookup)throw new TypeError(`Parameter \`dnsCache\` must be a CacheableLookup instance or a boolean, got ${Ie.default(r.dnsCache)}`);Ie.default.number(r.timeout)?r.timeout={request:r.timeout}:i&&r.timeout!==i.timeout?r.timeout=N(N({},i.timeout),r.timeout):r.timeout=N({},r.timeout),r.context||(r.context={});let f=r.hooks===(i==null?void 0:i.hooks);r.hooks=N({},r.hooks);for(let h of qt.knownHookEvents)if(h in r.hooks)if(Ie.default.array(r.hooks[h]))r.hooks[h]=[...r.hooks[h]];else throw new TypeError(`Parameter \`${h}\` must be an Array, got ${Ie.default(r.hooks[h])}`);else r.hooks[h]=[];if(i&&!f)for(let h of qt.knownHookEvents)i.hooks[h].length>0&&(r.hooks[h]=[...i.hooks[h],...r.hooks[h]]);if("family"in r&&ll.default('"options.family" was never documented, please use "options.dnsLookupIpVersion"'),(i==null?void 0:i.https)&&(r.https=N(N({},i.https),r.https)),"rejectUnauthorized"in r&&ll.default('"options.rejectUnauthorized" is now deprecated, please use "options.https.rejectUnauthorized"'),"checkServerIdentity"in r&&ll.default('"options.checkServerIdentity" was never documented, please use "options.https.checkServerIdentity"'),"ca"in r&&ll.default('"options.ca" was never documented, please use "options.https.certificateAuthority"'),"key"in r&&ll.default('"options.key" was never documented, please use "options.https.key"'),"cert"in r&&ll.default('"options.cert" was never documented, please use "options.https.certificate"'),"passphrase"in r&&ll.default('"options.passphrase" was never documented, please use "options.https.passphrase"'),"pfx"in r&&ll.default('"options.pfx" was never documented, please use "options.https.pfx"'),"followRedirects"in r)throw new TypeError("The `followRedirects` option does not exist. Use `followRedirect` instead.");if(r.agent){for(let h in r.agent)if(h!=="http"&&h!=="https"&&h!=="http2")throw new TypeError(`Expected the \`options.agent\` properties to be \`http\`, \`https\` or \`http2\`, got \`${h}\``)}return r.maxRedirects=(l=r.maxRedirects)!==null&&l!==void 0?l:0,qt.setNonEnumerableProperties([i,c],r),MPe.default(r,i)}_lockWrite(){let e=()=>{throw new TypeError("The payload has been already provided")};this.write=e,this.end=e}_unlockWrite(){this.write=super.write,this.end=super.end}async _finalizeBody(){let{options:e}=this,{headers:r}=e,i=!Ie.default.undefined(e.form),n=!Ie.default.undefined(e.json),s=!Ie.default.undefined(e.body),o=i||n||s,a=qt.withoutBody.has(e.method)&&!(e.method==="GET"&&e.allowGetBody);if(this._cannotHaveBody=a,o){if(a)throw new TypeError(`The \`${e.method}\` method cannot be used with a body`);if([s,i,n].filter(l=>l).length>1)throw new TypeError("The `body`, `json` and `form` options are mutually exclusive");if(s&&!(e.body instanceof t5.Readable)&&!Ie.default.string(e.body)&&!Ie.default.buffer(e.body)&&!n5.default(e.body))throw new TypeError("The `body` option must be a stream.Readable, string or Buffer");if(i&&!Ie.default.object(e.form))throw new TypeError("The `form` option must be an Object");{let l=!Ie.default.string(r["content-type"]);s?(n5.default(e.body)&&l&&(r["content-type"]=`multipart/form-data; boundary=${e.body.getBoundary()}`),this[cl]=e.body):i?(l&&(r["content-type"]="application/x-www-form-urlencoded"),this[cl]=new Al.URLSearchParams(e.form).toString()):(l&&(r["content-type"]="application/json"),this[cl]=e.stringifyJson(e.json));let c=await RPe.default(this[cl],e.headers);Ie.default.undefined(r["content-length"])&&Ie.default.undefined(r["transfer-encoding"])&&!a&&!Ie.default.undefined(c)&&(r["content-length"]=String(c))}}else a?this._lockWrite():this._unlockWrite();this[tf]=Number(r["content-length"])||void 0}async _onResponseBase(e){let{options:r}=this,{url:i}=r;this[u5]=e,r.decompress&&(e=xPe(e));let n=e.statusCode,s=e;s.statusMessage=s.statusMessage?s.statusMessage:r5.STATUS_CODES[n],s.url=r.url.toString(),s.requestUrl=this.requestUrl,s.redirectUrls=this.redirects,s.request=this,s.isFromCache=e.fromCache||!1,s.ip=this.ip,s.retryCount=this.retryCount,this[l5]=s.isFromCache,this[$g]=Number(e.headers["content-length"])||void 0,this[Tw]=e,e.once("end",()=>{this[$g]=this[ef],this.emit("downloadProgress",this.downloadProgress)}),e.once("error",a=>{e.destroy(),this._beforeError(new Kw(a,this))}),e.once("aborted",()=>{this._beforeError(new Kw({name:"Error",message:"The server aborted pending request",code:"ECONNRESET"},this))}),this.emit("downloadProgress",this.downloadProgress);let o=e.headers["set-cookie"];if(Ie.default.object(r.cookieJar)&&o){let a=o.map(async l=>r.cookieJar.setCookie(l,i.toString()));r.ignoreInvalidCookies&&(a=a.map(async l=>l.catch(()=>{})));try{await Promise.all(a)}catch(l){this._beforeError(l);return}}if(r.followRedirect&&e.headers.location&&YPe.has(n)){if(e.resume(),this[Ri]&&(this[FP](),delete this[Ri],this[A5]()),(n===303&&r.method!=="GET"&&r.method!=="HEAD"||!r.methodRewriting)&&(r.method="GET","body"in r&&delete r.body,"json"in r&&delete r.json,"form"in r&&delete r.form,this[cl]=void 0,delete r.headers["content-length"]),this.redirects.length>=r.maxRedirects){this._beforeError(new TP(this));return}try{let l=Buffer.from(e.headers.location,"binary").toString(),c=new Al.URL(l,i),u=c.toString();decodeURI(u),c.hostname!==i.hostname||c.port!==i.port?("host"in r.headers&&delete r.headers.host,"cookie"in r.headers&&delete r.headers.cookie,"authorization"in r.headers&&delete r.headers.authorization,(r.username||r.password)&&(r.username="",r.password="")):(c.username=r.username,c.password=r.password),this.redirects.push(u),r.url=c;for(let g of r.hooks.beforeRedirect)await g(r,s);this.emit("redirect",s,r),await this._makeRequest()}catch(l){this._beforeError(l);return}return}if(r.isStream&&r.throwHttpErrors&&!OPe.isResponseOk(s)){this._beforeError(new OP(s));return}e.on("readable",()=>{this[Mw]&&this._read()}),this.on("resume",()=>{e.resume()}),this.on("pause",()=>{e.pause()}),e.once("end",()=>{this.push(null)}),this.emit("response",e);for(let a of this[Ow])if(!a.headersSent){for(let l in e.headers){let c=r.decompress?l!=="content-encoding":!0,u=e.headers[l];c&&a.setHeader(l,u)}a.statusCode=n}}async _onResponse(e){try{await this._onResponseBase(e)}catch(r){this._beforeError(r)}}_onRequest(e){let{options:r}=this,{timeout:i,url:n}=r;SPe.default(e),this[FP]=s5.default(e,i,n);let s=r.cache?"cacheableResponse":"response";e.once(s,l=>{this._onResponse(l)}),e.once("error",l=>{var c;e.destroy(),(c=e.res)===null||c===void 0||c.removeAllListeners("end"),l=l instanceof s5.TimeoutError?new UP(l,this.timings,this):new fi(l.message,l,this),this._beforeError(l)}),this[A5]=FPe.default(e,this,JPe),this[Ri]=e,this.emit("uploadProgress",this.uploadProgress);let o=this[cl],a=this.redirects.length===0?this:e;Ie.default.nodeStream(o)?(o.pipe(a),o.once("error",l=>{this._beforeError(new KP(l,this))})):(this._unlockWrite(),Ie.default.undefined(o)?(this._cannotHaveBody||this._noPipe)&&(a.end(),this._lockWrite()):(this._writeRequest(o,void 0,()=>{}),a.end(),this._lockWrite())),this.emit("request",e)}async _createCacheableRequest(e,r){return new Promise((i,n)=>{Object.assign(r,NPe.default(e)),delete r.url;let s,o=NP.get(r.cache)(r,async a=>{a._readableState.autoDestroy=!1,s&&(await s).emit("cacheableResponse",a),i(a)});r.url=e,o.once("error",n),o.once("request",async a=>{s=a,i(s)})})}async _makeRequest(){var e,r,i,n,s;let{options:o}=this,{headers:a}=o;for(let b in a)if(Ie.default.undefined(a[b]))delete a[b];else if(Ie.default.null_(a[b]))throw new TypeError(`Use \`undefined\` instead of \`null\` to delete the \`${b}\` header`);if(o.decompress&&Ie.default.undefined(a["accept-encoding"])&&(a["accept-encoding"]=UPe?"gzip, deflate, br":"gzip, deflate"),o.cookieJar){let b=await o.cookieJar.getCookieString(o.url.toString());Ie.default.nonEmptyString(b)&&(o.headers.cookie=b)}for(let b of o.hooks.beforeRequest){let S=await b(o);if(!Ie.default.undefined(S)){o.request=()=>S;break}}o.body&&this[cl]!==o.body&&(this[cl]=o.body);let{agent:l,request:c,timeout:u,url:g}=o;if(o.dnsCache&&!("lookup"in o)&&(o.lookup=o.dnsCache.lookup),g.hostname==="unix"){let b=/(?.+?):(?.+)/.exec(`${g.pathname}${g.search}`);if(b==null?void 0:b.groups){let{socketPath:S,path:k}=b.groups;Object.assign(o,{socketPath:S,path:k,host:""})}}let f=g.protocol==="https:",h;o.http2?h=PPe.auto:h=f?vPe.request:r5.request;let p=(e=o.request)!==null&&e!==void 0?e:h,m=o.cache?this._createCacheableRequest:p;l&&!o.http2&&(o.agent=l[f?"https":"http"]),o[Ri]=p,delete o.request,delete o.timeout;let y=o;if(y.shared=(r=o.cacheOptions)===null||r===void 0?void 0:r.shared,y.cacheHeuristic=(i=o.cacheOptions)===null||i===void 0?void 0:i.cacheHeuristic,y.immutableMinTimeToLive=(n=o.cacheOptions)===null||n===void 0?void 0:n.immutableMinTimeToLive,y.ignoreCargoCult=(s=o.cacheOptions)===null||s===void 0?void 0:s.ignoreCargoCult,o.dnsLookupIpVersion!==void 0)try{y.family=a5.dnsLookupIpVersionToFamily(o.dnsLookupIpVersion)}catch(b){throw new Error("Invalid `dnsLookupIpVersion` option value")}o.https&&("rejectUnauthorized"in o.https&&(y.rejectUnauthorized=o.https.rejectUnauthorized),o.https.checkServerIdentity&&(y.checkServerIdentity=o.https.checkServerIdentity),o.https.certificateAuthority&&(y.ca=o.https.certificateAuthority),o.https.certificate&&(y.cert=o.https.certificate),o.https.key&&(y.key=o.https.key),o.https.passphrase&&(y.passphrase=o.https.passphrase),o.https.pfx&&(y.pfx=o.https.pfx));try{let b=await m(g,y);Ie.default.undefined(b)&&(b=h(g,y)),o.request=c,o.timeout=u,o.agent=l,o.https&&("rejectUnauthorized"in o.https&&delete y.rejectUnauthorized,o.https.checkServerIdentity&&delete y.checkServerIdentity,o.https.certificateAuthority&&delete y.ca,o.https.certificate&&delete y.cert,o.https.key&&delete y.key,o.https.passphrase&&delete y.passphrase,o.https.pfx&&delete y.pfx),GPe(b)?this._onRequest(b):this.writable?(this.once("finish",()=>{this._onResponse(b)}),this._unlockWrite(),this.end(),this._lockWrite()):this._onResponse(b)}catch(b){throw b instanceof i5.CacheError?new MP(b,this):new fi(b.message,b,this)}}async _error(e){try{for(let r of this.options.hooks.beforeError)e=await r(e)}catch(r){e=new fi(r.message,r,this)}this.destroy(e)}_beforeError(e){if(this[nf])return;let{options:r}=this,i=this.retryCount+1;this[nf]=!0,e instanceof fi||(e=new fi(e.message,e,this));let n=e,{response:s}=n;(async()=>{if(s&&!s.body){s.setEncoding(this._readableState.encoding);try{s.rawBody=await TPe.default(s),s.body=s.rawBody.toString()}catch(o){}}if(this.listenerCount("retry")!==0){let o;try{let a;s&&"retry-after"in s.headers&&(a=Number(s.headers["retry-after"]),Number.isNaN(a)?(a=Date.parse(s.headers["retry-after"])-Date.now(),a<=0&&(a=1)):a*=1e3),o=await r.retry.calculateDelay({attemptCount:i,retryOptions:r.retry,error:n,retryAfter:a,computedValue:KPe.default({attemptCount:i,retryOptions:r.retry,error:n,retryAfter:a,computedValue:0})})}catch(a){this._error(new fi(a.message,a,this));return}if(o){let a=async()=>{try{for(let l of this.options.hooks.beforeRetry)await l(this.options,n,i)}catch(l){this._error(new fi(l.message,e,this));return}this.destroyed||(this.destroy(),this.emit("retry",i,e))};this[g5]=setTimeout(a,o);return}}this._error(n)})()}_read(){this[Mw]=!0;let e=this[Tw];if(e&&!this[nf]){e.readableLength&&(this[Mw]=!1);let r;for(;(r=e.read())!==null;){this[ef]+=r.length,this[c5]=!0;let i=this.downloadProgress;i.percent<1&&this.emit("downloadProgress",i),this.push(r)}}}_write(e,r,i){let n=()=>{this._writeRequest(e,r,i)};this.requestInitialized?n():this[Ld].push(n)}_writeRequest(e,r,i){this[Ri].destroyed||(this._progressCallbacks.push(()=>{this[rf]+=Buffer.byteLength(e,r);let n=this.uploadProgress;n.percent<1&&this.emit("uploadProgress",n)}),this[Ri].write(e,r,n=>{!n&&this._progressCallbacks.length>0&&this._progressCallbacks.shift()(),i(n)}))}_final(e){let r=()=>{for(;this._progressCallbacks.length!==0;)this._progressCallbacks.shift()();if(!(Ri in this)){e();return}if(this[Ri].destroyed){e();return}this[Ri].end(i=>{i||(this[tf]=this[rf],this.emit("uploadProgress",this.uploadProgress),this[Ri].emit("upload-complete")),e(i)})};this.requestInitialized?r():this[Ld].push(r)}_destroy(e,r){var i;this[nf]=!0,clearTimeout(this[g5]),Ri in this&&(this[FP](),((i=this[Tw])===null||i===void 0?void 0:i.complete)||this[Ri].destroy()),e!==null&&!Ie.default.undefined(e)&&!(e instanceof fi)&&(e=new fi(e.message,e,this)),r(e)}get _isAboutToError(){return this[nf]}get ip(){var e;return(e=this.socket)===null||e===void 0?void 0:e.remoteAddress}get aborted(){var e,r,i;return((r=(e=this[Ri])===null||e===void 0?void 0:e.destroyed)!==null&&r!==void 0?r:this.destroyed)&&!((i=this[u5])===null||i===void 0?void 0:i.complete)}get socket(){var e,r;return(r=(e=this[Ri])===null||e===void 0?void 0:e.socket)!==null&&r!==void 0?r:void 0}get downloadProgress(){let e;return this[$g]?e=this[ef]/this[$g]:this[$g]===this[ef]?e=1:e=0,{percent:e,transferred:this[ef],total:this[$g]}}get uploadProgress(){let e;return this[tf]?e=this[rf]/this[tf]:this[tf]===this[rf]?e=1:e=0,{percent:e,transferred:this[rf],total:this[tf]}}get timings(){var e;return(e=this[Ri])===null||e===void 0?void 0:e.timings}get isFromCache(){return this[l5]}pipe(e,r){if(this[c5])throw new Error("Failed to pipe. The response has been emitted already.");return e instanceof DP.ServerResponse&&this[Ow].add(e),super.pipe(e,r)}unpipe(e){return e instanceof DP.ServerResponse&&this[Ow].delete(e),super.unpipe(e),this}};qt.default=LP});var Od=w(po=>{"use strict";var WPe=po&&po.__createBinding||(Object.create?function(t,e,r,i){i===void 0&&(i=r),Object.defineProperty(t,i,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,i){i===void 0&&(i=r),t[i]=e[r]}),zPe=po&&po.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&WPe(e,t,r)};Object.defineProperty(po,"__esModule",{value:!0});po.CancelError=po.ParseError=void 0;var f5=Td(),h5=class extends f5.RequestError{constructor(e,r){let{options:i}=r.request;super(`${e.message} in "${i.url.toString()}"`,e,r.request);this.name="ParseError"}};po.ParseError=h5;var p5=class extends f5.RequestError{constructor(e){super("Promise was canceled",{},e);this.name="CancelError"}get isCanceled(){return!0}};po.CancelError=p5;zPe(Td(),po)});var C5=w(GP=>{"use strict";Object.defineProperty(GP,"__esModule",{value:!0});var d5=Od(),_Pe=(t,e,r,i)=>{let{rawBody:n}=t;try{if(e==="text")return n.toString(i);if(e==="json")return n.length===0?"":r(n.toString());if(e==="buffer")return n;throw new d5.ParseError({message:`Unknown body type '${e}'`,name:"Error"},t)}catch(s){throw new d5.ParseError(s,t)}};GP.default=_Pe});var jP=w(ul=>{"use strict";var VPe=ul&&ul.__createBinding||(Object.create?function(t,e,r,i){i===void 0&&(i=r),Object.defineProperty(t,i,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,i){i===void 0&&(i=r),t[i]=e[r]}),XPe=ul&&ul.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&VPe(e,t,r)};Object.defineProperty(ul,"__esModule",{value:!0});var ZPe=require("events"),$Pe=eA(),eDe=l4(),Uw=Od(),m5=C5(),E5=Td(),tDe=IP(),rDe=SP(),I5=kP(),iDe=["request","response","redirect","uploadProgress","downloadProgress"];function y5(t){let e,r,i=new ZPe.EventEmitter,n=new eDe((o,a,l)=>{let c=u=>{let g=new E5.default(void 0,t);g.retryCount=u,g._noPipe=!0,l(()=>g.destroy()),l.shouldReject=!1,l(()=>a(new Uw.CancelError(g))),e=g,g.once("response",async p=>{var m;if(p.retryCount=u,p.request.aborted)return;let y;try{y=await rDe.default(g),p.rawBody=y}catch(T){return}if(g._isAboutToError)return;let b=((m=p.headers["content-encoding"])!==null&&m!==void 0?m:"").toLowerCase(),S=["gzip","deflate","br"].includes(b),{options:k}=g;if(S&&!k.decompress)p.body=y;else try{p.body=m5.default(p,k.responseType,k.parseJson,k.encoding)}catch(T){if(p.body=y.toString(),I5.isResponseOk(p)){g._beforeError(T);return}}try{for(let[T,Y]of k.hooks.afterResponse.entries())p=await Y(p,async j=>{let Z=E5.default.normalizeArguments(void 0,ie(N({},j),{retry:{calculateDelay:()=>0},throwHttpErrors:!1,resolveBodyOnly:!1}),k);Z.hooks.afterResponse=Z.hooks.afterResponse.slice(0,T);for(let re of Z.hooks.beforeRetry)await re(Z);let J=y5(Z);return l(()=>{J.catch(()=>{}),J.cancel()}),J})}catch(T){g._beforeError(new Uw.RequestError(T.message,T,g));return}if(!I5.isResponseOk(p)){g._beforeError(new Uw.HTTPError(p));return}r=p,o(g.options.resolveBodyOnly?p.body:p)});let f=p=>{if(n.isCanceled)return;let{options:m}=g;if(p instanceof Uw.HTTPError&&!m.throwHttpErrors){let{response:y}=p;o(g.options.resolveBodyOnly?y.body:y);return}a(p)};g.once("error",f);let h=g.options.body;g.once("retry",(p,m)=>{var y,b;if(h===((y=m.request)===null||y===void 0?void 0:y.options.body)&&$Pe.default.nodeStream((b=m.request)===null||b===void 0?void 0:b.options.body)){f(m);return}c(p)}),tDe.default(g,i,iDe)};c(0)});n.on=(o,a)=>(i.on(o,a),n);let s=o=>{let a=(async()=>{await n;let{options:l}=r.request;return m5.default(r,o,l.parseJson,l.encoding)})();return Object.defineProperties(a,Object.getOwnPropertyDescriptors(n)),a};return n.json=()=>{let{headers:o}=e.options;return!e.writableFinished&&o.accept===void 0&&(o.accept="application/json"),s("json")},n.buffer=()=>s("buffer"),n.text=()=>s("text"),n}ul.default=y5;XPe(Od(),ul)});var w5=w(YP=>{"use strict";Object.defineProperty(YP,"__esModule",{value:!0});var nDe=Od();function sDe(t,...e){let r=(async()=>{if(t instanceof nDe.RequestError)try{for(let n of e)if(n)for(let s of n)t=await s(t)}catch(n){t=n}throw t})(),i=()=>r;return r.json=i,r.text=i,r.buffer=i,r.on=i,r}YP.default=sDe});var Q5=w(qP=>{"use strict";Object.defineProperty(qP,"__esModule",{value:!0});var B5=eA();function b5(t){for(let e of Object.values(t))(B5.default.plainObject(e)||B5.default.array(e))&&b5(e);return Object.freeze(t)}qP.default=b5});var S5=w(v5=>{"use strict";Object.defineProperty(v5,"__esModule",{value:!0})});var JP=w(Ls=>{"use strict";var oDe=Ls&&Ls.__createBinding||(Object.create?function(t,e,r,i){i===void 0&&(i=r),Object.defineProperty(t,i,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,i){i===void 0&&(i=r),t[i]=e[r]}),aDe=Ls&&Ls.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&oDe(e,t,r)};Object.defineProperty(Ls,"__esModule",{value:!0});Ls.defaultHandler=void 0;var k5=eA(),Ts=jP(),ADe=w5(),Hw=Td(),lDe=Q5(),cDe={RequestError:Ts.RequestError,CacheError:Ts.CacheError,ReadError:Ts.ReadError,HTTPError:Ts.HTTPError,MaxRedirectsError:Ts.MaxRedirectsError,TimeoutError:Ts.TimeoutError,ParseError:Ts.ParseError,CancelError:Ts.CancelError,UnsupportedProtocolError:Ts.UnsupportedProtocolError,UploadError:Ts.UploadError},uDe=async t=>new Promise(e=>{setTimeout(e,t)}),{normalizeArguments:Gw}=Hw.default,x5=(...t)=>{let e;for(let r of t)e=Gw(void 0,r,e);return e},gDe=t=>t.isStream?new Hw.default(void 0,t):Ts.default(t),fDe=t=>"defaults"in t&&"options"in t.defaults,hDe=["get","post","put","patch","head","delete"];Ls.defaultHandler=(t,e)=>e(t);var P5=(t,e)=>{if(t)for(let r of t)r(e)},D5=t=>{t._rawHandlers=t.handlers,t.handlers=t.handlers.map(i=>(n,s)=>{let o,a=i(n,l=>(o=s(l),o));if(a!==o&&!n.isStream&&o){let l=a,{then:c,catch:u,finally:g}=l;Object.setPrototypeOf(l,Object.getPrototypeOf(o)),Object.defineProperties(l,Object.getOwnPropertyDescriptors(o)),l.then=c,l.catch=u,l.finally=g}return a});let e=(i,n={},s)=>{var o,a;let l=0,c=u=>t.handlers[l++](u,l===t.handlers.length?gDe:c);if(k5.default.plainObject(i)){let u=N(N({},i),n);Hw.setNonEnumerableProperties([i,n],u),n=u,i=void 0}try{let u;try{P5(t.options.hooks.init,n),P5((o=n.hooks)===null||o===void 0?void 0:o.init,n)}catch(f){u=f}let g=Gw(i,n,s!=null?s:t.options);if(g[Hw.kIsNormalizedAlready]=!0,u)throw new Ts.RequestError(u.message,u,g);return c(g)}catch(u){if(n.isStream)throw u;return ADe.default(u,t.options.hooks.beforeError,(a=n.hooks)===null||a===void 0?void 0:a.beforeError)}};e.extend=(...i)=>{let n=[t.options],s=[...t._rawHandlers],o;for(let a of i)fDe(a)?(n.push(a.defaults.options),s.push(...a.defaults._rawHandlers),o=a.defaults.mutableDefaults):(n.push(a),"handlers"in a&&s.push(...a.handlers),o=a.mutableDefaults);return s=s.filter(a=>a!==Ls.defaultHandler),s.length===0&&s.push(Ls.defaultHandler),D5({options:x5(...n),handlers:s,mutableDefaults:Boolean(o)})};let r=async function*(i,n){let s=Gw(i,n,t.options);s.resolveBodyOnly=!1;let o=s.pagination;if(!k5.default.object(o))throw new TypeError("`options.pagination` must be implemented");let a=[],{countLimit:l}=o,c=0;for(;c{let s=[];for await(let o of r(i,n))s.push(o);return s},e.paginate.each=r,e.stream=(i,n)=>e(i,ie(N({},n),{isStream:!0}));for(let i of hDe)e[i]=(n,s)=>e(n,ie(N({},s),{method:i})),e.stream[i]=(n,s)=>e(n,ie(N({},s),{method:i,isStream:!0}));return Object.assign(e,cDe),Object.defineProperty(e,"defaults",{value:t.mutableDefaults?t:lDe.default(t),writable:t.mutableDefaults,configurable:t.mutableDefaults,enumerable:!0}),e.mergeOptions=x5,e};Ls.default=D5;aDe(S5(),Ls)});var Yw=w((rA,jw)=>{"use strict";var pDe=rA&&rA.__createBinding||(Object.create?function(t,e,r,i){i===void 0&&(i=r),Object.defineProperty(t,i,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,i){i===void 0&&(i=r),t[i]=e[r]}),R5=rA&&rA.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&pDe(e,t,r)};Object.defineProperty(rA,"__esModule",{value:!0});var dDe=require("url"),F5=JP(),CDe={options:{method:"GET",retry:{limit:2,methods:["GET","PUT","HEAD","DELETE","OPTIONS","TRACE"],statusCodes:[408,413,429,500,502,503,504,521,522,524],errorCodes:["ETIMEDOUT","ECONNRESET","EADDRINUSE","ECONNREFUSED","EPIPE","ENOTFOUND","ENETUNREACH","EAI_AGAIN"],maxRetryAfter:void 0,calculateDelay:({computedValue:t})=>t},timeout:{},headers:{"user-agent":"got (https://github.com/sindresorhus/got)"},hooks:{init:[],beforeRequest:[],beforeRedirect:[],beforeRetry:[],beforeError:[],afterResponse:[]},cache:void 0,dnsCache:void 0,decompress:!0,throwHttpErrors:!0,followRedirect:!0,isStream:!1,responseType:"text",resolveBodyOnly:!1,maxRedirects:10,prefixUrl:"",methodRewriting:!0,ignoreInvalidCookies:!1,context:{},http2:!1,allowGetBody:!1,https:void 0,pagination:{transform:t=>t.request.options.responseType==="json"?t.body:JSON.parse(t.body),paginate:t=>{if(!Reflect.has(t.headers,"link"))return!1;let e=t.headers.link.split(","),r;for(let i of e){let n=i.split(";");if(n[1].includes("next")){r=n[0].trimStart().trim(),r=r.slice(1,-1);break}}return r?{url:new dDe.URL(r)}:!1},filter:()=>!0,shouldContinue:()=>!0,countLimit:Infinity,backoff:0,requestLimit:1e4,stackAllItems:!0},parseJson:t=>JSON.parse(t),stringifyJson:t=>JSON.stringify(t),cacheOptions:{}},handlers:[F5.defaultHandler],mutableDefaults:!1},WP=F5.default(CDe);rA.default=WP;jw.exports=WP;jw.exports.default=WP;jw.exports.__esModule=!0;R5(JP(),rA);R5(jP(),rA)});var O5=w(sf=>{"use strict";var jot=require("net"),mDe=require("tls"),zP=require("http"),N5=require("https"),EDe=require("events"),Yot=require("assert"),IDe=require("util");sf.httpOverHttp=yDe;sf.httpsOverHttp=wDe;sf.httpOverHttps=BDe;sf.httpsOverHttps=bDe;function yDe(t){var e=new iA(t);return e.request=zP.request,e}function wDe(t){var e=new iA(t);return e.request=zP.request,e.createSocket=L5,e.defaultPort=443,e}function BDe(t){var e=new iA(t);return e.request=N5.request,e}function bDe(t){var e=new iA(t);return e.request=N5.request,e.createSocket=L5,e.defaultPort=443,e}function iA(t){var e=this;e.options=t||{},e.proxyOptions=e.options.proxy||{},e.maxSockets=e.options.maxSockets||zP.Agent.defaultMaxSockets,e.requests=[],e.sockets=[],e.on("free",function(i,n,s,o){for(var a=T5(n,s,o),l=0,c=e.requests.length;l=this.maxSockets){s.requests.push(o);return}s.createSocket(o,function(a){a.on("free",l),a.on("close",c),a.on("agentRemove",c),e.onSocket(a);function l(){s.emit("free",a,o)}function c(u){s.removeSocket(a),a.removeListener("free",l),a.removeListener("close",c),a.removeListener("agentRemove",c)}})};iA.prototype.createSocket=function(e,r){var i=this,n={};i.sockets.push(n);var s=_P({},i.proxyOptions,{method:"CONNECT",path:e.host+":"+e.port,agent:!1,headers:{host:e.host+":"+e.port}});e.localAddress&&(s.localAddress=e.localAddress),s.proxyAuth&&(s.headers=s.headers||{},s.headers["Proxy-Authorization"]="Basic "+new Buffer(s.proxyAuth).toString("base64")),gl("making CONNECT request");var o=i.request(s);o.useChunkedEncodingByDefault=!1,o.once("response",a),o.once("upgrade",l),o.once("connect",c),o.once("error",u),o.end();function a(g){g.upgrade=!0}function l(g,f,h){process.nextTick(function(){c(g,f,h)})}function c(g,f,h){if(o.removeAllListeners(),f.removeAllListeners(),g.statusCode!==200){gl("tunneling socket could not be established, statusCode=%d",g.statusCode),f.destroy();var p=new Error("tunneling socket could not be established, statusCode="+g.statusCode);p.code="ECONNRESET",e.request.emit("error",p),i.removeSocket(n);return}if(h.length>0){gl("got illegal response body from proxy"),f.destroy();var p=new Error("got illegal response body from proxy");p.code="ECONNRESET",e.request.emit("error",p),i.removeSocket(n);return}return gl("tunneling connection has established"),i.sockets[i.sockets.indexOf(n)]=f,r(f)}function u(g){o.removeAllListeners(),gl(`tunneling socket could not be established, cause=%s -`,g.message,g.stack);var f=new Error("tunneling socket could not be established, cause="+g.message);f.code="ECONNRESET",e.request.emit("error",f),i.removeSocket(n)}};iA.prototype.removeSocket=function(e){var r=this.sockets.indexOf(e);if(r!==-1){this.sockets.splice(r,1);var i=this.requests.shift();i&&this.createSocket(i,function(n){i.request.onSocket(n)})}};function L5(t,e){var r=this;iA.prototype.createSocket.call(r,t,function(i){var n=t.request.getHeader("host"),s=_P({},r.options,{socket:i,servername:n?n.replace(/:.*$/,""):t.host}),o=mDe.connect(0,s);r.sockets[r.sockets.indexOf(i)]=o,e(o)})}function T5(t,e,r){return typeof t=="string"?{host:t,port:e,localAddress:r}:t}function _P(t){for(var e=1,r=arguments.length;e{M5.exports=O5()});var _5=w((Ww,eD)=>{var z5=Object.assign({},require("fs")),tD=function(){var t=typeof document!="undefined"&&document.currentScript?document.currentScript.src:void 0;return typeof __filename!="undefined"&&(t=t||__filename),function(e){e=e||{};var r=typeof e!="undefined"?e:{},i,n;r.ready=new Promise(function(d,E){i=d,n=E});var s={},o;for(o in r)r.hasOwnProperty(o)&&(s[o]=r[o]);var a=[],l="./this.program",c=function(d,E){throw E},u=!1,g=!0,f="";function h(d){return r.locateFile?r.locateFile(d,f):f+d}var p,m,y,b;g&&(u?f=require("path").dirname(f)+"/":f=__dirname+"/",p=function(E,I){var D=Qa(E);return D?I?D:D.toString():(y||(y=z5),b||(b=require("path")),E=b.normalize(E),y.readFileSync(E,I?null:"utf8"))},m=function(E){var I=p(E,!0);return I.buffer||(I=new Uint8Array(I)),X(I.buffer),I},process.argv.length>1&&(l=process.argv[1].replace(/\\/g,"/")),a=process.argv.slice(2),c=function(d){process.exit(d)},r.inspect=function(){return"[Emscripten Module object]"});var S=r.print||console.log.bind(console),k=r.printErr||console.warn.bind(console);for(o in s)s.hasOwnProperty(o)&&(r[o]=s[o]);s=null,r.arguments&&(a=r.arguments),r.thisProgram&&(l=r.thisProgram),r.quit&&(c=r.quit);var T=16;function Y(d,E){return E||(E=T),Math.ceil(d/E)*E}var j=0,Z=function(d){j=d},J;r.wasmBinary&&(J=r.wasmBinary);var re=r.noExitRuntime||!0;typeof WebAssembly!="object"&&Sr("no native wasm support detected");function ee(d,E,I){switch(E=E||"i8",E.charAt(E.length-1)==="*"&&(E="i32"),E){case"i1":return de[d>>0];case"i8":return de[d>>0];case"i16":return Qe[d>>1];case"i32":return fe[d>>2];case"i64":return fe[d>>2];case"float":return Ht[d>>2];case"double":return Mt[d>>3];default:Sr("invalid type for getValue: "+E)}return null}var A,oe=!1,le;function X(d,E){d||Sr("Assertion failed: "+E)}function O(d){var E=r["_"+d];return X(E,"Cannot call unknown function "+d+", make sure it is exported"),E}function L(d,E,I,D,M){var _={string:function(nt){var It=0;if(nt!=null&&nt!==0){var ke=(nt.length<<2)+1;It=B(ke),be(nt,It,ke)}return It},array:function(nt){var It=B(nt.length);return Ue(nt,It),It}};function ne(nt){return E==="string"?te(nt):E==="boolean"?Boolean(nt):nt}var Be=O(d),Ee=[],_e=0;if(D)for(var ot=0;ot=D);)++M;if(M-E>16&&d.subarray&&Ce)return Ce.decode(d.subarray(E,M));for(var _="";E>10,56320|_e&1023)}}return _}function te(d,E){return d?Oe(V,d,E):""}function se(d,E,I,D){if(!(D>0))return 0;for(var M=I,_=I+D-1,ne=0;ne=55296&&Be<=57343){var Ee=d.charCodeAt(++ne);Be=65536+((Be&1023)<<10)|Ee&1023}if(Be<=127){if(I>=_)break;E[I++]=Be}else if(Be<=2047){if(I+1>=_)break;E[I++]=192|Be>>6,E[I++]=128|Be&63}else if(Be<=65535){if(I+2>=_)break;E[I++]=224|Be>>12,E[I++]=128|Be>>6&63,E[I++]=128|Be&63}else{if(I+3>=_)break;E[I++]=240|Be>>18,E[I++]=128|Be>>12&63,E[I++]=128|Be>>6&63,E[I++]=128|Be&63}}return E[I]=0,I-M}function be(d,E,I){return se(d,V,E,I)}function he(d){for(var E=0,I=0;I=55296&&D<=57343&&(D=65536+((D&1023)<<10)|d.charCodeAt(++I)&1023),D<=127?++E:D<=2047?E+=2:D<=65535?E+=3:E+=4}return E}function Fe(d){var E=he(d)+1,I=Et(E);return I&&se(d,de,I,E),I}function Ue(d,E){de.set(d,E)}function xe(d,E){return d%E>0&&(d+=E-d%E),d}var Se,de,V,Qe,ce,fe,gt,Ht,Mt;function mi(d){Se=d,r.HEAP8=de=new Int8Array(d),r.HEAP16=Qe=new Int16Array(d),r.HEAP32=fe=new Int32Array(d),r.HEAPU8=V=new Uint8Array(d),r.HEAPU16=ce=new Uint16Array(d),r.HEAPU32=gt=new Uint32Array(d),r.HEAPF32=Ht=new Float32Array(d),r.HEAPF64=Mt=new Float64Array(d)}var Gt=r.INITIAL_MEMORY||16777216,Qr,Ti=[],Vs=[],Un=[],Hn=!1;function vr(){if(r.preRun)for(typeof r.preRun=="function"&&(r.preRun=[r.preRun]);r.preRun.length;)ya(r.preRun.shift());ko(Ti)}function Gn(){Hn=!0,!r.noFSInit&&!v.init.initialized&&v.init(),hs.init(),ko(Vs)}function gs(){if(r.postRun)for(typeof r.postRun=="function"&&(r.postRun=[r.postRun]);r.postRun.length;)Ru(r.postRun.shift());ko(Un)}function ya(d){Ti.unshift(d)}function kA(d){Vs.unshift(d)}function Ru(d){Un.unshift(d)}var fs=0,xA=null,wa=null;function Fu(d){return d}function PA(d){fs++,r.monitorRunDependencies&&r.monitorRunDependencies(fs)}function DA(d){if(fs--,r.monitorRunDependencies&&r.monitorRunDependencies(fs),fs==0&&(xA!==null&&(clearInterval(xA),xA=null),wa)){var E=wa;wa=null,E()}}r.preloadedImages={},r.preloadedAudios={};function Sr(d){r.onAbort&&r.onAbort(d),d+="",k(d),oe=!0,le=1,d="abort("+d+"). Build with -s ASSERTIONS=1 for more info.";var E=new WebAssembly.RuntimeError(d);throw n(E),E}var jl="data:application/octet-stream;base64,";function Nu(d){return d.startsWith(jl)}var So="data:application/octet-stream;base64,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ACgCFC0AAiAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQADIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAQgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ABSAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAGIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAcgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ACCAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAJIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAogACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ACyAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAMIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAA0gACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ADiAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAPIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhRBEGo2AhQgACAAKAIIQQFrIgE2AgggAQ0ACyAAIAAoAhhB8f8DcDYCGCAAIAAoAgxB8f8DcDYCDAwBCwsgACgCEARAA0AgACgCEEEQTwRAIAAgACgCEEEQazYCECAAIAAoAhQtAAAgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0AASAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQACIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAMgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ABCAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAFIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAYgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0AByAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAIIAAoAhhqNgIYIAAgACgCGCAAKAIMajYC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NgIYIAEoAgxCADcDICABKAIMQgA3AyggASgCDEEANgIwIAEoAgxBADYCNCABKAIMQQA2AjggASgCDEEANgI8IAEoAgxBADsBQCABKAIMQYCA2I14NgJEIAEoAgxCADcDSCABKAIMQQA7AVAgASgCDEEAOwFSIAEoAgxBADYCVAvSEwEBfyMAQbABayIDJAAgAyAANgKoASADIAE2AqQBIAMgAjYCoAEgA0EANgKQASADIAMoAqQBKAIwQQAQOjYClAEgAyADKAKkASgCOEEAEDo2ApgBAkACQAJAAkAgAygClAFBAkYEQCADKAKYAUEBRg0BCyADKAKUAUEBRgRAIAMoApgBQQJGDQELIAMoApQBQQJHDQEgAygCmAFBAkcNAQsgAygCpAEiACAALwEMQYAQcjsBDAwBCyADKAKkASIAIAAvAQxB/+8DcTsBDCADKAKUAUECRgRAIANB9eABIAMoAqQBKAIwIAMoAqgBQQhqEI4BNgKQASADKAKQAUUEQCADQX82AqwBDAMLCwJAIAMoAqABQYACcQ0AIAMoApgBQQJHDQAgA0H1xgEgAygCpAEoAjggAygCqAFBCGoQjgE2AkggAygCSEUEQCADKAKQARAjIANBfzYCrAEMAwsgAygCSCADKAKQATYCACADIAMoAkg2ApABCwsCQCADKAKkAS8BUkUEQCADKAKkASIAIAAvAQxB/v8DcTsBDAwBCyADKAKkASIAIAAvAQxBAXI7AQwLIAMgAygCpAEgAygCoAEQZUEBcToAhgEgAyADKAKgAUGACnFBgApHBH8gAy0AhgEFQQELQQFxOgCHASADAn9BASADKAKkAS8BUkGBAkYNABpBASADKAKkAS8BUkGCAkYNABogAygCpAEvAVJBgwJGC0EBcToAhQEgAy0AhwFBAXEEQCADIANBIGpCHBApNgIcIAMoAhxFBEAgAygCqAFBCGpBDkEAEBQgAygCkAEQIyADQX82AqwBDAILAkAgAygCoAFBgAJxBEACQCADKAKgAUGACHENACADKAKkASkDIEL/////D1YNACADKAKkASkDKEL/////D1gNAgsgAygCHCADKAKkASkDKBAtIAMoAhwgAygCpAEpAyAQLQwBCwJAAkAgAygCoAFBgAhxDQAgAygCpAEpAyBC/////w9WDQAgAygCpAEpAyhC/////w9WDQAgAygCpAEpA0hC/////w9YDQELIAMoAqQBKQMoQv////8PWgRAIAMoAhwgAygCpAEpAygQLQsgAygCpAEpAyBC/////w9aBEAgAygCHCADKAKkASkDIBAtCyADKAKkASkDSEL/////D1oEQCADKAIcIAMoAqQBKQNIEC0LCwsCfyMAQRBrIgAgAygCHDYCDCAAKAIMLQAAQQFxRQsEQCADKAKoAUEIakEUQQAQFCADKAIcEBYgAygCkAEQIyADQX82AqwBDAILIANBAQJ/IwBBEGsiACADKAIcNgIMAn4gACgCDC0AAEEBcQRAIAAoAgwpAxAMAQtCAAunQf//A3ELIANBIGpBgAYQVTYCjAEgAygCHBAWIAMoAowBIAMoApABNgIAIAMgAygCjAE2ApABCyADLQCFAUEBcQRAIAMgA0EVakIHECk2AhAgAygCEEUEQCADKAKoAUEIakEOQQAQFCADKAKQARAjIANBfzYCrAEMAgsgAygCEEECEB8gAygCEEG9EkECEEEgAygCECADKAKkAS8BUkH/AXEQlgEgAygCECADKAKkASgCEEH//wNxEB8CfyMAQRBrIgAgAygCEDYCDCAAKAIMLQAAQQFxRQsEQCADKAKoAUEIakEUQQAQFCADKAIQEBYgAygCkAEQIyADQX82AqwBDAILIANBgbICQQcgA0EVakGABhBVNgIMIAMoAhAQFiADKAIMIAMoApABNgIAIAMgAygCDDYCkAELIAMgA0HQAGpCLhApIgA2AkwgAEUEQCADKAKoAUEIakEOQQAQFCADKAKQARAjIANBfzYCrAEMAQsgAygCTEHxEkH2EiADKAKgAUGAAnEbQQQQQSADKAKgAUGAAnFFBEAgAygCTCADLQCGAUEBcQR/QS0FIAMoAqQBLwEIC0H//wNxEB8LIAMoAkwgAy0AhgFBAXEEf0EtBSADKAKkAS8BCgtB//8DcRAfIAMoAkwgAygCpAEvAQwQHwJAIAMtAIUBQQFxBEAgAygCTEHjABAfDAELIAMoAkwgAygCpAEoAhBB//8DcRAfCyADKAKkASgCFCADQZ4BaiADQZwBahCNASADKAJMIAMvAZ4BEB8gAygCTCADLwGcARAfAkACQCADLQCFAUEBcUUNACADKAKkASkDKEIUWg0AIAMoAkxBABAhDAELIAMoAkwgAygCpAEoAhgQIQsCQAJAIAMoAqABQYACcUGAAkcNACADKAKkASkDIEL/////D1QEQCADKAKkASkDKEL/////D1QNAQsgAygCTEF/ECEgAygCTEF/ECEMAQsCQCADKAKkASkDIEL/////D1QEQCADKAJMIAMoAqQBKQMgpxAhDAELIAMoAkxBfxAhCwJAIAMoAqQBKQMoQv////8PVARAIAMoAkwgAygCpAEpAyinECEMAQsgAygCTEF/ECELCyADKAJMIAMoAqQBKAIwEFFB//8DcRAfIAMgAygCpAEoAjQgAygCoAEQkgFB//8DcSADKAKQAUGABhCSAUH//wNxajYCiAEgAygCTCADKAKIAUH//wNxEB8gAygCoAFBgAJxRQRAIAMoAkwgAygCpAEoAjgQUUH//wNxEB8gAygCTCADKAKkASgCPEH//wNxEB8gAygCTCADKAKkAS8BQBAfIAMoAkwgAygCpAEoAkQQIQJAIAMoAqQBKQNIQv////8PVARAIAMoAkwgAygCpAEpA0inECEMAQsgAygCTEF/ECELCwJ/IwBBEGsiACADKAJMNgIMIAAoAgwtAABBAXFFCwRAIAMoAqgBQQhqQRRBABAUIAMoAkwQFiADKAKQARAjIANBfzYCrAEMAQsgAygCqAEgA0HQAGoCfiMAQRBrIgAgAygCTDYCDAJ+IAAoAgwtAABBAXEEQCAAKAIMKQMQDAELQgALCxA2QQBIBEAgAygCTBAWIAMoApABECMgA0F/NgKsAQwBCyADKAJMEBYgAygCpAEoAjAEQCADKAKoASADKAKkASgCMBCFAUEASARAIAMoApABECMgA0F/NgKsAQwCCwsgAygCkAEEQCADKAKoASADKAKQAUGABhCRAUEASARAIAMoApABECMgA0F/NgKsAQwCCwsgAygCkAEQIyADKAKkASgCNARAIAMoAqgBIAMoAqQBKAI0IAMoAqABEJEBQQBIBEAgA0F/NgKsAQwCCwsgAygCoAFBgAJxRQRAIAMoAqQBKAI4BEAgAygCqAEgAygCpAEoAjgQhQFBAEgEQCADQX82AqwBDAMLCwsgAyADLQCHAUEBcTYCrAELIAMoAqwBIQAgA0GwAWokACAAC+ACAQF/IwBBIGsiBCQAIAQgADsBGiAEIAE7ARggBCACNgIUIAQgAzYCECAEQRAQGCIANgIMAkAg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AAAgAygCHEHcFmogAygCDEECdGooAgAgAygCHEHYKGpqLQAASg0ADAELIAMoAhxB3BZqIAMoAhRBAnRqIAMoAhxB3BZqIAMoAgxBAnRqKAIANgIAIAMgAygCDDYCFCADIAMoAgxBAXQ2AgwMAQsLIAMoAhxB3BZqIAMoAhRBAnRqIAMoAhA2AgAL1xMBA38jAEEwayICJAAgAiAANgIsIAIgATYCKCACIAIoAigoAgA2AiQgAiACKAIoKAIIKAIANgIgIAIgAigCKCgCCCgCDDYCHCACQX82AhAgAigCLEEANgLQKCACKAIsQb0ENgLUKCACQQA2AhgDQCACKAIYIAIoAhxIBEACQCACKAIkIAIoAhhBAnRqLwEABEAgAiACKAIYIgE2AhAgAigCLEHcFmohAyACKAIsIgQoAtAoQQFqIQAgBCAANgLQKCAAQQJ0IANqIAE2AgAgAigCGCACKAIsQdgoampBADoAAAwBCyACKAIkIAIoAhhBAnRqQQA7AQILIAIgAigCGEEBajYCGAwBCwsDQCACKAIsKALQKEECSARAAkAgAigCEEECSARAIAIgAigCEEEBaiIANgIQDAELQQAhAAsgAigCLEHcFmohAyACKAIsIgQoAtAoQQFqIQEgBCABNgLQKCABQQJ0IANqIAA2AgAgAiAANgIMIAIoAiQgAigCDEECdGpBATsBACACKAIMIAIoAixB2ChqakEAOgAAIAIoAiwiACAAKAKoLUEBazYCqC0gAigCIARAIAIoAiwiACAAKAKsLSACKAIgIAIoAgxBAnRqLwECazYCrC0LDAELCyACKAIoIAIoAhA2AgQgAiACKAIsKALQKEECbTYCGANAIAIoAhhBAU4EQCACKAIsIAIoAiQgAigCGBB5IAIgAigCGEEBazYCGAwBCwsgAiACKAIcNgIMA0AgAiACKAIsKALgFjYCGCACKAIsQdwWaiEBIAIoAiwiAygC0CghACADIABBAWs2AtAoIAIoAiwgAEECdCABaigCADYC4BYgAigCLCACKAIkQQEQeSACIAIoAiwoAuAWNgIUIAIoAhghASACKAIsQdwWaiEDIAIoAiwiBCgC1ChBAWshACAEIAA2AtQoIABBAnQgA2ogATYCACACKAIUIQEgAigCLEHcFmohAyACKAIsIgQoAtQoQQFrIQAgBCAANgLUKCAA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AQsgAigCCEEANgIAIAIoAghCADcDECACKAIIQgA3AwggAigCCEIANwMgIAIoAghCADcDGCACKAIIQQA2AiggAigCCEEAOgAsIAIoAgggAikDECACKAIMEI8BQQFxRQRAIAIoAggQJSACQQA2AhwMAQsgAiACKAIINgIcCyACKAIcIQEgAkEgaiQAIAEL1gIBAX8jAEEgayIDJAAgAyAANgIYIAMgATYCFCADIAI2AhAgAyADQQxqQgQQKTYCCAJAIAMoAghFBEAgA0F/NgIcDAELA0AgAygCFARAIAMoAhQoAgQgAygCEHFBgAZxBEAgAygCCEIAECwaIAMoAgggAygCFC8BCBAfIAMoAgggAygCFC8BChAfAn8jAEEQayIAIAMoAgg2AgwgACgCDC0AAEEBcUULBEAgAygCGEEIakEUQQAQFCADKAIIEBYgA0F/NgIcDAQLIAMoAhggA0EMakIEEDZBAEgEQCADKAIIEBYgA0F/NgIcDAQLIAMoAhQvAQoEQCADKAIYIAMoAhQoAgwgAygCFC8BCq0QNkEASARAIAMoAggQFiADQX82AhwMBQsLCyADIAMoAhQoAgA2AhQMAQsLIAMoAggQFiADQQA2AhwLIAMoAhwhACADQSBqJAAgAAtoAQF/IwBBEGsiAiAANgIMIAIgATYCCCACQQA7AQYDQCACKAIMBEAgAigCDCgCBCACKAIIcUGABnEEQCACIAIoAgwvAQogAi8BBkEEamo7AQYLIAIgAigCDCgCADYCDAwBCwsgAi8BBgvwAQEBfyMAQRBrIgEkACABIAA2AgwgASABKAIMNgIIIAFBADYCBANAIAEoAgwEQAJAAkAgASgCDC8BCEH1xgFGDQAgASgCDC8BCEH14AFGDQAgASgCDC8BCEGBsgJGDQAgASgCDC8BCEEBRw0BCyABIAEoAgwoAgA2AgAgASgCCCABKAIMRgRAIAEgASgCADYCCAsgASgCDEEANgIAIAEoAgwQIyABKAIEBEAgASgCBCABKAIANgIACyABIAEoAgA2AgwMAgsgASABKAIMNgIEIAEgASgCDCgCADYCDAwBCwsgASgCCCEAIAFBEGokACAAC7IEAQF/IwBBQGoiBSQAIAUgADYCOCAFIAE7ATYgBSACNgIwIAUgAzYCLCAFIAQ2AiggBSAFKAI4IAUvATatECkiADYC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IAEoAhBB//8DRgRAIAEgASgCDDYCEAsgASgCCEH//wNGBEAgASABKAIENgIICwJAIAEoApQBQQRxRQ0AIAEoAgggASgCBEYEQCABKAIQIAEoAgxGDQELIAEoApABQRVBABAUIAEtABdBAXEEQCABKAKkARAWCyABQQA2AqwBDAELAkAgASgCEEUEQCABKAIIRQ0BCyABKAKQAUEBQQAQFCABLQAXQQFxBEAgASgCpAEQFgsgAUEANgKsAQwBCyABIAEoAqQBEDE3AyggASABKAKkARAxNwMgIAEpAyggASkDIFIEQCABKAKQAUEBQQAQFCABLQAXQQFxBEAgASgCpAEQFgsgAUEANgKsAQwBCyABIAEoAqQBEDE3AzAgASABKAKkARAxNwOAAQJ/IwBBEGsiBSABKAKkATYCDCAFKAIMLQAAQQFxRQsEQCABKAKQAUEUQQAQFCABLQAXQQFxBEAgASgCpAEQFgsgAUEANgKsAQwBCyABLQAXQQFxBEAgASgCpAEQFgsCQCABKQOAAUL///////////8AWARAIAEpA4ABIAEpA4ABIAEpAzB8WA0BCyABKAKQAUEEQRYQFCABQQA2AqwBDAELIAEpA4ABIAEpAzB8IAEpA5gBIAEpAzh8VgRAIAEoApABQRVBABAUIAFBADYCrAEMAQsCQCABKAKUAUEEcUUNACABKQOAASABKQMwfCABKQOYASABKQM4fFENACABKAKQAUEVQQAQFCABQQA2AqwBDAELIAEpAyggASkDMEIugFYEQCABKAKQAUEVQQAQFCABQQA2AqwBDAELIAEgASkDKCABKAKQARCQASIFNgKMASAFRQRAIAFBADYCrAEMAQsgASgCjAFBAToALCABKAKMASABKQMwNwMYIAEoAowBIAEpA4ABNwMgIAEgASgCjAE2AqwBCyABKAKsASEFIAFBsAFqJAAgACAFNgJQDAELIAAoAmQgACkDMBAsGiAAKAJkIQUgACkDWCEJIAAoAmgoAhQhBiAAKAJUIQcjAEHQAGsiASQAIAEgBTYCSCABIAk3A0AgASAGNgI8IAEgBzYCOAJAIAEoAkgQMEIWVARAIAEoAjhBFUEAEBQgAUEANgJMDAELIwBBEGsiBSABKAJINgIMIAECfiAFKAIMLQAAQQFxBEAgBSgCDCkDEAwBC0IACzcDCCABKAJI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ECADQcgAEBgiADYCDAJAIABFBEAgAygCEEEBQbSbASgCABAUIANBADYCHAwBCyADKAIMIAMoAhA2AgAgAygCDCADLQAbQQFxOgAEIAMoAgwgAygCFDYCCAJAIAMoAgwoAghBAU4EQCADKAIMKAIIQQlMDQELIAMoAgxBCTYCCAsgAygCDEEAOgAMIAMoAgxBADYCMCADKAIMQQA2AjQgAygCDEEANgI4IAMgAygCDDYCHAsgAygCHCEAIANBIGokACAACzgBAX8jAEEQayIBIAA2AgwgASgCDEEANgIAIAEoAgxBADYCBCABKAIMQQA2AgggASgCDEEAOgAMC+MIAQF/IwBBQGoiAiAANgI4IAIgATYCNCACIAIoAjgoAnw2AjAgAiACKAI4KAI4IAIoAjgoAmxqNgIsIAIgAigCOCgCeDYCICACIAIoAjgoApABNgIcIAICfyACKAI4KAJsIAIoAjgoAixBhgJrSwRAIAIoAjgoAmwgAigCOCgCLEGGAmtrDAELQQALNgIYIAIgAigCOCgCQDYCFCACIAIoAjgoAjQ2AhAgAiACKAI4KAI4IAIoAjgoAmxqQYICajYCDCACIAIoAiwgAigCIEEBa2otAAA6AAsgAiACKAIsIAIoAiBqLQAAOgAKIAIoAjgoAnggAigCOCgCjAFPBEAgAiACKAIwQQJ2NgIwCyACKAIcIAIoAjgoAnRLBEAgAiACKAI4KAJ0NgIcCwNAAkAgAiACKAI4KAI4IAIoAjRqNgIoAkAgAigCKCACKAIgai0AACACLQAKRw0AIAIoAiggAigCIEEBa2otAAAgAi0AC0cNACACKAIoLQAAIAIoAiwtAABHDQAgAiACKAIoIgBBAWo2AiggAC0AASACKAIsLQABRwRADAELIAIgAigCLEECajYCLCACIAIoAihBAWo2AigDQCACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AigCf0EAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AihBACAALQABIAFHDQAaIAIgAigCLCIAQQFqNgIsIAAtAAEhASACIAIoAigiAEEBajYCKEEAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AihBACAALQABIAFHDQAaIAIgAigCLCIAQQFqNgIsIAAtAAEhASACIAIoAigiAEEBajYCKEEAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACKAIsIAIoAgxJC0EBcQ0ACyACQYICIAIoAgwgAigCLGtrNgIkIAIgAigCDEGCAms2AiwgAigCJCACKAIgSgRAIAIoAjggAigCNDYCcCACIAIoAiQ2AiAgAigCJCACKAIcTg0CIAIgAigCLCACKAIgQQFrai0AADoACyACIAIoAiwgAigCIGotAAA6AAoLCyACIAIoAhQgAigCNCACKAIQcUEBdGovAQAiATYCNEEAIQAgASACKAIYSwR/IAIgAigCMEEBayIANgIwIABBAEcFQQALQQFxDQELCwJAIAIoAiAgAigCOCgCdE0EQCACIAIoAiA2AjwMAQsgAiACKAI4KAJ0NgI8CyACKAI8C5IQAQF/IwBBMGsiAiQAIAIgADYCKCACIAE2AiQgAgJ/IAIoAigoAiwgAigCKCgCDEEFa0kEQCACKAIoKAIsDAELIAIoAigoAgxBBWsLNgIgIAJBADYCECACIAIoAigoAgAoAgQ2AgwDQAJAIAJB//8DNgIcIAIgAigCKCgCvC1BKmpBA3U2AhQgAigCKCgCACgCECACKAIUSQ0AIAIgAigCKCgCACgCECACKAIUazYCFCACIAIoAigoAmwgAigCKCgCXGs2AhggAigCHCACKAIYIAIoAigoAgAoAgRqSwRAIAIgAigCGCACKAIoKAIAKAIEajYCHAsgAigCHCACKAIUSwRAIAIgAigCFDYCHAsCQCACKAIcIAIoAiBPDQACQCACKAIcRQRAIAIoAiRBBEcNAQsgAigCJEUNACACKAIcIAIoAhggAigCKCgCACgCBGpGDQELDAELQQAhACACIAIoAiRBBEYEfyACKAIcIAIoAhggAigCKCgCACgCBGpGBUEAC0EBcTYCECACKAIoQQBBACACKAIQEF0gAigCKCgCCCACKAIoKAIUQQRraiACKAIcOgAAIAIoAigoAgggAigCKCgCFEEDa2ogAigCHEEIdjoAACACKAIoKAIIIAIoAigoAhRBAmtqIAIoAhxBf3M6AAAgAigCKCgCCCACKAIoKAIUQQFraiACKAIcQX9zQQh2OgAAIAIoAigoAgAQHCACKAIYBEAgAigCGCACKAIcSwRAIAIgAigCHDYCGAsgAigCKCgCACgCDCACKAIoKAI4IAIoAigoAlxqIAIoAhgQGRogAigCKCgCACIAIAIoAhggACgCDGo2AgwgAigCKCgCACIAIAAoAhAgAigCGGs2AhAgAigCKCgCACIAIAIoAhggACgCFGo2AhQgAigCKCIAIAIoAhggACgCXGo2AlwgAiACKAIcIAIoAhhrNgIcCyACKAIcBEAgAigCKCgCACACKAIoKAIAKAIMIAIoAhwQdhogAigCKCgCACIAIAIoAhwgACgCDGo2AgwgAigCKCgCACIAIAAoAhAgAigCHGs2AhAgAigCKCgCACIAIAIoAhwgACgCFGo2AhQLIAIoAhBFDQELCyACIAIoAgwgAigCKCgCACgCBGs2AgwgAigCDARAAkAgAigCDCACKAIoKAIsTwRAIAIoAihBAjYCsC0gAigCKCgCOCACKAIoKAIAKAIAIAIoAigoAixrIAIoAigoAiwQGRogAigCKCACKAIoKAIsNgJsDAELIAIoAgwgAigCKCgCPCACKAIoKAJsa08EQCACKAIoIgAgACgCbCACKAIoKAIsazYCbCACKAIoKAI4IAIoAigoAjggAigCKCgCLGogAigCKCgCbBAZGiACKAIoKAKwLUECSQRAIAIoAigiACAAKAKwLUEBajYCsC0LCyACKAIoKAI4IAIoAigoAmxqIAIoAigoAgAoAgAgAigCDGsgAigCDBAZGiACKAIoIgAgAigCDCAAKAJsajYCbAsgAigCKCACKAIoKAJsNgJcIAIoAigiAQJ/IAIoAgwgAigCKCgCLCACKAIoKAK0LWtLBEAgAigCKCgCLCACKAIoKAK0LWsMAQsgAigCDAsgASgCtC1qNgK0LQsgAigCKCgCwC0gAigCKCgCbEkEQCACKAIoIAIoAigoAmw2AsAtCwJAIAIoAhAEQCACQQM2AiwMAQsCQCACKAIkRQ0AIAIoAiRBBEYNACACKAIoKAIAKAIEDQAgAigCKCgCbCACKAIoKAJcRw0AIAJBATYCLAwBCyACIAIoAigoAjwgAigCKCgCbGtBAWs2AhQCQCACKAIoKAIAKAIEIAIoAhRNDQAgAigCKCgCXCACKAIoKAIsSA0AIAIoAigiACAAKAJcIAIoAigoAixrNgJcIAIoAigiACAAKAJsIAIoAigoAixrNgJsIAIoAigoAjggAigCKCgCOCACKAIoKAIsaiACKAIoKAJsEBkaIAIoAigoArAtQQJJBEAgAigCKCIAIAAoArAtQQFqNgKwLQsgAiACKAIoKAIsIAIoAhRqNgIUCyACKAIUIAIoAigoAgAoAgRLBEAgAiACKAIoKAIAKAIENgIUCyACKAIUBEAgAigCKCgCACACKAIoKAI4IAIoAigoAmxqIAIoAhQQdhogAigCKCIAIAIoAhQgACgCbGo2AmwLIAIoAigoAsAtIAIoAigoAmxJBEAgAigCKCACKAIoKAJsNgLALQsgAiACKAIoKAK8LUEqakEDdTYCFCACIAIoAigoAgwgAigCFGtB//8DSwR/Qf//AwUgAigCKCgCDCACKAIUaws2AhQgAgJ/IAIoAhQgAigCKCgCLEsEQCACKAIoKAIsDAELIAIoAhQLNgIgIAIgAigCKCgCbCACKAIoKAJcazYCGAJAIAIoAhggAigCIEkEQCACKAIYRQRAIAIoAiRBBEcNAgsgAigCJEUNASACKAIoKAIAKAIEDQEgAigCGCACKAIUSw0BCyACAn8gAigCGCACKAIUSwRAIAIoAhQMAQsgAigCGAs2AhwgAgJ/QQAgAigCJEEERw0AGkEAIAIoAigoAgAoAgQNABogAigCHCACKAIYRgtBAXE2AhAgAigCKCACKAIoKAI4IAIoAigoAlxqIAIoAhwgAigCEBBdIAIoAigiACACKAIcIAAoAlxqNgJcIAIoAigoAgAQHAsgAkECQQAgAigCEBs2AiwLIAIoAiwhACACQTBqJAAgAAuyAgEBfyMAQRBrIgEkACABIAA2AggCQCABKAIIEHgEQCABQX42AgwMAQsgASABKAIIKAIcKAIENgIEIAEoAggoAhwoAggEQCABKAIIKAIoIAEoAggoAhwoAgggASgCCCgCJBEEAAsgASgCCCgCHCgCRARAIAEoAggoAiggASgCCCgCHCgCRCABKAIIKAIkEQQACyABKAIIKAIc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DQAgAiEAIANBAWsiAw0ACwsgBCgCFBogASACNgKgAQwCCyMAQRBrIgAgASgCqAEoAgQ2AgwgAUEAIAAoAgxrQQJ0QajZAGooAgA2AqABDAELIAFBADYCoAELCwJAIAEoAqABRQRAIAEgASgCpAE2AqwBDAELIAEgASgCoAEQLgJ/IAEoAqQBBEAgASgCpAEQLkECagwBC0EAC2pBAWoQGCIANgIcIABFBEAgAUG4EygCADYCrAEMAQsgASgCHCEAAn8gASgCpAEEQCABKAKkAQwBC0H6EgshA0HfEkH6EiABKAKkARshAiABIAEoAqABNgIIIAEgAjYCBCABIAM2AgAgAEG+CiABEG8gASgCqAEgASgCHDYCCCABIAEoAhw2AqwBCyABKAKsASEAIAFBsAFqJAAgAAsIAEEBQTgQfwszAQF/IAAoAhQiAyABIAIgACgCECADayIBIAEgAksbIgEQGRogACAAKAIUIAFqNgIUIAILjwUCBn4BfyABIAEoAgBBD2pBcHEiAUEQajYCACAAAnwgASkDACEDIAEpAwghBiMAQSBrIggkAAJAIAZC////////////AIMiBEKAgICAgIDAgDx9IARCgICAgICAwP/DAH1UBEAgBkIEhiADQjyIhCEEIANC//////////8PgyIDQoGAgICAgICACFoEQCAEQoGAgICAgICAwAB8IQIMAgsgBEKAgICAgICAgEB9IQIgA0KAgICAgICAgAiFQgBSDQEgAiAEQgGDfCECDAELIANQIARCgICAgICAwP//AFQgBEKAgICAgIDA//8AURtFBEAgBkIEhiADQjyIhEL/////////A4NCgICAgICAgPz/AIQhAgwBC0KAgICAgICA+P8AIQIgBEL///////+//8MAVg0AQgAhAiAEQjCIpyIAQZH3AEkNACADIQIgBkL///////8/g0KAgICAgIDAAIQiBSEHAkAgAEGB9wBrIgFBwABxBEAgAiABQUBqrYYhB0IAIQIMAQsgAUUNACAHIAGtIgSGIAJBwAAgAWutiIQhByACIASGIQILIAggAjcDECAIIAc3AxgCQEGB+AAgAGsiAEHAAHEEQCAFIABBQGqtiCEDQgAhBQwBCyAARQ0AIAVBwAAgAGuthiADIACtIgKIhCEDIAUgAoghBQsgCCADNwMAIAggBTcDCCAIKQMI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ADYCtC0gASgCFEEERgRAIAEoAhgCfyABKAIYKAJcQQBOBEAgASgCGCgCOCABKAIYKAJcagwBC0EACyABKAIYKAJsIAEoAhgoAlxrQQEQKCABKAIYIAEoAhgoAmw2AlwgASgCGCgCABAcIAEoAhgoAgAoAhBFBEAgAUECNgIcDAILIAFBAzYCHAwBCyABKAIYKAKgLQRAIAEoAhgCfyABKAIYKAJcQQBOBEAgASgCGCgCOCABKAIYKAJcagwBC0EACyABKAIYKAJsIAEoAhgoAlxrQQAQKCABKAIYIAEoAhgoAmw2AlwgASgCGCgCABAcIAEoAhgoAgAoAhBFBEAgAUEANgIcDAILCyABQQE2AhwLIAEoAhwhAiABQSBqJAAgAgwBCwJ/IAAoAiwoAogBQQNGBEAgACgCLCECIAAoAjQhAyMAQTBrIgEkACABIAI2AiggASADNgIkAkADQAJAIAEoAigoAnRBggJNBEAgASgCKBBcAkAgASgCKCgCdEGCAksNACABKAIkDQAgAUEANgIsDAQLIAEoAigoAnRFDQELIAEoAihBADYCYAJAIAEoAigoAnRBA0kNACABKAIoKAJsRQ0AIAEgASgCKCgCOCABKAIoKAJsakEBazYCGCABIAEoAhgtAAA2AhwgASgCHCECIAEgASgCGCIDQQFqNgIYAkAgAy0AASACRw0AIAEoAhwhAiABIAEoAhgiA0EBajYCGCADLQABIAJHDQAgASgCHCECIAEgASgCGCIDQQFqNgIYIAMtAAEgAkcNACABIAEoAigoAjggASgCKCgCbGpBggJqNgIUA0AgASgCHCECIAEgASgCGCIDQQFqNgIYAn9BACADLQABIAJHDQAaIAEoAhwhAiABIAEoAhgiA0EBajYCGEEAIAMtAAEgAkcNABogASgCHCECIAEgASgCGCIDQQFqNgIYQQAgAy0AASACRw0AGiABKAIcIQIgASABKAIYIgNBAWo2AhhBACADLQABIAJHDQAaIAEoAhwhAiABIAEoAhgiA0EBajYCGEEAIAMtAAEgAkcNABogASgCHCECIAEgASgCGCIDQQFqNgIYQQAgAy0AASACRw0AGiABKAIcIQIgASABKAIYIgNBAWo2AhhBACADLQABIAJHDQAaIAEoAhwhAiABIAEoAhgiA0EBajYCGEEAIAMtAAEgAkcNABog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AS8BEiECIAEgASgCSCIDQQFqNgJIIAMgAjoAAAwCCyABKAIMQRBxBEAgASABLwESNgIIIAEgASgCDEEPcTYCDCABKAIMBEAgASgCKCABKAIMSQRAIAEgASgCUCICQQFqNgJQIAEgASgCLCACLQAAIAEoAih0ajYCLCABIAEoAihBCGo2AigLIAEgASgCCCABKAIsQQEgASgCDHRBAWtxajYCCCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoCyABKAIoQQ9JBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKCABIAEoAlAiAkEBajYCUCABIAEoAiwgAi0AACABKAIodGo2AiwgASABKAIoQQhqNgIoCyABIAEoAiAgASgCLCABKAIYcUECdGooAQA2ARACQANAIAEgAS0AETYCDCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoIAEgAS0AEDYCDCABKAIMQRBxBEAgASABLwESNgIEIAEgASgCDEEPcTYCDCABKAIoIAEoAgxJBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKCABKAIoIAEoAgxJBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKAsLIAEgASgCBCABKAIsQQEgASgCDHRBAWtxajYCBCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoIAEgASgCSCABKAJEazYCDAJAIAEoAgQgASgCDEsEQCABIAEoAgQgASgCDGs2AgwgASgCDCABKAI4SwRAIAEoAlQoAsQ3BEAgASgCXEHdDDYCGCABKAJUQdH+ADYCBAwKCwsgASABKAIwNgIAAkAgASgCNEUEQCABIAEoAgAgASgCPCABKAIMa2o2AgAgASgCDCABKAIISQRAIAEgASgCCCABKAIMazYCCANAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIMQQFrIgI2AgwgAg0ACyABIAEoAkggASgCBGs2AgALDAELAkAgASgCNCABKAIMSQRAIAEgASgCACABKAI8IAEoAjRqIAEoAgxrajYCACABIAEoAgwgASgCNGs2AgwgASgCDCABKAIISQRAIAEgASgCCCABKAIMazYCCANAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIMQQFrIgI2AgwgAg0ACyABIAEoAjA2AgAgASgCNCABKAIISQRAIAEgASgCNDYCDCABIAEoAgggASgCDGs2AggDQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCDEEBayICNgIMIAINAAsgASABKAJIIAEoAgRrNgIACwsMAQsgASABKAIAIAEoAjQgASgCDGtqNgIAIAEoAgwgASgCCEkEQCABIAEoAgggASgCDGs2AggDQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCDEEBayICNgIMIAINAAsgASABKAJIIAEoAgRrNgIACwsLA0AgASgCCEECSwRAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIAIgJBAWo2AgAgAi0AACECIAEgASgCSCIDQQFqNgJIIAMgAjoAACABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCCEEDazYCCAwBCwsMAQsgASABKAJIIAEoAgRrNgIAA0AgASABKAIAIgJBAWo2AgAgAi0AACECIAEgASgCSCIDQQFqNgJIIAMgAjoAACABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIIQQNrNgIIIAEoAghBAksNAAsLIAEoAggEQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEoAghBAUsEQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAACwsMAgsgASgCDEHAAHFFBEAgASABKAIgIAEvARIgASgCLEEBIAEoAgx0QQFrcWpBAnRqKAEANgEQDAELCyAB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AG5hbgAvZGV2L3VyYW5kb20AaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrAGluY29ycmVjdCBoZWFkZXIgY2hlY2sAaW5jb3JyZWN0IGxlbmd0aCBjaGVjawBpbmNvcnJlY3QgZGF0YSBjaGVjawBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjawBoZWFkZXIgY3JjIG1pc21hdGNoAGluZgBpbnZhbGlkIHdpbmRvdyBzaXplAFJlYWQtb25seSBhcmNoaXZlAE5vdCBhIHppcCBhcmNoaXZlAFJlc291cmNlIHN0aWxsIGluIHVzZQBNYWxsb2MgZmFpbHVyZQBpbnZhbGlkIGJsb2NrIHR5cGUARmFpbHVyZSB0byBjcmVhdGUgdGVtcG9yYXJ5IGZpbGUAQ2FuJ3Qgb3BlbiBmaWxlAE5vIHN1Y2ggZmlsZQBQcmVtYXR1cmUgZW5kIG9mIGZpbGUAQ2FuJ3QgcmVtb3ZlIGZpbGUAaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlAGludmFsaWQgZGlzdGFuY2UgY29kZQB1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZABzdHJlYW0gZW5kAENvbXByZXNzZWQgZGF0YSBpbnZhbGlkAE11bHRpLWRpc2sgemlwIGFyY2hpdmVzIG5vdCBzdXBwb3J0ZWQAT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQARW5jcnlwdGlvbiBtZXRob2Qgbm90IHN1cHBvcnRlZABDb21wcmVzc2lvbiBtZXRob2Qgbm90IHN1cHBvcnRlZABFbnRyeSBoYXMgYmVlbiBkZWxldGVkAENvbnRhaW5pbmcgemlwIGFyY2hpdmUgd2FzIGNsb3NlZABDbG9zaW5nIHppcCBhcmNoaXZlIGZhaWxlZABSZW5hbWluZyB0ZW1wb3JhcnkgZmlsZSBmYWlsZWQARW50cnkgaGFzIGJlZW4gY2hhbmdlZABObyBwYXNzd29yZCBwcm92aWRlZABXcm9uZyBwYXNzd29yZCBwcm92aWRlZABVbmtub3duIGVycm9yICVkAHJiAHIrYgByd2EAJXMuWFhYWFhYAE5BTgBJTkYAQUUAMS4yLjExAC9wcm9jL3NlbGYvZmQvAC4AKG51bGwpADogAFBLBgcA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0gAIADIACACyAAgAcgAIAPIACAAKAAgAigAIAEoACADKAAgAKgAIAKoACABqAAgA6gAIABoACACaAAgAWgAIANoACAA6AAgAugAIAHoACAD6AAgABgAIAIYACABGAAgAxgAIACYACACmAAgAZgAIAOYACAAWAAgAlgAIAFYACADWAAgANgAIALYACAB2AAgA9gAIAA4ACACOAAgATgAIAM4ACAAuAAgArgAIAG4ACADuAAgAHgAIAJ4ACABeAAgA3gAIAD4ACAC+AAgAfgAIAP4ACAABAAgAgQAIAEEACADBAAgAIQAIAKEACABhAAgA4QAIABEACACRAAgAUQAIANEACAAxAAgAsQAIAHEACADxAAgACQAIAIkACABJAAgAyQAIACkACACpAAgAaQAIAOkACAAZAAgAmQAIAFkACADZAAgAOQAIALkACAB5AAgA+QAIAAUACACFAAgARQAIAMUACAAlAAgApQAIAGUACADlAAgAFQAIAJUACABVAAgA1QAIADUACAC1AAgAdQAIAPUACAANAAgAjQAIAE0ACADNAAgALQAIAK0ACABtAAgA7QAIAB0ACACdAAgAXQAIAN0ACAA9AAgAvQAIAH0ACAD9AAgAEwAJABMBCQCTAAkAkwEJAFMACQBTAQkA0wAJANMBCQAzAAkAMwEJALMACQCzAQkAcwAJAHMBCQDzAAkA8wEJAAsACQALAQkAiwAJAIsBCQBLAAkASwEJAMsACQDLAQkAKwAJACsBCQCrAAkAqwEJAGsACQBrAQkA6wAJAOsBCQAbAAkAGwEJAJsACQCbAQkAWwAJAFsBCQDbAAkA2wEJADsACQA7AQkAuwAJALsBCQB7AAkAewEJAPsACQD7AQkABwAJAAcBCQCHAAkAhwEJAEcACQBHAQkAxwAJAMcBCQAnAAkAJwEJAKcACQCnAQkAZwAJAGcBCQDnAAkA5wEJABcACQAXAQkAlwAJAJcBCQBXAAkAVwEJANcACQDXAQkANwAJADcBCQC3AAkAtwEJAHcACQB3AQkA9wAJAPcBCQAPAAkADwEJAI8ACQCPAQkATwAJAE8BCQDPAAkAzwEJAC8ACQAvAQkArwAJAK8BCQBvAAkAbwEJAO8ACQDvAQkAHwAJAB8BCQCfAAkAnwEJAF8ACQBfAQkA3wAJAN8BCQA/AAkAPwEJAL8ACQC/AQkAfwAJAH8BCQD/AAkA/wEJAAAABwBAAAcAIAAHAGAABwAQAAcAUAAHADAABwBwAAcACAAHAEgABwAoAAcAaAAHABgABwBYAAcAOAAHAHgABwAEAAcARAAHACQABwBkAAcAFAAHAFQABwA0AAcAdAAHAAMACACDAAgAQwAIAMMACAAjAAgAowAIAGMACADjAAgAAAAFABAABQAIAAUAGAAFAAQABQAUAAUADAAFABwABQACAAUAEgAFAAoABQAaAAUABgAFABYABQAOAAUAHgAFAAEABQARAAUACQAFABkABQAFAAUAFQAFAA0ABQAdAAUAAwAFABMABQALAAUAGwAFAAcABQAXAAUAQbDqAAtNAQAAAAEAAAABAAAAAQAAAAIAAAACAAAAAgAAAAIAAAADAAAAAwAAAAMAAAADAAAABAAAAAQAAAAEAAAABAAAAAUAAAAFAAAABQAAAAUAQaDrAAtlAQAAAAEAAAACAAAAAgAAAAMAAAADAAAABAAAAAQAAAAFAAAABQAAAAYAAAAGAAAABwAAAAcAAAAIAAAACAAAAAkAAAAJAAAACgAAAAoAAAALAAAACwAAAAwAAAAMAAAADQAAAA0AQdDsAAsjAgAAAAMAAAAHAAAAAAAAABAREgAIBwkGCgULBAwDDQIOAQ8AQYTtAAtpAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAKAAAADAAAAA4AAAAQAAAAFAAAABgAAAAcAAAAIAAAACgAAAAwAAAAOAAAAEAAAABQAAAAYAAAAHAAAACAAAAAoAAAAMAAAADgAEGE7gALegEAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAAABAACAAQAAAAIAAAADAAAABAAAAAYAAAAIAAAADAAAABAAAAAYAAAAIAAAADAAAABAAAAAYAAAMS4yLjExAEGI7wALbQcAAAAEAAQACAAEAAgAAAAEAAUAEAAIAAgAAAAEAAYAIAAgAAgAAAAEAAQAEAAQAAkAAAAIABAAIAAgAAkAAAAIABAAgACAAAkAAAAIACAAgAAAAQkAAAAgAIAAAgEABAkAAAAgAAIBAgEAEAkAQYDwAAulAgMABAAFAAYABwAIAAkACgALAA0ADwARABMAFwAbAB8AIwArADMAOwBDAFMAYwBzAIMAowDDAOMAAgEAAAAAAAAQABAAEAAQABAAEAAQABAAEQARABEAEQASABIAEgASABMAEwATABMAFAAUABQAFAAVABUAFQAVABAATQDKAAAAAQACAAMABAAFAAcACQANABEAGQAhADEAQQBhAIEAwQABAYEBAQIBAwEEAQYBCAEMARABGAEgATABQAFgAAAAABAAEAAQABAAEQARABIAEgATABMAFAAUABUAFQAWABYAFwAXABgAGAAZABkAGgAaABsAGwAcABwAHQAdAEAAQAAQABEAEgAAAAgABwAJAAYACgAFAAsABAAMAAMADQACAA4AAQAPAEGw8gALwRFgBwAAAAhQAAAIEAAUCHMAEgcfAAAIcAAACDAAAAnAABAHCgAACGAAAAggAAAJoAAACAAAAAiAAAAIQAAACeAAEAcGAAAIWAAACBgAAAmQABMHOwAACHgAAAg4AAAJ0AARBxEAAAhoAAAIKAAACbAAAAgIAAAIiAAACEgAAAnwABAHBAAACFQAAAgUABUI4wATBysAAAh0AAAINAAACcgAEQcNAAAIZAAACCQAAAmoAAAIBAAACIQAAAhEAAAJ6AAQBwgAAAhcAAAIHAAACZgAFAdTAAAIfAAACDwAAAnYABIHFwAACGwAAAgsAAAJuAAACAwAAAiMAAAITAAACfgAEAcDAAAIUgAACBIAFQijABMHIwAACHIAAAgyAAAJxAARBwsAAAhiAAAIIgAACaQAAAgCAAAIggAACEIAAAnkABAHBwAACFoAAAgaAAAJlAAUB0MAAAh6AAAIOgAACdQAEgcTAAAIagAACCoAAAm0AAAICgAACIoAAAhKAAAJ9AAQBwUAAAhWAAAIFgBACAAAEwczAAAIdgAACDYAAAnMABEHDwAACGYAAAgmAAAJrAAACAYAAAiGAAAIRgAACewAEAcJAAAIXgAACB4AAAmcABQHYwAACH4AAAg+AAAJ3AASBxsAAAhuAAAILgAACbwAAAgOAAAIjgAACE4AAAn8AGAHAAAACFEAAAgRABUIgwASBx8AAAhxAAAIMQAACcIAEAcKAAAIYQAACCEAAAmiAAAIAQAACIEAAAhBAAAJ4gAQBwYAAAhZAAAIGQAACZIAEwc7AAAIeQAACDkAAAnSABEHEQAACGkAAAgpAAAJsgAACAkAAAiJAAAISQAACfIAEAcEAAAIVQAACBUAEAgCARMHKwAACHUAAAg1AAAJygARBw0AAAhlAAAIJQAACaoAAAgFAAAIhQAACEUAAAnqABAHCAAACF0AAAgdAAAJmgAUB1MAAAh9AAAIPQAACdoAEgcXAAAIbQAACC0AAAm6AAAIDQAACI0AAAhNAAAJ+gAQBwMAAAhTAAAIEwAVCMMAEwcjAAAIcwAACDMAAAnGABEHCwAACGMAAAgjAAAJpgAACAMAAAiDAAAIQwAACeYAEAcHAAAIWwAACBsAAAmWABQHQwAACHsAAAg7AAAJ1gASBxMAAAhrAAAIKwAACbYAAAgLAAAIiwAACEsAAAn2ABAHBQAACFcAAAgXAEAIAAATBzMAAAh3AAAINwAACc4AEQcPAAAIZwAACCcAAAmuAAAIBwAACIcAAAhHAAAJ7gAQBwkAAAhfAAAIHwAACZ4AFAdjAAAIfwAACD8AAAneABIHGwAACG8AAAgvAAAJvgAACA8AAAiPAAAITwAACf4AYAcAAAAIUAAACBAAFAhzABIHHwAACHAAAAgwAAAJwQAQBwoAAAhgAAAIIAAACaEAAAgAAAAIgAAACEAAAAnhABAHBgAACFgAAAgYAAAJkQATBzsAAAh4AAAIOAAACdEAEQcRAAAIaAAACCgAAAmxAAAICAAACIgAAAhIAAAJ8QAQBwQAAAhUAAAIFAAVCOMAEwcrAAAIdAAACDQAAAnJABEHDQAACGQAAAgkAAAJqQAACAQAAAiEAAAIRAAACekAEAcIAAAIXAAACBwAAAmZABQHUwAACHwAAAg8AAAJ2QASBxcAAAhsAAAILAAACbkAAAgMAAAIjAAACEwAAAn5ABAHAwAACFIAAAgSABUIowATByMAAAhyAAAIMgAACcUAEQcLAAAIYgAACCIAAAmlAAAIAgAACIIAAAhCAAAJ5QAQBwcAAAhaAAAIGgAACZUAFAdDAAAIegAACDoAAAnVABIHEwAACGoAAAgqAAAJtQAACAoAAAiKAAAISgAACfUAEAcFAAAIVgAACBYAQAgAABMHMwAACHYAAAg2AAAJzQARBw8AAAhmAAAIJgAACa0AAAgGAAAIhgAACEYAAAntABAHCQAACF4AAAgeAAAJnQAUB2MAAAh+AAAIPgAACd0AEgcbAAAIbgAACC4AAAm9AAAIDgAACI4AAAhOAAAJ/QBgBwAAAAhRAAAIEQAVCIMAEgcfAAAIcQAACDEAAAnDABAHCgAACGEAAAghAAAJowAACAEAAAiBAAAIQQAACeMAEAcGAAAIWQAACBkAAAmTABMHOwAACHkAAAg5AAAJ0wARBxEAAAhpAAAIKQAACbMAAAgJAAAIiQAACEkAAAnzABAHBAAACFUAAAgVABAIAgETBysAAAh1AAAINQAACcsAEQcNAAAIZQAACCUAAAmrAAAIBQAACIUAAAhFAAAJ6wAQBwgAAAhdAAAIHQAACZsAFAdTAAAIfQAACD0AAAnbABIHFwAACG0AAAgtAAAJuwAACA0AAAiNAAAITQAACfsAEAcDAAAIUwAACBMAFQjDABMHIwAACHMAAAgzAAAJxwARBwsAAAhjAAAIIwAACacAAAgDAAAIgwAACEMAAAnnABAHBwAACFsAAAgbAAAJlwAUB0MAAAh7AAAIOwAACdcAEgcTAAAIawAACCsAAAm3AAAICwAACIsAAAhLAAAJ9wAQBwUAAAhXAAAIFwBACAAAEwczAAAIdwAACDcAAAnPABEHDwAACGcAAAgnAAAJrwAACAcAAAiHAAAIRwAACe8AEAcJAAAIXwAACB8AAAmfABQHYwAACH8AAAg/AAAJ3wASBxsAAAhvAAAILwAACb8AAAgPAAAIjwAACE8AAAn/ABAFAQAXBQEBEwURABsFARARBQUAGQUBBBUFQQAdBQFAEAUDABgFAQIUBSEAHAUBIBIFCQAaBQEIFgWBAEAFAAAQBQIAFwWBARMFGQAbBQEYEQUHABkFAQYVBWEAHQUBYBAFBAAYBQEDFAUxABwFATASBQ0AGgUBDBYFwQBABQAAEQAKABEREQAAAAAFAAAAAAAACQAAAAALAAAAAAAAAAARAA8KERERAwoHAAEACQsLAAAJBgsAAAsABhEAAAAREREAQYGEAQshCwAAAAAAAAAAEQAKChEREQAKAAACAAkLAAAACQALAAALAEG7hAELAQwAQceEAQsVDAAAAAAMAAAAAAkMAAAAAAAMAAAMAEH1hAELAQ4AQYGFAQsVDQAAAAQNAAAAAAkOAAAAAAAOAAAOAEGvhQELARAAQbuFAQseDwAAAAAPAAAAAAkQAAAAAAAQAAAQAAASAAAAEhISAEHyhQELDhIAAAASEhIAAAAAAAAJAEGjhgELAQsAQa+GAQsVCgAAAAAKAAAAAAkLAAAAAAALAAALAEHdhgELAQwAQemGAQsnDAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAwMTIzNDU2Nzg5QUJDREVGAEG0hwELARkAQduHAQsF//////8AQaCIAQtXGRJEOwI/LEcUPTMwChsGRktFNw9JDo4XA0AdPGkrNh9KLRwBICUpIQgMFRYiLhA4Pgs0MRhkdHV2L0EJfzkRI0MyQomKiwUEJignDSoeNYwHGkiTE5SVAEGAiQELig5JbGxlZ2FsIGJ5dGUgc2VxdWVuY2UARG9tYWluIGVycm9yAFJlc3VsdCBub3QgcmVwcmVzZW50YWJsZQBOb3QgYSB0dHkAUGVybWlzc2lvbiBkZW5pZWQAT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQATm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQBObyBzdWNoIHByb2Nlc3MARmlsZSBleGlzdHMAVmFsdWUgdG9vIGxhcmdlIGZvciBkYXRhIHR5cGUATm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UAT3V0IG9mIG1lbW9yeQBSZXNvdXJjZSBidXN5AEludGVycnVwdGVkIHN5c3RlbSBjYWxsAFJlc291cmNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlAEludmFsaWQgc2VlawBDcm9zcy1kZXZpY2UgbGluawBSZWFkLW9ubHkgZmlsZSBzeXN0ZW0ARGlyZWN0b3J5IG5vdCBlbXB0eQBDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIAT3BlcmF0aW9uIHRpbWVkIG91dABDb25uZWN0aW9uIHJlZnVzZWQASG9zdCBpcyBkb3duAEhvc3QgaXMgdW5yZWFjaGFibGUAQWRkcmVzcyBpbiB1c2UAQnJva2VuIHBpcGUASS9PIGVycm9yAE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MAQmxvY2sgZGV2aWNlIHJlcXVpcmVkAE5vIHN1Y2ggZGV2aWNlAE5vdCBhIGRpcmVjdG9yeQBJcyBhIGRpcmVjdG9yeQBUZXh0IGZpbGUgYnVzeQBFeGVjIGZvcm1hdCBlcnJvcgBJbnZhbGlkIGFyZ3VtZW50AEFyZ3VtZW50IGxpc3QgdG9vIGxvbmcAU3ltYm9saWMgbGluayBsb29wAEZpbGVuYW1lIHRvbyBsb25nAFRvbyBtYW55IG9wZW4gZmlsZXMgaW4gc3lzdGVtAE5vIGZpbGUgZGVzY3JpcHRvcnMgYXZhaWxhYmxlAEJhZCBmaWxlIGRlc2NyaXB0b3IATm8gY2hpbGQgcHJvY2VzcwBCYWQgYWRkcmVzcwBGaWxlIHRvbyBsYXJnZQBUb28gbWFueSBsaW5rcwBObyBsb2NrcyBhdmFpbGFibGUAUmVzb3VyY2UgZGVhZGxvY2sgd291bGQgb2NjdXIAU3RhdGUgbm90IHJlY292ZXJhYmxlAFByZXZpb3VzIG93bmVyIGRpZWQAT3BlcmF0aW9uIGNhbmNlbGVkAEZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZABObyBtZXNzYWdlIG9mIGRlc2lyZWQgdHlwZQBJZGVudGlmaWVyIHJlbW92ZWQARGV2aWNlIG5vdCBhIHN0cmVhbQBObyBkYXRhIGF2YWlsYWJsZQBEZXZpY2UgdGltZW91dABPdXQgb2Ygc3RyZWFtcyByZXNvdXJjZXMATGluayBoYXMgYmVlbiBzZXZlcmVkAFByb3RvY29sIGVycm9yAEJhZCBtZXNzYWdlAEZpbGUgZGVzY3JpcHRvciBpbiBiYWQgc3RhdGUATm90IGEgc29ja2V0AERlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQATWVzc2FnZSB0b28gbGFyZ2UAUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0AFByb3RvY29sIG5vdCBhdmFpbGFibGUAUHJvdG9jb2wgbm90IHN1cHBvcnRlZABTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkAE5vdCBzdXBwb3J0ZWQAUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWQAQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbABBZGRyZXNzIG5vdCBhdmFpbGFibGUATmV0d29yayBpcyBkb3duAE5ldHdvcmsgdW5yZWFjaGFibGUAQ29ubmVjdGlvbiByZXNldCBieSBuZXR3b3JrAENvbm5lY3Rpb24gYWJvcnRlZABObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlAFNvY2tldCBpcyBjb25uZWN0ZWQAU29ja2V0IG5vdCBjb25uZWN0ZWQAQ2Fubm90IHNlbmQgYWZ0ZXIgc29ja2V0IHNodXRkb3duAE9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzAE9wZXJhdGlvbiBpbiBwcm9ncmVzcwBTdGFsZSBmaWxlIGhhbmRsZQBSZW1vdGUgSS9PIGVycm9yAFF1b3RhIGV4Y2VlZGVkAE5vIG1lZGl1bSBmb3VuZABXcm9uZyBtZWRpdW0gdHlwZQBObyBlcnJvciBpbmZvcm1hdGlvbgBBkJcBC1JQUFAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQAAAAEAAAAIAAAAlEsAALRLAEGQmQELAgxQAEHImQELCR8AAADkTAAAAwBB5JkBC4wBLfRRWM+MscBG9rXLKTEDxwRbcDC0Xf0geH+LmthZKVBoSImrp1YDbP+3zYg/1He0K6WjcPG65Kj8QYP92W/hinovLXSWBx8NCV4Ddixw90ClLKdvV0GoqnTfoFhkA0rHxDxTrq9fGAQVseNtKIarDKS/Q/DpUIE5VxZSN/////////////////////8=";Nu(So)||(So=h(So));function Lu(d){try{if(d==So&&J)return new Uint8Array(J);var E=Qa(d);if(E)return E;if(m)return m(d);throw"sync fetching of the wasm failed: you can preload it to Module['wasmBinary'] manually, or emcc.py will do that for you when generating HTML (but not JS)"}catch(I){Sr(I)}}function Sh(d,E){var I,D,M;try{M=Lu(d),D=new WebAssembly.Module(M),I=new WebAssembly.Instance(D,E)}catch(ne){var _=ne.toString();throw k("failed to compile wasm module: "+_),(_.includes("imported Memory")||_.includes("memory import"))&&k("Memory size incompatibility issues may be due to changing INITIAL_MEMORY at runtime to something too large. Use ALLOW_MEMORY_GROWTH to allow any size memory (and also make sure not to set INITIAL_MEMORY at runtime to something smaller than it was at compile time)."),ne}return[I,D]}function kh(){var d={a:va};function E(M,_){var ne=M.exports;r.asm=ne,A=r.asm.u,mi(A.buffer),Qr=r.asm.pa,kA(r.asm.v),DA("wasm-instantiate")}if(PA("wasm-instantiate"),r.instantiateWasm)try{var I=r.instantiateWasm(d,E);return I}catch(M){return k("Module.instantiateWasm callback failed with error: "+M),!1}var D=Sh(So,d);return E(D[0]),r.asm}var ae,Oi;function ko(d){for(;d.length>0;){var E=d.shift();if(typeof E=="function"){E(r);continue}var I=E.func;typeof I=="number"?E.arg===void 0?Qr.get(I)():Qr.get(I)(E.arg):I(E.arg===void 0?null:E.arg)}}function jn(d,E){var I=new Date(fe[d>>2]*1e3);fe[E>>2]=I.getUTCSeconds(),fe[E+4>>2]=I.getUTCMinutes(),fe[E+8>>2]=I.getUTCHours(),fe[E+12>>2]=I.getUTCDate(),fe[E+16>>2]=I.getUTCMonth(),fe[E+20>>2]=I.getUTCFullYear()-1900,fe[E+24>>2]=I.getUTCDay(),fe[E+36>>2]=0,fe[E+32>>2]=0;var D=Date.UTC(I.getUTCFullYear(),0,1,0,0,0,0),M=(I.getTime()-D)/(1e3*60*60*24)|0;return fe[E+28>>2]=M,jn.GMTString||(jn.GMTString=Fe("GMT")),fe[E+40>>2]=jn.GMTString,E}function Tu(d,E){return jn(d,E)}var vt={splitPath:function(d){var E=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return E.exec(d).slice(1)},normalizeArray:function(d,E){for(var I=0,D=d.length-1;D>=0;D--){var M=d[D];M==="."?d.splice(D,1):M===".."?(d.splice(D,1),I++):I&&(d.splice(D,1),I--)}if(E)for(;I;I--)d.unshift("..");return d},normalize:function(d){var E=d.charAt(0)==="/",I=d.substr(-1)==="/";return d=vt.normalizeArray(d.split("/").filter(function(D){return!!D}),!E).join("/"),!d&&!E&&(d="."),d&&I&&(d+="/"),(E?"/":"")+d},dirname:function(d){var E=vt.splitPath(d),I=E[0],D=E[1];return!I&&!D?".":(D&&(D=D.substr(0,D.length-1)),I+D)},basename:function(d){if(d==="/")return"/";d=vt.normalize(d),d=d.replace(/\/$/,"");var E=d.lastIndexOf("/");return E===-1?d:d.substr(E+1)},extname:function(d){return vt.splitPath(d)[3]},join:function(){var d=Array.prototype.slice.call(arguments,0);return vt.normalize(d.join("/"))},join2:function(d,E){return vt.normalize(d+"/"+E)}};function Yl(){if(typeof crypto=="object"&&typeof crypto.getRandomValues=="function"){var d=new Uint8Array(1);return function(){return crypto.getRandomValues(d),d[0]}}else if(g)try{var E=require("crypto");return function(){return E.randomBytes(1)[0]}}catch(I){}return function(){Sr("randomDevice")}}var Yn={resolve:function(){for(var d="",E=!1,I=arguments.length-1;I>=-1&&!E;I--){var D=I>=0?arguments[I]:v.cwd();if(typeof D!="string")throw new TypeError("Arguments to path.resolve must be strings");if(!D)return"";d=D+"/"+d,E=D.charAt(0)==="/"}return d=vt.normalizeArray(d.split("/").filter(function(M){return!!M}),!E).join("/"),(E?"/":"")+d||"."},relative:function(d,E){d=Yn.resolve(d).substr(1),E=Yn.resolve(E).substr(1);function I(_e){for(var ot=0;ot<_e.length&&_e[ot]==="";ot++);for(var wt=_e.length-1;wt>=0&&_e[wt]==="";wt--);return ot>wt?[]:_e.slice(ot,wt-ot+1)}for(var D=I(d.split("/")),M=I(E.split("/")),_=Math.min(D.length,M.length),ne=_,Be=0;Be<_;Be++)if(D[Be]!==M[Be]){ne=Be;break}for(var Ee=[],Be=ne;Be0?E=D.slice(0,M).toString("utf-8"):E=null}else typeof window!="undefined"&&typeof window.prompt=="function"?(E=window.prompt("Input: "),E!==null&&(E+=` -`)):typeof readline=="function"&&(E=readline(),E!==null&&(E+=` -`));if(!E)return null;d.input=FA(E,!0)}return d.input.shift()},put_char:function(d,E){E===null||E===10?(S(Oe(d.output,0)),d.output=[]):E!=0&&d.output.push(E)},flush:function(d){d.output&&d.output.length>0&&(S(Oe(d.output,0)),d.output=[])}},default_tty1_ops:{put_char:function(d,E){E===null||E===10?(k(Oe(d.output,0)),d.output=[]):E!=0&&d.output.push(E)},flush:function(d){d.output&&d.output.length>0&&(k(Oe(d.output,0)),d.output=[])}}};function ps(d){for(var E=Y(d,65536),I=Et(E);d=E)){var D=1024*1024;E=Math.max(E,I*(I>>0),I!=0&&(E=Math.max(E,256));var M=d.contents;d.contents=new Uint8Array(E),d.usedBytes>0&&d.contents.set(M.subarray(0,d.usedBytes),0)}},resizeFileStorage:function(d,E){if(d.usedBytes!=E)if(E==0)d.contents=null,d.usedBytes=0;else{var I=d.contents;d.contents=new Uint8Array(E),I&&d.contents.set(I.subarray(0,Math.min(E,d.usedBytes))),d.usedBytes=E}},node_ops:{getattr:function(d){var E={};return E.dev=v.isChrdev(d.mode)?d.id:1,E.ino=d.id,E.mode=d.mode,E.nlink=1,E.uid=0,E.gid=0,E.rdev=d.rdev,v.isDir(d.mode)?E.size=4096:v.isFile(d.mode)?E.size=d.usedBytes:v.isLink(d.mode)?E.size=d.link.length:E.size=0,E.atime=new Date(d.timestamp),E.mtime=new Date(d.timestamp),E.ctime=new Date(d.timestamp),E.blksize=4096,E.blocks=Math.ceil(E.size/E.blksize),E},setattr:function(d,E){E.mode!==void 0&&(d.mode=E.mode),E.timestamp!==void 0&&(d.timestamp=E.timestamp),E.size!==void 0&&pt.resizeFileStorage(d,E.size)},lookup:function(d,E){throw v.genericErrors[44]},mknod:function(d,E,I,D){return pt.createNode(d,E,I,D)},rename:function(d,E,I){if(v.isDir(d.mode)){var D;try{D=v.lookupNode(E,I)}catch(_){}if(D)for(var M in D.contents)throw new v.ErrnoError(55)}delete d.parent.contents[d.name],d.parent.timestamp=Date.now(),d.name=I,E.contents[I]=d,E.timestamp=d.parent.timestamp,d.parent=E},unlink:function(d,E){delete d.contents[E],d.timestamp=Date.now()},rmdir:function(d,E){var I=v.lookupNode(d,E);for(var D in I.contents)throw new v.ErrnoError(55);delete d.contents[E],d.timestamp=Date.now()},readdir:function(d){var E=[".",".."];for(var I in d.contents)!d.contents.hasOwnProperty(I)||E.push(I);return E},symlink:function(d,E,I){var D=pt.createNode(d,E,511|40960,0);return D.link=I,D},readlink:function(d){if(!v.isLink(d.mode))throw new v.ErrnoError(28);return d.link}},stream_ops:{read:function(d,E,I,D,M){var _=d.node.contents;if(M>=d.node.usedBytes)return 0;var ne=Math.min(d.node.usedBytes-M,D);if(ne>8&&_.subarray)E.set(_.subarray(M,M+ne),I);else for(var Be=0;Be0||D+I>2)}catch(I){throw I.code?new v.ErrnoError(lt.convertNodeCode(I)):I}return E.mode},realPath:function(d){for(var E=[];d.parent!==d;)E.push(d.name),d=d.parent;return E.push(d.mount.opts.root),E.reverse(),vt.join.apply(null,E)},flagsForNode:function(d){d&=~2097152,d&=~2048,d&=~32768,d&=~524288;var E=0;for(var I in lt.flagsForNodeMap)d&I&&(E|=lt.flagsForNodeMap[I],d^=I);if(d)throw new v.ErrnoError(28);return E},node_ops:{getattr:function(d){var E=lt.realPath(d),I;try{I=Me.lstatSync(E)}catch(D){throw D.code?new v.ErrnoError(lt.convertNodeCode(D)):D}return lt.isWindows&&!I.blksize&&(I.blksize=4096),lt.isWindows&&!I.blocks&&(I.blocks=(I.size+I.blksize-1)/I.blksize|0),{dev:I.dev,ino:I.ino,mode:I.mode,nlink:I.nlink,uid:I.uid,gid:I.gid,rdev:I.rdev,size:I.size,atime:I.atime,mtime:I.mtime,ctime:I.ctime,blksize:I.blksize,blocks:I.blocks}},setattr:function(d,E){var I=lt.realPath(d);try{if(E.mode!==void 0&&(Me.chmodSync(I,E.mode),d.mode=E.mode),E.timestamp!==void 0){var D=new Date(E.timestamp);Me.utimesSync(I,D,D)}E.size!==void 0&&Me.truncateSync(I,E.size)}catch(M){throw M.code?new v.ErrnoError(lt.convertNodeCode(M)):M}},lookup:function(d,E){var I=vt.join2(lt.realPath(d),E),D=lt.getMode(I);return lt.createNode(d,E,D)},mknod:function(d,E,I,D){var M=lt.createNode(d,E,I,D),_=lt.realPath(M);try{v.isDir(M.mode)?Me.mkdirSync(_,M.mode):Me.writeFileSync(_,"",{mode:M.mode})}catch(ne){throw ne.code?new v.ErrnoError(lt.convertNodeCode(ne)):ne}return M},rename:function(d,E,I){var D=lt.realPath(d),M=vt.join2(lt.realPath(E),I);try{Me.renameSync(D,M)}catch(_){throw _.code?new v.ErrnoError(lt.convertNodeCode(_)):_}d.name=I},unlink:function(d,E){var I=vt.join2(lt.realPath(d),E);try{Me.unlinkSync(I)}catch(D){throw D.code?new v.ErrnoError(lt.convertNodeCode(D)):D}},rmdir:function(d,E){var I=vt.join2(lt.realPath(d),E);try{Me.rmdirSync(I)}catch(D){throw D.code?new v.ErrnoError(lt.convertNodeCode(D)):D}},readdir:function(d){var E=lt.realPath(d);try{return Me.readdirSync(E)}catch(I){throw I.code?new v.ErrnoError(lt.convertNodeCode(I)):I}},symlink:function(d,E,I){var D=vt.join2(lt.realPath(d),E);try{Me.symlinkSync(I,D)}catch(M){throw M.code?new v.ErrnoError(lt.convertNodeCode(M)):M}},readlink:function(d){var E=lt.realPath(d);try{return E=Me.readlinkSync(E),E=Ku.relative(Ku.resolve(d.mount.opts.root),E),E}catch(I){throw I.code?new v.ErrnoError(lt.convertNodeCode(I)):I}}},stream_ops:{open:function(d){var E=lt.realPath(d.node);try{v.isFile(d.node.mode)&&(d.nfd=Me.openSync(E,lt.flagsForNode(d.flags)))}catch(I){throw I.code?new v.ErrnoError(lt.convertNodeCode(I)):I}},close:function(d){try{v.isFile(d.node.mode)&&d.nfd&&Me.closeSync(d.nfd)}catch(E){throw E.code?new v.ErrnoError(lt.convertNodeCode(E)):E}},read:function(d,E,I,D,M){if(D===0)return 0;try{return Me.readSync(d.nfd,lt.bufferFrom(E.buffer),I,D,M)}catch(_){throw new v.ErrnoError(lt.convertNodeCode(_))}},write:function(d,E,I,D,M){try{return Me.writeSync(d.nfd,lt.bufferFrom(E.buffer),I,D,M)}catch(_){throw new v.ErrnoError(lt.convertNodeCode(_))}},llseek:function(d,E,I){var D=E;if(I===1)D+=d.position;else if(I===2&&v.isFile(d.node.mode))try{var M=Me.fstatSync(d.nfd);D+=M.size}catch(_){throw new v.ErrnoError(lt.convertNodeCode(_))}if(D<0)throw new v.ErrnoError(28);return D},mmap:function(d,E,I,D,M,_){if(E!==0)throw new v.ErrnoError(28);if(!v.isFile(d.node.mode))throw new v.ErrnoError(43);var ne=ps(I);return lt.stream_ops.read(d,de,ne,I,D),{ptr:ne,allocated:!0}},msync:function(d,E,I,D,M){if(!v.isFile(d.node.mode))throw new v.ErrnoError(43);if(M&2)return 0;var _=lt.stream_ops.write(d,E,0,D,I,!1);return 0}}},mn={lookupPath:function(d){return{path:d,node:{mode:lt.getMode(d)}}},createStandardStreams:function(){v.streams[0]={fd:0,nfd:0,position:0,path:"",flags:0,tty:!0,seekable:!1};for(var d=1;d<3;d++)v.streams[d]={fd:d,nfd:d,position:0,path:"",flags:577,tty:!0,seekable:!1}},cwd:function(){return process.cwd()},chdir:function(){process.chdir.apply(void 0,arguments)},mknod:function(d,E){v.isDir(d)?Me.mkdirSync(d,E):Me.writeFileSync(d,"",{mode:E})},mkdir:function(){Me.mkdirSync.apply(void 0,arguments)},symlink:function(){Me.symlinkSync.apply(void 0,arguments)},rename:function(){Me.renameSync.apply(void 0,arguments)},rmdir:function(){Me.rmdirSync.apply(void 0,arguments)},readdir:function(){Me.readdirSync.apply(void 0,arguments)},unlink:function(){Me.unlinkSync.apply(void 0,arguments)},readlink:function(){return Me.readlinkSync.apply(void 0,arguments)},stat:function(){return Me.statSync.apply(void 0,arguments)},lstat:function(){return Me.lstatSync.apply(void 0,arguments)},chmod:function(){Me.chmodSync.apply(void 0,arguments)},fchmod:function(){Me.fchmodSync.apply(void 0,arguments)},chown:function(){Me.chownSync.apply(void 0,arguments)},fchown:function(){Me.fchownSync.apply(void 0,arguments)},truncate:function(){Me.truncateSync.apply(void 0,arguments)},ftruncate:function(d,E){if(E<0)throw new v.ErrnoError(28);Me.ftruncateSync.apply(void 0,arguments)},utime:function(){Me.utimesSync.apply(void 0,arguments)},open:function(d,E,I,D){typeof E=="string"&&(E=Zs.modeStringToFlags(E));var M=Me.openSync(d,lt.flagsForNode(E),I),_=D!=null?D:v.nextfd(M),ne={fd:_,nfd:M,position:0,path:d,flags:E,seekable:!0};return v.streams[_]=ne,ne},close:function(d){d.stream_ops||Me.closeSync(d.nfd),v.closeStream(d.fd)},llseek:function(d,E,I){if(d.stream_ops)return Zs.llseek(d,E,I);var D=E;if(I===1)D+=d.position;else if(I===2)D+=Me.fstatSync(d.nfd).size;else if(I!==0)throw new v.ErrnoError(xo.EINVAL);if(D<0)throw new v.ErrnoError(xo.EINVAL);return d.position=D,D},read:function(d,E,I,D,M){if(d.stream_ops)return Zs.read(d,E,I,D,M);var _=typeof M!="undefined";!_&&d.seekable&&(M=d.position);var ne=Me.readSync(d.nfd,lt.bufferFrom(E.buffer),I,D,M);return _||(d.position+=ne),ne},write:function(d,E,I,D,M){if(d.stream_ops)return Zs.write(d,E,I,D,M);d.flags&+"1024"&&v.llseek(d,0,+"2");var _=typeof M!="undefined";!_&&d.seekable&&(M=d.position);var ne=Me.writeSync(d.nfd,lt.bufferFrom(E.buffer),I,D,M);return _||(d.position+=ne),ne},allocate:function(){throw new v.ErrnoError(xo.EOPNOTSUPP)},mmap:function(d,E,I,D,M,_){if(d.stream_ops)return Zs.mmap(d,E,I,D,M,_);if(E!==0)throw new v.ErrnoError(28);var ne=ps(I);return v.read(d,de,ne,I,D),{ptr:ne,allocated:!0}},msync:function(d,E,I,D,M){return d.stream_ops?Zs.msync(d,E,I,D,M):(M&2||v.write(d,E,0,D,I),0)},munmap:function(){return 0},ioctl:function(){throw new v.ErrnoError(xo.ENOTTY)}},v={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:!1,ignorePermissions:!0,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:function(d,E){if(d=Yn.resolve(v.cwd(),d),E=E||{},!d)return{path:"",node:null};var I={follow_mount:!0,recurse_count:0};for(var D in I)E[D]===void 0&&(E[D]=I[D]);if(E.recurse_count>8)throw new v.ErrnoError(32);for(var M=vt.normalizeArray(d.split("/").filter(function(ut){return!!ut}),!1),_=v.root,ne="/",Be=0;Be40)throw new v.ErrnoError(32)}}return{path:ne,node:_}},getPath:function(d){for(var E;;){if(v.isRoot(d)){var I=d.mount.mountpoint;return E?I[I.length-1]!=="/"?I+"/"+E:I+E:I}E=E?d.name+"/"+E:d.name,d=d.parent}},hashName:function(d,E){for(var I=0,D=0;D>>0)%v.nameTable.length},hashAddNode:function(d){var E=v.hashName(d.parent.id,d.name);d.name_next=v.nameTable[E],v.nameTable[E]=d},hashRemoveNode:function(d){var E=v.hashName(d.parent.id,d.name);if(v.nameTable[E]===d)v.nameTable[E]=d.name_next;else for(var I=v.nameTable[E];I;){if(I.name_next===d){I.name_next=d.name_next;break}I=I.name_next}},lookupNode:function(d,E){var I=v.mayLookup(d);if(I)throw new v.ErrnoError(I,d);for(var D=v.hashName(d.id,E),M=v.nameTable[D];M;M=M.name_next){var _=M.name;if(M.parent.id===d.id&&_===E)return M}return v.lookup(d,E)},createNode:function(d,E,I,D){var M=new v.FSNode(d,E,I,D);return v.hashAddNode(M),M},destroyNode:function(d){v.hashRemoveNode(d)},isRoot:function(d){return d===d.parent},isMountpoint:function(d){return!!d.mounted},isFile:function(d){return(d&61440)==32768},isDir:function(d){return(d&61440)==16384},isLink:function(d){return(d&61440)==40960},isChrdev:function(d){return(d&61440)==8192},isBlkdev:function(d){return(d&61440)==24576},isFIFO:function(d){return(d&61440)==4096},isSocket:function(d){return(d&49152)==49152},flagModes:{r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090},modeStringToFlags:function(d){var E=v.flagModes[d];if(typeof E=="undefined")throw new Error("Unknown file open mode: "+d);return E},flagsToPermissionString:function(d){var E=["r","w","rw"][d&3];return d&512&&(E+="w"),E},nodePermissions:function(d,E){return v.ignorePermissions?0:E.includes("r")&&!(d.mode&292)||E.includes("w")&&!(d.mode&146)||E.includes("x")&&!(d.mode&73)?2:0},mayLookup:function(d){var E=v.nodePermissions(d,"x");return E||(d.node_ops.lookup?0:2)},mayCreate:function(d,E){try{var I=v.lookupNode(d,E);return 20}catch(D){}return v.nodePermissions(d,"wx")},mayDelete:function(d,E,I){var D;try{D=v.lookupNode(d,E)}catch(_){return _.errno}var M=v.nodePermissions(d,"wx");if(M)return M;if(I){if(!v.isDir(D.mode))return 54;if(v.isRoot(D)||v.getPath(D)===v.cwd())return 10}else if(v.isDir(D.mode))return 31;return 0},mayOpen:function(d,E){return d?v.isLink(d.mode)?32:v.isDir(d.mode)&&(v.flagsToPermissionString(E)!=="r"||E&512)?31:v.nodePermissions(d,v.flagsToPermissionString(E)):44},MAX_OPEN_FDS:4096,nextfd:function(d,E){d=d||0,E=E||v.MAX_OPEN_FDS;for(var I=d;I<=E;I++)if(!v.streams[I])return I;throw new v.ErrnoError(33)},getStream:function(d){return v.streams[d]},createStream:function(d,E,I){v.FSStream||(v.FSStream=function(){},v.FSStream.prototype={object:{get:function(){return this.node},set:function(ne){this.node=ne}},isRead:{get:function(){return(this.flags&2097155)!=1}},isWrite:{get:function(){return(this.flags&2097155)!=0}},isAppend:{get:function(){return this.flags&1024}}});var D=new v.FSStream;for(var M in d)D[M]=d[M];d=D;var _=v.nextfd(E,I);return d.fd=_,v.streams[_]=d,d},closeStream:function(d){v.streams[d]=null},chrdev_stream_ops:{open:function(d){var E=v.getDevice(d.node.rdev);d.stream_ops=E.stream_ops,d.stream_ops.open&&d.stream_ops.open(d)},llseek:function(){throw new v.ErrnoError(70)}},major:function(d){return d>>8},minor:function(d){return d&255},makedev:function(d,E){return d<<8|E},registerDevice:function(d,E){v.devices[d]={stream_ops:E}},getDevice:function(d){return v.devices[d]},getMounts:function(d){for(var E=[],I=[d];I.length;){var D=I.pop();E.push(D),I.push.apply(I,D.mounts)}return E},syncfs:function(d,E){typeof d=="function"&&(E=d,d=!1),v.syncFSRequests++,v.syncFSRequests>1&&k("warning: "+v.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work");var I=v.getMounts(v.root.mount),D=0;function M(ne){return v.syncFSRequests--,E(ne)}function _(ne){if(ne)return _.errored?void 0:(_.errored=!0,M(ne));++D>=I.length&&M(null)}I.forEach(function(ne){if(!ne.type.syncfs)return _(null);ne.type.syncfs(ne,d,_)})},mount:function(d,E,I){var D=I==="/",M=!I,_;if(D&&v.root)throw new v.ErrnoError(10);if(!D&&!M){var ne=v.lookupPath(I,{follow_mount:!1});if(I=ne.path,_=ne.node,v.isMountpoint(_))throw new v.ErrnoError(10);if(!v.isDir(_.mode))throw new v.ErrnoError(54)}var Be={type:d,opts:E,mountpoint:I,mounts:[]},Ee=d.mount(Be);return Ee.mount=Be,Be.root=Ee,D?v.root=Ee:_&&(_.mounted=Be,_.mount&&_.mount.mounts.push(Be)),Ee},unmount:function(d){var E=v.lookupPath(d,{follow_mount:!1});if(!v.isMountpoint(E.node))throw new v.ErrnoError(28);var I=E.node,D=I.mounted,M=v.getMounts(D);Object.keys(v.nameTable).forEach(function(ne){for(var Be=v.nameTable[ne];Be;){var Ee=Be.name_next;M.includes(Be.mount)&&v.destroyNode(Be),Be=Ee}}),I.mounted=null;var _=I.mount.mounts.indexOf(D);I.mount.mounts.splice(_,1)},lookup:function(d,E){return d.node_ops.lookup(d,E)},mknod:function(d,E,I){var D=v.lookupPath(d,{parent:!0}),M=D.node,_=vt.basename(d);if(!_||_==="."||_==="..")throw new v.ErrnoError(28);var ne=v.mayCreate(M,_);if(ne)throw new v.ErrnoError(ne);if(!M.node_ops.mknod)throw new v.ErrnoError(63);return M.node_ops.mknod(M,_,E,I)},create:function(d,E){return E=E!==void 0?E:438,E&=4095,E|=32768,v.mknod(d,E,0)},mkdir:function(d,E){return E=E!==void 0?E:511,E&=511|512,E|=16384,v.mknod(d,E,0)},mkdirTree:function(d,E){for(var I=d.split("/"),D="",M=0;Mthis.length-1||ut<0)){var nt=ut%this.chunkSize,It=ut/this.chunkSize|0;return this.getter(It)[nt]}},_.prototype.setDataGetter=function(ut){this.getter=ut},_.prototype.cacheLength=function(){var ut=new XMLHttpRequest;if(ut.open("HEAD",I,!1),ut.send(null),!(ut.status>=200&&ut.status<300||ut.status===304))throw new Error("Couldn't load "+I+". Status: "+ut.status);var nt=Number(ut.getResponseHeader("Content-length")),It,ke=(It=ut.getResponseHeader("Accept-Ranges"))&&It==="bytes",Wn=(It=ut.getResponseHeader("Content-Encoding"))&&It==="gzip",Mi=1024*1024;ke||(Mi=nt);var MA=function(ds,Sa){if(ds>Sa)throw new Error("invalid range ("+ds+", "+Sa+") or no bytes requested!");if(Sa>nt-1)throw new Error("only "+nt+" bytes available! programmer error!");var qr=new XMLHttpRequest;if(qr.open("GET",I,!1),nt!==Mi&&qr.setRequestHeader("Range","bytes="+ds+"-"+Sa),typeof Uint8Array!="undefined"&&(qr.responseType="arraybuffer"),qr.overrideMimeType&&qr.overrideMimeType("text/plain; charset=x-user-defined"),qr.send(null),!(qr.status>=200&&qr.status<300||qr.status===304))throw new Error("Couldn't load "+I+". Status: "+qr.status);return qr.response!==void 0?new Uint8Array(qr.response||[]):FA(qr.responseText||"",!0)},Yr=this;Yr.setDataGetter(function(ds){var Sa=ds*Mi,qr=(ds+1)*Mi-1;if(qr=Math.min(qr,nt-1),typeof Yr.chunks[ds]=="undefined"&&(Yr.chunks[ds]=MA(Sa,qr)),typeof Yr.chunks[ds]=="undefined")throw new Error("doXHR failed!");return Yr.chunks[ds]}),(Wn||!nt)&&(Mi=nt=1,nt=this.getter(0).length,Mi=nt,S("LazyFiles on gzip forces download of the whole file when length is accessed")),this._length=nt,this._chunkSize=Mi,this.lengthKnown=!0},typeof XMLHttpRequest!="undefined"){if(!u)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var ne=new _;Object.defineProperties(ne,{length:{get:function(){return this.lengthKnown||this.cacheLength(),this._length}},chunkSize:{get:function(){return this.lengthKnown||this.cacheLength(),this._chunkSize}}});var Be={isDevice:!1,contents:ne}}else var Be={isDevice:!1,url:I};var Ee=v.createFile(d,E,Be,D,M);Be.contents?Ee.contents=Be.contents:Be.url&&(Ee.contents=null,Ee.url=Be.url),Object.defineProperties(Ee,{usedBytes:{get:function(){return this.contents.length}}});var _e={},ot=Object.keys(Ee.stream_ops);return ot.forEach(function(wt){var ut=Ee.stream_ops[wt];_e[wt]=function(){return v.forceLoadFile(Ee),ut.apply(null,arguments)}}),_e.read=function(ut,nt,It,ke,Wn){v.forceLoadFile(Ee);var Mi=ut.node.contents;if(Wn>=Mi.length)return 0;var MA=Math.min(Mi.length-Wn,ke);if(Mi.slice)for(var Yr=0;Yr>2]=D.dev,fe[I+4>>2]=0,fe[I+8>>2]=D.ino,fe[I+12>>2]=D.mode,fe[I+16>>2]=D.nlink,fe[I+20>>2]=D.uid,fe[I+24>>2]=D.gid,fe[I+28>>2]=D.rdev,fe[I+32>>2]=0,Oi=[D.size>>>0,(ae=D.size,+Math.abs(ae)>=1?ae>0?(Math.min(+Math.floor(ae/4294967296),4294967295)|0)>>>0:~~+Math.ceil((ae-+(~~ae>>>0))/4294967296)>>>0:0)],fe[I+40>>2]=Oi[0],fe[I+44>>2]=Oi[1],fe[I+48>>2]=4096,fe[I+52>>2]=D.blocks,fe[I+56>>2]=D.atime.getTime()/1e3|0,fe[I+60>>2]=0,fe[I+64>>2]=D.mtime.getTime()/1e3|0,fe[I+68>>2]=0,fe[I+72>>2]=D.ctime.getTime()/1e3|0,fe[I+76>>2]=0,Oi=[D.ino>>>0,(ae=D.ino,+Math.abs(ae)>=1?ae>0?(Math.min(+Math.floor(ae/4294967296),4294967295)|0)>>>0:~~+Math.ceil((ae-+(~~ae>>>0))/4294967296)>>>0:0)],fe[I+80>>2]=Oi[0],fe[I+84>>2]=Oi[1],0},doMsync:function(d,E,I,D,M){var _=V.slice(d,d+I);v.msync(E,_,M,I,D)},doMkdir:function(d,E){return d=vt.normalize(d),d[d.length-1]==="/"&&(d=d.substr(0,d.length-1)),v.mkdir(d,E,0),0},doMknod:function(d,E,I){switch(E&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}return v.mknod(d,E,I),0},doReadlink:function(d,E,I){if(I<=0)return-28;var D=v.readlink(d),M=Math.min(I,he(D)),_=de[E+M];return be(D,E,I+1),de[E+M]=_,M},doAccess:function(d,E){if(E&~7)return-28;var I,D=v.lookupPath(d,{follow:!0});if(I=D.node,!I)return-44;var M="";return E&4&&(M+="r"),E&2&&(M+="w"),E&1&&(M+="x"),M&&v.nodePermissions(I,M)?-2:0},doDup:function(d,E,I){var D=v.getStream(I);return D&&v.close(D),v.open(d,E,0,I,I).fd},doReadv:function(d,E,I,D){for(var M=0,_=0;_>2],Be=fe[E+(_*8+4)>>2],Ee=v.read(d,de,ne,Be,D);if(Ee<0)return-1;if(M+=Ee,Ee>2],Be=fe[E+(_*8+4)>>2],Ee=v.write(d,de,ne,Be,D);if(Ee<0)return-1;M+=Ee}return M},varargs:void 0,get:function(){Tt.varargs+=4;var d=fe[Tt.varargs-4>>2];return d},getStr:function(d){var E=te(d);return E},getStreamFromFD:function(d){var E=v.getStream(d);if(!E)throw new v.ErrnoError(8);return E},get64:function(d,E){return d}};function Ou(d,E){try{return d=Tt.getStr(d),v.chmod(d,E),0}catch(I){return(typeof v=="undefined"||!(I instanceof v.ErrnoError))&&Sr(I),-I.errno}}function ql(d){return fe[Rt()>>2]=d,d}function xh(d,E,I){Tt.varargs=I;try{var D=Tt.getStreamFromFD(d);switch(E){case 0:{var M=Tt.get();if(M<0)return-28;var _;return _=v.open(D.path,D.flags,0,M),_.fd}case 1:case 2:return 0;case 3:return D.flags;case 4:{var M=Tt.get();return D.flags|=M,0}case 12:{var M=Tt.get(),ne=0;return Qe[M+ne>>1]=2,0}case 13:case 14:return 0;case 16:case 8:return-28;case 9:return ql(28),-1;default:return-28}}catch(Be){return(typeof v=="undefined"||!(Be instanceof v.ErrnoError))&&Sr(Be),-Be.errno}}function Ph(d,E){try{var I=Tt.getStreamFromFD(d);return Tt.doStat(v.stat,I.path,E)}catch(D){return(typeof v=="undefined"||!(D instanceof v.ErrnoError))&&Sr(D),-D.errno}}function Dh(d,E,I){Tt.varargs=I;try{var D=Tt.getStreamFromFD(d);switch(E){case 21509:case 21505:return D.tty?0:-59;case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:return D.tty?0:-59;case 21519:{if(!D.tty)return-59;var M=Tt.get();return fe[M>>2]=0,0}case 21520:return D.tty?-28:-59;case 21531:{var M=Tt.get();return v.ioctl(D,E,M)}case 21523:return D.tty?0:-59;case 21524:return D.tty?0:-59;default:Sr("bad ioctl syscall "+E)}}catch(_){return(typeof v=="undefined"||!(_ instanceof v.ErrnoError))&&Sr(_),-_.errno}}function Rh(d,E,I){Tt.varargs=I;try{var D=Tt.getStr(d),M=I?Tt.get():0,_=v.open(D,E,M);return _.fd}catch(ne){return(typeof v=="undefined"||!(ne instanceof v.ErrnoError))&&Sr(ne),-ne.errno}}function Fh(d,E){try{return d=Tt.getStr(d),E=Tt.getStr(E),v.rename(d,E),0}catch(I){return(typeof v=="undefined"||!(I instanceof v.ErrnoError))&&Sr(I),-I.errno}}function G(d){try{return d=Tt.getStr(d),v.rmdir(d),0}catch(E){return(typeof v=="undefined"||!(E instanceof v.ErrnoError))&&Sr(E),-E.errno}}function yt(d,E){try{return d=Tt.getStr(d),Tt.doStat(v.stat,d,E)}catch(I){return(typeof v=="undefined"||!(I instanceof v.ErrnoError))&&Sr(I),-I.errno}}function RA(d){try{return d=Tt.getStr(d),v.unlink(d),0}catch(E){return(typeof v=="undefined"||!(E instanceof v.ErrnoError))&&Sr(E),-E.errno}}function $i(d,E,I){V.copyWithin(d,E,E+I)}function Jl(d){try{return A.grow(d-Se.byteLength+65535>>>16),mi(A.buffer),1}catch(E){}}function $e(d){var E=V.length;d=d>>>0;var I=2147483648;if(d>I)return!1;for(var D=1;D<=4;D*=2){var M=E*(1+.2/D);M=Math.min(M,d+100663296);var _=Math.min(I,xe(Math.max(d,M),65536)),ne=Jl(_);if(ne)return!0}return!1}function Ba(d){try{var E=Tt.getStreamFromFD(d);return v.close(E),0}catch(I){return(typeof v=="undefined"||!(I instanceof v.ErrnoError))&&Sr(I),I.errno}}function Mu(d,E){try{var I=Tt.getStreamFromFD(d),D=I.tty?2:v.isDir(I.mode)?3:v.isLink(I.mode)?7:4;return de[E>>0]=D,0}catch(M){return(typeof v=="undefined"||!(M instanceof v.ErrnoError))&&Sr(M),M.errno}}function kE(d,E,I,D){try{var M=Tt.getStreamFromFD(d),_=Tt.doReadv(M,E,I);return fe[D>>2]=_,0}catch(ne){return(typeof v=="undefined"||!(ne instanceof v.ErrnoError))&&Sr(ne),ne.errno}}function Nh(d,E,I,D,M){try{var _=Tt.getStreamFromFD(d),ne=4294967296,Be=I*ne+(E>>>0),Ee=9007199254740992;return Be<=-Ee||Be>=Ee?-61:(v.llseek(_,Be,D),Oi=[_.position>>>0,(ae=_.position,+Math.abs(ae)>=1?ae>0?(Math.min(+Math.floor(ae/4294967296),4294967295)|0)>>>0:~~+Math.ceil((ae-+(~~ae>>>0))/4294967296)>>>0:0)],fe[M>>2]=Oi[0],fe[M+4>>2]=Oi[1],_.getdents&&Be===0&&D===0&&(_.getdents=null),0)}catch(_e){return(typeof v=="undefined"||!(_e instanceof v.ErrnoError))&&Sr(_e),_e.errno}}function xE(d,E,I,D){try{var M=Tt.getStreamFromFD(d),_=Tt.doWritev(M,E,I);return fe[D>>2]=_,0}catch(ne){return(typeof v=="undefined"||!(ne instanceof v.ErrnoError))&&Sr(ne),ne.errno}}function gr(d){Z(d)}function qn(d){var E=Date.now()/1e3|0;return d&&(fe[d>>2]=E),E}function Wl(){if(Wl.called)return;Wl.called=!0;var d=new Date().getFullYear(),E=new Date(d,0,1),I=new Date(d,6,1),D=E.getTimezoneOffset(),M=I.getTimezoneOffset(),_=Math.max(D,M);fe[oQ()>>2]=_*60,fe[sQ()>>2]=Number(D!=M);function ne(wt){var ut=wt.toTimeString().match(/\(([A-Za-z ]+)\)$/);return ut?ut[1]:"GMT"}var Be=ne(E),Ee=ne(I),_e=Fe(Be),ot=Fe(Ee);M>2]=_e,fe[qu()+4>>2]=ot):(fe[qu()>>2]=ot,fe[qu()+4>>2]=_e)}function Lh(d){Wl();var E=Date.UTC(fe[d+20>>2]+1900,fe[d+16>>2],fe[d+12>>2],fe[d+8>>2],fe[d+4>>2],fe[d>>2],0),I=new Date(E);fe[d+24>>2]=I.getUTCDay();var D=Date.UTC(I.getUTCFullYear(),0,1,0,0,0,0),M=(I.getTime()-D)/(1e3*60*60*24)|0;return fe[d+28>>2]=M,I.getTime()/1e3|0}var Xs=function(d,E,I,D){d||(d=this),this.parent=d,this.mount=d.mount,this.mounted=null,this.id=v.nextInode++,this.name=E,this.mode=I,this.node_ops={},this.stream_ops={},this.rdev=D},ba=292|73,En=146;if(Object.defineProperties(Xs.prototype,{read:{get:function(){return(this.mode&ba)===ba},set:function(d){d?this.mode|=ba:this.mode&=~ba}},write:{get:function(){return(this.mode&En)===En},set:function(d){d?this.mode|=En:this.mode&=~En}},isFolder:{get:function(){return v.isDir(this.mode)}},isDevice:{get:function(){return v.isChrdev(this.mode)}}}),v.FSNode=Xs,v.staticInit(),g){var Me=z5,Ku=require("path");lt.staticInit()}if(g){var zl=function(d){return function(){try{return d.apply(this,arguments)}catch(E){throw E.code?new v.ErrnoError(xo[E.code]):E}}},Zs=Object.assign({},v);for(var _l in mn)v[_l]=zl(mn[_l])}else throw new Error("NODERAWFS is currently only supported on Node.js environment.");function FA(d,E,I){var D=I>0?I:he(d)+1,M=new Array(D),_=se(d,M,0,M.length);return E&&(M.length=_),M}var Uu=typeof atob=="function"?atob:function(d){var E="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",I="",D,M,_,ne,Be,Ee,_e,ot=0;d=d.replace(/[^A-Za-z0-9\+\/\=]/g,"");do ne=E.indexOf(d.charAt(ot++)),Be=E.indexOf(d.charAt(ot++)),Ee=E.indexOf(d.charAt(ot++)),_e=E.indexOf(d.charAt(ot++)),D=ne<<2|Be>>4,M=(Be&15)<<4|Ee>>2,_=(Ee&3)<<6|_e,I=I+String.fromCharCode(D),Ee!==64&&(I=I+String.fromCharCode(M)),_e!==64&&(I=I+String.fromCharCode(_));while(ot0||(vr(),fs>0))return;function E(){He||(He=!0,r.calledRun=!0,!oe&&(Gn(),i(r),r.onRuntimeInitialized&&r.onRuntimeInitialized(),gs()))}r.setStatus?(r.setStatus("Running..."),setTimeout(function(){setTimeout(function(){r.setStatus("")},1),E()},1)):E()}if(r.run=OA,r.preInit)for(typeof r.preInit=="function"&&(r.preInit=[r.preInit]);r.preInit.length>0;)r.preInit.pop()();return OA(),e}}();typeof Ww=="object"&&typeof eD=="object"?eD.exports=tD:typeof define=="function"&&define.amd?define([],function(){return tD}):typeof Ww=="object"&&(Ww.createModule=tD)});var I_=w((xat,E_)=>{function GDe(t,e){for(var r=-1,i=t==null?0:t.length,n=Array(i);++r{var jDe=Array.isArray;y_.exports=jDe});var S_=w((Dat,w_)=>{var B_=Hc(),YDe=I_(),qDe=Ms(),JDe=yd(),WDe=1/0,b_=B_?B_.prototype:void 0,Q_=b_?b_.toString:void 0;function v_(t){if(typeof t=="string")return t;if(qDe(t))return YDe(t,v_)+"";if(JDe(t))return Q_?Q_.call(t):"";var e=t+"";return e=="0"&&1/t==-WDe?"-0":e}w_.exports=v_});var of=w((Rat,k_)=>{var zDe=S_();function _De(t){return t==null?"":zDe(t)}k_.exports=_De});var AD=w((Fat,x_)=>{function VDe(t,e,r){var i=-1,n=t.length;e<0&&(e=-e>n?0:n+e),r=r>n?n:r,r<0&&(r+=n),n=e>r?0:r-e>>>0,e>>>=0;for(var s=Array(n);++i{var XDe=AD();function ZDe(t,e,r){var i=t.length;return r=r===void 0?i:r,!e&&r>=i?t:XDe(t,e,r)}P_.exports=ZDe});var lD=w((Lat,R_)=>{var $De="\\ud800-\\udfff",eRe="\\u0300-\\u036f",tRe="\\ufe20-\\ufe2f",rRe="\\u20d0-\\u20ff",iRe=eRe+tRe+rRe,nRe="\\ufe0e\\ufe0f",sRe="\\u200d",oRe=RegExp("["+sRe+$De+iRe+nRe+"]");function aRe(t){return oRe.test(t)}R_.exports=aRe});var N_=w((Tat,F_)=>{function ARe(t){return t.split("")}F_.exports=ARe});var G_=w((Oat,L_)=>{var T_="\\ud800-\\udfff",lRe="\\u0300-\\u036f",cRe="\\ufe20-\\ufe2f",uRe="\\u20d0-\\u20ff",gRe=lRe+cRe+uRe,fRe="\\ufe0e\\ufe0f",hRe="["+T_+"]",cD="["+gRe+"]",uD="\\ud83c[\\udffb-\\udfff]",pRe="(?:"+cD+"|"+uD+")",O_="[^"+T_+"]",M_="(?:\\ud83c[\\udde6-\\uddff]){2}",K_="[\\ud800-\\udbff][\\udc00-\\udfff]",dRe="\\u200d",U_=pRe+"?",H_="["+fRe+"]?",CRe="(?:"+dRe+"(?:"+[O_,M_,K_].join("|")+")"+H_+U_+")*",mRe=H_+U_+CRe,ERe="(?:"+[O_+cD+"?",cD,M_,K_,hRe].join("|")+")",IRe=RegExp(uD+"(?="+uD+")|"+ERe+mRe,"g");function yRe(t){return t.match(IRe)||[]}L_.exports=yRe});var Y_=w((Mat,j_)=>{var wRe=N_(),BRe=lD(),bRe=G_();function QRe(t){return BRe(t)?bRe(t):wRe(t)}j_.exports=QRe});var J_=w((Kat,q_)=>{var vRe=D_(),SRe=lD(),kRe=Y_(),xRe=of();function PRe(t){return function(e){e=xRe(e);var r=SRe(e)?kRe(e):void 0,i=r?r[0]:e.charAt(0),n=r?vRe(r,1).join(""):e.slice(1);return i[t]()+n}}q_.exports=PRe});var z_=w((Uat,W_)=>{var DRe=J_(),RRe=DRe("toUpperCase");W_.exports=RRe});var rB=w((Hat,__)=>{var FRe=of(),NRe=z_();function LRe(t){return NRe(FRe(t).toLowerCase())}__.exports=LRe});var V_=w((Gat,iB)=>{function TRe(){var t=0,e=1,r=2,i=3,n=4,s=5,o=6,a=7,l=8,c=9,u=10,g=11,f=12,h=13,p=14,m=15,y=16,b=17,S=0,k=1,T=2,Y=3,j=4;function Z(A,oe){return 55296<=A.charCodeAt(oe)&&A.charCodeAt(oe)<=56319&&56320<=A.charCodeAt(oe+1)&&A.charCodeAt(oe+1)<=57343}function J(A,oe){oe===void 0&&(oe=0);var le=A.charCodeAt(oe);if(55296<=le&&le<=56319&&oe=1){var X=A.charCodeAt(oe-1),O=le;return 55296<=X&&X<=56319?(X-55296)*1024+(O-56320)+65536:O}return le}function re(A,oe,le){var X=[A].concat(oe).concat([le]),O=X[X.length-2],L=le,pe=X.lastIndexOf(p);if(pe>1&&X.slice(1,pe).every(function(te){return te==i})&&[i,h,b].indexOf(A)==-1)return T;var Ce=X.lastIndexOf(n);if(Ce>0&&X.slice(1,Ce).every(function(te){return te==n})&&[f,n].indexOf(O)==-1)return X.filter(function(te){return te==n}).length%2==1?Y:j;if(O==t&&L==e)return S;if(O==r||O==t||O==e)return L==p&&oe.every(function(te){return te==i})?T:k;if(L==r||L==t||L==e)return k;if(O==o&&(L==o||L==a||L==c||L==u))return S;if((O==c||O==a)&&(L==a||L==l))return S;if((O==u||O==l)&&L==l)return S;if(L==i||L==m)return S;if(L==s)return S;if(O==f)return S;var Oe=X.indexOf(i)!=-1?X.lastIndexOf(i)-1:X.length-2;return[h,b].indexOf(X[Oe])!=-1&&X.slice(Oe+1,-1).every(function(te){return te==i})&&L==p||O==m&&[y,b].indexOf(L)!=-1?S:oe.indexOf(n)!=-1?T:O==n&&L==n?S:k}this.nextBreak=function(A,oe){if(oe===void 0&&(oe=0),oe<0)return 0;if(oe>=A.length-1)return A.length;for(var le=ee(J(A,oe)),X=[],O=oe+1;O{var ORe=/^(.*?)(\x1b\[[^m]+m|\x1b\]8;;.*?(\x1b\\|\u0007))/,nB;function MRe(){if(nB)return nB;if(typeof Intl.Segmenter!="undefined"){let t=new Intl.Segmenter("en",{granularity:"grapheme"});return nB=e=>Array.from(t.segment(e),({segment:r})=>r)}else{let t=V_(),e=new t;return nB=r=>e.splitGraphemes(r)}}X_.exports=(t,e=0,r=t.length)=>{if(e<0||r<0)throw new RangeError("Negative indices aren't supported by this implementation");let i=r-e,n="",s=0,o=0;for(;t.length>0;){let a=t.match(ORe)||[t,t,void 0],l=MRe()(a[1]),c=Math.min(e-s,l.length);l=l.slice(c);let u=Math.min(i-o,l.length);n+=l.slice(0,u).join(""),s+=c,o+=u,typeof a[2]!="undefined"&&(n+=a[2]),t=t.slice(a[0].length)}return n}});var af=w((mAt,g6)=>{"use strict";var f6=new Map([["C","cwd"],["f","file"],["z","gzip"],["P","preservePaths"],["U","unlink"],["strip-components","strip"],["stripComponents","strip"],["keep-newer","newer"],["keepNewer","newer"],["keep-newer-files","newer"],["keepNewerFiles","newer"],["k","keep"],["keep-existing","keep"],["keepExisting","keep"],["m","noMtime"],["no-mtime","noMtime"],["p","preserveOwner"],["L","follow"],["h","follow"]]),CAt=g6.exports=t=>t?Object.keys(t).map(e=>[f6.has(e)?f6.get(e):e,t[e]]).reduce((e,r)=>(e[r[0]]=r[1],e),Object.create(null)):{}});var Af=w((EAt,h6)=>{"use strict";var XRe=require("events"),p6=require("stream"),Jd=bp(),d6=require("string_decoder").StringDecoder,oA=Symbol("EOF"),Wd=Symbol("maybeEmitEnd"),pl=Symbol("emittedEnd"),cB=Symbol("emittingEnd"),uB=Symbol("closed"),C6=Symbol("read"),pD=Symbol("flush"),m6=Symbol("flushChunk"),Nn=Symbol("encoding"),aA=Symbol("decoder"),gB=Symbol("flowing"),zd=Symbol("paused"),_d=Symbol("resume"),pn=Symbol("bufferLength"),E6=Symbol("bufferPush"),dD=Symbol("bufferShift"),_i=Symbol("objectMode"),Vi=Symbol("destroyed"),I6=global._MP_NO_ITERATOR_SYMBOLS_!=="1",ZRe=I6&&Symbol.asyncIterator||Symbol("asyncIterator not implemented"),$Re=I6&&Symbol.iterator||Symbol("iterator not implemented"),y6=t=>t==="end"||t==="finish"||t==="prefinish",eFe=t=>t instanceof ArrayBuffer||typeof t=="object"&&t.constructor&&t.constructor.name==="ArrayBuffer"&&t.byteLength>=0,tFe=t=>!Buffer.isBuffer(t)&&ArrayBuffer.isView(t);h6.exports=class w6 extends p6{constructor(e){super();this[gB]=!1,this[zd]=!1,this.pipes=new Jd,this.buffer=new Jd,this[_i]=e&&e.objectMode||!1,this[_i]?this[Nn]=null:this[Nn]=e&&e.encoding||null,this[Nn]==="buffer"&&(this[Nn]=null),this[aA]=this[Nn]?new d6(this[Nn]):null,this[oA]=!1,this[pl]=!1,this[cB]=!1,this[uB]=!1,this.writable=!0,this.readable=!0,this[pn]=0,this[Vi]=!1}get bufferLength(){return this[pn]}get encoding(){return this[Nn]}set encoding(e){if(this[_i])throw new Error("cannot set encoding in objectMode");if(this[Nn]&&e!==this[Nn]&&(this[aA]&&this[aA].lastNeed||this[pn]))throw new Error("cannot change encoding");this[Nn]!==e&&(this[aA]=e?new d6(e):null,this.buffer.length&&(this.buffer=this.buffer.map(r=>this[aA].write(r)))),this[Nn]=e}setEncoding(e){this.encoding=e}get objectMode(){return this[_i]}set objectMode(e){this[_i]=this[_i]||!!e}write(e,r,i){if(this[oA])throw new Error("write after end");return this[Vi]?(this.emit("error",Object.assign(new Error("Cannot call write after a stream was destroyed"),{code:"ERR_STREAM_DESTROYED"})),!0):(typeof r=="function"&&(i=r,r="utf8"),r||(r="utf8"),!this[_i]&&!Buffer.isBuffer(e)&&(tFe(e)?e=Buffer.from(e.buffer,e.byteOffset,e.byteLength):eFe(e)?e=Buffer.from(e):typeof e!="string"&&(this.objectMode=!0)),!this.objectMode&&!e.length?(this[pn]!==0&&this.emit("readable"),i&&i(),this.flowing):(typeof e=="string"&&!this[_i]&&!(r===this[Nn]&&!this[aA].lastNeed)&&(e=Buffer.from(e,r)),Buffer.isBuffer(e)&&this[Nn]&&(e=this[aA].write(e)),this.flowing?(this[pn]!==0&&this[pD](!0),this.emit("data",e)):this[E6](e),this[pn]!==0&&this.emit("readable"),i&&i(),this.flowing))}read(e){if(this[Vi])return null;try{return this[pn]===0||e===0||e>this[pn]?null:(this[_i]&&(e=null),this.buffer.length>1&&!this[_i]&&(this.encoding?this.buffer=new Jd([Array.from(this.buffer).join("")]):this.buffer=new Jd([Buffer.concat(Array.from(this.buffer),this[pn])])),this[C6](e||null,this.buffer.head.value))}finally{this[Wd]()}}[C6](e,r){return e===r.length||e===null?this[dD]():(this.buffer.head.value=r.slice(e),r=r.slice(0,e),this[pn]-=e),this.emit("data",r),!this.buffer.length&&!this[oA]&&this.emit("drain"),r}end(e,r,i){return typeof e=="function"&&(i=e,e=null),typeof r=="function"&&(i=r,r="utf8"),e&&this.write(e,r),i&&this.once("end",i),this[oA]=!0,this.writable=!1,(this.flowing||!this[zd])&&this[Wd](),this}[_d](){this[Vi]||(this[zd]=!1,this[gB]=!0,this.emit("resume"),this.buffer.length?this[pD]():this[oA]?this[Wd]():this.emit("drain"))}resume(){return this[_d]()}pause(){this[gB]=!1,this[zd]=!0}get destroyed(){return this[Vi]}get flowing(){return this[gB]}get paused(){return this[zd]}[E6](e){return this[_i]?this[pn]+=1:this[pn]+=e.length,this.buffer.push(e)}[dD](){return this.buffer.length&&(this[_i]?this[pn]-=1:this[pn]-=this.buffer.head.value.length),this.buffer.shift()}[pD](e){do;while(this[m6](this[dD]()));!e&&!this.buffer.length&&!this[oA]&&this.emit("drain")}[m6](e){return e?(this.emit("data",e),this.flowing):!1}pipe(e,r){if(this[Vi])return;let i=this[pl];r=r||{},e===process.stdout||e===process.stderr?r.end=!1:r.end=r.end!==!1;let n={dest:e,opts:r,ondrain:s=>this[_d]()};return this.pipes.push(n),e.on("drain",n.ondrain),this[_d](),i&&n.opts.end&&n.dest.end(),e}addListener(e,r){return this.on(e,r)}on(e,r){try{return super.on(e,r)}finally{e==="data"&&!this.pipes.length&&!this.flowing?this[_d]():y6(e)&&this[pl]&&(super.emit(e),this.removeAllListeners(e))}}get emittedEnd(){return this[pl]}[Wd](){!this[cB]&&!this[pl]&&!this[Vi]&&this.buffer.length===0&&this[oA]&&(this[cB]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[uB]&&this.emit("close"),this[cB]=!1)}emit(e,r){if(e!=="error"&&e!=="close"&&e!==Vi&&this[Vi])return;if(e==="data"){if(!r)return;this.pipes.length&&this.pipes.forEach(n=>n.dest.write(r)===!1&&this.pause())}else if(e==="end"){if(this[pl]===!0)return;this[pl]=!0,this.readable=!1,this[aA]&&(r=this[aA].end(),r&&(this.pipes.forEach(n=>n.dest.write(r)),super.emit("data",r))),this.pipes.forEach(n=>{n.dest.removeListener("drain",n.ondrain),n.opts.end&&n.dest.end()})}else if(e==="close"&&(this[uB]=!0,!this[pl]&&!this[Vi]))return;let i=new Array(arguments.length);if(i[0]=e,i[1]=r,arguments.length>2)for(let n=2;n{e.push(i),this[_i]||(e.dataLength+=i.length)}),r.then(()=>e)}concat(){return this[_i]?Promise.reject(new Error("cannot concat in objectMode")):this.collect().then(e=>this[_i]?Promise.reject(new Error("cannot concat in objectMode")):this[Nn]?e.join(""):Buffer.concat(e,e.dataLength))}promise(){return new Promise((e,r)=>{this.on(Vi,()=>r(new Error("stream destroyed"))),this.on("end",()=>e()),this.on("error",i=>r(i))})}[ZRe](){return{next:()=>{let r=this.read();if(r!==null)return Promise.resolve({done:!1,value:r});if(this[oA])return Promise.resolve({done:!0});let i=null,n=null,s=c=>{this.removeListener("data",o),this.removeListener("end",a),n(c)},o=c=>{this.removeListener("error",s),this.removeListener("end",a),this.pause(),i({value:c,done:!!this[oA]})},a=()=>{this.removeListener("error",s),this.removeListener("data",o),i({done:!0})},l=()=>s(new Error("stream destroyed"));return new Promise((c,u)=>{n=u,i=c,this.once(Vi,l),this.once("error",s),this.once("end",a),this.once("data",o)})}}}[$Re](){return{next:()=>{let r=this.read();return{value:r,done:r===null}}}}destroy(e){return this[Vi]?(e?this.emit("error",e):this.emit(Vi),this):(this[Vi]=!0,this.buffer=new Jd,this[pn]=0,typeof this.close=="function"&&!this[uB]&&this.close(),e?this.emit("error",e):this.emit(Vi),this)}static isStream(e){return!!e&&(e instanceof w6||e instanceof p6||e instanceof XRe&&(typeof e.pipe=="function"||typeof e.write=="function"&&typeof e.end=="function"))}}});var b6=w((IAt,B6)=>{var rFe=require("zlib").constants||{ZLIB_VERNUM:4736};B6.exports=Object.freeze(Object.assign(Object.create(null),{Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_VERSION_ERROR:-6,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,DEFLATE:1,INFLATE:2,GZIP:3,GUNZIP:4,DEFLATERAW:5,INFLATERAW:6,UNZIP:7,BROTLI_DECODE:8,BROTLI_ENCODE:9,Z_MIN_WINDOWBITS:8,Z_MAX_WINDOWBITS:15,Z_DEFAULT_WINDOWBITS:15,Z_MIN_CHUNK:64,Z_MAX_CHUNK:Infinity,Z_DEFAULT_CHUNK:16384,Z_MIN_MEMLEVEL:1,Z_MAX_MEMLEVEL:9,Z_DEFAULT_MEMLEVEL:8,Z_MIN_LEVEL:-1,Z_MAX_LEVEL:9,Z_DEFAULT_LEVEL:-1,BROTLI_OPERATION_PROCESS:0,BROTLI_OPERATION_FLUSH:1,BROTLI_OPERATION_FINISH:2,BROTLI_OPERATION_EMIT_METADATA:3,BROTLI_MODE_GENERIC:0,BROTLI_MODE_TEXT:1,BROTLI_MODE_FONT:2,BROTLI_DEFAULT_MODE:0,BROTLI_MIN_QUALITY:0,BROTLI_MAX_QUALITY:11,BROTLI_DEFAULT_QUALITY:11,BROTLI_MIN_WINDOW_BITS:10,BROTLI_MAX_WINDOW_BITS:24,BROTLI_LARGE_MAX_WINDOW_BITS:30,BROTLI_DEFAULT_WINDOW:22,BROTLI_MIN_INPUT_BLOCK_BITS:16,BROTLI_MAX_INPUT_BLOCK_BITS:24,BROTLI_PARAM_MODE:0,BROTLI_PARAM_QUALITY:1,BROTLI_PARAM_LGWIN:2,BROTLI_PARAM_LGBLOCK:3,BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING:4,BROTLI_PARAM_SIZE_HINT:5,BROTLI_PARAM_LARGE_WINDOW:6,BROTLI_PARAM_NPOSTFIX:7,BROTLI_PARAM_NDIRECT:8,BROTLI_DECODER_RESULT_ERROR:0,BROTLI_DECODER_RESULT_SUCCESS:1,BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT:2,BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION:0,BROTLI_DECODER_PARAM_LARGE_WINDOW:1,BROTLI_DECODER_NO_ERROR:0,BROTLI_DECODER_SUCCESS:1,BROTLI_DECODER_NEEDS_MORE_INPUT:2,BROTLI_DECODER_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE:-1,BROTLI_DECODER_ERROR_FORMAT_RESERVED:-2,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE:-3,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET:-4,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME:-5,BROTLI_DECODER_ERROR_FORMAT_CL_SPACE:-6,BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE:-7,BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT:-8,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1:-9,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2:-10,BROTLI_DECODER_ERROR_FORMAT_TRANSFORM:-11,BROTLI_DECODER_ERROR_FORMAT_DICTIONARY:-12,BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS:-13,BROTLI_DECODER_ERROR_FORMAT_PADDING_1:-14,BROTLI_DECODER_ERROR_FORMAT_PADDING_2:-15,BROTLI_DECODER_ERROR_FORMAT_DISTANCE:-16,BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET:-19,BROTLI_DECODER_ERROR_INVALID_ARGUMENTS:-20,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES:-21,BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS:-22,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP:-25,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1:-26,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2:-27,BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES:-30,BROTLI_DECODER_ERROR_UNREACHABLE:-31},rFe))});var QD=w(os=>{"use strict";var CD=require("assert"),dl=require("buffer").Buffer,Q6=require("zlib"),zc=os.constants=b6(),iFe=Af(),v6=dl.concat,_c=Symbol("_superWrite"),Vd=class extends Error{constructor(e){super("zlib: "+e.message);this.code=e.code,this.errno=e.errno,this.code||(this.code="ZLIB_ERROR"),this.message="zlib: "+e.message,Error.captureStackTrace(this,this.constructor)}get name(){return"ZlibError"}},nFe=Symbol("opts"),Xd=Symbol("flushFlag"),S6=Symbol("finishFlushFlag"),mD=Symbol("fullFlushFlag"),pr=Symbol("handle"),fB=Symbol("onError"),lf=Symbol("sawError"),ED=Symbol("level"),ID=Symbol("strategy"),yD=Symbol("ended"),yAt=Symbol("_defaultFullFlush"),wD=class extends iFe{constructor(e,r){if(!e||typeof e!="object")throw new TypeError("invalid options for ZlibBase constructor");super(e);this[lf]=!1,this[yD]=!1,this[nFe]=e,this[Xd]=e.flush,this[S6]=e.finishFlush;try{this[pr]=new Q6[r](e)}catch(i){throw new Vd(i)}this[fB]=i=>{this[lf]||(this[lf]=!0,this.close(),this.emit("error",i))},this[pr].on("error",i=>this[fB](new Vd(i))),this.once("end",()=>this.close)}close(){this[pr]&&(this[pr].close(),this[pr]=null,this.emit("close"))}reset(){if(!this[lf])return CD(this[pr],"zlib binding closed"),this[pr].reset()}flush(e){this.ended||(typeof e!="number"&&(e=this[mD]),this.write(Object.assign(dl.alloc(0),{[Xd]:e})))}end(e,r,i){return e&&this.write(e,r),this.flush(this[S6]),this[yD]=!0,super.end(null,null,i)}get ended(){return this[yD]}write(e,r,i){if(typeof r=="function"&&(i=r,r="utf8"),typeof e=="string"&&(e=dl.from(e,r)),this[lf])return;CD(this[pr],"zlib binding closed");let n=this[pr]._handle,s=n.close;n.close=()=>{};let o=this[pr].close;this[pr].close=()=>{},dl.concat=c=>c;let a;try{let c=typeof e[Xd]=="number"?e[Xd]:this[Xd];a=this[pr]._processChunk(e,c),dl.concat=v6}catch(c){dl.concat=v6,this[fB](new Vd(c))}finally{this[pr]&&(this[pr]._handle=n,n.close=s,this[pr].close=o,this[pr].removeAllListeners("error"))}this[pr]&&this[pr].on("error",c=>this[fB](new Vd(c)));let l;if(a)if(Array.isArray(a)&&a.length>0){l=this[_c](dl.from(a[0]));for(let c=1;c{this.flush(n),s()};try{this[pr].params(e,r)}finally{this[pr].flush=i}this[pr]&&(this[ED]=e,this[ID]=r)}}}},k6=class extends Cl{constructor(e){super(e,"Deflate")}},x6=class extends Cl{constructor(e){super(e,"Inflate")}},BD=Symbol("_portable"),P6=class extends Cl{constructor(e){super(e,"Gzip");this[BD]=e&&!!e.portable}[_c](e){return this[BD]?(this[BD]=!1,e[9]=255,super[_c](e)):super[_c](e)}},D6=class extends Cl{constructor(e){super(e,"Gunzip")}},R6=class extends Cl{constructor(e){super(e,"DeflateRaw")}},F6=class extends Cl{constructor(e){super(e,"InflateRaw")}},N6=class extends Cl{constructor(e){super(e,"Unzip")}},bD=class extends wD{constructor(e,r){e=e||{},e.flush=e.flush||zc.BROTLI_OPERATION_PROCESS,e.finishFlush=e.finishFlush||zc.BROTLI_OPERATION_FINISH,super(e,r),this[mD]=zc.BROTLI_OPERATION_FLUSH}},L6=class extends bD{constructor(e){super(e,"BrotliCompress")}},T6=class extends bD{constructor(e){super(e,"BrotliDecompress")}};os.Deflate=k6;os.Inflate=x6;os.Gzip=P6;os.Gunzip=D6;os.DeflateRaw=R6;os.InflateRaw=F6;os.Unzip=N6;typeof Q6.BrotliCompress=="function"?(os.BrotliCompress=L6,os.BrotliDecompress=T6):os.BrotliCompress=os.BrotliDecompress=class{constructor(){throw new Error("Brotli is not supported in this version of Node.js")}}});var Zd=w(hB=>{"use strict";hB.name=new Map([["0","File"],["","OldFile"],["1","Link"],["2","SymbolicLink"],["3","CharacterDevice"],["4","BlockDevice"],["5","Directory"],["6","FIFO"],["7","ContiguousFile"],["g","GlobalExtendedHeader"],["x","ExtendedHeader"],["A","SolarisACL"],["D","GNUDumpDir"],["I","Inode"],["K","NextFileHasLongLinkpath"],["L","NextFileHasLongPath"],["M","ContinuationFile"],["N","OldGnuLongPath"],["S","SparseFile"],["V","TapeVolumeHeader"],["X","OldExtendedHeader"]]);hB.code=new Map(Array.from(hB.name).map(t=>[t[1],t[0]]))});var $d=w((vAt,O6)=>{"use strict";var bAt=Zd(),sFe=Af(),vD=Symbol("slurp");O6.exports=class extends sFe{constructor(e,r,i){super();switch(this.pause(),this.extended=r,this.globalExtended=i,this.header=e,this.startBlockSize=512*Math.ceil(e.size/512),this.blockRemain=this.startBlockSize,this.remain=e.size,this.type=e.type,this.meta=!1,this.ignore=!1,this.type){case"File":case"OldFile":case"Link":case"SymbolicLink":case"CharacterDevice":case"BlockDevice":case"Directory":case"FIFO":case"ContiguousFile":case"GNUDumpDir":break;case"NextFileHasLongLinkpath":case"NextFileHasLongPath":case"OldGnuLongPath":case"GlobalExtendedHeader":case"ExtendedHeader":case"OldExtendedHeader":this.meta=!0;break;default:this.ignore=!0}this.path=e.path,this.mode=e.mode,this.mode&&(this.mode=this.mode&4095),this.uid=e.uid,this.gid=e.gid,this.uname=e.uname,this.gname=e.gname,this.size=e.size,this.mtime=e.mtime,this.atime=e.atime,this.ctime=e.ctime,this.linkpath=e.linkpath,this.uname=e.uname,this.gname=e.gname,r&&this[vD](r),i&&this[vD](i,!0)}write(e){let r=e.length;if(r>this.blockRemain)throw new Error("writing more to entry than is appropriate");let i=this.remain,n=this.blockRemain;return this.remain=Math.max(0,i-r),this.blockRemain=Math.max(0,n-r),this.ignore?!0:i>=r?super.write(e):super.write(e.slice(0,i))}[vD](e,r){for(let i in e)e[i]!==null&&e[i]!==void 0&&!(r&&i==="path")&&(this[i]=e[i])}}});var U6=w(SD=>{"use strict";var SAt=SD.encode=(t,e)=>{if(Number.isSafeInteger(t))t<0?aFe(t,e):oFe(t,e);else throw Error("cannot encode number outside of javascript safe integer range");return e},oFe=(t,e)=>{e[0]=128;for(var r=e.length;r>1;r--)e[r-1]=t&255,t=Math.floor(t/256)},aFe=(t,e)=>{e[0]=255;var r=!1;t=t*-1;for(var i=e.length;i>1;i--){var n=t&255;t=Math.floor(t/256),r?e[i-1]=M6(n):n===0?e[i-1]=0:(r=!0,e[i-1]=K6(n))}},kAt=SD.parse=t=>{var e=t[t.length-1],r=t[0],i;if(r===128)i=lFe(t.slice(1,t.length));else if(r===255)i=AFe(t);else throw Error("invalid base256 encoding");if(!Number.isSafeInteger(i))throw Error("parsed number outside of javascript safe integer range");return i},AFe=t=>{for(var e=t.length,r=0,i=!1,n=e-1;n>-1;n--){var s=t[n],o;i?o=M6(s):s===0?o=s:(i=!0,o=K6(s)),o!==0&&(r-=o*Math.pow(256,e-n-1))}return r},lFe=t=>{for(var e=t.length,r=0,i=e-1;i>-1;i--){var n=t[i];n!==0&&(r+=n*Math.pow(256,e-i-1))}return r},M6=t=>(255^t)&255,K6=t=>(255^t)+1&255});var uf=w((PAt,H6)=>{"use strict";var kD=Zd(),cf=require("path").posix,G6=U6(),xD=Symbol("slurp"),as=Symbol("type"),j6=class{constructor(e,r,i,n){this.cksumValid=!1,this.needPax=!1,this.nullBlock=!1,this.block=null,this.path=null,this.mode=null,this.uid=null,this.gid=null,this.size=null,this.mtime=null,this.cksum=null,this[as]="0",this.linkpath=null,this.uname=null,this.gname=null,this.devmaj=0,this.devmin=0,this.atime=null,this.ctime=null,Buffer.isBuffer(e)?this.decode(e,r||0,i,n):e&&this.set(e)}decode(e,r,i,n){if(r||(r=0),!e||!(e.length>=r+512))throw new Error("need 512 bytes for header");if(this.path=Vc(e,r,100),this.mode=ml(e,r+100,8),this.uid=ml(e,r+108,8),this.gid=ml(e,r+116,8),this.size=ml(e,r+124,12),this.mtime=PD(e,r+136,12),this.cksum=ml(e,r+148,12),this[xD](i),this[xD](n,!0),this[as]=Vc(e,r+156,1),this[as]===""&&(this[as]="0"),this[as]==="0"&&this.path.substr(-1)==="/"&&(this[as]="5"),this[as]==="5"&&(this.size=0),this.linkpath=Vc(e,r+157,100),e.slice(r+257,r+265).toString()==="ustar\x0000")if(this.uname=Vc(e,r+265,32),this.gname=Vc(e,r+297,32),this.devmaj=ml(e,r+329,8),this.devmin=ml(e,r+337,8),e[r+475]!==0){let o=Vc(e,r+345,155);this.path=o+"/"+this.path}else{let o=Vc(e,r+345,130);o&&(this.path=o+"/"+this.path),this.atime=PD(e,r+476,12),this.ctime=PD(e,r+488,12)}let s=8*32;for(let o=r;o=r+512))throw new Error("need 512 bytes for header");let i=this.ctime||this.atime?130:155,n=cFe(this.path||"",i),s=n[0],o=n[1];this.needPax=n[2],this.needPax=Xc(e,r,100,s)||this.needPax,this.needPax=El(e,r+100,8,this.mode)||this.needPax,this.needPax=El(e,r+108,8,this.uid)||this.needPax,this.needPax=El(e,r+116,8,this.gid)||this.needPax,this.needPax=El(e,r+124,12,this.size)||this.needPax,this.needPax=DD(e,r+136,12,this.mtime)||this.needPax,e[r+156]=this[as].charCodeAt(0),this.needPax=Xc(e,r+157,100,this.linkpath)||this.needPax,e.write("ustar\x0000",r+257,8),this.needPax=Xc(e,r+265,32,this.uname)||this.needPax,this.needPax=Xc(e,r+297,32,this.gname)||this.needPax,this.needPax=El(e,r+329,8,this.devmaj)||this.needPax,this.needPax=El(e,r+337,8,this.devmin)||this.needPax,this.needPax=Xc(e,r+345,i,o)||this.needPax,e[r+475]!==0?this.needPax=Xc(e,r+345,155,o)||this.needPax:(this.needPax=Xc(e,r+345,130,o)||this.needPax,this.needPax=DD(e,r+476,12,this.atime)||this.needPax,this.needPax=DD(e,r+488,12,this.ctime)||this.needPax);let a=8*32;for(let l=r;l{let r=100,i=t,n="",s,o=cf.parse(t).root||".";if(Buffer.byteLength(i)r&&Buffer.byteLength(n)<=e?s=[i.substr(0,r-1),n,!0]:(i=cf.join(cf.basename(n),i),n=cf.dirname(n));while(n!==o&&!s);s||(s=[t.substr(0,r-1),"",!0])}return s},Vc=(t,e,r)=>t.slice(e,e+r).toString("utf8").replace(/\0.*/,""),PD=(t,e,r)=>uFe(ml(t,e,r)),uFe=t=>t===null?null:new Date(t*1e3),ml=(t,e,r)=>t[e]&128?G6.parse(t.slice(e,e+r)):gFe(t,e,r),fFe=t=>isNaN(t)?null:t,gFe=(t,e,r)=>fFe(parseInt(t.slice(e,e+r).toString("utf8").replace(/\0.*$/,"").trim(),8)),hFe={12:8589934591,8:2097151},El=(t,e,r,i)=>i===null?!1:i>hFe[r]||i<0?(G6.encode(i,t.slice(e,e+r)),!0):(pFe(t,e,r,i),!1),pFe=(t,e,r,i)=>t.write(dFe(i,r),e,r,"ascii"),dFe=(t,e)=>CFe(Math.floor(t).toString(8),e),CFe=(t,e)=>(t.length===e-1?t:new Array(e-t.length-1).join("0")+t+" ")+"\0",DD=(t,e,r,i)=>i===null?!1:El(t,e,r,i.getTime()/1e3),mFe=new Array(156).join("\0"),Xc=(t,e,r,i)=>i===null?!1:(t.write(i+mFe,e,r,"utf8"),i.length!==Buffer.byteLength(i)||i.length>r);H6.exports=j6});var dB=w((DAt,Y6)=>{"use strict";var EFe=uf(),IFe=require("path"),pB=class{constructor(e,r){this.atime=e.atime||null,this.charset=e.charset||null,this.comment=e.comment||null,this.ctime=e.ctime||null,this.gid=e.gid||null,this.gname=e.gname||null,this.linkpath=e.linkpath||null,this.mtime=e.mtime||null,this.path=e.path||null,this.size=e.size||null,this.uid=e.uid||null,this.uname=e.uname||null,this.dev=e.dev||null,this.ino=e.ino||null,this.nlink=e.nlink||null,this.global=r||!1}encode(){let e=this.encodeBody();if(e==="")return null;let r=Buffer.byteLength(e),i=512*Math.ceil(1+r/512),n=Buffer.allocUnsafe(i);for(let s=0;s<512;s++)n[s]=0;new EFe({path:("PaxHeader/"+IFe.basename(this.path)).slice(0,99),mode:this.mode||420,uid:this.uid||null,gid:this.gid||null,size:r,mtime:this.mtime||null,type:this.global?"GlobalExtendedHeader":"ExtendedHeader",linkpath:"",uname:this.uname||"",gname:this.gname||"",devmaj:0,devmin:0,atime:this.atime||null,ctime:this.ctime||null}).encode(n),n.write(e,512,r,"utf8");for(let s=r+512;s=Math.pow(10,s)&&(s+=1),s+n+i}};pB.parse=(t,e,r)=>new pB(yFe(wFe(t),e),r);var yFe=(t,e)=>e?Object.keys(t).reduce((r,i)=>(r[i]=t[i],r),e):t,wFe=t=>t.replace(/\n$/,"").split(` -`).reduce(BFe,Object.create(null)),BFe=(t,e)=>{let r=parseInt(e,10);if(r!==Buffer.byteLength(e)+1)return t;e=e.substr((r+" ").length);let i=e.split("="),n=i.shift().replace(/^SCHILY\.(dev|ino|nlink)/,"$1");if(!n)return t;let s=i.join("=");return t[n]=/^([A-Z]+\.)?([mac]|birth|creation)time$/.test(n)?new Date(s*1e3):/^[0-9]+$/.test(s)?+s:s,t};Y6.exports=pB});var CB=w((RAt,q6)=>{"use strict";q6.exports=t=>class extends t{warn(e,r,i={}){this.file&&(i.file=this.file),this.cwd&&(i.cwd=this.cwd),i.code=r instanceof Error&&r.code||e,i.tarCode=e,!this.strict&&i.recoverable!==!1?(r instanceof Error&&(i=Object.assign(r,i),r=r.message),this.emit("warn",i.tarCode,r,i)):r instanceof Error?this.emit("error",Object.assign(r,i)):this.emit("error",Object.assign(new Error(`${e}: ${r}`),i))}}});var FD=w((FAt,J6)=>{"use strict";var mB=["|","<",">","?",":"],RD=mB.map(t=>String.fromCharCode(61440+t.charCodeAt(0))),bFe=new Map(mB.map((t,e)=>[t,RD[e]])),QFe=new Map(RD.map((t,e)=>[t,mB[e]]));J6.exports={encode:t=>mB.reduce((e,r)=>e.split(r).join(bFe.get(r)),t),decode:t=>RD.reduce((e,r)=>e.split(r).join(QFe.get(r)),t)}});var z6=w((NAt,W6)=>{"use strict";W6.exports=(t,e,r)=>(t&=4095,r&&(t=(t|384)&~18),e&&(t&256&&(t|=64),t&32&&(t|=8),t&4&&(t|=1)),t)});var UD=w((KAt,_6)=>{"use strict";var V6=Af(),X6=dB(),Z6=uf(),LAt=$d(),ra=require("fs"),gf=require("path"),TAt=Zd(),vFe=16*1024*1024,$6=Symbol("process"),eV=Symbol("file"),tV=Symbol("directory"),ND=Symbol("symlink"),rV=Symbol("hardlink"),eC=Symbol("header"),EB=Symbol("read"),LD=Symbol("lstat"),IB=Symbol("onlstat"),TD=Symbol("onread"),OD=Symbol("onreadlink"),MD=Symbol("openfile"),KD=Symbol("onopenfile"),Zc=Symbol("close"),yB=Symbol("mode"),iV=CB(),SFe=FD(),nV=z6(),wB=iV(class extends V6{constructor(e,r){if(r=r||{},super(r),typeof e!="string")throw new TypeError("path is required");this.path=e,this.portable=!!r.portable,this.myuid=process.getuid&&process.getuid(),this.myuser=process.env.USER||"",this.maxReadSize=r.maxReadSize||vFe,this.linkCache=r.linkCache||new Map,this.statCache=r.statCache||new Map,this.preservePaths=!!r.preservePaths,this.cwd=r.cwd||process.cwd(),this.strict=!!r.strict,this.noPax=!!r.noPax,this.noMtime=!!r.noMtime,this.mtime=r.mtime||null,typeof r.onwarn=="function"&&this.on("warn",r.onwarn);let i=!1;if(!this.preservePaths&&gf.win32.isAbsolute(e)){let n=gf.win32.parse(e);this.path=e.substr(n.root.length),i=n.root}this.win32=!!r.win32||process.platform==="win32",this.win32&&(this.path=SFe.decode(this.path.replace(/\\/g,"/")),e=e.replace(/\\/g,"/")),this.absolute=r.absolute||gf.resolve(this.cwd,e),this.path===""&&(this.path="./"),i&&this.warn("TAR_ENTRY_INFO",`stripping ${i} from absolute path`,{entry:this,path:i+this.path}),this.statCache.has(this.absolute)?this[IB](this.statCache.get(this.absolute)):this[LD]()}[LD](){ra.lstat(this.absolute,(e,r)=>{if(e)return this.emit("error",e);this[IB](r)})}[IB](e){this.statCache.set(this.absolute,e),this.stat=e,e.isFile()||(e.size=0),this.type=kFe(e),this.emit("stat",e),this[$6]()}[$6](){switch(this.type){case"File":return this[eV]();case"Directory":return this[tV]();case"SymbolicLink":return this[ND]();default:return this.end()}}[yB](e){return nV(e,this.type==="Directory",this.portable)}[eC](){this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.header=new Z6({path:this.path,linkpath:this.linkpath,mode:this[yB](this.stat.mode),uid:this.portable?null:this.stat.uid,gid:this.portable?null:this.stat.gid,size:this.stat.size,mtime:this.noMtime?null:this.mtime||this.stat.mtime,type:this.type,uname:this.portable?null:this.stat.uid===this.myuid?this.myuser:"",atime:this.portable?null:this.stat.atime,ctime:this.portable?null:this.stat.ctime}),this.header.encode()&&!this.noPax&&this.write(new X6({atime:this.portable?null:this.header.atime,ctime:this.portable?null:this.header.ctime,gid:this.portable?null:this.header.gid,mtime:this.noMtime?null:this.mtime||this.header.mtime,path:this.path,linkpath:this.linkpath,size:this.header.size,uid:this.portable?null:this.header.uid,uname:this.portable?null:this.header.uname,dev:this.portable?null:this.stat.dev,ino:this.portable?null:this.stat.ino,nlink:this.portable?null:this.stat.nlink}).encode()),this.write(this.header.block)}[tV](){this.path.substr(-1)!=="/"&&(this.path+="/"),this.stat.size=0,this[eC](),this.end()}[ND](){ra.readlink(this.absolute,(e,r)=>{if(e)return this.emit("error",e);this[OD](r)})}[OD](e){this.linkpath=e.replace(/\\/g,"/"),this[eC](),this.end()}[rV](e){this.type="Link",this.linkpath=gf.relative(this.cwd,e).replace(/\\/g,"/"),this.stat.size=0,this[eC](),this.end()}[eV](){if(this.stat.nlink>1){let e=this.stat.dev+":"+this.stat.ino;if(this.linkCache.has(e)){let r=this.linkCache.get(e);if(r.indexOf(this.cwd)===0)return this[rV](r)}this.linkCache.set(e,this.absolute)}if(this[eC](),this.stat.size===0)return this.end();this[MD]()}[MD](){ra.open(this.absolute,"r",(e,r)=>{if(e)return this.emit("error",e);this[KD](r)})}[KD](e){let r=512*Math.ceil(this.stat.size/512),i=Math.min(r,this.maxReadSize),n=Buffer.allocUnsafe(i);this[EB](e,n,0,n.length,0,this.stat.size,r)}[EB](e,r,i,n,s,o,a){ra.read(e,r,i,n,s,(l,c)=>{if(l)return this[Zc](e,()=>this.emit("error",l));this[TD](e,r,i,n,s,o,a,c)})}[Zc](e,r){ra.close(e,r)}[TD](e,r,i,n,s,o,a,l){if(l<=0&&o>0){let u=new Error("encountered unexpected EOF");return u.path=this.absolute,u.syscall="read",u.code="EOF",this[Zc](e,()=>this.emit("error",u))}if(l>o){let u=new Error("did not encounter expected EOF");return u.path=this.absolute,u.syscall="read",u.code="EOF",this[Zc](e,()=>this.emit("error",u))}if(l===o)for(let u=l;uu?this.emit("error",u):this.end());i>=n&&(r=Buffer.allocUnsafe(n),i=0),n=r.length-i,this[EB](e,r,i,n,s,o,a)}}),sV=class extends wB{constructor(e,r){super(e,r)}[LD](){this[IB](ra.lstatSync(this.absolute))}[ND](){this[OD](ra.readlinkSync(this.absolute))}[MD](){this[KD](ra.openSync(this.absolute,"r"))}[EB](e,r,i,n,s,o,a){let l=!0;try{let c=ra.readSync(e,r,i,n,s);this[TD](e,r,i,n,s,o,a,c),l=!1}finally{if(l)try{this[Zc](e,()=>{})}catch(c){}}}[Zc](e,r){ra.closeSync(e),r()}},xFe=iV(class extends V6{constructor(e,r){r=r||{},super(r),this.preservePaths=!!r.preservePaths,this.portable=!!r.portable,this.strict=!!r.strict,this.noPax=!!r.noPax,this.noMtime=!!r.noMtime,this.readEntry=e,this.type=e.type,this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.path=e.path,this.mode=this[yB](e.mode),this.uid=this.portable?null:e.uid,this.gid=this.portable?null:e.gid,this.uname=this.portable?null:e.uname,this.gname=this.portable?null:e.gname,this.size=e.size,this.mtime=this.noMtime?null:r.mtime||e.mtime,this.atime=this.portable?null:e.atime,this.ctime=this.portable?null:e.ctime,this.linkpath=e.linkpath,typeof r.onwarn=="function"&&this.on("warn",r.onwarn);let i=!1;if(gf.isAbsolute(this.path)&&!this.preservePaths){let n=gf.parse(this.path);i=n.root,this.path=this.path.substr(n.root.length)}this.remain=e.size,this.blockRemain=e.startBlockSize,this.header=new Z6({path:this.path,linkpath:this.linkpath,mode:this.mode,uid:this.portable?null:this.uid,gid:this.portable?null:this.gid,size:this.size,mtime:this.noMtime?null:this.mtime,type:this.type,uname:this.portable?null:this.uname,atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime}),i&&this.warn("TAR_ENTRY_INFO",`stripping ${i} from absolute path`,{entry:this,path:i+this.path}),this.header.encode()&&!this.noPax&&super.write(new X6({atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime,gid:this.portable?null:this.gid,mtime:this.noMtime?null:this.mtime,path:this.path,linkpath:this.linkpath,size:this.size,uid:this.portable?null:this.uid,uname:this.portable?null:this.uname,dev:this.portable?null:this.readEntry.dev,ino:this.portable?null:this.readEntry.ino,nlink:this.portable?null:this.readEntry.nlink}).encode()),super.write(this.header.block),e.pipe(this)}[yB](e){return nV(e,this.type==="Directory",this.portable)}write(e){let r=e.length;if(r>this.blockRemain)throw new Error("writing more to entry than is appropriate");return this.blockRemain-=r,super.write(e)}end(){return this.blockRemain&&this.write(Buffer.alloc(this.blockRemain)),super.end()}});wB.Sync=sV;wB.Tar=xFe;var kFe=t=>t.isFile()?"File":t.isDirectory()?"Directory":t.isSymbolicLink()?"SymbolicLink":"Unsupported";_6.exports=wB});var PB=w((HAt,oV)=>{"use strict";var HD=class{constructor(e,r){this.path=e||"./",this.absolute=r,this.entry=null,this.stat=null,this.readdir=null,this.pending=!1,this.ignore=!1,this.piped=!1}},PFe=Af(),DFe=QD(),RFe=$d(),GD=UD(),FFe=GD.Sync,NFe=GD.Tar,LFe=bp(),aV=Buffer.alloc(1024),BB=Symbol("onStat"),bB=Symbol("ended"),ia=Symbol("queue"),ff=Symbol("current"),$c=Symbol("process"),QB=Symbol("processing"),AV=Symbol("processJob"),na=Symbol("jobs"),jD=Symbol("jobDone"),vB=Symbol("addFSEntry"),lV=Symbol("addTarEntry"),YD=Symbol("stat"),qD=Symbol("readdir"),SB=Symbol("onreaddir"),kB=Symbol("pipe"),cV=Symbol("entry"),JD=Symbol("entryOpt"),WD=Symbol("writeEntryClass"),uV=Symbol("write"),zD=Symbol("ondrain"),xB=require("fs"),gV=require("path"),TFe=CB(),_D=TFe(class extends PFe{constructor(e){super(e);e=e||Object.create(null),this.opt=e,this.file=e.file||"",this.cwd=e.cwd||process.cwd(),this.maxReadSize=e.maxReadSize,this.preservePaths=!!e.preservePaths,this.strict=!!e.strict,this.noPax=!!e.noPax,this.prefix=(e.prefix||"").replace(/(\\|\/)+$/,""),this.linkCache=e.linkCache||new Map,this.statCache=e.statCache||new Map,this.readdirCache=e.readdirCache||new Map,this[WD]=GD,typeof e.onwarn=="function"&&this.on("warn",e.onwarn),this.portable=!!e.portable,this.zip=null,e.gzip?(typeof e.gzip!="object"&&(e.gzip={}),this.portable&&(e.gzip.portable=!0),this.zip=new DFe.Gzip(e.gzip),this.zip.on("data",r=>super.write(r)),this.zip.on("end",r=>super.end()),this.zip.on("drain",r=>this[zD]()),this.on("resume",r=>this.zip.resume())):this.on("drain",this[zD]),this.noDirRecurse=!!e.noDirRecurse,this.follow=!!e.follow,this.noMtime=!!e.noMtime,this.mtime=e.mtime||null,this.filter=typeof e.filter=="function"?e.filter:r=>!0,this[ia]=new LFe,this[na]=0,this.jobs=+e.jobs||4,this[QB]=!1,this[bB]=!1}[uV](e){return super.write(e)}add(e){return this.write(e),this}end(e){return e&&this.write(e),this[bB]=!0,this[$c](),this}write(e){if(this[bB])throw new Error("write after end");return e instanceof RFe?this[lV](e):this[vB](e),this.flowing}[lV](e){let r=gV.resolve(this.cwd,e.path);if(this.prefix&&(e.path=this.prefix+"/"+e.path.replace(/^\.(\/+|$)/,"")),!this.filter(e.path,e))e.resume();else{let i=new HD(e.path,r,!1);i.entry=new NFe(e,this[JD](i)),i.entry.on("end",n=>this[jD](i)),this[na]+=1,this[ia].push(i)}this[$c]()}[vB](e){let r=gV.resolve(this.cwd,e);this.prefix&&(e=this.prefix+"/"+e.replace(/^\.(\/+|$)/,"")),this[ia].push(new HD(e,r)),this[$c]()}[YD](e){e.pending=!0,this[na]+=1;let r=this.follow?"stat":"lstat";xB[r](e.absolute,(i,n)=>{e.pending=!1,this[na]-=1,i?this.emit("error",i):this[BB](e,n)})}[BB](e,r){this.statCache.set(e.absolute,r),e.stat=r,this.filter(e.path,r)||(e.ignore=!0),this[$c]()}[qD](e){e.pending=!0,this[na]+=1,xB.readdir(e.absolute,(r,i)=>{if(e.pending=!1,this[na]-=1,r)return this.emit("error",r);this[SB](e,i)})}[SB](e,r){this.readdirCache.set(e.absolute,r),e.readdir=r,this[$c]()}[$c](){if(!this[QB]){this[QB]=!0;for(let e=this[ia].head;e!==null&&this[na]this.warn(r,i,n),noPax:this.noPax,cwd:this.cwd,absolute:e.absolute,preservePaths:this.preservePaths,maxReadSize:this.maxReadSize,strict:this.strict,portable:this.portable,linkCache:this.linkCache,statCache:this.statCache,noMtime:this.noMtime,mtime:this.mtime}}[cV](e){this[na]+=1;try{return new this[WD](e.path,this[JD](e)).on("end",()=>this[jD](e)).on("error",r=>this.emit("error",r))}catch(r){this.emit("error",r)}}[zD](){this[ff]&&this[ff].entry&&this[ff].entry.resume()}[kB](e){e.piped=!0,e.readdir&&e.readdir.forEach(n=>{let s=this.prefix?e.path.slice(this.prefix.length+1)||"./":e.path,o=s==="./"?"":s.replace(/\/*$/,"/");this[vB](o+n)});let r=e.entry,i=this.zip;i?r.on("data",n=>{i.write(n)||r.pause()}):r.on("data",n=>{super.write(n)||r.pause()})}pause(){return this.zip&&this.zip.pause(),super.pause()}}),fV=class extends _D{constructor(e){super(e);this[WD]=FFe}pause(){}resume(){}[YD](e){let r=this.follow?"statSync":"lstatSync";this[BB](e,xB[r](e.absolute))}[qD](e,r){this[SB](e,xB.readdirSync(e.absolute))}[kB](e){let r=e.entry,i=this.zip;e.readdir&&e.readdir.forEach(n=>{let s=this.prefix?e.path.slice(this.prefix.length+1)||"./":e.path,o=s==="./"?"":s.replace(/\/*$/,"/");this[vB](o+n)}),i?r.on("data",n=>{i.write(n)}):r.on("data",n=>{super[uV](n)})}};_D.Sync=fV;oV.exports=_D});var Ef=w(tC=>{"use strict";var OFe=Af(),MFe=require("events").EventEmitter,Ks=require("fs"),DB=process.binding("fs"),GAt=DB.writeBuffers,KFe=DB.FSReqWrap||DB.FSReqCallback,hf=Symbol("_autoClose"),sa=Symbol("_close"),rC=Symbol("_ended"),or=Symbol("_fd"),hV=Symbol("_finished"),eu=Symbol("_flags"),VD=Symbol("_flush"),XD=Symbol("_handleChunk"),ZD=Symbol("_makeBuf"),$D=Symbol("_mode"),RB=Symbol("_needDrain"),pf=Symbol("_onerror"),df=Symbol("_onopen"),eR=Symbol("_onread"),tu=Symbol("_onwrite"),Il=Symbol("_open"),yl=Symbol("_path"),ru=Symbol("_pos"),oa=Symbol("_queue"),Cf=Symbol("_read"),pV=Symbol("_readSize"),wl=Symbol("_reading"),FB=Symbol("_remain"),dV=Symbol("_size"),NB=Symbol("_write"),mf=Symbol("_writing"),LB=Symbol("_defaultFlag"),tR=class extends OFe{constructor(e,r){if(r=r||{},super(r),this.writable=!1,typeof e!="string")throw new TypeError("path must be a string");this[or]=typeof r.fd=="number"?r.fd:null,this[yl]=e,this[pV]=r.readSize||16*1024*1024,this[wl]=!1,this[dV]=typeof r.size=="number"?r.size:Infinity,this[FB]=this[dV],this[hf]=typeof r.autoClose=="boolean"?r.autoClose:!0,typeof this[or]=="number"?this[Cf]():this[Il]()}get fd(){return this[or]}get path(){return this[yl]}write(){throw new TypeError("this is a readable stream")}end(){throw new TypeError("this is a readable stream")}[Il](){Ks.open(this[yl],"r",(e,r)=>this[df](e,r))}[df](e,r){e?this[pf](e):(this[or]=r,this.emit("open",r),this[Cf]())}[ZD](){return Buffer.allocUnsafe(Math.min(this[pV],this[FB]))}[Cf](){if(!this[wl]){this[wl]=!0;let e=this[ZD]();if(e.length===0)return process.nextTick(()=>this[eR](null,0,e));Ks.read(this[or],e,0,e.length,null,(r,i,n)=>this[eR](r,i,n))}}[eR](e,r,i){this[wl]=!1,e?this[pf](e):this[XD](r,i)&&this[Cf]()}[sa](){this[hf]&&typeof this[or]=="number"&&(Ks.close(this[or],e=>this.emit("close")),this[or]=null)}[pf](e){this[wl]=!0,this[sa](),this.emit("error",e)}[XD](e,r){let i=!1;return this[FB]-=e,e>0&&(i=super.write(ethis[df](e,r))}[df](e,r){this[LB]&&this[eu]==="r+"&&e&&e.code==="ENOENT"?(this[eu]="w",this[Il]()):e?this[pf](e):(this[or]=r,this.emit("open",r),this[VD]())}end(e,r){e&&this.write(e,r),this[rC]=!0,!this[mf]&&!this[oa].length&&typeof this[or]=="number"&&this[tu](null,0)}write(e,r){return typeof e=="string"&&(e=new Buffer(e,r)),this[rC]?(this.emit("error",new Error("write() after end()")),!1):this[or]===null||this[mf]||this[oa].length?(this[oa].push(e),this[RB]=!0,!1):(this[mf]=!0,this[NB](e),!0)}[NB](e){Ks.write(this[or],e,0,e.length,this[ru],(r,i)=>this[tu](r,i))}[tu](e,r){e?this[pf](e):(this[ru]!==null&&(this[ru]+=r),this[oa].length?this[VD]():(this[mf]=!1,this[rC]&&!this[hV]?(this[hV]=!0,this[sa](),this.emit("finish")):this[RB]&&(this[RB]=!1,this.emit("drain"))))}[VD](){if(this[oa].length===0)this[rC]&&this[tu](null,0);else if(this[oa].length===1)this[NB](this[oa].pop());else{let e=this[oa];this[oa]=[],UFe(this[or],e,this[ru],(r,i)=>this[tu](r,i))}}[sa](){this[hf]&&typeof this[or]=="number"&&(Ks.close(this[or],e=>this.emit("close")),this[or]=null)}},mV=class extends rR{[Il](){let e;try{e=Ks.openSync(this[yl],this[eu],this[$D])}catch(r){if(this[LB]&&this[eu]==="r+"&&r&&r.code==="ENOENT")return this[eu]="w",this[Il]();throw r}this[df](null,e)}[sa](){if(this[hf]&&typeof this[or]=="number"){try{Ks.closeSync(this[or])}catch(e){}this[or]=null,this.emit("close")}}[NB](e){try{this[tu](null,Ks.writeSync(this[or],e,0,e.length,this[ru]))}catch(r){this[tu](r,0)}}},UFe=(t,e,r,i)=>{let n=(o,a)=>i(o,a,e),s=new KFe;s.oncomplete=n,DB.writeBuffers(t,e,r,s)};tC.ReadStream=tR;tC.ReadStreamSync=CV;tC.WriteStream=rR;tC.WriteStreamSync=mV});var sC=w((JAt,EV)=>{"use strict";var HFe=CB(),YAt=require("path"),GFe=uf(),jFe=require("events"),YFe=bp(),qFe=1024*1024,JFe=$d(),IV=dB(),WFe=QD(),iR=Buffer.from([31,139]),Us=Symbol("state"),iu=Symbol("writeEntry"),AA=Symbol("readEntry"),nR=Symbol("nextEntry"),yV=Symbol("processEntry"),Hs=Symbol("extendedHeader"),iC=Symbol("globalExtendedHeader"),Bl=Symbol("meta"),wV=Symbol("emitMeta"),yr=Symbol("buffer"),lA=Symbol("queue"),nu=Symbol("ended"),BV=Symbol("emittedEnd"),su=Symbol("emit"),Ln=Symbol("unzip"),TB=Symbol("consumeChunk"),OB=Symbol("consumeChunkSub"),sR=Symbol("consumeBody"),bV=Symbol("consumeMeta"),QV=Symbol("consumeHeader"),MB=Symbol("consuming"),oR=Symbol("bufferConcat"),aR=Symbol("maybeEnd"),nC=Symbol("writing"),bl=Symbol("aborted"),KB=Symbol("onDone"),ou=Symbol("sawValidEntry"),UB=Symbol("sawNullBlock"),HB=Symbol("sawEOF"),zFe=t=>!0;EV.exports=HFe(class extends jFe{constructor(e){e=e||{},super(e),this.file=e.file||"",this[ou]=null,this.on(KB,r=>{(this[Us]==="begin"||this[ou]===!1)&&this.warn("TAR_BAD_ARCHIVE","Unrecognized archive format")}),e.ondone?this.on(KB,e.ondone):this.on(KB,r=>{this.emit("prefinish"),this.emit("finish"),this.emit("end"),this.emit("close")}),this.strict=!!e.strict,this.maxMetaEntrySize=e.maxMetaEntrySize||qFe,this.filter=typeof e.filter=="function"?e.filter:zFe,this.writable=!0,this.readable=!1,this[lA]=new YFe,this[yr]=null,this[AA]=null,this[iu]=null,this[Us]="begin",this[Bl]="",this[Hs]=null,this[iC]=null,this[nu]=!1,this[Ln]=null,this[bl]=!1,this[UB]=!1,this[HB]=!1,typeof e.onwarn=="function"&&this.on("warn",e.onwarn),typeof e.onentry=="function"&&this.on("entry",e.onentry)}[QV](e,r){this[ou]===null&&(this[ou]=!1);let i;try{i=new GFe(e,r,this[Hs],this[iC])}catch(n){return this.warn("TAR_ENTRY_INVALID",n)}if(i.nullBlock)this[UB]?(this[HB]=!0,this[Us]==="begin"&&(this[Us]="header"),this[su]("eof")):(this[UB]=!0,this[su]("nullBlock"));else if(this[UB]=!1,!i.cksumValid)this.warn("TAR_ENTRY_INVALID","checksum failure",{header:i});else if(!i.path)this.warn("TAR_ENTRY_INVALID","path is required",{header:i});else{let n=i.type;if(/^(Symbolic)?Link$/.test(n)&&!i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath required",{header:i});else if(!/^(Symbolic)?Link$/.test(n)&&i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath forbidden",{header:i});else{let s=this[iu]=new JFe(i,this[Hs],this[iC]);if(!this[ou])if(s.remain){let o=()=>{s.invalid||(this[ou]=!0)};s.on("end",o)}else this[ou]=!0;s.meta?s.size>this.maxMetaEntrySize?(s.ignore=!0,this[su]("ignoredEntry",s),this[Us]="ignore",s.resume()):s.size>0&&(this[Bl]="",s.on("data",o=>this[Bl]+=o),this[Us]="meta"):(this[Hs]=null,s.ignore=s.ignore||!this.filter(s.path,s),s.ignore?(this[su]("ignoredEntry",s),this[Us]=s.remain?"ignore":"header",s.resume()):(s.remain?this[Us]="body":(this[Us]="header",s.end()),this[AA]?this[lA].push(s):(this[lA].push(s),this[nR]())))}}}[yV](e){let r=!0;return e?Array.isArray(e)?this.emit.apply(this,e):(this[AA]=e,this.emit("entry",e),e.emittedEnd||(e.on("end",i=>this[nR]()),r=!1)):(this[AA]=null,r=!1),r}[nR](){do;while(this[yV](this[lA].shift()));if(!this[lA].length){let e=this[AA];!e||e.flowing||e.size===e.remain?this[nC]||this.emit("drain"):e.once("drain",i=>this.emit("drain"))}}[sR](e,r){let i=this[iu],n=i.blockRemain,s=n>=e.length&&r===0?e:e.slice(r,r+n);return i.write(s),i.blockRemain||(this[Us]="header",this[iu]=null,i.end()),s.length}[bV](e,r){let i=this[iu],n=this[sR](e,r);return this[iu]||this[wV](i),n}[su](e,r,i){!this[lA].length&&!this[AA]?this.emit(e,r,i):this[lA].push([e,r,i])}[wV](e){switch(this[su]("meta",this[Bl]),e.type){case"ExtendedHeader":case"OldExtendedHeader":this[Hs]=IV.parse(this[Bl],this[Hs],!1);break;case"GlobalExtendedHeader":this[iC]=IV.parse(this[Bl],this[iC],!0);break;case"NextFileHasLongPath":case"OldGnuLongPath":this[Hs]=this[Hs]||Object.create(null),this[Hs].path=this[Bl].replace(/\0.*/,"");break;case"NextFileHasLongLinkpath":this[Hs]=this[Hs]||Object.create(null),this[Hs].linkpath=this[Bl].replace(/\0.*/,"");break;default:throw new Error("unknown meta: "+e.type)}}abort(e){this[bl]=!0,this.emit("abort",e),this.warn("TAR_ABORT",e,{recoverable:!1})}write(e){if(this[bl])return;if(this[Ln]===null&&e){if(this[yr]&&(e=Buffer.concat([this[yr],e]),this[yr]=null),e.lengththis[TB](s)),this[Ln].on("error",s=>this.abort(s)),this[Ln].on("end",s=>{this[nu]=!0,this[TB]()}),this[nC]=!0;let n=this[Ln][i?"end":"write"](e);return this[nC]=!1,n}}this[nC]=!0,this[Ln]?this[Ln].write(e):this[TB](e),this[nC]=!1;let r=this[lA].length?!1:this[AA]?this[AA].flowing:!0;return!r&&!this[lA].length&&this[AA].once("drain",i=>this.emit("drain")),r}[oR](e){e&&!this[bl]&&(this[yr]=this[yr]?Buffer.concat([this[yr],e]):e)}[aR](){if(this[nu]&&!this[BV]&&!this[bl]&&!this[MB]){this[BV]=!0;let e=this[iu];if(e&&e.blockRemain){let r=this[yr]?this[yr].length:0;this.warn("TAR_BAD_ARCHIVE",`Truncated input (needed ${e.blockRemain} more bytes, only ${r} available)`,{entry:e}),this[yr]&&e.write(this[yr]),e.end()}this[su](KB)}}[TB](e){if(this[MB])this[oR](e);else if(!e&&!this[yr])this[aR]();else{if(this[MB]=!0,this[yr]){this[oR](e);let r=this[yr];this[yr]=null,this[OB](r)}else this[OB](e);for(;this[yr]&&this[yr].length>=512&&!this[bl]&&!this[HB];){let r=this[yr];this[yr]=null,this[OB](r)}this[MB]=!1}(!this[yr]||this[nu])&&this[aR]()}[OB](e){let r=0,i=e.length;for(;r+512<=i&&!this[bl]&&!this[HB];)switch(this[Us]){case"begin":case"header":this[QV](e,r),r+=512;break;case"ignore":case"body":r+=this[sR](e,r);break;case"meta":r+=this[bV](e,r);break;default:throw new Error("invalid state: "+this[Us])}r{"use strict";var _Fe=af(),SV=sC(),If=require("fs"),VFe=Ef(),kV=require("path"),WAt=vV.exports=(t,e,r)=>{typeof t=="function"?(r=t,e=null,t={}):Array.isArray(t)&&(e=t,t={}),typeof e=="function"&&(r=e,e=null),e?e=Array.from(e):e=[];let i=_Fe(t);if(i.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!i.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return e.length&&ZFe(i,e),i.noResume||XFe(i),i.file&&i.sync?$Fe(i):i.file?eNe(i,r):xV(i)},XFe=t=>{let e=t.onentry;t.onentry=e?r=>{e(r),r.resume()}:r=>r.resume()},ZFe=(t,e)=>{let r=new Map(e.map(s=>[s.replace(/\/+$/,""),!0])),i=t.filter,n=(s,o)=>{let a=o||kV.parse(s).root||".",l=s===a?!1:r.has(s)?r.get(s):n(kV.dirname(s),a);return r.set(s,l),l};t.filter=i?(s,o)=>i(s,o)&&n(s.replace(/\/+$/,"")):s=>n(s.replace(/\/+$/,""))},$Fe=t=>{let e=xV(t),r=t.file,i=!0,n;try{let s=If.statSync(r),o=t.maxReadSize||16*1024*1024;if(s.size{let r=new SV(t),i=t.maxReadSize||16*1024*1024,n=t.file,s=new Promise((o,a)=>{r.on("error",a),r.on("end",o),If.stat(n,(l,c)=>{if(l)a(l);else{let u=new VFe.ReadStream(n,{readSize:i,size:c.size});u.on("error",a),u.pipe(r)}})});return e?s.then(e,e):s},xV=t=>new SV(t)});var LV=w((XAt,PV)=>{"use strict";var tNe=af(),jB=PB(),_At=require("fs"),DV=Ef(),RV=GB(),FV=require("path"),VAt=PV.exports=(t,e,r)=>{if(typeof e=="function"&&(r=e),Array.isArray(t)&&(e=t,t={}),!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");e=Array.from(e);let i=tNe(t);if(i.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!i.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return i.file&&i.sync?rNe(i,e):i.file?iNe(i,e,r):i.sync?nNe(i,e):sNe(i,e)},rNe=(t,e)=>{let r=new jB.Sync(t),i=new DV.WriteStreamSync(t.file,{mode:t.mode||438});r.pipe(i),NV(r,e)},iNe=(t,e,r)=>{let i=new jB(t),n=new DV.WriteStream(t.file,{mode:t.mode||438});i.pipe(n);let s=new Promise((o,a)=>{n.on("error",a),n.on("close",o),i.on("error",a)});return AR(i,e),r?s.then(r,r):s},NV=(t,e)=>{e.forEach(r=>{r.charAt(0)==="@"?RV({file:FV.resolve(t.cwd,r.substr(1)),sync:!0,noResume:!0,onentry:i=>t.add(i)}):t.add(r)}),t.end()},AR=(t,e)=>{for(;e.length;){let r=e.shift();if(r.charAt(0)==="@")return RV({file:FV.resolve(t.cwd,r.substr(1)),noResume:!0,onentry:i=>t.add(i)}).then(i=>AR(t,e));t.add(r)}t.end()},nNe=(t,e)=>{let r=new jB.Sync(t);return NV(r,e),r},sNe=(t,e)=>{let r=new jB(t);return AR(r,e),r}});var lR=w((elt,TV)=>{"use strict";var oNe=af(),OV=PB(),ZAt=sC(),Gs=require("fs"),MV=Ef(),KV=GB(),UV=require("path"),HV=uf(),$At=TV.exports=(t,e,r)=>{let i=oNe(t);if(!i.file)throw new TypeError("file is required");if(i.gzip)throw new TypeError("cannot append to compressed archives");if(!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");return e=Array.from(e),i.sync?aNe(i,e):ANe(i,e,r)},aNe=(t,e)=>{let r=new OV.Sync(t),i=!0,n,s;try{try{n=Gs.openSync(t.file,"r+")}catch(l){if(l.code==="ENOENT")n=Gs.openSync(t.file,"w+");else throw l}let o=Gs.fstatSync(n),a=Buffer.alloc(512);e:for(s=0;so.size)break;s+=c,t.mtimeCache&&t.mtimeCache.set(l.path,l.mtime)}i=!1,lNe(t,r,s,n,e)}finally{if(i)try{Gs.closeSync(n)}catch(o){}}},lNe=(t,e,r,i,n)=>{let s=new MV.WriteStreamSync(t.file,{fd:i,start:r});e.pipe(s),cNe(e,n)},ANe=(t,e,r)=>{e=Array.from(e);let i=new OV(t),n=(o,a,l)=>{let c=(p,m)=>{p?Gs.close(o,y=>l(p)):l(null,m)},u=0;if(a===0)return c(null,0);let g=0,f=Buffer.alloc(512),h=(p,m)=>{if(p)return c(p);if(g+=m,g<512&&m)return Gs.read(o,f,g,f.length-g,u+g,h);if(u===0&&f[0]===31&&f[1]===139)return c(new Error("cannot append to compressed archives"));if(g<512)return c(null,u);let y=new HV(f);if(!y.cksumValid)return c(null,u);let b=512*Math.ceil(y.size/512);if(u+b+512>a||(u+=b+512,u>=a))return c(null,u);t.mtimeCache&&t.mtimeCache.set(y.path,y.mtime),g=0,Gs.read(o,f,0,512,u,h)};Gs.read(o,f,0,512,u,h)},s=new Promise((o,a)=>{i.on("error",a);let l="r+",c=(u,g)=>{if(u&&u.code==="ENOENT"&&l==="r+")return l="w+",Gs.open(t.file,l,c);if(u)return a(u);Gs.fstat(g,(f,h)=>{if(f)return a(f);n(g,h.size,(p,m)=>{if(p)return a(p);let y=new MV.WriteStream(t.file,{fd:g,start:m});i.pipe(y),y.on("error",a),y.on("close",o),GV(i,e)})})};Gs.open(t.file,l,c)});return r?s.then(r,r):s},cNe=(t,e)=>{e.forEach(r=>{r.charAt(0)==="@"?KV({file:UV.resolve(t.cwd,r.substr(1)),sync:!0,noResume:!0,onentry:i=>t.add(i)}):t.add(r)}),t.end()},GV=(t,e)=>{for(;e.length;){let r=e.shift();if(r.charAt(0)==="@")return KV({file:UV.resolve(t.cwd,r.substr(1)),noResume:!0,onentry:i=>t.add(i)}).then(i=>GV(t,e));t.add(r)}t.end()}});var YV=w((rlt,jV)=>{"use strict";var uNe=af(),gNe=lR(),tlt=jV.exports=(t,e,r)=>{let i=uNe(t);if(!i.file)throw new TypeError("file is required");if(i.gzip)throw new TypeError("cannot append to compressed archives");if(!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");return e=Array.from(e),fNe(i),gNe(i,e,r)},fNe=t=>{let e=t.filter;t.mtimeCache||(t.mtimeCache=new Map),t.filter=e?(r,i)=>e(r,i)&&!(t.mtimeCache.get(r)>i.mtime):(r,i)=>!(t.mtimeCache.get(r)>i.mtime)}});var WV=w((ilt,qV)=>{var{promisify:JV}=require("util"),Ql=require("fs"),hNe=t=>{if(!t)t={mode:511,fs:Ql};else if(typeof t=="object")t=N({mode:511,fs:Ql},t);else if(typeof t=="number")t={mode:t,fs:Ql};else if(typeof t=="string")t={mode:parseInt(t,8),fs:Ql};else throw new TypeError("invalid options argument");return t.mkdir=t.mkdir||t.fs.mkdir||Ql.mkdir,t.mkdirAsync=JV(t.mkdir),t.stat=t.stat||t.fs.stat||Ql.stat,t.statAsync=JV(t.stat),t.statSync=t.statSync||t.fs.statSync||Ql.statSync,t.mkdirSync=t.mkdirSync||t.fs.mkdirSync||Ql.mkdirSync,t};qV.exports=hNe});var _V=w((nlt,zV)=>{var pNe=process.env.__TESTING_MKDIRP_PLATFORM__||process.platform,{resolve:dNe,parse:CNe}=require("path"),mNe=t=>{if(/\0/.test(t))throw Object.assign(new TypeError("path must be a string without null bytes"),{path:t,code:"ERR_INVALID_ARG_VALUE"});if(t=dNe(t),pNe==="win32"){let e=/[*|"<>?:]/,{root:r}=CNe(t);if(e.test(t.substr(r.length)))throw Object.assign(new Error("Illegal characters in path."),{path:t,code:"EINVAL"})}return t};zV.exports=mNe});var e9=w((slt,VV)=>{var{dirname:XV}=require("path"),ZV=(t,e,r=void 0)=>r===e?Promise.resolve():t.statAsync(e).then(i=>i.isDirectory()?r:void 0,i=>i.code==="ENOENT"?ZV(t,XV(e),e):void 0),$V=(t,e,r=void 0)=>{if(r!==e)try{return t.statSync(e).isDirectory()?r:void 0}catch(i){return i.code==="ENOENT"?$V(t,XV(e),e):void 0}};VV.exports={findMade:ZV,findMadeSync:$V}});var gR=w((olt,t9)=>{var{dirname:r9}=require("path"),cR=(t,e,r)=>{e.recursive=!1;let i=r9(t);return i===t?e.mkdirAsync(t,e).catch(n=>{if(n.code!=="EISDIR")throw n}):e.mkdirAsync(t,e).then(()=>r||t,n=>{if(n.code==="ENOENT")return cR(i,e).then(s=>cR(t,e,s));if(n.code!=="EEXIST"&&n.code!=="EROFS")throw n;return e.statAsync(t).then(s=>{if(s.isDirectory())return r;throw n},()=>{throw n})})},uR=(t,e,r)=>{let i=r9(t);if(e.recursive=!1,i===t)try{return e.mkdirSync(t,e)}catch(n){if(n.code!=="EISDIR")throw n;return}try{return e.mkdirSync(t,e),r||t}catch(n){if(n.code==="ENOENT")return uR(t,e,uR(i,e,r));if(n.code!=="EEXIST"&&n.code!=="EROFS")throw n;try{if(!e.statSync(t).isDirectory())throw n}catch(s){throw n}}};t9.exports={mkdirpManual:cR,mkdirpManualSync:uR}});var s9=w((alt,i9)=>{var{dirname:n9}=require("path"),{findMade:ENe,findMadeSync:INe}=e9(),{mkdirpManual:yNe,mkdirpManualSync:wNe}=gR(),BNe=(t,e)=>(e.recursive=!0,n9(t)===t?e.mkdirAsync(t,e):ENe(e,t).then(i=>e.mkdirAsync(t,e).then(()=>i).catch(n=>{if(n.code==="ENOENT")return yNe(t,e);throw n}))),bNe=(t,e)=>{if(e.recursive=!0,n9(t)===t)return e.mkdirSync(t,e);let i=INe(e,t);try{return e.mkdirSync(t,e),i}catch(n){if(n.code==="ENOENT")return wNe(t,e);throw n}};i9.exports={mkdirpNative:BNe,mkdirpNativeSync:bNe}});var l9=w((Alt,o9)=>{var a9=require("fs"),QNe=process.env.__TESTING_MKDIRP_NODE_VERSION__||process.version,fR=QNe.replace(/^v/,"").split("."),A9=+fR[0]>10||+fR[0]==10&&+fR[1]>=12,vNe=A9?t=>t.mkdir===a9.mkdir:()=>!1,SNe=A9?t=>t.mkdirSync===a9.mkdirSync:()=>!1;o9.exports={useNative:vNe,useNativeSync:SNe}});var p9=w((llt,c9)=>{var yf=WV(),wf=_V(),{mkdirpNative:u9,mkdirpNativeSync:g9}=s9(),{mkdirpManual:f9,mkdirpManualSync:h9}=gR(),{useNative:kNe,useNativeSync:xNe}=l9(),Bf=(t,e)=>(t=wf(t),e=yf(e),kNe(e)?u9(t,e):f9(t,e)),PNe=(t,e)=>(t=wf(t),e=yf(e),xNe(e)?g9(t,e):h9(t,e));Bf.sync=PNe;Bf.native=(t,e)=>u9(wf(t),yf(e));Bf.manual=(t,e)=>f9(wf(t),yf(e));Bf.nativeSync=(t,e)=>g9(wf(t),yf(e));Bf.manualSync=(t,e)=>h9(wf(t),yf(e));c9.exports=Bf});var w9=w((clt,d9)=>{"use strict";var js=require("fs"),au=require("path"),DNe=js.lchown?"lchown":"chown",RNe=js.lchownSync?"lchownSync":"chownSync",C9=js.lchown&&!process.version.match(/v1[1-9]+\./)&&!process.version.match(/v10\.[6-9]/),m9=(t,e,r)=>{try{return js[RNe](t,e,r)}catch(i){if(i.code!=="ENOENT")throw i}},FNe=(t,e,r)=>{try{return js.chownSync(t,e,r)}catch(i){if(i.code!=="ENOENT")throw i}},NNe=C9?(t,e,r,i)=>n=>{!n||n.code!=="EISDIR"?i(n):js.chown(t,e,r,i)}:(t,e,r,i)=>i,hR=C9?(t,e,r)=>{try{return m9(t,e,r)}catch(i){if(i.code!=="EISDIR")throw i;FNe(t,e,r)}}:(t,e,r)=>m9(t,e,r),LNe=process.version,E9=(t,e,r)=>js.readdir(t,e,r),TNe=(t,e)=>js.readdirSync(t,e);/^v4\./.test(LNe)&&(E9=(t,e,r)=>js.readdir(t,r));var YB=(t,e,r,i)=>{js[DNe](t,e,r,NNe(t,e,r,n=>{i(n&&n.code!=="ENOENT"?n:null)}))},I9=(t,e,r,i,n)=>{if(typeof e=="string")return js.lstat(au.resolve(t,e),(s,o)=>{if(s)return n(s.code!=="ENOENT"?s:null);o.name=e,I9(t,o,r,i,n)});if(e.isDirectory())pR(au.resolve(t,e.name),r,i,s=>{if(s)return n(s);let o=au.resolve(t,e.name);YB(o,r,i,n)});else{let s=au.resolve(t,e.name);YB(s,r,i,n)}},pR=(t,e,r,i)=>{E9(t,{withFileTypes:!0},(n,s)=>{if(n){if(n.code==="ENOENT")return i();if(n.code!=="ENOTDIR"&&n.code!=="ENOTSUP")return i(n)}if(n||!s.length)return YB(t,e,r,i);let o=s.length,a=null,l=c=>{if(!a){if(c)return i(a=c);if(--o==0)return YB(t,e,r,i)}};s.forEach(c=>I9(t,c,e,r,l))})},ONe=(t,e,r,i)=>{if(typeof e=="string")try{let n=js.lstatSync(au.resolve(t,e));n.name=e,e=n}catch(n){if(n.code==="ENOENT")return;throw n}e.isDirectory()&&y9(au.resolve(t,e.name),r,i),hR(au.resolve(t,e.name),r,i)},y9=(t,e,r)=>{let i;try{i=TNe(t,{withFileTypes:!0})}catch(n){if(n.code==="ENOENT")return;if(n.code==="ENOTDIR"||n.code==="ENOTSUP")return hR(t,e,r);throw n}return i&&i.length&&i.forEach(n=>ONe(t,n,e,r)),hR(t,e,r)};d9.exports=pR;pR.sync=y9});var v9=w((flt,dR)=>{"use strict";var B9=p9(),Ys=require("fs"),qB=require("path"),b9=w9(),CR=class extends Error{constructor(e,r){super("Cannot extract through symbolic link");this.path=r,this.symlink=e}get name(){return"SylinkError"}},oC=class extends Error{constructor(e,r){super(r+": Cannot cd into '"+e+"'");this.path=e,this.code=r}get name(){return"CwdError"}},ult=dR.exports=(t,e,r)=>{let i=e.umask,n=e.mode|448,s=(n&i)!=0,o=e.uid,a=e.gid,l=typeof o=="number"&&typeof a=="number"&&(o!==e.processUid||a!==e.processGid),c=e.preserve,u=e.unlink,g=e.cache,f=e.cwd,h=(y,b)=>{y?r(y):(g.set(t,!0),b&&l?b9(b,o,a,S=>h(S)):s?Ys.chmod(t,n,r):r())};if(g&&g.get(t)===!0)return h();if(t===f)return Ys.stat(t,(y,b)=>{(y||!b.isDirectory())&&(y=new oC(t,y&&y.code||"ENOTDIR")),h(y)});if(c)return B9(t,{mode:n}).then(y=>h(null,y),h);let m=qB.relative(f,t).split(/\/|\\/);JB(f,m,n,g,u,f,null,h)},JB=(t,e,r,i,n,s,o,a)=>{if(!e.length)return a(null,o);let l=e.shift(),c=t+"/"+l;if(i.get(c))return JB(c,e,r,i,n,s,o,a);Ys.mkdir(c,r,Q9(c,e,r,i,n,s,o,a))},Q9=(t,e,r,i,n,s,o,a)=>l=>{if(l){if(l.path&&qB.dirname(l.path)===s&&(l.code==="ENOTDIR"||l.code==="ENOENT"))return a(new oC(s,l.code));Ys.lstat(t,(c,u)=>{if(c)a(c);else if(u.isDirectory())JB(t,e,r,i,n,s,o,a);else if(n)Ys.unlink(t,g=>{if(g)return a(g);Ys.mkdir(t,r,Q9(t,e,r,i,n,s,o,a))});else{if(u.isSymbolicLink())return a(new CR(t,t+"/"+e.join("/")));a(l)}})}else o=o||t,JB(t,e,r,i,n,s,o,a)},glt=dR.exports.sync=(t,e)=>{let r=e.umask,i=e.mode|448,n=(i&r)!=0,s=e.uid,o=e.gid,a=typeof s=="number"&&typeof o=="number"&&(s!==e.processUid||o!==e.processGid),l=e.preserve,c=e.unlink,u=e.cache,g=e.cwd,f=y=>{u.set(t,!0),y&&a&&b9.sync(y,s,o),n&&Ys.chmodSync(t,i)};if(u&&u.get(t)===!0)return f();if(t===g){let y=!1,b="ENOTDIR";try{y=Ys.statSync(t).isDirectory()}catch(S){b=S.code}finally{if(!y)throw new oC(t,b)}f();return}if(l)return f(B9.sync(t,i));let p=qB.relative(g,t).split(/\/|\\/),m=null;for(let y=p.shift(),b=g;y&&(b+="/"+y);y=p.shift())if(!u.get(b))try{Ys.mkdirSync(b,i),m=m||b,u.set(b,!0)}catch(S){if(S.path&&qB.dirname(S.path)===g&&(S.code==="ENOTDIR"||S.code==="ENOENT"))return new oC(g,S.code);let k=Ys.lstatSync(b);if(k.isDirectory()){u.set(b,!0);continue}else if(c){Ys.unlinkSync(b),Ys.mkdirSync(b,i),m=m||b,u.set(b,!0);continue}else if(k.isSymbolicLink())return new CR(b,b+"/"+p.join("/"))}return f(m)}});var x9=w((hlt,S9)=>{var k9=require("assert");S9.exports=()=>{let t=new Map,e=new Map,{join:r}=require("path"),i=u=>r(u).split(/[\\\/]/).slice(0,-1).reduce((g,f)=>g.length?g.concat(r(g[g.length-1],f)):[f],[]),n=new Set,s=u=>{let g=e.get(u);if(!g)throw new Error("function does not have any path reservations");return{paths:g.paths.map(f=>t.get(f)),dirs:[...g.dirs].map(f=>t.get(f))}},o=u=>{let{paths:g,dirs:f}=s(u);return g.every(h=>h[0]===u)&&f.every(h=>h[0]instanceof Set&&h[0].has(u))},a=u=>n.has(u)||!o(u)?!1:(n.add(u),u(()=>l(u)),!0),l=u=>{if(!n.has(u))return!1;let{paths:g,dirs:f}=e.get(u),h=new Set;return g.forEach(p=>{let m=t.get(p);k9.equal(m[0],u),m.length===1?t.delete(p):(m.shift(),typeof m[0]=="function"?h.add(m[0]):m[0].forEach(y=>h.add(y)))}),f.forEach(p=>{let m=t.get(p);k9(m[0]instanceof Set),m[0].size===1&&m.length===1?t.delete(p):m[0].size===1?(m.shift(),h.add(m[0])):m[0].delete(u)}),n.delete(u),h.forEach(p=>a(p)),!0};return{check:o,reserve:(u,g)=>{let f=new Set(u.map(h=>i(h)).reduce((h,p)=>h.concat(p)));return e.set(g,{dirs:f,paths:u}),u.forEach(h=>{let p=t.get(h);p?p.push(g):t.set(h,[g])}),f.forEach(h=>{let p=t.get(h);p?p[p.length-1]instanceof Set?p[p.length-1].add(g):p.push(new Set([g])):t.set(h,[new Set([g])])}),a(g)}}}});var R9=w((plt,P9)=>{var MNe=process.env.__FAKE_PLATFORM__||process.platform,KNe=MNe==="win32",UNe=global.__FAKE_TESTING_FS__||require("fs"),{O_CREAT:HNe,O_TRUNC:GNe,O_WRONLY:jNe,UV_FS_O_FILEMAP:D9=0}=UNe.constants,YNe=KNe&&!!D9,qNe=512*1024,JNe=D9|GNe|HNe|jNe;P9.exports=YNe?t=>t"w"});var vR=w((Elt,F9)=>{"use strict";var WNe=require("assert"),dlt=require("events").EventEmitter,zNe=sC(),$t=require("fs"),_Ne=Ef(),cA=require("path"),mR=v9(),Clt=mR.sync,N9=FD(),VNe=x9(),L9=Symbol("onEntry"),ER=Symbol("checkFs"),T9=Symbol("checkFs2"),IR=Symbol("isReusable"),uA=Symbol("makeFs"),yR=Symbol("file"),wR=Symbol("directory"),WB=Symbol("link"),O9=Symbol("symlink"),M9=Symbol("hardlink"),K9=Symbol("unsupported"),mlt=Symbol("unknown"),U9=Symbol("checkPath"),bf=Symbol("mkdir"),dn=Symbol("onError"),zB=Symbol("pending"),H9=Symbol("pend"),Qf=Symbol("unpend"),BR=Symbol("ended"),bR=Symbol("maybeClose"),QR=Symbol("skip"),aC=Symbol("doChown"),AC=Symbol("uid"),lC=Symbol("gid"),G9=require("crypto"),j9=R9(),_B=()=>{throw new Error("sync function called cb somehow?!?")},XNe=(t,e)=>{if(process.platform!=="win32")return $t.unlink(t,e);let r=t+".DELETE."+G9.randomBytes(16).toString("hex");$t.rename(t,r,i=>{if(i)return e(i);$t.unlink(r,e)})},ZNe=t=>{if(process.platform!=="win32")return $t.unlinkSync(t);let e=t+".DELETE."+G9.randomBytes(16).toString("hex");$t.renameSync(t,e),$t.unlinkSync(e)},Y9=(t,e,r)=>t===t>>>0?t:e===e>>>0?e:r,VB=class extends zNe{constructor(e){if(e||(e={}),e.ondone=r=>{this[BR]=!0,this[bR]()},super(e),this.reservations=VNe(),this.transform=typeof e.transform=="function"?e.transform:null,this.writable=!0,this.readable=!1,this[zB]=0,this[BR]=!1,this.dirCache=e.dirCache||new Map,typeof e.uid=="number"||typeof e.gid=="number"){if(typeof e.uid!="number"||typeof e.gid!="number")throw new TypeError("cannot set owner without number uid and gid");if(e.preserveOwner)throw new TypeError("cannot preserve owner in archive and also set owner explicitly");this.uid=e.uid,this.gid=e.gid,this.setOwner=!0}else this.uid=null,this.gid=null,this.setOwner=!1;e.preserveOwner===void 0&&typeof e.uid!="number"?this.preserveOwner=process.getuid&&process.getuid()===0:this.preserveOwner=!!e.preserveOwner,this.processUid=(this.preserveOwner||this.setOwner)&&process.getuid?process.getuid():null,this.processGid=(this.preserveOwner||this.setOwner)&&process.getgid?process.getgid():null,this.forceChown=e.forceChown===!0,this.win32=!!e.win32||process.platform==="win32",this.newer=!!e.newer,this.keep=!!e.keep,this.noMtime=!!e.noMtime,this.preservePaths=!!e.preservePaths,this.unlink=!!e.unlink,this.cwd=cA.resolve(e.cwd||process.cwd()),this.strip=+e.strip||0,this.processUmask=process.umask(),this.umask=typeof e.umask=="number"?e.umask:this.processUmask,this.dmode=e.dmode||511&~this.umask,this.fmode=e.fmode||438&~this.umask,this.on("entry",r=>this[L9](r))}warn(e,r,i={}){return(e==="TAR_BAD_ARCHIVE"||e==="TAR_ABORT")&&(i.recoverable=!1),super.warn(e,r,i)}[bR](){this[BR]&&this[zB]===0&&(this.emit("prefinish"),this.emit("finish"),this.emit("end"),this.emit("close"))}[U9](e){if(this.strip){let r=e.path.split(/\/|\\/);if(r.length=this.strip&&(e.linkpath=i.slice(this.strip).join("/"))}}if(!this.preservePaths){let r=e.path;if(r.match(/(^|\/|\\)\.\.(\\|\/|$)/))return this.warn("TAR_ENTRY_ERROR","path contains '..'",{entry:e,path:r}),!1;if(cA.win32.isAbsolute(r)){let i=cA.win32.parse(r);e.path=r.substr(i.root.length);let n=i.root;this.warn("TAR_ENTRY_INFO",`stripping ${n} from absolute path`,{entry:e,path:r})}}if(this.win32){let r=cA.win32.parse(e.path);e.path=r.root===""?N9.encode(e.path):r.root+N9.encode(e.path.substr(r.root.length))}return cA.isAbsolute(e.path)?e.absolute=e.path:e.absolute=cA.resolve(this.cwd,e.path),!0}[L9](e){if(!this[U9](e))return e.resume();switch(WNe.equal(typeof e.absolute,"string"),e.type){case"Directory":case"GNUDumpDir":e.mode&&(e.mode=e.mode|448);case"File":case"OldFile":case"ContiguousFile":case"Link":case"SymbolicLink":return this[ER](e);case"CharacterDevice":case"BlockDevice":case"FIFO":return this[K9](e)}}[dn](e,r){e.name==="CwdError"?this.emit("error",e):(this.warn("TAR_ENTRY_ERROR",e,{entry:r}),this[Qf](),r.resume())}[bf](e,r,i){mR(e,{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:r},i)}[aC](e){return this.forceChown||this.preserveOwner&&(typeof e.uid=="number"&&e.uid!==this.processUid||typeof e.gid=="number"&&e.gid!==this.processGid)||typeof this.uid=="number"&&this.uid!==this.processUid||typeof this.gid=="number"&&this.gid!==this.processGid}[AC](e){return Y9(this.uid,e.uid,this.processUid)}[lC](e){return Y9(this.gid,e.gid,this.processGid)}[yR](e,r){let i=e.mode&4095||this.fmode,n=new _Ne.WriteStream(e.absolute,{flags:j9(e.size),mode:i,autoClose:!1});n.on("error",l=>this[dn](l,e));let s=1,o=l=>{if(l)return this[dn](l,e);--s==0&&$t.close(n.fd,c=>{r(),c?this[dn](c,e):this[Qf]()})};n.on("finish",l=>{let c=e.absolute,u=n.fd;if(e.mtime&&!this.noMtime){s++;let g=e.atime||new Date,f=e.mtime;$t.futimes(u,g,f,h=>h?$t.utimes(c,g,f,p=>o(p&&h)):o())}if(this[aC](e)){s++;let g=this[AC](e),f=this[lC](e);$t.fchown(u,g,f,h=>h?$t.chown(c,g,f,p=>o(p&&h)):o())}o()});let a=this.transform&&this.transform(e)||e;a!==e&&(a.on("error",l=>this[dn](l,e)),e.pipe(a)),a.pipe(n)}[wR](e,r){let i=e.mode&4095||this.dmode;this[bf](e.absolute,i,n=>{if(n)return r(),this[dn](n,e);let s=1,o=a=>{--s==0&&(r(),this[Qf](),e.resume())};e.mtime&&!this.noMtime&&(s++,$t.utimes(e.absolute,e.atime||new Date,e.mtime,o)),this[aC](e)&&(s++,$t.chown(e.absolute,this[AC](e),this[lC](e),o)),o()})}[K9](e){e.unsupported=!0,this.warn("TAR_ENTRY_UNSUPPORTED",`unsupported entry type: ${e.type}`,{entry:e}),e.resume()}[O9](e,r){this[WB](e,e.linkpath,"symlink",r)}[M9](e,r){this[WB](e,cA.resolve(this.cwd,e.linkpath),"link",r)}[H9](){this[zB]++}[Qf](){this[zB]--,this[bR]()}[QR](e){this[Qf](),e.resume()}[IR](e,r){return e.type==="File"&&!this.unlink&&r.isFile()&&r.nlink<=1&&process.platform!=="win32"}[ER](e){this[H9]();let r=[e.path];e.linkpath&&r.push(e.linkpath),this.reservations.reserve(r,i=>this[T9](e,i))}[T9](e,r){this[bf](cA.dirname(e.absolute),this.dmode,i=>{if(i)return r(),this[dn](i,e);$t.lstat(e.absolute,(n,s)=>{s&&(this.keep||this.newer&&s.mtime>e.mtime)?(this[QR](e),r()):n||this[IR](e,s)?this[uA](null,e,r):s.isDirectory()?e.type==="Directory"?!e.mode||(s.mode&4095)===e.mode?this[uA](null,e,r):$t.chmod(e.absolute,e.mode,o=>this[uA](o,e,r)):$t.rmdir(e.absolute,o=>this[uA](o,e,r)):XNe(e.absolute,o=>this[uA](o,e,r))})})}[uA](e,r,i){if(e)return this[dn](e,r);switch(r.type){case"File":case"OldFile":case"ContiguousFile":return this[yR](r,i);case"Link":return this[M9](r,i);case"SymbolicLink":return this[O9](r,i);case"Directory":case"GNUDumpDir":return this[wR](r,i)}}[WB](e,r,i,n){$t[i](r,e.absolute,s=>{if(s)return this[dn](s,e);n(),this[Qf](),e.resume()})}},q9=class extends VB{constructor(e){super(e)}[ER](e){let r=this[bf](cA.dirname(e.absolute),this.dmode,_B);if(r)return this[dn](r,e);try{let i=$t.lstatSync(e.absolute);if(this.keep||this.newer&&i.mtime>e.mtime)return this[QR](e);if(this[IR](e,i))return this[uA](null,e,_B);try{return i.isDirectory()?e.type==="Directory"?e.mode&&(i.mode&4095)!==e.mode&&$t.chmodSync(e.absolute,e.mode):$t.rmdirSync(e.absolute):ZNe(e.absolute),this[uA](null,e,_B)}catch(n){return this[dn](n,e)}}catch(i){return this[uA](null,e,_B)}}[yR](e,r){let i=e.mode&4095||this.fmode,n=l=>{let c;try{$t.closeSync(o)}catch(u){c=u}(l||c)&&this[dn](l||c,e)},s,o;try{o=$t.openSync(e.absolute,j9(e.size),i)}catch(l){return n(l)}let a=this.transform&&this.transform(e)||e;a!==e&&(a.on("error",l=>this[dn](l,e)),e.pipe(a)),a.on("data",l=>{try{$t.writeSync(o,l,0,l.length)}catch(c){n(c)}}),a.on("end",l=>{let c=null;if(e.mtime&&!this.noMtime){let u=e.atime||new Date,g=e.mtime;try{$t.futimesSync(o,u,g)}catch(f){try{$t.utimesSync(e.absolute,u,g)}catch(h){c=f}}}if(this[aC](e)){let u=this[AC](e),g=this[lC](e);try{$t.fchownSync(o,u,g)}catch(f){try{$t.chownSync(e.absolute,u,g)}catch(h){c=c||f}}}n(c)})}[wR](e,r){let i=e.mode&4095||this.dmode,n=this[bf](e.absolute,i);if(n)return this[dn](n,e);if(e.mtime&&!this.noMtime)try{$t.utimesSync(e.absolute,e.atime||new Date,e.mtime)}catch(s){}if(this[aC](e))try{$t.chownSync(e.absolute,this[AC](e),this[lC](e))}catch(s){}e.resume()}[bf](e,r){try{return mR.sync(e,{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:r})}catch(i){return i}}[WB](e,r,i,n){try{$t[i+"Sync"](r,e.absolute),e.resume()}catch(s){return this[dn](s,e)}}};VB.Sync=q9;F9.exports=VB});var V9=w((ylt,J9)=>{"use strict";var $Ne=af(),XB=vR(),W9=require("fs"),z9=Ef(),_9=require("path"),Ilt=J9.exports=(t,e,r)=>{typeof t=="function"?(r=t,e=null,t={}):Array.isArray(t)&&(e=t,t={}),typeof e=="function"&&(r=e,e=null),e?e=Array.from(e):e=[];let i=$Ne(t);if(i.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!i.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return e.length&&eLe(i,e),i.file&&i.sync?tLe(i):i.file?rLe(i,r):i.sync?iLe(i):nLe(i)},eLe=(t,e)=>{let r=new Map(e.map(s=>[s.replace(/\/+$/,""),!0])),i=t.filter,n=(s,o)=>{let a=o||_9.parse(s).root||".",l=s===a?!1:r.has(s)?r.get(s):n(_9.dirname(s),a);return r.set(s,l),l};t.filter=i?(s,o)=>i(s,o)&&n(s.replace(/\/+$/,"")):s=>n(s.replace(/\/+$/,""))},tLe=t=>{let e=new XB.Sync(t),r=t.file,i=!0,n,s=W9.statSync(r),o=t.maxReadSize||16*1024*1024;new z9.ReadStreamSync(r,{readSize:o,size:s.size}).pipe(e)},rLe=(t,e)=>{let r=new XB(t),i=t.maxReadSize||16*1024*1024,n=t.file,s=new Promise((o,a)=>{r.on("error",a),r.on("close",o),W9.stat(n,(l,c)=>{if(l)a(l);else{let u=new z9.ReadStream(n,{readSize:i,size:c.size});u.on("error",a),u.pipe(r)}})});return e?s.then(e,e):s},iLe=t=>new XB.Sync(t),nLe=t=>new XB(t)});var X9=w(hi=>{"use strict";hi.c=hi.create=LV();hi.r=hi.replace=lR();hi.t=hi.list=GB();hi.u=hi.update=YV();hi.x=hi.extract=V9();hi.Pack=PB();hi.Unpack=vR();hi.Parse=sC();hi.ReadEntry=$d();hi.WriteEntry=UD();hi.Header=uf();hi.Pax=dB();hi.types=Zd()});var r7=w((blt,t7)=>{var kR;t7.exports.getContent=()=>(typeof kR=="undefined"&&(kR=require("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),kR)});var A7=w((xR,a7)=>{(function(t,e){typeof xR=="object"?a7.exports=e():typeof define=="function"&&define.amd?define(e):t.treeify=e()})(xR,function(){function t(n,s){var o=s?"\u2514":"\u251C";return n?o+="\u2500 ":o+="\u2500\u2500\u2510",o}function e(n,s){var o=[];for(var a in n)!n.hasOwnProperty(a)||s&&typeof n[a]=="function"||o.push(a);return o}function r(n,s,o,a,l,c,u){var g="",f=0,h,p,m=a.slice(0);if(m.push([s,o])&&a.length>0&&(a.forEach(function(b,S){S>0&&(g+=(b[1]?" ":"\u2502")+" "),!p&&b[0]===s&&(p=!0)}),g+=t(n,o)+n,l&&(typeof s!="object"||s instanceof Date)&&(g+=": "+s),p&&(g+=" (circular ref.)"),u(g)),!p&&typeof s=="object"){var y=e(s,c);y.forEach(function(b){h=++f===y.length,r(b,s[b],h,m,l,c,u)})}}var i={};return i.asLines=function(n,s,o,a){var l=typeof o!="function"?o:!1;r(".",n,!1,[],s,l,a||o)},i.asTree=function(n,s,o){var a="";return r(".",n,!1,[],s,o,function(l){a+=l+` -`}),a},i})});var fA=w(RR=>{"use strict";Object.defineProperty(RR,"__esModule",{value:!0});RR.default=h7;function h7(){}h7.prototype={diff:function(e,r){var i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},n=i.callback;typeof i=="function"&&(n=i,i={}),this.options=i;var s=this;function o(m){return n?(setTimeout(function(){n(void 0,m)},0),!0):m}e=this.castInput(e),r=this.castInput(r),e=this.removeEmpty(this.tokenize(e)),r=this.removeEmpty(this.tokenize(r));var a=r.length,l=e.length,c=1,u=a+l,g=[{newPos:-1,components:[]}],f=this.extractCommon(g[0],r,e,0);if(g[0].newPos+1>=a&&f+1>=l)return o([{value:this.join(r),count:r.length}]);function h(){for(var m=-1*c;m<=c;m+=2){var y=void 0,b=g[m-1],S=g[m+1],k=(S?S.newPos:0)-m;b&&(g[m-1]=void 0);var T=b&&b.newPos+1=a&&k+1>=l)return o(gLe(s,y.components,r,e,s.useLongestToken));g[m]=y}c++}if(n)(function m(){setTimeout(function(){if(c>u)return n();h()||m()},0)})();else for(;c<=u;){var p=h();if(p)return p}},pushComponent:function(e,r,i){var n=e[e.length-1];n&&n.added===r&&n.removed===i?e[e.length-1]={count:n.count+1,added:r,removed:i}:e.push({count:1,added:r,removed:i})},extractCommon:function(e,r,i,n){for(var s=r.length,o=i.length,a=e.newPos,l=a-n,c=0;a+1h.length?m:h}),c.value=t.join(u)}else c.value=t.join(r.slice(a,a+c.count));a+=c.count,c.added||(l+=c.count)}}var f=e[o-1];return o>1&&typeof f.value=="string"&&(f.added||f.removed)&&t.equals("",f.value)&&(e[o-2].value+=f.value,e.pop()),e}function fLe(t){return{newPos:t.newPos,components:t.components.slice(0)}}});var d7=w(cC=>{"use strict";Object.defineProperty(cC,"__esModule",{value:!0});cC.diffChars=hLe;cC.characterDiff=void 0;var dLe=pLe(fA());function pLe(t){return t&&t.__esModule?t:{default:t}}var p7=new dLe.default;cC.characterDiff=p7;function hLe(t,e,r){return p7.diff(t,e,r)}});var NR=w(FR=>{"use strict";Object.defineProperty(FR,"__esModule",{value:!0});FR.generateOptions=CLe;function CLe(t,e){if(typeof t=="function")e.callback=t;else if(t)for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r]);return e}});var E7=w(vf=>{"use strict";Object.defineProperty(vf,"__esModule",{value:!0});vf.diffWords=mLe;vf.diffWordsWithSpace=ELe;vf.wordDiff=void 0;var yLe=ILe(fA()),wLe=NR();function ILe(t){return t&&t.__esModule?t:{default:t}}var C7=/^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/,m7=/\S/,uC=new yLe.default;vf.wordDiff=uC;uC.equals=function(t,e){return this.options.ignoreCase&&(t=t.toLowerCase(),e=e.toLowerCase()),t===e||this.options.ignoreWhitespace&&!m7.test(t)&&!m7.test(e)};uC.tokenize=function(t){for(var e=t.split(/(\s+|[()[\]{}'"]|\b)/),r=0;r{"use strict";Object.defineProperty(Sf,"__esModule",{value:!0});Sf.diffLines=BLe;Sf.diffTrimmedLines=bLe;Sf.lineDiff=void 0;var vLe=QLe(fA()),SLe=NR();function QLe(t){return t&&t.__esModule?t:{default:t}}var ZB=new vLe.default;Sf.lineDiff=ZB;ZB.tokenize=function(t){var e=[],r=t.split(/(\n|\r\n)/);r[r.length-1]||r.pop();for(var i=0;i{"use strict";Object.defineProperty(gC,"__esModule",{value:!0});gC.diffSentences=kLe;gC.sentenceDiff=void 0;var PLe=xLe(fA());function xLe(t){return t&&t.__esModule?t:{default:t}}var LR=new PLe.default;gC.sentenceDiff=LR;LR.tokenize=function(t){return t.split(/(\S.+?[.!?])(?=\s+|$)/)};function kLe(t,e,r){return LR.diff(t,e,r)}});var y7=w(fC=>{"use strict";Object.defineProperty(fC,"__esModule",{value:!0});fC.diffCss=DLe;fC.cssDiff=void 0;var FLe=RLe(fA());function RLe(t){return t&&t.__esModule?t:{default:t}}var TR=new FLe.default;fC.cssDiff=TR;TR.tokenize=function(t){return t.split(/([{}:;,]|\s+)/)};function DLe(t,e,r){return TR.diff(t,e,r)}});var B7=w(kf=>{"use strict";Object.defineProperty(kf,"__esModule",{value:!0});kf.diffJson=NLe;kf.canonicalize=e0;kf.jsonDiff=void 0;var w7=LLe(fA()),TLe=$B();function LLe(t){return t&&t.__esModule?t:{default:t}}function t0(t){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?t0=function(r){return typeof r}:t0=function(r){return r&&typeof Symbol=="function"&&r.constructor===Symbol&&r!==Symbol.prototype?"symbol":typeof r},t0(t)}var OLe=Object.prototype.toString,Au=new w7.default;kf.jsonDiff=Au;Au.useLongestToken=!0;Au.tokenize=TLe.lineDiff.tokenize;Au.castInput=function(t){var e=this.options,r=e.undefinedReplacement,i=e.stringifyReplacer,n=i===void 0?function(s,o){return typeof o=="undefined"?r:o}:i;return typeof t=="string"?t:JSON.stringify(e0(t,null,null,n),n," ")};Au.equals=function(t,e){return w7.default.prototype.equals.call(Au,t.replace(/,([\r\n])/g,"$1"),e.replace(/,([\r\n])/g,"$1"))};function NLe(t,e,r){return Au.diff(t,e,r)}function e0(t,e,r,i,n){e=e||[],r=r||[],i&&(t=i(n,t));var s;for(s=0;s{"use strict";Object.defineProperty(hC,"__esModule",{value:!0});hC.diffArrays=MLe;hC.arrayDiff=void 0;var ULe=KLe(fA());function KLe(t){return t&&t.__esModule?t:{default:t}}var pC=new ULe.default;hC.arrayDiff=pC;pC.tokenize=function(t){return t.slice()};pC.join=pC.removeEmpty=function(t){return t};function MLe(t,e,r){return pC.diff(t,e,r)}});var r0=w(OR=>{"use strict";Object.defineProperty(OR,"__esModule",{value:!0});OR.parsePatch=HLe;function HLe(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},r=t.split(/\r\n|[\n\v\f\r\x85]/),i=t.match(/\r\n|[\n\v\f\r\x85]/g)||[],n=[],s=0;function o(){var c={};for(n.push(c);s{"use strict";Object.defineProperty(MR,"__esModule",{value:!0});MR.default=GLe;function GLe(t,e,r){var i=!0,n=!1,s=!1,o=1;return function a(){if(i&&!s){if(n?o++:i=!1,t+o<=r)return o;s=!0}if(!n)return s||(i=!0),e<=t-o?-o++:(n=!0,a())}}});var k7=w(i0=>{"use strict";Object.defineProperty(i0,"__esModule",{value:!0});i0.applyPatch=v7;i0.applyPatches=jLe;var S7=r0(),qLe=YLe(Q7());function YLe(t){return t&&t.__esModule?t:{default:t}}function v7(t,e){var r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};if(typeof e=="string"&&(e=(0,S7.parsePatch)(e)),Array.isArray(e)){if(e.length>1)throw new Error("applyPatch only works with a single input.");e=e[0]}var i=t.split(/\r\n|[\n\v\f\r\x85]/),n=t.match(/\r\n|[\n\v\f\r\x85]/g)||[],s=e.hunks,o=r.compareLine||function(O,L,pe,Ce){return L===Ce},a=0,l=r.fuzzFactor||0,c=0,u=0,g,f;function h(O,L){for(var pe=0;pe0?Ce[0]:" ",te=Ce.length>0?Ce.substr(1):Ce;if(Oe===" "||Oe==="-"){if(!o(L+1,i[L],Oe,te)&&(a++,a>l))return!1;L++}}return!0}for(var p=0;p0?re[0]:" ",A=re.length>0?re.substr(1):re,oe=j.linedelimiters[J];if(ee===" ")Z++;else if(ee==="-")i.splice(Z,1),n.splice(Z,1);else if(ee==="+")i.splice(Z,0,A),n.splice(Z,0,oe),Z++;else if(ee==="\\"){var le=j.lines[J-1]?j.lines[J-1][0]:null;le==="+"?g=!0:le==="-"&&(f=!0)}}}if(g)for(;!i[i.length-1];)i.pop(),n.pop();else f&&(i.push(""),n.push(` -`));for(var X=0;X{"use strict";Object.defineProperty(dC,"__esModule",{value:!0});dC.structuredPatch=x7;dC.createTwoFilesPatch=P7;dC.createPatch=JLe;var WLe=$B();function KR(t){return VLe(t)||_Le(t)||zLe()}function zLe(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function _Le(t){if(Symbol.iterator in Object(t)||Object.prototype.toString.call(t)==="[object Arguments]")return Array.from(t)}function VLe(t){if(Array.isArray(t)){for(var e=0,r=new Array(t.length);e0?l(j.lines.slice(-o.context)):[],u-=f.length,g-=f.length)}(Y=f).push.apply(Y,KR(T.map(function(X){return(k.added?"+":"-")+X}))),k.added?p+=T.length:h+=T.length}else{if(u)if(T.length<=o.context*2&&S=a.length-2&&T.length<=o.context){var A=/\n$/.test(r),oe=/\n$/.test(i),le=T.length==0&&f.length>ee.oldLines;!A&&le&&f.splice(ee.oldLines,0,"\\ No newline at end of file"),(!A&&!le||!oe)&&f.push("\\ No newline at end of file")}c.push(ee),u=0,g=0,f=[]}h+=T.length,p+=T.length}},y=0;y{"use strict";Object.defineProperty(n0,"__esModule",{value:!0});n0.arrayEqual=XLe;n0.arrayStartsWith=D7;function XLe(t,e){return t.length!==e.length?!1:D7(t,e)}function D7(t,e){if(e.length>t.length)return!1;for(var r=0;r{"use strict";Object.defineProperty(s0,"__esModule",{value:!0});s0.calcLineCount=F7;s0.merge=ZLe;var $Le=UR(),eTe=r0(),HR=R7();function xf(t){return iTe(t)||rTe(t)||tTe()}function tTe(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function rTe(t){if(Symbol.iterator in Object(t)||Object.prototype.toString.call(t)==="[object Arguments]")return Array.from(t)}function iTe(t){if(Array.isArray(t)){for(var e=0,r=new Array(t.length);e{"use strict";Object.defineProperty(YR,"__esModule",{value:!0});YR.convertChangesToDMP=aTe;function aTe(t){for(var e=[],r,i,n=0;n{"use strict";Object.defineProperty(qR,"__esModule",{value:!0});qR.convertChangesToXML=ATe;function ATe(t){for(var e=[],r=0;r"):i.removed&&e.push(""),e.push(lTe(i.value)),i.added?e.push(""):i.removed&&e.push("")}return e.join("")}function lTe(t){var e=t;return e=e.replace(/&/g,"&"),e=e.replace(//g,">"),e=e.replace(/"/g,"""),e}});var V7=w(Ur=>{"use strict";Object.defineProperty(Ur,"__esModule",{value:!0});Object.defineProperty(Ur,"Diff",{enumerable:!0,get:function(){return cTe.default}});Object.defineProperty(Ur,"diffChars",{enumerable:!0,get:function(){return uTe.diffChars}});Object.defineProperty(Ur,"diffWords",{enumerable:!0,get:function(){return J7.diffWords}});Object.defineProperty(Ur,"diffWordsWithSpace",{enumerable:!0,get:function(){return J7.diffWordsWithSpace}});Object.defineProperty(Ur,"diffLines",{enumerable:!0,get:function(){return W7.diffLines}});Object.defineProperty(Ur,"diffTrimmedLines",{enumerable:!0,get:function(){return W7.diffTrimmedLines}});Object.defineProperty(Ur,"diffSentences",{enumerable:!0,get:function(){return gTe.diffSentences}});Object.defineProperty(Ur,"diffCss",{enumerable:!0,get:function(){return fTe.diffCss}});Object.defineProperty(Ur,"diffJson",{enumerable:!0,get:function(){return z7.diffJson}});Object.defineProperty(Ur,"canonicalize",{enumerable:!0,get:function(){return z7.canonicalize}});Object.defineProperty(Ur,"diffArrays",{enumerable:!0,get:function(){return hTe.diffArrays}});Object.defineProperty(Ur,"applyPatch",{enumerable:!0,get:function(){return _7.applyPatch}});Object.defineProperty(Ur,"applyPatches",{enumerable:!0,get:function(){return _7.applyPatches}});Object.defineProperty(Ur,"parsePatch",{enumerable:!0,get:function(){return pTe.parsePatch}});Object.defineProperty(Ur,"merge",{enumerable:!0,get:function(){return dTe.merge}});Object.defineProperty(Ur,"structuredPatch",{enumerable:!0,get:function(){return JR.structuredPatch}});Object.defineProperty(Ur,"createTwoFilesPatch",{enumerable:!0,get:function(){return JR.createTwoFilesPatch}});Object.defineProperty(Ur,"createPatch",{enumerable:!0,get:function(){return JR.createPatch}});Object.defineProperty(Ur,"convertChangesToDMP",{enumerable:!0,get:function(){return CTe.convertChangesToDMP}});Object.defineProperty(Ur,"convertChangesToXML",{enumerable:!0,get:function(){return mTe.convertChangesToXML}});var cTe=ETe(fA()),uTe=d7(),J7=E7(),W7=$B(),gTe=I7(),fTe=y7(),z7=B7(),hTe=b7(),_7=k7(),pTe=r0(),dTe=j7(),JR=UR(),CTe=Y7(),mTe=q7();function ETe(t){return t&&t.__esModule?t:{default:t}}});var a0=w((dct,X7)=>{var ITe=Ms(),yTe=yd(),wTe=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,BTe=/^\w*$/;function bTe(t,e){if(ITe(t))return!1;var r=typeof t;return r=="number"||r=="symbol"||r=="boolean"||t==null||yTe(t)?!0:BTe.test(t)||!wTe.test(t)||e!=null&&t in Object(e)}X7.exports=bTe});var A0=w((Cct,Z7)=>{var QTe=Gc(),vTe=Rn(),STe="[object AsyncFunction]",kTe="[object Function]",xTe="[object GeneratorFunction]",PTe="[object Proxy]";function DTe(t){if(!vTe(t))return!1;var e=QTe(t);return e==kTe||e==xTe||e==STe||e==PTe}Z7.exports=DTe});var eX=w((mct,$7)=>{var RTe=Fs(),FTe=RTe["__core-js_shared__"];$7.exports=FTe});var iX=w((Ect,tX)=>{var WR=eX(),rX=function(){var t=/[^.]+$/.exec(WR&&WR.keys&&WR.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}();function NTe(t){return!!rX&&rX in t}tX.exports=NTe});var zR=w((Ict,nX)=>{var LTe=Function.prototype,TTe=LTe.toString;function OTe(t){if(t!=null){try{return TTe.call(t)}catch(e){}try{return t+""}catch(e){}}return""}nX.exports=OTe});var oX=w((yct,sX)=>{var MTe=A0(),KTe=iX(),UTe=Rn(),HTe=zR(),GTe=/[\\^$.*+?()[\]{}|]/g,jTe=/^\[object .+?Constructor\]$/,YTe=Function.prototype,qTe=Object.prototype,JTe=YTe.toString,WTe=qTe.hasOwnProperty,zTe=RegExp("^"+JTe.call(WTe).replace(GTe,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function _Te(t){if(!UTe(t)||KTe(t))return!1;var e=MTe(t)?zTe:jTe;return e.test(HTe(t))}sX.exports=_Te});var AX=w((wct,aX)=>{function VTe(t,e){return t==null?void 0:t[e]}aX.exports=VTe});var Sl=w((Bct,lX)=>{var XTe=oX(),ZTe=AX();function $Te(t,e){var r=ZTe(t,e);return XTe(r)?r:void 0}lX.exports=$Te});var CC=w((bct,cX)=>{var eOe=Sl(),tOe=eOe(Object,"create");cX.exports=tOe});var fX=w((Qct,uX)=>{var gX=CC();function rOe(){this.__data__=gX?gX(null):{},this.size=0}uX.exports=rOe});var pX=w((vct,hX)=>{function iOe(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}hX.exports=iOe});var CX=w((Sct,dX)=>{var nOe=CC(),sOe="__lodash_hash_undefined__",oOe=Object.prototype,aOe=oOe.hasOwnProperty;function AOe(t){var e=this.__data__;if(nOe){var r=e[t];return r===sOe?void 0:r}return aOe.call(e,t)?e[t]:void 0}dX.exports=AOe});var EX=w((kct,mX)=>{var lOe=CC(),cOe=Object.prototype,uOe=cOe.hasOwnProperty;function gOe(t){var e=this.__data__;return lOe?e[t]!==void 0:uOe.call(e,t)}mX.exports=gOe});var yX=w((xct,IX)=>{var fOe=CC(),hOe="__lodash_hash_undefined__";function pOe(t,e){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=fOe&&e===void 0?hOe:e,this}IX.exports=pOe});var BX=w((Pct,wX)=>{var dOe=fX(),COe=pX(),mOe=CX(),EOe=EX(),IOe=yX();function Pf(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{function yOe(){this.__data__=[],this.size=0}bX.exports=yOe});var Df=w((Rct,vX)=>{function wOe(t,e){return t===e||t!==t&&e!==e}vX.exports=wOe});var mC=w((Fct,SX)=>{var BOe=Df();function bOe(t,e){for(var r=t.length;r--;)if(BOe(t[r][0],e))return r;return-1}SX.exports=bOe});var xX=w((Nct,kX)=>{var QOe=mC(),vOe=Array.prototype,SOe=vOe.splice;function kOe(t){var e=this.__data__,r=QOe(e,t);if(r<0)return!1;var i=e.length-1;return r==i?e.pop():SOe.call(e,r,1),--this.size,!0}kX.exports=kOe});var DX=w((Lct,PX)=>{var xOe=mC();function POe(t){var e=this.__data__,r=xOe(e,t);return r<0?void 0:e[r][1]}PX.exports=POe});var FX=w((Tct,RX)=>{var DOe=mC();function ROe(t){return DOe(this.__data__,t)>-1}RX.exports=ROe});var LX=w((Oct,NX)=>{var FOe=mC();function NOe(t,e){var r=this.__data__,i=FOe(r,t);return i<0?(++this.size,r.push([t,e])):r[i][1]=e,this}NX.exports=NOe});var EC=w((Mct,TX)=>{var LOe=QX(),TOe=xX(),OOe=DX(),MOe=FX(),KOe=LX();function Rf(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{var UOe=Sl(),HOe=Fs(),GOe=UOe(HOe,"Map");OX.exports=GOe});var UX=w((Uct,MX)=>{var KX=BX(),jOe=EC(),YOe=l0();function qOe(){this.size=0,this.__data__={hash:new KX,map:new(YOe||jOe),string:new KX}}MX.exports=qOe});var GX=w((Hct,HX)=>{function JOe(t){var e=typeof t;return e=="string"||e=="number"||e=="symbol"||e=="boolean"?t!=="__proto__":t===null}HX.exports=JOe});var IC=w((Gct,jX)=>{var WOe=GX();function zOe(t,e){var r=t.__data__;return WOe(e)?r[typeof e=="string"?"string":"hash"]:r.map}jX.exports=zOe});var qX=w((jct,YX)=>{var _Oe=IC();function VOe(t){var e=_Oe(this,t).delete(t);return this.size-=e?1:0,e}YX.exports=VOe});var WX=w((Yct,JX)=>{var XOe=IC();function ZOe(t){return XOe(this,t).get(t)}JX.exports=ZOe});var _X=w((qct,zX)=>{var $Oe=IC();function eMe(t){return $Oe(this,t).has(t)}zX.exports=eMe});var XX=w((Jct,VX)=>{var tMe=IC();function rMe(t,e){var r=tMe(this,t),i=r.size;return r.set(t,e),this.size+=r.size==i?0:1,this}VX.exports=rMe});var c0=w((Wct,ZX)=>{var iMe=UX(),nMe=qX(),sMe=WX(),oMe=_X(),aMe=XX();function Ff(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{var eZ=c0(),AMe="Expected a function";function _R(t,e){if(typeof t!="function"||e!=null&&typeof e!="function")throw new TypeError(AMe);var r=function(){var i=arguments,n=e?e.apply(this,i):i[0],s=r.cache;if(s.has(n))return s.get(n);var o=t.apply(this,i);return r.cache=s.set(n,o)||s,o};return r.cache=new(_R.Cache||eZ),r}_R.Cache=eZ;$X.exports=_R});var iZ=w((_ct,rZ)=>{var lMe=tZ(),cMe=500;function uMe(t){var e=lMe(t,function(i){return r.size===cMe&&r.clear(),i}),r=e.cache;return e}rZ.exports=uMe});var sZ=w((Vct,nZ)=>{var gMe=iZ(),fMe=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,hMe=/\\(\\)?/g,pMe=gMe(function(t){var e=[];return t.charCodeAt(0)===46&&e.push(""),t.replace(fMe,function(r,i,n,s){e.push(n?s.replace(hMe,"$1"):i||r)}),e});nZ.exports=pMe});var Nf=w((Xct,oZ)=>{var dMe=Ms(),CMe=a0(),mMe=sZ(),EMe=of();function IMe(t,e){return dMe(t)?t:CMe(t,e)?[t]:mMe(EMe(t))}oZ.exports=IMe});var cu=w((Zct,aZ)=>{var yMe=yd(),wMe=1/0;function BMe(t){if(typeof t=="string"||yMe(t))return t;var e=t+"";return e=="0"&&1/t==-wMe?"-0":e}aZ.exports=BMe});var yC=w(($ct,AZ)=>{var bMe=Nf(),QMe=cu();function vMe(t,e){e=bMe(e,t);for(var r=0,i=e.length;t!=null&&r{var SMe=Sl(),kMe=function(){try{var t=SMe(Object,"defineProperty");return t({},"",{}),t}catch(e){}}();lZ.exports=kMe});var Lf=w((tut,cZ)=>{var uZ=VR();function xMe(t,e,r){e=="__proto__"&&uZ?uZ(t,e,{configurable:!0,enumerable:!0,value:r,writable:!0}):t[e]=r}cZ.exports=xMe});var u0=w((rut,gZ)=>{var PMe=Lf(),DMe=Df(),RMe=Object.prototype,FMe=RMe.hasOwnProperty;function NMe(t,e,r){var i=t[e];(!(FMe.call(t,e)&&DMe(i,r))||r===void 0&&!(e in t))&&PMe(t,e,r)}gZ.exports=NMe});var wC=w((iut,fZ)=>{var LMe=9007199254740991,TMe=/^(?:0|[1-9]\d*)$/;function OMe(t,e){var r=typeof t;return e=e==null?LMe:e,!!e&&(r=="number"||r!="symbol"&&TMe.test(t))&&t>-1&&t%1==0&&t{var MMe=u0(),KMe=Nf(),UMe=wC(),pZ=Rn(),HMe=cu();function GMe(t,e,r,i){if(!pZ(t))return t;e=KMe(e,t);for(var n=-1,s=e.length,o=s-1,a=t;a!=null&&++n{var jMe=yC(),YMe=XR(),qMe=Nf();function JMe(t,e,r){for(var i=-1,n=e.length,s={};++i{function WMe(t,e){return t!=null&&e in Object(t)}mZ.exports=WMe});var yZ=w((aut,IZ)=>{var zMe=Gc(),_Me=Zo(),VMe="[object Arguments]";function XMe(t){return _Me(t)&&zMe(t)==VMe}IZ.exports=XMe});var BC=w((Aut,wZ)=>{var BZ=yZ(),ZMe=Zo(),bZ=Object.prototype,$Me=bZ.hasOwnProperty,eKe=bZ.propertyIsEnumerable,tKe=BZ(function(){return arguments}())?BZ:function(t){return ZMe(t)&&$Me.call(t,"callee")&&!eKe.call(t,"callee")};wZ.exports=tKe});var g0=w((lut,QZ)=>{var rKe=9007199254740991;function iKe(t){return typeof t=="number"&&t>-1&&t%1==0&&t<=rKe}QZ.exports=iKe});var ZR=w((cut,vZ)=>{var nKe=Nf(),sKe=BC(),oKe=Ms(),aKe=wC(),AKe=g0(),lKe=cu();function cKe(t,e,r){e=nKe(e,t);for(var i=-1,n=e.length,s=!1;++i{var uKe=EZ(),gKe=ZR();function fKe(t,e){return t!=null&&gKe(t,e,uKe)}SZ.exports=fKe});var xZ=w((gut,kZ)=>{var hKe=CZ(),pKe=$R();function dKe(t,e){return hKe(t,e,function(r,i){return pKe(t,i)})}kZ.exports=dKe});var f0=w((fut,PZ)=>{function CKe(t,e){for(var r=-1,i=e.length,n=t.length;++r{var RZ=Hc(),mKe=BC(),EKe=Ms(),FZ=RZ?RZ.isConcatSpreadable:void 0;function IKe(t){return EKe(t)||mKe(t)||!!(FZ&&t&&t[FZ])}DZ.exports=IKe});var OZ=w((put,LZ)=>{var yKe=f0(),wKe=NZ();function TZ(t,e,r,i,n){var s=-1,o=t.length;for(r||(r=wKe),n||(n=[]);++s0&&r(a)?e>1?TZ(a,e-1,r,i,n):yKe(n,a):i||(n[n.length]=a)}return n}LZ.exports=TZ});var KZ=w((dut,MZ)=>{var BKe=OZ();function bKe(t){var e=t==null?0:t.length;return e?BKe(t,1):[]}MZ.exports=bKe});var HZ=w((Cut,UZ)=>{function QKe(t,e,r){switch(r.length){case 0:return t.call(e);case 1:return t.call(e,r[0]);case 2:return t.call(e,r[0],r[1]);case 3:return t.call(e,r[0],r[1],r[2])}return t.apply(e,r)}UZ.exports=QKe});var eF=w((mut,GZ)=>{var vKe=HZ(),jZ=Math.max;function SKe(t,e,r){return e=jZ(e===void 0?t.length-1:e,0),function(){for(var i=arguments,n=-1,s=jZ(i.length-e,0),o=Array(s);++n{function kKe(t){return function(){return t}}YZ.exports=kKe});var h0=w((Iut,JZ)=>{function xKe(t){return t}JZ.exports=xKe});var _Z=w((yut,WZ)=>{var PKe=qZ(),zZ=VR(),DKe=h0(),RKe=zZ?function(t,e){return zZ(t,"toString",{configurable:!0,enumerable:!1,value:PKe(e),writable:!0})}:DKe;WZ.exports=RKe});var XZ=w((wut,VZ)=>{var FKe=800,NKe=16,LKe=Date.now;function TKe(t){var e=0,r=0;return function(){var i=LKe(),n=NKe-(i-r);if(r=i,n>0){if(++e>=FKe)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}VZ.exports=TKe});var tF=w((But,ZZ)=>{var OKe=_Z(),MKe=XZ(),KKe=MKe(OKe);ZZ.exports=KKe});var e$=w((but,$Z)=>{var UKe=KZ(),HKe=eF(),GKe=tF();function jKe(t){return GKe(HKe(t,void 0,UKe),t+"")}$Z.exports=jKe});var r$=w((Qut,t$)=>{var YKe=xZ(),qKe=e$(),JKe=qKe(function(t,e){return t==null?{}:YKe(t,e)});t$.exports=JKe});var p$=w((yft,g$)=>{"use strict";var uF;try{uF=Map}catch(t){}var gF;try{gF=Set}catch(t){}function f$(t,e,r){if(!t||typeof t!="object"||typeof t=="function")return t;if(t.nodeType&&"cloneNode"in t)return t.cloneNode(!0);if(t instanceof Date)return new Date(t.getTime());if(t instanceof RegExp)return new RegExp(t);if(Array.isArray(t))return t.map(h$);if(uF&&t instanceof uF)return new Map(Array.from(t.entries()));if(gF&&t instanceof gF)return new Set(Array.from(t.values()));if(t instanceof Object){e.push(t);var i=Object.create(t);r.push(i);for(var n in t){var s=e.findIndex(function(o){return o===t[n]});i[n]=s>-1?r[s]:f$(t[n],e,r)}return i}return t}function h$(t){return f$(t,[],[])}g$.exports=h$});var SC=w(fF=>{"use strict";Object.defineProperty(fF,"__esModule",{value:!0});fF.default=t1e;var r1e=Object.prototype.toString,i1e=Error.prototype.toString,n1e=RegExp.prototype.toString,s1e=typeof Symbol!="undefined"?Symbol.prototype.toString:()=>"",o1e=/^Symbol\((.*)\)(.*)$/;function a1e(t){return t!=+t?"NaN":t===0&&1/t<0?"-0":""+t}function d$(t,e=!1){if(t==null||t===!0||t===!1)return""+t;let r=typeof t;if(r==="number")return a1e(t);if(r==="string")return e?`"${t}"`:t;if(r==="function")return"[Function "+(t.name||"anonymous")+"]";if(r==="symbol")return s1e.call(t).replace(o1e,"Symbol($1)");let i=r1e.call(t).slice(8,-1);return i==="Date"?isNaN(t.getTime())?""+t:t.toISOString(t):i==="Error"||t instanceof Error?"["+i1e.call(t)+"]":i==="RegExp"?n1e.call(t):null}function t1e(t,e){let r=d$(t,e);return r!==null?r:JSON.stringify(t,function(i,n){let s=d$(this[i],e);return s!==null?s:n},2)}});var hA=w(Bi=>{"use strict";Object.defineProperty(Bi,"__esModule",{value:!0});Bi.default=Bi.array=Bi.object=Bi.boolean=Bi.date=Bi.number=Bi.string=Bi.mixed=void 0;var C$=A1e(SC());function A1e(t){return t&&t.__esModule?t:{default:t}}var m$={default:"${path} is invalid",required:"${path} is a required field",oneOf:"${path} must be one of the following values: ${values}",notOneOf:"${path} must not be one of the following values: ${values}",notType:({path:t,type:e,value:r,originalValue:i})=>{let n=i!=null&&i!==r,s=`${t} must be a \`${e}\` type, but the final value was: \`${(0,C$.default)(r,!0)}\``+(n?` (cast from the value \`${(0,C$.default)(i,!0)}\`).`:".");return r===null&&(s+='\n If "null" is intended as an empty value be sure to mark the schema as `.nullable()`'),s},defined:"${path} must be defined"};Bi.mixed=m$;var E$={length:"${path} must be exactly ${length} characters",min:"${path} must be at least ${min} characters",max:"${path} must be at most ${max} characters",matches:'${path} must match the following: "${regex}"',email:"${path} must be a valid email",url:"${path} must be a valid URL",uuid:"${path} must be a valid UUID",trim:"${path} must be a trimmed string",lowercase:"${path} must be a lowercase string",uppercase:"${path} must be a upper case string"};Bi.string=E$;var I$={min:"${path} must be greater than or equal to ${min}",max:"${path} must be less than or equal to ${max}",lessThan:"${path} must be less than ${less}",moreThan:"${path} must be greater than ${more}",positive:"${path} must be a positive number",negative:"${path} must be a negative number",integer:"${path} must be an integer"};Bi.number=I$;var y$={min:"${path} field must be later than ${min}",max:"${path} field must be at earlier than ${max}"};Bi.date=y$;var w$={isValue:"${path} field must be ${value}"};Bi.boolean=w$;var B$={noUnknown:"${path} field has unspecified keys: ${unknown}"};Bi.object=B$;var b$={min:"${path} field must have at least ${min} items",max:"${path} field must have less than or equal to ${max} items",length:"${path} must be have ${length} items"};Bi.array=b$;var l1e=Object.assign(Object.create(null),{mixed:m$,string:E$,number:I$,date:y$,object:B$,array:b$,boolean:w$});Bi.default=l1e});var v$=w((bft,Q$)=>{var c1e=Object.prototype,u1e=c1e.hasOwnProperty;function g1e(t,e){return t!=null&&u1e.call(t,e)}Q$.exports=g1e});var kC=w((Qft,S$)=>{var f1e=v$(),h1e=ZR();function p1e(t,e){return t!=null&&h1e(t,e,f1e)}S$.exports=p1e});var Of=w(m0=>{"use strict";Object.defineProperty(m0,"__esModule",{value:!0});m0.default=void 0;var d1e=t=>t&&t.__isYupSchema__;m0.default=d1e});var P$=w(E0=>{"use strict";Object.defineProperty(E0,"__esModule",{value:!0});E0.default=void 0;var C1e=k$(kC()),m1e=k$(Of());function k$(t){return t&&t.__esModule?t:{default:t}}var x$=class{constructor(e,r){if(this.refs=e,this.refs=e,typeof r=="function"){this.fn=r;return}if(!(0,C1e.default)(r,"is"))throw new TypeError("`is:` is required for `when()` conditions");if(!r.then&&!r.otherwise)throw new TypeError("either `then:` or `otherwise:` is required for `when()` conditions");let{is:i,then:n,otherwise:s}=r,o=typeof i=="function"?i:(...a)=>a.every(l=>l===i);this.fn=function(...a){let l=a.pop(),c=a.pop(),u=o(...a)?n:s;if(!!u)return typeof u=="function"?u(c):c.concat(u.resolve(l))}}resolve(e,r){let i=this.refs.map(s=>s.getValue(r==null?void 0:r.value,r==null?void 0:r.parent,r==null?void 0:r.context)),n=this.fn.apply(e,i.concat(e,r));if(n===void 0||n===e)return e;if(!(0,m1e.default)(n))throw new TypeError("conditions must return a schema object");return n.resolve(r)}},E1e=x$;E0.default=E1e});var pF=w(hF=>{"use strict";Object.defineProperty(hF,"__esModule",{value:!0});hF.default=I1e;function I1e(t){return t==null?[]:[].concat(t)}});var uu=w(I0=>{"use strict";Object.defineProperty(I0,"__esModule",{value:!0});I0.default=void 0;var y1e=D$(SC()),w1e=D$(pF());function D$(t){return t&&t.__esModule?t:{default:t}}function dF(){return dF=Object.assign||function(t){for(var e=1;e(0,y1e.default)(r[s])):typeof e=="function"?e(r):e}static isError(e){return e&&e.name==="ValidationError"}constructor(e,r,i,n){super();this.name="ValidationError",this.value=r,this.path=i,this.type=n,this.errors=[],this.inner=[],(0,w1e.default)(e).forEach(s=>{xC.isError(s)?(this.errors.push(...s.errors),this.inner=this.inner.concat(s.inner.length?s.inner:s)):this.errors.push(s)}),this.message=this.errors.length>1?`${this.errors.length} errors occurred`:this.errors[0],Error.captureStackTrace&&Error.captureStackTrace(this,xC)}};I0.default=xC});var y0=w(CF=>{"use strict";Object.defineProperty(CF,"__esModule",{value:!0});CF.default=b1e;var mF=Q1e(uu());function Q1e(t){return t&&t.__esModule?t:{default:t}}var v1e=t=>{let e=!1;return(...r)=>{e||(e=!0,t(...r))}};function b1e(t,e){let{endEarly:r,tests:i,args:n,value:s,errors:o,sort:a,path:l}=t,c=v1e(e),u=i.length,g=[];if(o=o||[],!u)return o.length?c(new mF.default(o,s,l)):c(null,s);for(let f=0;f{function S1e(t){return function(e,r,i){for(var n=-1,s=Object(e),o=i(e),a=o.length;a--;){var l=o[t?a:++n];if(r(s[l],l,s)===!1)break}return e}}R$.exports=S1e});var EF=w((Rft,N$)=>{var k1e=F$(),x1e=k1e();N$.exports=x1e});var T$=w((Fft,L$)=>{function P1e(t,e){for(var r=-1,i=Array(t);++r{function D1e(){return!1}O$.exports=D1e});var DC=w((PC,Mf)=>{var R1e=Fs(),F1e=M$(),K$=typeof PC=="object"&&PC&&!PC.nodeType&&PC,U$=K$&&typeof Mf=="object"&&Mf&&!Mf.nodeType&&Mf,N1e=U$&&U$.exports===K$,H$=N1e?R1e.Buffer:void 0,L1e=H$?H$.isBuffer:void 0,T1e=L1e||F1e;Mf.exports=T1e});var j$=w((Lft,G$)=>{var O1e=Gc(),M1e=g0(),K1e=Zo(),U1e="[object Arguments]",H1e="[object Array]",G1e="[object Boolean]",j1e="[object Date]",Y1e="[object Error]",q1e="[object Function]",J1e="[object Map]",W1e="[object Number]",z1e="[object Object]",_1e="[object RegExp]",V1e="[object Set]",X1e="[object String]",Z1e="[object WeakMap]",$1e="[object ArrayBuffer]",eUe="[object DataView]",tUe="[object Float32Array]",rUe="[object Float64Array]",iUe="[object Int8Array]",nUe="[object Int16Array]",sUe="[object Int32Array]",oUe="[object Uint8Array]",aUe="[object Uint8ClampedArray]",AUe="[object Uint16Array]",lUe="[object Uint32Array]",wr={};wr[tUe]=wr[rUe]=wr[iUe]=wr[nUe]=wr[sUe]=wr[oUe]=wr[aUe]=wr[AUe]=wr[lUe]=!0;wr[U1e]=wr[H1e]=wr[$1e]=wr[G1e]=wr[eUe]=wr[j1e]=wr[Y1e]=wr[q1e]=wr[J1e]=wr[W1e]=wr[z1e]=wr[_1e]=wr[V1e]=wr[X1e]=wr[Z1e]=!1;function cUe(t){return K1e(t)&&M1e(t.length)&&!!wr[O1e(t)]}G$.exports=cUe});var w0=w((Tft,Y$)=>{function uUe(t){return function(e){return t(e)}}Y$.exports=uUe});var B0=w((RC,Kf)=>{var gUe=hx(),q$=typeof RC=="object"&&RC&&!RC.nodeType&&RC,FC=q$&&typeof Kf=="object"&&Kf&&!Kf.nodeType&&Kf,fUe=FC&&FC.exports===q$,IF=fUe&&gUe.process,hUe=function(){try{var t=FC&&FC.require&&FC.require("util").types;return t||IF&&IF.binding&&IF.binding("util")}catch(e){}}();Kf.exports=hUe});var b0=w((Oft,J$)=>{var pUe=j$(),dUe=w0(),W$=B0(),z$=W$&&W$.isTypedArray,CUe=z$?dUe(z$):pUe;J$.exports=CUe});var yF=w((Mft,_$)=>{var mUe=T$(),EUe=BC(),IUe=Ms(),yUe=DC(),wUe=wC(),BUe=b0(),bUe=Object.prototype,QUe=bUe.hasOwnProperty;function vUe(t,e){var r=IUe(t),i=!r&&EUe(t),n=!r&&!i&&yUe(t),s=!r&&!i&&!n&&BUe(t),o=r||i||n||s,a=o?mUe(t.length,String):[],l=a.length;for(var c in t)(e||QUe.call(t,c))&&!(o&&(c=="length"||n&&(c=="offset"||c=="parent")||s&&(c=="buffer"||c=="byteLength"||c=="byteOffset")||wUe(c,l)))&&a.push(c);return a}_$.exports=vUe});var Q0=w((Kft,V$)=>{var SUe=Object.prototype;function kUe(t){var e=t&&t.constructor,r=typeof e=="function"&&e.prototype||SUe;return t===r}V$.exports=kUe});var wF=w((Uft,X$)=>{function xUe(t,e){return function(r){return t(e(r))}}X$.exports=xUe});var $$=w((Hft,Z$)=>{var PUe=wF(),DUe=PUe(Object.keys,Object);Z$.exports=DUe});var tee=w((Gft,eee)=>{var RUe=Q0(),FUe=$$(),NUe=Object.prototype,LUe=NUe.hasOwnProperty;function TUe(t){if(!RUe(t))return FUe(t);var e=[];for(var r in Object(t))LUe.call(t,r)&&r!="constructor"&&e.push(r);return e}eee.exports=TUe});var NC=w((jft,ree)=>{var OUe=A0(),MUe=g0();function KUe(t){return t!=null&&MUe(t.length)&&!OUe(t)}ree.exports=KUe});var Uf=w((Yft,iee)=>{var UUe=yF(),HUe=tee(),GUe=NC();function jUe(t){return GUe(t)?UUe(t):HUe(t)}iee.exports=jUe});var BF=w((qft,nee)=>{var YUe=EF(),qUe=Uf();function JUe(t,e){return t&&YUe(t,e,qUe)}nee.exports=JUe});var oee=w((Jft,see)=>{var WUe=EC();function zUe(){this.__data__=new WUe,this.size=0}see.exports=zUe});var Aee=w((Wft,aee)=>{function _Ue(t){var e=this.__data__,r=e.delete(t);return this.size=e.size,r}aee.exports=_Ue});var cee=w((zft,lee)=>{function VUe(t){return this.__data__.get(t)}lee.exports=VUe});var gee=w((_ft,uee)=>{function XUe(t){return this.__data__.has(t)}uee.exports=XUe});var hee=w((Vft,fee)=>{var ZUe=EC(),$Ue=l0(),e2e=c0(),t2e=200;function r2e(t,e){var r=this.__data__;if(r instanceof ZUe){var i=r.__data__;if(!$Ue||i.length{var i2e=EC(),n2e=oee(),s2e=Aee(),o2e=cee(),a2e=gee(),A2e=hee();function Hf(t){var e=this.__data__=new i2e(t);this.size=e.size}Hf.prototype.clear=n2e;Hf.prototype.delete=s2e;Hf.prototype.get=o2e;Hf.prototype.has=a2e;Hf.prototype.set=A2e;pee.exports=Hf});var Cee=w((Zft,dee)=>{var l2e="__lodash_hash_undefined__";function c2e(t){return this.__data__.set(t,l2e),this}dee.exports=c2e});var Eee=w(($ft,mee)=>{function u2e(t){return this.__data__.has(t)}mee.exports=u2e});var yee=w((eht,Iee)=>{var g2e=c0(),f2e=Cee(),h2e=Eee();function v0(t){var e=-1,r=t==null?0:t.length;for(this.__data__=new g2e;++e{function p2e(t,e){for(var r=-1,i=t==null?0:t.length;++r{function d2e(t,e){return t.has(e)}bee.exports=d2e});var bF=w((iht,vee)=>{var C2e=yee(),m2e=Bee(),E2e=Qee(),I2e=1,y2e=2;function w2e(t,e,r,i,n,s){var o=r&I2e,a=t.length,l=e.length;if(a!=l&&!(o&&l>a))return!1;var c=s.get(t),u=s.get(e);if(c&&u)return c==e&&u==t;var g=-1,f=!0,h=r&y2e?new C2e:void 0;for(s.set(t,e),s.set(e,t);++g{var B2e=Fs(),b2e=B2e.Uint8Array;See.exports=b2e});var xee=w((sht,kee)=>{function Q2e(t){var e=-1,r=Array(t.size);return t.forEach(function(i,n){r[++e]=[n,i]}),r}kee.exports=Q2e});var Dee=w((oht,Pee)=>{function v2e(t){var e=-1,r=Array(t.size);return t.forEach(function(i){r[++e]=i}),r}Pee.exports=v2e});var Tee=w((aht,Ree)=>{var Fee=Hc(),Nee=QF(),S2e=Df(),k2e=bF(),x2e=xee(),P2e=Dee(),D2e=1,R2e=2,F2e="[object Boolean]",N2e="[object Date]",L2e="[object Error]",T2e="[object Map]",O2e="[object Number]",M2e="[object RegExp]",K2e="[object Set]",U2e="[object String]",H2e="[object Symbol]",G2e="[object ArrayBuffer]",j2e="[object DataView]",Lee=Fee?Fee.prototype:void 0,vF=Lee?Lee.valueOf:void 0;function Y2e(t,e,r,i,n,s,o){switch(r){case j2e:if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case G2e:return!(t.byteLength!=e.byteLength||!s(new Nee(t),new Nee(e)));case F2e:case N2e:case O2e:return S2e(+t,+e);case L2e:return t.name==e.name&&t.message==e.message;case M2e:case U2e:return t==e+"";case T2e:var a=x2e;case K2e:var l=i&D2e;if(a||(a=P2e),t.size!=e.size&&!l)return!1;var c=o.get(t);if(c)return c==e;i|=R2e,o.set(t,e);var u=k2e(a(t),a(e),i,n,s,o);return o.delete(t),u;case H2e:if(vF)return vF.call(t)==vF.call(e)}return!1}Ree.exports=Y2e});var SF=w((Aht,Oee)=>{var q2e=f0(),J2e=Ms();function W2e(t,e,r){var i=e(t);return J2e(t)?i:q2e(i,r(t))}Oee.exports=W2e});var Kee=w((lht,Mee)=>{function z2e(t,e){for(var r=-1,i=t==null?0:t.length,n=0,s=[];++r{function _2e(){return[]}Uee.exports=_2e});var S0=w((uht,Hee)=>{var V2e=Kee(),X2e=kF(),Z2e=Object.prototype,$2e=Z2e.propertyIsEnumerable,Gee=Object.getOwnPropertySymbols,eHe=Gee?function(t){return t==null?[]:(t=Object(t),V2e(Gee(t),function(e){return $2e.call(t,e)}))}:X2e;Hee.exports=eHe});var xF=w((ght,jee)=>{var tHe=SF(),rHe=S0(),iHe=Uf();function nHe(t){return tHe(t,iHe,rHe)}jee.exports=nHe});var Jee=w((fht,Yee)=>{var qee=xF(),sHe=1,oHe=Object.prototype,aHe=oHe.hasOwnProperty;function AHe(t,e,r,i,n,s){var o=r&sHe,a=qee(t),l=a.length,c=qee(e),u=c.length;if(l!=u&&!o)return!1;for(var g=l;g--;){var f=a[g];if(!(o?f in e:aHe.call(e,f)))return!1}var h=s.get(t),p=s.get(e);if(h&&p)return h==e&&p==t;var m=!0;s.set(t,e),s.set(e,t);for(var y=o;++g{var lHe=Sl(),cHe=Fs(),uHe=lHe(cHe,"DataView");Wee.exports=uHe});var Vee=w((pht,_ee)=>{var gHe=Sl(),fHe=Fs(),hHe=gHe(fHe,"Promise");_ee.exports=hHe});var Zee=w((dht,Xee)=>{var pHe=Sl(),dHe=Fs(),CHe=pHe(dHe,"Set");Xee.exports=CHe});var ete=w((Cht,$ee)=>{var mHe=Sl(),EHe=Fs(),IHe=mHe(EHe,"WeakMap");$ee.exports=IHe});var TC=w((mht,tte)=>{var PF=zee(),DF=l0(),RF=Vee(),FF=Zee(),NF=ete(),rte=Gc(),Gf=zR(),ite="[object Map]",yHe="[object Object]",nte="[object Promise]",ste="[object Set]",ote="[object WeakMap]",ate="[object DataView]",wHe=Gf(PF),BHe=Gf(DF),bHe=Gf(RF),QHe=Gf(FF),vHe=Gf(NF),gu=rte;(PF&&gu(new PF(new ArrayBuffer(1)))!=ate||DF&&gu(new DF)!=ite||RF&&gu(RF.resolve())!=nte||FF&&gu(new FF)!=ste||NF&&gu(new NF)!=ote)&&(gu=function(t){var e=rte(t),r=e==yHe?t.constructor:void 0,i=r?Gf(r):"";if(i)switch(i){case wHe:return ate;case BHe:return ite;case bHe:return nte;case QHe:return ste;case vHe:return ote}return e});tte.exports=gu});var pte=w((Eht,Ate)=>{var LF=LC(),SHe=bF(),kHe=Tee(),xHe=Jee(),lte=TC(),cte=Ms(),ute=DC(),PHe=b0(),DHe=1,gte="[object Arguments]",fte="[object Array]",k0="[object Object]",RHe=Object.prototype,hte=RHe.hasOwnProperty;function FHe(t,e,r,i,n,s){var o=cte(t),a=cte(e),l=o?fte:lte(t),c=a?fte:lte(e);l=l==gte?k0:l,c=c==gte?k0:c;var u=l==k0,g=c==k0,f=l==c;if(f&&ute(t)){if(!ute(e))return!1;o=!0,u=!1}if(f&&!u)return s||(s=new LF),o||PHe(t)?SHe(t,e,r,i,n,s):kHe(t,e,l,r,i,n,s);if(!(r&DHe)){var h=u&&hte.call(t,"__wrapped__"),p=g&&hte.call(e,"__wrapped__");if(h||p){var m=h?t.value():t,y=p?e.value():e;return s||(s=new LF),n(m,y,r,i,s)}}return f?(s||(s=new LF),xHe(t,e,r,i,n,s)):!1}Ate.exports=FHe});var TF=w((Iht,dte)=>{var NHe=pte(),Cte=Zo();function mte(t,e,r,i,n){return t===e?!0:t==null||e==null||!Cte(t)&&!Cte(e)?t!==t&&e!==e:NHe(t,e,r,i,mte,n)}dte.exports=mte});var Ite=w((yht,Ete)=>{var LHe=LC(),THe=TF(),OHe=1,MHe=2;function KHe(t,e,r,i){var n=r.length,s=n,o=!i;if(t==null)return!s;for(t=Object(t);n--;){var a=r[n];if(o&&a[2]?a[1]!==t[a[0]]:!(a[0]in t))return!1}for(;++n{var UHe=Rn();function HHe(t){return t===t&&!UHe(t)}yte.exports=HHe});var Bte=w((Bht,wte)=>{var GHe=OF(),jHe=Uf();function YHe(t){for(var e=jHe(t),r=e.length;r--;){var i=e[r],n=t[i];e[r]=[i,n,GHe(n)]}return e}wte.exports=YHe});var MF=w((bht,bte)=>{function qHe(t,e){return function(r){return r==null?!1:r[t]===e&&(e!==void 0||t in Object(r))}}bte.exports=qHe});var vte=w((Qht,Qte)=>{var JHe=Ite(),WHe=Bte(),zHe=MF();function _He(t){var e=WHe(t);return e.length==1&&e[0][2]?zHe(e[0][0],e[0][1]):function(r){return r===t||JHe(r,t,e)}}Qte.exports=_He});var x0=w((vht,Ste)=>{var VHe=yC();function XHe(t,e,r){var i=t==null?void 0:VHe(t,e);return i===void 0?r:i}Ste.exports=XHe});var xte=w((Sht,kte)=>{var ZHe=TF(),$He=x0(),eGe=$R(),tGe=a0(),rGe=OF(),iGe=MF(),nGe=cu(),sGe=1,oGe=2;function aGe(t,e){return tGe(t)&&rGe(e)?iGe(nGe(t),e):function(r){var i=$He(r,t);return i===void 0&&i===e?eGe(r,t):ZHe(e,i,sGe|oGe)}}kte.exports=aGe});var Dte=w((kht,Pte)=>{function AGe(t){return function(e){return e==null?void 0:e[t]}}Pte.exports=AGe});var Fte=w((xht,Rte)=>{var lGe=yC();function cGe(t){return function(e){return lGe(e,t)}}Rte.exports=cGe});var Lte=w((Pht,Nte)=>{var uGe=Dte(),gGe=Fte(),fGe=a0(),hGe=cu();function pGe(t){return fGe(t)?uGe(hGe(t)):gGe(t)}Nte.exports=pGe});var KF=w((Dht,Tte)=>{var dGe=vte(),CGe=xte(),mGe=h0(),EGe=Ms(),IGe=Lte();function yGe(t){return typeof t=="function"?t:t==null?mGe:typeof t=="object"?EGe(t)?CGe(t[0],t[1]):dGe(t):IGe(t)}Tte.exports=yGe});var UF=w((Rht,Ote)=>{var wGe=Lf(),BGe=BF(),bGe=KF();function QGe(t,e){var r={};return e=bGe(e,3),BGe(t,function(i,n,s){wGe(r,n,e(i,n,s))}),r}Ote.exports=QGe});var OC=w((Fht,Mte)=>{"use strict";function fu(t){this._maxSize=t,this.clear()}fu.prototype.clear=function(){this._size=0,this._values=Object.create(null)};fu.prototype.get=function(t){return this._values[t]};fu.prototype.set=function(t,e){return this._size>=this._maxSize&&this.clear(),t in this._values||this._size++,this._values[t]=e};var vGe=/[^.^\]^[]+|(?=\[\]|\.\.)/g,Kte=/^\d+$/,SGe=/^\d/,kGe=/[~`!#$%\^&*+=\-\[\]\\';,/{}|\\":<>\?]/g,xGe=/^\s*(['"]?)(.*?)(\1)\s*$/,HF=512,Ute=new fu(HF),Hte=new fu(HF),Gte=new fu(HF);Mte.exports={Cache:fu,split:jF,normalizePath:GF,setter:function(t){var e=GF(t);return Hte.get(t)||Hte.set(t,function(i,n){for(var s=0,o=e.length,a=i;s{"use strict";Object.defineProperty(MC,"__esModule",{value:!0});MC.create=NGe;MC.default=void 0;var LGe=OC(),P0={context:"$",value:"."};function NGe(t,e){return new D0(t,e)}var D0=class{constructor(e,r={}){if(typeof e!="string")throw new TypeError("ref must be a string, got: "+e);if(this.key=e.trim(),e==="")throw new TypeError("ref must be a non-empty string");this.isContext=this.key[0]===P0.context,this.isValue=this.key[0]===P0.value,this.isSibling=!this.isContext&&!this.isValue;let i=this.isContext?P0.context:this.isValue?P0.value:"";this.path=this.key.slice(i.length),this.getter=this.path&&(0,LGe.getter)(this.path,!0),this.map=r.map}getValue(e,r,i){let n=this.isContext?i:this.isValue?e:r;return this.getter&&(n=this.getter(n||{})),this.map&&(n=this.map(n)),n}cast(e,r){return this.getValue(e,r==null?void 0:r.parent,r==null?void 0:r.context)}resolve(){return this}describe(){return{type:"ref",key:this.key}}toString(){return`Ref(${this.key})`}static isRef(e){return e&&e.__isYupRef}};MC.default=D0;D0.prototype.__isYupRef=!0});var jte=w(qF=>{"use strict";Object.defineProperty(qF,"__esModule",{value:!0});qF.default=TGe;var OGe=JF(UF()),R0=JF(uu()),MGe=JF(hu());function JF(t){return t&&t.__esModule?t:{default:t}}function F0(){return F0=Object.assign||function(t){for(var e=1;e=0)&&(r[n]=t[n]);return r}function TGe(t){function e(r,i){let{value:n,path:s="",label:o,options:a,originalValue:l,sync:c}=r,u=KGe(r,["value","path","label","options","originalValue","sync"]),{name:g,test:f,params:h,message:p}=t,{parent:m,context:y}=a;function b(j){return MGe.default.isRef(j)?j.getValue(n,m,y):j}function S(j={}){let Z=(0,OGe.default)(F0({value:n,originalValue:l,label:o,path:j.path||s},h,j.params),b),J=new R0.default(R0.default.formatError(j.message||p,Z),n,Z.path,j.type||g);return J.params=Z,J}let k=F0({path:s,parent:m,type:g,createError:S,resolve:b,options:a,originalValue:l},u);if(!c){try{Promise.resolve(f.call(k,n,k)).then(j=>{R0.default.isError(j)?i(j):j?i(null,j):i(S())})}catch(j){i(j)}return}let T;try{var Y;if(T=f.call(k,n,k),typeof((Y=T)==null?void 0:Y.then)=="function")throw new Error(`Validation test of type: "${k.type}" returned a Promise during a synchronous validate. This test will finish after the validate call has returned`)}catch(j){i(j);return}R0.default.isError(T)?i(T):T?i(null,T):i(S())}return e.OPTIONS=t,e}});var WF=w(KC=>{"use strict";Object.defineProperty(KC,"__esModule",{value:!0});KC.getIn=Yte;KC.default=void 0;var UGe=OC(),HGe=t=>t.substr(0,t.length-1).substr(1);function Yte(t,e,r,i=r){let n,s,o;return e?((0,UGe.forEach)(e,(a,l,c)=>{let u=l?HGe(a):a;if(t=t.resolve({context:i,parent:n,value:r}),t.innerType){let g=c?parseInt(u,10):0;if(r&&g>=r.length)throw new Error(`Yup.reach cannot resolve an array item at index: ${a}, in the path: ${e}. because there is no value at that index. `);n=r,r=r&&r[g],t=t.innerType}if(!c){if(!t.fields||!t.fields[u])throw new Error(`The schema does not contain the path: ${e}. (failed at: ${o} which is a type: "${t._type}")`);n=r,r=r&&r[u],t=t.fields[u]}s=u,o=l?"["+a+"]":"."+a}),{schema:t,parent:n,parentPath:s}):{parent:n,parentPath:e,schema:t}}var GGe=(t,e,r,i)=>Yte(t,e,r,i).schema,jGe=GGe;KC.default=jGe});var Jte=w(N0=>{"use strict";Object.defineProperty(N0,"__esModule",{value:!0});N0.default=void 0;var qte=YGe(hu());function YGe(t){return t&&t.__esModule?t:{default:t}}var L0=class{constructor(){this.list=new Set,this.refs=new Map}get size(){return this.list.size+this.refs.size}describe(){let e=[];for(let r of this.list)e.push(r);for(let[,r]of this.refs)e.push(r.describe());return e}toArray(){return Array.from(this.list).concat(Array.from(this.refs.values()))}add(e){qte.default.isRef(e)?this.refs.set(e.key,e):this.list.add(e)}delete(e){qte.default.isRef(e)?this.refs.delete(e.key):this.list.delete(e)}has(e,r){if(this.list.has(e))return!0;let i,n=this.refs.values();for(;i=n.next(),!i.done;)if(r(i.value)===e)return!0;return!1}clone(){let e=new L0;return e.list=new Set(this.list),e.refs=new Map(this.refs),e}merge(e,r){let i=this.clone();return e.list.forEach(n=>i.add(n)),e.refs.forEach(n=>i.add(n)),r.list.forEach(n=>i.delete(n)),r.refs.forEach(n=>i.delete(n)),i}};N0.default=L0});var dA=w(T0=>{"use strict";Object.defineProperty(T0,"__esModule",{value:!0});T0.default=void 0;var Wte=pA(p$()),jf=hA(),qGe=pA(P$()),zte=pA(y0()),O0=pA(jte()),_te=pA(SC()),JGe=pA(hu()),WGe=WF(),zGe=pA(pF()),Vte=pA(uu()),Xte=pA(Jte());function pA(t){return t&&t.__esModule?t:{default:t}}function qs(){return qs=Object.assign||function(t){for(var e=1;e{this.typeError(jf.mixed.notType)}),this.type=(e==null?void 0:e.type)||"mixed",this.spec=qs({strip:!1,strict:!1,abortEarly:!0,recursive:!0,nullable:!1,presence:"optional"},e==null?void 0:e.spec)}get _type(){return this.type}_typeCheck(e){return!0}clone(e){if(this._mutate)return e&&Object.assign(this.spec,e),this;let r=Object.create(Object.getPrototypeOf(this));return r.type=this.type,r._typeError=this._typeError,r._whitelistError=this._whitelistError,r._blacklistError=this._blacklistError,r._whitelist=this._whitelist.clone(),r._blacklist=this._blacklist.clone(),r.exclusiveTests=qs({},this.exclusiveTests),r.deps=[...this.deps],r.conditions=[...this.conditions],r.tests=[...this.tests],r.transforms=[...this.transforms],r.spec=(0,Wte.default)(qs({},this.spec,e)),r}label(e){var r=this.clone();return r.spec.label=e,r}meta(...e){if(e.length===0)return this.spec.meta;let r=this.clone();return r.spec.meta=Object.assign(r.spec.meta||{},e[0]),r}withMutation(e){let r=this._mutate;this._mutate=!0;let i=e(this);return this._mutate=r,i}concat(e){if(!e||e===this)return this;if(e.type!==this.type&&this.type!=="mixed")throw new TypeError(`You cannot \`concat()\` schema's of different types: ${this.type} and ${e.type}`);let r=this,i=e.clone(),n=qs({},r.spec,i.spec);return i.spec=n,i._typeError||(i._typeError=r._typeError),i._whitelistError||(i._whitelistError=r._whitelistError),i._blacklistError||(i._blacklistError=r._blacklistError),i._whitelist=r._whitelist.merge(e._whitelist,e._blacklist),i._blacklist=r._blacklist.merge(e._blacklist,e._whitelist),i.tests=r.tests,i.exclusiveTests=r.exclusiveTests,i.withMutation(s=>{e.tests.forEach(o=>{s.test(o.OPTIONS)})}),i}isType(e){return this.spec.nullable&&e===null?!0:this._typeCheck(e)}resolve(e){let r=this;if(r.conditions.length){let i=r.conditions;r=r.clone(),r.conditions=[],r=i.reduce((n,s)=>s.resolve(n,e),r),r=r.resolve(e)}return r}cast(e,r={}){let i=this.resolve(qs({value:e},r)),n=i._cast(e,r);if(e!==void 0&&r.assert!==!1&&i.isType(n)!==!0){let s=(0,_te.default)(e),o=(0,_te.default)(n);throw new TypeError(`The value of ${r.path||"field"} could not be cast to a value that satisfies the schema type: "${i._type}". - -attempted value: ${s} -`+(o!==s?`result of cast: ${o}`:""))}return n}_cast(e,r){let i=e===void 0?e:this.transforms.reduce((n,s)=>s.call(this,n,e,this),e);return i===void 0&&(i=this.getDefault()),i}_validate(e,r={},i){let{sync:n,path:s,from:o=[],originalValue:a=e,strict:l=this.spec.strict,abortEarly:c=this.spec.abortEarly}=r,u=e;l||(u=this._cast(u,qs({assert:!1},r)));let g={value:u,path:s,options:r,originalValue:a,schema:this,label:this.spec.label,sync:n,from:o},f=[];this._typeError&&f.push(this._typeError),this._whitelistError&&f.push(this._whitelistError),this._blacklistError&&f.push(this._blacklistError),(0,zte.default)({args:g,value:u,path:s,sync:n,tests:f,endEarly:c},h=>{if(h)return void i(h,u);(0,zte.default)({tests:this.tests,args:g,path:s,sync:n,value:u,endEarly:c},i)})}validate(e,r,i){let n=this.resolve(qs({},r,{value:e}));return typeof i=="function"?n._validate(e,r,i):new Promise((s,o)=>n._validate(e,r,(a,l)=>{a?o(a):s(l)}))}validateSync(e,r){let i=this.resolve(qs({},r,{value:e})),n;return i._validate(e,qs({},r,{sync:!0}),(s,o)=>{if(s)throw s;n=o}),n}isValid(e,r){return this.validate(e,r).then(()=>!0,i=>{if(Vte.default.isError(i))return!1;throw i})}isValidSync(e,r){try{return this.validateSync(e,r),!0}catch(i){if(Vte.default.isError(i))return!1;throw i}}_getDefault(){let e=this.spec.default;return e==null?e:typeof e=="function"?e.call(this):(0,Wte.default)(e)}getDefault(e){return this.resolve(e||{})._getDefault()}default(e){return arguments.length===0?this._getDefault():this.clone({default:e})}strict(e=!0){var r=this.clone();return r.spec.strict=e,r}_isPresent(e){return e!=null}defined(e=jf.mixed.defined){return this.test({message:e,name:"defined",exclusive:!0,test(r){return r!==void 0}})}required(e=jf.mixed.required){return this.clone({presence:"required"}).withMutation(r=>r.test({message:e,name:"required",exclusive:!0,test(i){return this.schema._isPresent(i)}}))}notRequired(){var e=this.clone({presence:"optional"});return e.tests=e.tests.filter(r=>r.OPTIONS.name!=="required"),e}nullable(e=!0){var r=this.clone({nullable:e!==!1});return r}transform(e){var r=this.clone();return r.transforms.push(e),r}test(...e){let r;if(e.length===1?typeof e[0]=="function"?r={test:e[0]}:r=e[0]:e.length===2?r={name:e[0],test:e[1]}:r={name:e[0],message:e[1],test:e[2]},r.message===void 0&&(r.message=jf.mixed.default),typeof r.test!="function")throw new TypeError("`test` is a required parameters");let i=this.clone(),n=(0,O0.default)(r),s=r.exclusive||r.name&&i.exclusiveTests[r.name]===!0;if(r.exclusive&&!r.name)throw new TypeError("Exclusive tests must provide a unique `name` identifying the test");return r.name&&(i.exclusiveTests[r.name]=!!r.exclusive),i.tests=i.tests.filter(o=>!(o.OPTIONS.name===r.name&&(s||o.OPTIONS.test===n.OPTIONS.test))),i.tests.push(n),i}when(e,r){!Array.isArray(e)&&typeof e!="string"&&(r=e,e=".");let i=this.clone(),n=(0,zGe.default)(e).map(s=>new JGe.default(s));return n.forEach(s=>{s.isSibling&&i.deps.push(s.key)}),i.conditions.push(new qGe.default(n,r)),i}typeError(e){var r=this.clone();return r._typeError=(0,O0.default)({message:e,name:"typeError",test(i){return i!==void 0&&!this.schema.isType(i)?this.createError({params:{type:this.schema._type}}):!0}}),r}oneOf(e,r=jf.mixed.oneOf){var i=this.clone();return e.forEach(n=>{i._whitelist.add(n),i._blacklist.delete(n)}),i._whitelistError=(0,O0.default)({message:r,name:"oneOf",test(n){if(n===void 0)return!0;let s=this.schema._whitelist;return s.has(n,this.resolve)?!0:this.createError({params:{values:s.toArray().join(", ")}})}}),i}notOneOf(e,r=jf.mixed.notOneOf){var i=this.clone();return e.forEach(n=>{i._blacklist.add(n),i._whitelist.delete(n)}),i._blacklistError=(0,O0.default)({message:r,name:"notOneOf",test(n){let s=this.schema._blacklist;return s.has(n,this.resolve)?this.createError({params:{values:s.toArray().join(", ")}}):!0}}),i}strip(e=!0){let r=this.clone();return r.spec.strip=e,r}describe(){let e=this.clone(),{label:r,meta:i}=e.spec;return{meta:i,label:r,type:e.type,oneOf:e._whitelist.describe(),notOneOf:e._blacklist.describe(),tests:e.tests.map(s=>({name:s.OPTIONS.name,params:s.OPTIONS.params})).filter((s,o,a)=>a.findIndex(l=>l.name===s.name)===o)}}};T0.default=Aa;Aa.prototype.__isYupSchema__=!0;for(let t of["validate","validateSync"])Aa.prototype[`${t}At`]=function(e,r,i={}){let{parent:n,parentPath:s,schema:o}=(0,WGe.getIn)(this,e,r,i.context);return o[t](n&&n[s],qs({},i,{parent:n,path:e}))};for(let t of["equals","is"])Aa.prototype[t]=Aa.prototype.oneOf;for(let t of["not","nope"])Aa.prototype[t]=Aa.prototype.notOneOf;Aa.prototype.optional=Aa.prototype.notRequired});var $te=w(UC=>{"use strict";Object.defineProperty(UC,"__esModule",{value:!0});UC.create=Zte;UC.default=void 0;var VGe=_Ge(dA());function _Ge(t){return t&&t.__esModule?t:{default:t}}var zF=VGe.default,XGe=zF;UC.default=XGe;function Zte(){return new zF}Zte.prototype=zF.prototype});var Yf=w(M0=>{"use strict";Object.defineProperty(M0,"__esModule",{value:!0});M0.default=void 0;var ZGe=t=>t==null;M0.default=ZGe});var nre=w(HC=>{"use strict";Object.defineProperty(HC,"__esModule",{value:!0});HC.create=ere;HC.default=void 0;var $Ge=tre(dA()),rre=hA(),ire=tre(Yf());function tre(t){return t&&t.__esModule?t:{default:t}}function ere(){return new K0}var K0=class extends $Ge.default{constructor(){super({type:"boolean"});this.withMutation(()=>{this.transform(function(e){if(!this.isType(e)){if(/^(true|1)$/i.test(String(e)))return!0;if(/^(false|0)$/i.test(String(e)))return!1}return e})})}_typeCheck(e){return e instanceof Boolean&&(e=e.valueOf()),typeof e=="boolean"}isTrue(e=rre.boolean.isValue){return this.test({message:e,name:"is-value",exclusive:!0,params:{value:"true"},test(r){return(0,ire.default)(r)||r===!0}})}isFalse(e=rre.boolean.isValue){return this.test({message:e,name:"is-value",exclusive:!0,params:{value:"false"},test(r){return(0,ire.default)(r)||r===!1}})}};HC.default=K0;ere.prototype=K0.prototype});var are=w(GC=>{"use strict";Object.defineProperty(GC,"__esModule",{value:!0});GC.create=sre;GC.default=void 0;var la=hA(),CA=ore(Yf()),eje=ore(dA());function ore(t){return t&&t.__esModule?t:{default:t}}var tje=/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i,rje=/^((https?|ftp):)?\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i,ije=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,nje=t=>(0,CA.default)(t)||t===t.trim(),sje={}.toString();function sre(){return new U0}var U0=class extends eje.default{constructor(){super({type:"string"});this.withMutation(()=>{this.transform(function(e){if(this.isType(e)||Array.isArray(e))return e;let r=e!=null&&e.toString?e.toString():e;return r===sje?e:r})})}_typeCheck(e){return e instanceof String&&(e=e.valueOf()),typeof e=="string"}_isPresent(e){return super._isPresent(e)&&!!e.length}length(e,r=la.string.length){return this.test({message:r,name:"length",exclusive:!0,params:{length:e},test(i){return(0,CA.default)(i)||i.length===this.resolve(e)}})}min(e,r=la.string.min){return this.test({message:r,name:"min",exclusive:!0,params:{min:e},test(i){return(0,CA.default)(i)||i.length>=this.resolve(e)}})}max(e,r=la.string.max){return this.test({name:"max",exclusive:!0,message:r,params:{max:e},test(i){return(0,CA.default)(i)||i.length<=this.resolve(e)}})}matches(e,r){let i=!1,n,s;return r&&(typeof r=="object"?{excludeEmptyString:i=!1,message:n,name:s}=r:n=r),this.test({name:s||"matches",message:n||la.string.matches,params:{regex:e},test:o=>(0,CA.default)(o)||o===""&&i||o.search(e)!==-1})}email(e=la.string.email){return this.matches(tje,{name:"email",message:e,excludeEmptyString:!0})}url(e=la.string.url){return this.matches(rje,{name:"url",message:e,excludeEmptyString:!0})}uuid(e=la.string.uuid){return this.matches(ije,{name:"uuid",message:e,excludeEmptyString:!1})}ensure(){return this.default("").transform(e=>e===null?"":e)}trim(e=la.string.trim){return this.transform(r=>r!=null?r.trim():r).test({message:e,name:"trim",test:nje})}lowercase(e=la.string.lowercase){return this.transform(r=>(0,CA.default)(r)?r:r.toLowerCase()).test({message:e,name:"string_case",exclusive:!0,test:r=>(0,CA.default)(r)||r===r.toLowerCase()})}uppercase(e=la.string.uppercase){return this.transform(r=>(0,CA.default)(r)?r:r.toUpperCase()).test({message:e,name:"string_case",exclusive:!0,test:r=>(0,CA.default)(r)||r===r.toUpperCase()})}};GC.default=U0;sre.prototype=U0.prototype});var cre=w(jC=>{"use strict";Object.defineProperty(jC,"__esModule",{value:!0});jC.create=Are;jC.default=void 0;var pu=hA(),du=lre(Yf()),oje=lre(dA());function lre(t){return t&&t.__esModule?t:{default:t}}var aje=t=>t!=+t;function Are(){return new H0}var H0=class extends oje.default{constructor(){super({type:"number"});this.withMutation(()=>{this.transform(function(e){let r=e;if(typeof r=="string"){if(r=r.replace(/\s/g,""),r==="")return NaN;r=+r}return this.isType(r)?r:parseFloat(r)})})}_typeCheck(e){return e instanceof Number&&(e=e.valueOf()),typeof e=="number"&&!aje(e)}min(e,r=pu.number.min){return this.test({message:r,name:"min",exclusive:!0,params:{min:e},test(i){return(0,du.default)(i)||i>=this.resolve(e)}})}max(e,r=pu.number.max){return this.test({message:r,name:"max",exclusive:!0,params:{max:e},test(i){return(0,du.default)(i)||i<=this.resolve(e)}})}lessThan(e,r=pu.number.lessThan){return this.test({message:r,name:"max",exclusive:!0,params:{less:e},test(i){return(0,du.default)(i)||ithis.resolve(e)}})}positive(e=pu.number.positive){return this.moreThan(0,e)}negative(e=pu.number.negative){return this.lessThan(0,e)}integer(e=pu.number.integer){return this.test({name:"integer",message:e,test:r=>(0,du.default)(r)||Number.isInteger(r)})}truncate(){return this.transform(e=>(0,du.default)(e)?e:e|0)}round(e){var r,i=["ceil","floor","round","trunc"];if(e=((r=e)==null?void 0:r.toLowerCase())||"round",e==="trunc")return this.truncate();if(i.indexOf(e.toLowerCase())===-1)throw new TypeError("Only valid options for round() are: "+i.join(", "));return this.transform(n=>(0,du.default)(n)?n:Math[e](n))}};jC.default=H0;Are.prototype=H0.prototype});var ure=w(_F=>{"use strict";Object.defineProperty(_F,"__esModule",{value:!0});_F.default=Aje;var lje=/^(\d{4}|[+\-]\d{6})(?:-?(\d{2})(?:-?(\d{2}))?)?(?:[ T]?(\d{2}):?(\d{2})(?::?(\d{2})(?:[,\.](\d{1,}))?)?(?:(Z)|([+\-])(\d{2})(?::?(\d{2}))?)?)?$/;function Aje(t){var e=[1,4,5,6,7,10,11],r=0,i,n;if(n=lje.exec(t)){for(var s=0,o;o=e[s];++s)n[o]=+n[o]||0;n[2]=(+n[2]||1)-1,n[3]=+n[3]||1,n[7]=n[7]?String(n[7]).substr(0,3):0,(n[8]===void 0||n[8]==="")&&(n[9]===void 0||n[9]==="")?i=+new Date(n[1],n[2],n[3],n[4],n[5],n[6],n[7]):(n[8]!=="Z"&&n[9]!==void 0&&(r=n[10]*60+n[11],n[9]==="+"&&(r=0-r)),i=Date.UTC(n[1],n[2],n[3],n[4],n[5]+r,n[6],n[7]))}else i=Date.parse?Date.parse(t):NaN;return i}});var hre=w(YC=>{"use strict";Object.defineProperty(YC,"__esModule",{value:!0});YC.create=VF;YC.default=void 0;var cje=G0(ure()),gre=hA(),fre=G0(Yf()),uje=G0(hu()),gje=G0(dA());function G0(t){return t&&t.__esModule?t:{default:t}}var XF=new Date(""),fje=t=>Object.prototype.toString.call(t)==="[object Date]";function VF(){return new qC}var qC=class extends gje.default{constructor(){super({type:"date"});this.withMutation(()=>{this.transform(function(e){return this.isType(e)?e:(e=(0,cje.default)(e),isNaN(e)?XF:new Date(e))})})}_typeCheck(e){return fje(e)&&!isNaN(e.getTime())}prepareParam(e,r){let i;if(uje.default.isRef(e))i=e;else{let n=this.cast(e);if(!this._typeCheck(n))throw new TypeError(`\`${r}\` must be a Date or a value that can be \`cast()\` to a Date`);i=n}return i}min(e,r=gre.date.min){let i=this.prepareParam(e,"min");return this.test({message:r,name:"min",exclusive:!0,params:{min:e},test(n){return(0,fre.default)(n)||n>=this.resolve(i)}})}max(e,r=gre.date.max){var i=this.prepareParam(e,"max");return this.test({message:r,name:"max",exclusive:!0,params:{max:e},test(n){return(0,fre.default)(n)||n<=this.resolve(i)}})}};YC.default=qC;qC.INVALID_DATE=XF;VF.prototype=qC.prototype;VF.INVALID_DATE=XF});var dre=w((Jht,pre)=>{function hje(t,e,r,i){var n=-1,s=t==null?0:t.length;for(i&&s&&(r=t[++n]);++n{function pje(t){return function(e){return t==null?void 0:t[e]}}Cre.exports=pje});var Ire=w((zht,Ere)=>{var dje=mre(),Cje={\u00C0:"A",\u00C1:"A",\u00C2:"A",\u00C3:"A",\u00C4:"A",\u00C5:"A",\u00E0:"a",\u00E1:"a",\u00E2:"a",\u00E3:"a",\u00E4:"a",\u00E5:"a",\u00C7:"C",\u00E7:"c",\u00D0:"D",\u00F0:"d",\u00C8:"E",\u00C9:"E",\u00CA:"E",\u00CB:"E",\u00E8:"e",\u00E9:"e",\u00EA:"e",\u00EB:"e",\u00CC:"I",\u00CD:"I",\u00CE:"I",\u00CF:"I",\u00EC:"i",\u00ED:"i",\u00EE:"i",\u00EF:"i",\u00D1:"N",\u00F1:"n",\u00D2:"O",\u00D3:"O",\u00D4:"O",\u00D5:"O",\u00D6:"O",\u00D8:"O",\u00F2:"o",\u00F3:"o",\u00F4:"o",\u00F5:"o",\u00F6:"o",\u00F8:"o",\u00D9:"U",\u00DA:"U",\u00DB:"U",\u00DC:"U",\u00F9:"u",\u00FA:"u",\u00FB:"u",\u00FC:"u",\u00DD:"Y",\u00FD:"y",\u00FF:"y",\u00C6:"Ae",\u00E6:"ae",\u00DE:"Th",\u00FE:"th",\u00DF:"ss",\u0100:"A",\u0102:"A",\u0104:"A",\u0101:"a",\u0103:"a",\u0105:"a",\u0106:"C",\u0108:"C",\u010A:"C",\u010C:"C",\u0107:"c",\u0109:"c",\u010B:"c",\u010D:"c",\u010E:"D",\u0110:"D",\u010F:"d",\u0111:"d",\u0112:"E",\u0114:"E",\u0116:"E",\u0118:"E",\u011A:"E",\u0113:"e",\u0115:"e",\u0117:"e",\u0119:"e",\u011B:"e",\u011C:"G",\u011E:"G",\u0120:"G",\u0122:"G",\u011D:"g",\u011F:"g",\u0121:"g",\u0123:"g",\u0124:"H",\u0126:"H",\u0125:"h",\u0127:"h",\u0128:"I",\u012A:"I",\u012C:"I",\u012E:"I",\u0130:"I",\u0129:"i",\u012B:"i",\u012D:"i",\u012F:"i",\u0131:"i",\u0134:"J",\u0135:"j",\u0136:"K",\u0137:"k",\u0138:"k",\u0139:"L",\u013B:"L",\u013D:"L",\u013F:"L",\u0141:"L",\u013A:"l",\u013C:"l",\u013E:"l",\u0140:"l",\u0142:"l",\u0143:"N",\u0145:"N",\u0147:"N",\u014A:"N",\u0144:"n",\u0146:"n",\u0148:"n",\u014B:"n",\u014C:"O",\u014E:"O",\u0150:"O",\u014D:"o",\u014F:"o",\u0151:"o",\u0154:"R",\u0156:"R",\u0158:"R",\u0155:"r",\u0157:"r",\u0159:"r",\u015A:"S",\u015C:"S",\u015E:"S",\u0160:"S",\u015B:"s",\u015D:"s",\u015F:"s",\u0161:"s",\u0162:"T",\u0164:"T",\u0166:"T",\u0163:"t",\u0165:"t",\u0167:"t",\u0168:"U",\u016A:"U",\u016C:"U",\u016E:"U",\u0170:"U",\u0172:"U",\u0169:"u",\u016B:"u",\u016D:"u",\u016F:"u",\u0171:"u",\u0173:"u",\u0174:"W",\u0175:"w",\u0176:"Y",\u0177:"y",\u0178:"Y",\u0179:"Z",\u017B:"Z",\u017D:"Z",\u017A:"z",\u017C:"z",\u017E:"z",\u0132:"IJ",\u0133:"ij",\u0152:"Oe",\u0153:"oe",\u0149:"'n",\u017F:"s"},mje=dje(Cje);Ere.exports=mje});var wre=w((_ht,yre)=>{var Eje=Ire(),Ije=of(),yje=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,wje="\\u0300-\\u036f",Bje="\\ufe20-\\ufe2f",bje="\\u20d0-\\u20ff",Qje=wje+Bje+bje,vje="["+Qje+"]",Sje=RegExp(vje,"g");function kje(t){return t=Ije(t),t&&t.replace(yje,Eje).replace(Sje,"")}yre.exports=kje});var bre=w((Vht,Bre)=>{var xje=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;function Pje(t){return t.match(xje)||[]}Bre.exports=Pje});var vre=w((Xht,Qre)=>{var Dje=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;function Rje(t){return Dje.test(t)}Qre.exports=Rje});var qre=w((Zht,Sre)=>{var kre="\\ud800-\\udfff",Fje="\\u0300-\\u036f",Nje="\\ufe20-\\ufe2f",Lje="\\u20d0-\\u20ff",Tje=Fje+Nje+Lje,xre="\\u2700-\\u27bf",Pre="a-z\\xdf-\\xf6\\xf8-\\xff",Oje="\\xac\\xb1\\xd7\\xf7",Mje="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",Kje="\\u2000-\\u206f",Uje=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Dre="A-Z\\xc0-\\xd6\\xd8-\\xde",Hje="\\ufe0e\\ufe0f",Rre=Oje+Mje+Kje+Uje,Fre="['\u2019]",Nre="["+Rre+"]",Gje="["+Tje+"]",Lre="\\d+",jje="["+xre+"]",Tre="["+Pre+"]",Ore="[^"+kre+Rre+Lre+xre+Pre+Dre+"]",Yje="\\ud83c[\\udffb-\\udfff]",qje="(?:"+Gje+"|"+Yje+")",Jje="[^"+kre+"]",Mre="(?:\\ud83c[\\udde6-\\uddff]){2}",Kre="[\\ud800-\\udbff][\\udc00-\\udfff]",qf="["+Dre+"]",Wje="\\u200d",Ure="(?:"+Tre+"|"+Ore+")",zje="(?:"+qf+"|"+Ore+")",Hre="(?:"+Fre+"(?:d|ll|m|re|s|t|ve))?",Gre="(?:"+Fre+"(?:D|LL|M|RE|S|T|VE))?",jre=qje+"?",Yre="["+Hje+"]?",_je="(?:"+Wje+"(?:"+[Jje,Mre,Kre].join("|")+")"+Yre+jre+")*",Vje="\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",Xje="\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])",Zje=Yre+jre+_je,$je="(?:"+[jje,Mre,Kre].join("|")+")"+Zje,eYe=RegExp([qf+"?"+Tre+"+"+Hre+"(?="+[Nre,qf,"$"].join("|")+")",zje+"+"+Gre+"(?="+[Nre,qf+Ure,"$"].join("|")+")",qf+"?"+Ure+"+"+Hre,qf+"+"+Gre,Xje,Vje,Lre,$je].join("|"),"g");function tYe(t){return t.match(eYe)||[]}Sre.exports=tYe});var Wre=w(($ht,Jre)=>{var rYe=bre(),iYe=vre(),nYe=of(),sYe=qre();function oYe(t,e,r){return t=nYe(t),e=r?void 0:e,e===void 0?iYe(t)?sYe(t):rYe(t):t.match(e)||[]}Jre.exports=oYe});var ZF=w((ept,zre)=>{var aYe=dre(),AYe=wre(),lYe=Wre(),cYe="['\u2019]",uYe=RegExp(cYe,"g");function gYe(t){return function(e){return aYe(lYe(AYe(e).replace(uYe,"")),t,"")}}zre.exports=gYe});var Vre=w((tpt,_re)=>{var fYe=ZF(),hYe=fYe(function(t,e,r){return t+(r?"_":"")+e.toLowerCase()});_re.exports=hYe});var Zre=w((rpt,Xre)=>{var pYe=rB(),dYe=ZF(),CYe=dYe(function(t,e,r){return e=e.toLowerCase(),t+(r?pYe(e):e)});Xre.exports=CYe});var eie=w((ipt,$re)=>{var mYe=Lf(),EYe=BF(),IYe=KF();function yYe(t,e){var r={};return e=IYe(e,3),EYe(t,function(i,n,s){mYe(r,e(i,n,s),i)}),r}$re.exports=yYe});var rie=w((npt,$F)=>{$F.exports=function(t){return tie(wYe(t),t)};$F.exports.array=tie;function tie(t,e){var r=t.length,i=new Array(r),n={},s=r,o=BYe(e),a=bYe(t);for(e.forEach(function(c){if(!a.has(c[0])||!a.has(c[1]))throw new Error("Unknown node. There is an unknown node in the supplied edges.")});s--;)n[s]||l(t[s],s,new Set);return i;function l(c,u,g){if(g.has(c)){var f;try{f=", node was:"+JSON.stringify(c)}catch(m){f=""}throw new Error("Cyclic dependency"+f)}if(!a.has(c))throw new Error("Found unknown node. Make sure to provided all involved nodes. Unknown node: "+JSON.stringify(c));if(!n[u]){n[u]=!0;var h=o.get(c)||new Set;if(h=Array.from(h),u=h.length){g.add(c);do{var p=h[--u];l(p,a.get(p),g)}while(u);g.delete(c)}i[--r]=c}}}function wYe(t){for(var e=new Set,r=0,i=t.length;r{"use strict";Object.defineProperty(eN,"__esModule",{value:!0});eN.default=QYe;var vYe=j0(kC()),SYe=j0(rie()),kYe=OC(),xYe=j0(hu()),PYe=j0(Of());function j0(t){return t&&t.__esModule?t:{default:t}}function QYe(t,e=[]){let r=[],i=[];function n(s,o){var a=(0,kYe.split)(s)[0];~i.indexOf(a)||i.push(a),~e.indexOf(`${o}-${a}`)||r.push([o,a])}for(let s in t)if((0,vYe.default)(t,s)){let o=t[s];~i.indexOf(s)||i.push(s),xYe.default.isRef(o)&&o.isSibling?n(o.path,s):(0,PYe.default)(o)&&"deps"in o&&o.deps.forEach(a=>n(a,s))}return SYe.default.array(i,r).reverse()}});var sie=w(tN=>{"use strict";Object.defineProperty(tN,"__esModule",{value:!0});tN.default=DYe;function nie(t,e){let r=Infinity;return t.some((i,n)=>{var s;if(((s=e.path)==null?void 0:s.indexOf(i))!==-1)return r=n,!0}),r}function DYe(t){return(e,r)=>nie(t,e)-nie(t,r)}});var gie=w(JC=>{"use strict";Object.defineProperty(JC,"__esModule",{value:!0});JC.create=oie;JC.default=void 0;var aie=ca(kC()),Aie=ca(Vre()),RYe=ca(Zre()),FYe=ca(eie()),NYe=ca(UF()),LYe=OC(),lie=hA(),TYe=ca(iie()),cie=ca(sie()),OYe=ca(y0()),MYe=ca(uu()),rN=ca(dA());function ca(t){return t&&t.__esModule?t:{default:t}}function Jf(){return Jf=Object.assign||function(t){for(var e=1;eObject.prototype.toString.call(t)==="[object Object]";function KYe(t,e){let r=Object.keys(t.fields);return Object.keys(e).filter(i=>r.indexOf(i)===-1)}var UYe=(0,cie.default)([]),Y0=class extends rN.default{constructor(e){super({type:"object"});this.fields=Object.create(null),this._sortErrors=UYe,this._nodes=[],this._excludedEdges=[],this.withMutation(()=>{this.transform(function(i){if(typeof i=="string")try{i=JSON.parse(i)}catch(n){i=null}return this.isType(i)?i:null}),e&&this.shape(e)})}_typeCheck(e){return uie(e)||typeof e=="function"}_cast(e,r={}){var i;let n=super._cast(e,r);if(n===void 0)return this.getDefault();if(!this._typeCheck(n))return n;let s=this.fields,o=(i=r.stripUnknown)!=null?i:this.spec.noUnknown,a=this._nodes.concat(Object.keys(n).filter(g=>this._nodes.indexOf(g)===-1)),l={},c=Jf({},r,{parent:l,__validating:r.__validating||!1}),u=!1;for(let g of a){let f=s[g],h=(0,aie.default)(n,g);if(f){let p,m=n[g];c.path=(r.path?`${r.path}.`:"")+g,f=f.resolve({value:m,context:r.context,parent:l});let y="spec"in f?f.spec:void 0,b=y==null?void 0:y.strict;if(y==null?void 0:y.strip){u=u||g in n;continue}p=!r.__validating||!b?f.cast(n[g],c):n[g],p!==void 0&&(l[g]=p)}else h&&!o&&(l[g]=n[g]);l[g]!==n[g]&&(u=!0)}return u?l:n}_validate(e,r={},i){let n=[],{sync:s,from:o=[],originalValue:a=e,abortEarly:l=this.spec.abortEarly,recursive:c=this.spec.recursive}=r;o=[{schema:this,value:a},...o],r.__validating=!0,r.originalValue=a,r.from=o,super._validate(e,r,(u,g)=>{if(u){if(!MYe.default.isError(u)||l)return void i(u,g);n.push(u)}if(!c||!uie(g)){i(n[0]||null,g);return}a=a||g;let f=this._nodes.map(h=>(p,m)=>{let y=h.indexOf(".")===-1?(r.path?`${r.path}.`:"")+h:`${r.path||""}["${h}"]`,b=this.fields[h];if(b&&"validate"in b){b.validate(g[h],Jf({},r,{path:y,from:o,strict:!0,parent:g,originalValue:a[h]}),m);return}m(null)});(0,OYe.default)({sync:s,tests:f,value:g,errors:n,endEarly:l,sort:this._sortErrors,path:r.path},i)})}clone(e){let r=super.clone(e);return r.fields=Jf({},this.fields),r._nodes=this._nodes,r._excludedEdges=this._excludedEdges,r._sortErrors=this._sortErrors,r}concat(e){let r=super.concat(e),i=r.fields;for(let[n,s]of Object.entries(this.fields)){let o=i[n];o===void 0?i[n]=s:o instanceof rN.default&&s instanceof rN.default&&(i[n]=s.concat(o))}return r.withMutation(()=>r.shape(i))}getDefaultFromShape(){let e={};return this._nodes.forEach(r=>{let i=this.fields[r];e[r]="default"in i?i.getDefault():void 0}),e}_getDefault(){if("default"in this.spec)return super._getDefault();if(!!this._nodes.length)return this.getDefaultFromShape()}shape(e,r=[]){let i=this.clone(),n=Object.assign(i.fields,e);if(i.fields=n,i._sortErrors=(0,cie.default)(Object.keys(n)),r.length){Array.isArray(r[0])||(r=[r]);let s=r.map(([o,a])=>`${o}-${a}`);i._excludedEdges=i._excludedEdges.concat(s)}return i._nodes=(0,TYe.default)(n,i._excludedEdges),i}pick(e){let r={};for(let i of e)this.fields[i]&&(r[i]=this.fields[i]);return this.clone().withMutation(i=>(i.fields={},i.shape(r)))}omit(e){let r=this.clone(),i=r.fields;r.fields={};for(let n of e)delete i[n];return r.withMutation(()=>r.shape(i))}from(e,r,i){let n=(0,LYe.getter)(e,!0);return this.transform(s=>{if(s==null)return s;let o=s;return(0,aie.default)(s,e)&&(o=Jf({},s),i||delete o[e],o[r]=n(s)),o})}noUnknown(e=!0,r=lie.object.noUnknown){typeof e=="string"&&(r=e,e=!0);let i=this.test({name:"noUnknown",exclusive:!0,message:r,test(n){if(n==null)return!0;let s=KYe(this.schema,n);return!e||s.length===0||this.createError({params:{unknown:s.join(", ")}})}});return i.spec.noUnknown=e,i}unknown(e=!0,r=lie.object.noUnknown){return this.noUnknown(!e,r)}transformKeys(e){return this.transform(r=>r&&(0,FYe.default)(r,(i,n)=>e(n)))}camelCase(){return this.transformKeys(RYe.default)}snakeCase(){return this.transformKeys(Aie.default)}constantCase(){return this.transformKeys(e=>(0,Aie.default)(e).toUpperCase())}describe(){let e=super.describe();return e.fields=(0,NYe.default)(this.fields,r=>r.describe()),e}};JC.default=Y0;function oie(t){return new Y0(t)}oie.prototype=Y0.prototype});var hie=w(WC=>{"use strict";Object.defineProperty(WC,"__esModule",{value:!0});WC.create=fie;WC.default=void 0;var iN=Wf(Yf()),HYe=Wf(Of()),GYe=Wf(SC()),nN=hA(),jYe=Wf(y0()),YYe=Wf(uu()),qYe=Wf(dA());function Wf(t){return t&&t.__esModule?t:{default:t}}function q0(){return q0=Object.assign||function(t){for(var e=1;e{this.transform(function(r){if(typeof r=="string")try{r=JSON.parse(r)}catch(i){r=null}return this.isType(r)?r:null})})}_typeCheck(e){return Array.isArray(e)}get _subType(){return this.innerType}_cast(e,r){let i=super._cast(e,r);if(!this._typeCheck(i)||!this.innerType)return i;let n=!1,s=i.map((o,a)=>{let l=this.innerType.cast(o,q0({},r,{path:`${r.path||""}[${a}]`}));return l!==o&&(n=!0),l});return n?s:i}_validate(e,r={},i){var n,s;let o=[],a=r.sync,l=r.path,c=this.innerType,u=(n=r.abortEarly)!=null?n:this.spec.abortEarly,g=(s=r.recursive)!=null?s:this.spec.recursive,f=r.originalValue!=null?r.originalValue:e;super._validate(e,r,(h,p)=>{if(h){if(!YYe.default.isError(h)||u)return void i(h,p);o.push(h)}if(!g||!c||!this._typeCheck(p)){i(o[0]||null,p);return}f=f||p;let m=new Array(p.length);for(let y=0;yc.validate(b,k,Y)}(0,jYe.default)({sync:a,path:l,value:p,errors:o,endEarly:u,tests:m},i)})}clone(e){let r=super.clone(e);return r.innerType=this.innerType,r}concat(e){let r=super.concat(e);return r.innerType=this.innerType,e.innerType&&(r.innerType=r.innerType?r.innerType.concat(e.innerType):e.innerType),r}of(e){let r=this.clone();if(!(0,HYe.default)(e))throw new TypeError("`array.of()` sub-schema must be a valid yup schema not: "+(0,GYe.default)(e));return r.innerType=e,r}length(e,r=nN.array.length){return this.test({message:r,name:"length",exclusive:!0,params:{length:e},test(i){return(0,iN.default)(i)||i.length===this.resolve(e)}})}min(e,r){return r=r||nN.array.min,this.test({message:r,name:"min",exclusive:!0,params:{min:e},test(i){return(0,iN.default)(i)||i.length>=this.resolve(e)}})}max(e,r){return r=r||nN.array.max,this.test({message:r,name:"max",exclusive:!0,params:{max:e},test(i){return(0,iN.default)(i)||i.length<=this.resolve(e)}})}ensure(){return this.default(()=>[]).transform((e,r)=>this._typeCheck(e)?e:r==null?[]:[].concat(r))}compact(e){let r=e?(i,n,s)=>!e(i,n,s):i=>!!i;return this.transform(i=>i!=null?i.filter(r):i)}describe(){let e=super.describe();return this.innerType&&(e.innerType=this.innerType.describe()),e}nullable(e=!0){return super.nullable(e)}defined(){return super.defined()}required(e){return super.required(e)}};WC.default=J0;fie.prototype=J0.prototype});var pie=w(zC=>{"use strict";Object.defineProperty(zC,"__esModule",{value:!0});zC.create=JYe;zC.default=void 0;var zYe=WYe(Of());function WYe(t){return t&&t.__esModule?t:{default:t}}function JYe(t){return new sN(t)}var sN=class{constructor(e){this.type="lazy",this.__isYupSchema__=!0,this._resolve=(r,i={})=>{let n=this.builder(r,i);if(!(0,zYe.default)(n))throw new TypeError("lazy() functions must return a valid schema");return n.resolve(i)},this.builder=e}resolve(e){return this._resolve(e.value,e)}cast(e,r){return this._resolve(e,r).cast(e,r)}validate(e,r,i){return this._resolve(e,r).validate(e,r,i)}validateSync(e,r){return this._resolve(e,r).validateSync(e,r)}validateAt(e,r,i){return this._resolve(r,i).validateAt(e,r,i)}validateSyncAt(e,r,i){return this._resolve(r,i).validateSyncAt(e,r,i)}describe(){return null}isValid(e,r){return this._resolve(e,r).isValid(e,r)}isValidSync(e,r){return this._resolve(e,r).isValidSync(e,r)}},_Ye=sN;zC.default=_Ye});var die=w(oN=>{"use strict";Object.defineProperty(oN,"__esModule",{value:!0});oN.default=VYe;var ZYe=XYe(hA());function XYe(t){return t&&t.__esModule?t:{default:t}}function VYe(t){Object.keys(t).forEach(e=>{Object.keys(t[e]).forEach(r=>{ZYe.default[e][r]=t[e][r]})})}});var AN=w(Br=>{"use strict";Object.defineProperty(Br,"__esModule",{value:!0});Br.addMethod=$Ye;Object.defineProperty(Br,"MixedSchema",{enumerable:!0,get:function(){return Cie.default}});Object.defineProperty(Br,"mixed",{enumerable:!0,get:function(){return Cie.create}});Object.defineProperty(Br,"BooleanSchema",{enumerable:!0,get:function(){return aN.default}});Object.defineProperty(Br,"bool",{enumerable:!0,get:function(){return aN.create}});Object.defineProperty(Br,"boolean",{enumerable:!0,get:function(){return aN.create}});Object.defineProperty(Br,"StringSchema",{enumerable:!0,get:function(){return mie.default}});Object.defineProperty(Br,"string",{enumerable:!0,get:function(){return mie.create}});Object.defineProperty(Br,"NumberSchema",{enumerable:!0,get:function(){return Eie.default}});Object.defineProperty(Br,"number",{enumerable:!0,get:function(){return Eie.create}});Object.defineProperty(Br,"DateSchema",{enumerable:!0,get:function(){return Iie.default}});Object.defineProperty(Br,"date",{enumerable:!0,get:function(){return Iie.create}});Object.defineProperty(Br,"ObjectSchema",{enumerable:!0,get:function(){return yie.default}});Object.defineProperty(Br,"object",{enumerable:!0,get:function(){return yie.create}});Object.defineProperty(Br,"ArraySchema",{enumerable:!0,get:function(){return wie.default}});Object.defineProperty(Br,"array",{enumerable:!0,get:function(){return wie.create}});Object.defineProperty(Br,"ref",{enumerable:!0,get:function(){return eqe.create}});Object.defineProperty(Br,"lazy",{enumerable:!0,get:function(){return tqe.create}});Object.defineProperty(Br,"ValidationError",{enumerable:!0,get:function(){return rqe.default}});Object.defineProperty(Br,"reach",{enumerable:!0,get:function(){return iqe.default}});Object.defineProperty(Br,"isSchema",{enumerable:!0,get:function(){return Bie.default}});Object.defineProperty(Br,"setLocale",{enumerable:!0,get:function(){return nqe.default}});Object.defineProperty(Br,"BaseSchema",{enumerable:!0,get:function(){return sqe.default}});var Cie=Cu($te()),aN=Cu(nre()),mie=Cu(are()),Eie=Cu(cre()),Iie=Cu(hre()),yie=Cu(gie()),wie=Cu(hie()),eqe=hu(),tqe=pie(),rqe=_C(uu()),iqe=_C(WF()),Bie=_C(Of()),nqe=_C(die()),sqe=_C(dA());function _C(t){return t&&t.__esModule?t:{default:t}}function bie(){if(typeof WeakMap!="function")return null;var t=new WeakMap;return bie=function(){return t},t}function Cu(t){if(t&&t.__esModule)return t;if(t===null||typeof t!="object"&&typeof t!="function")return{default:t};var e=bie();if(e&&e.has(t))return e.get(t);var r={},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var n in t)if(Object.prototype.hasOwnProperty.call(t,n)){var s=i?Object.getOwnPropertyDescriptor(t,n):null;s&&(s.get||s.set)?Object.defineProperty(r,n,s):r[n]=t[n]}return r.default=t,e&&e.set(t,r),r}function $Ye(t,e,r){if(!t||!(0,Bie.default)(t.prototype))throw new TypeError("You must provide a yup schema constructor function");if(typeof e!="string")throw new TypeError("A Method name must be provided");if(typeof r!="function")throw new TypeError("Method function must be provided");t.prototype[e]=r}});var xie=w((bpt,XC)=>{"use strict";var Aqe=process.env.TERM_PROGRAM==="Hyper",lqe=process.platform==="win32",vie=process.platform==="linux",lN={ballotDisabled:"\u2612",ballotOff:"\u2610",ballotOn:"\u2611",bullet:"\u2022",bulletWhite:"\u25E6",fullBlock:"\u2588",heart:"\u2764",identicalTo:"\u2261",line:"\u2500",mark:"\u203B",middot:"\xB7",minus:"\uFF0D",multiplication:"\xD7",obelus:"\xF7",pencilDownRight:"\u270E",pencilRight:"\u270F",pencilUpRight:"\u2710",percent:"%",pilcrow2:"\u2761",pilcrow:"\xB6",plusMinus:"\xB1",section:"\xA7",starsOff:"\u2606",starsOn:"\u2605",upDownArrow:"\u2195"},Sie=Object.assign({},lN,{check:"\u221A",cross:"\xD7",ellipsisLarge:"...",ellipsis:"...",info:"i",question:"?",questionSmall:"?",pointer:">",pointerSmall:"\xBB",radioOff:"( )",radioOn:"(*)",warning:"\u203C"}),kie=Object.assign({},lN,{ballotCross:"\u2718",check:"\u2714",cross:"\u2716",ellipsisLarge:"\u22EF",ellipsis:"\u2026",info:"\u2139",question:"?",questionFull:"\uFF1F",questionSmall:"\uFE56",pointer:vie?"\u25B8":"\u276F",pointerSmall:vie?"\u2023":"\u203A",radioOff:"\u25EF",radioOn:"\u25C9",warning:"\u26A0"});XC.exports=lqe&&!Aqe?Sie:kie;Reflect.defineProperty(XC.exports,"common",{enumerable:!1,value:lN});Reflect.defineProperty(XC.exports,"windows",{enumerable:!1,value:Sie});Reflect.defineProperty(XC.exports,"other",{enumerable:!1,value:kie})});var mo=w((Qpt,cN)=>{"use strict";var cqe=t=>t!==null&&typeof t=="object"&&!Array.isArray(t),uqe=/[\u001b\u009b][[\]#;?()]*(?:(?:(?:[^\W_]*;?[^\W_]*)\u0007)|(?:(?:[0-9]{1,4}(;[0-9]{0,4})*)?[~0-9=<>cf-nqrtyA-PRZ]))/g,Pie=()=>{let t={enabled:!0,visible:!0,styles:{},keys:{}};"FORCE_COLOR"in process.env&&(t.enabled=process.env.FORCE_COLOR!=="0");let e=s=>{let o=s.open=`[${s.codes[0]}m`,a=s.close=`[${s.codes[1]}m`,l=s.regex=new RegExp(`\\u001b\\[${s.codes[1]}m`,"g");return s.wrap=(c,u)=>{c.includes(a)&&(c=c.replace(l,a+o));let g=o+c+a;return u?g.replace(/\r*\n/g,`${a}$&${o}`):g},s},r=(s,o,a)=>typeof s=="function"?s(o):s.wrap(o,a),i=(s,o)=>{if(s===""||s==null)return"";if(t.enabled===!1)return s;if(t.visible===!1)return"";let a=""+s,l=a.includes(` -`),c=o.length;for(c>0&&o.includes("unstyle")&&(o=[...new Set(["unstyle",...o])].reverse());c-- >0;)a=r(t.styles[o[c]],a,l);return a},n=(s,o,a)=>{t.styles[s]=e({name:s,codes:o}),(t.keys[a]||(t.keys[a]=[])).push(s),Reflect.defineProperty(t,s,{configurable:!0,enumerable:!0,set(c){t.alias(s,c)},get(){let c=u=>i(u,c.stack);return Reflect.setPrototypeOf(c,t),c.stack=this.stack?this.stack.concat(s):[s],c}})};return n("reset",[0,0],"modifier"),n("bold",[1,22],"modifier"),n("dim",[2,22],"modifier"),n("italic",[3,23],"modifier"),n("underline",[4,24],"modifier"),n("inverse",[7,27],"modifier"),n("hidden",[8,28],"modifier"),n("strikethrough",[9,29],"modifier"),n("black",[30,39],"color"),n("red",[31,39],"color"),n("green",[32,39],"color"),n("yellow",[33,39],"color"),n("blue",[34,39],"color"),n("magenta",[35,39],"color"),n("cyan",[36,39],"color"),n("white",[37,39],"color"),n("gray",[90,39],"color"),n("grey",[90,39],"color"),n("bgBlack",[40,49],"bg"),n("bgRed",[41,49],"bg"),n("bgGreen",[42,49],"bg"),n("bgYellow",[43,49],"bg"),n("bgBlue",[44,49],"bg"),n("bgMagenta",[45,49],"bg"),n("bgCyan",[46,49],"bg"),n("bgWhite",[47,49],"bg"),n("blackBright",[90,39],"bright"),n("redBright",[91,39],"bright"),n("greenBright",[92,39],"bright"),n("yellowBright",[93,39],"bright"),n("blueBright",[94,39],"bright"),n("magentaBright",[95,39],"bright"),n("cyanBright",[96,39],"bright"),n("whiteBright",[97,39],"bright"),n("bgBlackBright",[100,49],"bgBright"),n("bgRedBright",[101,49],"bgBright"),n("bgGreenBright",[102,49],"bgBright"),n("bgYellowBright",[103,49],"bgBright"),n("bgBlueBright",[104,49],"bgBright"),n("bgMagentaBright",[105,49],"bgBright"),n("bgCyanBright",[106,49],"bgBright"),n("bgWhiteBright",[107,49],"bgBright"),t.ansiRegex=uqe,t.hasColor=t.hasAnsi=s=>(t.ansiRegex.lastIndex=0,typeof s=="string"&&s!==""&&t.ansiRegex.test(s)),t.alias=(s,o)=>{let a=typeof o=="string"?t[o]:o;if(typeof a!="function")throw new TypeError("Expected alias to be the name of an existing color (string) or a function");a.stack||(Reflect.defineProperty(a,"name",{value:s}),t.styles[s]=a,a.stack=[s]),Reflect.defineProperty(t,s,{configurable:!0,enumerable:!0,set(l){t.alias(s,l)},get(){let l=c=>i(c,l.stack);return Reflect.setPrototypeOf(l,t),l.stack=this.stack?this.stack.concat(a.stack):a.stack,l}})},t.theme=s=>{if(!cqe(s))throw new TypeError("Expected theme to be an object");for(let o of Object.keys(s))t.alias(o,s[o]);return t},t.alias("unstyle",s=>typeof s=="string"&&s!==""?(t.ansiRegex.lastIndex=0,s.replace(t.ansiRegex,"")):""),t.alias("noop",s=>s),t.none=t.clear=t.noop,t.stripColor=t.unstyle,t.symbols=xie(),t.define=n,t};cN.exports=Pie();cN.exports.create=Pie});var Xi=w(Lt=>{"use strict";var gqe=Object.prototype.toString,Js=mo(),Die=!1,uN=[],Rie={yellow:"blue",cyan:"red",green:"magenta",black:"white",blue:"yellow",red:"cyan",magenta:"green",white:"black"};Lt.longest=(t,e)=>t.reduce((r,i)=>Math.max(r,e?i[e].length:i.length),0);Lt.hasColor=t=>!!t&&Js.hasColor(t);var z0=Lt.isObject=t=>t!==null&&typeof t=="object"&&!Array.isArray(t);Lt.nativeType=t=>gqe.call(t).slice(8,-1).toLowerCase().replace(/\s/g,"");Lt.isAsyncFn=t=>Lt.nativeType(t)==="asyncfunction";Lt.isPrimitive=t=>t!=null&&typeof t!="object"&&typeof t!="function";Lt.resolve=(t,e,...r)=>typeof e=="function"?e.call(t,...r):e;Lt.scrollDown=(t=[])=>[...t.slice(1),t[0]];Lt.scrollUp=(t=[])=>[t.pop(),...t];Lt.reorder=(t=[])=>{let e=t.slice();return e.sort((r,i)=>r.index>i.index?1:r.index{let i=t.length,n=r===i?0:r<0?i-1:r,s=t[e];t[e]=t[n],t[n]=s};Lt.width=(t,e=80)=>{let r=t&&t.columns?t.columns:e;return t&&typeof t.getWindowSize=="function"&&(r=t.getWindowSize()[0]),process.platform==="win32"?r-1:r};Lt.height=(t,e=20)=>{let r=t&&t.rows?t.rows:e;return t&&typeof t.getWindowSize=="function"&&(r=t.getWindowSize()[1]),r};Lt.wordWrap=(t,e={})=>{if(!t)return t;typeof e=="number"&&(e={width:e});let{indent:r="",newline:i=` -`+r,width:n=80}=e;n-=((i+r).match(/[^\S\n]/g)||[]).length;let o=`.{1,${n}}([\\s\\u200B]+|$)|[^\\s\\u200B]+?([\\s\\u200B]+|$)`,a=t.trim(),l=new RegExp(o,"g"),c=a.match(l)||[];return c=c.map(u=>u.replace(/\n$/,"")),e.padEnd&&(c=c.map(u=>u.padEnd(n," "))),e.padStart&&(c=c.map(u=>u.padStart(n," "))),r+c.join(i)};Lt.unmute=t=>{let e=t.stack.find(i=>Js.keys.color.includes(i));return e?Js[e]:t.stack.find(i=>i.slice(2)==="bg")?Js[e.slice(2)]:i=>i};Lt.pascal=t=>t?t[0].toUpperCase()+t.slice(1):"";Lt.inverse=t=>{if(!t||!t.stack)return t;let e=t.stack.find(i=>Js.keys.color.includes(i));if(e){let i=Js["bg"+Lt.pascal(e)];return i?i.black:t}let r=t.stack.find(i=>i.slice(0,2)==="bg");return r?Js[r.slice(2).toLowerCase()]||t:Js.none};Lt.complement=t=>{if(!t||!t.stack)return t;let e=t.stack.find(i=>Js.keys.color.includes(i)),r=t.stack.find(i=>i.slice(0,2)==="bg");if(e&&!r)return Js[Rie[e]||e];if(r){let i=r.slice(2).toLowerCase(),n=Rie[i];return n&&Js["bg"+Lt.pascal(n)]||t}return Js.none};Lt.meridiem=t=>{let e=t.getHours(),r=t.getMinutes(),i=e>=12?"pm":"am";e=e%12;let n=e===0?12:e,s=r<10?"0"+r:r;return n+":"+s+" "+i};Lt.set=(t={},e="",r)=>e.split(".").reduce((i,n,s,o)=>{let a=o.length-1>s?i[n]||{}:r;return!Lt.isObject(a)&&s{let i=t[e]==null?e.split(".").reduce((n,s)=>n&&n[s],t):t[e];return i==null?r:i};Lt.mixin=(t,e)=>{if(!z0(t))return e;if(!z0(e))return t;for(let r of Object.keys(e)){let i=Object.getOwnPropertyDescriptor(e,r);if(i.hasOwnProperty("value"))if(t.hasOwnProperty(r)&&z0(i.value)){let n=Object.getOwnPropertyDescriptor(t,r);z0(n.value)?t[r]=Lt.merge({},t[r],e[r]):Reflect.defineProperty(t,r,i)}else Reflect.defineProperty(t,r,i);else Reflect.defineProperty(t,r,i)}return t};Lt.merge=(...t)=>{let e={};for(let r of t)Lt.mixin(e,r);return e};Lt.mixinEmitter=(t,e)=>{let r=e.constructor.prototype;for(let i of Object.keys(r)){let n=r[i];typeof n=="function"?Lt.define(t,i,n.bind(e)):Lt.define(t,i,n)}};Lt.onExit=t=>{let e=(r,i)=>{Die||(Die=!0,uN.forEach(n=>n()),r===!0&&process.exit(128+i))};uN.length===0&&(process.once("SIGTERM",e.bind(null,!0,15)),process.once("SIGINT",e.bind(null,!0,2)),process.once("exit",e)),uN.push(t)};Lt.define=(t,e,r)=>{Reflect.defineProperty(t,e,{value:r})};Lt.defineExport=(t,e,r)=>{let i;Reflect.defineProperty(t,e,{enumerable:!0,configurable:!0,set(n){i=n},get(){return i?i():r()}})}});var Fie=w(_f=>{"use strict";_f.ctrl={a:"first",b:"backward",c:"cancel",d:"deleteForward",e:"last",f:"forward",g:"reset",i:"tab",k:"cutForward",l:"reset",n:"newItem",m:"cancel",j:"submit",p:"search",r:"remove",s:"save",u:"undo",w:"cutLeft",x:"toggleCursor",v:"paste"};_f.shift={up:"shiftUp",down:"shiftDown",left:"shiftLeft",right:"shiftRight",tab:"prev"};_f.fn={up:"pageUp",down:"pageDown",left:"pageLeft",right:"pageRight",delete:"deleteForward"};_f.option={b:"backward",f:"forward",d:"cutRight",left:"cutLeft",up:"altUp",down:"altDown"};_f.keys={pageup:"pageUp",pagedown:"pageDown",home:"home",end:"end",cancel:"cancel",delete:"deleteForward",backspace:"delete",down:"down",enter:"submit",escape:"cancel",left:"left",space:"space",number:"number",return:"submit",right:"right",tab:"next",up:"up"}});var Tie=w((kpt,Nie)=>{"use strict";var Lie=require("readline"),fqe=Fie(),hqe=/^(?:\x1b)([a-zA-Z0-9])$/,pqe=/^(?:\x1b+)(O|N|\[|\[\[)(?:(\d+)(?:;(\d+))?([~^$])|(?:1;)?(\d+)?([a-zA-Z]))/,dqe={OP:"f1",OQ:"f2",OR:"f3",OS:"f4","[11~":"f1","[12~":"f2","[13~":"f3","[14~":"f4","[[A":"f1","[[B":"f2","[[C":"f3","[[D":"f4","[[E":"f5","[15~":"f5","[17~":"f6","[18~":"f7","[19~":"f8","[20~":"f9","[21~":"f10","[23~":"f11","[24~":"f12","[A":"up","[B":"down","[C":"right","[D":"left","[E":"clear","[F":"end","[H":"home",OA:"up",OB:"down",OC:"right",OD:"left",OE:"clear",OF:"end",OH:"home","[1~":"home","[2~":"insert","[3~":"delete","[4~":"end","[5~":"pageup","[6~":"pagedown","[[5~":"pageup","[[6~":"pagedown","[7~":"home","[8~":"end","[a":"up","[b":"down","[c":"right","[d":"left","[e":"clear","[2$":"insert","[3$":"delete","[5$":"pageup","[6$":"pagedown","[7$":"home","[8$":"end",Oa:"up",Ob:"down",Oc:"right",Od:"left",Oe:"clear","[2^":"insert","[3^":"delete","[5^":"pageup","[6^":"pagedown","[7^":"home","[8^":"end","[Z":"tab"};function Cqe(t){return["[a","[b","[c","[d","[e","[2$","[3$","[5$","[6$","[7$","[8$","[Z"].includes(t)}function mqe(t){return["Oa","Ob","Oc","Od","Oe","[2^","[3^","[5^","[6^","[7^","[8^"].includes(t)}var _0=(t="",e={})=>{let r,i=N({name:e.name,ctrl:!1,meta:!1,shift:!1,option:!1,sequence:t,raw:t},e);if(Buffer.isBuffer(t)?t[0]>127&&t[1]===void 0?(t[0]-=128,t=""+String(t)):t=String(t):t!==void 0&&typeof t!="string"?t=String(t):t||(t=i.sequence||""),i.sequence=i.sequence||t||i.name,t==="\r")i.raw=void 0,i.name="return";else if(t===` -`)i.name="enter";else if(t===" ")i.name="tab";else if(t==="\b"||t==="\x7F"||t==="\x7F"||t==="\b")i.name="backspace",i.meta=t.charAt(0)==="";else if(t===""||t==="")i.name="escape",i.meta=t.length===2;else if(t===" "||t===" ")i.name="space",i.meta=t.length===2;else if(t<="")i.name=String.fromCharCode(t.charCodeAt(0)+"a".charCodeAt(0)-1),i.ctrl=!0;else if(t.length===1&&t>="0"&&t<="9")i.name="number";else if(t.length===1&&t>="a"&&t<="z")i.name=t;else if(t.length===1&&t>="A"&&t<="Z")i.name=t.toLowerCase(),i.shift=!0;else if(r=hqe.exec(t))i.meta=!0,i.shift=/^[A-Z]$/.test(r[1]);else if(r=pqe.exec(t)){let n=[...t];n[0]===""&&n[1]===""&&(i.option=!0);let s=[r[1],r[2],r[4],r[6]].filter(Boolean).join(""),o=(r[3]||r[5]||1)-1;i.ctrl=!!(o&4),i.meta=!!(o&10),i.shift=!!(o&1),i.code=s,i.name=dqe[s],i.shift=Cqe(s)||i.shift,i.ctrl=mqe(s)||i.ctrl}return i};_0.listen=(t={},e)=>{let{stdin:r}=t;if(!r||r!==process.stdin&&!r.isTTY)throw new Error("Invalid stream passed");let i=Lie.createInterface({terminal:!0,input:r});Lie.emitKeypressEvents(r,i);let n=(a,l)=>e(a,_0(a,l),i),s=r.isRaw;return r.isTTY&&r.setRawMode(!0),r.on("keypress",n),i.resume(),()=>{r.isTTY&&r.setRawMode(s),r.removeListener("keypress",n),i.pause(),i.close()}};_0.action=(t,e,r)=>{let i=N(N({},fqe),r);return e.ctrl?(e.action=i.ctrl[e.name],e):e.option&&i.option?(e.action=i.option[e.name],e):e.shift?(e.action=i.shift[e.name],e):(e.action=i.keys[e.name],e)};Nie.exports=_0});var Mie=w((xpt,Oie)=>{"use strict";Oie.exports=t=>{t.timers=t.timers||{};let e=t.options.timers;if(!!e)for(let r of Object.keys(e)){let i=e[r];typeof i=="number"&&(i={interval:i}),Eqe(t,r,i)}};function Eqe(t,e,r={}){let i=t.timers[e]={name:e,start:Date.now(),ms:0,tick:0},n=r.interval||120;i.frames=r.frames||[],i.loading=!0;let s=setInterval(()=>{i.ms=Date.now()-i.start,i.tick++,t.render()},n);return i.stop=()=>{i.loading=!1,clearInterval(s)},Reflect.defineProperty(i,"interval",{value:s}),t.once("close",()=>i.stop()),i.stop}});var Hie=w((Ppt,Kie)=>{"use strict";var{define:Iqe,width:yqe}=Xi(),Uie=class{constructor(e){let r=e.options;Iqe(this,"_prompt",e),this.type=e.type,this.name=e.name,this.message="",this.header="",this.footer="",this.error="",this.hint="",this.input="",this.cursor=0,this.index=0,this.lines=0,this.tick=0,this.prompt="",this.buffer="",this.width=yqe(r.stdout||process.stdout),Object.assign(this,r),this.name=this.name||this.message,this.message=this.message||this.name,this.symbols=e.symbols,this.styles=e.styles,this.required=new Set,this.cancelled=!1,this.submitted=!1}clone(){let e=N({},this);return e.status=this.status,e.buffer=Buffer.from(e.buffer),delete e.clone,e}set color(e){this._color=e}get color(){let e=this.prompt.styles;if(this.cancelled)return e.cancelled;if(this.submitted)return e.submitted;let r=this._color||e[this.status];return typeof r=="function"?r:e.pending}set loading(e){this._loading=e}get loading(){return typeof this._loading=="boolean"?this._loading:this.loadingChoices?"choices":!1}get status(){return this.cancelled?"cancelled":this.submitted?"submitted":"pending"}};Kie.exports=Uie});var jie=w((Dpt,Gie)=>{"use strict";var gN=Xi(),Fi=mo(),fN={default:Fi.noop,noop:Fi.noop,set inverse(t){this._inverse=t},get inverse(){return this._inverse||gN.inverse(this.primary)},set complement(t){this._complement=t},get complement(){return this._complement||gN.complement(this.primary)},primary:Fi.cyan,success:Fi.green,danger:Fi.magenta,strong:Fi.bold,warning:Fi.yellow,muted:Fi.dim,disabled:Fi.gray,dark:Fi.dim.gray,underline:Fi.underline,set info(t){this._info=t},get info(){return this._info||this.primary},set em(t){this._em=t},get em(){return this._em||this.primary.underline},set heading(t){this._heading=t},get heading(){return this._heading||this.muted.underline},set pending(t){this._pending=t},get pending(){return this._pending||this.primary},set submitted(t){this._submitted=t},get submitted(){return this._submitted||this.success},set cancelled(t){this._cancelled=t},get cancelled(){return this._cancelled||this.danger},set typing(t){this._typing=t},get typing(){return this._typing||this.dim},set placeholder(t){this._placeholder=t},get placeholder(){return this._placeholder||this.primary.dim},set highlight(t){this._highlight=t},get highlight(){return this._highlight||this.inverse}};fN.merge=(t={})=>{t.styles&&typeof t.styles.enabled=="boolean"&&(Fi.enabled=t.styles.enabled),t.styles&&typeof t.styles.visible=="boolean"&&(Fi.visible=t.styles.visible);let e=gN.merge({},fN,t.styles);delete e.merge;for(let r of Object.keys(Fi))e.hasOwnProperty(r)||Reflect.defineProperty(e,r,{get:()=>Fi[r]});for(let r of Object.keys(Fi.styles))e.hasOwnProperty(r)||Reflect.defineProperty(e,r,{get:()=>Fi[r]});return e};Gie.exports=fN});var qie=w((Rpt,Yie)=>{"use strict";var hN=process.platform==="win32",mA=mo(),wqe=Xi(),pN=ie(N({},mA.symbols),{upDownDoubleArrow:"\u21D5",upDownDoubleArrow2:"\u2B0D",upDownArrow:"\u2195",asterisk:"*",asterism:"\u2042",bulletWhite:"\u25E6",electricArrow:"\u2301",ellipsisLarge:"\u22EF",ellipsisSmall:"\u2026",fullBlock:"\u2588",identicalTo:"\u2261",indicator:mA.symbols.check,leftAngle:"\u2039",mark:"\u203B",minus:"\u2212",multiplication:"\xD7",obelus:"\xF7",percent:"%",pilcrow:"\xB6",pilcrow2:"\u2761",pencilUpRight:"\u2710",pencilDownRight:"\u270E",pencilRight:"\u270F",plus:"+",plusMinus:"\xB1",pointRight:"\u261E",rightAngle:"\u203A",section:"\xA7",hexagon:{off:"\u2B21",on:"\u2B22",disabled:"\u2B22"},ballot:{on:"\u2611",off:"\u2610",disabled:"\u2612"},stars:{on:"\u2605",off:"\u2606",disabled:"\u2606"},folder:{on:"\u25BC",off:"\u25B6",disabled:"\u25B6"},prefix:{pending:mA.symbols.question,submitted:mA.symbols.check,cancelled:mA.symbols.cross},separator:{pending:mA.symbols.pointerSmall,submitted:mA.symbols.middot,cancelled:mA.symbols.middot},radio:{off:hN?"( )":"\u25EF",on:hN?"(*)":"\u25C9",disabled:hN?"(|)":"\u24BE"},numbers:["\u24EA","\u2460","\u2461","\u2462","\u2463","\u2464","\u2465","\u2466","\u2467","\u2468","\u2469","\u246A","\u246B","\u246C","\u246D","\u246E","\u246F","\u2470","\u2471","\u2472","\u2473","\u3251","\u3252","\u3253","\u3254","\u3255","\u3256","\u3257","\u3258","\u3259","\u325A","\u325B","\u325C","\u325D","\u325E","\u325F","\u32B1","\u32B2","\u32B3","\u32B4","\u32B5","\u32B6","\u32B7","\u32B8","\u32B9","\u32BA","\u32BB","\u32BC","\u32BD","\u32BE","\u32BF"]});pN.merge=t=>{let e=wqe.merge({},mA.symbols,pN,t.symbols);return delete e.merge,e};Yie.exports=pN});var Wie=w((Fpt,Jie)=>{"use strict";var Bqe=jie(),bqe=qie(),Qqe=Xi();Jie.exports=t=>{t.options=Qqe.merge({},t.options.theme,t.options),t.symbols=bqe.merge(t.options),t.styles=Bqe.merge(t.options)}});var Zie=w((zie,_ie)=>{"use strict";var Vie=process.env.TERM_PROGRAM==="Apple_Terminal",vqe=mo(),dN=Xi(),Eo=_ie.exports=zie,Nr="[",Xie="\x07",CN=!1,kl=Eo.code={bell:Xie,beep:Xie,beginning:`${Nr}G`,down:`${Nr}J`,esc:Nr,getPosition:`${Nr}6n`,hide:`${Nr}?25l`,line:`${Nr}2K`,lineEnd:`${Nr}K`,lineStart:`${Nr}1K`,restorePosition:Nr+(Vie?"8":"u"),savePosition:Nr+(Vie?"7":"s"),screen:`${Nr}2J`,show:`${Nr}?25h`,up:`${Nr}1J`},mu=Eo.cursor={get hidden(){return CN},hide(){return CN=!0,kl.hide},show(){return CN=!1,kl.show},forward:(t=1)=>`${Nr}${t}C`,backward:(t=1)=>`${Nr}${t}D`,nextLine:(t=1)=>`${Nr}E`.repeat(t),prevLine:(t=1)=>`${Nr}F`.repeat(t),up:(t=1)=>t?`${Nr}${t}A`:"",down:(t=1)=>t?`${Nr}${t}B`:"",right:(t=1)=>t?`${Nr}${t}C`:"",left:(t=1)=>t?`${Nr}${t}D`:"",to(t,e){return e?`${Nr}${e+1};${t+1}H`:`${Nr}${t+1}G`},move(t=0,e=0){let r="";return r+=t<0?mu.left(-t):t>0?mu.right(t):"",r+=e<0?mu.up(-e):e>0?mu.down(e):"",r},restore(t={}){let{after:e,cursor:r,initial:i,input:n,prompt:s,size:o,value:a}=t;if(i=dN.isPrimitive(i)?String(i):"",n=dN.isPrimitive(n)?String(n):"",a=dN.isPrimitive(a)?String(a):"",o){let l=Eo.cursor.up(o)+Eo.cursor.to(s.length),c=n.length-r;return c>0&&(l+=Eo.cursor.left(c)),l}if(a||e){let l=!n&&!!i?-i.length:-n.length+r;return e&&(l-=e.length),n===""&&i&&!s.includes(i)&&(l+=i.length),Eo.cursor.move(l)}}},mN=Eo.erase={screen:kl.screen,up:kl.up,down:kl.down,line:kl.line,lineEnd:kl.lineEnd,lineStart:kl.lineStart,lines(t){let e="";for(let r=0;r{if(!e)return mN.line+mu.to(0);let r=s=>[...vqe.unstyle(s)].length,i=t.split(/\r?\n/),n=0;for(let s of i)n+=1+Math.floor(Math.max(r(s)-1,0)/e);return(mN.line+mu.prevLine()).repeat(n-1)+mN.line+mu.to(0)}});var Vf=w((Npt,$ie)=>{"use strict";var Sqe=require("events"),ene=mo(),EN=Tie(),kqe=Mie(),xqe=Hie(),Pqe=Wie(),Tn=Xi(),Eu=Zie(),V0=class extends Sqe{constructor(e={}){super();this.name=e.name,this.type=e.type,this.options=e,Pqe(this),kqe(this),this.state=new xqe(this),this.initial=[e.initial,e.default].find(r=>r!=null),this.stdout=e.stdout||process.stdout,this.stdin=e.stdin||process.stdin,this.scale=e.scale||1,this.term=this.options.term||process.env.TERM_PROGRAM,this.margin=Rqe(this.options.margin),this.setMaxListeners(0),Dqe(this)}async keypress(e,r={}){this.keypressed=!0;let i=EN.action(e,EN(e,r),this.options.actions);this.state.keypress=i,this.emit("keypress",e,i),this.emit("state",this.state.clone());let n=this.options[i.action]||this[i.action]||this.dispatch;if(typeof n=="function")return await n.call(this,e,i);this.alert()}alert(){delete this.state.alert,this.options.show===!1?this.emit("alert"):this.stdout.write(Eu.code.beep)}cursorHide(){this.stdout.write(Eu.cursor.hide()),Tn.onExit(()=>this.cursorShow())}cursorShow(){this.stdout.write(Eu.cursor.show())}write(e){!e||(this.stdout&&this.state.show!==!1&&this.stdout.write(e),this.state.buffer+=e)}clear(e=0){let r=this.state.buffer;this.state.buffer="",!(!r&&!e||this.options.show===!1)&&this.stdout.write(Eu.cursor.down(e)+Eu.clear(r,this.width))}restore(){if(this.state.closed||this.options.show===!1)return;let{prompt:e,after:r,rest:i}=this.sections(),{cursor:n,initial:s="",input:o="",value:a=""}=this,l=this.state.size=i.length,c={after:r,cursor:n,initial:s,input:o,prompt:e,size:l,value:a},u=Eu.cursor.restore(c);u&&this.stdout.write(u)}sections(){let{buffer:e,input:r,prompt:i}=this.state;i=ene.unstyle(i);let n=ene.unstyle(e),s=n.indexOf(i),o=n.slice(0,s),l=n.slice(s).split(` -`),c=l[0],u=l[l.length-1],f=(i+(r?" "+r:"")).length,h=fe.call(this,this.value),this.result=()=>i.call(this,this.value),typeof r.initial=="function"&&(this.initial=await r.initial.call(this,this)),typeof r.onRun=="function"&&await r.onRun.call(this,this),typeof r.onSubmit=="function"){let n=r.onSubmit.bind(this),s=this.submit.bind(this);delete this.options.onSubmit,this.submit=async()=>(await n(this.name,this.value,this),s())}await this.start(),await this.render()}render(){throw new Error("expected prompt to have a custom render method")}run(){return new Promise(async(e,r)=>{if(this.once("submit",e),this.once("cancel",r),await this.skip())return this.render=()=>{},this.submit();await this.initialize(),this.emit("run")})}async element(e,r,i){let{options:n,state:s,symbols:o,timers:a}=this,l=a&&a[e];s.timer=l;let c=n[e]||s[e]||o[e],u=r&&r[e]!=null?r[e]:await c;if(u==="")return u;let g=await this.resolve(u,s,r,i);return!g&&r&&r[e]?this.resolve(c,s,r,i):g}async prefix(){let e=await this.element("prefix")||this.symbols,r=this.timers&&this.timers.prefix,i=this.state;return i.timer=r,Tn.isObject(e)&&(e=e[i.status]||e.pending),Tn.hasColor(e)?e:(this.styles[i.status]||this.styles.pending)(e)}async message(){let e=await this.element("message");return Tn.hasColor(e)?e:this.styles.strong(e)}async separator(){let e=await this.element("separator")||this.symbols,r=this.timers&&this.timers.separator,i=this.state;i.timer=r;let n=e[i.status]||e.pending||i.separator,s=await this.resolve(n,i);return Tn.isObject(s)&&(s=s[i.status]||s.pending),Tn.hasColor(s)?s:this.styles.muted(s)}async pointer(e,r){let i=await this.element("pointer",e,r);if(typeof i=="string"&&Tn.hasColor(i))return i;if(i){let n=this.styles,s=this.index===r,o=s?n.primary:c=>c,a=await this.resolve(i[s?"on":"off"]||i,this.state),l=Tn.hasColor(a)?a:o(a);return s?l:" ".repeat(a.length)}}async indicator(e,r){let i=await this.element("indicator",e,r);if(typeof i=="string"&&Tn.hasColor(i))return i;if(i){let n=this.styles,s=e.enabled===!0,o=s?n.success:n.dark,a=i[s?"on":"off"]||i;return Tn.hasColor(a)?a:o(a)}return""}body(){return null}footer(){if(this.state.status==="pending")return this.element("footer")}header(){if(this.state.status==="pending")return this.element("header")}async hint(){if(this.state.status==="pending"&&!this.isValue(this.state.input)){let e=await this.element("hint");return Tn.hasColor(e)?e:this.styles.muted(e)}}error(e){return this.state.submitted?"":e||this.state.error}format(e){return e}result(e){return e}validate(e){return this.options.required===!0?this.isValue(e):!0}isValue(e){return e!=null&&e!==""}resolve(e,...r){return Tn.resolve(this,e,...r)}get base(){return V0.prototype}get style(){return this.styles[this.state.status]}get height(){return this.options.rows||Tn.height(this.stdout,25)}get width(){return this.options.columns||Tn.width(this.stdout,80)}get size(){return{width:this.width,height:this.height}}set cursor(e){this.state.cursor=e}get cursor(){return this.state.cursor}set input(e){this.state.input=e}get input(){return this.state.input}set value(e){this.state.value=e}get value(){let{input:e,value:r}=this.state,i=[r,e].find(this.isValue.bind(this));return this.isValue(i)?i:this.initial}static get prompt(){return e=>new this(e).run()}};function Dqe(t){let e=n=>t[n]===void 0||typeof t[n]=="function",r=["actions","choices","initial","margin","roles","styles","symbols","theme","timers","value"],i=["body","footer","error","header","hint","indicator","message","prefix","separator","skip"];for(let n of Object.keys(t.options)){if(r.includes(n)||/^on[A-Z]/.test(n))continue;let s=t.options[n];typeof s=="function"&&e(n)?i.includes(n)||(t[n]=s.bind(t)):typeof t[n]!="function"&&(t[n]=s)}}function Rqe(t){typeof t=="number"&&(t=[t,t,t,t]);let e=[].concat(t||[]),r=n=>n%2==0?` -`:" ",i=[];for(let n=0;n<4;n++){let s=r(n);e[n]?i.push(s.repeat(e[n])):i.push("")}return i}$ie.exports=V0});var ine=w((Lpt,tne)=>{"use strict";var Fqe=Xi(),rne={default(t,e){return e},checkbox(t,e){throw new Error("checkbox role is not implemented yet")},editable(t,e){throw new Error("editable role is not implemented yet")},expandable(t,e){throw new Error("expandable role is not implemented yet")},heading(t,e){return e.disabled="",e.indicator=[e.indicator," "].find(r=>r!=null),e.message=e.message||"",e},input(t,e){throw new Error("input role is not implemented yet")},option(t,e){return rne.default(t,e)},radio(t,e){throw new Error("radio role is not implemented yet")},separator(t,e){return e.disabled="",e.indicator=[e.indicator," "].find(r=>r!=null),e.message=e.message||t.symbols.line.repeat(5),e},spacer(t,e){return e}};tne.exports=(t,e={})=>{let r=Fqe.merge({},rne,e.roles);return r[t]||r.default}});var ZC=w((Tpt,nne)=>{"use strict";var Nqe=mo(),Lqe=Vf(),Tqe=ine(),X0=Xi(),{reorder:IN,scrollUp:Oqe,scrollDown:Mqe,isObject:sne,swap:Kqe}=X0,one=class extends Lqe{constructor(e){super(e);this.cursorHide(),this.maxSelected=e.maxSelected||Infinity,this.multiple=e.multiple||!1,this.initial=e.initial||0,this.delay=e.delay||0,this.longest=0,this.num=""}async initialize(){typeof this.options.initial=="function"&&(this.initial=await this.options.initial.call(this)),await this.reset(!0),await super.initialize()}async reset(){let{choices:e,initial:r,autofocus:i,suggest:n}=this.options;if(this.state._choices=[],this.state.choices=[],this.choices=await Promise.all(await this.toChoices(e)),this.choices.forEach(s=>s.enabled=!1),typeof n!="function"&&this.selectable.length===0)throw new Error("At least one choice must be selectable");sne(r)&&(r=Object.keys(r)),Array.isArray(r)?(i!=null&&(this.index=this.findIndex(i)),r.forEach(s=>this.enable(this.find(s))),await this.render()):(i!=null&&(r=i),typeof r=="string"&&(r=this.findIndex(r)),typeof r=="number"&&r>-1&&(this.index=Math.max(0,Math.min(r,this.choices.length)),this.enable(this.find(this.index)))),this.isDisabled(this.focused)&&await this.down()}async toChoices(e,r){this.state.loadingChoices=!0;let i=[],n=0,s=async(o,a)=>{typeof o=="function"&&(o=await o.call(this)),o instanceof Promise&&(o=await o);for(let l=0;l(this.state.loadingChoices=!1,o))}async toChoice(e,r,i){if(typeof e=="function"&&(e=await e.call(this,this)),e instanceof Promise&&(e=await e),typeof e=="string"&&(e={name:e}),e.normalized)return e;e.normalized=!0;let n=e.value;if(e=Tqe(e.role,this.options)(this,e),typeof e.disabled=="string"&&!e.hint&&(e.hint=e.disabled,e.disabled=!0),e.disabled===!0&&e.hint==null&&(e.hint="(disabled)"),e.index!=null)return e;e.name=e.name||e.key||e.title||e.value||e.message,e.message=e.message||e.name||"",e.value=[e.value,e.name].find(this.isValue.bind(this)),e.input="",e.index=r,e.cursor=0,X0.define(e,"parent",i),e.level=i?i.level+1:1,e.indent==null&&(e.indent=i?i.indent+" ":e.indent||""),e.path=i?i.path+"."+e.name:e.name,e.enabled=!!(this.multiple&&!this.isDisabled(e)&&(e.enabled||this.isSelected(e))),this.isDisabled(e)||(this.longest=Math.max(this.longest,Nqe.unstyle(e.message).length));let o=N({},e);return e.reset=(a=o.input,l=o.value)=>{for(let c of Object.keys(o))e[c]=o[c];e.input=a,e.value=l},n==null&&typeof e.initial=="function"&&(e.input=await e.initial.call(this,this.state,e,r)),e}async onChoice(e,r){this.emit("choice",e,r,this),typeof e.onChoice=="function"&&await e.onChoice.call(this,this.state,e,r)}async addChoice(e,r,i){let n=await this.toChoice(e,r,i);return this.choices.push(n),this.index=this.choices.length-1,this.limit=this.choices.length,n}async newItem(e,r,i){let n=N({name:"New choice name?",editable:!0,newChoice:!0},e),s=await this.addChoice(n,r,i);return s.updateChoice=()=>{delete s.newChoice,s.name=s.message=s.input,s.input="",s.cursor=0},this.render()}indent(e){return e.indent==null?e.level>1?" ".repeat(e.level-1):"":e.indent}dispatch(e,r){if(this.multiple&&this[r.name])return this[r.name]();this.alert()}focus(e,r){return typeof r!="boolean"&&(r=e.enabled),r&&!e.enabled&&this.selected.length>=this.maxSelected?this.alert():(this.index=e.index,e.enabled=r&&!this.isDisabled(e),e)}space(){return this.multiple?(this.toggle(this.focused),this.render()):this.alert()}a(){if(this.maxSelectedr.enabled);return this.choices.forEach(r=>r.enabled=!e),this.render()}i(){return this.choices.length-this.selected.length>this.maxSelected?this.alert():(this.choices.forEach(e=>e.enabled=!e.enabled),this.render())}g(e=this.focused){return this.choices.some(r=>!!r.parent)?(this.toggle(e.parent&&!e.choices?e.parent:e),this.render()):this.a()}toggle(e,r){if(!e.enabled&&this.selected.length>=this.maxSelected)return this.alert();typeof r!="boolean"&&(r=!e.enabled),e.enabled=r,e.choices&&e.choices.forEach(n=>this.toggle(n,r));let i=e.parent;for(;i;){let n=i.choices.filter(s=>this.isDisabled(s));i.enabled=n.every(s=>s.enabled===!0),i=i.parent}return ane(this,this.choices),this.emit("toggle",e,this),e}enable(e){return this.selected.length>=this.maxSelected?this.alert():(e.enabled=!this.isDisabled(e),e.choices&&e.choices.forEach(this.enable.bind(this)),e)}disable(e){return e.enabled=!1,e.choices&&e.choices.forEach(this.disable.bind(this)),e}number(e){this.num+=e;let r=i=>{let n=Number(i);if(n>this.choices.length-1)return this.alert();let s=this.focused,o=this.choices.find(a=>n===a.index);if(!o.enabled&&this.selected.length>=this.maxSelected)return this.alert();if(this.visible.indexOf(o)===-1){let a=IN(this.choices),l=a.indexOf(o);if(s.index>l){let c=a.slice(l,l+this.limit),u=a.filter(g=>!c.includes(g));this.choices=c.concat(u)}else{let c=l-this.limit+1;this.choices=a.slice(c).concat(a.slice(0,c))}}return this.index=this.choices.indexOf(o),this.toggle(this.focused),this.render()};return clearTimeout(this.numberTimeout),new Promise(i=>{let n=this.choices.length,s=this.num,o=(a=!1,l)=>{clearTimeout(this.numberTimeout),a&&(l=r(s)),this.num="",i(l)};if(s==="0"||s.length===1&&Number(s+"0")>n)return o(!0);if(Number(s)>n)return o(!1,this.alert());this.numberTimeout=setTimeout(()=>o(!0),this.delay)})}home(){return this.choices=IN(this.choices),this.index=0,this.render()}end(){let e=this.choices.length-this.limit,r=IN(this.choices);return this.choices=r.slice(e).concat(r.slice(0,e)),this.index=this.limit-1,this.render()}first(){return this.index=0,this.render()}last(){return this.index=this.visible.length-1,this.render()}prev(){return this.visible.length<=1?this.alert():this.up()}next(){return this.visible.length<=1?this.alert():this.down()}right(){return this.cursor>=this.input.length?this.alert():(this.cursor++,this.render())}left(){return this.cursor<=0?this.alert():(this.cursor--,this.render())}up(){let e=this.choices.length,r=this.visible.length,i=this.index;return this.options.scroll===!1&&i===0?this.alert():e>r&&i===0?this.scrollUp():(this.index=(i-1%e+e)%e,this.isDisabled()?this.up():this.render())}down(){let e=this.choices.length,r=this.visible.length,i=this.index;return this.options.scroll===!1&&i===r-1?this.alert():e>r&&i===r-1?this.scrollDown():(this.index=(i+1)%e,this.isDisabled()?this.down():this.render())}scrollUp(e=0){return this.choices=Oqe(this.choices),this.index=e,this.isDisabled()?this.up():this.render()}scrollDown(e=this.visible.length-1){return this.choices=Mqe(this.choices),this.index=e,this.isDisabled()?this.down():this.render()}async shiftUp(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index-1),await this.up(),this.sorting=!1;return}return this.scrollUp(this.index)}async shiftDown(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index+1),await this.down(),this.sorting=!1;return}return this.scrollDown(this.index)}pageUp(){return this.visible.length<=1?this.alert():(this.limit=Math.max(this.limit-1,0),this.index=Math.min(this.limit-1,this.index),this._limit=this.limit,this.isDisabled()?this.up():this.render())}pageDown(){return this.visible.length>=this.choices.length?this.alert():(this.index=Math.max(0,this.index),this.limit=Math.min(this.limit+1,this.choices.length),this._limit=this.limit,this.isDisabled()?this.down():this.render())}swap(e){Kqe(this.choices,this.index,e)}isDisabled(e=this.focused){return e&&["disabled","collapsed","hidden","completing","readonly"].some(i=>e[i]===!0)?!0:e&&e.role==="heading"}isEnabled(e=this.focused){if(Array.isArray(e))return e.every(r=>this.isEnabled(r));if(e.choices){let r=e.choices.filter(i=>!this.isDisabled(i));return e.enabled&&r.every(i=>this.isEnabled(i))}return e.enabled&&!this.isDisabled(e)}isChoice(e,r){return e.name===r||e.index===Number(r)}isSelected(e){return Array.isArray(this.initial)?this.initial.some(r=>this.isChoice(e,r)):this.isChoice(e,this.initial)}map(e=[],r="value"){return[].concat(e||[]).reduce((i,n)=>(i[n]=this.find(n,r),i),{})}filter(e,r){let i=(a,l)=>[a.name,l].includes(e),n=typeof e=="function"?e:i,o=(this.options.multiple?this.state._choices:this.choices).filter(n);return r?o.map(a=>a[r]):o}find(e,r){if(sne(e))return r?e[r]:e;let i=(o,a)=>[o.name,a].includes(e),n=typeof e=="function"?e:i,s=this.choices.find(n);if(s)return r?s[r]:s}findIndex(e){return this.choices.indexOf(this.find(e))}async submit(){let e=this.focused;if(!e)return this.alert();if(e.newChoice)return e.input?(e.updateChoice(),this.render()):this.alert();if(this.choices.some(o=>o.newChoice))return this.alert();let{reorder:r,sort:i}=this.options,n=this.multiple===!0,s=this.selected;return s===void 0?this.alert():(Array.isArray(s)&&r!==!1&&i!==!0&&(s=X0.reorder(s)),this.value=n?s.map(o=>o.name):s.name,super.submit())}set choices(e=[]){this.state._choices=this.state._choices||[],this.state.choices=e;for(let r of e)this.state._choices.some(i=>i.name===r.name)||this.state._choices.push(r);if(!this._initial&&this.options.initial){this._initial=!0;let r=this.initial;if(typeof r=="string"||typeof r=="number"){let i=this.find(r);i&&(this.initial=i.index,this.focus(i,!0))}}}get choices(){return ane(this,this.state.choices||[])}set visible(e){this.state.visible=e}get visible(){return(this.state.visible||this.choices).slice(0,this.limit)}set limit(e){this.state.limit=e}get limit(){let{state:e,options:r,choices:i}=this,n=e.limit||this._limit||r.limit||i.length;return Math.min(n,this.height)}set value(e){super.value=e}get value(){return typeof super.value!="string"&&super.value===this.initial?this.input:super.value}set index(e){this.state.index=e}get index(){return Math.max(0,this.state?this.state.index:0)}get enabled(){return this.filter(this.isEnabled.bind(this))}get focused(){let e=this.choices[this.index];return e&&this.state.submitted&&this.multiple!==!0&&(e.enabled=!0),e}get selectable(){return this.choices.filter(e=>!this.isDisabled(e))}get selected(){return this.multiple?this.enabled:this.focused}};function ane(t,e){if(e instanceof Promise)return e;if(typeof e=="function"){if(X0.isAsyncFn(e))return e;e=e.call(t,t)}for(let r of e){if(Array.isArray(r.choices)){let i=r.choices.filter(n=>!t.isDisabled(n));r.enabled=i.every(n=>n.enabled===!0)}t.isDisabled(r)===!0&&delete r.enabled}return e}nne.exports=one});var xl=w((Opt,Ane)=>{"use strict";var Uqe=ZC(),yN=Xi(),lne=class extends Uqe{constructor(e){super(e);this.emptyError=this.options.emptyError||"No items were selected"}async dispatch(e,r){if(this.multiple)return this[r.name]?await this[r.name](e,r):await super.dispatch(e,r);this.alert()}separator(){if(this.options.separator)return super.separator();let e=this.styles.muted(this.symbols.ellipsis);return this.state.submitted?super.separator():e}pointer(e,r){return!this.multiple||this.options.pointer?super.pointer(e,r):""}indicator(e,r){return this.multiple?super.indicator(e,r):""}choiceMessage(e,r){let i=this.resolve(e.message,this.state,e,r);return e.role==="heading"&&!yN.hasColor(i)&&(i=this.styles.strong(i)),this.resolve(i,this.state,e,r)}choiceSeparator(){return":"}async renderChoice(e,r){await this.onChoice(e,r);let i=this.index===r,n=await this.pointer(e,r),s=await this.indicator(e,r)+(e.pad||""),o=await this.resolve(e.hint,this.state,e,r);o&&!yN.hasColor(o)&&(o=this.styles.muted(o));let a=this.indent(e),l=await this.choiceMessage(e,r),c=()=>[this.margin[3],a+n+s,l,this.margin[1],o].filter(Boolean).join(" ");return e.role==="heading"?c():e.disabled?(yN.hasColor(l)||(l=this.styles.disabled(l)),c()):(i&&(l=this.styles.em(l)),c())}async renderChoices(){if(this.state.loading==="choices")return this.styles.warning("Loading choices");if(this.state.submitted)return"";let e=this.visible.map(async(s,o)=>await this.renderChoice(s,o)),r=await Promise.all(e);r.length||r.push(this.styles.danger("No matching choices"));let i=this.margin[0]+r.join(` -`),n;return this.options.choicesHeader&&(n=await this.resolve(this.options.choicesHeader,this.state)),[n,i].filter(Boolean).join(` -`)}format(){return!this.state.submitted||this.state.cancelled?"":Array.isArray(this.selected)?this.selected.map(e=>this.styles.primary(e.name)).join(", "):this.styles.primary(this.selected.name)}async render(){let{submitted:e,size:r}=this.state,i="",n=await this.header(),s=await this.prefix(),o=await this.separator(),a=await this.message();this.options.promptLine!==!1&&(i=[s,a,o,""].join(" "),this.state.prompt=i);let l=await this.format(),c=await this.error()||await this.hint(),u=await this.renderChoices(),g=await this.footer();l&&(i+=l),c&&!i.includes(c)&&(i+=" "+c),e&&!l&&!u.trim()&&this.multiple&&this.emptyError!=null&&(i+=this.styles.danger(this.emptyError)),this.clear(r),this.write([n,i,u,g].filter(Boolean).join(` -`)),this.write(this.margin[2]),this.restore()}};Ane.exports=lne});var gne=w((Mpt,cne)=>{"use strict";var Hqe=xl(),Gqe=(t,e)=>{let r=t.toLowerCase();return i=>{let s=i.toLowerCase().indexOf(r),o=e(i.slice(s,s+r.length));return s>=0?i.slice(0,s)+o+i.slice(s+r.length):i}},une=class extends Hqe{constructor(e){super(e);this.cursorShow()}moveCursor(e){this.state.cursor+=e}dispatch(e){return this.append(e)}space(e){return this.options.multiple?super.space(e):this.append(e)}append(e){let{cursor:r,input:i}=this.state;return this.input=i.slice(0,r)+e+i.slice(r),this.moveCursor(1),this.complete()}delete(){let{cursor:e,input:r}=this.state;return r?(this.input=r.slice(0,e-1)+r.slice(e),this.moveCursor(-1),this.complete()):this.alert()}deleteForward(){let{cursor:e,input:r}=this.state;return r[e]===void 0?this.alert():(this.input=`${r}`.slice(0,e)+`${r}`.slice(e+1),this.complete())}number(e){return this.append(e)}async complete(){this.completing=!0,this.choices=await this.suggest(this.input,this.state._choices),this.state.limit=void 0,this.index=Math.min(Math.max(this.visible.length-1,0),this.index),await this.render(),this.completing=!1}suggest(e=this.input,r=this.state._choices){if(typeof this.options.suggest=="function")return this.options.suggest.call(this,e,r);let i=e.toLowerCase();return r.filter(n=>n.message.toLowerCase().includes(i))}pointer(){return""}format(){if(!this.focused)return this.input;if(this.options.multiple&&this.state.submitted)return this.selected.map(e=>this.styles.primary(e.message)).join(", ");if(this.state.submitted){let e=this.value=this.input=this.focused.value;return this.styles.primary(e)}return this.input}async render(){if(this.state.status!=="pending")return super.render();let e=this.options.highlight?this.options.highlight.bind(this):this.styles.placeholder,r=Gqe(this.input,e),i=this.choices;this.choices=i.map(n=>ie(N({},n),{message:r(n.message)})),await super.render(),this.choices=i}submit(){return this.options.multiple&&(this.value=this.selected.map(e=>e.name)),super.submit()}};cne.exports=une});var BN=w((Kpt,fne)=>{"use strict";var wN=Xi();fne.exports=(t,e={})=>{t.cursorHide();let{input:r="",initial:i="",pos:n,showCursor:s=!0,color:o}=e,a=o||t.styles.placeholder,l=wN.inverse(t.styles.primary),c=m=>l(t.styles.black(m)),u=r,g=" ",f=c(g);if(t.blink&&t.blink.off===!0&&(c=m=>m,f=""),s&&n===0&&i===""&&r==="")return c(g);if(s&&n===0&&(r===i||r===""))return c(i[0])+a(i.slice(1));i=wN.isPrimitive(i)?`${i}`:"",r=wN.isPrimitive(r)?`${r}`:"";let h=i&&i.startsWith(r)&&i!==r,p=h?c(i[r.length]):f;if(n!==r.length&&s===!0&&(u=r.slice(0,n)+c(r[n])+r.slice(n+1),p=""),s===!1&&(p=""),h){let m=t.styles.unstyle(u+p);return u+p+a(i.slice(m.length))}return u+p}});var Z0=w((Upt,hne)=>{"use strict";var jqe=mo(),Yqe=xl(),qqe=BN(),pne=class extends Yqe{constructor(e){super(ie(N({},e),{multiple:!0}));this.type="form",this.initial=this.options.initial,this.align=[this.options.align,"right"].find(r=>r!=null),this.emptyError="",this.values={}}async reset(e){return await super.reset(),e===!0&&(this._index=this.index),this.index=this._index,this.values={},this.choices.forEach(r=>r.reset&&r.reset()),this.render()}dispatch(e){return!!e&&this.append(e)}append(e){let r=this.focused;if(!r)return this.alert();let{cursor:i,input:n}=r;return r.value=r.input=n.slice(0,i)+e+n.slice(i),r.cursor++,this.render()}delete(){let e=this.focused;if(!e||e.cursor<=0)return this.alert();let{cursor:r,input:i}=e;return e.value=e.input=i.slice(0,r-1)+i.slice(r),e.cursor--,this.render()}deleteForward(){let e=this.focused;if(!e)return this.alert();let{cursor:r,input:i}=e;if(i[r]===void 0)return this.alert();let n=`${i}`.slice(0,r)+`${i}`.slice(r+1);return e.value=e.input=n,this.render()}right(){let e=this.focused;return e?e.cursor>=e.input.length?this.alert():(e.cursor++,this.render()):this.alert()}left(){let e=this.focused;return e?e.cursor<=0?this.alert():(e.cursor--,this.render()):this.alert()}space(e,r){return this.dispatch(e,r)}number(e,r){return this.dispatch(e,r)}next(){let e=this.focused;if(!e)return this.alert();let{initial:r,input:i}=e;return r&&r.startsWith(i)&&i!==r?(e.value=e.input=r,e.cursor=e.value.length,this.render()):super.next()}prev(){let e=this.focused;return e?e.cursor===0?super.prev():(e.value=e.input="",e.cursor=0,this.render()):this.alert()}separator(){return""}format(e){return this.state.submitted?"":super.format(e)}pointer(){return""}indicator(e){return e.input?"\u29BF":"\u2299"}async choiceSeparator(e,r){let i=await this.resolve(e.separator,this.state,e,r)||":";return i?" "+this.styles.disabled(i):""}async renderChoice(e,r){await this.onChoice(e,r);let{state:i,styles:n}=this,{cursor:s,initial:o="",name:a,hint:l,input:c=""}=e,{muted:u,submitted:g,primary:f,danger:h}=n,p=l,m=this.index===r,y=e.validate||(()=>!0),b=await this.choiceSeparator(e,r),S=e.message;this.align==="right"&&(S=S.padStart(this.longest+1," ")),this.align==="left"&&(S=S.padEnd(this.longest+1," "));let k=this.values[a]=c||o,T=c?"success":"dark";await y.call(e,k,this.state)!==!0&&(T="danger");let j=n[T](await this.indicator(e,r))+(e.pad||""),Z=this.indent(e),J=()=>[Z,j,S+b,c,p].filter(Boolean).join(" ");if(i.submitted)return S=jqe.unstyle(S),c=g(c),p="",J();if(e.format)c=await e.format.call(this,c,e,r);else{let re=this.styles.muted;c=qqe(this,{input:c,initial:o,pos:s,showCursor:m,color:re})}return this.isValue(c)||(c=this.styles.muted(this.symbols.ellipsis)),e.result&&(this.values[a]=await e.result.call(this,k,e,r)),m&&(S=f(S)),e.error?c+=(c?" ":"")+h(e.error.trim()):e.hint&&(c+=(c?" ":"")+u(e.hint.trim())),J()}async submit(){return this.value=this.values,super.base.submit.call(this)}};hne.exports=pne});var bN=w((Hpt,dne)=>{"use strict";var Jqe=Z0(),Wqe=()=>{throw new Error("expected prompt to have a custom authenticate method")},Cne=(t=Wqe)=>{class e extends Jqe{constructor(i){super(i)}async submit(){this.value=await t.call(this,this.values,this.state),super.base.submit.call(this)}static create(i){return Cne(i)}}return e};dne.exports=Cne()});var Ine=w((Gpt,mne)=>{"use strict";var zqe=bN();function _qe(t,e){return t.username===this.options.username&&t.password===this.options.password}var Ene=(t=_qe)=>{let e=[{name:"username",message:"username"},{name:"password",message:"password",format(i){return this.options.showPassword?i:(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(i.length))}}];class r extends zqe.create(t){constructor(n){super(ie(N({},n),{choices:e}))}static create(n){return Ene(n)}}return r};mne.exports=Ene()});var $0=w((jpt,yne)=>{"use strict";var Vqe=Vf(),{isPrimitive:Xqe,hasColor:Zqe}=Xi(),wne=class extends Vqe{constructor(e){super(e);this.cursorHide()}async initialize(){let e=await this.resolve(this.initial,this.state);this.input=await this.cast(e),await super.initialize()}dispatch(e){return this.isValue(e)?(this.input=e,this.submit()):this.alert()}format(e){let{styles:r,state:i}=this;return i.submitted?r.success(e):r.primary(e)}cast(e){return this.isTrue(e)}isTrue(e){return/^[ty1]/i.test(e)}isFalse(e){return/^[fn0]/i.test(e)}isValue(e){return Xqe(e)&&(this.isTrue(e)||this.isFalse(e))}async hint(){if(this.state.status==="pending"){let e=await this.element("hint");return Zqe(e)?e:this.styles.muted(e)}}async render(){let{input:e,size:r}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o=this.styles.muted(this.default),a=[i,s,o,n].filter(Boolean).join(" ");this.state.prompt=a;let l=await this.header(),c=this.value=this.cast(e),u=await this.format(c),g=await this.error()||await this.hint(),f=await this.footer();g&&!a.includes(g)&&(u+=" "+g),a+=" "+u,this.clear(r),this.write([l,a,f].filter(Boolean).join(` -`)),this.restore()}set value(e){super.value=e}get value(){return this.cast(super.value)}};yne.exports=wne});var Qne=w((Ypt,Bne)=>{"use strict";var $qe=$0(),bne=class extends $qe{constructor(e){super(e);this.default=this.options.default||(this.initial?"(Y/n)":"(y/N)")}};Bne.exports=bne});var kne=w((qpt,vne)=>{"use strict";var eJe=xl(),tJe=Z0(),Xf=tJe.prototype,Sne=class extends eJe{constructor(e){super(ie(N({},e),{multiple:!0}));this.align=[this.options.align,"left"].find(r=>r!=null),this.emptyError="",this.values={}}dispatch(e,r){let i=this.focused,n=i.parent||{};return!i.editable&&!n.editable&&(e==="a"||e==="i")?super[e]():Xf.dispatch.call(this,e,r)}append(e,r){return Xf.append.call(this,e,r)}delete(e,r){return Xf.delete.call(this,e,r)}space(e){return this.focused.editable?this.append(e):super.space()}number(e){return this.focused.editable?this.append(e):super.number(e)}next(){return this.focused.editable?Xf.next.call(this):super.next()}prev(){return this.focused.editable?Xf.prev.call(this):super.prev()}async indicator(e,r){let i=e.indicator||"",n=e.editable?i:super.indicator(e,r);return await this.resolve(n,this.state,e,r)||""}indent(e){return e.role==="heading"?"":e.editable?" ":" "}async renderChoice(e,r){return e.indent="",e.editable?Xf.renderChoice.call(this,e,r):super.renderChoice(e,r)}error(){return""}footer(){return this.state.error}async validate(){let e=!0;for(let r of this.choices){if(typeof r.validate!="function"||r.role==="heading")continue;let i=r.parent?this.value[r.parent.name]:this.value;if(r.editable?i=r.value===r.name?r.initial||"":r.value:this.isDisabled(r)||(i=r.enabled===!0),e=await r.validate(i,this.state),e!==!0)break}return e!==!0&&(this.state.error=typeof e=="string"?e:"Invalid Input"),e}submit(){if(this.focused.newChoice===!0)return super.submit();if(this.choices.some(e=>e.newChoice))return this.alert();this.value={};for(let e of this.choices){let r=e.parent?this.value[e.parent.name]:this.value;if(e.role==="heading"){this.value[e.name]={};continue}e.editable?r[e.name]=e.value===e.name?e.initial||"":e.value:this.isDisabled(e)||(r[e.name]=e.enabled===!0)}return this.base.submit.call(this)}};vne.exports=Sne});var Iu=w((Jpt,xne)=>{"use strict";var rJe=Vf(),iJe=BN(),{isPrimitive:nJe}=Xi(),Pne=class extends rJe{constructor(e){super(e);this.initial=nJe(this.initial)?String(this.initial):"",this.initial&&this.cursorHide(),this.state.prevCursor=0,this.state.clipboard=[]}async keypress(e,r={}){let i=this.state.prevKeypress;return this.state.prevKeypress=r,this.options.multiline===!0&&r.name==="return"&&(!i||i.name!=="return")?this.append(` -`,r):super.keypress(e,r)}moveCursor(e){this.cursor+=e}reset(){return this.input=this.value="",this.cursor=0,this.render()}dispatch(e,r){if(!e||r.ctrl||r.code)return this.alert();this.append(e)}append(e){let{cursor:r,input:i}=this.state;this.input=`${i}`.slice(0,r)+e+`${i}`.slice(r),this.moveCursor(String(e).length),this.render()}insert(e){this.append(e)}delete(){let{cursor:e,input:r}=this.state;if(e<=0)return this.alert();this.input=`${r}`.slice(0,e-1)+`${r}`.slice(e),this.moveCursor(-1),this.render()}deleteForward(){let{cursor:e,input:r}=this.state;if(r[e]===void 0)return this.alert();this.input=`${r}`.slice(0,e)+`${r}`.slice(e+1),this.render()}cutForward(){let e=this.cursor;if(this.input.length<=e)return this.alert();this.state.clipboard.push(this.input.slice(e)),this.input=this.input.slice(0,e),this.render()}cutLeft(){let e=this.cursor;if(e===0)return this.alert();let r=this.input.slice(0,e),i=this.input.slice(e),n=r.split(" ");this.state.clipboard.push(n.pop()),this.input=n.join(" "),this.cursor=this.input.length,this.input+=i,this.render()}paste(){if(!this.state.clipboard.length)return this.alert();this.insert(this.state.clipboard.pop()),this.render()}toggleCursor(){this.state.prevCursor?(this.cursor=this.state.prevCursor,this.state.prevCursor=0):(this.state.prevCursor=this.cursor,this.cursor=0),this.render()}first(){this.cursor=0,this.render()}last(){this.cursor=this.input.length-1,this.render()}next(){let e=this.initial!=null?String(this.initial):"";if(!e||!e.startsWith(this.input))return this.alert();this.input=this.initial,this.cursor=this.initial.length,this.render()}prev(){if(!this.input)return this.alert();this.reset()}backward(){return this.left()}forward(){return this.right()}right(){return this.cursor>=this.input.length?this.alert():(this.moveCursor(1),this.render())}left(){return this.cursor<=0?this.alert():(this.moveCursor(-1),this.render())}isValue(e){return!!e}async format(e=this.value){let r=await this.resolve(this.initial,this.state);return this.state.submitted?this.styles.submitted(e||r):iJe(this,{input:e,initial:r,pos:this.cursor})}async render(){let e=this.state.size,r=await this.prefix(),i=await this.separator(),n=await this.message(),s=[r,n,i].filter(Boolean).join(" ");this.state.prompt=s;let o=await this.header(),a=await this.format(),l=await this.error()||await this.hint(),c=await this.footer();l&&!a.includes(l)&&(a+=" "+l),s+=" "+a,this.clear(e),this.write([o,s,c].filter(Boolean).join(` -`)),this.restore()}};xne.exports=Pne});var Rne=w((Wpt,Dne)=>{"use strict";var sJe=t=>t.filter((e,r)=>t.lastIndexOf(e)===r),eb=t=>sJe(t).filter(Boolean);Dne.exports=(t,e={},r="")=>{let{past:i=[],present:n=""}=e,s,o;switch(t){case"prev":case"undo":return s=i.slice(0,i.length-1),o=i[i.length-1]||"",{past:eb([r,...s]),present:o};case"next":case"redo":return s=i.slice(1),o=i[0]||"",{past:eb([...s,r]),present:o};case"save":return{past:eb([...i,r]),present:""};case"remove":return o=eb(i.filter(a=>a!==r)),n="",o.length&&(n=o.pop()),{past:o,present:n};default:throw new Error(`Invalid action: "${t}"`)}}});var QN=w((zpt,Fne)=>{"use strict";var oJe=Iu(),Nne=Rne(),Lne=class extends oJe{constructor(e){super(e);let r=this.options.history;if(r&&r.store){let i=r.values||this.initial;this.autosave=!!r.autosave,this.store=r.store,this.data=this.store.get("values")||{past:[],present:i},this.initial=this.data.present||this.data.past[this.data.past.length-1]}}completion(e){return this.store?(this.data=Nne(e,this.data,this.input),this.data.present?(this.input=this.data.present,this.cursor=this.input.length,this.render()):this.alert()):this.alert()}altUp(){return this.completion("prev")}altDown(){return this.completion("next")}prev(){return this.save(),super.prev()}save(){!this.store||(this.data=Nne("save",this.data,this.input),this.store.set("values",this.data))}submit(){return this.store&&this.autosave===!0&&this.save(),super.submit()}};Fne.exports=Lne});var Mne=w((_pt,Tne)=>{"use strict";var aJe=Iu(),One=class extends aJe{format(){return""}};Tne.exports=One});var Hne=w((Vpt,Kne)=>{"use strict";var AJe=Iu(),Une=class extends AJe{constructor(e={}){super(e);this.sep=this.options.separator||/, */,this.initial=e.initial||""}split(e=this.value){return e?String(e).split(this.sep):[]}format(){let e=this.state.submitted?this.styles.primary:r=>r;return this.list.map(e).join(", ")}async submit(e){let r=this.state.error||await this.validate(this.list,this.state);return r!==!0?(this.state.error=r,super.submit()):(this.value=this.list,super.submit())}get list(){return this.split()}};Kne.exports=Une});var Yne=w((Xpt,Gne)=>{"use strict";var lJe=xl(),jne=class extends lJe{constructor(e){super(ie(N({},e),{multiple:!0}))}};Gne.exports=jne});var vN=w((Zpt,qne)=>{"use strict";var cJe=Iu(),Jne=class extends cJe{constructor(e={}){super(N({style:"number"},e));this.min=this.isValue(e.min)?this.toNumber(e.min):-Infinity,this.max=this.isValue(e.max)?this.toNumber(e.max):Infinity,this.delay=e.delay!=null?e.delay:1e3,this.float=e.float!==!1,this.round=e.round===!0||e.float===!1,this.major=e.major||10,this.minor=e.minor||1,this.initial=e.initial!=null?e.initial:"",this.input=String(this.initial),this.cursor=this.input.length,this.cursorShow()}append(e){return!/[-+.]/.test(e)||e==="."&&this.input.includes(".")?this.alert("invalid number"):super.append(e)}number(e){return super.append(e)}next(){return this.input&&this.input!==this.initial?this.alert():this.isValue(this.initial)?(this.input=this.initial,this.cursor=String(this.initial).length,this.render()):this.alert()}up(e){let r=e||this.minor,i=this.toNumber(this.input);return i>this.max+r?this.alert():(this.input=`${i+r}`,this.render())}down(e){let r=e||this.minor,i=this.toNumber(this.input);return ithis.isValue(r));return this.value=this.toNumber(e||0),super.submit()}};qne.exports=Jne});var zne=w(($pt,Wne)=>{Wne.exports=vN()});var Xne=w((edt,_ne)=>{"use strict";var uJe=Iu(),Vne=class extends uJe{constructor(e){super(e);this.cursorShow()}format(e=this.input){return this.keypressed?(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(e.length)):""}};_ne.exports=Vne});var tse=w((tdt,Zne)=>{"use strict";var gJe=mo(),fJe=ZC(),$ne=Xi(),ese=class extends fJe{constructor(e={}){super(e);this.widths=[].concat(e.messageWidth||50),this.align=[].concat(e.align||"left"),this.linebreak=e.linebreak||!1,this.edgeLength=e.edgeLength||3,this.newline=e.newline||` - `;let r=e.startNumber||1;typeof this.scale=="number"&&(this.scaleKey=!1,this.scale=Array(this.scale).fill(0).map((i,n)=>({name:n+r})))}async reset(){return this.tableized=!1,await super.reset(),this.render()}tableize(){if(this.tableized===!0)return;this.tableized=!0;let e=0;for(let r of this.choices){e=Math.max(e,r.message.length),r.scaleIndex=r.initial||2,r.scale=[];for(let i=0;i=this.scale.length-1?this.alert():(e.scaleIndex++,this.render())}left(){let e=this.focused;return e.scaleIndex<=0?this.alert():(e.scaleIndex--,this.render())}indent(){return""}format(){return this.state.submitted?this.choices.map(r=>this.styles.info(r.index)).join(", "):""}pointer(){return""}renderScaleKey(){if(this.scaleKey===!1||this.state.submitted)return"";let e=this.scale.map(i=>` ${i.name} - ${i.message}`);return["",...e].map(i=>this.styles.muted(i)).join(` -`)}renderScaleHeading(e){let r=this.scale.map(l=>l.name);typeof this.options.renderScaleHeading=="function"&&(r=this.options.renderScaleHeading.call(this,e));let i=this.scaleLength-r.join("").length,n=Math.round(i/(r.length-1)),o=r.map(l=>this.styles.strong(l)).join(" ".repeat(n)),a=" ".repeat(this.widths[0]);return this.margin[3]+a+this.margin[1]+o}scaleIndicator(e,r,i){if(typeof this.options.scaleIndicator=="function")return this.options.scaleIndicator.call(this,e,r,i);let n=e.scaleIndex===r.index;return r.disabled?this.styles.hint(this.symbols.radio.disabled):n?this.styles.success(this.symbols.radio.on):this.symbols.radio.off}renderScale(e,r){let i=e.scale.map(s=>this.scaleIndicator(e,s,r)),n=this.term==="Hyper"?"":" ";return i.join(n+this.symbols.line.repeat(this.edgeLength))}async renderChoice(e,r){await this.onChoice(e,r);let i=this.index===r,n=await this.pointer(e,r),s=await e.hint;s&&!$ne.hasColor(s)&&(s=this.styles.muted(s));let o=p=>this.margin[3]+p.replace(/\s+$/,"").padEnd(this.widths[0]," "),a=this.newline,l=this.indent(e),c=await this.resolve(e.message,this.state,e,r),u=await this.renderScale(e,r),g=this.margin[1]+this.margin[3];this.scaleLength=gJe.unstyle(u).length,this.widths[0]=Math.min(this.widths[0],this.width-this.scaleLength-g.length);let h=$ne.wordWrap(c,{width:this.widths[0],newline:a}).split(` -`).map(p=>o(p)+this.margin[1]);return i&&(u=this.styles.info(u),h=h.map(p=>this.styles.info(p))),h[0]+=u,this.linebreak&&h.push(""),[l+n,h.join(` -`)].filter(Boolean)}async renderChoices(){if(this.state.submitted)return"";this.tableize();let e=this.visible.map(async(n,s)=>await this.renderChoice(n,s)),r=await Promise.all(e),i=await this.renderScaleHeading();return this.margin[0]+[i,...r.map(n=>n.join(" "))].join(` -`)}async render(){let{submitted:e,size:r}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o="";this.options.promptLine!==!1&&(o=[i,s,n,""].join(" "),this.state.prompt=o);let a=await this.header(),l=await this.format(),c=await this.renderScaleKey(),u=await this.error()||await this.hint(),g=await this.renderChoices(),f=await this.footer(),h=this.emptyError;l&&(o+=l),u&&!o.includes(u)&&(o+=" "+u),e&&!l&&!g.trim()&&this.multiple&&h!=null&&(o+=this.styles.danger(h)),this.clear(r),this.write([a,o,c,g,f].filter(Boolean).join(` -`)),this.state.submitted||this.write(this.margin[2]),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIndex;return this.base.submit.call(this)}};Zne.exports=ese});var sse=w((rdt,rse)=>{"use strict";var ise=mo(),hJe=(t="")=>typeof t=="string"?t.replace(/^['"]|['"]$/g,""):"",nse=class{constructor(e){this.name=e.key,this.field=e.field||{},this.value=hJe(e.initial||this.field.initial||""),this.message=e.message||this.name,this.cursor=0,this.input="",this.lines=[]}},pJe=async(t={},e={},r=i=>i)=>{let i=new Set,n=t.fields||[],s=t.template,o=[],a=[],l=[],c=1;typeof s=="function"&&(s=await s());let u=-1,g=()=>s[++u],f=()=>s[u+1],h=p=>{p.line=c,o.push(p)};for(h({type:"bos",value:""});uT.name===b.key);b.field=n.find(T=>T.name===b.key),k||(k=new nse(b),a.push(k)),k.lines.push(b.line-1);continue}let m=o[o.length-1];m.type==="text"&&m.line===c?m.value+=p:h({type:"text",value:p})}return h({type:"eos",value:""}),{input:s,tabstops:o,unique:i,keys:l,items:a}};rse.exports=async t=>{let e=t.options,r=new Set(e.required===!0?[]:e.required||[]),i=N(N({},e.values),e.initial),{tabstops:n,items:s,keys:o}=await pJe(e,i),a=SN("result",t,e),l=SN("format",t,e),c=SN("validate",t,e,!0),u=t.isValue.bind(t);return async(g={},f=!1)=>{let h=0;g.required=r,g.items=s,g.keys=o,g.output="";let p=async(S,k,T,Y)=>{let j=await c(S,k,T,Y);return j===!1?"Invalid field "+T.name:j};for(let S of n){let k=S.value,T=S.key;if(S.type!=="template"){k&&(g.output+=k);continue}if(S.type==="template"){let Y=s.find(ee=>ee.name===T);e.required===!0&&g.required.add(Y.name);let j=[Y.input,g.values[Y.value],Y.value,k].find(u),J=(Y.field||{}).message||S.inner;if(f){let ee=await p(g.values[T],g,Y,h);if(ee&&typeof ee=="string"||ee===!1){g.invalid.set(T,ee);continue}g.invalid.delete(T);let A=await a(g.values[T],g,Y,h);g.output+=ise.unstyle(A);continue}Y.placeholder=!1;let re=k;k=await l(k,g,Y,h),j!==k?(g.values[T]=j,k=t.styles.typing(j),g.missing.delete(J)):(g.values[T]=void 0,j=`<${J}>`,k=t.styles.primary(j),Y.placeholder=!0,g.required.has(T)&&g.missing.add(J)),g.missing.has(J)&&g.validating&&(k=t.styles.warning(j)),g.invalid.has(T)&&g.validating&&(k=t.styles.danger(j)),h===g.index&&(re!==k?k=t.styles.underline(k):k=t.styles.heading(ise.unstyle(k))),h++}k&&(g.output+=k)}let m=g.output.split(` -`).map(S=>" "+S),y=s.length,b=0;for(let S of s)g.invalid.has(S.name)&&S.lines.forEach(k=>{m[k][0]===" "&&(m[k]=g.styles.danger(g.symbols.bullet)+m[k].slice(1))}),t.isValue(g.values[S.name])&&b++;return g.completed=(b/y*100).toFixed(0),g.output=m.join(` -`),g.output}};function SN(t,e,r,i){return(n,s,o,a)=>typeof o.field[t]=="function"?o.field[t].call(e,n,s,o,a):[i,n].find(l=>e.isValue(l))}});var Ase=w((idt,ose)=>{"use strict";var dJe=mo(),CJe=sse(),mJe=Vf(),ase=class extends mJe{constructor(e){super(e);this.cursorHide(),this.reset(!0)}async initialize(){this.interpolate=await CJe(this),await super.initialize()}async reset(e){this.state.keys=[],this.state.invalid=new Map,this.state.missing=new Set,this.state.completed=0,this.state.values={},e!==!0&&(await this.initialize(),await this.render())}moveCursor(e){let r=this.getItem();this.cursor+=e,r.cursor+=e}dispatch(e,r){if(!r.code&&!r.ctrl&&e!=null&&this.getItem()){this.append(e,r);return}this.alert()}append(e,r){let i=this.getItem(),n=i.input.slice(0,this.cursor),s=i.input.slice(this.cursor);this.input=i.input=`${n}${e}${s}`,this.moveCursor(1),this.render()}delete(){let e=this.getItem();if(this.cursor<=0||!e.input)return this.alert();let r=e.input.slice(this.cursor),i=e.input.slice(0,this.cursor-1);this.input=e.input=`${i}${r}`,this.moveCursor(-1),this.render()}increment(e){return e>=this.state.keys.length-1?0:e+1}decrement(e){return e<=0?this.state.keys.length-1:e-1}first(){this.state.index=0,this.render()}last(){this.state.index=this.state.keys.length-1,this.render()}right(){if(this.cursor>=this.input.length)return this.alert();this.moveCursor(1),this.render()}left(){if(this.cursor<=0)return this.alert();this.moveCursor(-1),this.render()}prev(){this.state.index=this.decrement(this.state.index),this.getItem(),this.render()}next(){this.state.index=this.increment(this.state.index),this.getItem(),this.render()}up(){this.prev()}down(){this.next()}format(e){let r=this.state.completed<100?this.styles.warning:this.styles.success;return this.state.submitted===!0&&this.state.completed!==100&&(r=this.styles.danger),r(`${this.state.completed}% completed`)}async render(){let{index:e,keys:r=[],submitted:i,size:n}=this.state,s=[this.options.newline,` -`].find(S=>S!=null),o=await this.prefix(),a=await this.separator(),l=await this.message(),c=[o,l,a].filter(Boolean).join(" ");this.state.prompt=c;let u=await this.header(),g=await this.error()||"",f=await this.hint()||"",h=i?"":await this.interpolate(this.state),p=this.state.key=r[e]||"",m=await this.format(p),y=await this.footer();m&&(c+=" "+m),f&&!m&&this.state.completed===0&&(c+=" "+f),this.clear(n);let b=[u,c,h,y,g.trim()];this.write(b.filter(Boolean).join(s)),this.restore()}getItem(e){let{items:r,keys:i,index:n}=this.state,s=r.find(o=>o.name===i[n]);return s&&s.input!=null&&(this.input=s.input,this.cursor=s.cursor),s}async submit(){typeof this.interpolate!="function"&&await this.initialize(),await this.interpolate(this.state,!0);let{invalid:e,missing:r,output:i,values:n}=this.state;if(e.size){let a="";for(let[l,c]of e)a+=`Invalid ${l}: ${c} -`;return this.state.error=a,super.submit()}if(r.size)return this.state.error="Required: "+[...r.keys()].join(", "),super.submit();let o=dJe.unstyle(i).split(` -`).map(a=>a.slice(1)).join(` -`);return this.value={values:n,result:o},super.submit()}};ose.exports=ase});var use=w((ndt,lse)=>{"use strict";var EJe="(Use + to sort)",IJe=xl(),cse=class extends IJe{constructor(e){super(ie(N({},e),{reorder:!1,sort:!0,multiple:!0}));this.state.hint=[this.options.hint,EJe].find(this.isValue.bind(this))}indicator(){return""}async renderChoice(e,r){let i=await super.renderChoice(e,r),n=this.symbols.identicalTo+" ",s=this.index===r&&this.sorting?this.styles.muted(n):" ";return this.options.drag===!1&&(s=""),this.options.numbered===!0?s+`${r+1} - `+i:s+i}get selected(){return this.choices}submit(){return this.value=this.choices.map(e=>e.value),super.submit()}};lse.exports=cse});var hse=w((sdt,gse)=>{"use strict";var yJe=ZC(),fse=class extends yJe{constructor(e={}){super(e);if(this.emptyError=e.emptyError||"No items were selected",this.term=process.env.TERM_PROGRAM,!this.options.header){let r=["","4 - Strongly Agree","3 - Agree","2 - Neutral","1 - Disagree","0 - Strongly Disagree",""];r=r.map(i=>this.styles.muted(i)),this.state.header=r.join(` - `)}}async toChoices(...e){if(this.createdScales)return!1;this.createdScales=!0;let r=await super.toChoices(...e);for(let i of r)i.scale=wJe(5,this.options),i.scaleIdx=2;return r}dispatch(){this.alert()}space(){let e=this.focused,r=e.scale[e.scaleIdx],i=r.selected;return e.scale.forEach(n=>n.selected=!1),r.selected=!i,this.render()}indicator(){return""}pointer(){return""}separator(){return this.styles.muted(this.symbols.ellipsis)}right(){let e=this.focused;return e.scaleIdx>=e.scale.length-1?this.alert():(e.scaleIdx++,this.render())}left(){let e=this.focused;return e.scaleIdx<=0?this.alert():(e.scaleIdx--,this.render())}indent(){return" "}async renderChoice(e,r){await this.onChoice(e,r);let i=this.index===r,n=this.term==="Hyper",s=n?9:8,o=n?"":" ",a=this.symbols.line.repeat(s),l=" ".repeat(s+(n?0:1)),c=k=>(k?this.styles.success("\u25C9"):"\u25EF")+o,u=r+1+".",g=i?this.styles.heading:this.styles.noop,f=await this.resolve(e.message,this.state,e,r),h=this.indent(e),p=h+e.scale.map((k,T)=>c(T===e.scaleIdx)).join(a),m=k=>k===e.scaleIdx?g(k):k,y=h+e.scale.map((k,T)=>m(T)).join(l),b=()=>[u,f].filter(Boolean).join(" "),S=()=>[b(),p,y," "].filter(Boolean).join(` -`);return i&&(p=this.styles.cyan(p),y=this.styles.cyan(y)),S()}async renderChoices(){if(this.state.submitted)return"";let e=this.visible.map(async(i,n)=>await this.renderChoice(i,n)),r=await Promise.all(e);return r.length||r.push(this.styles.danger("No matching choices")),r.join(` -`)}format(){return this.state.submitted?this.choices.map(r=>this.styles.info(r.scaleIdx)).join(", "):""}async render(){let{submitted:e,size:r}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o=[i,s,n].filter(Boolean).join(" ");this.state.prompt=o;let a=await this.header(),l=await this.format(),c=await this.error()||await this.hint(),u=await this.renderChoices(),g=await this.footer();(l||!c)&&(o+=" "+l),c&&!o.includes(c)&&(o+=" "+c),e&&!l&&!u&&this.multiple&&this.type!=="form"&&(o+=this.styles.danger(this.emptyError)),this.clear(r),this.write([o,a,u,g].filter(Boolean).join(` -`)),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIdx;return this.base.submit.call(this)}};function wJe(t,e={}){if(Array.isArray(e.scale))return e.scale.map(i=>N({},i));let r=[];for(let i=1;i{pse.exports=QN()});var Ese=w((adt,Cse)=>{"use strict";var BJe=$0(),mse=class extends BJe{async initialize(){await super.initialize(),this.value=this.initial=!!this.options.initial,this.disabled=this.options.disabled||"no",this.enabled=this.options.enabled||"yes",await this.render()}reset(){this.value=this.initial,this.render()}delete(){this.alert()}toggle(){this.value=!this.value,this.render()}enable(){if(this.value===!0)return this.alert();this.value=!0,this.render()}disable(){if(this.value===!1)return this.alert();this.value=!1,this.render()}up(){this.toggle()}down(){this.toggle()}right(){this.toggle()}left(){this.toggle()}next(){this.toggle()}prev(){this.toggle()}dispatch(e="",r){switch(e.toLowerCase()){case" ":return this.toggle();case"1":case"y":case"t":return this.enable();case"0":case"n":case"f":return this.disable();default:return this.alert()}}format(){let e=i=>this.styles.primary.underline(i);return[this.value?this.disabled:e(this.disabled),this.value?e(this.enabled):this.enabled].join(this.styles.muted(" / "))}async render(){let{size:e}=this.state,r=await this.header(),i=await this.prefix(),n=await this.separator(),s=await this.message(),o=await this.format(),a=await this.error()||await this.hint(),l=await this.footer(),c=[i,s,n,o].join(" ");this.state.prompt=c,a&&!c.includes(a)&&(c+=" "+a),this.clear(e),this.write([r,c,l].filter(Boolean).join(` -`)),this.write(this.margin[2]),this.restore()}};Cse.exports=mse});var wse=w((Adt,Ise)=>{"use strict";var bJe=xl(),yse=class extends bJe{constructor(e){super(e);if(typeof this.options.correctChoice!="number"||this.options.correctChoice<0)throw new Error("Please specify the index of the correct answer from the list of choices")}async toChoices(e,r){let i=await super.toChoices(e,r);if(i.length<2)throw new Error("Please give at least two choices to the user");if(this.options.correctChoice>i.length)throw new Error("Please specify the index of the correct answer from the list of choices");return i}check(e){return e.index===this.options.correctChoice}async result(e){return{selectedAnswer:e,correctAnswer:this.options.choices[this.options.correctChoice].value,correct:await this.check(this.state)}}};Ise.exports=yse});var bse=w(kN=>{"use strict";var Bse=Xi(),Ci=(t,e)=>{Bse.defineExport(kN,t,e),Bse.defineExport(kN,t.toLowerCase(),e)};Ci("AutoComplete",()=>gne());Ci("BasicAuth",()=>Ine());Ci("Confirm",()=>Qne());Ci("Editable",()=>kne());Ci("Form",()=>Z0());Ci("Input",()=>QN());Ci("Invisible",()=>Mne());Ci("List",()=>Hne());Ci("MultiSelect",()=>Yne());Ci("Numeral",()=>zne());Ci("Password",()=>Xne());Ci("Scale",()=>tse());Ci("Select",()=>xl());Ci("Snippet",()=>Ase());Ci("Sort",()=>use());Ci("Survey",()=>hse());Ci("Text",()=>dse());Ci("Toggle",()=>Ese());Ci("Quiz",()=>wse())});var vse=w((cdt,Qse)=>{Qse.exports={ArrayPrompt:ZC(),AuthPrompt:bN(),BooleanPrompt:$0(),NumberPrompt:vN(),StringPrompt:Iu()}});var em=w((udt,Sse)=>{"use strict";var kse=require("assert"),xN=require("events"),Pl=Xi(),ua=class extends xN{constructor(e,r){super();this.options=Pl.merge({},e),this.answers=N({},r)}register(e,r){if(Pl.isObject(e)){for(let n of Object.keys(e))this.register(n,e[n]);return this}kse.equal(typeof r,"function","expected a function");let i=e.toLowerCase();return r.prototype instanceof this.Prompt?this.prompts[i]=r:this.prompts[i]=r(this.Prompt,this),this}async prompt(e=[]){for(let r of[].concat(e))try{typeof r=="function"&&(r=await r.call(this)),await this.ask(Pl.merge({},this.options,r))}catch(i){return Promise.reject(i)}return this.answers}async ask(e){typeof e=="function"&&(e=await e.call(this));let r=Pl.merge({},this.options,e),{type:i,name:n}=e,{set:s,get:o}=Pl;if(typeof i=="function"&&(i=await i.call(this,e,this.answers)),!i)return this.answers[n];kse(this.prompts[i],`Prompt "${i}" is not registered`);let a=new this.prompts[i](r),l=o(this.answers,n);a.state.answers=this.answers,a.enquirer=this,n&&a.on("submit",u=>{this.emit("answer",n,u,a),s(this.answers,n,u)});let c=a.emit.bind(a);return a.emit=(...u)=>(this.emit.call(this,...u),c(...u)),this.emit("prompt",a,this),r.autofill&&l!=null?(a.value=a.input=l,r.autofill==="show"&&await a.submit()):l=a.value=await a.run(),l}use(e){return e.call(this,this),this}set Prompt(e){this._Prompt=e}get Prompt(){return this._Prompt||this.constructor.Prompt}get prompts(){return this.constructor.prompts}static set Prompt(e){this._Prompt=e}static get Prompt(){return this._Prompt||Vf()}static get prompts(){return bse()}static get types(){return vse()}static get prompt(){let e=(r,...i)=>{let n=new this(...i),s=n.emit.bind(n);return n.emit=(...o)=>(e.emit(...o),s(...o)),n.prompt(r)};return Pl.mixinEmitter(e,new xN),e}};Pl.mixinEmitter(ua,new xN);var PN=ua.prompts;for(let t of Object.keys(PN)){let e=t.toLowerCase(),r=i=>new PN[t](i).run();ua.prompt[e]=r,ua[e]=r,ua[t]||Reflect.defineProperty(ua,t,{get:()=>PN[t]})}var $C=t=>{Pl.defineExport(ua,t,()=>ua.types[t])};$C("ArrayPrompt");$C("AuthPrompt");$C("BooleanPrompt");$C("NumberPrompt");$C("StringPrompt");Sse.exports=ua});var Hse=w((eCt,Use)=>{function xJe(t,e){for(var r=-1,i=t==null?0:t.length;++r{var PJe=u0(),DJe=Lf();function RJe(t,e,r,i){var n=!r;r||(r={});for(var s=-1,o=e.length;++s{var FJe=$f(),NJe=Uf();function LJe(t,e){return t&&FJe(e,NJe(e),t)}jse.exports=LJe});var Jse=w((iCt,qse)=>{function TJe(t){var e=[];if(t!=null)for(var r in Object(t))e.push(r);return e}qse.exports=TJe});var zse=w((nCt,Wse)=>{var OJe=Rn(),MJe=Q0(),KJe=Jse(),UJe=Object.prototype,HJe=UJe.hasOwnProperty;function GJe(t){if(!OJe(t))return KJe(t);var e=MJe(t),r=[];for(var i in t)i=="constructor"&&(e||!HJe.call(t,i))||r.push(i);return r}Wse.exports=GJe});var eh=w((sCt,_se)=>{var jJe=yF(),YJe=zse(),qJe=NC();function JJe(t){return qJe(t)?jJe(t,!0):YJe(t)}_se.exports=JJe});var Xse=w((oCt,Vse)=>{var WJe=$f(),zJe=eh();function _Je(t,e){return t&&WJe(e,zJe(e),t)}Vse.exports=_Je});var TN=w((am,th)=>{var VJe=Fs(),Zse=typeof am=="object"&&am&&!am.nodeType&&am,$se=Zse&&typeof th=="object"&&th&&!th.nodeType&&th,XJe=$se&&$se.exports===Zse,eoe=XJe?VJe.Buffer:void 0,toe=eoe?eoe.allocUnsafe:void 0;function ZJe(t,e){if(e)return t.slice();var r=t.length,i=toe?toe(r):new t.constructor(r);return t.copy(i),i}th.exports=ZJe});var ON=w((aCt,roe)=>{function $Je(t,e){var r=-1,i=t.length;for(e||(e=Array(i));++r{var e3e=$f(),t3e=S0();function r3e(t,e){return e3e(t,t3e(t),e)}ioe.exports=r3e});var tb=w((lCt,soe)=>{var i3e=wF(),n3e=i3e(Object.getPrototypeOf,Object);soe.exports=n3e});var MN=w((cCt,ooe)=>{var s3e=f0(),o3e=tb(),a3e=S0(),A3e=kF(),l3e=Object.getOwnPropertySymbols,c3e=l3e?function(t){for(var e=[];t;)s3e(e,a3e(t)),t=o3e(t);return e}:A3e;ooe.exports=c3e});var Aoe=w((uCt,aoe)=>{var u3e=$f(),g3e=MN();function f3e(t,e){return u3e(t,g3e(t),e)}aoe.exports=f3e});var coe=w((gCt,loe)=>{var h3e=SF(),p3e=MN(),d3e=eh();function C3e(t){return h3e(t,d3e,p3e)}loe.exports=C3e});var goe=w((fCt,uoe)=>{var m3e=Object.prototype,E3e=m3e.hasOwnProperty;function I3e(t){var e=t.length,r=new t.constructor(e);return e&&typeof t[0]=="string"&&E3e.call(t,"index")&&(r.index=t.index,r.input=t.input),r}uoe.exports=I3e});var rb=w((hCt,foe)=>{var hoe=QF();function y3e(t){var e=new t.constructor(t.byteLength);return new hoe(e).set(new hoe(t)),e}foe.exports=y3e});var doe=w((pCt,poe)=>{var w3e=rb();function B3e(t,e){var r=e?w3e(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.byteLength)}poe.exports=B3e});var moe=w((dCt,Coe)=>{var b3e=/\w*$/;function Q3e(t){var e=new t.constructor(t.source,b3e.exec(t));return e.lastIndex=t.lastIndex,e}Coe.exports=Q3e});var Boe=w((CCt,Eoe)=>{var Ioe=Hc(),yoe=Ioe?Ioe.prototype:void 0,woe=yoe?yoe.valueOf:void 0;function v3e(t){return woe?Object(woe.call(t)):{}}Eoe.exports=v3e});var KN=w((mCt,boe)=>{var S3e=rb();function k3e(t,e){var r=e?S3e(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.length)}boe.exports=k3e});var voe=w((ECt,Qoe)=>{var x3e=rb(),P3e=doe(),D3e=moe(),R3e=Boe(),F3e=KN(),N3e="[object Boolean]",L3e="[object Date]",T3e="[object Map]",O3e="[object Number]",M3e="[object RegExp]",K3e="[object Set]",U3e="[object String]",H3e="[object Symbol]",G3e="[object ArrayBuffer]",j3e="[object DataView]",Y3e="[object Float32Array]",q3e="[object Float64Array]",J3e="[object Int8Array]",W3e="[object Int16Array]",z3e="[object Int32Array]",_3e="[object Uint8Array]",V3e="[object Uint8ClampedArray]",X3e="[object Uint16Array]",Z3e="[object Uint32Array]";function $3e(t,e,r){var i=t.constructor;switch(e){case G3e:return x3e(t);case N3e:case L3e:return new i(+t);case j3e:return P3e(t,r);case Y3e:case q3e:case J3e:case W3e:case z3e:case _3e:case V3e:case X3e:case Z3e:return F3e(t,r);case T3e:return new i;case O3e:case U3e:return new i(t);case M3e:return D3e(t);case K3e:return new i;case H3e:return R3e(t)}}Qoe.exports=$3e});var xoe=w((ICt,Soe)=>{var eWe=Rn(),koe=Object.create,tWe=function(){function t(){}return function(e){if(!eWe(e))return{};if(koe)return koe(e);t.prototype=e;var r=new t;return t.prototype=void 0,r}}();Soe.exports=tWe});var UN=w((yCt,Poe)=>{var rWe=xoe(),iWe=tb(),nWe=Q0();function sWe(t){return typeof t.constructor=="function"&&!nWe(t)?rWe(iWe(t)):{}}Poe.exports=sWe});var Roe=w((wCt,Doe)=>{var oWe=TC(),aWe=Zo(),AWe="[object Map]";function lWe(t){return aWe(t)&&oWe(t)==AWe}Doe.exports=lWe});var Toe=w((BCt,Foe)=>{var cWe=Roe(),uWe=w0(),Noe=B0(),Loe=Noe&&Noe.isMap,gWe=Loe?uWe(Loe):cWe;Foe.exports=gWe});var Moe=w((bCt,Ooe)=>{var fWe=TC(),hWe=Zo(),pWe="[object Set]";function dWe(t){return hWe(t)&&fWe(t)==pWe}Ooe.exports=dWe});var Goe=w((QCt,Koe)=>{var CWe=Moe(),mWe=w0(),Uoe=B0(),Hoe=Uoe&&Uoe.isSet,EWe=Hoe?mWe(Hoe):CWe;Koe.exports=EWe});var Woe=w((vCt,joe)=>{var IWe=LC(),yWe=Hse(),wWe=u0(),BWe=Yse(),bWe=Xse(),QWe=TN(),vWe=ON(),SWe=noe(),kWe=Aoe(),xWe=xF(),PWe=coe(),DWe=TC(),RWe=goe(),FWe=voe(),NWe=UN(),LWe=Ms(),TWe=DC(),OWe=Toe(),MWe=Rn(),KWe=Goe(),UWe=Uf(),HWe=eh(),GWe=1,jWe=2,YWe=4,Yoe="[object Arguments]",qWe="[object Array]",JWe="[object Boolean]",WWe="[object Date]",zWe="[object Error]",qoe="[object Function]",_We="[object GeneratorFunction]",VWe="[object Map]",XWe="[object Number]",Joe="[object Object]",ZWe="[object RegExp]",$We="[object Set]",e8e="[object String]",t8e="[object Symbol]",r8e="[object WeakMap]",i8e="[object ArrayBuffer]",n8e="[object DataView]",s8e="[object Float32Array]",o8e="[object Float64Array]",a8e="[object Int8Array]",A8e="[object Int16Array]",l8e="[object Int32Array]",c8e="[object Uint8Array]",u8e="[object Uint8ClampedArray]",g8e="[object Uint16Array]",f8e="[object Uint32Array]",dr={};dr[Yoe]=dr[qWe]=dr[i8e]=dr[n8e]=dr[JWe]=dr[WWe]=dr[s8e]=dr[o8e]=dr[a8e]=dr[A8e]=dr[l8e]=dr[VWe]=dr[XWe]=dr[Joe]=dr[ZWe]=dr[$We]=dr[e8e]=dr[t8e]=dr[c8e]=dr[u8e]=dr[g8e]=dr[f8e]=!0;dr[zWe]=dr[qoe]=dr[r8e]=!1;function ib(t,e,r,i,n,s){var o,a=e&GWe,l=e&jWe,c=e&YWe;if(r&&(o=n?r(t,i,n,s):r(t)),o!==void 0)return o;if(!MWe(t))return t;var u=LWe(t);if(u){if(o=RWe(t),!a)return vWe(t,o)}else{var g=DWe(t),f=g==qoe||g==_We;if(TWe(t))return QWe(t,a);if(g==Joe||g==Yoe||f&&!n){if(o=l||f?{}:NWe(t),!a)return l?kWe(t,bWe(o,t)):SWe(t,BWe(o,t))}else{if(!dr[g])return n?t:{};o=FWe(t,g,a)}}s||(s=new IWe);var h=s.get(t);if(h)return h;s.set(t,o),KWe(t)?t.forEach(function(y){o.add(ib(y,e,r,y,t,s))}):OWe(t)&&t.forEach(function(y,b){o.set(b,ib(y,e,r,b,t,s))});var p=c?l?PWe:xWe:l?HWe:UWe,m=u?void 0:p(t);return yWe(m||t,function(y,b){m&&(b=y,y=t[b]),wWe(o,b,ib(y,e,r,b,t,s))}),o}joe.exports=ib});var HN=w((SCt,zoe)=>{var h8e=Woe(),p8e=1,d8e=4;function C8e(t){return h8e(t,p8e|d8e)}zoe.exports=C8e});var Voe=w((kCt,_oe)=>{var m8e=XR();function E8e(t,e,r){return t==null?t:m8e(t,e,r)}_oe.exports=E8e});var rae=w((NCt,tae)=>{function I8e(t){var e=t==null?0:t.length;return e?t[e-1]:void 0}tae.exports=I8e});var nae=w((LCt,iae)=>{var y8e=yC(),w8e=AD();function B8e(t,e){return e.length<2?t:y8e(t,w8e(e,0,-1))}iae.exports=B8e});var oae=w((TCt,sae)=>{var b8e=Nf(),Q8e=rae(),v8e=nae(),S8e=cu();function k8e(t,e){return e=b8e(e,t),t=v8e(t,e),t==null||delete t[S8e(Q8e(e))]}sae.exports=k8e});var Aae=w((OCt,aae)=>{var x8e=oae();function P8e(t,e){return t==null?!0:x8e(t,e)}aae.exports=P8e});var Cae=w((fmt,dae)=>{dae.exports={name:"@yarnpkg/cli",version:"3.2.1",license:"BSD-2-Clause",main:"./sources/index.ts",dependencies:{"@yarnpkg/core":"workspace:^","@yarnpkg/fslib":"workspace:^","@yarnpkg/libzip":"workspace:^","@yarnpkg/parsers":"workspace:^","@yarnpkg/plugin-compat":"workspace:^","@yarnpkg/plugin-dlx":"workspace:^","@yarnpkg/plugin-essentials":"workspace:^","@yarnpkg/plugin-file":"workspace:^","@yarnpkg/plugin-git":"workspace:^","@yarnpkg/plugin-github":"workspace:^","@yarnpkg/plugin-http":"workspace:^","@yarnpkg/plugin-init":"workspace:^","@yarnpkg/plugin-link":"workspace:^","@yarnpkg/plugin-nm":"workspace:^","@yarnpkg/plugin-npm":"workspace:^","@yarnpkg/plugin-npm-cli":"workspace:^","@yarnpkg/plugin-pack":"workspace:^","@yarnpkg/plugin-patch":"workspace:^","@yarnpkg/plugin-pnp":"workspace:^","@yarnpkg/plugin-pnpm":"workspace:^","@yarnpkg/shell":"workspace:^",chalk:"^3.0.0","ci-info":"^3.2.0",clipanion:"^3.2.0-rc.4",semver:"^7.1.2",tslib:"^1.13.0",typanion:"^3.3.0",yup:"^0.32.9"},devDependencies:{"@types/semver":"^7.1.0","@types/yup":"^0","@yarnpkg/builder":"workspace:^","@yarnpkg/monorepo":"workspace:^","@yarnpkg/pnpify":"workspace:^",micromatch:"^4.0.2"},peerDependencies:{"@yarnpkg/core":"workspace:^"},scripts:{postpack:"rm -rf lib",prepack:'run build:compile "$(pwd)"',"build:cli+hook":"run build:pnp:hook && builder build bundle","build:cli":"builder build bundle","run:cli":"builder run","update-local":"run build:cli --no-git-hash && rsync -a --delete bundles/ bin/"},publishConfig:{main:"./lib/index.js",types:"./lib/index.d.ts",bin:null},files:["/lib/**/*","!/lib/pluginConfiguration.*","!/lib/cli.*"],"@yarnpkg/builder":{bundles:{standard:["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-dlx","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-link","@yarnpkg/plugin-nm","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp","@yarnpkg/plugin-pnpm"]}},repository:{type:"git",url:"ssh://git@github.com/yarnpkg/berry.git",directory:"packages/yarnpkg-cli"},engines:{node:">=12 <14 || 14.2 - 14.9 || >14.10.0"}}});var $N=w((qyt,iAe)=>{"use strict";iAe.exports=function(e,r){r===!0&&(r=0);var i=e.indexOf("://"),n=e.substring(0,i).split("+").filter(Boolean);return typeof r=="number"?n[r]:n}});var eL=w((Jyt,nAe)=>{"use strict";var X8e=$N();function sAe(t){if(Array.isArray(t))return t.indexOf("ssh")!==-1||t.indexOf("rsync")!==-1;if(typeof t!="string")return!1;var e=X8e(t);return t=t.substring(t.indexOf("://")+3),sAe(e)?!0:t.indexOf("@"){"use strict";var Z8e=$N(),$8e=eL(),e4e=require("querystring");function t4e(t){t=(t||"").trim();var e={protocols:Z8e(t),protocol:null,port:null,resource:"",user:"",pathname:"",hash:"",search:"",href:t,query:Object.create(null)},r=t.indexOf("://"),i=-1,n=null,s=null;t.startsWith(".")&&(t.startsWith("./")&&(t=t.substring(2)),e.pathname=t,e.protocol="file");var o=t.charAt(1);return e.protocol||(e.protocol=e.protocols[0],e.protocol||($8e(t)?e.protocol="ssh":((o==="/"||o==="~")&&(t=t.substring(2)),e.protocol="file"))),r!==-1&&(t=t.substring(r+3)),s=t.split("/"),e.protocol!=="file"?e.resource=s.shift():e.resource="",n=e.resource.split("@"),n.length===2&&(e.user=n[0],e.resource=n[1]),n=e.resource.split(":"),n.length===2&&(e.resource=n[0],n[1]?(e.port=Number(n[1]),isNaN(e.port)&&(e.port=null,s.unshift(n[1]))):e.port=null),s=s.filter(Boolean),e.protocol==="file"?e.pathname=e.href:e.pathname=e.pathname||(e.protocol!=="file"||e.href[0]==="/"?"/":"")+s.join("/"),n=e.pathname.split("#"),n.length===2&&(e.pathname=n[0],e.hash=n[1]),n=e.pathname.split("?"),n.length===2&&(e.pathname=n[0],e.search=n[1]),e.query=e4e.parse(e.search),e.href=e.href.replace(/\/$/,""),e.pathname=e.pathname.replace(/\/$/,""),e}oAe.exports=t4e});var cAe=w((zyt,AAe)=>{"use strict";var r4e="text/plain",i4e="us-ascii",lAe=(t,e)=>e.some(r=>r instanceof RegExp?r.test(t):r===t),n4e=(t,{stripHash:e})=>{let r=/^data:(?[^,]*?),(?[^#]*?)(?:#(?.*))?$/.exec(t);if(!r)throw new Error(`Invalid URL: ${t}`);let{type:i,data:n,hash:s}=r.groups,o=i.split(";");s=e?"":s;let a=!1;o[o.length-1]==="base64"&&(o.pop(),a=!0);let l=(o.shift()||"").toLowerCase(),u=[...o.map(g=>{let[f,h=""]=g.split("=").map(p=>p.trim());return f==="charset"&&(h=h.toLowerCase(),h===i4e)?"":`${f}${h?`=${h}`:""}`}).filter(Boolean)];return a&&u.push("base64"),(u.length!==0||l&&l!==r4e)&&u.unshift(l),`data:${u.join(";")},${a?n.trim():n}${s?`#${s}`:""}`},s4e=(t,e)=>{if(e=N({defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripTextFragment:!0,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeSingleSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0},e),t=t.trim(),/^data:/i.test(t))return n4e(t,e);if(/^view-source:/i.test(t))throw new Error("`view-source:` is not supported as it is a non-standard protocol");let r=t.startsWith("//");!r&&/^\.*\//.test(t)||(t=t.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let n=new URL(t);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&n.protocol==="https:"&&(n.protocol="http:"),e.forceHttps&&n.protocol==="http:"&&(n.protocol="https:"),e.stripAuthentication&&(n.username="",n.password=""),e.stripHash?n.hash="":e.stripTextFragment&&(n.hash=n.hash.replace(/#?:~:text.*?$/i,"")),n.pathname&&(n.pathname=n.pathname.replace(/(?0){let o=n.pathname.split("/"),a=o[o.length-1];lAe(a,e.removeDirectoryIndex)&&(o=o.slice(0,o.length-1),n.pathname=o.slice(1).join("/")+"/")}if(n.hostname&&(n.hostname=n.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.(?!www\.)(?:[a-z\-\d]{1,63})\.(?:[a-z.\-\d]{2,63})$/.test(n.hostname)&&(n.hostname=n.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let o of[...n.searchParams.keys()])lAe(o,e.removeQueryParameters)&&n.searchParams.delete(o);e.removeQueryParameters===!0&&(n.search=""),e.sortQueryParameters&&n.searchParams.sort(),e.removeTrailingSlash&&(n.pathname=n.pathname.replace(/\/$/,""));let s=t;return t=n.toString(),!e.removeSingleSlash&&n.pathname==="/"&&!s.endsWith("/")&&n.hash===""&&(t=t.replace(/\/$/,"")),(e.removeTrailingSlash||n.pathname==="/")&&n.hash===""&&e.removeSingleSlash&&(t=t.replace(/\/$/,"")),r&&!e.normalizeProtocol&&(t=t.replace(/^http:\/\//,"//")),e.stripProtocol&&(t=t.replace(/^(?:https?:)?\/\//,"")),t};AAe.exports=s4e});var gAe=w((_yt,uAe)=>{"use strict";var o4e=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a4e=aAe(),A4e=cAe();function l4e(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;if(typeof t!="string"||!t.trim())throw new Error("Invalid url.");e&&((typeof e=="undefined"?"undefined":o4e(e))!=="object"&&(e={stripHash:!1}),t=A4e(t,e));var r=a4e(t);return r}uAe.exports=l4e});var pAe=w((Vyt,fAe)=>{"use strict";var c4e=gAe(),hAe=eL();function u4e(t){var e=c4e(t);e.token="";var r=e.user.split(":");return r.length===2&&(r[1]==="x-oauth-basic"?e.token=r[0]:r[0]==="x-token-auth"&&(e.token=r[1])),hAe(e.protocols)||hAe(t)?e.protocol="ssh":e.protocols.length?e.protocol=e.protocols[0]:e.protocol="file",e.href=e.href.replace(/\/$/,""),e}fAe.exports=u4e});var CAe=w((Xyt,dAe)=>{"use strict";var g4e=pAe();function tL(t){if(typeof t!="string")throw new Error("The url must be a string.");var e=g4e(t),r=e.resource.split("."),i=null;switch(e.toString=function(l){return tL.stringify(this,l)},e.source=r.length>2?r.slice(1-r.length).join("."):e.source=e.resource,e.git_suffix=/\.git$/.test(e.pathname),e.name=decodeURIComponent(e.pathname.replace(/^\//,"").replace(/\.git$/,"")),e.owner=decodeURIComponent(e.user),e.source){case"git.cloudforge.com":e.owner=e.user,e.organization=r[0],e.source="cloudforge.com";break;case"visualstudio.com":if(e.resource==="vs-ssh.visualstudio.com"){i=e.name.split("/"),i.length===4&&(e.organization=i[1],e.owner=i[2],e.name=i[3],e.full_name=i[2]+"/"+i[3]);break}else{i=e.name.split("/"),i.length===2?(e.owner=i[1],e.name=i[1],e.full_name="_git/"+e.name):i.length===3?(e.name=i[2],i[0]==="DefaultCollection"?(e.owner=i[2],e.organization=i[0],e.full_name=e.organization+"/_git/"+e.name):(e.owner=i[0],e.full_name=e.owner+"/_git/"+e.name)):i.length===4&&(e.organization=i[0],e.owner=i[1],e.name=i[3],e.full_name=e.organization+"/"+e.owner+"/_git/"+e.name);break}case"dev.azure.com":case"azure.com":if(e.resource==="ssh.dev.azure.com"){i=e.name.split("/"),i.length===4&&(e.organization=i[1],e.owner=i[2],e.name=i[3]);break}else{i=e.name.split("/"),i.length===5?(e.organization=i[0],e.owner=i[1],e.name=i[4],e.full_name="_git/"+e.name):i.length===3?(e.name=i[2],i[0]==="DefaultCollection"?(e.owner=i[2],e.organization=i[0],e.full_name=e.organization+"/_git/"+e.name):(e.owner=i[0],e.full_name=e.owner+"/_git/"+e.name)):i.length===4&&(e.organization=i[0],e.owner=i[1],e.name=i[3],e.full_name=e.organization+"/"+e.owner+"/_git/"+e.name);break}default:i=e.name.split("/");var n=i.length-1;if(i.length>=2){var s=i.indexOf("blob",2),o=i.indexOf("tree",2),a=i.indexOf("commit",2);n=s>0?s-1:o>0?o-1:a>0?a-1:n,e.owner=i.slice(0,n).join("/"),e.name=i[n],a&&(e.commit=i[n+2])}e.ref="",e.filepathtype="",e.filepath="",i.length>n+2&&["blob","tree"].indexOf(i[n+1])>=0&&(e.filepathtype=i[n+1],e.ref=i[n+2],i.length>n+3&&(e.filepath=i.slice(n+3).join("/"))),e.organization=e.owner;break}return e.full_name||(e.full_name=e.owner,e.name&&(e.full_name&&(e.full_name+="/"),e.full_name+=e.name)),e}tL.stringify=function(t,e){e=e||(t.protocols&&t.protocols.length?t.protocols.join("+"):t.protocol);var r=t.port?":"+t.port:"",i=t.user||"git",n=t.git_suffix?".git":"";switch(e){case"ssh":return r?"ssh://"+i+"@"+t.resource+r+"/"+t.full_name+n:i+"@"+t.resource+":"+t.full_name+n;case"git+ssh":case"ssh+git":case"ftp":case"ftps":return e+"://"+i+"@"+t.resource+r+"/"+t.full_name+n;case"http":case"https":var s=t.token?f4e(t):t.user&&(t.protocols.includes("http")||t.protocols.includes("https"))?t.user+"@":"";return e+"://"+s+t.resource+r+"/"+t.full_name+n;default:return t.href}};function f4e(t){switch(t.source){case"bitbucket.org":return"x-token-auth:"+t.token+"@";default:return t.token+"@"}}dAe.exports=tL});var DL=w((ibt,UAe)=>{var R4e=Lf(),F4e=Df();function N4e(t,e,r){(r!==void 0&&!F4e(t[e],r)||r===void 0&&!(e in t))&&R4e(t,e,r)}UAe.exports=N4e});var GAe=w((nbt,HAe)=>{var L4e=NC(),T4e=Zo();function O4e(t){return T4e(t)&&L4e(t)}HAe.exports=O4e});var qAe=w((sbt,jAe)=>{var M4e=Gc(),K4e=tb(),U4e=Zo(),H4e="[object Object]",G4e=Function.prototype,j4e=Object.prototype,YAe=G4e.toString,Y4e=j4e.hasOwnProperty,q4e=YAe.call(Object);function J4e(t){if(!U4e(t)||M4e(t)!=H4e)return!1;var e=K4e(t);if(e===null)return!0;var r=Y4e.call(e,"constructor")&&e.constructor;return typeof r=="function"&&r instanceof r&&YAe.call(r)==q4e}jAe.exports=J4e});var RL=w((obt,JAe)=>{function W4e(t,e){if(!(e==="constructor"&&typeof t[e]=="function")&&e!="__proto__")return t[e]}JAe.exports=W4e});var zAe=w((abt,WAe)=>{var z4e=$f(),_4e=eh();function V4e(t){return z4e(t,_4e(t))}WAe.exports=V4e});var ele=w((Abt,_Ae)=>{var VAe=DL(),X4e=TN(),Z4e=KN(),$4e=ON(),eze=UN(),XAe=BC(),ZAe=Ms(),tze=GAe(),rze=DC(),ize=A0(),nze=Rn(),sze=qAe(),oze=b0(),$Ae=RL(),aze=zAe();function Aze(t,e,r,i,n,s,o){var a=$Ae(t,r),l=$Ae(e,r),c=o.get(l);if(c){VAe(t,r,c);return}var u=s?s(a,l,r+"",t,e,o):void 0,g=u===void 0;if(g){var f=ZAe(l),h=!f&&rze(l),p=!f&&!h&&oze(l);u=l,f||h||p?ZAe(a)?u=a:tze(a)?u=$4e(a):h?(g=!1,u=X4e(l,!0)):p?(g=!1,u=Z4e(l,!0)):u=[]:sze(l)||XAe(l)?(u=a,XAe(a)?u=aze(a):(!nze(a)||ize(a))&&(u=eze(l))):g=!1}g&&(o.set(l,u),n(u,l,i,s,o),o.delete(l)),VAe(t,r,u)}_Ae.exports=Aze});var ile=w((lbt,tle)=>{var lze=LC(),cze=DL(),uze=EF(),gze=ele(),fze=Rn(),hze=eh(),pze=RL();function rle(t,e,r,i,n){t!==e&&uze(e,function(s,o){if(n||(n=new lze),fze(s))gze(t,e,o,r,rle,i,n);else{var a=i?i(pze(t,o),s,o+"",t,e,n):void 0;a===void 0&&(a=s),cze(t,o,a)}},hze)}tle.exports=rle});var sle=w((cbt,nle)=>{var dze=h0(),Cze=eF(),mze=tF();function Eze(t,e){return mze(Cze(t,e,dze),t+"")}nle.exports=Eze});var ale=w((ubt,ole)=>{var Ize=Df(),yze=NC(),wze=wC(),Bze=Rn();function bze(t,e,r){if(!Bze(r))return!1;var i=typeof e;return(i=="number"?yze(r)&&wze(e,r.length):i=="string"&&e in r)?Ize(r[e],t):!1}ole.exports=bze});var lle=w((gbt,Ale)=>{var Qze=sle(),vze=ale();function Sze(t){return Qze(function(e,r){var i=-1,n=r.length,s=n>1?r[n-1]:void 0,o=n>2?r[2]:void 0;for(s=t.length>3&&typeof s=="function"?(n--,s):void 0,o&&vze(r[0],r[1],o)&&(s=n<3?void 0:s,n=1),e=Object(e);++i{var kze=ile(),xze=lle(),Pze=xze(function(t,e,r){kze(t,e,r)});cle.exports=Pze});var Sle=w((mQt,vle)=>{var JL;vle.exports=()=>(typeof JL=="undefined"&&(JL=require("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),JL)});var Mle=w((XQt,Ole)=>{var VL;Ole.exports=()=>(typeof VL=="undefined"&&(VL=require("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),VL)});var Jle=w((iT,nT)=>{(function(t){iT&&typeof iT=="object"&&typeof nT!="undefined"?nT.exports=t():typeof define=="function"&&define.amd?define([],t):typeof window!="undefined"?window.isWindows=t():typeof global!="undefined"?global.isWindows=t():typeof self!="undefined"?self.isWindows=t():this.isWindows=t()})(function(){"use strict";return function(){return process&&(process.platform==="win32"||/^(msys|cygwin)$/.test(process.env.OSTYPE))}})});var Vle=w((iSt,Wle)=>{"use strict";sT.ifExists=m5e;var Ah=require("util"),Ws=require("path"),zle=Jle(),E5e=/^#!\s*(?:\/usr\/bin\/env)?\s*([^ \t]+)(.*)$/,I5e={createPwshFile:!0,createCmdFile:zle(),fs:require("fs")},y5e=new Map([[".js","node"],[".cjs","node"],[".mjs","node"],[".cmd","cmd"],[".bat","cmd"],[".ps1","pwsh"],[".sh","sh"]]);function _le(t){let e=N(N({},I5e),t),r=e.fs;return e.fs_={chmod:r.chmod?Ah.promisify(r.chmod):async()=>{},mkdir:Ah.promisify(r.mkdir),readFile:Ah.promisify(r.readFile),stat:Ah.promisify(r.stat),unlink:Ah.promisify(r.unlink),writeFile:Ah.promisify(r.writeFile)},e}async function sT(t,e,r){let i=_le(r);await i.fs_.stat(t),await w5e(t,e,i)}function m5e(t,e,r){return sT(t,e,r).catch(()=>{})}function B5e(t,e){return e.fs_.unlink(t).catch(()=>{})}async function w5e(t,e,r){let i=await v5e(t,r);return await b5e(e,r),Q5e(t,e,i,r)}function b5e(t,e){return e.fs_.mkdir(Ws.dirname(t),{recursive:!0})}function Q5e(t,e,r,i){let n=_le(i),s=[{generator:x5e,extension:""}];return n.createCmdFile&&s.push({generator:k5e,extension:".cmd"}),n.createPwshFile&&s.push({generator:P5e,extension:".ps1"}),Promise.all(s.map(o=>S5e(t,e+o.extension,r,o.generator,n)))}function D5e(t,e){return B5e(t,e)}function F5e(t,e){return R5e(t,e)}async function v5e(t,e){let n=(await e.fs_.readFile(t,"utf8")).trim().split(/\r*\n/)[0].match(E5e);if(!n){let s=Ws.extname(t).toLowerCase();return{program:y5e.get(s)||null,additionalArgs:""}}return{program:n[1],additionalArgs:n[2]}}async function S5e(t,e,r,i,n){let s=n.preserveSymlinks?"--preserve-symlinks":"",o=[r.additionalArgs,s].filter(a=>a).join(" ");return n=Object.assign({},n,{prog:r.program,args:o}),await D5e(e,n),await n.fs_.writeFile(e,i(t,e,n),"utf8"),F5e(e,n)}function k5e(t,e,r){let n=Ws.relative(Ws.dirname(e),t).split("/").join("\\"),s=Ws.isAbsolute(n)?`"${n}"`:`"%~dp0\\${n}"`,o,a=r.prog,l=r.args||"",c=oT(r.nodePath).win32;a?(o=`"%~dp0\\${a}.exe"`,n=s):(a=s,l="",n="");let u=r.progArgs?`${r.progArgs.join(" ")} `:"",g=c?`@SET NODE_PATH=${c}\r -`:"";return o?g+=`@IF EXIST ${o} (\r - ${o} ${l} ${n} ${u}%*\r -) ELSE (\r - @SETLOCAL\r - @SET PATHEXT=%PATHEXT:;.JS;=;%\r - ${a} ${l} ${n} ${u}%*\r -)\r -`:g+=`@${a} ${l} ${n} ${u}%*\r -`,g}function x5e(t,e,r){let i=Ws.relative(Ws.dirname(e),t),n=r.prog&&r.prog.split("\\").join("/"),s;i=i.split("\\").join("/");let o=Ws.isAbsolute(i)?`"${i}"`:`"$basedir/${i}"`,a=r.args||"",l=oT(r.nodePath).posix;n?(s=`"$basedir/${r.prog}"`,i=o):(n=o,a="",i="");let c=r.progArgs?`${r.progArgs.join(" ")} `:"",u=`#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\\\,/,g')") - -case \`uname\` in - *CYGWIN*) basedir=\`cygpath -w "$basedir"\`;; -esac - -`,g=r.nodePath?`export NODE_PATH="${l}" -`:"";return s?u+=`${g}if [ -x ${s} ]; then - exec ${s} ${a} ${i} ${c}"$@" -else - exec ${n} ${a} ${i} ${c}"$@" -fi -`:u+=`${g}${n} ${a} ${i} ${c}"$@" -exit $? -`,u}function P5e(t,e,r){let i=Ws.relative(Ws.dirname(e),t),n=r.prog&&r.prog.split("\\").join("/"),s=n&&`"${n}$exe"`,o;i=i.split("\\").join("/");let a=Ws.isAbsolute(i)?`"${i}"`:`"$basedir/${i}"`,l=r.args||"",c=oT(r.nodePath),u=c.win32,g=c.posix;s?(o=`"$basedir/${r.prog}$exe"`,i=a):(s=a,l="",i="");let f=r.progArgs?`${r.progArgs.join(" ")} `:"",h=`#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -${r.nodePath?`$env_node_path=$env:NODE_PATH -$env:NODE_PATH="${u}" -`:""}if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" -}`;return r.nodePath&&(h+=` else { - $env:NODE_PATH="${g}" -}`),o?h+=` -$ret=0 -if (Test-Path ${o}) { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & ${o} ${l} ${i} ${f}$args - } else { - & ${o} ${l} ${i} ${f}$args - } - $ret=$LASTEXITCODE -} else { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & ${s} ${l} ${i} ${f}$args - } else { - & ${s} ${l} ${i} ${f}$args - } - $ret=$LASTEXITCODE -} -${r.nodePath?`$env:NODE_PATH=$env_node_path -`:""}exit $ret -`:h+=` -# Support pipeline input -if ($MyInvocation.ExpectingInput) { - $input | & ${s} ${l} ${i} ${f}$args -} else { - & ${s} ${l} ${i} ${f}$args -} -${r.nodePath?`$env:NODE_PATH=$env_node_path -`:""}exit $LASTEXITCODE -`,h}function R5e(t,e){return e.fs_.chmod(t,493)}function oT(t){if(!t)return{win32:"",posix:""};let e=typeof t=="string"?t.split(Ws.delimiter):Array.from(t),r={};for(let i=0;i`/mnt/${a.toLowerCase()}`):e[i];r.win32=r.win32?`${r.win32};${n}`:n,r.posix=r.posix?`${r.posix}:${s}`:s,r[i]={win32:n,posix:s}}return r}Wle.exports=sT});var yT=w((Kkt,dce)=>{dce.exports=require("stream")});var Ice=w((Ukt,Cce)=>{"use strict";function mce(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(n){return Object.getOwnPropertyDescriptor(t,n).enumerable})),r.push.apply(r,i)}return r}function $5e(t){for(var e=1;e0?this.tail.next=i:this.head=i,this.tail=i,++this.length}},{key:"unshift",value:function(r){var i={data:r,next:this.head};this.length===0&&(this.tail=i),this.head=i,++this.length}},{key:"shift",value:function(){if(this.length!==0){var r=this.head.data;return this.length===1?this.head=this.tail=null:this.head=this.head.next,--this.length,r}}},{key:"clear",value:function(){this.head=this.tail=null,this.length=0}},{key:"join",value:function(r){if(this.length===0)return"";for(var i=this.head,n=""+i.data;i=i.next;)n+=r+i.data;return n}},{key:"concat",value:function(r){if(this.length===0)return yb.alloc(0);for(var i=yb.allocUnsafe(r>>>0),n=this.head,s=0;n;)s_e(n.data,i,s),s+=n.data.length,n=n.next;return i}},{key:"consume",value:function(r,i){var n;return ro.length?o.length:r;if(a===o.length?s+=o:s+=o.slice(0,r),r-=a,r===0){a===o.length?(++n,i.next?this.head=i.next:this.head=this.tail=null):(this.head=i,i.data=o.slice(a));break}++n}return this.length-=n,s}},{key:"_getBuffer",value:function(r){var i=yb.allocUnsafe(r),n=this.head,s=1;for(n.data.copy(i),r-=n.data.length;n=n.next;){var o=n.data,a=r>o.length?o.length:r;if(o.copy(i,i.length-r,0,a),r-=a,r===0){a===o.length?(++s,n.next?this.head=n.next:this.head=this.tail=null):(this.head=n,n.data=o.slice(a));break}++s}return this.length-=s,i}},{key:n_e,value:function(r,i){return wT(this,$5e({},i,{depth:0,customInspect:!1}))}}]),t}()});var bT=w((Hkt,yce)=>{"use strict";function o_e(t,e){var r=this,i=this._readableState&&this._readableState.destroyed,n=this._writableState&&this._writableState.destroyed;return i||n?(e?e(t):t&&(this._writableState?this._writableState.errorEmitted||(this._writableState.errorEmitted=!0,process.nextTick(BT,this,t)):process.nextTick(BT,this,t)),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(t||null,function(s){!e&&s?r._writableState?r._writableState.errorEmitted?process.nextTick(wb,r):(r._writableState.errorEmitted=!0,process.nextTick(wce,r,s)):process.nextTick(wce,r,s):e?(process.nextTick(wb,r),e(s)):process.nextTick(wb,r)}),this)}function wce(t,e){BT(t,e),wb(t)}function wb(t){t._writableState&&!t._writableState.emitClose||t._readableState&&!t._readableState.emitClose||t.emit("close")}function a_e(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finalCalled=!1,this._writableState.prefinished=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}function BT(t,e){t.emit("error",e)}function A_e(t,e){var r=t._readableState,i=t._writableState;r&&r.autoDestroy||i&&i.autoDestroy?t.destroy(e):t.emit("error",e)}yce.exports={destroy:o_e,undestroy:a_e,errorOrDestroy:A_e}});var Ll=w((Gkt,Bce)=>{"use strict";var bce={};function zs(t,e,r){r||(r=Error);function i(s,o,a){return typeof e=="string"?e:e(s,o,a)}class n extends r{constructor(o,a,l){super(i(o,a,l))}}n.prototype.name=r.name,n.prototype.code=t,bce[t]=n}function Qce(t,e){if(Array.isArray(t)){let r=t.length;return t=t.map(i=>String(i)),r>2?`one of ${e} ${t.slice(0,r-1).join(", ")}, or `+t[r-1]:r===2?`one of ${e} ${t[0]} or ${t[1]}`:`of ${e} ${t[0]}`}else return`of ${e} ${String(t)}`}function l_e(t,e,r){return t.substr(!r||r<0?0:+r,e.length)===e}function c_e(t,e,r){return(r===void 0||r>t.length)&&(r=t.length),t.substring(r-e.length,r)===e}function u_e(t,e,r){return typeof r!="number"&&(r=0),r+e.length>t.length?!1:t.indexOf(e,r)!==-1}zs("ERR_INVALID_OPT_VALUE",function(t,e){return'The value "'+e+'" is invalid for option "'+t+'"'},TypeError);zs("ERR_INVALID_ARG_TYPE",function(t,e,r){let i;typeof e=="string"&&l_e(e,"not ")?(i="must not be",e=e.replace(/^not /,"")):i="must be";let n;if(c_e(t," argument"))n=`The ${t} ${i} ${Qce(e,"type")}`;else{let s=u_e(t,".")?"property":"argument";n=`The "${t}" ${s} ${i} ${Qce(e,"type")}`}return n+=`. Received type ${typeof r}`,n},TypeError);zs("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF");zs("ERR_METHOD_NOT_IMPLEMENTED",function(t){return"The "+t+" method is not implemented"});zs("ERR_STREAM_PREMATURE_CLOSE","Premature close");zs("ERR_STREAM_DESTROYED",function(t){return"Cannot call "+t+" after a stream was destroyed"});zs("ERR_MULTIPLE_CALLBACK","Callback called multiple times");zs("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable");zs("ERR_STREAM_WRITE_AFTER_END","write after end");zs("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError);zs("ERR_UNKNOWN_ENCODING",function(t){return"Unknown encoding: "+t},TypeError);zs("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event");Bce.exports.codes=bce});var QT=w((jkt,vce)=>{"use strict";var g_e=Ll().codes.ERR_INVALID_OPT_VALUE;function f_e(t,e,r){return t.highWaterMark!=null?t.highWaterMark:e?t[r]:null}function h_e(t,e,r,i){var n=f_e(e,i,r);if(n!=null){if(!(isFinite(n)&&Math.floor(n)===n)||n<0){var s=i?r:"highWaterMark";throw new g_e(s,n)}return Math.floor(n)}return t.objectMode?16:16*1024}vce.exports={getHighWaterMark:h_e}});var Sce=w((Ykt,vT)=>{typeof Object.create=="function"?vT.exports=function(e,r){r&&(e.super_=r,e.prototype=Object.create(r.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:vT.exports=function(e,r){if(r){e.super_=r;var i=function(){};i.prototype=r.prototype,e.prototype=new i,e.prototype.constructor=e}}});var Tl=w((qkt,ST)=>{try{if(kT=require("util"),typeof kT.inherits!="function")throw"";ST.exports=kT.inherits}catch(t){ST.exports=Sce()}var kT});var xce=w((Jkt,kce)=>{kce.exports=require("util").deprecate});var DT=w((Wkt,Pce)=>{"use strict";Pce.exports=jr;function Dce(t){var e=this;this.next=null,this.entry=null,this.finish=function(){p_e(e,t)}}var uh;jr.WritableState=Vm;var d_e={deprecate:xce()},Rce=yT(),Bb=require("buffer").Buffer,C_e=global.Uint8Array||function(){};function m_e(t){return Bb.from(t)}function E_e(t){return Bb.isBuffer(t)||t instanceof C_e}var xT=bT(),I_e=QT(),y_e=I_e.getHighWaterMark,Ol=Ll().codes,w_e=Ol.ERR_INVALID_ARG_TYPE,B_e=Ol.ERR_METHOD_NOT_IMPLEMENTED,b_e=Ol.ERR_MULTIPLE_CALLBACK,Q_e=Ol.ERR_STREAM_CANNOT_PIPE,v_e=Ol.ERR_STREAM_DESTROYED,S_e=Ol.ERR_STREAM_NULL_VALUES,k_e=Ol.ERR_STREAM_WRITE_AFTER_END,x_e=Ol.ERR_UNKNOWN_ENCODING,gh=xT.errorOrDestroy;Tl()(jr,Rce);function P_e(){}function Vm(t,e,r){uh=uh||Su(),t=t||{},typeof r!="boolean"&&(r=e instanceof uh),this.objectMode=!!t.objectMode,r&&(this.objectMode=this.objectMode||!!t.writableObjectMode),this.highWaterMark=y_e(this,t,"writableHighWaterMark",r),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var i=t.decodeStrings===!1;this.decodeStrings=!i,this.defaultEncoding=t.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(n){D_e(e,n)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=t.emitClose!==!1,this.autoDestroy=!!t.autoDestroy,this.bufferedRequestCount=0,this.corkedRequestsFree=new Dce(this)}Vm.prototype.getBuffer=function(){for(var e=this.bufferedRequest,r=[];e;)r.push(e),e=e.next;return r};(function(){try{Object.defineProperty(Vm.prototype,"buffer",{get:d_e.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch(t){}})();var bb;typeof Symbol=="function"&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]=="function"?(bb=Function.prototype[Symbol.hasInstance],Object.defineProperty(jr,Symbol.hasInstance,{value:function(e){return bb.call(this,e)?!0:this!==jr?!1:e&&e._writableState instanceof Vm}})):bb=function(e){return e instanceof this};function jr(t){uh=uh||Su();var e=this instanceof uh;if(!e&&!bb.call(jr,this))return new jr(t);this._writableState=new Vm(t,this,e),this.writable=!0,t&&(typeof t.write=="function"&&(this._write=t.write),typeof t.writev=="function"&&(this._writev=t.writev),typeof t.destroy=="function"&&(this._destroy=t.destroy),typeof t.final=="function"&&(this._final=t.final)),Rce.call(this)}jr.prototype.pipe=function(){gh(this,new Q_e)};function R_e(t,e){var r=new k_e;gh(t,r),process.nextTick(e,r)}function F_e(t,e,r,i){var n;return r===null?n=new S_e:typeof r!="string"&&!e.objectMode&&(n=new w_e("chunk",["string","Buffer"],r)),n?(gh(t,n),process.nextTick(i,n),!1):!0}jr.prototype.write=function(t,e,r){var i=this._writableState,n=!1,s=!i.objectMode&&E_e(t);return s&&!Bb.isBuffer(t)&&(t=m_e(t)),typeof e=="function"&&(r=e,e=null),s?e="buffer":e||(e=i.defaultEncoding),typeof r!="function"&&(r=P_e),i.ending?R_e(this,r):(s||F_e(this,i,t,r))&&(i.pendingcb++,n=N_e(this,i,s,t,e,r)),n};jr.prototype.cork=function(){this._writableState.corked++};jr.prototype.uncork=function(){var t=this._writableState;t.corked&&(t.corked--,!t.writing&&!t.corked&&!t.bufferProcessing&&t.bufferedRequest&&Fce(this,t))};jr.prototype.setDefaultEncoding=function(e){if(typeof e=="string"&&(e=e.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((e+"").toLowerCase())>-1))throw new x_e(e);return this._writableState.defaultEncoding=e,this};Object.defineProperty(jr.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}});function L_e(t,e,r){return!t.objectMode&&t.decodeStrings!==!1&&typeof e=="string"&&(e=Bb.from(e,r)),e}Object.defineProperty(jr.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});function N_e(t,e,r,i,n,s){if(!r){var o=L_e(e,i,n);i!==o&&(r=!0,n="buffer",i=o)}var a=e.objectMode?1:i.length;e.length+=a;var l=e.length{"use strict";var G_e=Object.keys||function(t){var e=[];for(var r in t)e.push(r);return e};Tce.exports=da;var Oce=RT(),FT=DT();Tl()(da,Oce);for(NT=G_e(FT.prototype),Qb=0;Qb{var Sb=require("buffer"),bA=Sb.Buffer;function Kce(t,e){for(var r in t)e[r]=t[r]}bA.from&&bA.alloc&&bA.allocUnsafe&&bA.allocUnsafeSlow?Mce.exports=Sb:(Kce(Sb,LT),LT.Buffer=fh);function fh(t,e,r){return bA(t,e,r)}Kce(bA,fh);fh.from=function(t,e,r){if(typeof t=="number")throw new TypeError("Argument must not be a number");return bA(t,e,r)};fh.alloc=function(t,e,r){if(typeof t!="number")throw new TypeError("Argument must be a number");var i=bA(t);return e!==void 0?typeof r=="string"?i.fill(e,r):i.fill(e):i.fill(0),i};fh.allocUnsafe=function(t){if(typeof t!="number")throw new TypeError("Argument must be a number");return bA(t)};fh.allocUnsafeSlow=function(t){if(typeof t!="number")throw new TypeError("Argument must be a number");return Sb.SlowBuffer(t)}});var MT=w(Hce=>{"use strict";var TT=Uce().Buffer,Gce=TT.isEncoding||function(t){switch(t=""+t,t&&t.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function q_e(t){if(!t)return"utf8";for(var e;;)switch(t){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return t;default:if(e)return;t=(""+t).toLowerCase(),e=!0}}function J_e(t){var e=q_e(t);if(typeof e!="string"&&(TT.isEncoding===Gce||!Gce(t)))throw new Error("Unknown encoding: "+t);return e||t}Hce.StringDecoder=Zm;function Zm(t){this.encoding=J_e(t);var e;switch(this.encoding){case"utf16le":this.text=z_e,this.end=__e,e=4;break;case"utf8":this.fillLast=W_e,e=4;break;case"base64":this.text=V_e,this.end=X_e,e=3;break;default:this.write=Z_e,this.end=$_e;return}this.lastNeed=0,this.lastTotal=0,this.lastChar=TT.allocUnsafe(e)}Zm.prototype.write=function(t){if(t.length===0)return"";var e,r;if(this.lastNeed){if(e=this.fillLast(t),e===void 0)return"";r=this.lastNeed,this.lastNeed=0}else r=0;return r>5==6?2:t>>4==14?3:t>>3==30?4:t>>6==2?-1:-2}function r6e(t,e,r){var i=e.length-1;if(i=0?(n>0&&(t.lastNeed=n-1),n):--i=0?(n>0&&(t.lastNeed=n-2),n):--i=0?(n>0&&(n===2?n=0:t.lastNeed=n-3),n):0))}function i6e(t,e,r){if((e[0]&192)!=128)return t.lastNeed=0,"\uFFFD";if(t.lastNeed>1&&e.length>1){if((e[1]&192)!=128)return t.lastNeed=1,"\uFFFD";if(t.lastNeed>2&&e.length>2&&(e[2]&192)!=128)return t.lastNeed=2,"\uFFFD"}}function W_e(t){var e=this.lastTotal-this.lastNeed,r=i6e(this,t,e);if(r!==void 0)return r;if(this.lastNeed<=t.length)return t.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);t.copy(this.lastChar,e,0,t.length),this.lastNeed-=t.length}function t6e(t,e){var r=r6e(this,t,e);if(!this.lastNeed)return t.toString("utf8",e);this.lastTotal=r;var i=t.length-(r-this.lastNeed);return t.copy(this.lastChar,0,i),t.toString("utf8",e,i)}function e6e(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+"\uFFFD":e}function z_e(t,e){if((t.length-e)%2==0){var r=t.toString("utf16le",e);if(r){var i=r.charCodeAt(r.length-1);if(i>=55296&&i<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=t[t.length-1],t.toString("utf16le",e,t.length-1)}function __e(t){var e=t&&t.length?this.write(t):"";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return e+this.lastChar.toString("utf16le",0,r)}return e}function V_e(t,e){var r=(t.length-e)%3;return r===0?t.toString("base64",e):(this.lastNeed=3-r,this.lastTotal=3,r===1?this.lastChar[0]=t[t.length-1]:(this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1]),t.toString("base64",e,t.length-r))}function X_e(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+this.lastChar.toString("base64",0,3-this.lastNeed):e}function Z_e(t){return t.toString(this.encoding)}function $_e(t){return t&&t.length?this.write(t):""}});var kb=w((Vkt,jce)=>{"use strict";var Yce=Ll().codes.ERR_STREAM_PREMATURE_CLOSE;function n6e(t){var e=!1;return function(){if(!e){e=!0;for(var r=arguments.length,i=new Array(r),n=0;n{"use strict";var xb;function Ml(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var a6e=kb(),Kl=Symbol("lastResolve"),ku=Symbol("lastReject"),$m=Symbol("error"),Pb=Symbol("ended"),xu=Symbol("lastPromise"),KT=Symbol("handlePromise"),Pu=Symbol("stream");function Ul(t,e){return{value:t,done:e}}function A6e(t){var e=t[Kl];if(e!==null){var r=t[Pu].read();r!==null&&(t[xu]=null,t[Kl]=null,t[ku]=null,e(Ul(r,!1)))}}function l6e(t){process.nextTick(A6e,t)}function c6e(t,e){return function(r,i){t.then(function(){if(e[Pb]){r(Ul(void 0,!0));return}e[KT](r,i)},i)}}var u6e=Object.getPrototypeOf(function(){}),g6e=Object.setPrototypeOf((xb={get stream(){return this[Pu]},next:function(){var e=this,r=this[$m];if(r!==null)return Promise.reject(r);if(this[Pb])return Promise.resolve(Ul(void 0,!0));if(this[Pu].destroyed)return new Promise(function(o,a){process.nextTick(function(){e[$m]?a(e[$m]):o(Ul(void 0,!0))})});var i=this[xu],n;if(i)n=new Promise(c6e(i,this));else{var s=this[Pu].read();if(s!==null)return Promise.resolve(Ul(s,!1));n=new Promise(this[KT])}return this[xu]=n,n}},Ml(xb,Symbol.asyncIterator,function(){return this}),Ml(xb,"return",function(){var e=this;return new Promise(function(r,i){e[Pu].destroy(null,function(n){if(n){i(n);return}r(Ul(void 0,!0))})})}),xb),u6e),f6e=function(e){var r,i=Object.create(g6e,(r={},Ml(r,Pu,{value:e,writable:!0}),Ml(r,Kl,{value:null,writable:!0}),Ml(r,ku,{value:null,writable:!0}),Ml(r,$m,{value:null,writable:!0}),Ml(r,Pb,{value:e._readableState.endEmitted,writable:!0}),Ml(r,KT,{value:function(s,o){var a=i[Pu].read();a?(i[xu]=null,i[Kl]=null,i[ku]=null,s(Ul(a,!1))):(i[Kl]=s,i[ku]=o)},writable:!0}),r));return i[xu]=null,a6e(e,function(n){if(n&&n.code!=="ERR_STREAM_PREMATURE_CLOSE"){var s=i[ku];s!==null&&(i[xu]=null,i[Kl]=null,i[ku]=null,s(n)),i[$m]=n;return}var o=i[Kl];o!==null&&(i[xu]=null,i[Kl]=null,i[ku]=null,o(Ul(void 0,!0))),i[Pb]=!0}),e.on("readable",l6e.bind(null,i)),i};Jce.exports=f6e});var Xce=w((Zkt,zce)=>{"use strict";function _ce(t,e,r,i,n,s,o){try{var a=t[s](o),l=a.value}catch(c){r(c);return}a.done?e(l):Promise.resolve(l).then(i,n)}function h6e(t){return function(){var e=this,r=arguments;return new Promise(function(i,n){var s=t.apply(e,r);function o(l){_ce(s,i,n,o,a,"next",l)}function a(l){_ce(s,i,n,o,a,"throw",l)}o(void 0)})}}function Vce(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(n){return Object.getOwnPropertyDescriptor(t,n).enumerable})),r.push.apply(r,i)}return r}function d6e(t){for(var e=1;e{"use strict";Zce.exports=Ut;var hh;Ut.ReadableState=$ce;var $kt=require("events").EventEmitter,eue=function(e,r){return e.listeners(r).length},eE=yT(),Db=require("buffer").Buffer,E6e=global.Uint8Array||function(){};function I6e(t){return Db.from(t)}function y6e(t){return Db.isBuffer(t)||t instanceof E6e}var UT=require("util"),xt;UT&&UT.debuglog?xt=UT.debuglog("stream"):xt=function(){};var w6e=Ice(),HT=bT(),B6e=QT(),b6e=B6e.getHighWaterMark,Rb=Ll().codes,Q6e=Rb.ERR_INVALID_ARG_TYPE,v6e=Rb.ERR_STREAM_PUSH_AFTER_EOF,S6e=Rb.ERR_METHOD_NOT_IMPLEMENTED,k6e=Rb.ERR_STREAM_UNSHIFT_AFTER_END_EVENT,ph,GT,jT;Tl()(Ut,eE);var tE=HT.errorOrDestroy,YT=["error","close","destroy","pause","resume"];function x6e(t,e,r){if(typeof t.prependListener=="function")return t.prependListener(e,r);!t._events||!t._events[e]?t.on(e,r):Array.isArray(t._events[e])?t._events[e].unshift(r):t._events[e]=[r,t._events[e]]}function $ce(t,e,r){hh=hh||Su(),t=t||{},typeof r!="boolean"&&(r=e instanceof hh),this.objectMode=!!t.objectMode,r&&(this.objectMode=this.objectMode||!!t.readableObjectMode),this.highWaterMark=b6e(this,t,"readableHighWaterMark",r),this.buffer=new w6e,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.paused=!0,this.emitClose=t.emitClose!==!1,this.autoDestroy=!!t.autoDestroy,this.destroyed=!1,this.defaultEncoding=t.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,t.encoding&&(ph||(ph=MT().StringDecoder),this.decoder=new ph(t.encoding),this.encoding=t.encoding)}function Ut(t){if(hh=hh||Su(),!(this instanceof Ut))return new Ut(t);var e=this instanceof hh;this._readableState=new $ce(t,this,e),this.readable=!0,t&&(typeof t.read=="function"&&(this._read=t.read),typeof t.destroy=="function"&&(this._destroy=t.destroy)),eE.call(this)}Object.defineProperty(Ut.prototype,"destroyed",{enumerable:!1,get:function(){return this._readableState===void 0?!1:this._readableState.destroyed},set:function(e){!this._readableState||(this._readableState.destroyed=e)}});Ut.prototype.destroy=HT.destroy;Ut.prototype._undestroy=HT.undestroy;Ut.prototype._destroy=function(t,e){e(t)};Ut.prototype.push=function(t,e){var r=this._readableState,i;return r.objectMode?i=!0:typeof t=="string"&&(e=e||r.defaultEncoding,e!==r.encoding&&(t=Db.from(t,e),e=""),i=!0),tue(this,t,e,!1,i)};Ut.prototype.unshift=function(t){return tue(this,t,null,!0,!1)};function tue(t,e,r,i,n){xt("readableAddChunk",e);var s=t._readableState;if(e===null)s.reading=!1,D6e(t,s);else{var o;if(n||(o=P6e(s,e)),o)tE(t,o);else if(s.objectMode||e&&e.length>0)if(typeof e!="string"&&!s.objectMode&&Object.getPrototypeOf(e)!==Db.prototype&&(e=I6e(e)),i)s.endEmitted?tE(t,new k6e):qT(t,s,e,!0);else if(s.ended)tE(t,new v6e);else{if(s.destroyed)return!1;s.reading=!1,s.decoder&&!r?(e=s.decoder.write(e),s.objectMode||e.length!==0?qT(t,s,e,!1):JT(t,s)):qT(t,s,e,!1)}else i||(s.reading=!1,JT(t,s))}return!s.ended&&(s.length=rue?t=rue:(t--,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t++),t}function iue(t,e){return t<=0||e.length===0&&e.ended?0:e.objectMode?1:t!==t?e.flowing&&e.length?e.buffer.head.data.length:e.length:(t>e.highWaterMark&&(e.highWaterMark=R6e(t)),t<=e.length?t:e.ended?e.length:(e.needReadable=!0,0))}Ut.prototype.read=function(t){xt("read",t),t=parseInt(t,10);var e=this._readableState,r=t;if(t!==0&&(e.emittedReadable=!1),t===0&&e.needReadable&&((e.highWaterMark!==0?e.length>=e.highWaterMark:e.length>0)||e.ended))return xt("read: emitReadable",e.length,e.ended),e.length===0&&e.ended?WT(this):Fb(this),null;if(t=iue(t,e),t===0&&e.ended)return e.length===0&&WT(this),null;var i=e.needReadable;xt("need readable",i),(e.length===0||e.length-t0?n=nue(t,e):n=null,n===null?(e.needReadable=e.length<=e.highWaterMark,t=0):(e.length-=t,e.awaitDrain=0),e.length===0&&(e.ended||(e.needReadable=!0),r!==t&&e.ended&&WT(this)),n!==null&&this.emit("data",n),n};function D6e(t,e){if(xt("onEofChunk"),!e.ended){if(e.decoder){var r=e.decoder.end();r&&r.length&&(e.buffer.push(r),e.length+=e.objectMode?1:r.length)}e.ended=!0,e.sync?Fb(t):(e.needReadable=!1,e.emittedReadable||(e.emittedReadable=!0,sue(t)))}}function Fb(t){var e=t._readableState;xt("emitReadable",e.needReadable,e.emittedReadable),e.needReadable=!1,e.emittedReadable||(xt("emitReadable",e.flowing),e.emittedReadable=!0,process.nextTick(sue,t))}function sue(t){var e=t._readableState;xt("emitReadable_",e.destroyed,e.length,e.ended),!e.destroyed&&(e.length||e.ended)&&(t.emit("readable"),e.emittedReadable=!1),e.needReadable=!e.flowing&&!e.ended&&e.length<=e.highWaterMark,zT(t)}function JT(t,e){e.readingMore||(e.readingMore=!0,process.nextTick(F6e,t,e))}function F6e(t,e){for(;!e.reading&&!e.ended&&(e.length1&&oue(i.pipes,t)!==-1)&&!c&&(xt("false write response, pause",i.awaitDrain),i.awaitDrain++),r.pause())}function f(y){xt("onerror",y),m(),t.removeListener("error",f),eue(t,"error")===0&&tE(t,y)}x6e(t,"error",f);function h(){t.removeListener("finish",p),m()}t.once("close",h);function p(){xt("onfinish"),t.removeListener("close",h),m()}t.once("finish",p);function m(){xt("unpipe"),r.unpipe(t)}return t.emit("pipe",r),i.flowing||(xt("pipe resume"),r.resume()),t};function N6e(t){return function(){var r=t._readableState;xt("pipeOnDrain",r.awaitDrain),r.awaitDrain&&r.awaitDrain--,r.awaitDrain===0&&eue(t,"data")&&(r.flowing=!0,zT(t))}}Ut.prototype.unpipe=function(t){var e=this._readableState,r={hasUnpiped:!1};if(e.pipesCount===0)return this;if(e.pipesCount===1)return t&&t!==e.pipes?this:(t||(t=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,t&&t.emit("unpipe",this,r),this);if(!t){var i=e.pipes,n=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var s=0;s0,i.flowing!==!1&&this.resume()):t==="readable"&&!i.endEmitted&&!i.readableListening&&(i.readableListening=i.needReadable=!0,i.flowing=!1,i.emittedReadable=!1,xt("on readable",i.length,i.reading),i.length?Fb(this):i.reading||process.nextTick(L6e,this)),r};Ut.prototype.addListener=Ut.prototype.on;Ut.prototype.removeListener=function(t,e){var r=eE.prototype.removeListener.call(this,t,e);return t==="readable"&&process.nextTick(aue,this),r};Ut.prototype.removeAllListeners=function(t){var e=eE.prototype.removeAllListeners.apply(this,arguments);return(t==="readable"||t===void 0)&&process.nextTick(aue,this),e};function aue(t){var e=t._readableState;e.readableListening=t.listenerCount("readable")>0,e.resumeScheduled&&!e.paused?e.flowing=!0:t.listenerCount("data")>0&&t.resume()}function L6e(t){xt("readable nexttick read 0"),t.read(0)}Ut.prototype.resume=function(){var t=this._readableState;return t.flowing||(xt("resume"),t.flowing=!t.readableListening,T6e(this,t)),t.paused=!1,this};function T6e(t,e){e.resumeScheduled||(e.resumeScheduled=!0,process.nextTick(O6e,t,e))}function O6e(t,e){xt("resume",e.reading),e.reading||t.read(0),e.resumeScheduled=!1,t.emit("resume"),zT(t),e.flowing&&!e.reading&&t.read(0)}Ut.prototype.pause=function(){return xt("call pause flowing=%j",this._readableState.flowing),this._readableState.flowing!==!1&&(xt("pause"),this._readableState.flowing=!1,this.emit("pause")),this._readableState.paused=!0,this};function zT(t){var e=t._readableState;for(xt("flow",e.flowing);e.flowing&&t.read()!==null;);}Ut.prototype.wrap=function(t){var e=this,r=this._readableState,i=!1;t.on("end",function(){if(xt("wrapped end"),r.decoder&&!r.ended){var o=r.decoder.end();o&&o.length&&e.push(o)}e.push(null)}),t.on("data",function(o){if(xt("wrapped data"),r.decoder&&(o=r.decoder.write(o)),!(r.objectMode&&o==null)&&!(!r.objectMode&&(!o||!o.length))){var a=e.push(o);a||(i=!0,t.pause())}});for(var n in t)this[n]===void 0&&typeof t[n]=="function"&&(this[n]=function(a){return function(){return t[a].apply(t,arguments)}}(n));for(var s=0;s=e.length?(e.decoder?r=e.buffer.join(""):e.buffer.length===1?r=e.buffer.first():r=e.buffer.concat(e.length),e.buffer.clear()):r=e.buffer.consume(t,e.decoder),r}function WT(t){var e=t._readableState;xt("endReadable",e.endEmitted),e.endEmitted||(e.ended=!0,process.nextTick(M6e,e,t))}function M6e(t,e){if(xt("endReadableNT",t.endEmitted,t.length),!t.endEmitted&&t.length===0&&(t.endEmitted=!0,e.readable=!1,e.emit("end"),t.autoDestroy)){var r=e._writableState;(!r||r.autoDestroy&&r.finished)&&e.destroy()}}typeof Symbol=="function"&&(Ut.from=function(t,e){return jT===void 0&&(jT=Xce()),jT(Ut,t,e)});function oue(t,e){for(var r=0,i=t.length;r{"use strict";Aue.exports=QA;var Nb=Ll().codes,K6e=Nb.ERR_METHOD_NOT_IMPLEMENTED,U6e=Nb.ERR_MULTIPLE_CALLBACK,H6e=Nb.ERR_TRANSFORM_ALREADY_TRANSFORMING,G6e=Nb.ERR_TRANSFORM_WITH_LENGTH_0,Lb=Su();Tl()(QA,Lb);function j6e(t,e){var r=this._transformState;r.transforming=!1;var i=r.writecb;if(i===null)return this.emit("error",new U6e);r.writechunk=null,r.writecb=null,e!=null&&this.push(e),i(t);var n=this._readableState;n.reading=!1,(n.needReadable||n.length{"use strict";cue.exports=rE;var uue=_T();Tl()(rE,uue);function rE(t){if(!(this instanceof rE))return new rE(t);uue.call(this,t)}rE.prototype._transform=function(t,e,r){r(null,t)}});var Cue=w((ixt,fue)=>{"use strict";var VT;function q6e(t){var e=!1;return function(){e||(e=!0,t.apply(void 0,arguments))}}var hue=Ll().codes,J6e=hue.ERR_MISSING_ARGS,W6e=hue.ERR_STREAM_DESTROYED;function pue(t){if(t)throw t}function z6e(t){return t.setHeader&&typeof t.abort=="function"}function _6e(t,e,r,i){i=q6e(i);var n=!1;t.on("close",function(){n=!0}),VT===void 0&&(VT=kb()),VT(t,{readable:e,writable:r},function(o){if(o)return i(o);n=!0,i()});var s=!1;return function(o){if(!n&&!s){if(s=!0,z6e(t))return t.abort();if(typeof t.destroy=="function")return t.destroy();i(o||new W6e("pipe"))}}}function due(t){t()}function V6e(t,e){return t.pipe(e)}function X6e(t){return!t.length||typeof t[t.length-1]!="function"?pue:t.pop()}function Z6e(){for(var t=arguments.length,e=new Array(t),r=0;r0;return _6e(o,l,c,function(u){n||(n=u),u&&s.forEach(due),!l&&(s.forEach(due),i(n))})});return e.reduce(V6e)}fue.exports=Z6e});var dh=w((_s,iE)=>{var nE=require("stream");process.env.READABLE_STREAM==="disable"&&nE?(iE.exports=nE.Readable,Object.assign(iE.exports,nE),iE.exports.Stream=nE):(_s=iE.exports=RT(),_s.Stream=nE||_s,_s.Readable=_s,_s.Writable=DT(),_s.Duplex=Su(),_s.Transform=_T(),_s.PassThrough=gue(),_s.finished=kb(),_s.pipeline=Cue())});var Iue=w((nxt,mue)=>{"use strict";var{Buffer:Qo}=require("buffer"),Eue=Symbol.for("BufferList");function mr(t){if(!(this instanceof mr))return new mr(t);mr._init.call(this,t)}mr._init=function(e){Object.defineProperty(this,Eue,{value:!0}),this._bufs=[],this.length=0,e&&this.append(e)};mr.prototype._new=function(e){return new mr(e)};mr.prototype._offset=function(e){if(e===0)return[0,0];let r=0;for(let i=0;ithis.length||e<0)return;let r=this._offset(e);return this._bufs[r[0]][r[1]]};mr.prototype.slice=function(e,r){return typeof e=="number"&&e<0&&(e+=this.length),typeof r=="number"&&r<0&&(r+=this.length),this.copy(null,0,e,r)};mr.prototype.copy=function(e,r,i,n){if((typeof i!="number"||i<0)&&(i=0),(typeof n!="number"||n>this.length)&&(n=this.length),i>=this.length||n<=0)return e||Qo.alloc(0);let s=!!e,o=this._offset(i),a=n-i,l=a,c=s&&r||0,u=o[1];if(i===0&&n===this.length){if(!s)return this._bufs.length===1?this._bufs[0]:Qo.concat(this._bufs,this.length);for(let g=0;gf)this._bufs[g].copy(e,c,u),c+=f;else{this._bufs[g].copy(e,c,u,u+l),c+=f;break}l-=f,u&&(u=0)}return e.length>c?e.slice(0,c):e};mr.prototype.shallowSlice=function(e,r){if(e=e||0,r=typeof r!="number"?this.length:r,e<0&&(e+=this.length),r<0&&(r+=this.length),e===r)return this._new();let i=this._offset(e),n=this._offset(r),s=this._bufs.slice(i[0],n[0]+1);return n[1]===0?s.pop():s[s.length-1]=s[s.length-1].slice(0,n[1]),i[1]!==0&&(s[0]=s[0].slice(i[1])),this._new(s)};mr.prototype.toString=function(e,r,i){return this.slice(r,i).toString(e)};mr.prototype.consume=function(e){if(e=Math.trunc(e),Number.isNaN(e)||e<=0)return this;for(;this._bufs.length;)if(e>=this._bufs[0].length)e-=this._bufs[0].length,this.length-=this._bufs[0].length,this._bufs.shift();else{this._bufs[0]=this._bufs[0].slice(e),this.length-=e;break}return this};mr.prototype.duplicate=function(){let e=this._new();for(let r=0;rthis.length?this.length:e;let i=this._offset(e),n=i[0],s=i[1];for(;n=t.length){let l=o.indexOf(t,s);if(l!==-1)return this._reverseOffset([n,l]);s=o.length-t.length+1}else{let l=this._reverseOffset([n,s]);if(this._match(l,t))return l;s++}s=0}return-1};mr.prototype._match=function(t,e){if(this.length-t{"use strict";var XT=dh().Duplex,$6e=Tl(),sE=Iue();function Zi(t){if(!(this instanceof Zi))return new Zi(t);if(typeof t=="function"){this._callback=t;let e=function(i){this._callback&&(this._callback(i),this._callback=null)}.bind(this);this.on("pipe",function(i){i.on("error",e)}),this.on("unpipe",function(i){i.removeListener("error",e)}),t=null}sE._init.call(this,t),XT.call(this)}$6e(Zi,XT);Object.assign(Zi.prototype,sE.prototype);Zi.prototype._new=function(e){return new Zi(e)};Zi.prototype._write=function(e,r,i){this._appendBuffer(e),typeof i=="function"&&i()};Zi.prototype._read=function(e){if(!this.length)return this.push(null);e=Math.min(e,this.length),this.push(this.slice(0,e)),this.consume(e)};Zi.prototype.end=function(e){XT.prototype.end.call(this,e),this._callback&&(this._callback(null,this.slice()),this._callback=null)};Zi.prototype._destroy=function(e,r){this._bufs.length=0,this.length=0,r(e)};Zi.prototype._isBufferList=function(e){return e instanceof Zi||e instanceof sE||Zi.isBufferList(e)};Zi.isBufferList=sE.isBufferList;Tb.exports=Zi;Tb.exports.BufferListStream=Zi;Tb.exports.BufferList=sE});var eO=w(Ch=>{var eVe=Buffer.alloc,tVe="0000000000000000000",rVe="7777777777777777777",wue="0".charCodeAt(0),Bue=Buffer.from("ustar\0","binary"),iVe=Buffer.from("00","binary"),nVe=Buffer.from("ustar ","binary"),sVe=Buffer.from(" \0","binary"),oVe=parseInt("7777",8),oE=257,ZT=263,aVe=function(t,e,r){return typeof t!="number"?r:(t=~~t,t>=e?e:t>=0||(t+=e,t>=0)?t:0)},AVe=function(t){switch(t){case 0:return"file";case 1:return"link";case 2:return"symlink";case 3:return"character-device";case 4:return"block-device";case 5:return"directory";case 6:return"fifo";case 7:return"contiguous-file";case 72:return"pax-header";case 55:return"pax-global-header";case 27:return"gnu-long-link-path";case 28:case 30:return"gnu-long-path"}return null},lVe=function(t){switch(t){case"file":return 0;case"link":return 1;case"symlink":return 2;case"character-device":return 3;case"block-device":return 4;case"directory":return 5;case"fifo":return 6;case"contiguous-file":return 7;case"pax-header":return 72}return 0},bue=function(t,e,r,i){for(;re?rVe.slice(0,e)+" ":tVe.slice(0,e-t.length)+t+" "};function cVe(t){var e;if(t[0]===128)e=!0;else if(t[0]===255)e=!1;else return null;for(var r=[],i=t.length-1;i>0;i--){var n=t[i];e?r.push(n):r.push(255-n)}var s=0,o=r.length;for(i=0;i=Math.pow(10,r)&&r++,e+r+t};Ch.decodeLongPath=function(t,e){return mh(t,0,t.length,e)};Ch.encodePax=function(t){var e="";t.name&&(e+=$T(" path="+t.name+` -`)),t.linkname&&(e+=$T(" linkpath="+t.linkname+` -`));var r=t.pax;if(r)for(var i in r)e+=$T(" "+i+"="+r[i]+` -`);return Buffer.from(e)};Ch.decodePax=function(t){for(var e={};t.length;){for(var r=0;r100;){var n=r.indexOf("/");if(n===-1)return null;i+=i?"/"+r.slice(0,n):r.slice(0,n),r=r.slice(n+1)}return Buffer.byteLength(r)>100||Buffer.byteLength(i)>155||t.linkname&&Buffer.byteLength(t.linkname)>100?null:(e.write(r),e.write(Hl(t.mode&oVe,6),100),e.write(Hl(t.uid,6),108),e.write(Hl(t.gid,6),116),e.write(Hl(t.size,11),124),e.write(Hl(t.mtime.getTime()/1e3|0,11),136),e[156]=wue+lVe(t.type),t.linkname&&e.write(t.linkname,157),Bue.copy(e,oE),iVe.copy(e,ZT),t.uname&&e.write(t.uname,265),t.gname&&e.write(t.gname,297),e.write(Hl(t.devmajor||0,6),329),e.write(Hl(t.devminor||0,6),337),i&&e.write(i,345),e.write(Hl(Que(e),6),148),e)};Ch.decode=function(t,e,r){var i=t[156]===0?0:t[156]-wue,n=mh(t,0,100,e),s=Gl(t,100,8),o=Gl(t,108,8),a=Gl(t,116,8),l=Gl(t,124,12),c=Gl(t,136,12),u=AVe(i),g=t[157]===0?null:mh(t,157,100,e),f=mh(t,265,32),h=mh(t,297,32),p=Gl(t,329,8),m=Gl(t,337,8),y=Que(t);if(y===8*32)return null;if(y!==Gl(t,148,8))throw new Error("Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?");if(Bue.compare(t,oE,oE+6)===0)t[345]&&(n=mh(t,345,155,e)+"/"+n);else if(!(nVe.compare(t,oE,oE+6)===0&&sVe.compare(t,ZT,ZT+2)===0)){if(!r)throw new Error("Invalid tar header: unknown format.")}return i===0&&n&&n[n.length-1]==="/"&&(i=5),{name:n,mode:s,uid:o,gid:a,size:l,mtime:new Date(1e3*c),type:u,linkname:g,uname:f,gname:h,devmajor:p,devminor:m}}});var Rue=w((axt,vue)=>{var Sue=require("util"),uVe=yue(),aE=eO(),kue=dh().Writable,xue=dh().PassThrough,Pue=function(){},Due=function(t){return t&=511,t&&512-t},gVe=function(t,e){var r=new Ob(t,e);return r.end(),r},fVe=function(t,e){return e.path&&(t.name=e.path),e.linkpath&&(t.linkname=e.linkpath),e.size&&(t.size=parseInt(e.size,10)),t.pax=e,t},Ob=function(t,e){this._parent=t,this.offset=e,xue.call(this,{autoDestroy:!1})};Sue.inherits(Ob,xue);Ob.prototype.destroy=function(t){this._parent.destroy(t)};var vA=function(t){if(!(this instanceof vA))return new vA(t);kue.call(this,t),t=t||{},this._offset=0,this._buffer=uVe(),this._missing=0,this._partial=!1,this._onparse=Pue,this._header=null,this._stream=null,this._overflow=null,this._cb=null,this._locked=!1,this._destroyed=!1,this._pax=null,this._paxGlobal=null,this._gnuLongPath=null,this._gnuLongLinkPath=null;var e=this,r=e._buffer,i=function(){e._continue()},n=function(f){if(e._locked=!1,f)return e.destroy(f);e._stream||i()},s=function(){e._stream=null;var f=Due(e._header.size);f?e._parse(f,o):e._parse(512,g),e._locked||i()},o=function(){e._buffer.consume(Due(e._header.size)),e._parse(512,g),i()},a=function(){var f=e._header.size;e._paxGlobal=aE.decodePax(r.slice(0,f)),r.consume(f),s()},l=function(){var f=e._header.size;e._pax=aE.decodePax(r.slice(0,f)),e._paxGlobal&&(e._pax=Object.assign({},e._paxGlobal,e._pax)),r.consume(f),s()},c=function(){var f=e._header.size;this._gnuLongPath=aE.decodeLongPath(r.slice(0,f),t.filenameEncoding),r.consume(f),s()},u=function(){var f=e._header.size;this._gnuLongLinkPath=aE.decodeLongPath(r.slice(0,f),t.filenameEncoding),r.consume(f),s()},g=function(){var f=e._offset,h;try{h=e._header=aE.decode(r.slice(0,512),t.filenameEncoding,t.allowUnknownFormat)}catch(p){e.emit("error",p)}if(r.consume(512),!h){e._parse(512,g),i();return}if(h.type==="gnu-long-path"){e._parse(h.size,c),i();return}if(h.type==="gnu-long-link-path"){e._parse(h.size,u),i();return}if(h.type==="pax-global-header"){e._parse(h.size,a),i();return}if(h.type==="pax-header"){e._parse(h.size,l),i();return}if(e._gnuLongPath&&(h.name=e._gnuLongPath,e._gnuLongPath=null),e._gnuLongLinkPath&&(h.linkname=e._gnuLongLinkPath,e._gnuLongLinkPath=null),e._pax&&(e._header=h=fVe(h,e._pax),e._pax=null),e._locked=!0,!h.size||h.type==="directory"){e._parse(512,g),e.emit("entry",h,gVe(e,f),n);return}e._stream=new Ob(e,f),e.emit("entry",h,e._stream,n),e._parse(h.size,s),i()};this._onheader=g,this._parse(512,g)};Sue.inherits(vA,kue);vA.prototype.destroy=function(t){this._destroyed||(this._destroyed=!0,t&&this.emit("error",t),this.emit("close"),this._stream&&this._stream.emit("close"))};vA.prototype._parse=function(t,e){this._destroyed||(this._offset+=t,this._missing=t,e===this._onheader&&(this._partial=!1),this._onparse=e)};vA.prototype._continue=function(){if(!this._destroyed){var t=this._cb;this._cb=Pue,this._overflow?this._write(this._overflow,void 0,t):t()}};vA.prototype._write=function(t,e,r){if(!this._destroyed){var i=this._stream,n=this._buffer,s=this._missing;if(t.length&&(this._partial=!0),t.lengths&&(o=t.slice(s),t=t.slice(0,s)),i?i.end(t):n.append(t),this._overflow=o,this._onparse()}};vA.prototype._final=function(t){if(this._partial)return this.destroy(new Error("Unexpected end of data"));t()};vue.exports=vA});var Nue=w((Axt,Fue)=>{Fue.exports=require("fs").constants||require("constants")});var Kue=w((lxt,Lue)=>{var Eh=Nue(),Tue=Vx(),Mb=Tl(),hVe=Buffer.alloc,Oue=dh().Readable,Ih=dh().Writable,pVe=require("string_decoder").StringDecoder,Kb=eO(),dVe=parseInt("755",8),CVe=parseInt("644",8),Mue=hVe(1024),tO=function(){},rO=function(t,e){e&=511,e&&t.push(Mue.slice(0,512-e))};function mVe(t){switch(t&Eh.S_IFMT){case Eh.S_IFBLK:return"block-device";case Eh.S_IFCHR:return"character-device";case Eh.S_IFDIR:return"directory";case Eh.S_IFIFO:return"fifo";case Eh.S_IFLNK:return"symlink"}return"file"}var Ub=function(t){Ih.call(this),this.written=0,this._to=t,this._destroyed=!1};Mb(Ub,Ih);Ub.prototype._write=function(t,e,r){if(this.written+=t.length,this._to.push(t))return r();this._to._drain=r};Ub.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var Hb=function(){Ih.call(this),this.linkname="",this._decoder=new pVe("utf-8"),this._destroyed=!1};Mb(Hb,Ih);Hb.prototype._write=function(t,e,r){this.linkname+=this._decoder.write(t),r()};Hb.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var AE=function(){Ih.call(this),this._destroyed=!1};Mb(AE,Ih);AE.prototype._write=function(t,e,r){r(new Error("No body allowed for this entry"))};AE.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var Ca=function(t){if(!(this instanceof Ca))return new Ca(t);Oue.call(this,t),this._drain=tO,this._finalized=!1,this._finalizing=!1,this._destroyed=!1,this._stream=null};Mb(Ca,Oue);Ca.prototype.entry=function(t,e,r){if(this._stream)throw new Error("already piping an entry");if(!(this._finalized||this._destroyed)){typeof e=="function"&&(r=e,e=null),r||(r=tO);var i=this;if((!t.size||t.type==="symlink")&&(t.size=0),t.type||(t.type=mVe(t.mode)),t.mode||(t.mode=t.type==="directory"?dVe:CVe),t.uid||(t.uid=0),t.gid||(t.gid=0),t.mtime||(t.mtime=new Date),typeof e=="string"&&(e=Buffer.from(e)),Buffer.isBuffer(e)){t.size=e.length,this._encode(t);var n=this.push(e);return rO(i,t.size),n?process.nextTick(r):this._drain=r,new AE}if(t.type==="symlink"&&!t.linkname){var s=new Hb;return Tue(s,function(a){if(a)return i.destroy(),r(a);t.linkname=s.linkname,i._encode(t),r()}),s}if(this._encode(t),t.type!=="file"&&t.type!=="contiguous-file")return process.nextTick(r),new AE;var o=new Ub(this);return this._stream=o,Tue(o,function(a){if(i._stream=null,a)return i.destroy(),r(a);if(o.written!==t.size)return i.destroy(),r(new Error("size mismatch"));rO(i,t.size),i._finalizing&&i.finalize(),r()}),o}};Ca.prototype.finalize=function(){if(this._stream){this._finalizing=!0;return}this._finalized||(this._finalized=!0,this.push(Mue),this.push(null))};Ca.prototype.destroy=function(t){this._destroyed||(this._destroyed=!0,t&&this.emit("error",t),this.emit("close"),this._stream&&this._stream.destroy&&this._stream.destroy())};Ca.prototype._encode=function(t){if(!t.pax){var e=Kb.encode(t);if(e){this.push(e);return}}this._encodePax(t)};Ca.prototype._encodePax=function(t){var e=Kb.encodePax({name:t.name,linkname:t.linkname,pax:t.pax}),r={name:"PaxHeader",mode:t.mode,uid:t.uid,gid:t.gid,size:e.length,mtime:t.mtime,type:"pax-header",linkname:t.linkname&&"PaxHeader",uname:t.uname,gname:t.gname,devmajor:t.devmajor,devminor:t.devminor};this.push(Kb.encode(r)),this.push(e),rO(this,e.length),r.size=t.size,r.type=t.type,this.push(Kb.encode(r))};Ca.prototype._read=function(t){var e=this._drain;this._drain=tO,e()};Lue.exports=Ca});var Uue=w(iO=>{iO.extract=Rue();iO.pack=Kue()});var $ue=w((Rxt,_ue)=>{"use strict";var yh=class{constructor(e,r,i){this.__specs=e||{},Object.keys(this.__specs).forEach(n=>{if(typeof this.__specs[n]=="string"){let s=this.__specs[n],o=this.__specs[s];if(o){let a=o.aliases||[];a.push(n,s),o.aliases=[...new Set(a)],this.__specs[n]=o}else throw new Error(`Alias refers to invalid key: ${s} -> ${n}`)}}),this.__opts=r||{},this.__providers=Xue(i.filter(n=>n!=null&&typeof n=="object")),this.__isFiggyPudding=!0}get(e){return lO(this,e,!0)}get[Symbol.toStringTag](){return"FiggyPudding"}forEach(e,r=this){for(let[i,n]of this.entries())e.call(r,n,i,this)}toJSON(){let e={};return this.forEach((r,i)=>{e[i]=r}),e}*entries(e){for(let i of Object.keys(this.__specs))yield[i,this.get(i)];let r=e||this.__opts.other;if(r){let i=new Set;for(let n of this.__providers){let s=n.entries?n.entries(r):DVe(n);for(let[o,a]of s)r(o)&&!i.has(o)&&(i.add(o),yield[o,a])}}}*[Symbol.iterator](){for(let[e,r]of this.entries())yield[e,r]}*keys(){for(let[e]of this.entries())yield e}*values(){for(let[,e]of this.entries())yield e}concat(...e){return new Proxy(new yh(this.__specs,this.__opts,Xue(this.__providers).concat(e)),Vue)}};try{let t=require("util");yh.prototype[t.inspect.custom]=function(e,r){return this[Symbol.toStringTag]+" "+t.inspect(this.toJSON(),r)}}catch(t){}function RVe(t){throw Object.assign(new Error(`invalid config key requested: ${t}`),{code:"EBADKEY"})}function lO(t,e,r){let i=t.__specs[e];if(r&&!i&&(!t.__opts.other||!t.__opts.other(e)))RVe(e);else{i||(i={});let n;for(let s of t.__providers){if(n=Zue(e,s),n===void 0&&i.aliases&&i.aliases.length){for(let o of i.aliases)if(o!==e&&(n=Zue(o,s),n!==void 0))break}if(n!==void 0)break}return n===void 0&&i.default!==void 0?typeof i.default=="function"?i.default(t):i.default:n}}function Zue(t,e){let r;return e.__isFiggyPudding?r=lO(e,t,!1):typeof e.get=="function"?r=e.get(t):r=e[t],r}var Vue={has(t,e){return e in t.__specs&&lO(t,e,!1)!==void 0},ownKeys(t){return Object.keys(t.__specs)},get(t,e){return typeof e=="symbol"||e.slice(0,2)==="__"||e in yh.prototype?t[e]:t.get(e)},set(t,e,r){if(typeof e=="symbol"||e.slice(0,2)==="__")return t[e]=r,!0;throw new Error("figgyPudding options cannot be modified. Use .concat() instead.")},deleteProperty(){throw new Error("figgyPudding options cannot be deleted. Use .concat() and shadow them instead.")}};_ue.exports=FVe;function FVe(t,e){function r(...i){return new Proxy(new yh(t,e,i),Vue)}return r}function Xue(t){let e=[];return t.forEach(r=>e.unshift(r)),e}function DVe(t){return Object.keys(t).map(e=>[e,t[e]])}});var rge=w((Fxt,ma)=>{"use strict";var cE=require("crypto"),NVe=$ue(),LVe=require("stream").Transform,ege=["sha256","sha384","sha512"],TVe=/^[a-z0-9+/]+(?:=?=?)$/i,OVe=/^([^-]+)-([^?]+)([?\S*]*)$/,MVe=/^([^-]+)-([A-Za-z0-9+/=]{44,88})(\?[\x21-\x7E]*)*$/,KVe=/^[\x21-\x7E]+$/,Cn=NVe({algorithms:{default:["sha512"]},error:{default:!1},integrity:{},options:{default:[]},pickAlgorithm:{default:()=>UVe},Promise:{default:()=>Promise},sep:{default:" "},single:{default:!1},size:{},strict:{default:!1}}),Du=class{get isHash(){return!0}constructor(e,r){r=Cn(r);let i=!!r.strict;this.source=e.trim();let n=this.source.match(i?MVe:OVe);if(!n||i&&!ege.some(o=>o===n[1]))return;this.algorithm=n[1],this.digest=n[2];let s=n[3];this.options=s?s.slice(1).split("?"):[]}hexDigest(){return this.digest&&Buffer.from(this.digest,"base64").toString("hex")}toJSON(){return this.toString()}toString(e){if(e=Cn(e),e.strict&&!(ege.some(i=>i===this.algorithm)&&this.digest.match(TVe)&&(this.options||[]).every(i=>i.match(KVe))))return"";let r=this.options&&this.options.length?`?${this.options.join("?")}`:"";return`${this.algorithm}-${this.digest}${r}`}},wh=class{get isIntegrity(){return!0}toJSON(){return this.toString()}toString(e){e=Cn(e);let r=e.sep||" ";return e.strict&&(r=r.replace(/\S+/g," ")),Object.keys(this).map(i=>this[i].map(n=>Du.prototype.toString.call(n,e)).filter(n=>n.length).join(r)).filter(i=>i.length).join(r)}concat(e,r){r=Cn(r);let i=typeof e=="string"?e:uE(e,r);return Ea(`${this.toString(r)} ${i}`,r)}hexDigest(){return Ea(this,{single:!0}).hexDigest()}match(e,r){r=Cn(r);let i=Ea(e,r),n=i.pickAlgorithm(r);return this[n]&&i[n]&&this[n].find(s=>i[n].find(o=>s.digest===o.digest))||!1}pickAlgorithm(e){e=Cn(e);let r=e.pickAlgorithm,i=Object.keys(this);if(!i.length)throw new Error(`No algorithms available for ${JSON.stringify(this.toString())}`);return i.reduce((n,s)=>r(n,s)||n)}};ma.exports.parse=Ea;function Ea(t,e){if(e=Cn(e),typeof t=="string")return cO(t,e);if(t.algorithm&&t.digest){let r=new wh;return r[t.algorithm]=[t],cO(uE(r,e),e)}else return cO(uE(t,e),e)}function cO(t,e){return e.single?new Du(t,e):t.trim().split(/\s+/).reduce((r,i)=>{let n=new Du(i,e);if(n.algorithm&&n.digest){let s=n.algorithm;r[s]||(r[s]=[]),r[s].push(n)}return r},new wh)}ma.exports.stringify=uE;function uE(t,e){return e=Cn(e),t.algorithm&&t.digest?Du.prototype.toString.call(t,e):typeof t=="string"?uE(Ea(t,e),e):wh.prototype.toString.call(t,e)}ma.exports.fromHex=HVe;function HVe(t,e,r){r=Cn(r);let i=r.options&&r.options.length?`?${r.options.join("?")}`:"";return Ea(`${e}-${Buffer.from(t,"hex").toString("base64")}${i}`,r)}ma.exports.fromData=GVe;function GVe(t,e){e=Cn(e);let r=e.algorithms,i=e.options&&e.options.length?`?${e.options.join("?")}`:"";return r.reduce((n,s)=>{let o=cE.createHash(s).update(t).digest("base64"),a=new Du(`${s}-${o}${i}`,e);if(a.algorithm&&a.digest){let l=a.algorithm;n[l]||(n[l]=[]),n[l].push(a)}return n},new wh)}ma.exports.fromStream=jVe;function jVe(t,e){e=Cn(e);let r=e.Promise||Promise,i=uO(e);return new r((n,s)=>{t.pipe(i),t.on("error",s),i.on("error",s);let o;i.on("integrity",a=>{o=a}),i.on("end",()=>n(o)),i.on("data",()=>{})})}ma.exports.checkData=YVe;function YVe(t,e,r){if(r=Cn(r),e=Ea(e,r),!Object.keys(e).length){if(r.error)throw Object.assign(new Error("No valid integrity hashes to check against"),{code:"EINTEGRITY"});return!1}let i=e.pickAlgorithm(r),n=cE.createHash(i).update(t).digest("base64"),s=Ea({algorithm:i,digest:n}),o=s.match(e,r);if(o||!r.error)return o;if(typeof r.size=="number"&&t.length!==r.size){let a=new Error(`data size mismatch when checking ${e}. - Wanted: ${r.size} - Found: ${t.length}`);throw a.code="EBADSIZE",a.found=t.length,a.expected=r.size,a.sri=e,a}else{let a=new Error(`Integrity checksum failed when using ${i}: Wanted ${e}, but got ${s}. (${t.length} bytes)`);throw a.code="EINTEGRITY",a.found=s,a.expected=e,a.algorithm=i,a.sri=e,a}}ma.exports.checkStream=qVe;function qVe(t,e,r){r=Cn(r);let i=r.Promise||Promise,n=uO(r.concat({integrity:e}));return new i((s,o)=>{t.pipe(n),t.on("error",o),n.on("error",o);let a;n.on("verified",l=>{a=l}),n.on("end",()=>s(a)),n.on("data",()=>{})})}ma.exports.integrityStream=uO;function uO(t){t=Cn(t);let e=t.integrity&&Ea(t.integrity,t),r=e&&Object.keys(e).length,i=r&&e.pickAlgorithm(t),n=r&&e[i],s=Array.from(new Set(t.algorithms.concat(i?[i]:[]))),o=s.map(cE.createHash),a=0,l=new LVe({transform(c,u,g){a+=c.length,o.forEach(f=>f.update(c,u)),g(null,c,u)}}).on("end",()=>{let c=t.options&&t.options.length?`?${t.options.join("?")}`:"",u=Ea(o.map((f,h)=>`${s[h]}-${f.digest("base64")}${c}`).join(" "),t),g=r&&u.match(e,t);if(typeof t.size=="number"&&a!==t.size){let f=new Error(`stream size mismatch when checking ${e}. - Wanted: ${t.size} - Found: ${a}`);f.code="EBADSIZE",f.found=a,f.expected=t.size,f.sri=e,l.emit("error",f)}else if(t.integrity&&!g){let f=new Error(`${e} integrity checksum failed when using ${i}: wanted ${n} but got ${u}. (${a} bytes)`);f.code="EINTEGRITY",f.found=u,f.expected=n,f.algorithm=i,f.sri=e,l.emit("error",f)}else l.emit("size",a),l.emit("integrity",u),g&&l.emit("verified",g)});return l}ma.exports.create=JVe;function JVe(t){t=Cn(t);let e=t.algorithms,r=t.options.length?`?${t.options.join("?")}`:"",i=e.map(cE.createHash);return{update:function(n,s){return i.forEach(o=>o.update(n,s)),this},digest:function(n){return e.reduce((o,a)=>{let l=i.shift().digest("base64"),c=new Du(`${a}-${l}${r}`,t);if(c.algorithm&&c.digest){let u=c.algorithm;o[u]||(o[u]=[]),o[u].push(c)}return o},new wh)}}}var WVe=new Set(cE.getHashes()),tge=["md5","whirlpool","sha1","sha224","sha256","sha384","sha512","sha3","sha3-256","sha3-384","sha3-512","sha3_256","sha3_384","sha3_512"].filter(t=>WVe.has(t));function UVe(t,e){return tge.indexOf(t.toLowerCase())>=tge.indexOf(e.toLowerCase())?t:e}});var vC={};ft(vC,{BuildType:()=>ls,Cache:()=>Nt,Configuration:()=>we,DEFAULT_LOCK_FILENAME:()=>Qx,DEFAULT_RC_FILENAME:()=>bx,FormatType:()=>Di,InstallMode:()=>di,LightReport:()=>gA,LinkType:()=>Qt,Manifest:()=>At,MessageName:()=>$,MultiFetcher:()=>wd,PackageExtensionStatus:()=>qi,PackageExtensionType:()=>yi,Project:()=>ze,ProjectLookup:()=>al,Report:()=>Ji,ReportError:()=>ct,SettingsType:()=>ye,StreamReport:()=>Je,TAG_REGEXP:()=>qg,TelemetryManager:()=>QC,ThrowReport:()=>pi,VirtualFetcher:()=>bd,Workspace:()=>bC,WorkspaceFetcher:()=>Qd,WorkspaceResolver:()=>oi,YarnVersion:()=>Kr,execUtils:()=>Fr,folderUtils:()=>Cx,formatUtils:()=>Ae,hashUtils:()=>Dn,httpUtils:()=>ir,miscUtils:()=>ve,nodeUtils:()=>Wg,parseMessageName:()=>bI,scriptUtils:()=>Zt,semverUtils:()=>Wt,stringifyMessageName:()=>qA,structUtils:()=>P,tgzUtils:()=>wi,treeUtils:()=>As});var Fr={};ft(Fr,{EndStrategy:()=>ns,ExecError:()=>Rx,PipeError:()=>vw,execvp:()=>mke,pipevp:()=>$o});var $h={};ft($h,{AliasFS:()=>Da,CwdFS:()=>_t,DEFAULT_COMPRESSION_LEVEL:()=>nc,FakeFS:()=>HA,Filename:()=>Pt,JailFS:()=>Ra,LazyFS:()=>Vh,LinkStrategy:()=>Yh,NoFS:()=>_E,NodeFS:()=>ar,PortablePath:()=>Ke,PosixFS:()=>Xh,ProxiedFS:()=>bi,VirtualFS:()=>Wr,ZipFS:()=>Ai,ZipOpenFS:()=>Es,constants:()=>Dr,extendFs:()=>XE,normalizeLineEndings:()=>ec,npath:()=>H,opendir:()=>JE,patchFs:()=>SQ,ppath:()=>x,statUtils:()=>hQ,toFilename:()=>Jr,xfs:()=>K});var Dr={};ft(Dr,{SAFE_TIME:()=>fQ,S_IFDIR:()=>ka,S_IFLNK:()=>Pa,S_IFMT:()=>_n,S_IFREG:()=>xa});var _n=61440,ka=16384,xa=32768,Pa=40960,fQ=456789e3;var hQ={};ft(hQ,{BigIntStatsEntry:()=>Hh,DEFAULT_MODE:()=>Uh,DirEntry:()=>oM,StatEntry:()=>KA,areStatsEqual:()=>dQ,clearStats:()=>KE,convertToBigIntStats:()=>UE,makeDefaultStats:()=>Gh,makeEmptyStats:()=>pfe});var pQ=ge(require("util"));var Uh=xa|420,oM=class{constructor(){this.name="";this.mode=0}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&_n)===ka}isFIFO(){return!1}isFile(){return(this.mode&_n)===xa}isSocket(){return!1}isSymbolicLink(){return(this.mode&_n)===Pa}},KA=class{constructor(){this.uid=0;this.gid=0;this.size=0;this.blksize=0;this.atimeMs=0;this.mtimeMs=0;this.ctimeMs=0;this.birthtimeMs=0;this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=0;this.ino=0;this.mode=Uh;this.nlink=1;this.rdev=0;this.blocks=1}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&_n)===ka}isFIFO(){return!1}isFile(){return(this.mode&_n)===xa}isSocket(){return!1}isSymbolicLink(){return(this.mode&_n)===Pa}},Hh=class{constructor(){this.uid=BigInt(0);this.gid=BigInt(0);this.size=BigInt(0);this.blksize=BigInt(0);this.atimeMs=BigInt(0);this.mtimeMs=BigInt(0);this.ctimeMs=BigInt(0);this.birthtimeMs=BigInt(0);this.atimeNs=BigInt(0);this.mtimeNs=BigInt(0);this.ctimeNs=BigInt(0);this.birthtimeNs=BigInt(0);this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=BigInt(0);this.ino=BigInt(0);this.mode=BigInt(Uh);this.nlink=BigInt(1);this.rdev=BigInt(0);this.blocks=BigInt(1)}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&BigInt(_n))===BigInt(ka)}isFIFO(){return!1}isFile(){return(this.mode&BigInt(_n))===BigInt(xa)}isSocket(){return!1}isSymbolicLink(){return(this.mode&BigInt(_n))===BigInt(Pa)}};function Gh(){return new KA}function pfe(){return KE(Gh())}function KE(t){for(let e in t)if(Object.prototype.hasOwnProperty.call(t,e)){let r=t[e];typeof r=="number"?t[e]=0:typeof r=="bigint"?t[e]=BigInt(0):pQ.types.isDate(r)&&(t[e]=new Date(0))}return t}function UE(t){let e=new Hh;for(let r in t)if(Object.prototype.hasOwnProperty.call(t,r)){let i=t[r];typeof i=="number"?e[r]=BigInt(i):pQ.types.isDate(i)&&(e[r]=new Date(i))}return e.atimeNs=e.atimeMs*BigInt(1e6),e.mtimeNs=e.mtimeMs*BigInt(1e6),e.ctimeNs=e.ctimeMs*BigInt(1e6),e.birthtimeNs=e.birthtimeMs*BigInt(1e6),e}function dQ(t,e){if(t.atimeMs!==e.atimeMs||t.birthtimeMs!==e.birthtimeMs||t.blksize!==e.blksize||t.blocks!==e.blocks||t.ctimeMs!==e.ctimeMs||t.dev!==e.dev||t.gid!==e.gid||t.ino!==e.ino||t.isBlockDevice()!==e.isBlockDevice()||t.isCharacterDevice()!==e.isCharacterDevice()||t.isDirectory()!==e.isDirectory()||t.isFIFO()!==e.isFIFO()||t.isFile()!==e.isFile()||t.isSocket()!==e.isSocket()||t.isSymbolicLink()!==e.isSymbolicLink()||t.mode!==e.mode||t.mtimeMs!==e.mtimeMs||t.nlink!==e.nlink||t.rdev!==e.rdev||t.size!==e.size||t.uid!==e.uid)return!1;let r=t,i=e;return!(r.atimeNs!==i.atimeNs||r.mtimeNs!==i.mtimeNs||r.ctimeNs!==i.ctimeNs||r.birthtimeNs!==i.birthtimeNs)}var GE=ge(require("fs"));var jh=ge(require("path")),aM;(function(i){i[i.File=0]="File",i[i.Portable=1]="Portable",i[i.Native=2]="Native"})(aM||(aM={}));var Ke={root:"/",dot:"."},Pt={nodeModules:"node_modules",manifest:"package.json",lockfile:"yarn.lock",virtual:"__virtual__",pnpJs:".pnp.js",pnpCjs:".pnp.cjs",rc:".yarnrc.yml"},H=Object.create(jh.default),x=Object.create(jh.default.posix);H.cwd=()=>process.cwd();x.cwd=()=>CQ(process.cwd());x.resolve=(...t)=>t.length>0&&x.isAbsolute(t[0])?jh.default.posix.resolve(...t):jh.default.posix.resolve(x.cwd(),...t);var AM=function(t,e,r){return e=t.normalize(e),r=t.normalize(r),e===r?".":(e.endsWith(t.sep)||(e=e+t.sep),r.startsWith(e)?r.slice(e.length):null)};H.fromPortablePath=lM;H.toPortablePath=CQ;H.contains=(t,e)=>AM(H,t,e);x.contains=(t,e)=>AM(x,t,e);var dfe=/^([a-zA-Z]:.*)$/,Cfe=/^\/\/(\.\/)?(.*)$/,mfe=/^\/([a-zA-Z]:.*)$/,Efe=/^\/unc\/(\.dot\/)?(.*)$/;function lM(t){if(process.platform!=="win32")return t;let e,r;if(e=t.match(mfe))t=e[1];else if(r=t.match(Efe))t=`\\\\${r[1]?".\\":""}${r[2]}`;else return t;return t.replace(/\//g,"\\")}function CQ(t){if(process.platform!=="win32")return t;t=t.replace(/\\/g,"/");let e,r;return(e=t.match(dfe))?t=`/${e[1]}`:(r=t.match(Cfe))&&(t=`/unc/${r[1]?".dot/":""}${r[2]}`),t}function HE(t,e){return t===H?lM(e):CQ(e)}function Jr(t){if(H.parse(t).dir!==""||x.parse(t).dir!=="")throw new Error(`Invalid filename: "${t}"`);return t}var jE=new Date(fQ*1e3),Yh;(function(r){r.Allow="allow",r.ReadOnly="readOnly"})(Yh||(Yh={}));async function cM(t,e,r,i,n){let s=t.pathUtils.normalize(e),o=r.pathUtils.normalize(i),a=[],l=[],{atime:c,mtime:u}=n.stableTime?{atime:jE,mtime:jE}:await r.lstatPromise(o);await t.mkdirpPromise(t.pathUtils.dirname(e),{utimes:[c,u]});let g=typeof t.lutimesPromise=="function"?t.lutimesPromise.bind(t):t.utimesPromise.bind(t);await mQ(a,l,g,t,s,r,o,ie(N({},n),{didParentExist:!0}));for(let f of a)await f();await Promise.all(l.map(f=>f()))}async function mQ(t,e,r,i,n,s,o,a){var h,p;let l=a.didParentExist?await Ife(i,n):null,c=await s.lstatPromise(o),{atime:u,mtime:g}=a.stableTime?{atime:jE,mtime:jE}:c,f;switch(!0){case c.isDirectory():f=await yfe(t,e,r,i,n,l,s,o,c,a);break;case c.isFile():f=await wfe(t,e,r,i,n,l,s,o,c,a);break;case c.isSymbolicLink():f=await Bfe(t,e,r,i,n,l,s,o,c,a);break;default:throw new Error(`Unsupported file type (${c.mode})`)}return(f||((h=l==null?void 0:l.mtime)==null?void 0:h.getTime())!==g.getTime()||((p=l==null?void 0:l.atime)==null?void 0:p.getTime())!==u.getTime())&&(e.push(()=>r(n,u,g)),f=!0),(l===null||(l.mode&511)!=(c.mode&511))&&(e.push(()=>i.chmodPromise(n,c.mode&511)),f=!0),f}async function Ife(t,e){try{return await t.lstatPromise(e)}catch(r){return null}}async function yfe(t,e,r,i,n,s,o,a,l,c){if(s!==null&&!s.isDirectory())if(c.overwrite)t.push(async()=>i.removePromise(n)),s=null;else return!1;let u=!1;s===null&&(t.push(async()=>{try{await i.mkdirPromise(n,{mode:l.mode})}catch(h){if(h.code!=="EEXIST")throw h}}),u=!0);let g=await o.readdirPromise(a),f=c.didParentExist&&!s?ie(N({},c),{didParentExist:!1}):c;if(c.stableSort)for(let h of g.sort())await mQ(t,e,r,i,i.pathUtils.join(n,h),o,o.pathUtils.join(a,h),f)&&(u=!0);else(await Promise.all(g.map(async p=>{await mQ(t,e,r,i,i.pathUtils.join(n,p),o,o.pathUtils.join(a,p),f)}))).some(p=>p)&&(u=!0);return u}var EQ=new WeakMap;function IQ(t,e,r,i,n){return async()=>{await t.linkPromise(r,e),n===Yh.ReadOnly&&(i.mode&=~146,await t.chmodPromise(e,i.mode))}}function bfe(t,e,r,i,n){let s=EQ.get(t);return typeof s=="undefined"?async()=>{try{await t.copyFilePromise(r,e,GE.default.constants.COPYFILE_FICLONE_FORCE),EQ.set(t,!0)}catch(o){if(o.code==="ENOSYS"||o.code==="ENOTSUP")EQ.set(t,!1),await IQ(t,e,r,i,n)();else throw o}}:s?async()=>t.copyFilePromise(r,e,GE.default.constants.COPYFILE_FICLONE_FORCE):IQ(t,e,r,i,n)}async function wfe(t,e,r,i,n,s,o,a,l,c){var f;if(s!==null)if(c.overwrite)t.push(async()=>i.removePromise(n)),s=null;else return!1;let u=(f=c.linkStrategy)!=null?f:null,g=i===o?u!==null?bfe(i,n,a,l,u):async()=>i.copyFilePromise(a,n,GE.default.constants.COPYFILE_FICLONE):u!==null?IQ(i,n,a,l,u):async()=>i.writeFilePromise(n,await o.readFilePromise(a));return t.push(async()=>g()),!0}async function Bfe(t,e,r,i,n,s,o,a,l,c){if(s!==null)if(c.overwrite)t.push(async()=>i.removePromise(n)),s=null;else return!1;return t.push(async()=>{await i.symlinkPromise(HE(i.pathUtils,await o.readlinkPromise(a)),n)}),!0}function ms(t,e){return Object.assign(new Error(`${t}: ${e}`),{code:t})}function YE(t){return ms("EBUSY",t)}function qh(t,e){return ms("ENOSYS",`${t}, ${e}`)}function UA(t){return ms("EINVAL",`invalid argument, ${t}`)}function en(t){return ms("EBADF",`bad file descriptor, ${t}`)}function ro(t){return ms("ENOENT",`no such file or directory, ${t}`)}function Do(t){return ms("ENOTDIR",`not a directory, ${t}`)}function Jh(t){return ms("EISDIR",`illegal operation on a directory, ${t}`)}function qE(t){return ms("EEXIST",`file already exists, ${t}`)}function In(t){return ms("EROFS",`read-only filesystem, ${t}`)}function uM(t){return ms("ENOTEMPTY",`directory not empty, ${t}`)}function gM(t){return ms("EOPNOTSUPP",`operation not supported, ${t}`)}function fM(){return ms("ERR_DIR_CLOSED","Directory handle was closed")}var yQ=class extends Error{constructor(e,r){super(e);this.name="Libzip Error",this.code=r}};var hM=class{constructor(e,r,i={}){this.path=e;this.nextDirent=r;this.opts=i;this.closed=!1}throwIfClosed(){if(this.closed)throw fM()}async*[Symbol.asyncIterator](){try{let e;for(;(e=await this.read())!==null;)yield e}finally{await this.close()}}read(e){let r=this.readSync();return typeof e!="undefined"?e(null,r):Promise.resolve(r)}readSync(){return this.throwIfClosed(),this.nextDirent()}close(e){return this.closeSync(),typeof e!="undefined"?e(null):Promise.resolve()}closeSync(){var e,r;this.throwIfClosed(),(r=(e=this.opts).onClose)==null||r.call(e),this.closed=!0}};function JE(t,e,r,i){let n=()=>{let s=r.shift();return typeof s=="undefined"?null:Object.assign(t.statSync(t.pathUtils.join(e,s)),{name:s})};return new hM(e,n,i)}var pM=ge(require("os"));var HA=class{constructor(e){this.pathUtils=e}async*genTraversePromise(e,{stableSort:r=!1}={}){let i=[e];for(;i.length>0;){let n=i.shift();if((await this.lstatPromise(n)).isDirectory()){let o=await this.readdirPromise(n);if(r)for(let a of o.sort())i.push(this.pathUtils.join(n,a));else throw new Error("Not supported")}else yield n}}async removePromise(e,{recursive:r=!0,maxRetries:i=5}={}){let n;try{n=await this.lstatPromise(e)}catch(s){if(s.code==="ENOENT")return;throw s}if(n.isDirectory()){if(r){let s=await this.readdirPromise(e);await Promise.all(s.map(o=>this.removePromise(this.pathUtils.resolve(e,o))))}for(let s=0;s<=i;s++)try{await this.rmdirPromise(e);break}catch(o){if(o.code!=="EBUSY"&&o.code!=="ENOTEMPTY")throw o;ssetTimeout(a,s*100))}}else await this.unlinkPromise(e)}removeSync(e,{recursive:r=!0}={}){let i;try{i=this.lstatSync(e)}catch(n){if(n.code==="ENOENT")return;throw n}if(i.isDirectory()){if(r)for(let n of this.readdirSync(e))this.removeSync(this.pathUtils.resolve(e,n));this.rmdirSync(e)}else this.unlinkSync(e)}async mkdirpPromise(e,{chmod:r,utimes:i}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let n=e.split(this.pathUtils.sep);for(let s=2;s<=n.length;++s){let o=n.slice(0,s).join(this.pathUtils.sep);if(!this.existsSync(o)){try{await this.mkdirPromise(o)}catch(a){if(a.code==="EEXIST")continue;throw a}if(r!=null&&await this.chmodPromise(o,r),i!=null)await this.utimesPromise(o,i[0],i[1]);else{let a=await this.statPromise(this.pathUtils.dirname(o));await this.utimesPromise(o,a.atime,a.mtime)}}}}mkdirpSync(e,{chmod:r,utimes:i}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let n=e.split(this.pathUtils.sep);for(let s=2;s<=n.length;++s){let o=n.slice(0,s).join(this.pathUtils.sep);if(!this.existsSync(o)){try{this.mkdirSync(o)}catch(a){if(a.code==="EEXIST")continue;throw a}if(r!=null&&this.chmodSync(o,r),i!=null)this.utimesSync(o,i[0],i[1]);else{let a=this.statSync(this.pathUtils.dirname(o));this.utimesSync(o,a.atime,a.mtime)}}}}async copyPromise(e,r,{baseFs:i=this,overwrite:n=!0,stableSort:s=!1,stableTime:o=!1,linkStrategy:a=null}={}){return await cM(this,e,i,r,{overwrite:n,stableSort:s,stableTime:o,linkStrategy:a})}copySync(e,r,{baseFs:i=this,overwrite:n=!0}={}){let s=i.lstatSync(r),o=this.existsSync(e);if(s.isDirectory()){this.mkdirpSync(e);let l=i.readdirSync(r);for(let c of l)this.copySync(this.pathUtils.join(e,c),i.pathUtils.join(r,c),{baseFs:i,overwrite:n})}else if(s.isFile()){if(!o||n){o&&this.removeSync(e);let l=i.readFileSync(r);this.writeFileSync(e,l)}}else if(s.isSymbolicLink()){if(!o||n){o&&this.removeSync(e);let l=i.readlinkSync(r);this.symlinkSync(HE(this.pathUtils,l),e)}}else throw new Error(`Unsupported file type (file: ${r}, mode: 0o${s.mode.toString(8).padStart(6,"0")})`);let a=s.mode&511;this.chmodSync(e,a)}async changeFilePromise(e,r,i={}){return Buffer.isBuffer(r)?this.changeFileBufferPromise(e,r,i):this.changeFileTextPromise(e,r,i)}async changeFileBufferPromise(e,r,{mode:i}={}){let n=Buffer.alloc(0);try{n=await this.readFilePromise(e)}catch(s){}Buffer.compare(n,r)!==0&&await this.writeFilePromise(e,r,{mode:i})}async changeFileTextPromise(e,r,{automaticNewlines:i,mode:n}={}){let s="";try{s=await this.readFilePromise(e,"utf8")}catch(a){}let o=i?ec(s,r):r;s!==o&&await this.writeFilePromise(e,o,{mode:n})}changeFileSync(e,r,i={}){return Buffer.isBuffer(r)?this.changeFileBufferSync(e,r,i):this.changeFileTextSync(e,r,i)}changeFileBufferSync(e,r,{mode:i}={}){let n=Buffer.alloc(0);try{n=this.readFileSync(e)}catch(s){}Buffer.compare(n,r)!==0&&this.writeFileSync(e,r,{mode:i})}changeFileTextSync(e,r,{automaticNewlines:i=!1,mode:n}={}){let s="";try{s=this.readFileSync(e,"utf8")}catch(a){}let o=i?ec(s,r):r;s!==o&&this.writeFileSync(e,o,{mode:n})}async movePromise(e,r){try{await this.renamePromise(e,r)}catch(i){if(i.code==="EXDEV")await this.copyPromise(r,e),await this.removePromise(e);else throw i}}moveSync(e,r){try{this.renameSync(e,r)}catch(i){if(i.code==="EXDEV")this.copySync(r,e),this.removeSync(e);else throw i}}async lockPromise(e,r){let i=`${e}.flock`,n=1e3/60,s=Date.now(),o=null,a=async()=>{let l;try{[l]=await this.readJsonPromise(i)}catch(c){return Date.now()-s<500}try{return process.kill(l,0),!0}catch(c){return!1}};for(;o===null;)try{o=await this.openPromise(i,"wx")}catch(l){if(l.code==="EEXIST"){if(!await a())try{await this.unlinkPromise(i);continue}catch(c){}if(Date.now()-s<60*1e3)await new Promise(c=>setTimeout(c,n));else throw new Error(`Couldn't acquire a lock in a reasonable time (via ${i})`)}else throw l}await this.writePromise(o,JSON.stringify([process.pid]));try{return await r()}finally{try{await this.closePromise(o),await this.unlinkPromise(i)}catch(l){}}}async readJsonPromise(e){let r=await this.readFilePromise(e,"utf8");try{return JSON.parse(r)}catch(i){throw i.message+=` (in ${e})`,i}}readJsonSync(e){let r=this.readFileSync(e,"utf8");try{return JSON.parse(r)}catch(i){throw i.message+=` (in ${e})`,i}}async writeJsonPromise(e,r){return await this.writeFilePromise(e,`${JSON.stringify(r,null,2)} -`)}writeJsonSync(e,r){return this.writeFileSync(e,`${JSON.stringify(r,null,2)} -`)}async preserveTimePromise(e,r){let i=await this.lstatPromise(e),n=await r();typeof n!="undefined"&&(e=n),this.lutimesPromise?await this.lutimesPromise(e,i.atime,i.mtime):i.isSymbolicLink()||await this.utimesPromise(e,i.atime,i.mtime)}async preserveTimeSync(e,r){let i=this.lstatSync(e),n=r();typeof n!="undefined"&&(e=n),this.lutimesSync?this.lutimesSync(e,i.atime,i.mtime):i.isSymbolicLink()||this.utimesSync(e,i.atime,i.mtime)}},tc=class extends HA{constructor(){super(x)}};function Qfe(t){let e=t.match(/\r?\n/g);if(e===null)return pM.EOL;let r=e.filter(n=>n===`\r -`).length,i=e.length-r;return r>i?`\r -`:` -`}function ec(t,e){return e.replace(/\r?\n/g,Qfe(t))}var Ju=ge(require("fs")),wQ=ge(require("stream")),EM=ge(require("util")),BQ=ge(require("zlib"));var dM=ge(require("fs"));var ar=class extends tc{constructor(e=dM.default){super();this.realFs=e,typeof this.realFs.lutimes!="undefined"&&(this.lutimesPromise=this.lutimesPromiseImpl,this.lutimesSync=this.lutimesSyncImpl)}getExtractHint(){return!1}getRealPath(){return Ke.root}resolve(e){return x.resolve(e)}async openPromise(e,r,i){return await new Promise((n,s)=>{this.realFs.open(H.fromPortablePath(e),r,i,this.makeCallback(n,s))})}openSync(e,r,i){return this.realFs.openSync(H.fromPortablePath(e),r,i)}async opendirPromise(e,r){return await new Promise((i,n)=>{typeof r!="undefined"?this.realFs.opendir(H.fromPortablePath(e),r,this.makeCallback(i,n)):this.realFs.opendir(H.fromPortablePath(e),this.makeCallback(i,n))}).then(i=>Object.defineProperty(i,"path",{value:e,configurable:!0,writable:!0}))}opendirSync(e,r){let i=typeof r!="undefined"?this.realFs.opendirSync(H.fromPortablePath(e),r):this.realFs.opendirSync(H.fromPortablePath(e));return Object.defineProperty(i,"path",{value:e,configurable:!0,writable:!0})}async readPromise(e,r,i=0,n=0,s=-1){return await new Promise((o,a)=>{this.realFs.read(e,r,i,n,s,(l,c)=>{l?a(l):o(c)})})}readSync(e,r,i,n,s){return this.realFs.readSync(e,r,i,n,s)}async writePromise(e,r,i,n,s){return await new Promise((o,a)=>typeof r=="string"?this.realFs.write(e,r,i,this.makeCallback(o,a)):this.realFs.write(e,r,i,n,s,this.makeCallback(o,a)))}writeSync(e,r,i,n,s){return typeof r=="string"?this.realFs.writeSync(e,r,i):this.realFs.writeSync(e,r,i,n,s)}async closePromise(e){await new Promise((r,i)=>{this.realFs.close(e,this.makeCallback(r,i))})}closeSync(e){this.realFs.closeSync(e)}createReadStream(e,r){let i=e!==null?H.fromPortablePath(e):e;return this.realFs.createReadStream(i,r)}createWriteStream(e,r){let i=e!==null?H.fromPortablePath(e):e;return this.realFs.createWriteStream(i,r)}async realpathPromise(e){return await new Promise((r,i)=>{this.realFs.realpath(H.fromPortablePath(e),{},this.makeCallback(r,i))}).then(r=>H.toPortablePath(r))}realpathSync(e){return H.toPortablePath(this.realFs.realpathSync(H.fromPortablePath(e),{}))}async existsPromise(e){return await new Promise(r=>{this.realFs.exists(H.fromPortablePath(e),r)})}accessSync(e,r){return this.realFs.accessSync(H.fromPortablePath(e),r)}async accessPromise(e,r){return await new Promise((i,n)=>{this.realFs.access(H.fromPortablePath(e),r,this.makeCallback(i,n))})}existsSync(e){return this.realFs.existsSync(H.fromPortablePath(e))}async statPromise(e,r){return await new Promise((i,n)=>{r?this.realFs.stat(H.fromPortablePath(e),r,this.makeCallback(i,n)):this.realFs.stat(H.fromPortablePath(e),this.makeCallback(i,n))})}statSync(e,r){return r?this.realFs.statSync(H.fromPortablePath(e),r):this.realFs.statSync(H.fromPortablePath(e))}async fstatPromise(e,r){return await new Promise((i,n)=>{r?this.realFs.fstat(e,r,this.makeCallback(i,n)):this.realFs.fstat(e,this.makeCallback(i,n))})}fstatSync(e,r){return r?this.realFs.fstatSync(e,r):this.realFs.fstatSync(e)}async lstatPromise(e,r){return await new Promise((i,n)=>{r?this.realFs.lstat(H.fromPortablePath(e),r,this.makeCallback(i,n)):this.realFs.lstat(H.fromPortablePath(e),this.makeCallback(i,n))})}lstatSync(e,r){return r?this.realFs.lstatSync(H.fromPortablePath(e),r):this.realFs.lstatSync(H.fromPortablePath(e))}async chmodPromise(e,r){return await new Promise((i,n)=>{this.realFs.chmod(H.fromPortablePath(e),r,this.makeCallback(i,n))})}chmodSync(e,r){return this.realFs.chmodSync(H.fromPortablePath(e),r)}async chownPromise(e,r,i){return await new Promise((n,s)=>{this.realFs.chown(H.fromPortablePath(e),r,i,this.makeCallback(n,s))})}chownSync(e,r,i){return this.realFs.chownSync(H.fromPortablePath(e),r,i)}async renamePromise(e,r){return await new Promise((i,n)=>{this.realFs.rename(H.fromPortablePath(e),H.fromPortablePath(r),this.makeCallback(i,n))})}renameSync(e,r){return this.realFs.renameSync(H.fromPortablePath(e),H.fromPortablePath(r))}async copyFilePromise(e,r,i=0){return await new Promise((n,s)=>{this.realFs.copyFile(H.fromPortablePath(e),H.fromPortablePath(r),i,this.makeCallback(n,s))})}copyFileSync(e,r,i=0){return this.realFs.copyFileSync(H.fromPortablePath(e),H.fromPortablePath(r),i)}async appendFilePromise(e,r,i){return await new Promise((n,s)=>{let o=typeof e=="string"?H.fromPortablePath(e):e;i?this.realFs.appendFile(o,r,i,this.makeCallback(n,s)):this.realFs.appendFile(o,r,this.makeCallback(n,s))})}appendFileSync(e,r,i){let n=typeof e=="string"?H.fromPortablePath(e):e;i?this.realFs.appendFileSync(n,r,i):this.realFs.appendFileSync(n,r)}async writeFilePromise(e,r,i){return await new Promise((n,s)=>{let o=typeof e=="string"?H.fromPortablePath(e):e;i?this.realFs.writeFile(o,r,i,this.makeCallback(n,s)):this.realFs.writeFile(o,r,this.makeCallback(n,s))})}writeFileSync(e,r,i){let n=typeof e=="string"?H.fromPortablePath(e):e;i?this.realFs.writeFileSync(n,r,i):this.realFs.writeFileSync(n,r)}async unlinkPromise(e){return await new Promise((r,i)=>{this.realFs.unlink(H.fromPortablePath(e),this.makeCallback(r,i))})}unlinkSync(e){return this.realFs.unlinkSync(H.fromPortablePath(e))}async utimesPromise(e,r,i){return await new Promise((n,s)=>{this.realFs.utimes(H.fromPortablePath(e),r,i,this.makeCallback(n,s))})}utimesSync(e,r,i){this.realFs.utimesSync(H.fromPortablePath(e),r,i)}async lutimesPromiseImpl(e,r,i){let n=this.realFs.lutimes;if(typeof n=="undefined")throw qh("unavailable Node binding",`lutimes '${e}'`);return await new Promise((s,o)=>{n.call(this.realFs,H.fromPortablePath(e),r,i,this.makeCallback(s,o))})}lutimesSyncImpl(e,r,i){let n=this.realFs.lutimesSync;if(typeof n=="undefined")throw qh("unavailable Node binding",`lutimes '${e}'`);n.call(this.realFs,H.fromPortablePath(e),r,i)}async mkdirPromise(e,r){return await new Promise((i,n)=>{this.realFs.mkdir(H.fromPortablePath(e),r,this.makeCallback(i,n))})}mkdirSync(e,r){return this.realFs.mkdirSync(H.fromPortablePath(e),r)}async rmdirPromise(e,r){return await new Promise((i,n)=>{r?this.realFs.rmdir(H.fromPortablePath(e),r,this.makeCallback(i,n)):this.realFs.rmdir(H.fromPortablePath(e),this.makeCallback(i,n))})}rmdirSync(e,r){return this.realFs.rmdirSync(H.fromPortablePath(e),r)}async linkPromise(e,r){return await new Promise((i,n)=>{this.realFs.link(H.fromPortablePath(e),H.fromPortablePath(r),this.makeCallback(i,n))})}linkSync(e,r){return this.realFs.linkSync(H.fromPortablePath(e),H.fromPortablePath(r))}async symlinkPromise(e,r,i){return await new Promise((n,s)=>{this.realFs.symlink(H.fromPortablePath(e.replace(/\/+$/,"")),H.fromPortablePath(r),i,this.makeCallback(n,s))})}symlinkSync(e,r,i){return this.realFs.symlinkSync(H.fromPortablePath(e.replace(/\/+$/,"")),H.fromPortablePath(r),i)}async readFilePromise(e,r){return await new Promise((i,n)=>{let s=typeof e=="string"?H.fromPortablePath(e):e;this.realFs.readFile(s,r,this.makeCallback(i,n))})}readFileSync(e,r){let i=typeof e=="string"?H.fromPortablePath(e):e;return this.realFs.readFileSync(i,r)}async readdirPromise(e,r){return await new Promise((i,n)=>{(r==null?void 0:r.withFileTypes)?this.realFs.readdir(H.fromPortablePath(e),{withFileTypes:!0},this.makeCallback(i,n)):this.realFs.readdir(H.fromPortablePath(e),this.makeCallback(s=>i(s),n))})}readdirSync(e,r){return(r==null?void 0:r.withFileTypes)?this.realFs.readdirSync(H.fromPortablePath(e),{withFileTypes:!0}):this.realFs.readdirSync(H.fromPortablePath(e))}async readlinkPromise(e){return await new Promise((r,i)=>{this.realFs.readlink(H.fromPortablePath(e),this.makeCallback(r,i))}).then(r=>H.toPortablePath(r))}readlinkSync(e){return H.toPortablePath(this.realFs.readlinkSync(H.fromPortablePath(e)))}async truncatePromise(e,r){return await new Promise((i,n)=>{this.realFs.truncate(H.fromPortablePath(e),r,this.makeCallback(i,n))})}truncateSync(e,r){return this.realFs.truncateSync(H.fromPortablePath(e),r)}watch(e,r,i){return this.realFs.watch(H.fromPortablePath(e),r,i)}watchFile(e,r,i){return this.realFs.watchFile(H.fromPortablePath(e),r,i)}unwatchFile(e,r){return this.realFs.unwatchFile(H.fromPortablePath(e),r)}makeCallback(e,r){return(i,n)=>{i?r(i):e(n)}}};var CM=ge(require("events"));var rc;(function(r){r.Change="change",r.Stop="stop"})(rc||(rc={}));var ic;(function(i){i.Ready="ready",i.Running="running",i.Stopped="stopped"})(ic||(ic={}));function mM(t,e){if(t!==e)throw new Error(`Invalid StatWatcher status: expected '${e}', got '${t}'`)}var Wh=class extends CM.EventEmitter{constructor(e,r,{bigint:i=!1}={}){super();this.status=ic.Ready;this.changeListeners=new Map;this.startTimeout=null;this.fakeFs=e,this.path=r,this.bigint=i,this.lastStats=this.stat()}static create(e,r,i){let n=new Wh(e,r,i);return n.start(),n}start(){mM(this.status,ic.Ready),this.status=ic.Running,this.startTimeout=setTimeout(()=>{this.startTimeout=null,this.fakeFs.existsSync(this.path)||this.emit(rc.Change,this.lastStats,this.lastStats)},3)}stop(){mM(this.status,ic.Running),this.status=ic.Stopped,this.startTimeout!==null&&(clearTimeout(this.startTimeout),this.startTimeout=null),this.emit(rc.Stop)}stat(){try{return this.fakeFs.statSync(this.path,{bigint:this.bigint})}catch(e){let r=this.bigint?new Hh:new KA;return KE(r)}}makeInterval(e){let r=setInterval(()=>{let i=this.stat(),n=this.lastStats;dQ(i,n)||(this.lastStats=i,this.emit(rc.Change,i,n))},e.interval);return e.persistent?r:r.unref()}registerChangeListener(e,r){this.addListener(rc.Change,e),this.changeListeners.set(e,this.makeInterval(r))}unregisterChangeListener(e){this.removeListener(rc.Change,e);let r=this.changeListeners.get(e);typeof r!="undefined"&&clearInterval(r),this.changeListeners.delete(e)}unregisterAllChangeListeners(){for(let e of this.changeListeners.keys())this.unregisterChangeListener(e)}hasChangeListeners(){return this.changeListeners.size>0}ref(){for(let e of this.changeListeners.values())e.ref();return this}unref(){for(let e of this.changeListeners.values())e.unref();return this}};var WE=new WeakMap;function zE(t,e,r,i){let n,s,o,a;switch(typeof r){case"function":n=!1,s=!0,o=5007,a=r;break;default:({bigint:n=!1,persistent:s=!0,interval:o=5007}=r),a=i;break}let l=WE.get(t);typeof l=="undefined"&&WE.set(t,l=new Map);let c=l.get(e);return typeof c=="undefined"&&(c=Wh.create(t,e,{bigint:n}),l.set(e,c)),c.registerChangeListener(a,{persistent:s,interval:o}),c}function zh(t,e,r){let i=WE.get(t);if(typeof i=="undefined")return;let n=i.get(e);typeof n!="undefined"&&(typeof r=="undefined"?n.unregisterAllChangeListeners():n.unregisterChangeListener(r),n.hasChangeListeners()||(n.stop(),i.delete(e)))}function _h(t){let e=WE.get(t);if(typeof e!="undefined")for(let r of e.keys())zh(t,r)}var nc="mixed";function vfe(t){if(typeof t=="string"&&String(+t)===t)return+t;if(Number.isFinite(t))return t<0?Date.now()/1e3:t;if(EM.types.isDate(t))return t.getTime()/1e3;throw new Error("Invalid time")}function IM(){return Buffer.from([80,75,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])}var Ai=class extends tc{constructor(e,r){super();this.lzSource=null;this.listings=new Map;this.entries=new Map;this.fileSources=new Map;this.fds=new Map;this.nextFd=0;this.ready=!1;this.readOnly=!1;this.libzip=r.libzip;let i=r;if(this.level=typeof i.level!="undefined"?i.level:nc,e!=null||(e=IM()),typeof e=="string"){let{baseFs:o=new ar}=i;this.baseFs=o,this.path=e}else this.path=null,this.baseFs=null;if(r.stats)this.stats=r.stats;else if(typeof e=="string")try{this.stats=this.baseFs.statSync(e)}catch(o){if(o.code==="ENOENT"&&i.create)this.stats=Gh();else throw o}else this.stats=Gh();let n=this.libzip.malloc(4);try{let o=0;if(typeof e=="string"&&i.create&&(o|=this.libzip.ZIP_CREATE|this.libzip.ZIP_TRUNCATE),r.readOnly&&(o|=this.libzip.ZIP_RDONLY,this.readOnly=!0),typeof e=="string")this.zip=this.libzip.open(H.fromPortablePath(e),o,n);else{let a=this.allocateUnattachedSource(e);try{this.zip=this.libzip.openFromSource(a,o,n),this.lzSource=a}catch(l){throw this.libzip.source.free(a),l}}if(this.zip===0){let a=this.libzip.struct.errorS();throw this.libzip.error.initWithCode(a,this.libzip.getValue(n,"i32")),this.makeLibzipError(a)}}finally{this.libzip.free(n)}this.listings.set(Ke.root,new Set);let s=this.libzip.getNumEntries(this.zip,0);for(let o=0;oe)throw new Error("Overread");let n=this.libzip.HEAPU8.subarray(r,r+e);return Buffer.from(n)}finally{this.libzip.free(r)}}finally{this.libzip.source.close(this.lzSource),this.libzip.source.free(this.lzSource),this.ready=!1}}prepareClose(){if(!this.ready)throw YE("archive closed, close");_h(this)}saveAndClose(){if(!this.path||!this.baseFs)throw new Error("ZipFS cannot be saved and must be discarded when loaded from a buffer");if(this.prepareClose(),this.readOnly){this.discardAndClose();return}let e=this.baseFs.existsSync(this.path)||this.stats.mode===Uh?void 0:this.stats.mode;if(this.entries.size===0)this.discardAndClose(),this.baseFs.writeFileSync(this.path,IM(),{mode:e});else{if(this.libzip.close(this.zip)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));typeof e!="undefined"&&this.baseFs.chmodSync(this.path,e)}this.ready=!1}discardAndClose(){this.prepareClose(),this.libzip.discard(this.zip),this.ready=!1}resolve(e){return x.resolve(Ke.root,e)}async openPromise(e,r,i){return this.openSync(e,r,i)}openSync(e,r,i){let n=this.nextFd++;return this.fds.set(n,{cursor:0,p:e}),n}hasOpenFileHandles(){return!!this.fds.size}async opendirPromise(e,r){return this.opendirSync(e,r)}opendirSync(e,r={}){let i=this.resolveFilename(`opendir '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw ro(`opendir '${e}'`);let n=this.listings.get(i);if(!n)throw Do(`opendir '${e}'`);let s=[...n],o=this.openSync(i,"r");return JE(this,i,s,{onClose:()=>{this.closeSync(o)}})}async readPromise(e,r,i,n,s){return this.readSync(e,r,i,n,s)}readSync(e,r,i=0,n=r.byteLength,s=-1){let o=this.fds.get(e);if(typeof o=="undefined")throw en("read");let a=s===-1||s===null?o.cursor:s,l=this.readFileSync(o.p);l.copy(r,i,a,a+n);let c=Math.max(0,Math.min(l.length-a,n));return(s===-1||s===null)&&(o.cursor+=c),c}async writePromise(e,r,i,n,s){return typeof r=="string"?this.writeSync(e,r,s):this.writeSync(e,r,i,n,s)}writeSync(e,r,i,n,s){throw typeof this.fds.get(e)=="undefined"?en("read"):new Error("Unimplemented")}async closePromise(e){return this.closeSync(e)}closeSync(e){if(typeof this.fds.get(e)=="undefined")throw en("read");this.fds.delete(e)}createReadStream(e,{encoding:r}={}){if(e===null)throw new Error("Unimplemented");let i=this.openSync(e,"r"),n=Object.assign(new wQ.PassThrough({emitClose:!0,autoDestroy:!0,destroy:(o,a)=>{clearImmediate(s),this.closeSync(i),a(o)}}),{close(){n.destroy()},bytesRead:0,path:e}),s=setImmediate(async()=>{try{let o=await this.readFilePromise(e,r);n.bytesRead=o.length,n.end(o)}catch(o){n.destroy(o)}});return n}createWriteStream(e,{encoding:r}={}){if(this.readOnly)throw In(`open '${e}'`);if(e===null)throw new Error("Unimplemented");let i=[],n=this.openSync(e,"w"),s=Object.assign(new wQ.PassThrough({autoDestroy:!0,emitClose:!0,destroy:(o,a)=>{try{o?a(o):(this.writeFileSync(e,Buffer.concat(i),r),a(null))}catch(l){a(l)}finally{this.closeSync(n)}}}),{bytesWritten:0,path:e,close(){s.destroy()}});return s.on("data",o=>{let a=Buffer.from(o);s.bytesWritten+=a.length,i.push(a)}),s}async realpathPromise(e){return this.realpathSync(e)}realpathSync(e){let r=this.resolveFilename(`lstat '${e}'`,e);if(!this.entries.has(r)&&!this.listings.has(r))throw ro(`lstat '${e}'`);return r}async existsPromise(e){return this.existsSync(e)}existsSync(e){if(!this.ready)throw YE(`archive closed, existsSync '${e}'`);if(this.symlinkCount===0){let i=x.resolve(Ke.root,e);return this.entries.has(i)||this.listings.has(i)}let r;try{r=this.resolveFilename(`stat '${e}'`,e)}catch(i){return!1}return this.entries.has(r)||this.listings.has(r)}async accessPromise(e,r){return this.accessSync(e,r)}accessSync(e,r=Ju.constants.F_OK){let i=this.resolveFilename(`access '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw ro(`access '${e}'`);if(this.readOnly&&r&Ju.constants.W_OK)throw In(`access '${e}'`)}async statPromise(e,r){return this.statSync(e,r)}statSync(e,r){let i=this.resolveFilename(`stat '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw ro(`stat '${e}'`);if(e[e.length-1]==="/"&&!this.listings.has(i))throw Do(`stat '${e}'`);return this.statImpl(`stat '${e}'`,i,r)}async fstatPromise(e,r){return this.fstatSync(e,r)}fstatSync(e,r){let i=this.fds.get(e);if(typeof i=="undefined")throw en("fstatSync");let{p:n}=i,s=this.resolveFilename(`stat '${n}'`,n);if(!this.entries.has(s)&&!this.listings.has(s))throw ro(`stat '${n}'`);if(n[n.length-1]==="/"&&!this.listings.has(s))throw Do(`stat '${n}'`);return this.statImpl(`fstat '${n}'`,s,r)}async lstatPromise(e,r){return this.lstatSync(e,r)}lstatSync(e,r){let i=this.resolveFilename(`lstat '${e}'`,e,!1);if(!this.entries.has(i)&&!this.listings.has(i))throw ro(`lstat '${e}'`);if(e[e.length-1]==="/"&&!this.listings.has(i))throw Do(`lstat '${e}'`);return this.statImpl(`lstat '${e}'`,i,r)}statImpl(e,r,i={}){let n=this.entries.get(r);if(typeof n!="undefined"){let s=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,n,0,0,s)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let a=this.stats.uid,l=this.stats.gid,c=this.libzip.struct.statSize(s)>>>0,u=512,g=Math.ceil(c/u),f=(this.libzip.struct.statMtime(s)>>>0)*1e3,h=f,p=f,m=f,y=new Date(h),b=new Date(p),S=new Date(m),k=new Date(f),T=this.listings.has(r)?ka:this.isSymbolicLink(n)?Pa:xa,Y=T===ka?493:420,j=T|this.getUnixMode(n,Y)&511,Z=this.libzip.struct.statCrc(s),J=Object.assign(new KA,{uid:a,gid:l,size:c,blksize:u,blocks:g,atime:y,birthtime:b,ctime:S,mtime:k,atimeMs:h,birthtimeMs:p,ctimeMs:m,mtimeMs:f,mode:j,crc:Z});return i.bigint===!0?UE(J):J}if(this.listings.has(r)){let s=this.stats.uid,o=this.stats.gid,a=0,l=512,c=0,u=this.stats.mtimeMs,g=this.stats.mtimeMs,f=this.stats.mtimeMs,h=this.stats.mtimeMs,p=new Date(u),m=new Date(g),y=new Date(f),b=new Date(h),S=ka|493,k=0,T=Object.assign(new KA,{uid:s,gid:o,size:a,blksize:l,blocks:c,atime:p,birthtime:m,ctime:y,mtime:b,atimeMs:u,birthtimeMs:g,ctimeMs:f,mtimeMs:h,mode:S,crc:k});return i.bigint===!0?UE(T):T}throw new Error("Unreachable")}getUnixMode(e,r){if(this.libzip.file.getExternalAttributes(this.zip,e,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX?r:this.libzip.getValue(this.libzip.uint32S,"i32")>>>16}registerListing(e){let r=this.listings.get(e);if(r)return r;this.registerListing(x.dirname(e)).add(x.basename(e));let n=new Set;return this.listings.set(e,n),n}registerEntry(e,r){this.registerListing(x.dirname(e)).add(x.basename(e)),this.entries.set(e,r)}unregisterListing(e){this.listings.delete(e);let r=this.listings.get(x.dirname(e));r==null||r.delete(x.basename(e))}unregisterEntry(e){this.unregisterListing(e);let r=this.entries.get(e);this.entries.delete(e),typeof r!="undefined"&&(this.fileSources.delete(r),this.isSymbolicLink(r)&&this.symlinkCount--)}deleteEntry(e,r){if(this.unregisterEntry(e),this.libzip.delete(this.zip,r)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}resolveFilename(e,r,i=!0){if(!this.ready)throw YE(`archive closed, ${e}`);let n=x.resolve(Ke.root,r);if(n==="/")return Ke.root;let s=this.entries.get(n);if(i&&s!==void 0)if(this.symlinkCount!==0&&this.isSymbolicLink(s)){let o=this.getFileSource(s).toString();return this.resolveFilename(e,x.resolve(x.dirname(n),o),!0)}else return n;for(;;){let o=this.resolveFilename(e,x.dirname(n),!0),a=this.listings.has(o),l=this.entries.has(o);if(!a&&!l)throw ro(e);if(!a)throw Do(e);if(n=x.resolve(o,x.basename(n)),!i||this.symlinkCount===0)break;let c=this.libzip.name.locate(this.zip,n.slice(1));if(c===-1)break;if(this.isSymbolicLink(c)){let u=this.getFileSource(c).toString();n=x.resolve(x.dirname(n),u)}else break}return n}allocateBuffer(e){Buffer.isBuffer(e)||(e=Buffer.from(e));let r=this.libzip.malloc(e.byteLength);if(!r)throw new Error("Couldn't allocate enough memory");return new Uint8Array(this.libzip.HEAPU8.buffer,r,e.byteLength).set(e),{buffer:r,byteLength:e.byteLength}}allocateUnattachedSource(e){let r=this.libzip.struct.errorS(),{buffer:i,byteLength:n}=this.allocateBuffer(e),s=this.libzip.source.fromUnattachedBuffer(i,n,0,!0,r);if(s===0)throw this.libzip.free(r),this.makeLibzipError(r);return s}allocateSource(e){let{buffer:r,byteLength:i}=this.allocateBuffer(e),n=this.libzip.source.fromBuffer(this.zip,r,i,0,!0);if(n===0)throw this.libzip.free(r),this.makeLibzipError(this.libzip.getError(this.zip));return n}setFileSource(e,r){let i=Buffer.isBuffer(r)?r:Buffer.from(r),n=x.relative(Ke.root,e),s=this.allocateSource(r);try{let o=this.libzip.file.add(this.zip,n,s,this.libzip.ZIP_FL_OVERWRITE);if(o===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));if(this.level!=="mixed"){let a=this.level===0?this.libzip.ZIP_CM_STORE:this.libzip.ZIP_CM_DEFLATE;if(this.libzip.file.setCompression(this.zip,o,0,a,this.level)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}return this.fileSources.set(o,i),o}catch(o){throw this.libzip.source.free(s),o}}isSymbolicLink(e){if(this.symlinkCount===0)return!1;if(this.libzip.file.getExternalAttributes(this.zip,e,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX?!1:(this.libzip.getValue(this.libzip.uint32S,"i32")>>>16&_n)===Pa}getFileSource(e,r={asyncDecompress:!1}){let i=this.fileSources.get(e);if(typeof i!="undefined")return i;let n=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,e,0,0,n)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let o=this.libzip.struct.statCompSize(n),a=this.libzip.struct.statCompMethod(n),l=this.libzip.malloc(o);try{let c=this.libzip.fopenIndex(this.zip,e,0,this.libzip.ZIP_FL_COMPRESSED);if(c===0)throw this.makeLibzipError(this.libzip.getError(this.zip));try{let u=this.libzip.fread(c,l,o,0);if(u===-1)throw this.makeLibzipError(this.libzip.file.getError(c));if(uo)throw new Error("Overread");let g=this.libzip.HEAPU8.subarray(l,l+o),f=Buffer.from(g);if(a===0)return this.fileSources.set(e,f),f;if(r.asyncDecompress)return new Promise((h,p)=>{BQ.default.inflateRaw(f,(m,y)=>{m?p(m):(this.fileSources.set(e,y),h(y))})});{let h=BQ.default.inflateRawSync(f);return this.fileSources.set(e,h),h}}finally{this.libzip.fclose(c)}}finally{this.libzip.free(l)}}async chmodPromise(e,r){return this.chmodSync(e,r)}chmodSync(e,r){if(this.readOnly)throw In(`chmod '${e}'`);r&=493;let i=this.resolveFilename(`chmod '${e}'`,e,!1),n=this.entries.get(i);if(typeof n=="undefined")throw new Error(`Assertion failed: The entry should have been registered (${i})`);let o=this.getUnixMode(n,xa|0)&~511|r;if(this.libzip.file.setExternalAttributes(this.zip,n,0,0,this.libzip.ZIP_OPSYS_UNIX,o<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async chownPromise(e,r,i){return this.chownSync(e,r,i)}chownSync(e,r,i){throw new Error("Unimplemented")}async renamePromise(e,r){return this.renameSync(e,r)}renameSync(e,r){throw new Error("Unimplemented")}async copyFilePromise(e,r,i){let{indexSource:n,indexDest:s,resolvedDestP:o}=this.prepareCopyFile(e,r,i),a=await this.getFileSource(n,{asyncDecompress:!0}),l=this.setFileSource(o,a);l!==s&&this.registerEntry(o,l)}copyFileSync(e,r,i=0){let{indexSource:n,indexDest:s,resolvedDestP:o}=this.prepareCopyFile(e,r,i),a=this.getFileSource(n),l=this.setFileSource(o,a);l!==s&&this.registerEntry(o,l)}prepareCopyFile(e,r,i=0){if(this.readOnly)throw In(`copyfile '${e} -> '${r}'`);if((i&Ju.constants.COPYFILE_FICLONE_FORCE)!=0)throw qh("unsupported clone operation",`copyfile '${e}' -> ${r}'`);let n=this.resolveFilename(`copyfile '${e} -> ${r}'`,e),s=this.entries.get(n);if(typeof s=="undefined")throw UA(`copyfile '${e}' -> '${r}'`);let o=this.resolveFilename(`copyfile '${e}' -> ${r}'`,r),a=this.entries.get(o);if((i&(Ju.constants.COPYFILE_EXCL|Ju.constants.COPYFILE_FICLONE_FORCE))!=0&&typeof a!="undefined")throw qE(`copyfile '${e}' -> '${r}'`);return{indexSource:s,resolvedDestP:o,indexDest:a}}async appendFilePromise(e,r,i){if(this.readOnly)throw In(`open '${e}'`);return typeof i=="undefined"?i={flag:"a"}:typeof i=="string"?i={flag:"a",encoding:i}:typeof i.flag=="undefined"&&(i=N({flag:"a"},i)),this.writeFilePromise(e,r,i)}appendFileSync(e,r,i={}){if(this.readOnly)throw In(`open '${e}'`);return typeof i=="undefined"?i={flag:"a"}:typeof i=="string"?i={flag:"a",encoding:i}:typeof i.flag=="undefined"&&(i=N({flag:"a"},i)),this.writeFileSync(e,r,i)}fdToPath(e,r){var n;let i=(n=this.fds.get(e))==null?void 0:n.p;if(typeof i=="undefined")throw en(r);return i}async writeFilePromise(e,r,i){let{encoding:n,mode:s,index:o,resolvedP:a}=this.prepareWriteFile(e,i);o!==void 0&&typeof i=="object"&&i.flag&&i.flag.includes("a")&&(r=Buffer.concat([await this.getFileSource(o,{asyncDecompress:!0}),Buffer.from(r)])),n!==null&&(r=r.toString(n));let l=this.setFileSource(a,r);l!==o&&this.registerEntry(a,l),s!==null&&await this.chmodPromise(a,s)}writeFileSync(e,r,i){let{encoding:n,mode:s,index:o,resolvedP:a}=this.prepareWriteFile(e,i);o!==void 0&&typeof i=="object"&&i.flag&&i.flag.includes("a")&&(r=Buffer.concat([this.getFileSource(o),Buffer.from(r)])),n!==null&&(r=r.toString(n));let l=this.setFileSource(a,r);l!==o&&this.registerEntry(a,l),s!==null&&this.chmodSync(a,s)}prepareWriteFile(e,r){if(typeof e=="number"&&(e=this.fdToPath(e,"read")),this.readOnly)throw In(`open '${e}'`);let i=this.resolveFilename(`open '${e}'`,e);if(this.listings.has(i))throw Jh(`open '${e}'`);let n=null,s=null;typeof r=="string"?n=r:typeof r=="object"&&({encoding:n=null,mode:s=null}=r);let o=this.entries.get(i);return{encoding:n,mode:s,resolvedP:i,index:o}}async unlinkPromise(e){return this.unlinkSync(e)}unlinkSync(e){if(this.readOnly)throw In(`unlink '${e}'`);let r=this.resolveFilename(`unlink '${e}'`,e);if(this.listings.has(r))throw Jh(`unlink '${e}'`);let i=this.entries.get(r);if(typeof i=="undefined")throw UA(`unlink '${e}'`);this.deleteEntry(r,i)}async utimesPromise(e,r,i){return this.utimesSync(e,r,i)}utimesSync(e,r,i){if(this.readOnly)throw In(`utimes '${e}'`);let n=this.resolveFilename(`utimes '${e}'`,e);this.utimesImpl(n,i)}async lutimesPromise(e,r,i){return this.lutimesSync(e,r,i)}lutimesSync(e,r,i){if(this.readOnly)throw In(`lutimes '${e}'`);let n=this.resolveFilename(`utimes '${e}'`,e,!1);this.utimesImpl(n,i)}utimesImpl(e,r){this.listings.has(e)&&(this.entries.has(e)||this.hydrateDirectory(e));let i=this.entries.get(e);if(i===void 0)throw new Error("Unreachable");if(this.libzip.file.setMtime(this.zip,i,0,vfe(r),0)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async mkdirPromise(e,r){return this.mkdirSync(e,r)}mkdirSync(e,{mode:r=493,recursive:i=!1}={}){if(i){this.mkdirpSync(e,{chmod:r});return}if(this.readOnly)throw In(`mkdir '${e}'`);let n=this.resolveFilename(`mkdir '${e}'`,e);if(this.entries.has(n)||this.listings.has(n))throw qE(`mkdir '${e}'`);this.hydrateDirectory(n),this.chmodSync(n,r)}async rmdirPromise(e,r){return this.rmdirSync(e,r)}rmdirSync(e,{recursive:r=!1}={}){if(this.readOnly)throw In(`rmdir '${e}'`);if(r){this.removeSync(e);return}let i=this.resolveFilename(`rmdir '${e}'`,e),n=this.listings.get(i);if(!n)throw Do(`rmdir '${e}'`);if(n.size>0)throw uM(`rmdir '${e}'`);let s=this.entries.get(i);if(typeof s=="undefined")throw UA(`rmdir '${e}'`);this.deleteEntry(e,s)}hydrateDirectory(e){let r=this.libzip.dir.add(this.zip,x.relative(Ke.root,e));if(r===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.registerListing(e),this.registerEntry(e,r),r}async linkPromise(e,r){return this.linkSync(e,r)}linkSync(e,r){throw gM(`link '${e}' -> '${r}'`)}async symlinkPromise(e,r){return this.symlinkSync(e,r)}symlinkSync(e,r){if(this.readOnly)throw In(`symlink '${e}' -> '${r}'`);let i=this.resolveFilename(`symlink '${e}' -> '${r}'`,r);if(this.listings.has(i))throw Jh(`symlink '${e}' -> '${r}'`);if(this.entries.has(i))throw qE(`symlink '${e}' -> '${r}'`);let n=this.setFileSource(i,e);if(this.registerEntry(i,n),this.libzip.file.setExternalAttributes(this.zip,n,0,0,this.libzip.ZIP_OPSYS_UNIX,(Pa|511)<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));this.symlinkCount+=1}async readFilePromise(e,r){typeof r=="object"&&(r=r?r.encoding:void 0);let i=await this.readFileBuffer(e,{asyncDecompress:!0});return r?i.toString(r):i}readFileSync(e,r){typeof r=="object"&&(r=r?r.encoding:void 0);let i=this.readFileBuffer(e);return r?i.toString(r):i}readFileBuffer(e,r={asyncDecompress:!1}){typeof e=="number"&&(e=this.fdToPath(e,"read"));let i=this.resolveFilename(`open '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw ro(`open '${e}'`);if(e[e.length-1]==="/"&&!this.listings.has(i))throw Do(`open '${e}'`);if(this.listings.has(i))throw Jh("read");let n=this.entries.get(i);if(n===void 0)throw new Error("Unreachable");return this.getFileSource(n,r)}async readdirPromise(e,r){return this.readdirSync(e,r)}readdirSync(e,r){let i=this.resolveFilename(`scandir '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw ro(`scandir '${e}'`);let n=this.listings.get(i);if(!n)throw Do(`scandir '${e}'`);let s=[...n];return(r==null?void 0:r.withFileTypes)?s.map(o=>Object.assign(this.statImpl("lstat",x.join(e,o)),{name:o})):s}async readlinkPromise(e){let r=this.prepareReadlink(e);return(await this.getFileSource(r,{asyncDecompress:!0})).toString()}readlinkSync(e){let r=this.prepareReadlink(e);return this.getFileSource(r).toString()}prepareReadlink(e){let r=this.resolveFilename(`readlink '${e}'`,e,!1);if(!this.entries.has(r)&&!this.listings.has(r))throw ro(`readlink '${e}'`);if(e[e.length-1]==="/"&&!this.listings.has(r))throw Do(`open '${e}'`);if(this.listings.has(r))throw UA(`readlink '${e}'`);let i=this.entries.get(r);if(i===void 0)throw new Error("Unreachable");if(!this.isSymbolicLink(i))throw UA(`readlink '${e}'`);return i}async truncatePromise(e,r=0){let i=this.resolveFilename(`open '${e}'`,e),n=this.entries.get(i);if(typeof n=="undefined")throw UA(`open '${e}'`);let s=await this.getFileSource(n,{asyncDecompress:!0}),o=Buffer.alloc(r,0);return s.copy(o),await this.writeFilePromise(e,o)}truncateSync(e,r=0){let i=this.resolveFilename(`open '${e}'`,e),n=this.entries.get(i);if(typeof n=="undefined")throw UA(`open '${e}'`);let s=this.getFileSource(n),o=Buffer.alloc(r,0);return s.copy(o),this.writeFileSync(e,o)}watch(e,r,i){let n;switch(typeof r){case"function":case"string":case"undefined":n=!0;break;default:({persistent:n=!0}=r);break}if(!n)return{on:()=>{},close:()=>{}};let s=setInterval(()=>{},24*60*60*1e3);return{on:()=>{},close:()=>{clearInterval(s)}}}watchFile(e,r,i){let n=x.resolve(Ke.root,e);return zE(this,n,r,i)}unwatchFile(e,r){let i=x.resolve(Ke.root,e);return zh(this,i,r)}};var bi=class extends HA{getExtractHint(e){return this.baseFs.getExtractHint(e)}resolve(e){return this.mapFromBase(this.baseFs.resolve(this.mapToBase(e)))}getRealPath(){return this.mapFromBase(this.baseFs.getRealPath())}async openPromise(e,r,i){return this.baseFs.openPromise(this.mapToBase(e),r,i)}openSync(e,r,i){return this.baseFs.openSync(this.mapToBase(e),r,i)}async opendirPromise(e,r){return Object.assign(await this.baseFs.opendirPromise(this.mapToBase(e),r),{path:e})}opendirSync(e,r){return Object.assign(this.baseFs.opendirSync(this.mapToBase(e),r),{path:e})}async readPromise(e,r,i,n,s){return await this.baseFs.readPromise(e,r,i,n,s)}readSync(e,r,i,n,s){return this.baseFs.readSync(e,r,i,n,s)}async writePromise(e,r,i,n,s){return typeof r=="string"?await this.baseFs.writePromise(e,r,i):await this.baseFs.writePromise(e,r,i,n,s)}writeSync(e,r,i,n,s){return typeof r=="string"?this.baseFs.writeSync(e,r,i):this.baseFs.writeSync(e,r,i,n,s)}async closePromise(e){return this.baseFs.closePromise(e)}closeSync(e){this.baseFs.closeSync(e)}createReadStream(e,r){return this.baseFs.createReadStream(e!==null?this.mapToBase(e):e,r)}createWriteStream(e,r){return this.baseFs.createWriteStream(e!==null?this.mapToBase(e):e,r)}async realpathPromise(e){return this.mapFromBase(await this.baseFs.realpathPromise(this.mapToBase(e)))}realpathSync(e){return this.mapFromBase(this.baseFs.realpathSync(this.mapToBase(e)))}async existsPromise(e){return this.baseFs.existsPromise(this.mapToBase(e))}existsSync(e){return this.baseFs.existsSync(this.mapToBase(e))}accessSync(e,r){return this.baseFs.accessSync(this.mapToBase(e),r)}async accessPromise(e,r){return this.baseFs.accessPromise(this.mapToBase(e),r)}async statPromise(e,r){return this.baseFs.statPromise(this.mapToBase(e),r)}statSync(e,r){return this.baseFs.statSync(this.mapToBase(e),r)}async fstatPromise(e,r){return this.baseFs.fstatPromise(e,r)}fstatSync(e,r){return this.baseFs.fstatSync(e,r)}async lstatPromise(e,r){return this.baseFs.lstatPromise(this.mapToBase(e),r)}lstatSync(e,r){return this.baseFs.lstatSync(this.mapToBase(e),r)}async chmodPromise(e,r){return this.baseFs.chmodPromise(this.mapToBase(e),r)}chmodSync(e,r){return this.baseFs.chmodSync(this.mapToBase(e),r)}async chownPromise(e,r,i){return this.baseFs.chownPromise(this.mapToBase(e),r,i)}chownSync(e,r,i){return this.baseFs.chownSync(this.mapToBase(e),r,i)}async renamePromise(e,r){return this.baseFs.renamePromise(this.mapToBase(e),this.mapToBase(r))}renameSync(e,r){return this.baseFs.renameSync(this.mapToBase(e),this.mapToBase(r))}async copyFilePromise(e,r,i=0){return this.baseFs.copyFilePromise(this.mapToBase(e),this.mapToBase(r),i)}copyFileSync(e,r,i=0){return this.baseFs.copyFileSync(this.mapToBase(e),this.mapToBase(r),i)}async appendFilePromise(e,r,i){return this.baseFs.appendFilePromise(this.fsMapToBase(e),r,i)}appendFileSync(e,r,i){return this.baseFs.appendFileSync(this.fsMapToBase(e),r,i)}async writeFilePromise(e,r,i){return this.baseFs.writeFilePromise(this.fsMapToBase(e),r,i)}writeFileSync(e,r,i){return this.baseFs.writeFileSync(this.fsMapToBase(e),r,i)}async unlinkPromise(e){return this.baseFs.unlinkPromise(this.mapToBase(e))}unlinkSync(e){return this.baseFs.unlinkSync(this.mapToBase(e))}async utimesPromise(e,r,i){return this.baseFs.utimesPromise(this.mapToBase(e),r,i)}utimesSync(e,r,i){return this.baseFs.utimesSync(this.mapToBase(e),r,i)}async mkdirPromise(e,r){return this.baseFs.mkdirPromise(this.mapToBase(e),r)}mkdirSync(e,r){return this.baseFs.mkdirSync(this.mapToBase(e),r)}async rmdirPromise(e,r){return this.baseFs.rmdirPromise(this.mapToBase(e),r)}rmdirSync(e,r){return this.baseFs.rmdirSync(this.mapToBase(e),r)}async linkPromise(e,r){return this.baseFs.linkPromise(this.mapToBase(e),this.mapToBase(r))}linkSync(e,r){return this.baseFs.linkSync(this.mapToBase(e),this.mapToBase(r))}async symlinkPromise(e,r,i){let n=this.mapToBase(r);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkPromise(this.mapToBase(e),n,i);let s=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(r),e)),o=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(n),s);return this.baseFs.symlinkPromise(o,n,i)}symlinkSync(e,r,i){let n=this.mapToBase(r);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkSync(this.mapToBase(e),n,i);let s=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(r),e)),o=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(n),s);return this.baseFs.symlinkSync(o,n,i)}async readFilePromise(e,r){return r==="utf8"?this.baseFs.readFilePromise(this.fsMapToBase(e),r):this.baseFs.readFilePromise(this.fsMapToBase(e),r)}readFileSync(e,r){return r==="utf8"?this.baseFs.readFileSync(this.fsMapToBase(e),r):this.baseFs.readFileSync(this.fsMapToBase(e),r)}async readdirPromise(e,r){return this.baseFs.readdirPromise(this.mapToBase(e),r)}readdirSync(e,r){return this.baseFs.readdirSync(this.mapToBase(e),r)}async readlinkPromise(e){return this.mapFromBase(await this.baseFs.readlinkPromise(this.mapToBase(e)))}readlinkSync(e){return this.mapFromBase(this.baseFs.readlinkSync(this.mapToBase(e)))}async truncatePromise(e,r){return this.baseFs.truncatePromise(this.mapToBase(e),r)}truncateSync(e,r){return this.baseFs.truncateSync(this.mapToBase(e),r)}watch(e,r,i){return this.baseFs.watch(this.mapToBase(e),r,i)}watchFile(e,r,i){return this.baseFs.watchFile(this.mapToBase(e),r,i)}unwatchFile(e,r){return this.baseFs.unwatchFile(this.mapToBase(e),r)}fsMapToBase(e){return typeof e=="number"?e:this.mapToBase(e)}};var Da=class extends bi{constructor(e,{baseFs:r,pathUtils:i}){super(i);this.target=e,this.baseFs=r}getRealPath(){return this.target}getBaseFs(){return this.baseFs}mapFromBase(e){return e}mapToBase(e){return e}};var _t=class extends bi{constructor(e,{baseFs:r=new ar}={}){super(x);this.target=this.pathUtils.normalize(e),this.baseFs=r}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.target)}resolve(e){return this.pathUtils.isAbsolute(e)?x.normalize(e):this.baseFs.resolve(x.join(this.target,e))}mapFromBase(e){return e}mapToBase(e){return this.pathUtils.isAbsolute(e)?e:this.pathUtils.join(this.target,e)}};var yM=Ke.root,Ra=class extends bi{constructor(e,{baseFs:r=new ar}={}){super(x);this.target=this.pathUtils.resolve(Ke.root,e),this.baseFs=r}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.pathUtils.relative(Ke.root,this.target))}getTarget(){return this.target}getBaseFs(){return this.baseFs}mapToBase(e){let r=this.pathUtils.normalize(e);if(this.pathUtils.isAbsolute(e))return this.pathUtils.resolve(this.target,this.pathUtils.relative(yM,e));if(r.match(/^\.\.\/?/))throw new Error(`Resolving this path (${e}) would escape the jail`);return this.pathUtils.resolve(this.target,e)}mapFromBase(e){return this.pathUtils.resolve(yM,this.pathUtils.relative(this.target,e))}};var Vh=class extends bi{constructor(e,r){super(r);this.instance=null;this.factory=e}get baseFs(){return this.instance||(this.instance=this.factory()),this.instance}set baseFs(e){this.instance=e}mapFromBase(e){return e}mapToBase(e){return e}};var st=()=>Object.assign(new Error("ENOSYS: unsupported filesystem access"),{code:"ENOSYS"}),bQ=class extends HA{constructor(){super(x)}getExtractHint(){throw st()}getRealPath(){throw st()}resolve(){throw st()}async openPromise(){throw st()}openSync(){throw st()}async opendirPromise(){throw st()}opendirSync(){throw st()}async readPromise(){throw st()}readSync(){throw st()}async writePromise(){throw st()}writeSync(){throw st()}async closePromise(){throw st()}closeSync(){throw st()}createWriteStream(){throw st()}createReadStream(){throw st()}async realpathPromise(){throw st()}realpathSync(){throw st()}async readdirPromise(){throw st()}readdirSync(){throw st()}async existsPromise(e){throw st()}existsSync(e){throw st()}async accessPromise(){throw st()}accessSync(){throw st()}async statPromise(){throw st()}statSync(){throw st()}async fstatPromise(e){throw st()}fstatSync(e){throw st()}async lstatPromise(e){throw st()}lstatSync(e){throw st()}async chmodPromise(){throw st()}chmodSync(){throw st()}async chownPromise(){throw st()}chownSync(){throw st()}async mkdirPromise(){throw st()}mkdirSync(){throw st()}async rmdirPromise(){throw st()}rmdirSync(){throw st()}async linkPromise(){throw st()}linkSync(){throw st()}async symlinkPromise(){throw st()}symlinkSync(){throw st()}async renamePromise(){throw st()}renameSync(){throw st()}async copyFilePromise(){throw st()}copyFileSync(){throw st()}async appendFilePromise(){throw st()}appendFileSync(){throw st()}async writeFilePromise(){throw st()}writeFileSync(){throw st()}async unlinkPromise(){throw st()}unlinkSync(){throw st()}async utimesPromise(){throw st()}utimesSync(){throw st()}async readFilePromise(){throw st()}readFileSync(){throw st()}async readlinkPromise(){throw st()}readlinkSync(){throw st()}async truncatePromise(){throw st()}truncateSync(){throw st()}watch(){throw st()}watchFile(){throw st()}unwatchFile(){throw st()}},_E=bQ;_E.instance=new bQ;var Xh=class extends bi{constructor(e){super(H);this.baseFs=e}mapFromBase(e){return H.fromPortablePath(e)}mapToBase(e){return H.toPortablePath(e)}};var Sfe=/^[0-9]+$/,QQ=/^(\/(?:[^/]+\/)*?(?:\$\$virtual|__virtual__))((?:\/((?:[^/]+-)?[a-f0-9]+)(?:\/([^/]+))?)?((?:\/.*)?))$/,kfe=/^([^/]+-)?[a-f0-9]+$/,Wr=class extends bi{static makeVirtualPath(e,r,i){if(x.basename(e)!=="__virtual__")throw new Error('Assertion failed: Virtual folders must be named "__virtual__"');if(!x.basename(r).match(kfe))throw new Error("Assertion failed: Virtual components must be ended by an hexadecimal hash");let s=x.relative(x.dirname(e),i).split("/"),o=0;for(;o{let r=t.indexOf(e);if(r<=0)return null;let i=r;for(;r>=0&&(i=r+e.length,t[i]!==x.sep);){if(t[r-1]===x.sep)return null;r=t.indexOf(e,i)}return t.length>i&&t[i]!==x.sep?null:t.slice(0,i)},Es=class extends tc{constructor({libzip:e,baseFs:r=new ar,filter:i=null,maxOpenFiles:n=Infinity,readOnlyArchives:s=!1,useCache:o=!0,maxAge:a=5e3,fileExtensions:l=null}){super();this.fdMap=new Map;this.nextFd=3;this.isZip=new Set;this.notZip=new Set;this.realPaths=new Map;this.limitOpenFilesTimeout=null;this.libzipFactory=typeof e!="function"?()=>e:e,this.baseFs=r,this.zipInstances=o?new Map:null,this.filter=i,this.maxOpenFiles=n,this.readOnlyArchives=s,this.maxAge=a,this.fileExtensions=l}static async openPromise(e,r){let i=new Es(r);try{return await e(i)}finally{i.saveAndClose()}}get libzip(){return typeof this.libzipInstance=="undefined"&&(this.libzipInstance=this.libzipFactory()),this.libzipInstance}getExtractHint(e){return this.baseFs.getExtractHint(e)}getRealPath(){return this.baseFs.getRealPath()}saveAndClose(){if(_h(this),this.zipInstances)for(let[e,{zipFs:r}]of this.zipInstances.entries())r.saveAndClose(),this.zipInstances.delete(e)}discardAndClose(){if(_h(this),this.zipInstances)for(let[e,{zipFs:r}]of this.zipInstances.entries())r.discardAndClose(),this.zipInstances.delete(e)}resolve(e){return this.baseFs.resolve(e)}remapFd(e,r){let i=this.nextFd++|Fa;return this.fdMap.set(i,[e,r]),i}async openPromise(e,r,i){return await this.makeCallPromise(e,async()=>await this.baseFs.openPromise(e,r,i),async(n,{subPath:s})=>this.remapFd(n,await n.openPromise(s,r,i)))}openSync(e,r,i){return this.makeCallSync(e,()=>this.baseFs.openSync(e,r,i),(n,{subPath:s})=>this.remapFd(n,n.openSync(s,r,i)))}async opendirPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.opendirPromise(e,r),async(i,{subPath:n})=>await i.opendirPromise(n,r),{requireSubpath:!1})}opendirSync(e,r){return this.makeCallSync(e,()=>this.baseFs.opendirSync(e,r),(i,{subPath:n})=>i.opendirSync(n,r),{requireSubpath:!1})}async readPromise(e,r,i,n,s){if((e&Fa)==0)return await this.baseFs.readPromise(e,r,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw en("read");let[a,l]=o;return await a.readPromise(l,r,i,n,s)}readSync(e,r,i,n,s){if((e&Fa)==0)return this.baseFs.readSync(e,r,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw en("readSync");let[a,l]=o;return a.readSync(l,r,i,n,s)}async writePromise(e,r,i,n,s){if((e&Fa)==0)return typeof r=="string"?await this.baseFs.writePromise(e,r,i):await this.baseFs.writePromise(e,r,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw en("write");let[a,l]=o;return typeof r=="string"?await a.writePromise(l,r,i):await a.writePromise(l,r,i,n,s)}writeSync(e,r,i,n,s){if((e&Fa)==0)return typeof r=="string"?this.baseFs.writeSync(e,r,i):this.baseFs.writeSync(e,r,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw en("writeSync");let[a,l]=o;return typeof r=="string"?a.writeSync(l,r,i):a.writeSync(l,r,i,n,s)}async closePromise(e){if((e&Fa)==0)return await this.baseFs.closePromise(e);let r=this.fdMap.get(e);if(typeof r=="undefined")throw en("close");this.fdMap.delete(e);let[i,n]=r;return await i.closePromise(n)}closeSync(e){if((e&Fa)==0)return this.baseFs.closeSync(e);let r=this.fdMap.get(e);if(typeof r=="undefined")throw en("closeSync");this.fdMap.delete(e);let[i,n]=r;return i.closeSync(n)}createReadStream(e,r){return e===null?this.baseFs.createReadStream(e,r):this.makeCallSync(e,()=>this.baseFs.createReadStream(e,r),(i,{archivePath:n,subPath:s})=>{let o=i.createReadStream(s,r);return o.path=H.fromPortablePath(this.pathUtils.join(n,s)),o})}createWriteStream(e,r){return e===null?this.baseFs.createWriteStream(e,r):this.makeCallSync(e,()=>this.baseFs.createWriteStream(e,r),(i,{subPath:n})=>i.createWriteStream(n,r))}async realpathPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.realpathPromise(e),async(r,{archivePath:i,subPath:n})=>{let s=this.realPaths.get(i);return typeof s=="undefined"&&(s=await this.baseFs.realpathPromise(i),this.realPaths.set(i,s)),this.pathUtils.join(s,this.pathUtils.relative(Ke.root,await r.realpathPromise(n)))})}realpathSync(e){return this.makeCallSync(e,()=>this.baseFs.realpathSync(e),(r,{archivePath:i,subPath:n})=>{let s=this.realPaths.get(i);return typeof s=="undefined"&&(s=this.baseFs.realpathSync(i),this.realPaths.set(i,s)),this.pathUtils.join(s,this.pathUtils.relative(Ke.root,r.realpathSync(n)))})}async existsPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.existsPromise(e),async(r,{subPath:i})=>await r.existsPromise(i))}existsSync(e){return this.makeCallSync(e,()=>this.baseFs.existsSync(e),(r,{subPath:i})=>r.existsSync(i))}async accessPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.accessPromise(e,r),async(i,{subPath:n})=>await i.accessPromise(n,r))}accessSync(e,r){return this.makeCallSync(e,()=>this.baseFs.accessSync(e,r),(i,{subPath:n})=>i.accessSync(n,r))}async statPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.statPromise(e,r),async(i,{subPath:n})=>await i.statPromise(n,r))}statSync(e,r){return this.makeCallSync(e,()=>this.baseFs.statSync(e,r),(i,{subPath:n})=>i.statSync(n,r))}async fstatPromise(e,r){if((e&Fa)==0)return this.baseFs.fstatPromise(e,r);let i=this.fdMap.get(e);if(typeof i=="undefined")throw en("fstat");let[n,s]=i;return n.fstatPromise(s,r)}fstatSync(e,r){if((e&Fa)==0)return this.baseFs.fstatSync(e,r);let i=this.fdMap.get(e);if(typeof i=="undefined")throw en("fstatSync");let[n,s]=i;return n.fstatSync(s,r)}async lstatPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.lstatPromise(e,r),async(i,{subPath:n})=>await i.lstatPromise(n,r))}lstatSync(e,r){return this.makeCallSync(e,()=>this.baseFs.lstatSync(e,r),(i,{subPath:n})=>i.lstatSync(n,r))}async chmodPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.chmodPromise(e,r),async(i,{subPath:n})=>await i.chmodPromise(n,r))}chmodSync(e,r){return this.makeCallSync(e,()=>this.baseFs.chmodSync(e,r),(i,{subPath:n})=>i.chmodSync(n,r))}async chownPromise(e,r,i){return await this.makeCallPromise(e,async()=>await this.baseFs.chownPromise(e,r,i),async(n,{subPath:s})=>await n.chownPromise(s,r,i))}chownSync(e,r,i){return this.makeCallSync(e,()=>this.baseFs.chownSync(e,r,i),(n,{subPath:s})=>n.chownSync(s,r,i))}async renamePromise(e,r){return await this.makeCallPromise(e,async()=>await this.makeCallPromise(r,async()=>await this.baseFs.renamePromise(e,r),async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),async(i,{subPath:n})=>await this.makeCallPromise(r,async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},async(s,{subPath:o})=>{if(i!==s)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return await i.renamePromise(n,o)}))}renameSync(e,r){return this.makeCallSync(e,()=>this.makeCallSync(r,()=>this.baseFs.renameSync(e,r),()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),(i,{subPath:n})=>this.makeCallSync(r,()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},(s,{subPath:o})=>{if(i!==s)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return i.renameSync(n,o)}))}async copyFilePromise(e,r,i=0){let n=async(s,o,a,l)=>{if((i&Zh.constants.COPYFILE_FICLONE_FORCE)!=0)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${o}' -> ${l}'`),{code:"EXDEV"});if(i&Zh.constants.COPYFILE_EXCL&&await this.existsPromise(o))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${o}' -> '${l}'`),{code:"EEXIST"});let c;try{c=await s.readFilePromise(o)}catch(u){throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${o}' -> '${l}'`),{code:"EINVAL"})}await a.writeFilePromise(l,c)};return await this.makeCallPromise(e,async()=>await this.makeCallPromise(r,async()=>await this.baseFs.copyFilePromise(e,r,i),async(s,{subPath:o})=>await n(this.baseFs,e,s,o)),async(s,{subPath:o})=>await this.makeCallPromise(r,async()=>await n(s,o,this.baseFs,r),async(a,{subPath:l})=>s!==a?await n(s,o,a,l):await s.copyFilePromise(o,l,i)))}copyFileSync(e,r,i=0){let n=(s,o,a,l)=>{if((i&Zh.constants.COPYFILE_FICLONE_FORCE)!=0)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${o}' -> ${l}'`),{code:"EXDEV"});if(i&Zh.constants.COPYFILE_EXCL&&this.existsSync(o))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${o}' -> '${l}'`),{code:"EEXIST"});let c;try{c=s.readFileSync(o)}catch(u){throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${o}' -> '${l}'`),{code:"EINVAL"})}a.writeFileSync(l,c)};return this.makeCallSync(e,()=>this.makeCallSync(r,()=>this.baseFs.copyFileSync(e,r,i),(s,{subPath:o})=>n(this.baseFs,e,s,o)),(s,{subPath:o})=>this.makeCallSync(r,()=>n(s,o,this.baseFs,r),(a,{subPath:l})=>s!==a?n(s,o,a,l):s.copyFileSync(o,l,i)))}async appendFilePromise(e,r,i){return await this.makeCallPromise(e,async()=>await this.baseFs.appendFilePromise(e,r,i),async(n,{subPath:s})=>await n.appendFilePromise(s,r,i))}appendFileSync(e,r,i){return this.makeCallSync(e,()=>this.baseFs.appendFileSync(e,r,i),(n,{subPath:s})=>n.appendFileSync(s,r,i))}async writeFilePromise(e,r,i){return await this.makeCallPromise(e,async()=>await this.baseFs.writeFilePromise(e,r,i),async(n,{subPath:s})=>await n.writeFilePromise(s,r,i))}writeFileSync(e,r,i){return this.makeCallSync(e,()=>this.baseFs.writeFileSync(e,r,i),(n,{subPath:s})=>n.writeFileSync(s,r,i))}async unlinkPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.unlinkPromise(e),async(r,{subPath:i})=>await r.unlinkPromise(i))}unlinkSync(e){return this.makeCallSync(e,()=>this.baseFs.unlinkSync(e),(r,{subPath:i})=>r.unlinkSync(i))}async utimesPromise(e,r,i){return await this.makeCallPromise(e,async()=>await this.baseFs.utimesPromise(e,r,i),async(n,{subPath:s})=>await n.utimesPromise(s,r,i))}utimesSync(e,r,i){return this.makeCallSync(e,()=>this.baseFs.utimesSync(e,r,i),(n,{subPath:s})=>n.utimesSync(s,r,i))}async mkdirPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.mkdirPromise(e,r),async(i,{subPath:n})=>await i.mkdirPromise(n,r))}mkdirSync(e,r){return this.makeCallSync(e,()=>this.baseFs.mkdirSync(e,r),(i,{subPath:n})=>i.mkdirSync(n,r))}async rmdirPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.rmdirPromise(e,r),async(i,{subPath:n})=>await i.rmdirPromise(n,r))}rmdirSync(e,r){return this.makeCallSync(e,()=>this.baseFs.rmdirSync(e,r),(i,{subPath:n})=>i.rmdirSync(n,r))}async linkPromise(e,r){return await this.makeCallPromise(r,async()=>await this.baseFs.linkPromise(e,r),async(i,{subPath:n})=>await i.linkPromise(e,n))}linkSync(e,r){return this.makeCallSync(r,()=>this.baseFs.linkSync(e,r),(i,{subPath:n})=>i.linkSync(e,n))}async symlinkPromise(e,r,i){return await this.makeCallPromise(r,async()=>await this.baseFs.symlinkPromise(e,r,i),async(n,{subPath:s})=>await n.symlinkPromise(e,s))}symlinkSync(e,r,i){return this.makeCallSync(r,()=>this.baseFs.symlinkSync(e,r,i),(n,{subPath:s})=>n.symlinkSync(e,s))}async readFilePromise(e,r){return this.makeCallPromise(e,async()=>{switch(r){case"utf8":return await this.baseFs.readFilePromise(e,r);default:return await this.baseFs.readFilePromise(e,r)}},async(i,{subPath:n})=>await i.readFilePromise(n,r))}readFileSync(e,r){return this.makeCallSync(e,()=>{switch(r){case"utf8":return this.baseFs.readFileSync(e,r);default:return this.baseFs.readFileSync(e,r)}},(i,{subPath:n})=>i.readFileSync(n,r))}async readdirPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.readdirPromise(e,r),async(i,{subPath:n})=>await i.readdirPromise(n,r),{requireSubpath:!1})}readdirSync(e,r){return this.makeCallSync(e,()=>this.baseFs.readdirSync(e,r),(i,{subPath:n})=>i.readdirSync(n,r),{requireSubpath:!1})}async readlinkPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.readlinkPromise(e),async(r,{subPath:i})=>await r.readlinkPromise(i))}readlinkSync(e){return this.makeCallSync(e,()=>this.baseFs.readlinkSync(e),(r,{subPath:i})=>r.readlinkSync(i))}async truncatePromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.truncatePromise(e,r),async(i,{subPath:n})=>await i.truncatePromise(n,r))}truncateSync(e,r){return this.makeCallSync(e,()=>this.baseFs.truncateSync(e,r),(i,{subPath:n})=>i.truncateSync(n,r))}watch(e,r,i){return this.makeCallSync(e,()=>this.baseFs.watch(e,r,i),(n,{subPath:s})=>n.watch(s,r,i))}watchFile(e,r,i){return this.makeCallSync(e,()=>this.baseFs.watchFile(e,r,i),()=>zE(this,e,r,i))}unwatchFile(e,r){return this.makeCallSync(e,()=>this.baseFs.unwatchFile(e,r),()=>zh(this,e,r))}async makeCallPromise(e,r,i,{requireSubpath:n=!0}={}){if(typeof e!="string")return await r();let s=this.resolve(e),o=this.findZip(s);return o?n&&o.subPath==="/"?await r():await this.getZipPromise(o.archivePath,async a=>await i(a,o)):await r()}makeCallSync(e,r,i,{requireSubpath:n=!0}={}){if(typeof e!="string")return r();let s=this.resolve(e),o=this.findZip(s);return!o||n&&o.subPath==="/"?r():this.getZipSync(o.archivePath,a=>i(a,o))}findZip(e){if(this.filter&&!this.filter.test(e))return null;let r="";for(;;){let i=e.substring(r.length),n;if(!this.fileExtensions)n=wM(i,".zip");else for(let s of this.fileExtensions)if(n=wM(i,s),n)break;if(!n)return null;if(r=this.pathUtils.join(r,n),this.isZip.has(r)===!1){if(this.notZip.has(r))continue;try{if(!this.baseFs.lstatSync(r).isFile()){this.notZip.add(r);continue}}catch{return null}this.isZip.add(r)}return{archivePath:r,subPath:this.pathUtils.join(Ke.root,e.substring(r.length))}}}limitOpenFiles(e){if(this.zipInstances===null)return;let r=Date.now(),i=r+this.maxAge,n=e===null?0:this.zipInstances.size-e;for(let[s,{zipFs:o,expiresAt:a,refCount:l}]of this.zipInstances.entries())if(!(l!==0||o.hasOpenFileHandles())){if(r>=a){o.saveAndClose(),this.zipInstances.delete(s),n-=1;continue}else if(e===null||n<=0){i=a;break}o.saveAndClose(),this.zipInstances.delete(s),n-=1}this.limitOpenFilesTimeout===null&&(e===null&&this.zipInstances.size>0||e!==null)&&(this.limitOpenFilesTimeout=setTimeout(()=>{this.limitOpenFilesTimeout=null,this.limitOpenFiles(null)},i-r).unref())}async getZipPromise(e,r){let i=async()=>({baseFs:this.baseFs,libzip:this.libzip,readOnly:this.readOnlyArchives,stats:await this.baseFs.statPromise(e)});if(this.zipInstances){let n=this.zipInstances.get(e);if(!n){let s=await i();n=this.zipInstances.get(e),n||(n={zipFs:new Ai(e,s),expiresAt:0,refCount:0})}this.zipInstances.delete(e),this.limitOpenFiles(this.maxOpenFiles-1),this.zipInstances.set(e,n),n.expiresAt=Date.now()+this.maxAge,n.refCount+=1;try{return await r(n.zipFs)}finally{n.refCount-=1}}else{let n=new Ai(e,await i());try{return await r(n)}finally{n.saveAndClose()}}}getZipSync(e,r){let i=()=>({baseFs:this.baseFs,libzip:this.libzip,readOnly:this.readOnlyArchives,stats:this.baseFs.statSync(e)});if(this.zipInstances){let n=this.zipInstances.get(e);return n||(n={zipFs:new Ai(e,i()),expiresAt:0,refCount:0}),this.zipInstances.delete(e),this.limitOpenFiles(this.maxOpenFiles-1),this.zipInstances.set(e,n),n.expiresAt=Date.now()+this.maxAge,r(n.zipFs)}else{let n=new Ai(e,i());try{return r(n)}finally{n.saveAndClose()}}}};var Wu=ge(require("util"));var VE=ge(require("url"));var vQ=class extends bi{constructor(e){super(H);this.baseFs=e}mapFromBase(e){return e}mapToBase(e){return e instanceof VE.URL?(0,VE.fileURLToPath)(e):e}};var xfe=new Set(["accessSync","appendFileSync","createReadStream","createWriteStream","chmodSync","chownSync","closeSync","copyFileSync","linkSync","lstatSync","fstatSync","lutimesSync","mkdirSync","openSync","opendirSync","readlinkSync","readFileSync","readdirSync","readlinkSync","realpathSync","renameSync","rmdirSync","statSync","symlinkSync","truncateSync","unlinkSync","unwatchFile","utimesSync","watch","watchFile","writeFileSync","writeSync"]),BM=new Set(["accessPromise","appendFilePromise","chmodPromise","chownPromise","closePromise","copyFilePromise","linkPromise","fstatPromise","lstatPromise","lutimesPromise","mkdirPromise","openPromise","opendirPromise","readdirPromise","realpathPromise","readFilePromise","readdirPromise","readlinkPromise","renamePromise","rmdirPromise","statPromise","symlinkPromise","truncatePromise","unlinkPromise","utimesPromise","writeFilePromise","writeSync"]),Pfe=new Set(["appendFilePromise","chmodPromise","chownPromise","closePromise","readPromise","readFilePromise","statPromise","truncatePromise","utimesPromise","writePromise","writeFilePromise"]);function SQ(t,e){e=new vQ(e);let r=(i,n,s)=>{let o=i[n];i[n]=s,typeof(o==null?void 0:o[Wu.promisify.custom])!="undefined"&&(s[Wu.promisify.custom]=o[Wu.promisify.custom])};{r(t,"exists",(i,...n)=>{let o=typeof n[n.length-1]=="function"?n.pop():()=>{};process.nextTick(()=>{e.existsPromise(i).then(a=>{o(a)},()=>{o(!1)})})}),r(t,"read",(...i)=>{let[n,s,o,a,l,c]=i;if(i.length<=3){let u={};i.length<3?c=i[1]:(u=i[1],c=i[2]),{buffer:s=Buffer.alloc(16384),offset:o=0,length:a=s.byteLength,position:l}=u}if(o==null&&(o=0),a|=0,a===0){process.nextTick(()=>{c(null,0,s)});return}l==null&&(l=-1),process.nextTick(()=>{e.readPromise(n,s,o,a,l).then(u=>{c(null,u,s)},u=>{c(u,0,s)})})});for(let i of BM){let n=i.replace(/Promise$/,"");if(typeof t[n]=="undefined")continue;let s=e[i];if(typeof s=="undefined")continue;r(t,n,(...a)=>{let c=typeof a[a.length-1]=="function"?a.pop():()=>{};process.nextTick(()=>{s.apply(e,a).then(u=>{c(null,u)},u=>{c(u)})})})}t.realpath.native=t.realpath}{r(t,"existsSync",i=>{try{return e.existsSync(i)}catch(n){return!1}}),r(t,"readSync",(...i)=>{let[n,s,o,a,l]=i;return i.length<=3&&({offset:o=0,length:a=s.byteLength,position:l}=i[2]||{}),o==null&&(o=0),a|=0,a===0?0:(l==null&&(l=-1),e.readSync(n,s,o,a,l))});for(let i of xfe){let n=i;if(typeof t[n]=="undefined")continue;let s=e[i];typeof s!="undefined"&&r(t,n,s.bind(e))}t.realpathSync.native=t.realpathSync}{let i=process.emitWarning;process.emitWarning=()=>{};let n;try{n=t.promises}finally{process.emitWarning=i}if(typeof n!="undefined"){for(let o of BM){let a=o.replace(/Promise$/,"");if(typeof n[a]=="undefined")continue;let l=e[o];typeof l!="undefined"&&o!=="open"&&r(n,a,l.bind(e))}class s{constructor(a){this.fd=a}}for(let o of Pfe){let a=o.replace(/Promise$/,""),l=e[o];typeof l!="undefined"&&r(s.prototype,a,function(...c){return l.call(e,this.fd,...c)})}r(n,"open",async(...o)=>{let a=await e.openPromise(...o);return new s(a)})}}t.read[Wu.promisify.custom]=async(i,n,...s)=>({bytesRead:await e.readPromise(i,n,...s),buffer:n}),t.write[Wu.promisify.custom]=async(i,n,...s)=>({bytesWritten:await e.writePromise(i,n,...s),buffer:n})}function XE(t,e){let r=Object.create(t);return SQ(r,e),r}var bM=ge(require("os"));function QM(t){let e=Math.ceil(Math.random()*4294967296).toString(16).padStart(8,"0");return`${t}${e}`}var io=new Set,kQ=null;function vM(){if(kQ)return kQ;let t=H.toPortablePath(bM.default.tmpdir()),e=K.realpathSync(t);return process.once("exit",()=>{K.rmtempSync()}),kQ={tmpdir:t,realTmpdir:e}}var K=Object.assign(new ar,{detachTemp(t){io.delete(t)},mktempSync(t){let{tmpdir:e,realTmpdir:r}=vM();for(;;){let i=QM("xfs-");try{this.mkdirSync(x.join(e,i))}catch(s){if(s.code==="EEXIST")continue;throw s}let n=x.join(r,i);if(io.add(n),typeof t=="undefined")return n;try{return t(n)}finally{if(io.has(n)){io.delete(n);try{this.removeSync(n)}catch{}}}}},async mktempPromise(t){let{tmpdir:e,realTmpdir:r}=vM();for(;;){let i=QM("xfs-");try{await this.mkdirPromise(x.join(e,i))}catch(s){if(s.code==="EEXIST")continue;throw s}let n=x.join(r,i);if(io.add(n),typeof t=="undefined")return n;try{return await t(n)}finally{if(io.has(n)){io.delete(n);try{await this.removePromise(n)}catch{}}}}},async rmtempPromise(){await Promise.all(Array.from(io.values()).map(async t=>{try{await K.removePromise(t,{maxRetries:0}),io.delete(t)}catch{}}))},rmtempSync(){for(let t of io)try{K.removeSync(t),io.delete(t)}catch{}}});var Px=ge(MQ());var ap={};ft(ap,{parseResolution:()=>iI,parseShell:()=>$E,parseSyml:()=>Qi,stringifyArgument:()=>GQ,stringifyArgumentSegment:()=>jQ,stringifyArithmeticExpression:()=>rI,stringifyCommand:()=>HQ,stringifyCommandChain:()=>Xu,stringifyCommandChainThen:()=>UQ,stringifyCommandLine:()=>eI,stringifyCommandLineThen:()=>KQ,stringifyEnvSegment:()=>tI,stringifyRedirectArgument:()=>ep,stringifyResolution:()=>nI,stringifyShell:()=>Vu,stringifyShellLine:()=>Vu,stringifySyml:()=>La,stringifyValueArgument:()=>oc});var dK=ge(pK());function $E(t,e={isGlobPattern:()=>!1}){try{return(0,dK.parse)(t,e)}catch(r){throw r.location&&(r.message=r.message.replace(/(\.)?$/,` (line ${r.location.start.line}, column ${r.location.start.column})$1`)),r}}function Vu(t,{endSemicolon:e=!1}={}){return t.map(({command:r,type:i},n)=>`${eI(r)}${i===";"?n!==t.length-1||e?";":"":" &"}`).join(" ")}function eI(t){return`${Xu(t.chain)}${t.then?` ${KQ(t.then)}`:""}`}function KQ(t){return`${t.type} ${eI(t.line)}`}function Xu(t){return`${HQ(t)}${t.then?` ${UQ(t.then)}`:""}`}function UQ(t){return`${t.type} ${Xu(t.chain)}`}function HQ(t){switch(t.type){case"command":return`${t.envs.length>0?`${t.envs.map(e=>tI(e)).join(" ")} `:""}${t.args.map(e=>GQ(e)).join(" ")}`;case"subshell":return`(${Vu(t.subshell)})${t.args.length>0?` ${t.args.map(e=>ep(e)).join(" ")}`:""}`;case"group":return`{ ${Vu(t.group,{endSemicolon:!0})} }${t.args.length>0?` ${t.args.map(e=>ep(e)).join(" ")}`:""}`;case"envs":return t.envs.map(e=>tI(e)).join(" ");default:throw new Error(`Unsupported command type: "${t.type}"`)}}function tI(t){return`${t.name}=${t.args[0]?oc(t.args[0]):""}`}function GQ(t){switch(t.type){case"redirection":return ep(t);case"argument":return oc(t);default:throw new Error(`Unsupported argument type: "${t.type}"`)}}function ep(t){return`${t.subtype} ${t.args.map(e=>oc(e)).join(" ")}`}function oc(t){return t.segments.map(e=>jQ(e)).join("")}function jQ(t){let e=(i,n)=>n?`"${i}"`:i,r=i=>i===""?'""':i.match(/[(){}<>$|&; \t"']/)?`$'${i.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\f/g,"\\f").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t").replace(/\v/g,"\\v").replace(/\0/g,"\\0")}'`:i;switch(t.type){case"text":return r(t.text);case"glob":return t.pattern;case"shell":return e(`\${${Vu(t.shell)}}`,t.quoted);case"variable":return e(typeof t.defaultValue=="undefined"?typeof t.alternativeValue=="undefined"?`\${${t.name}}`:t.alternativeValue.length===0?`\${${t.name}:+}`:`\${${t.name}:+${t.alternativeValue.map(i=>oc(i)).join(" ")}}`:t.defaultValue.length===0?`\${${t.name}:-}`:`\${${t.name}:-${t.defaultValue.map(i=>oc(i)).join(" ")}}`,t.quoted);case"arithmetic":return`$(( ${rI(t.arithmetic)} ))`;default:throw new Error(`Unsupported argument segment type: "${t.type}"`)}}function rI(t){let e=n=>{switch(n){case"addition":return"+";case"subtraction":return"-";case"multiplication":return"*";case"division":return"/";default:throw new Error(`Can't extract operator from arithmetic expression of type "${n}"`)}},r=(n,s)=>s?`( ${n} )`:n,i=n=>r(rI(n),!["number","variable"].includes(n.type));switch(t.type){case"number":return String(t.value);case"variable":return t.name;default:return`${i(t.left)} ${e(t.type)} ${i(t.right)}`}}var EK=ge(mK());function iI(t){let e=t.match(/^\*{1,2}\/(.*)/);if(e)throw new Error(`The override for '${t}' includes a glob pattern. Glob patterns have been removed since their behaviours don't match what you'd expect. Set the override to '${e[1]}' instead.`);try{return(0,EK.parse)(t)}catch(r){throw r.location&&(r.message=r.message.replace(/(\.)?$/,` (line ${r.location.start.line}, column ${r.location.start.column})$1`)),r}}function nI(t){let e="";return t.from&&(e+=t.from.fullName,t.from.description&&(e+=`@${t.from.description}`),e+="/"),e+=t.descriptor.fullName,t.descriptor.description&&(e+=`@${t.descriptor.description}`),e}var pI=ge(lU()),gU=ge(uU()),Kde=/^(?![-?:,\][{}#&*!|>'"%@` \t\r\n]).([ \t]*(?![,\][{}:# \t\r\n]).)*$/,fU=["__metadata","version","resolution","dependencies","peerDependencies","dependenciesMeta","peerDependenciesMeta","binaries"],rv=class{constructor(e){this.data=e}};function hU(t){return t.match(Kde)?t:JSON.stringify(t)}function pU(t){return typeof t=="undefined"?!0:typeof t=="object"&&t!==null?Object.keys(t).every(e=>pU(t[e])):!1}function iv(t,e,r){if(t===null)return`null -`;if(typeof t=="number"||typeof t=="boolean")return`${t.toString()} -`;if(typeof t=="string")return`${hU(t)} -`;if(Array.isArray(t)){if(t.length===0)return`[] -`;let i=" ".repeat(e);return` -${t.map(s=>`${i}- ${iv(s,e+1,!1)}`).join("")}`}if(typeof t=="object"&&t){let i,n;t instanceof rv?(i=t.data,n=!1):(i=t,n=!0);let s=" ".repeat(e),o=Object.keys(i);n&&o.sort((l,c)=>{let u=fU.indexOf(l),g=fU.indexOf(c);return u===-1&&g===-1?lc?1:0:u!==-1&&g===-1?-1:u===-1&&g!==-1?1:u-g});let a=o.filter(l=>!pU(i[l])).map((l,c)=>{let u=i[l],g=hU(l),f=iv(u,e+1,!0),h=c>0||r?s:"",p=g.length>1024?`? ${g} -${h}:`:`${g}:`,m=f.startsWith(` -`)?f:` ${f}`;return`${h}${p}${m}`}).join(e===0?` -`:"")||` -`;return r?` -${a}`:`${a}`}throw new Error(`Unsupported value type (${t})`)}function La(t){try{let e=iv(t,0,!1);return e!==` -`?e:""}catch(e){throw e.location&&(e.message=e.message.replace(/(\.)?$/,` (line ${e.location.start.line}, column ${e.location.start.column})$1`)),e}}La.PreserveOrdering=rv;function Ude(t){return t.endsWith(` -`)||(t+=` -`),(0,gU.parse)(t)}var Hde=/^(#.*(\r?\n))*?#\s+yarn\s+lockfile\s+v1\r?\n/i;function Gde(t){if(Hde.test(t))return Ude(t);let e=(0,pI.safeLoad)(t,{schema:pI.FAILSAFE_SCHEMA,json:!0});if(e==null)return{};if(typeof e!="object")throw new Error(`Expected an indexed object, got a ${typeof e} instead. Does your file follow Yaml's rules?`);if(Array.isArray(e))throw new Error("Expected an indexed object, got an array instead. Does your file follow Yaml's rules?");return e}function Qi(t){return Gde(t)}var i4=ge(CU()),ww=ge(pc());var mp={};ft(mp,{Builtins:()=>mv,Cli:()=>ys,Command:()=>Re,Option:()=>W,UsageError:()=>Pe,formatMarkdownish:()=>Ui});var dc=0,Ap=1,tn=2,sv="",vi="\0",og=-1,ov=/^(-h|--help)(?:=([0-9]+))?$/,dI=/^(--[a-z]+(?:-[a-z]+)*|-[a-zA-Z]+)$/,wU=/^-[a-zA-Z]{2,}$/,av=/^([^=]+)=([\s\S]*)$/,Av=process.env.DEBUG_CLI==="1";var Pe=class extends Error{constructor(e){super(e);this.clipanion={type:"usage"},this.name="UsageError"}},lp=class extends Error{constructor(e,r){super();if(this.input=e,this.candidates=r,this.clipanion={type:"none"},this.name="UnknownSyntaxError",this.candidates.length===0)this.message="Command not found, but we're not sure what's the alternative.";else if(this.candidates.every(i=>i.reason!==null&&i.reason===r[0].reason)){let[{reason:i}]=this.candidates;this.message=`${i} - -${this.candidates.map(({usage:n})=>`$ ${n}`).join(` -`)}`}else if(this.candidates.length===1){let[{usage:i}]=this.candidates;this.message=`Command not found; did you mean: - -$ ${i} -${lv(e)}`}else this.message=`Command not found; did you mean one of: - -${this.candidates.map(({usage:i},n)=>`${`${n}.`.padStart(4)} ${i}`).join(` -`)} - -${lv(e)}`}},cv=class extends Error{constructor(e,r){super();this.input=e,this.usages=r,this.clipanion={type:"none"},this.name="AmbiguousSyntaxError",this.message=`Cannot find which to pick amongst the following alternatives: - -${this.usages.map((i,n)=>`${`${n}.`.padStart(4)} ${i}`).join(` -`)} - -${lv(e)}`}},lv=t=>`While running ${t.filter(e=>e!==vi).map(e=>{let r=JSON.stringify(e);return e.match(/\s/)||e.length===0||r!==`"${e}"`?r:e}).join(" ")}`;var cp=Symbol("clipanion/isOption");function rn(t){return ie(N({},t),{[cp]:!0})}function No(t,e){return typeof t=="undefined"?[t,e]:typeof t=="object"&&t!==null&&!Array.isArray(t)?[void 0,t]:[t,e]}function CI(t,e=!1){let r=t.replace(/^\.: /,"");return e&&(r=r[0].toLowerCase()+r.slice(1)),r}function up(t,e){return e.length===1?new Pe(`${t}: ${CI(e[0],!0)}`):new Pe(`${t}: -${e.map(r=>` -- ${CI(r)}`).join("")}`)}function gp(t,e,r){if(typeof r=="undefined")return e;let i=[],n=[],s=a=>{let l=e;return e=a,s.bind(null,l)};if(!r(e,{errors:i,coercions:n,coercion:s}))throw up(`Invalid value for ${t}`,i);for(let[,a]of n)a();return e}var Re=class{constructor(){this.help=!1}static Usage(e){return e}async catch(e){throw e}async validateAndExecute(){let r=this.constructor.schema;if(Array.isArray(r)){let{isDict:n,isUnknown:s,applyCascade:o}=await Promise.resolve().then(()=>(Is(),ag)),a=o(n(s()),r),l=[],c=[];if(!a(this,{errors:l,coercions:c}))throw up("Invalid option schema",l);for(let[,g]of c)g()}else if(r!=null)throw new Error("Invalid command schema");let i=await this.execute();return typeof i!="undefined"?i:0}};Re.isOption=cp;Re.Default=[];var RU=80,fv=Array(RU).fill("\u2501");for(let t=0;t<=24;++t)fv[fv.length-t]=`[38;5;${232+t}m\u2501`;var hv={header:t=>`\u2501\u2501\u2501 ${t}${t.length`${t}`,error:t=>`${t}`,code:t=>`${t}`},FU={header:t=>t,bold:t=>t,error:t=>t,code:t=>t};function bCe(t){let e=t.split(` -`),r=e.filter(n=>n.match(/\S/)),i=r.length>0?r.reduce((n,s)=>Math.min(n,s.length-s.trimStart().length),Number.MAX_VALUE):0;return e.map(n=>n.slice(i).trimRight()).join(` -`)}function Ui(t,{format:e,paragraphs:r}){return t=t.replace(/\r\n?/g,` -`),t=bCe(t),t=t.replace(/^\n+|\n+$/g,""),t=t.replace(/^(\s*)-([^\n]*?)\n+/gm,`$1-$2 - -`),t=t.replace(/\n(\n)?\n*/g,"$1"),r&&(t=t.split(/\n/).map(i=>{let n=i.match(/^\s*[*-][\t ]+(.*)/);if(!n)return i.match(/(.{1,80})(?: |$)/g).join(` -`);let s=i.length-i.trimStart().length;return n[1].match(new RegExp(`(.{1,${78-s}})(?: |$)`,"g")).map((o,a)=>" ".repeat(s)+(a===0?"- ":" ")+o).join(` -`)}).join(` - -`)),t=t.replace(/(`+)((?:.|[\n])*?)\1/g,(i,n,s)=>e.code(n+s+n)),t=t.replace(/(\*\*)((?:.|[\n])*?)\1/g,(i,n,s)=>e.bold(n+s+n)),t?`${t} -`:""}var Cv=ge(require("tty"));function wn(t){Av&&console.log(t)}var NU={candidateUsage:null,requiredOptions:[],errorMessage:null,ignoreOptions:!1,path:[],positionals:[],options:[],remainder:null,selectedIndex:og};function LU(){return{nodes:[sn(),sn(),sn()]}}function vCe(t){let e=LU(),r=[],i=e.nodes.length;for(let n of t){r.push(i);for(let s=0;s{if(e.has(i))return;e.add(i);let n=t.nodes[i];for(let o of Object.values(n.statics))for(let{to:a}of o)r(a);for(let[,{to:o}]of n.dynamics)r(o);for(let{to:o}of n.shortcuts)r(o);let s=new Set(n.shortcuts.map(({to:o})=>o));for(;n.shortcuts.length>0;){let{to:o}=n.shortcuts.shift(),a=t.nodes[o];for(let[l,c]of Object.entries(a.statics)){let u=Object.prototype.hasOwnProperty.call(n.statics,l)?n.statics[l]:n.statics[l]=[];for(let g of c)u.some(({to:f})=>g.to===f)||u.push(g)}for(let[l,c]of a.dynamics)n.dynamics.some(([u,{to:g}])=>l===u&&c.to===g)||n.dynamics.push([l,c]);for(let l of a.shortcuts)s.has(l.to)||(n.shortcuts.push(l),s.add(l.to))}};r(dc)}function kCe(t,{prefix:e=""}={}){if(Av){wn(`${e}Nodes are:`);for(let r=0;rl!==tn).map(({state:l})=>({usage:l.candidateUsage,reason:null})));if(a.every(({node:l})=>l===tn))throw new lp(e,a.map(({state:l})=>({usage:l.candidateUsage,reason:l.errorMessage})));i=xCe(a)}if(i.length>0){wn(" Results:");for(let s of i)wn(` - ${s.node} -> ${JSON.stringify(s.state)}`)}else wn(" No results");return i}function PCe(t,e){if(e.selectedIndex!==null)return!0;if(Object.prototype.hasOwnProperty.call(t.statics,vi)){for(let{to:r}of t.statics[vi])if(r===Ap)return!0}return!1}function RCe(t,e,r){let i=r&&e.length>0?[""]:[],n=OU(t,e,r),s=[],o=new Set,a=(l,c,u=!0)=>{let g=[c];for(;g.length>0;){let h=g;g=[];for(let p of h){let m=t.nodes[p],y=Object.keys(m.statics);for(let b of Object.keys(m.statics)){let S=y[0];for(let{to:k,reducer:T}of m.statics[S])T==="pushPath"&&(u||l.push(S),g.push(k))}}u=!1}let f=JSON.stringify(l);o.has(f)||(s.push(l),o.add(f))};for(let{node:l,state:c}of n){if(c.remainder!==null){a([c.remainder],l);continue}let u=t.nodes[l],g=PCe(u,c);for(let[f,h]of Object.entries(u.statics))(g&&f!==vi||!f.startsWith("-")&&h.some(({reducer:p})=>p==="pushPath"))&&a([...i,f],l);if(!!g)for(let[f,{to:h}]of u.dynamics){if(h===tn)continue;let p=DCe(f,c);if(p!==null)for(let m of p)a([...i,m],l)}}return[...s].sort()}function NCe(t,e){let r=OU(t,[...e,vi]);return FCe(e,r.map(({state:i})=>i))}function xCe(t){let e=0;for(let{state:r}of t)r.path.length>e&&(e=r.path.length);return t.filter(({state:r})=>r.path.length===e)}function FCe(t,e){let r=e.filter(g=>g.selectedIndex!==null);if(r.length===0)throw new Error;let i=r.filter(g=>g.requiredOptions.every(f=>f.some(h=>g.options.find(p=>p.name===h))));if(i.length===0)throw new lp(t,r.map(g=>({usage:g.candidateUsage,reason:null})));let n=0;for(let g of i)g.path.length>n&&(n=g.path.length);let s=i.filter(g=>g.path.length===n),o=g=>g.positionals.filter(({extra:f})=>!f).length+g.options.length,a=s.map(g=>({state:g,positionalCount:o(g)})),l=0;for(let{positionalCount:g}of a)g>l&&(l=g);let c=a.filter(({positionalCount:g})=>g===l).map(({state:g})=>g),u=LCe(c);if(u.length>1)throw new cv(t,u.map(g=>g.candidateUsage));return u[0]}function LCe(t){let e=[],r=[];for(let i of t)i.selectedIndex===og?r.push(i):e.push(i);return r.length>0&&e.push(ie(N({},NU),{path:MU(...r.map(i=>i.path)),options:r.reduce((i,n)=>i.concat(n.options),[])})),e}function MU(t,e,...r){return e===void 0?Array.from(t):MU(t.filter((i,n)=>i===e[n]),...r)}function sn(){return{dynamics:[],shortcuts:[],statics:{}}}function TU(t){return t===Ap||t===tn}function dv(t,e=0){return{to:TU(t.to)?t.to:t.to>2?t.to+e-2:t.to+e,reducer:t.reducer}}function QCe(t,e=0){let r=sn();for(let[i,n]of t.dynamics)r.dynamics.push([i,dv(n,e)]);for(let i of t.shortcuts)r.shortcuts.push(dv(i,e));for(let[i,n]of Object.entries(t.statics))r.statics[i]=n.map(s=>dv(s,e));return r}function Si(t,e,r,i,n){t.nodes[e].dynamics.push([r,{to:i,reducer:n}])}function Ag(t,e,r,i){t.nodes[e].shortcuts.push({to:r,reducer:i})}function Ta(t,e,r,i,n){(Object.prototype.hasOwnProperty.call(t.nodes[e].statics,r)?t.nodes[e].statics[r]:t.nodes[e].statics[r]=[]).push({to:i,reducer:n})}function EI(t,e,r,i){if(Array.isArray(e)){let[n,...s]=e;return t[n](r,i,...s)}else return t[e](r,i)}function DCe(t,e){let r=Array.isArray(t)?II[t[0]]:II[t];if(typeof r.suggest=="undefined")return null;let i=Array.isArray(t)?t.slice(1):[];return r.suggest(e,...i)}var II={always:()=>!0,isOptionLike:(t,e)=>!t.ignoreOptions&&e!=="-"&&e.startsWith("-"),isNotOptionLike:(t,e)=>t.ignoreOptions||e==="-"||!e.startsWith("-"),isOption:(t,e,r,i)=>!t.ignoreOptions&&e===r,isBatchOption:(t,e,r)=>!t.ignoreOptions&&wU.test(e)&&[...e.slice(1)].every(i=>r.includes(`-${i}`)),isBoundOption:(t,e,r,i)=>{let n=e.match(av);return!t.ignoreOptions&&!!n&&dI.test(n[1])&&r.includes(n[1])&&i.filter(s=>s.names.includes(n[1])).every(s=>s.allowBinding)},isNegatedOption:(t,e,r)=>!t.ignoreOptions&&e===`--no-${r.slice(2)}`,isHelp:(t,e)=>!t.ignoreOptions&&ov.test(e),isUnsupportedOption:(t,e,r)=>!t.ignoreOptions&&e.startsWith("-")&&dI.test(e)&&!r.includes(e),isInvalidOption:(t,e)=>!t.ignoreOptions&&e.startsWith("-")&&!dI.test(e)};II.isOption.suggest=(t,e,r=!0)=>r?null:[e];var pv={setCandidateState:(t,e,r)=>N(N({},t),r),setSelectedIndex:(t,e,r)=>ie(N({},t),{selectedIndex:r}),pushBatch:(t,e)=>ie(N({},t),{options:t.options.concat([...e.slice(1)].map(r=>({name:`-${r}`,value:!0})))}),pushBound:(t,e)=>{let[,r,i]=e.match(av);return ie(N({},t),{options:t.options.concat({name:r,value:i})})},pushPath:(t,e)=>ie(N({},t),{path:t.path.concat(e)}),pushPositional:(t,e)=>ie(N({},t),{positionals:t.positionals.concat({value:e,extra:!1})}),pushExtra:(t,e)=>ie(N({},t),{positionals:t.positionals.concat({value:e,extra:!0})}),pushExtraNoLimits:(t,e)=>ie(N({},t),{positionals:t.positionals.concat({value:e,extra:Xn})}),pushTrue:(t,e,r=e)=>ie(N({},t),{options:t.options.concat({name:e,value:!0})}),pushFalse:(t,e,r=e)=>ie(N({},t),{options:t.options.concat({name:r,value:!1})}),pushUndefined:(t,e)=>ie(N({},t),{options:t.options.concat({name:e,value:void 0})}),pushStringValue:(t,e)=>{var r;let i=ie(N({},t),{options:[...t.options]}),n=t.options[t.options.length-1];return n.value=((r=n.value)!==null&&r!==void 0?r:[]).concat([e]),i},setStringValue:(t,e)=>{let r=ie(N({},t),{options:[...t.options]}),i=t.options[t.options.length-1];return i.value=e,r},inhibateOptions:t=>ie(N({},t),{ignoreOptions:!0}),useHelp:(t,e,r)=>{let[,,i]=e.match(ov);return typeof i!="undefined"?ie(N({},t),{options:[{name:"-c",value:String(r)},{name:"-i",value:i}]}):ie(N({},t),{options:[{name:"-c",value:String(r)}]})},setError:(t,e,r)=>e===vi?ie(N({},t),{errorMessage:`${r}.`}):ie(N({},t),{errorMessage:`${r} ("${e}").`}),setOptionArityError:(t,e)=>{let r=t.options[t.options.length-1];return ie(N({},t),{errorMessage:`Not enough arguments to option ${r.name}.`})}},Xn=Symbol(),KU=class{constructor(e,r){this.allOptionNames=[],this.arity={leading:[],trailing:[],extra:[],proxy:!1},this.options=[],this.paths=[],this.cliIndex=e,this.cliOpts=r}addPath(e){this.paths.push(e)}setArity({leading:e=this.arity.leading,trailing:r=this.arity.trailing,extra:i=this.arity.extra,proxy:n=this.arity.proxy}){Object.assign(this.arity,{leading:e,trailing:r,extra:i,proxy:n})}addPositional({name:e="arg",required:r=!0}={}){if(!r&&this.arity.extra===Xn)throw new Error("Optional parameters cannot be declared when using .rest() or .proxy()");if(!r&&this.arity.trailing.length>0)throw new Error("Optional parameters cannot be declared after the required trailing positional arguments");!r&&this.arity.extra!==Xn?this.arity.extra.push(e):this.arity.extra!==Xn&&this.arity.extra.length===0?this.arity.leading.push(e):this.arity.trailing.push(e)}addRest({name:e="arg",required:r=0}={}){if(this.arity.extra===Xn)throw new Error("Infinite lists cannot be declared multiple times in the same command");if(this.arity.trailing.length>0)throw new Error("Infinite lists cannot be declared after the required trailing positional arguments");for(let i=0;i1)throw new Error("The arity cannot be higher than 1 when the option only supports the --arg=value syntax");if(!Number.isInteger(i))throw new Error(`The arity must be an integer, got ${i}`);if(i<0)throw new Error(`The arity must be positive, got ${i}`);this.allOptionNames.push(...e),this.options.push({names:e,description:r,arity:i,hidden:n,required:s,allowBinding:o})}setContext(e){this.context=e}usage({detailed:e=!0,inlineOptions:r=!0}={}){let i=[this.cliOpts.binaryName],n=[];if(this.paths.length>0&&i.push(...this.paths[0]),e){for(let{names:o,arity:a,hidden:l,description:c,required:u}of this.options){if(l)continue;let g=[];for(let h=0;h`:`[${f}]`)}i.push(...this.arity.leading.map(o=>`<${o}>`)),this.arity.extra===Xn?i.push("..."):i.push(...this.arity.extra.map(o=>`[${o}]`)),i.push(...this.arity.trailing.map(o=>`<${o}>`))}return{usage:i.join(" "),options:n}}compile(){if(typeof this.context=="undefined")throw new Error("Assertion failed: No context attached");let e=LU(),r=dc,i=this.usage().usage,n=this.options.filter(a=>a.required).map(a=>a.names);r=no(e,sn()),Ta(e,dc,sv,r,["setCandidateState",{candidateUsage:i,requiredOptions:n}]);let s=this.arity.proxy?"always":"isNotOptionLike",o=this.paths.length>0?this.paths:[[]];for(let a of o){let l=r;if(a.length>0){let f=no(e,sn());Ag(e,l,f),this.registerOptions(e,f),l=f}for(let f=0;f0||!this.arity.proxy){let f=no(e,sn());Si(e,l,"isHelp",f,["useHelp",this.cliIndex]),Ta(e,f,vi,Ap,["setSelectedIndex",og]),this.registerOptions(e,l)}this.arity.leading.length>0&&Ta(e,l,vi,tn,["setError","Not enough positional arguments"]);let c=l;for(let f=0;f0||f+1!==this.arity.leading.length)&&Ta(e,h,vi,tn,["setError","Not enough positional arguments"]),Si(e,c,"isNotOptionLike",h,"pushPositional"),c=h}let u=c;if(this.arity.extra===Xn||this.arity.extra.length>0){let f=no(e,sn());if(Ag(e,c,f),this.arity.extra===Xn){let h=no(e,sn());this.arity.proxy||this.registerOptions(e,h),Si(e,c,s,h,"pushExtraNoLimits"),Si(e,h,s,h,"pushExtraNoLimits"),Ag(e,h,f)}else for(let h=0;h0&&Ta(e,u,vi,tn,["setError","Not enough positional arguments"]);let g=u;for(let f=0;fo.length>s.length?o:s,"");if(i.arity===0)for(let s of i.names)Si(e,r,["isOption",s,i.hidden||s!==n],r,"pushTrue"),s.startsWith("--")&&!s.startsWith("--no-")&&Si(e,r,["isNegatedOption",s],r,["pushFalse",s]);else{let s=no(e,sn());for(let o of i.names)Si(e,r,["isOption",o,i.hidden||o!==n],s,"pushUndefined");for(let o=0;o=0&&eNCe(i,n),suggest:(n,s)=>RCe(i,n,s)}}};var Cp=class extends Re{constructor(e){super();this.contexts=e,this.commands=[]}static from(e,r){let i=new Cp(r);i.path=e.path;for(let n of e.options)switch(n.name){case"-c":i.commands.push(Number(n.value));break;case"-i":i.index=Number(n.value);break}return i}async execute(){let e=this.commands;if(typeof this.index!="undefined"&&this.index>=0&&this.index1){this.context.stdout.write(`Multiple commands match your selection: -`),this.context.stdout.write(` -`);let r=0;for(let i of this.commands)this.context.stdout.write(this.cli.usage(this.contexts[i].commandClass,{prefix:`${r++}. `.padStart(5)}));this.context.stdout.write(` -`),this.context.stdout.write(`Run again with -h= to see the longer details of any of those commands. -`)}}};var UU=Symbol("clipanion/errorCommand");function TCe(){return process.env.FORCE_COLOR==="0"?1:process.env.FORCE_COLOR==="1"||typeof process.stdout!="undefined"&&process.stdout.isTTY?8:1}var ys=class{constructor({binaryLabel:e,binaryName:r="...",binaryVersion:i,enableCapture:n=!1,enableColors:s}={}){this.registrations=new Map,this.builder=new dp({binaryName:r}),this.binaryLabel=e,this.binaryName=r,this.binaryVersion=i,this.enableCapture=n,this.enableColors=s}static from(e,r={}){let i=new ys(r);for(let n of e)i.register(n);return i}register(e){var r;let i=new Map,n=new e;for(let l in n){let c=n[l];typeof c=="object"&&c!==null&&c[Re.isOption]&&i.set(l,c)}let s=this.builder.command(),o=s.cliIndex,a=(r=e.paths)!==null&&r!==void 0?r:n.paths;if(typeof a!="undefined")for(let l of a)s.addPath(l);this.registrations.set(e,{specs:i,builder:s,index:o});for(let[l,{definition:c}]of i.entries())c(s,l);s.setContext({commandClass:e})}process(e){let{contexts:r,process:i}=this.builder.compile(),n=i(e);switch(n.selectedIndex){case og:return Cp.from(n,r);default:{let{commandClass:s}=r[n.selectedIndex],o=this.registrations.get(s);if(typeof o=="undefined")throw new Error("Assertion failed: Expected the command class to have been registered.");let a=new s;a.path=n.path;try{for(let[l,{transformer:c}]of o.specs.entries())a[l]=c(o.builder,l,n);return a}catch(l){throw l[UU]=a,l}}break}}async run(e,r){var i;let n,s=N(N({},ys.defaultContext),r),o=(i=this.enableColors)!==null&&i!==void 0?i:s.colorDepth>1;if(!Array.isArray(e))n=e;else try{n=this.process(e)}catch(c){return s.stdout.write(this.error(c,{colored:o})),1}if(n.help)return s.stdout.write(this.usage(n,{colored:o,detailed:!0})),0;n.context=s,n.cli={binaryLabel:this.binaryLabel,binaryName:this.binaryName,binaryVersion:this.binaryVersion,enableCapture:this.enableCapture,enableColors:this.enableColors,definitions:()=>this.definitions(),error:(c,u)=>this.error(c,u),format:c=>this.format(c),process:c=>this.process(c),run:(c,u)=>this.run(c,N(N({},s),u)),usage:(c,u)=>this.usage(c,u)};let a=this.enableCapture?OCe(s):HU,l;try{l=await a(()=>n.validateAndExecute().catch(c=>n.catch(c).then(()=>0)))}catch(c){return s.stdout.write(this.error(c,{colored:o,command:n})),1}return l}async runExit(e,r){process.exitCode=await this.run(e,r)}suggest(e,r){let{suggest:i}=this.builder.compile();return i(e,r)}definitions({colored:e=!1}={}){let r=[];for(let[i,{index:n}]of this.registrations){if(typeof i.usage=="undefined")continue;let{usage:s}=this.getUsageByIndex(n,{detailed:!1}),{usage:o,options:a}=this.getUsageByIndex(n,{detailed:!0,inlineOptions:!1}),l=typeof i.usage.category!="undefined"?Ui(i.usage.category,{format:this.format(e),paragraphs:!1}):void 0,c=typeof i.usage.description!="undefined"?Ui(i.usage.description,{format:this.format(e),paragraphs:!1}):void 0,u=typeof i.usage.details!="undefined"?Ui(i.usage.details,{format:this.format(e),paragraphs:!0}):void 0,g=typeof i.usage.examples!="undefined"?i.usage.examples.map(([f,h])=>[Ui(f,{format:this.format(e),paragraphs:!1}),h.replace(/\$0/g,this.binaryName)]):void 0;r.push({path:s,usage:o,category:l,description:c,details:u,examples:g,options:a})}return r}usage(e=null,{colored:r,detailed:i=!1,prefix:n="$ "}={}){var s;if(e===null){for(let l of this.registrations.keys()){let c=l.paths,u=typeof l.usage!="undefined";if(!c||c.length===0||c.length===1&&c[0].length===0||((s=c==null?void 0:c.some(h=>h.length===0))!==null&&s!==void 0?s:!1))if(e){e=null;break}else e=l;else if(u){e=null;continue}}e&&(i=!0)}let o=e!==null&&e instanceof Re?e.constructor:e,a="";if(o)if(i){let{description:l="",details:c="",examples:u=[]}=o.usage||{};l!==""&&(a+=Ui(l,{format:this.format(r),paragraphs:!1}).replace(/^./,h=>h.toUpperCase()),a+=` -`),(c!==""||u.length>0)&&(a+=`${this.format(r).header("Usage")} -`,a+=` -`);let{usage:g,options:f}=this.getUsageByRegistration(o,{inlineOptions:!1});if(a+=`${this.format(r).bold(n)}${g} -`,f.length>0){a+=` -`,a+=`${hv.header("Options")} -`;let h=f.reduce((p,m)=>Math.max(p,m.definition.length),0);a+=` -`;for(let{definition:p,description:m}of f)a+=` ${this.format(r).bold(p.padEnd(h))} ${Ui(m,{format:this.format(r),paragraphs:!1})}`}if(c!==""&&(a+=` -`,a+=`${this.format(r).header("Details")} -`,a+=` -`,a+=Ui(c,{format:this.format(r),paragraphs:!0})),u.length>0){a+=` -`,a+=`${this.format(r).header("Examples")} -`;for(let[h,p]of u)a+=` -`,a+=Ui(h,{format:this.format(r),paragraphs:!1}),a+=`${p.replace(/^/m,` ${this.format(r).bold(n)}`).replace(/\$0/g,this.binaryName)} -`}}else{let{usage:l}=this.getUsageByRegistration(o);a+=`${this.format(r).bold(n)}${l} -`}else{let l=new Map;for(let[f,{index:h}]of this.registrations.entries()){if(typeof f.usage=="undefined")continue;let p=typeof f.usage.category!="undefined"?Ui(f.usage.category,{format:this.format(r),paragraphs:!1}):null,m=l.get(p);typeof m=="undefined"&&l.set(p,m=[]);let{usage:y}=this.getUsageByIndex(h);m.push({commandClass:f,usage:y})}let c=Array.from(l.keys()).sort((f,h)=>f===null?-1:h===null?1:f.localeCompare(h,"en",{usage:"sort",caseFirst:"upper"})),u=typeof this.binaryLabel!="undefined",g=typeof this.binaryVersion!="undefined";u||g?(u&&g?a+=`${this.format(r).header(`${this.binaryLabel} - ${this.binaryVersion}`)} - -`:u?a+=`${this.format(r).header(`${this.binaryLabel}`)} -`:a+=`${this.format(r).header(`${this.binaryVersion}`)} -`,a+=` ${this.format(r).bold(n)}${this.binaryName} -`):a+=`${this.format(r).bold(n)}${this.binaryName} -`;for(let f of c){let h=l.get(f).slice().sort((m,y)=>m.usage.localeCompare(y.usage,"en",{usage:"sort",caseFirst:"upper"})),p=f!==null?f.trim():"General commands";a+=` -`,a+=`${this.format(r).header(`${p}`)} -`;for(let{commandClass:m,usage:y}of h){let b=m.usage.description||"undocumented";a+=` -`,a+=` ${this.format(r).bold(y)} -`,a+=` ${Ui(b,{format:this.format(r),paragraphs:!1})}`}}a+=` -`,a+=Ui("You can also print more details about any of these commands by calling them with the `-h,--help` flag right after the command name.",{format:this.format(r),paragraphs:!0})}return a}error(e,r){var i,{colored:n,command:s=(i=e[UU])!==null&&i!==void 0?i:null}=r===void 0?{}:r;e instanceof Error||(e=new Error(`Execution failed with a non-error rejection (rejected value: ${JSON.stringify(e)})`));let o="",a=e.name.replace(/([a-z])([A-Z])/g,"$1 $2");a==="Error"&&(a="Internal Error"),o+=`${this.format(n).error(a)}: ${e.message} -`;let l=e.clipanion;return typeof l!="undefined"?l.type==="usage"&&(o+=` -`,o+=this.usage(s)):e.stack&&(o+=`${e.stack.replace(/^.*\n/,"")} -`),o}format(e){var r;return((r=e!=null?e:this.enableColors)!==null&&r!==void 0?r:ys.defaultContext.colorDepth>1)?hv:FU}getUsageByRegistration(e,r){let i=this.registrations.get(e);if(typeof i=="undefined")throw new Error("Assertion failed: Unregistered command");return this.getUsageByIndex(i.index,r)}getUsageByIndex(e,r){return this.builder.getBuilderByIndex(e).usage(r)}};ys.defaultContext={stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,colorDepth:"getColorDepth"in Cv.default.WriteStream.prototype?Cv.default.WriteStream.prototype.getColorDepth():TCe()};var GU;function OCe(t){let e=GU;if(typeof e=="undefined"){if(t.stdout===process.stdout&&t.stderr===process.stderr)return HU;let{AsyncLocalStorage:r}=require("async_hooks");e=GU=new r;let i=process.stdout._write;process.stdout._write=function(s,o,a){let l=e.getStore();return typeof l=="undefined"?i.call(this,s,o,a):l.stdout.write(s,o,a)};let n=process.stderr._write;process.stderr._write=function(s,o,a){let l=e.getStore();return typeof l=="undefined"?n.call(this,s,o,a):l.stderr.write(s,o,a)}}return r=>e.run(t,r)}function HU(t){return t()}var mv={};ft(mv,{DefinitionsCommand:()=>yI,HelpCommand:()=>wI,VersionCommand:()=>BI});var yI=class extends Re{async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.definitions(),null,2)} -`)}};yI.paths=[["--clipanion=definitions"]];var wI=class extends Re{async execute(){this.context.stdout.write(this.cli.usage())}};wI.paths=[["-h"],["--help"]];var BI=class extends Re{async execute(){var e;this.context.stdout.write(`${(e=this.cli.binaryVersion)!==null&&e!==void 0?e:""} -`)}};BI.paths=[["-v"],["--version"]];var W={};ft(W,{Array:()=>jU,Boolean:()=>YU,Counter:()=>qU,Proxy:()=>JU,Rest:()=>WU,String:()=>zU,applyValidator:()=>gp,cleanValidationError:()=>CI,formatError:()=>up,isOptionSymbol:()=>cp,makeCommandOption:()=>rn,rerouteArguments:()=>No});function jU(t,e,r){let[i,n]=No(e,r!=null?r:{}),{arity:s=1}=n,o=t.split(","),a=new Set(o);return rn({definition(l){l.addOption({names:o,arity:s,hidden:n==null?void 0:n.hidden,description:n==null?void 0:n.description,required:n.required})},transformer(l,c,u){let g=typeof i!="undefined"?[...i]:void 0;for(let{name:f,value:h}of u.options)!a.has(f)||(g=g!=null?g:[],g.push(h));return g}})}function YU(t,e,r){let[i,n]=No(e,r!=null?r:{}),s=t.split(","),o=new Set(s);return rn({definition(a){a.addOption({names:s,allowBinding:!1,arity:0,hidden:n.hidden,description:n.description,required:n.required})},transformer(a,l,c){let u=i;for(let{name:g,value:f}of c.options)!o.has(g)||(u=f);return u}})}function qU(t,e,r){let[i,n]=No(e,r!=null?r:{}),s=t.split(","),o=new Set(s);return rn({definition(a){a.addOption({names:s,allowBinding:!1,arity:0,hidden:n.hidden,description:n.description,required:n.required})},transformer(a,l,c){let u=i;for(let{name:g,value:f}of c.options)!o.has(g)||(u!=null||(u=0),f?u+=1:u=0);return u}})}function JU(t={}){return rn({definition(e,r){var i;e.addProxy({name:(i=t.name)!==null&&i!==void 0?i:r,required:t.required})},transformer(e,r,i){return i.positionals.map(({value:n})=>n)}})}function WU(t={}){return rn({definition(e,r){var i;e.addRest({name:(i=t.name)!==null&&i!==void 0?i:r,required:t.required})},transformer(e,r,i){let n=o=>{let a=i.positionals[o];return a.extra===Xn||a.extra===!1&&oo)}})}function MCe(t,e,r){let[i,n]=No(e,r!=null?r:{}),{arity:s=1}=n,o=t.split(","),a=new Set(o);return rn({definition(l){l.addOption({names:o,arity:n.tolerateBoolean?0:s,hidden:n.hidden,description:n.description,required:n.required})},transformer(l,c,u){let g,f=i;for(let{name:h,value:p}of u.options)!a.has(h)||(g=h,f=p);return typeof f=="string"?gp(g!=null?g:c,f,n.validator):f}})}function KCe(t={}){let{required:e=!0}=t;return rn({definition(r,i){var n;r.addPositional({name:(n=t.name)!==null&&n!==void 0?n:i,required:t.required})},transformer(r,i,n){var s;for(let o=0;ou8,areIdentsEqual:()=>hd,areLocatorsEqual:()=>pd,areVirtualPackagesEquivalent:()=>cSe,bindDescriptor:()=>ASe,bindLocator:()=>lSe,convertDescriptorToLocator:()=>gw,convertLocatorToDescriptor:()=>ax,convertPackageToLocator:()=>aSe,convertToIdent:()=>oSe,convertToManifestRange:()=>fSe,copyPackage:()=>ud,devirtualizeDescriptor:()=>gd,devirtualizeLocator:()=>fd,getIdentVendorPath:()=>gx,isPackageCompatible:()=>dw,isVirtualDescriptor:()=>nl,isVirtualLocator:()=>Xo,makeDescriptor:()=>rr,makeIdent:()=>Vo,makeLocator:()=>cn,makeRange:()=>hw,parseDescriptor:()=>sl,parseFileStyleRange:()=>uSe,parseIdent:()=>An,parseLocator:()=>Kc,parseRange:()=>Gg,prettyDependent:()=>WS,prettyDescriptor:()=>sr,prettyIdent:()=>gi,prettyLocator:()=>Bt,prettyLocatorNoColors:()=>ux,prettyRange:()=>uw,prettyReference:()=>Cd,prettyResolution:()=>zS,prettyWorkspace:()=>md,renamePackage:()=>cd,slugifyIdent:()=>cx,slugifyLocator:()=>jg,sortDescriptors:()=>Yg,stringifyDescriptor:()=>Pn,stringifyIdent:()=>Ot,stringifyLocator:()=>Ds,tryParseDescriptor:()=>dd,tryParseIdent:()=>g8,tryParseLocator:()=>fw,virtualizeDescriptor:()=>Ax,virtualizePackage:()=>lx});var Hg=ge(require("querystring")),A8=ge(ri()),l8=ge(QY());var Ae={};ft(Ae,{LogLevel:()=>fo,Style:()=>Dc,Type:()=>Ye,addLogFilterSupport:()=>sd,applyColor:()=>is,applyHyperlink:()=>Lg,applyStyle:()=>Ty,json:()=>Rc,jsonOrPretty:()=>G0e,mark:()=>$S,pretty:()=>et,prettyField:()=>Jo,prettyList:()=>ZS,supportsColor:()=>Ny,supportsHyperlinks:()=>VS,tuple:()=>go});var id=ge(BS()),nd=ge(pc());var vJ=ge(rs()),SJ=ge(fJ());var ve={};ft(ve,{AsyncActions:()=>IJ,BufferStream:()=>EJ,CachingStrategy:()=>Pc,DefaultStream:()=>yJ,allSettledSafe:()=>uo,assertNever:()=>GS,bufferStream:()=>Fg,buildIgnorePattern:()=>M0e,convertMapsToIndexableObjects:()=>Fy,dynamicRequire:()=>Ng,escapeRegExp:()=>F0e,getArrayWithDefault:()=>Pg,getFactoryWithDefault:()=>Ja,getMapWithDefault:()=>Dg,getSetWithDefault:()=>xc,isIndexableObject:()=>jS,isPathLike:()=>K0e,isTaggedYarnVersion:()=>R0e,mapAndFilter:()=>qo,mapAndFind:()=>ed,overrideType:()=>HS,parseBoolean:()=>rd,parseOptionalBoolean:()=>QJ,prettifyAsyncErrors:()=>Rg,prettifySyncErrors:()=>YS,releaseAfterUseAsync:()=>L0e,replaceEnvVariables:()=>qS,sortMap:()=>xn,tryParseOptionalBoolean:()=>JS,validateEnum:()=>N0e});var hJ=ge(rs()),pJ=ge(lg()),dJ=ge(ri()),US=ge(require("stream"));function R0e(t){return!!(dJ.default.valid(t)&&t.match(/^[^-]+(-rc\.[0-9]+)?$/))}function F0e(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function HS(t){}function GS(t){throw new Error(`Assertion failed: Unexpected object '${t}'`)}function N0e(t,e){let r=Object.values(t);if(!r.includes(e))throw new Pe(`Invalid value for enumeration: ${JSON.stringify(e)} (expected one of ${r.map(i=>JSON.stringify(i)).join(", ")})`);return e}function qo(t,e){let r=[];for(let i of t){let n=e(i);n!==CJ&&r.push(n)}return r}var CJ=Symbol();qo.skip=CJ;function ed(t,e){for(let r of t){let i=e(r);if(i!==mJ)return i}}var mJ=Symbol();ed.skip=mJ;function jS(t){return typeof t=="object"&&t!==null}async function uo(t){let e=await Promise.allSettled(t),r=[];for(let i of e){if(i.status==="rejected")throw i.reason;r.push(i.value)}return r}function Fy(t){if(t instanceof Map&&(t=Object.fromEntries(t)),jS(t))for(let e of Object.keys(t)){let r=t[e];jS(r)&&(t[e]=Fy(r))}return t}function Ja(t,e,r){let i=t.get(e);return typeof i=="undefined"&&t.set(e,i=r()),i}function Pg(t,e){let r=t.get(e);return typeof r=="undefined"&&t.set(e,r=[]),r}function xc(t,e){let r=t.get(e);return typeof r=="undefined"&&t.set(e,r=new Set),r}function Dg(t,e){let r=t.get(e);return typeof r=="undefined"&&t.set(e,r=new Map),r}async function L0e(t,e){if(e==null)return await t();try{return await t()}finally{await e()}}async function Rg(t,e){try{return await t()}catch(r){throw r.message=e(r.message),r}}function YS(t,e){try{return t()}catch(r){throw r.message=e(r.message),r}}async function Fg(t){return await new Promise((e,r)=>{let i=[];t.on("error",n=>{r(n)}),t.on("data",n=>{i.push(n)}),t.on("end",()=>{e(Buffer.concat(i))})})}var EJ=class extends US.Transform{constructor(){super(...arguments);this.chunks=[]}_transform(e,r,i){if(r!=="buffer"||!Buffer.isBuffer(e))throw new Error("Assertion failed: BufferStream only accept buffers");this.chunks.push(e),i(null,null)}_flush(e){e(null,Buffer.concat(this.chunks))}};function T0e(){let t,e;return{promise:new Promise((i,n)=>{t=i,e=n}),resolve:t,reject:e}}var IJ=class{constructor(e){this.deferred=new Map;this.promises=new Map;this.limit=(0,pJ.default)(e)}set(e,r){let i=this.deferred.get(e);typeof i=="undefined"&&this.deferred.set(e,i=T0e());let n=this.limit(()=>r());return this.promises.set(e,n),n.then(()=>{this.promises.get(e)===n&&i.resolve()},s=>{this.promises.get(e)===n&&i.reject(s)}),i.promise}reduce(e,r){var n;let i=(n=this.promises.get(e))!=null?n:Promise.resolve();this.set(e,()=>r(i))}async wait(){await Promise.all(this.promises.values())}},yJ=class extends US.Transform{constructor(e=Buffer.alloc(0)){super();this.active=!0;this.ifEmpty=e}_transform(e,r,i){if(r!=="buffer"||!Buffer.isBuffer(e))throw new Error("Assertion failed: DefaultStream only accept buffers");this.active=!1,i(null,e)}_flush(e){this.active&&this.ifEmpty.length>0?e(null,this.ifEmpty):e(null)}},td=eval("require");function wJ(t){return td(H.fromPortablePath(t))}function BJ(path){let physicalPath=H.fromPortablePath(path),currentCacheEntry=td.cache[physicalPath];delete td.cache[physicalPath];let result;try{result=wJ(physicalPath);let freshCacheEntry=td.cache[physicalPath],dynamicModule=eval("module"),freshCacheIndex=dynamicModule.children.indexOf(freshCacheEntry);freshCacheIndex!==-1&&dynamicModule.children.splice(freshCacheIndex,1)}finally{td.cache[physicalPath]=currentCacheEntry}return result}var bJ=new Map;function O0e(t){let e=bJ.get(t),r=K.statSync(t);if((e==null?void 0:e.mtime)===r.mtimeMs)return e.instance;let i=BJ(t);return bJ.set(t,{mtime:r.mtimeMs,instance:i}),i}var Pc;(function(i){i[i.NoCache=0]="NoCache",i[i.FsTime=1]="FsTime",i[i.Node=2]="Node"})(Pc||(Pc={}));function Ng(t,{cachingStrategy:e=2}={}){switch(e){case 0:return BJ(t);case 1:return O0e(t);case 2:return wJ(t);default:throw new Error("Unsupported caching strategy")}}function xn(t,e){let r=Array.from(t);Array.isArray(e)||(e=[e]);let i=[];for(let s of e)i.push(r.map(o=>s(o)));let n=r.map((s,o)=>o);return n.sort((s,o)=>{for(let a of i){let l=a[s]a[o]?1:0;if(l!==0)return l}return 0}),n.map(s=>r[s])}function M0e(t){return t.length===0?null:t.map(e=>`(${hJ.default.makeRe(e,{windows:!1,dot:!0}).source})`).join("|")}function qS(t,{env:e}){let r=/\${(?[\d\w_]+)(?:)?(?:-(?[^}]*))?}/g;return t.replace(r,(...i)=>{let{variableName:n,colon:s,fallback:o}=i[i.length-1],a=Object.prototype.hasOwnProperty.call(e,n),l=e[n];if(l||a&&!s)return l;if(o!=null)return o;throw new Pe(`Environment variable not found (${n})`)})}function rd(t){switch(t){case"true":case"1":case 1:case!0:return!0;case"false":case"0":case 0:case!1:return!1;default:throw new Error(`Couldn't parse "${t}" as a boolean`)}}function QJ(t){return typeof t=="undefined"?t:rd(t)}function JS(t){try{return QJ(t)}catch{return null}}function K0e(t){return!!(H.isAbsolute(t)||t.match(/^(\.{1,2}|~)\//))}var Qt;(function(r){r.HARD="HARD",r.SOFT="SOFT"})(Qt||(Qt={}));var yi;(function(i){i.Dependency="Dependency",i.PeerDependency="PeerDependency",i.PeerDependencyMeta="PeerDependencyMeta"})(yi||(yi={}));var qi;(function(i){i.Inactive="inactive",i.Redundant="redundant",i.Active="active"})(qi||(qi={}));var Ye={NO_HINT:"NO_HINT",NULL:"NULL",SCOPE:"SCOPE",NAME:"NAME",RANGE:"RANGE",REFERENCE:"REFERENCE",NUMBER:"NUMBER",PATH:"PATH",URL:"URL",ADDED:"ADDED",REMOVED:"REMOVED",CODE:"CODE",DURATION:"DURATION",SIZE:"SIZE",IDENT:"IDENT",DESCRIPTOR:"DESCRIPTOR",LOCATOR:"LOCATOR",RESOLUTION:"RESOLUTION",DEPENDENT:"DEPENDENT",PACKAGE_EXTENSION:"PACKAGE_EXTENSION",SETTING:"SETTING",MARKDOWN:"MARKDOWN"},Dc;(function(e){e[e.BOLD=2]="BOLD"})(Dc||(Dc={}));var _S=nd.default.GITHUB_ACTIONS?{level:2}:id.default.supportsColor?{level:id.default.supportsColor.level}:{level:0},Ny=_S.level!==0,VS=Ny&&!nd.default.GITHUB_ACTIONS&&!nd.default.CIRCLE&&!nd.default.GITLAB,XS=new id.default.Instance(_S),U0e=new Map([[Ye.NO_HINT,null],[Ye.NULL,["#a853b5",129]],[Ye.SCOPE,["#d75f00",166]],[Ye.NAME,["#d7875f",173]],[Ye.RANGE,["#00afaf",37]],[Ye.REFERENCE,["#87afff",111]],[Ye.NUMBER,["#ffd700",220]],[Ye.PATH,["#d75fd7",170]],[Ye.URL,["#d75fd7",170]],[Ye.ADDED,["#5faf00",70]],[Ye.REMOVED,["#d70000",160]],[Ye.CODE,["#87afff",111]],[Ye.SIZE,["#ffd700",220]]]),Rs=t=>t,Ly={[Ye.NUMBER]:Rs({pretty:(t,e)=>`${e}`,json:t=>t}),[Ye.IDENT]:Rs({pretty:(t,e)=>gi(t,e),json:t=>Ot(t)}),[Ye.LOCATOR]:Rs({pretty:(t,e)=>Bt(t,e),json:t=>Ds(t)}),[Ye.DESCRIPTOR]:Rs({pretty:(t,e)=>sr(t,e),json:t=>Pn(t)}),[Ye.RESOLUTION]:Rs({pretty:(t,{descriptor:e,locator:r})=>zS(t,e,r),json:({descriptor:t,locator:e})=>({descriptor:Pn(t),locator:e!==null?Ds(e):null})}),[Ye.DEPENDENT]:Rs({pretty:(t,{locator:e,descriptor:r})=>WS(t,e,r),json:({locator:t,descriptor:e})=>({locator:Ds(t),descriptor:Pn(e)})}),[Ye.PACKAGE_EXTENSION]:Rs({pretty:(t,e)=>{switch(e.type){case yi.Dependency:return`${gi(t,e.parentDescriptor)} \u27A4 ${is(t,"dependencies",Ye.CODE)} \u27A4 ${gi(t,e.descriptor)}`;case yi.PeerDependency:return`${gi(t,e.parentDescriptor)} \u27A4 ${is(t,"peerDependencies",Ye.CODE)} \u27A4 ${gi(t,e.descriptor)}`;case yi.PeerDependencyMeta:return`${gi(t,e.parentDescriptor)} \u27A4 ${is(t,"peerDependenciesMeta",Ye.CODE)} \u27A4 ${gi(t,An(e.selector))} \u27A4 ${is(t,e.key,Ye.CODE)}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${e.type}`)}},json:t=>{switch(t.type){case yi.Dependency:return`${Ot(t.parentDescriptor)} > ${Ot(t.descriptor)}`;case yi.PeerDependency:return`${Ot(t.parentDescriptor)} >> ${Ot(t.descriptor)}`;case yi.PeerDependencyMeta:return`${Ot(t.parentDescriptor)} >> ${t.selector} / ${t.key}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${t.type}`)}}}),[Ye.SETTING]:Rs({pretty:(t,e)=>(t.get(e),Lg(t,is(t,e,Ye.CODE),`https://yarnpkg.com/configuration/yarnrc#${e}`)),json:t=>t}),[Ye.DURATION]:Rs({pretty:(t,e)=>{if(e>1e3*60){let r=Math.floor(e/1e3/60),i=Math.ceil((e-r*60*1e3)/1e3);return i===0?`${r}m`:`${r}m ${i}s`}else{let r=Math.floor(e/1e3),i=e-r*1e3;return i===0?`${r}s`:`${r}s ${i}ms`}},json:t=>t}),[Ye.SIZE]:Rs({pretty:(t,e)=>{let r=["KB","MB","GB","TB"],i=r.length;for(;i>1&&e<1024**i;)i-=1;let n=1024**i,s=Math.floor(e*100/n)/100;return is(t,`${s} ${r[i-1]}`,Ye.NUMBER)},json:t=>t}),[Ye.PATH]:Rs({pretty:(t,e)=>is(t,H.fromPortablePath(e),Ye.PATH),json:t=>H.fromPortablePath(t)}),[Ye.MARKDOWN]:Rs({pretty:(t,{text:e,format:r,paragraphs:i})=>Ui(e,{format:r,paragraphs:i}),json:({text:t})=>t})};function go(t,e){return[e,t]}function Ty(t,e,r){return t.get("enableColors")&&r&2&&(e=id.default.bold(e)),e}function is(t,e,r){if(!t.get("enableColors"))return e;let i=U0e.get(r);if(i===null)return e;let n=typeof i=="undefined"?r:_S.level>=3?i[0]:i[1],s=typeof n=="number"?XS.ansi256(n):n.startsWith("#")?XS.hex(n):XS[n];if(typeof s!="function")throw new Error(`Invalid format type ${n}`);return s(e)}var H0e=!!process.env.KONSOLE_VERSION;function Lg(t,e,r){return t.get("enableHyperlinks")?H0e?`]8;;${r}\\${e}]8;;\\`:`]8;;${r}\x07${e}]8;;\x07`:e}function et(t,e,r){if(e===null)return is(t,"null",Ye.NULL);if(Object.prototype.hasOwnProperty.call(Ly,r))return Ly[r].pretty(t,e);if(typeof e!="string")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof e}`);return is(t,e,r)}function ZS(t,e,r,{separator:i=", "}={}){return[...e].map(n=>et(t,n,r)).join(i)}function Rc(t,e){if(t===null)return null;if(Object.prototype.hasOwnProperty.call(Ly,e))return HS(e),Ly[e].json(t);if(typeof t!="string")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof t}`);return t}function G0e(t,e,[r,i]){return t?Rc(r,i):et(e,r,i)}function $S(t){return{Check:is(t,"\u2713","green"),Cross:is(t,"\u2718","red"),Question:is(t,"?","cyan")}}function Jo(t,{label:e,value:[r,i]}){return`${et(t,e,Ye.CODE)}: ${et(t,r,i)}`}var fo;(function(n){n.Error="error",n.Warning="warning",n.Info="info",n.Discard="discard"})(fo||(fo={}));function sd(t,{configuration:e}){let r=e.get("logFilters"),i=new Map,n=new Map,s=[];for(let g of r){let f=g.get("level");if(typeof f=="undefined")continue;let h=g.get("code");typeof h!="undefined"&&i.set(h,f);let p=g.get("text");typeof p!="undefined"&&n.set(p,f);let m=g.get("pattern");typeof m!="undefined"&&s.push([vJ.default.matcher(m,{contains:!0}),f])}s.reverse();let o=(g,f,h)=>{if(g===null||g===$.UNNAMED)return h;let p=n.size>0||s.length>0?(0,SJ.default)(f):f;if(n.size>0){let m=n.get(p);if(typeof m!="undefined")return m!=null?m:h}if(s.length>0){for(let[m,y]of s)if(m(p))return y!=null?y:h}if(i.size>0){let m=i.get(qA(g));if(typeof m!="undefined")return m!=null?m:h}return h},a=t.reportInfo,l=t.reportWarning,c=t.reportError,u=function(g,f,h,p){switch(o(f,h,p)){case fo.Info:a.call(g,f,h);break;case fo.Warning:l.call(g,f!=null?f:$.UNNAMED,h);break;case fo.Error:c.call(g,f!=null?f:$.UNNAMED,h);break}};t.reportInfo=function(...g){return u(this,...g,fo.Info)},t.reportWarning=function(...g){return u(this,...g,fo.Warning)},t.reportError=function(...g){return u(this,...g,fo.Error)}}var Dn={};ft(Dn,{checksumFile:()=>lw,checksumPattern:()=>cw,makeHash:()=>ln});var Aw=ge(require("crypto")),ox=ge(sx());function ln(...t){let e=(0,Aw.createHash)("sha512"),r="";for(let i of t)typeof i=="string"?r+=i:i&&(r&&(e.update(r),r=""),e.update(i));return r&&e.update(r),e.digest("hex")}async function lw(t,{baseFs:e,algorithm:r}={baseFs:K,algorithm:"sha512"}){let i=await e.openPromise(t,"r");try{let n=65536,s=Buffer.allocUnsafeSlow(n),o=(0,Aw.createHash)(r),a=0;for(;(a=await e.readPromise(i,s,0,n))!==0;)o.update(a===n?s:s.slice(0,a));return o.digest("hex")}finally{await e.closePromise(i)}}async function cw(t,{cwd:e}){let i=(await(0,ox.default)(t,{cwd:H.fromPortablePath(e),expandDirectories:!1,onlyDirectories:!0,unique:!0})).map(a=>`${a}/**/*`),n=await(0,ox.default)([t,...i],{cwd:H.fromPortablePath(e),expandDirectories:!1,onlyFiles:!1,unique:!0});n.sort();let s=await Promise.all(n.map(async a=>{let l=[Buffer.from(a)],c=H.toPortablePath(a),u=await K.lstatPromise(c);return u.isSymbolicLink()?l.push(Buffer.from(await K.readlinkPromise(c))):u.isFile()&&l.push(await K.readFilePromise(c)),l.join("\0")})),o=(0,Aw.createHash)("sha512");for(let a of s)o.update(a);return o.digest("hex")}var ld="virtual:",nSe=5,c8=/(os|cpu|libc)=([a-z0-9_-]+)/,sSe=(0,l8.makeParser)(c8);function Vo(t,e){if(t==null?void 0:t.startsWith("@"))throw new Error("Invalid scope: don't prefix it with '@'");return{identHash:ln(t,e),scope:t,name:e}}function rr(t,e){return{identHash:t.identHash,scope:t.scope,name:t.name,descriptorHash:ln(t.identHash,e),range:e}}function cn(t,e){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:ln(t.identHash,e),reference:e}}function oSe(t){return{identHash:t.identHash,scope:t.scope,name:t.name}}function gw(t){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:t.descriptorHash,reference:t.range}}function ax(t){return{identHash:t.identHash,scope:t.scope,name:t.name,descriptorHash:t.locatorHash,range:t.reference}}function aSe(t){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:t.locatorHash,reference:t.reference}}function cd(t,e){return{identHash:e.identHash,scope:e.scope,name:e.name,locatorHash:e.locatorHash,reference:e.reference,version:t.version,languageName:t.languageName,linkType:t.linkType,conditions:t.conditions,dependencies:new Map(t.dependencies),peerDependencies:new Map(t.peerDependencies),dependenciesMeta:new Map(t.dependenciesMeta),peerDependenciesMeta:new Map(t.peerDependenciesMeta),bin:new Map(t.bin)}}function ud(t){return cd(t,t)}function Ax(t,e){if(e.includes("#"))throw new Error("Invalid entropy");return rr(t,`virtual:${e}#${t.range}`)}function lx(t,e){if(e.includes("#"))throw new Error("Invalid entropy");return cd(t,cn(t,`virtual:${e}#${t.reference}`))}function nl(t){return t.range.startsWith(ld)}function Xo(t){return t.reference.startsWith(ld)}function gd(t){if(!nl(t))throw new Error("Not a virtual descriptor");return rr(t,t.range.replace(/^[^#]*#/,""))}function fd(t){if(!Xo(t))throw new Error("Not a virtual descriptor");return cn(t,t.reference.replace(/^[^#]*#/,""))}function ASe(t,e){return t.range.includes("::")?t:rr(t,`${t.range}::${Hg.default.stringify(e)}`)}function lSe(t,e){return t.reference.includes("::")?t:cn(t,`${t.reference}::${Hg.default.stringify(e)}`)}function hd(t,e){return t.identHash===e.identHash}function u8(t,e){return t.descriptorHash===e.descriptorHash}function pd(t,e){return t.locatorHash===e.locatorHash}function cSe(t,e){if(!Xo(t))throw new Error("Invalid package type");if(!Xo(e))throw new Error("Invalid package type");if(!hd(t,e)||t.dependencies.size!==e.dependencies.size)return!1;for(let r of t.dependencies.values()){let i=e.dependencies.get(r.identHash);if(!i||!u8(r,i))return!1}return!0}function An(t){let e=g8(t);if(!e)throw new Error(`Invalid ident (${t})`);return e}function g8(t){let e=t.match(/^(?:@([^/]+?)\/)?([^/]+)$/);if(!e)return null;let[,r,i]=e,n=typeof r!="undefined"?r:null;return Vo(n,i)}function sl(t,e=!1){let r=dd(t,e);if(!r)throw new Error(`Invalid descriptor (${t})`);return r}function dd(t,e=!1){let r=e?t.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))$/):t.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))?$/);if(!r)return null;let[,i,n,s]=r;if(s==="unknown")throw new Error(`Invalid range (${t})`);let o=typeof i!="undefined"?i:null,a=typeof s!="undefined"?s:"unknown";return rr(Vo(o,n),a)}function Kc(t,e=!1){let r=fw(t,e);if(!r)throw new Error(`Invalid locator (${t})`);return r}function fw(t,e=!1){let r=e?t.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))$/):t.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))?$/);if(!r)return null;let[,i,n,s]=r;if(s==="unknown")throw new Error(`Invalid reference (${t})`);let o=typeof i!="undefined"?i:null,a=typeof s!="undefined"?s:"unknown";return cn(Vo(o,n),a)}function Gg(t,e){let r=t.match(/^([^#:]*:)?((?:(?!::)[^#])*)(?:#((?:(?!::).)*))?(?:::(.*))?$/);if(r===null)throw new Error(`Invalid range (${t})`);let i=typeof r[1]!="undefined"?r[1]:null;if(typeof(e==null?void 0:e.requireProtocol)=="string"&&i!==e.requireProtocol)throw new Error(`Invalid protocol (${i})`);if((e==null?void 0:e.requireProtocol)&&i===null)throw new Error(`Missing protocol (${i})`);let n=typeof r[3]!="undefined"?decodeURIComponent(r[2]):null;if((e==null?void 0:e.requireSource)&&n===null)throw new Error(`Missing source (${t})`);let s=typeof r[3]!="undefined"?decodeURIComponent(r[3]):decodeURIComponent(r[2]),o=(e==null?void 0:e.parseSelector)?Hg.default.parse(s):s,a=typeof r[4]!="undefined"?Hg.default.parse(r[4]):null;return{protocol:i,source:n,selector:o,params:a}}function uSe(t,{protocol:e}){let{selector:r,params:i}=Gg(t,{requireProtocol:e,requireBindings:!0});if(typeof i.locator!="string")throw new Error(`Assertion failed: Invalid bindings for ${t}`);return{parentLocator:Kc(i.locator,!0),path:r}}function f8(t){return t=t.replace(/%/g,"%25"),t=t.replace(/:/g,"%3A"),t=t.replace(/#/g,"%23"),t}function gSe(t){return t===null?!1:Object.entries(t).length>0}function hw({protocol:t,source:e,selector:r,params:i}){let n="";return t!==null&&(n+=`${t}`),e!==null&&(n+=`${f8(e)}#`),n+=f8(r),gSe(i)&&(n+=`::${Hg.default.stringify(i)}`),n}function fSe(t){let{params:e,protocol:r,source:i,selector:n}=Gg(t);for(let s in e)s.startsWith("__")&&delete e[s];return hw({protocol:r,source:i,params:e,selector:n})}function Ot(t){return t.scope?`@${t.scope}/${t.name}`:`${t.name}`}function Pn(t){return t.scope?`@${t.scope}/${t.name}@${t.range}`:`${t.name}@${t.range}`}function Ds(t){return t.scope?`@${t.scope}/${t.name}@${t.reference}`:`${t.name}@${t.reference}`}function cx(t){return t.scope!==null?`@${t.scope}-${t.name}`:t.name}function jg(t){let{protocol:e,selector:r}=Gg(t.reference),i=e!==null?e.replace(/:$/,""):"exotic",n=A8.default.valid(r),s=n!==null?`${i}-${n}`:`${i}`,o=10,a=t.scope?`${cx(t)}-${s}-${t.locatorHash.slice(0,o)}`:`${cx(t)}-${s}-${t.locatorHash.slice(0,o)}`;return Jr(a)}function gi(t,e){return e.scope?`${et(t,`@${e.scope}/`,Ye.SCOPE)}${et(t,e.name,Ye.NAME)}`:`${et(t,e.name,Ye.NAME)}`}function pw(t){if(t.startsWith(ld)){let e=pw(t.substring(t.indexOf("#")+1)),r=t.substring(ld.length,ld.length+nSe);return`${e} [${r}]`}else return t.replace(/\?.*/,"?[...]")}function uw(t,e){return`${et(t,pw(e),Ye.RANGE)}`}function sr(t,e){return`${gi(t,e)}${et(t,"@",Ye.RANGE)}${uw(t,e.range)}`}function Cd(t,e){return`${et(t,pw(e),Ye.REFERENCE)}`}function Bt(t,e){return`${gi(t,e)}${et(t,"@",Ye.REFERENCE)}${Cd(t,e.reference)}`}function ux(t){return`${Ot(t)}@${pw(t.reference)}`}function Yg(t){return xn(t,[e=>Ot(e),e=>e.range])}function md(t,e){return gi(t,e.locator)}function zS(t,e,r){let i=nl(e)?gd(e):e;return r===null?`${sr(t,i)} \u2192 ${$S(t).Cross}`:i.identHash===r.identHash?`${sr(t,i)} \u2192 ${Cd(t,r.reference)}`:`${sr(t,i)} \u2192 ${Bt(t,r)}`}function WS(t,e,r){return r===null?`${Bt(t,e)}`:`${Bt(t,e)} (via ${uw(t,r.range)})`}function gx(t){return`node_modules/${Ot(t)}`}function dw(t,e){return t.conditions?sSe(t.conditions,r=>{let[,i,n]=r.match(c8),s=e[i];return s?s.includes(n):!0}):!0}var h8={hooks:{reduceDependency:(t,e,r,i,{resolver:n,resolveOptions:s})=>{for(let{pattern:o,reference:a}of e.topLevelWorkspace.manifest.resolutions){if(o.from&&o.from.fullName!==Ot(r)||o.from&&o.from.description&&o.from.description!==r.reference||o.descriptor.fullName!==Ot(t)||o.descriptor.description&&o.descriptor.description!==t.range)continue;return n.bindDescriptor(rr(t,a),e.topLevelWorkspace.anchoredLocator,s)}return t},validateProject:async(t,e)=>{for(let r of t.workspaces){let i=md(t.configuration,r);await t.configuration.triggerHook(n=>n.validateWorkspace,r,{reportWarning:(n,s)=>e.reportWarning(n,`${i}: ${s}`),reportError:(n,s)=>e.reportError(n,`${i}: ${s}`)})}},validateWorkspace:async(t,e)=>{let{manifest:r}=t;r.resolutions.length&&t.cwd!==t.project.cwd&&r.errors.push(new Error("Resolutions field will be ignored"));for(let i of r.errors)e.reportWarning($.INVALID_MANIFEST,i.message)}}};var m8=ge(ri());var Ed=class{supportsDescriptor(e,r){return!!(e.range.startsWith(Ed.protocol)||r.project.tryWorkspaceByDescriptor(e)!==null)}supportsLocator(e,r){return!!e.reference.startsWith(Ed.protocol)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){return[i.project.getWorkspaceByDescriptor(e).anchoredLocator]}async getSatisfying(e,r,i){return null}async resolve(e,r){let i=r.project.getWorkspaceByCwd(e.reference.slice(Ed.protocol.length));return ie(N({},e),{version:i.manifest.version||"0.0.0",languageName:"unknown",linkType:Qt.SOFT,conditions:null,dependencies:new Map([...i.manifest.dependencies,...i.manifest.devDependencies]),peerDependencies:new Map([...i.manifest.peerDependencies]),dependenciesMeta:i.manifest.dependenciesMeta,peerDependenciesMeta:i.manifest.peerDependenciesMeta,bin:i.manifest.bin})}},oi=Ed;oi.protocol="workspace:";var Wt={};ft(Wt,{SemVer:()=>p8.SemVer,clean:()=>pSe,satisfiesWithPrereleases:()=>Uc,validRange:()=>ho});var Cw=ge(ri()),p8=ge(ri()),d8=new Map;function Uc(t,e,r=!1){if(!t)return!1;let i=`${e}${r}`,n=d8.get(i);if(typeof n=="undefined")try{n=new Cw.default.Range(e,{includePrerelease:!0,loose:r})}catch{return!1}finally{d8.set(i,n||null)}else if(n===null)return!1;let s;try{s=new Cw.default.SemVer(t,n)}catch(o){return!1}return n.test(s)?!0:(s.prerelease&&(s.prerelease=[]),n.set.some(o=>{for(let a of o)a.semver.prerelease&&(a.semver.prerelease=[]);return o.every(a=>a.test(s))}))}var C8=new Map;function ho(t){if(t.indexOf(":")!==-1)return null;let e=C8.get(t);if(typeof e!="undefined")return e;try{e=new Cw.default.Range(t)}catch{e=null}return C8.set(t,e),e}var hSe=/^(?:[\sv=]*?)((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-]+)*))?)(?:\s*)$/;function pSe(t){let e=hSe.exec(t);return e?e[1]:null}var ol=class{constructor(){this.indent=" ";this.name=null;this.version=null;this.os=null;this.cpu=null;this.libc=null;this.type=null;this.packageManager=null;this.private=!1;this.license=null;this.main=null;this.module=null;this.browser=null;this.languageName=null;this.bin=new Map;this.scripts=new Map;this.dependencies=new Map;this.devDependencies=new Map;this.peerDependencies=new Map;this.workspaceDefinitions=[];this.dependenciesMeta=new Map;this.peerDependenciesMeta=new Map;this.resolutions=[];this.files=null;this.publishConfig=null;this.installConfig=null;this.preferUnplugged=null;this.raw={};this.errors=[]}static async tryFind(e,{baseFs:r=new ar}={}){let i=x.join(e,"package.json");try{return await ol.fromFile(i,{baseFs:r})}catch(n){if(n.code==="ENOENT")return null;throw n}}static async find(e,{baseFs:r}={}){let i=await ol.tryFind(e,{baseFs:r});if(i===null)throw new Error("Manifest not found");return i}static async fromFile(e,{baseFs:r=new ar}={}){let i=new ol;return await i.loadFile(e,{baseFs:r}),i}static fromText(e){let r=new ol;return r.loadFromText(e),r}static isManifestFieldCompatible(e,r){if(e===null)return!0;let i=!0,n=!1;for(let s of e)if(s[0]==="!"){if(n=!0,r===s.slice(1))return!1}else if(i=!1,s===r)return!0;return n&&i}loadFromText(e){let r;try{r=JSON.parse(I8(e)||"{}")}catch(i){throw i.message+=` (when parsing ${e})`,i}this.load(r),this.indent=E8(e)}async loadFile(e,{baseFs:r=new ar}){let i=await r.readFilePromise(e,"utf8"),n;try{n=JSON.parse(I8(i)||"{}")}catch(s){throw s.message+=` (when parsing ${e})`,s}this.load(n),this.indent=E8(i)}load(e,{yamlCompatibilityMode:r=!1}={}){if(typeof e!="object"||e===null)throw new Error(`Utterly invalid manifest data (${e})`);this.raw=e;let i=[];if(this.name=null,typeof e.name=="string")try{this.name=An(e.name)}catch(s){i.push(new Error("Parsing failed for the 'name' field"))}if(typeof e.version=="string"?this.version=e.version:this.version=null,Array.isArray(e.os)){let s=[];this.os=s;for(let o of e.os)typeof o!="string"?i.push(new Error("Parsing failed for the 'os' field")):s.push(o)}else this.os=null;if(Array.isArray(e.cpu)){let s=[];this.cpu=s;for(let o of e.cpu)typeof o!="string"?i.push(new Error("Parsing failed for the 'cpu' field")):s.push(o)}else this.cpu=null;if(Array.isArray(e.libc)){let s=[];this.libc=s;for(let o of e.libc)typeof o!="string"?i.push(new Error("Parsing failed for the 'libc' field")):s.push(o)}else this.libc=null;if(typeof e.type=="string"?this.type=e.type:this.type=null,typeof e.packageManager=="string"?this.packageManager=e.packageManager:this.packageManager=null,typeof e.private=="boolean"?this.private=e.private:this.private=!1,typeof e.license=="string"?this.license=e.license:this.license=null,typeof e.languageName=="string"?this.languageName=e.languageName:this.languageName=null,typeof e.main=="string"?this.main=un(e.main):this.main=null,typeof e.module=="string"?this.module=un(e.module):this.module=null,e.browser!=null)if(typeof e.browser=="string")this.browser=un(e.browser);else{this.browser=new Map;for(let[s,o]of Object.entries(e.browser))this.browser.set(un(s),typeof o=="string"?un(o):o)}else this.browser=null;if(this.bin=new Map,typeof e.bin=="string")this.name!==null?this.bin.set(this.name.name,un(e.bin)):i.push(new Error("String bin field, but no attached package name"));else if(typeof e.bin=="object"&&e.bin!==null)for(let[s,o]of Object.entries(e.bin)){if(typeof o!="string"){i.push(new Error(`Invalid bin definition for '${s}'`));continue}let a=An(s);this.bin.set(a.name,un(o))}if(this.scripts=new Map,typeof e.scripts=="object"&&e.scripts!==null)for(let[s,o]of Object.entries(e.scripts)){if(typeof o!="string"){i.push(new Error(`Invalid script definition for '${s}'`));continue}this.scripts.set(s,o)}if(this.dependencies=new Map,typeof e.dependencies=="object"&&e.dependencies!==null)for(let[s,o]of Object.entries(e.dependencies)){if(typeof o!="string"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=An(s)}catch(c){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=rr(a,o);this.dependencies.set(l.identHash,l)}if(this.devDependencies=new Map,typeof e.devDependencies=="object"&&e.devDependencies!==null)for(let[s,o]of Object.entries(e.devDependencies)){if(typeof o!="string"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=An(s)}catch(c){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=rr(a,o);this.devDependencies.set(l.identHash,l)}if(this.peerDependencies=new Map,typeof e.peerDependencies=="object"&&e.peerDependencies!==null)for(let[s,o]of Object.entries(e.peerDependencies)){let a;try{a=An(s)}catch(c){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}(typeof o!="string"||!o.startsWith(oi.protocol)&&!ho(o))&&(i.push(new Error(`Invalid dependency range for '${s}'`)),o="*");let l=rr(a,o);this.peerDependencies.set(l.identHash,l)}typeof e.workspaces=="object"&&e.workspaces!==null&&e.workspaces.nohoist&&i.push(new Error("'nohoist' is deprecated, please use 'installConfig.hoistingLimits' instead"));let n=Array.isArray(e.workspaces)?e.workspaces:typeof e.workspaces=="object"&&e.workspaces!==null&&Array.isArray(e.workspaces.packages)?e.workspaces.packages:[];this.workspaceDefinitions=[];for(let s of n){if(typeof s!="string"){i.push(new Error(`Invalid workspace definition for '${s}'`));continue}this.workspaceDefinitions.push({pattern:s})}if(this.dependenciesMeta=new Map,typeof e.dependenciesMeta=="object"&&e.dependenciesMeta!==null)for(let[s,o]of Object.entries(e.dependenciesMeta)){if(typeof o!="object"||o===null){i.push(new Error(`Invalid meta field for '${s}`));continue}let a=sl(s),l=this.ensureDependencyMeta(a),c=mw(o.built,{yamlCompatibilityMode:r});if(c===null){i.push(new Error(`Invalid built meta field for '${s}'`));continue}let u=mw(o.optional,{yamlCompatibilityMode:r});if(u===null){i.push(new Error(`Invalid optional meta field for '${s}'`));continue}let g=mw(o.unplugged,{yamlCompatibilityMode:r});if(g===null){i.push(new Error(`Invalid unplugged meta field for '${s}'`));continue}Object.assign(l,{built:c,optional:u,unplugged:g})}if(this.peerDependenciesMeta=new Map,typeof e.peerDependenciesMeta=="object"&&e.peerDependenciesMeta!==null)for(let[s,o]of Object.entries(e.peerDependenciesMeta)){if(typeof o!="object"||o===null){i.push(new Error(`Invalid meta field for '${s}'`));continue}let a=sl(s),l=this.ensurePeerDependencyMeta(a),c=mw(o.optional,{yamlCompatibilityMode:r});if(c===null){i.push(new Error(`Invalid optional meta field for '${s}'`));continue}Object.assign(l,{optional:c})}if(this.resolutions=[],typeof e.resolutions=="object"&&e.resolutions!==null)for(let[s,o]of Object.entries(e.resolutions)){if(typeof o!="string"){i.push(new Error(`Invalid resolution entry for '${s}'`));continue}try{this.resolutions.push({pattern:iI(s),reference:o})}catch(a){i.push(a);continue}}if(Array.isArray(e.files)){this.files=new Set;for(let s of e.files){if(typeof s!="string"){i.push(new Error(`Invalid files entry for '${s}'`));continue}this.files.add(s)}}else this.files=null;if(typeof e.publishConfig=="object"&&e.publishConfig!==null){if(this.publishConfig={},typeof e.publishConfig.access=="string"&&(this.publishConfig.access=e.publishConfig.access),typeof e.publishConfig.main=="string"&&(this.publishConfig.main=un(e.publishConfig.main)),typeof e.publishConfig.module=="string"&&(this.publishConfig.module=un(e.publishConfig.module)),e.publishConfig.browser!=null)if(typeof e.publishConfig.browser=="string")this.publishConfig.browser=un(e.publishConfig.browser);else{this.publishConfig.browser=new Map;for(let[s,o]of Object.entries(e.publishConfig.browser))this.publishConfig.browser.set(un(s),typeof o=="string"?un(o):o)}if(typeof e.publishConfig.registry=="string"&&(this.publishConfig.registry=e.publishConfig.registry),typeof e.publishConfig.bin=="string")this.name!==null?this.publishConfig.bin=new Map([[this.name.name,un(e.publishConfig.bin)]]):i.push(new Error("String bin field, but no attached package name"));else if(typeof e.publishConfig.bin=="object"&&e.publishConfig.bin!==null){this.publishConfig.bin=new Map;for(let[s,o]of Object.entries(e.publishConfig.bin)){if(typeof o!="string"){i.push(new Error(`Invalid bin definition for '${s}'`));continue}this.publishConfig.bin.set(s,un(o))}}if(Array.isArray(e.publishConfig.executableFiles)){this.publishConfig.executableFiles=new Set;for(let s of e.publishConfig.executableFiles){if(typeof s!="string"){i.push(new Error("Invalid executable file definition"));continue}this.publishConfig.executableFiles.add(un(s))}}}else this.publishConfig=null;if(typeof e.installConfig=="object"&&e.installConfig!==null){this.installConfig={};for(let s of Object.keys(e.installConfig))s==="hoistingLimits"?typeof e.installConfig.hoistingLimits=="string"?this.installConfig.hoistingLimits=e.installConfig.hoistingLimits:i.push(new Error("Invalid hoisting limits definition")):s=="selfReferences"?typeof e.installConfig.selfReferences=="boolean"?this.installConfig.selfReferences=e.installConfig.selfReferences:i.push(new Error("Invalid selfReferences definition, must be a boolean value")):i.push(new Error(`Unrecognized installConfig key: ${s}`))}else this.installConfig=null;if(typeof e.optionalDependencies=="object"&&e.optionalDependencies!==null)for(let[s,o]of Object.entries(e.optionalDependencies)){if(typeof o!="string"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=An(s)}catch(g){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=rr(a,o);this.dependencies.set(l.identHash,l);let c=rr(a,"unknown"),u=this.ensureDependencyMeta(c);Object.assign(u,{optional:!0})}typeof e.preferUnplugged=="boolean"?this.preferUnplugged=e.preferUnplugged:this.preferUnplugged=null,this.errors=i}getForScope(e){switch(e){case"dependencies":return this.dependencies;case"devDependencies":return this.devDependencies;case"peerDependencies":return this.peerDependencies;default:throw new Error(`Unsupported value ("${e}")`)}}hasConsumerDependency(e){return!!(this.dependencies.has(e.identHash)||this.peerDependencies.has(e.identHash))}hasHardDependency(e){return!!(this.dependencies.has(e.identHash)||this.devDependencies.has(e.identHash))}hasSoftDependency(e){return!!this.peerDependencies.has(e.identHash)}hasDependency(e){return!!(this.hasHardDependency(e)||this.hasSoftDependency(e))}getConditions(){let e=[];return this.os&&this.os.length>0&&e.push(fx("os",this.os)),this.cpu&&this.cpu.length>0&&e.push(fx("cpu",this.cpu)),this.libc&&this.libc.length>0&&e.push(fx("libc",this.libc)),e.length>0?e.join(" & "):null}isCompatibleWithOS(e){return ol.isManifestFieldCompatible(this.os,e)}isCompatibleWithCPU(e){return ol.isManifestFieldCompatible(this.cpu,e)}ensureDependencyMeta(e){if(e.range!=="unknown"&&!m8.default.valid(e.range))throw new Error(`Invalid meta field range for '${Pn(e)}'`);let r=Ot(e),i=e.range!=="unknown"?e.range:null,n=this.dependenciesMeta.get(r);n||this.dependenciesMeta.set(r,n=new Map);let s=n.get(i);return s||n.set(i,s={}),s}ensurePeerDependencyMeta(e){if(e.range!=="unknown")throw new Error(`Invalid meta field range for '${Pn(e)}'`);let r=Ot(e),i=this.peerDependenciesMeta.get(r);return i||this.peerDependenciesMeta.set(r,i={}),i}setRawField(e,r,{after:i=[]}={}){let n=new Set(i.filter(s=>Object.prototype.hasOwnProperty.call(this.raw,s)));if(n.size===0||Object.prototype.hasOwnProperty.call(this.raw,e))this.raw[e]=r;else{let s=this.raw,o=this.raw={},a=!1;for(let l of Object.keys(s))o[l]=s[l],a||(n.delete(l),n.size===0&&(o[e]=r,a=!0))}}exportTo(e,{compatibilityMode:r=!0}={}){var s;if(Object.assign(e,this.raw),this.name!==null?e.name=Ot(this.name):delete e.name,this.version!==null?e.version=this.version:delete e.version,this.os!==null?e.os=this.os:delete e.os,this.cpu!==null?e.cpu=this.cpu:delete e.cpu,this.type!==null?e.type=this.type:delete e.type,this.packageManager!==null?e.packageManager=this.packageManager:delete e.packageManager,this.private?e.private=!0:delete e.private,this.license!==null?e.license=this.license:delete e.license,this.languageName!==null?e.languageName=this.languageName:delete e.languageName,this.main!==null?e.main=this.main:delete e.main,this.module!==null?e.module=this.module:delete e.module,this.browser!==null){let o=this.browser;typeof o=="string"?e.browser=o:o instanceof Map&&(e.browser=Object.assign({},...Array.from(o.keys()).sort().map(a=>({[a]:o.get(a)}))))}else delete e.browser;this.bin.size===1&&this.name!==null&&this.bin.has(this.name.name)?e.bin=this.bin.get(this.name.name):this.bin.size>0?e.bin=Object.assign({},...Array.from(this.bin.keys()).sort().map(o=>({[o]:this.bin.get(o)}))):delete e.bin,this.workspaceDefinitions.length>0?this.raw.workspaces&&!Array.isArray(this.raw.workspaces)?e.workspaces=ie(N({},this.raw.workspaces),{packages:this.workspaceDefinitions.map(({pattern:o})=>o)}):e.workspaces=this.workspaceDefinitions.map(({pattern:o})=>o):this.raw.workspaces&&!Array.isArray(this.raw.workspaces)&&Object.keys(this.raw.workspaces).length>0?e.workspaces=this.raw.workspaces:delete e.workspaces;let i=[],n=[];for(let o of this.dependencies.values()){let a=this.dependenciesMeta.get(Ot(o)),l=!1;if(r&&a){let c=a.get(null);c&&c.optional&&(l=!0)}l?n.push(o):i.push(o)}i.length>0?e.dependencies=Object.assign({},...Yg(i).map(o=>({[Ot(o)]:o.range}))):delete e.dependencies,n.length>0?e.optionalDependencies=Object.assign({},...Yg(n).map(o=>({[Ot(o)]:o.range}))):delete e.optionalDependencies,this.devDependencies.size>0?e.devDependencies=Object.assign({},...Yg(this.devDependencies.values()).map(o=>({[Ot(o)]:o.range}))):delete e.devDependencies,this.peerDependencies.size>0?e.peerDependencies=Object.assign({},...Yg(this.peerDependencies.values()).map(o=>({[Ot(o)]:o.range}))):delete e.peerDependencies,e.dependenciesMeta={};for(let[o,a]of xn(this.dependenciesMeta.entries(),([l,c])=>l))for(let[l,c]of xn(a.entries(),([u,g])=>u!==null?`0${u}`:"1")){let u=l!==null?Pn(rr(An(o),l)):o,g=N({},c);r&&l===null&&delete g.optional,Object.keys(g).length!==0&&(e.dependenciesMeta[u]=g)}if(Object.keys(e.dependenciesMeta).length===0&&delete e.dependenciesMeta,this.peerDependenciesMeta.size>0?e.peerDependenciesMeta=Object.assign({},...xn(this.peerDependenciesMeta.entries(),([o,a])=>o).map(([o,a])=>({[o]:a}))):delete e.peerDependenciesMeta,this.resolutions.length>0?e.resolutions=Object.assign({},...this.resolutions.map(({pattern:o,reference:a})=>({[nI(o)]:a}))):delete e.resolutions,this.files!==null?e.files=Array.from(this.files):delete e.files,this.preferUnplugged!==null?e.preferUnplugged=this.preferUnplugged:delete e.preferUnplugged,this.scripts!==null&&this.scripts.size>0){(s=e.scripts)!=null||(e.scripts={});for(let o of Object.keys(e.scripts))this.scripts.has(o)||delete e.scripts[o];for(let[o,a]of this.scripts.entries())e.scripts[o]=a}else delete e.scripts;return e}},At=ol;At.fileName="package.json",At.allDependencies=["dependencies","devDependencies","peerDependencies"],At.hardDependencies=["dependencies","devDependencies"];function E8(t){let e=t.match(/^[ \t]+/m);return e?e[0]:" "}function I8(t){return t.charCodeAt(0)===65279?t.slice(1):t}function un(t){return t.replace(/\\/g,"/")}function mw(t,{yamlCompatibilityMode:e}){return e?JS(t):typeof t=="undefined"||typeof t=="boolean"?t:null}function y8(t,e){let r=e.search(/[^!]/);if(r===-1)return"invalid";let i=r%2==0?"":"!",n=e.slice(r);return`${i}${t}=${n}`}function fx(t,e){return e.length===1?y8(t,e[0]):`(${e.map(r=>y8(t,r)).join(" | ")})`}var Z8=ge(X8()),$8=ge(require("stream")),e4=ge(require("string_decoder"));var Ake=15,ct=class extends Error{constructor(e,r,i){super(r);this.reportExtra=i;this.reportCode=e}};function lke(t){return typeof t.reportCode!="undefined"}var Ji=class{constructor(){this.reportedInfos=new Set;this.reportedWarnings=new Set;this.reportedErrors=new Set}static progressViaCounter(e){let r=0,i,n=new Promise(l=>{i=l}),s=l=>{let c=i;n=new Promise(u=>{i=u}),r=l,c()},o=(l=0)=>{s(r+1)},a=async function*(){for(;r{r=o}),n=(0,Z8.default)(o=>{let a=r;i=new Promise(l=>{r=l}),e=o,a()},1e3/Ake),s=async function*(){for(;;)await i,yield{title:e}}();return{[Symbol.asyncIterator](){return s},hasProgress:!1,hasTitle:!0,setTitle:n}}async startProgressPromise(e,r){let i=this.reportProgress(e);try{return await r(e)}finally{i.stop()}}startProgressSync(e,r){let i=this.reportProgress(e);try{return r(e)}finally{i.stop()}}reportInfoOnce(e,r,i){var s;let n=i&&i.key?i.key:r;this.reportedInfos.has(n)||(this.reportedInfos.add(n),this.reportInfo(e,r),(s=i==null?void 0:i.reportExtra)==null||s.call(i,this))}reportWarningOnce(e,r,i){var s;let n=i&&i.key?i.key:r;this.reportedWarnings.has(n)||(this.reportedWarnings.add(n),this.reportWarning(e,r),(s=i==null?void 0:i.reportExtra)==null||s.call(i,this))}reportErrorOnce(e,r,i){var s;let n=i&&i.key?i.key:r;this.reportedErrors.has(n)||(this.reportedErrors.add(n),this.reportError(e,r),(s=i==null?void 0:i.reportExtra)==null||s.call(i,this))}reportExceptionOnce(e){lke(e)?this.reportErrorOnce(e.reportCode,e.message,{key:e,reportExtra:e.reportExtra}):this.reportErrorOnce($.EXCEPTION,e.stack||e.message,{key:e})}createStreamReporter(e=null){let r=new $8.PassThrough,i=new e4.StringDecoder,n="";return r.on("data",s=>{let o=i.write(s),a;do if(a=o.indexOf(` -`),a!==-1){let l=n+o.substring(0,a);o=o.substring(a+1),n="",e!==null?this.reportInfo(null,`${e} ${l}`):this.reportInfo(null,l)}while(a!==-1);n+=o}),r.on("end",()=>{let s=i.end();s!==""&&(e!==null?this.reportInfo(null,`${e} ${s}`):this.reportInfo(null,s))}),r}};var wd=class{constructor(e){this.fetchers=e}supports(e,r){return!!this.tryFetcher(e,r)}getLocalPath(e,r){return this.getFetcher(e,r).getLocalPath(e,r)}async fetch(e,r){return await this.getFetcher(e,r).fetch(e,r)}tryFetcher(e,r){let i=this.fetchers.find(n=>n.supports(e,r));return i||null}getFetcher(e,r){let i=this.fetchers.find(n=>n.supports(e,r));if(!i)throw new ct($.FETCHER_NOT_FOUND,`${Bt(r.project.configuration,e)} isn't supported by any available fetcher`);return i}};var Bd=class{constructor(e){this.resolvers=e.filter(r=>r)}supportsDescriptor(e,r){return!!this.tryResolverByDescriptor(e,r)}supportsLocator(e,r){return!!this.tryResolverByLocator(e,r)}shouldPersistResolution(e,r){return this.getResolverByLocator(e,r).shouldPersistResolution(e,r)}bindDescriptor(e,r,i){return this.getResolverByDescriptor(e,i).bindDescriptor(e,r,i)}getResolutionDependencies(e,r){return this.getResolverByDescriptor(e,r).getResolutionDependencies(e,r)}async getCandidates(e,r,i){return await this.getResolverByDescriptor(e,i).getCandidates(e,r,i)}async getSatisfying(e,r,i){return this.getResolverByDescriptor(e,i).getSatisfying(e,r,i)}async resolve(e,r){return await this.getResolverByLocator(e,r).resolve(e,r)}tryResolverByDescriptor(e,r){let i=this.resolvers.find(n=>n.supportsDescriptor(e,r));return i||null}getResolverByDescriptor(e,r){let i=this.resolvers.find(n=>n.supportsDescriptor(e,r));if(!i)throw new Error(`${sr(r.project.configuration,e)} isn't supported by any available resolver`);return i}tryResolverByLocator(e,r){let i=this.resolvers.find(n=>n.supportsLocator(e,r));return i||null}getResolverByLocator(e,r){let i=this.resolvers.find(n=>n.supportsLocator(e,r));if(!i)throw new Error(`${Bt(r.project.configuration,e)} isn't supported by any available resolver`);return i}};var t4=ge(ri());var qg=/^(?!v)[a-z0-9._-]+$/i,dx=class{supportsDescriptor(e,r){return!!(ho(e.range)||qg.test(e.range))}supportsLocator(e,r){return!!(t4.default.valid(e.reference)||qg.test(e.reference))}shouldPersistResolution(e,r){return r.resolver.shouldPersistResolution(this.forwardLocator(e,r),r)}bindDescriptor(e,r,i){return i.resolver.bindDescriptor(this.forwardDescriptor(e,i),r,i)}getResolutionDependencies(e,r){return r.resolver.getResolutionDependencies(this.forwardDescriptor(e,r),r)}async getCandidates(e,r,i){return await i.resolver.getCandidates(this.forwardDescriptor(e,i),r,i)}async getSatisfying(e,r,i){return await i.resolver.getSatisfying(this.forwardDescriptor(e,i),r,i)}async resolve(e,r){let i=await r.resolver.resolve(this.forwardLocator(e,r),r);return cd(i,e)}forwardDescriptor(e,r){return rr(e,`${r.project.configuration.get("defaultProtocol")}${e.range}`)}forwardLocator(e,r){return cn(e,`${r.project.configuration.get("defaultProtocol")}${e.reference}`)}};var bd=class{supports(e){return!!e.reference.startsWith("virtual:")}getLocalPath(e,r){let i=e.reference.indexOf("#");if(i===-1)throw new Error("Invalid virtual package reference");let n=e.reference.slice(i+1),s=cn(e,n);return r.fetcher.getLocalPath(s,r)}async fetch(e,r){let i=e.reference.indexOf("#");if(i===-1)throw new Error("Invalid virtual package reference");let n=e.reference.slice(i+1),s=cn(e,n),o=await r.fetcher.fetch(s,r);return await this.ensureVirtualLink(e,o,r)}getLocatorFilename(e){return jg(e)}async ensureVirtualLink(e,r,i){let n=r.packageFs.getRealPath(),s=i.project.configuration.get("virtualFolder"),o=this.getLocatorFilename(e),a=Wr.makeVirtualPath(s,o,n),l=new Da(a,{baseFs:r.packageFs,pathUtils:x});return ie(N({},r),{packageFs:l})}};var Jg=class{static isVirtualDescriptor(e){return!!e.range.startsWith(Jg.protocol)}static isVirtualLocator(e){return!!e.reference.startsWith(Jg.protocol)}supportsDescriptor(e,r){return Jg.isVirtualDescriptor(e)}supportsLocator(e,r){return Jg.isVirtualLocator(e)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,i){throw new Error('Assertion failed: calling "bindDescriptor" on a virtual descriptor is unsupported')}getResolutionDependencies(e,r){throw new Error('Assertion failed: calling "getResolutionDependencies" on a virtual descriptor is unsupported')}async getCandidates(e,r,i){throw new Error('Assertion failed: calling "getCandidates" on a virtual descriptor is unsupported')}async getSatisfying(e,r,i){throw new Error('Assertion failed: calling "getSatisfying" on a virtual descriptor is unsupported')}async resolve(e,r){throw new Error('Assertion failed: calling "resolve" on a virtual locator is unsupported')}},Ew=Jg;Ew.protocol="virtual:";var Qd=class{supports(e){return!!e.reference.startsWith(oi.protocol)}getLocalPath(e,r){return this.getWorkspace(e,r).cwd}async fetch(e,r){let i=this.getWorkspace(e,r).cwd;return{packageFs:new _t(i),prefixPath:Ke.dot,localPath:i}}getWorkspace(e,r){return r.project.getWorkspaceByCwd(e.reference.slice(oi.protocol.length))}};var Cx={};ft(Cx,{getDefaultGlobalFolder:()=>Ex,getHomeFolder:()=>vd,isFolderInside:()=>Ix});var mx=ge(require("os"));function Ex(){if(process.platform==="win32"){let t=H.toPortablePath(process.env.LOCALAPPDATA||H.join((0,mx.homedir)(),"AppData","Local"));return x.resolve(t,"Yarn/Berry")}if(process.env.XDG_DATA_HOME){let t=H.toPortablePath(process.env.XDG_DATA_HOME);return x.resolve(t,"yarn/berry")}return x.resolve(vd(),".yarn/berry")}function vd(){return H.toPortablePath((0,mx.homedir)()||"/usr/local/share")}function Ix(t,e){let r=x.relative(e,t);return r&&!r.startsWith("..")&&!x.isAbsolute(r)}var Wg={};ft(Wg,{builtinModules:()=>yx,getArchitecture:()=>Sd,getArchitectureName:()=>uke,getArchitectureSet:()=>wx});var r4=ge(require("module"));function yx(){return new Set(r4.default.builtinModules||Object.keys(process.binding("natives")))}function cke(){var i,n,s,o;if(process.platform==="win32")return null;let e=(s=((n=(i=process.report)==null?void 0:i.getReport())!=null?n:{}).sharedObjects)!=null?s:[],r=/\/(?:(ld-linux-|[^/]+-linux-gnu\/)|(libc.musl-|ld-musl-))/;return(o=ed(e,a=>{let l=a.match(r);if(!l)return ed.skip;if(l[1])return"glibc";if(l[2])return"musl";throw new Error("Assertion failed: Expected the libc variant to have been detected")}))!=null?o:null}var Iw,yw;function Sd(){return Iw=Iw!=null?Iw:{os:process.platform,cpu:process.arch,libc:cke()}}function uke(t=Sd()){return t.libc?`${t.os}-${t.cpu}-${t.libc}`:`${t.os}-${t.cpu}`}function wx(){let t=Sd();return yw=yw!=null?yw:{os:[t.os],cpu:[t.cpu],libc:t.libc?[t.libc]:[]}}var gke=new Set(["binFolder","version","flags","profile","gpg","ignoreNode","wrapOutput","home","confDir"]),Bw="yarn_",bx=".yarnrc.yml",Qx="yarn.lock",fke="********",ye;(function(u){u.ANY="ANY",u.BOOLEAN="BOOLEAN",u.ABSOLUTE_PATH="ABSOLUTE_PATH",u.LOCATOR="LOCATOR",u.LOCATOR_LOOSE="LOCATOR_LOOSE",u.NUMBER="NUMBER",u.STRING="STRING",u.SECRET="SECRET",u.SHAPE="SHAPE",u.MAP="MAP"})(ye||(ye={}));var Di=Ye,vx={lastUpdateCheck:{description:"Last timestamp we checked whether new Yarn versions were available",type:ye.STRING,default:null},yarnPath:{description:"Path to the local executable that must be used over the global one",type:ye.ABSOLUTE_PATH,default:null},ignorePath:{description:"If true, the local executable will be ignored when using the global one",type:ye.BOOLEAN,default:!1},ignoreCwd:{description:"If true, the `--cwd` flag will be ignored",type:ye.BOOLEAN,default:!1},cacheKeyOverride:{description:"A global cache key override; used only for test purposes",type:ye.STRING,default:null},globalFolder:{description:"Folder where all system-global files are stored",type:ye.ABSOLUTE_PATH,default:Ex()},cacheFolder:{description:"Folder where the cache files must be written",type:ye.ABSOLUTE_PATH,default:"./.yarn/cache"},compressionLevel:{description:"Zip files compression level, from 0 to 9 or mixed (a variant of 9, which stores some files uncompressed, when compression doesn't yield good results)",type:ye.NUMBER,values:["mixed",0,1,2,3,4,5,6,7,8,9],default:nc},virtualFolder:{description:"Folder where the virtual packages (cf doc) will be mapped on the disk (must be named __virtual__)",type:ye.ABSOLUTE_PATH,default:"./.yarn/__virtual__"},lockfileFilename:{description:"Name of the files where the Yarn dependency tree entries must be stored",type:ye.STRING,default:Qx},installStatePath:{description:"Path of the file where the install state will be persisted",type:ye.ABSOLUTE_PATH,default:"./.yarn/install-state.gz"},immutablePatterns:{description:"Array of glob patterns; files matching them won't be allowed to change during immutable installs",type:ye.STRING,default:[],isArray:!0},rcFilename:{description:"Name of the files where the configuration can be found",type:ye.STRING,default:bw()},enableGlobalCache:{description:"If true, the system-wide cache folder will be used regardless of `cache-folder`",type:ye.BOOLEAN,default:!1},enableColors:{description:"If true, the CLI is allowed to use colors in its output",type:ye.BOOLEAN,default:Ny,defaultText:""},enableHyperlinks:{description:"If true, the CLI is allowed to use hyperlinks in its output",type:ye.BOOLEAN,default:VS,defaultText:""},enableInlineBuilds:{description:"If true, the CLI will print the build output on the command line",type:ye.BOOLEAN,default:ww.isCI,defaultText:""},enableMessageNames:{description:"If true, the CLI will prefix most messages with codes suitable for search engines",type:ye.BOOLEAN,default:!0},enableProgressBars:{description:"If true, the CLI is allowed to show a progress bar for long-running events",type:ye.BOOLEAN,default:!ww.isCI,defaultText:""},enableTimers:{description:"If true, the CLI is allowed to print the time spent executing commands",type:ye.BOOLEAN,default:!0},preferAggregateCacheInfo:{description:"If true, the CLI will only print a one-line report of any cache changes",type:ye.BOOLEAN,default:ww.isCI},preferInteractive:{description:"If true, the CLI will automatically use the interactive mode when called from a TTY",type:ye.BOOLEAN,default:!1},preferTruncatedLines:{description:"If true, the CLI will truncate lines that would go beyond the size of the terminal",type:ye.BOOLEAN,default:!1},progressBarStyle:{description:"Which style of progress bar should be used (only when progress bars are enabled)",type:ye.STRING,default:void 0,defaultText:""},defaultLanguageName:{description:"Default language mode that should be used when a package doesn't offer any insight",type:ye.STRING,default:"node"},defaultProtocol:{description:"Default resolution protocol used when resolving pure semver and tag ranges",type:ye.STRING,default:"npm:"},enableTransparentWorkspaces:{description:"If false, Yarn won't automatically resolve workspace dependencies unless they use the `workspace:` protocol",type:ye.BOOLEAN,default:!0},supportedArchitectures:{description:"Architectures that Yarn will fetch and inject into the resolver",type:ye.SHAPE,properties:{os:{description:"Array of supported process.platform strings, or null to target them all",type:ye.STRING,isArray:!0,isNullable:!0,default:["current"]},cpu:{description:"Array of supported process.arch strings, or null to target them all",type:ye.STRING,isArray:!0,isNullable:!0,default:["current"]},libc:{description:"Array of supported libc libraries, or null to target them all",type:ye.STRING,isArray:!0,isNullable:!0,default:["current"]}}},enableMirror:{description:"If true, the downloaded packages will be retrieved and stored in both the local and global folders",type:ye.BOOLEAN,default:!0},enableNetwork:{description:"If false, the package manager will refuse to use the network if required to",type:ye.BOOLEAN,default:!0},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:ye.STRING,default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:ye.STRING,default:null},unsafeHttpWhitelist:{description:"List of the hostnames for which http queries are allowed (glob patterns are supported)",type:ye.STRING,default:[],isArray:!0},httpTimeout:{description:"Timeout of each http request in milliseconds",type:ye.NUMBER,default:6e4},httpRetry:{description:"Retry times on http failure",type:ye.NUMBER,default:3},networkConcurrency:{description:"Maximal number of concurrent requests",type:ye.NUMBER,default:50},networkSettings:{description:"Network settings per hostname (glob patterns are supported)",type:ye.MAP,valueDefinition:{description:"",type:ye.SHAPE,properties:{caFilePath:{description:"Path to file containing one or multiple Certificate Authority signing certificates",type:ye.ABSOLUTE_PATH,default:null},enableNetwork:{description:"If false, the package manager will refuse to use the network if required to",type:ye.BOOLEAN,default:null},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:ye.STRING,default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:ye.STRING,default:null},httpsKeyFilePath:{description:"Path to file containing private key in PEM format",type:ye.ABSOLUTE_PATH,default:null},httpsCertFilePath:{description:"Path to file containing certificate chain in PEM format",type:ye.ABSOLUTE_PATH,default:null}}}},caFilePath:{description:"A path to a file containing one or multiple Certificate Authority signing certificates",type:ye.ABSOLUTE_PATH,default:null},httpsKeyFilePath:{description:"Path to file containing private key in PEM format",type:ye.ABSOLUTE_PATH,default:null},httpsCertFilePath:{description:"Path to file containing certificate chain in PEM format",type:ye.ABSOLUTE_PATH,default:null},enableStrictSsl:{description:"If false, SSL certificate errors will be ignored",type:ye.BOOLEAN,default:!0},logFilters:{description:"Overrides for log levels",type:ye.SHAPE,isArray:!0,concatenateValues:!0,properties:{code:{description:"Code of the messages covered by this override",type:ye.STRING,default:void 0},text:{description:"Code of the texts covered by this override",type:ye.STRING,default:void 0},pattern:{description:"Code of the patterns covered by this override",type:ye.STRING,default:void 0},level:{description:"Log level override, set to null to remove override",type:ye.STRING,values:Object.values(fo),isNullable:!0,default:void 0}}},enableTelemetry:{description:"If true, telemetry will be periodically sent, following the rules in https://yarnpkg.com/advanced/telemetry",type:ye.BOOLEAN,default:!0},telemetryInterval:{description:"Minimal amount of time between two telemetry uploads, in days",type:ye.NUMBER,default:7},telemetryUserId:{description:"If you desire to tell us which project you are, you can set this field. Completely optional and opt-in.",type:ye.STRING,default:null},enableScripts:{description:"If true, packages are allowed to have install scripts by default",type:ye.BOOLEAN,default:!0},enableStrictSettings:{description:"If true, unknown settings will cause Yarn to abort",type:ye.BOOLEAN,default:!0},enableImmutableCache:{description:"If true, the cache is reputed immutable and actions that would modify it will throw",type:ye.BOOLEAN,default:!1},checksumBehavior:{description:"Enumeration defining what to do when a checksum doesn't match expectations",type:ye.STRING,default:"throw"},packageExtensions:{description:"Map of package corrections to apply on the dependency tree",type:ye.MAP,valueDefinition:{description:"The extension that will be applied to any package whose version matches the specified range",type:ye.SHAPE,properties:{dependencies:{description:"The set of dependencies that must be made available to the current package in order for it to work properly",type:ye.MAP,valueDefinition:{description:"A range",type:ye.STRING}},peerDependencies:{description:"Inherited dependencies - the consumer of the package will be tasked to provide them",type:ye.MAP,valueDefinition:{description:"A semver range",type:ye.STRING}},peerDependenciesMeta:{description:"Extra information related to the dependencies listed in the peerDependencies field",type:ye.MAP,valueDefinition:{description:"The peerDependency meta",type:ye.SHAPE,properties:{optional:{description:"If true, the selected peer dependency will be marked as optional by the package manager and the consumer omitting it won't be reported as an error",type:ye.BOOLEAN,default:!1}}}}}}}};function kx(t,e,r,i,n){if(i.isArray||i.type===ye.ANY&&Array.isArray(r))return Array.isArray(r)?r.map((s,o)=>Sx(t,`${e}[${o}]`,s,i,n)):String(r).split(/,/).map(s=>Sx(t,e,s,i,n));if(Array.isArray(r))throw new Error(`Non-array configuration settings "${e}" cannot be an array`);return Sx(t,e,r,i,n)}function Sx(t,e,r,i,n){var a;switch(i.type){case ye.ANY:return r;case ye.SHAPE:return hke(t,e,r,i,n);case ye.MAP:return pke(t,e,r,i,n)}if(r===null&&!i.isNullable&&i.default!==null)throw new Error(`Non-nullable configuration settings "${e}" cannot be set to null`);if((a=i.values)==null?void 0:a.includes(r))return r;let o=(()=>{if(i.type===ye.BOOLEAN&&typeof r!="string")return rd(r);if(typeof r!="string")throw new Error(`Expected value (${r}) to be a string`);let l=qS(r,{env:process.env});switch(i.type){case ye.ABSOLUTE_PATH:return x.resolve(n,H.toPortablePath(l));case ye.LOCATOR_LOOSE:return Kc(l,!1);case ye.NUMBER:return parseInt(l);case ye.LOCATOR:return Kc(l);case ye.BOOLEAN:return rd(l);default:return l}})();if(i.values&&!i.values.includes(o))throw new Error(`Invalid value, expected one of ${i.values.join(", ")}`);return o}function hke(t,e,r,i,n){if(typeof r!="object"||Array.isArray(r))throw new Pe(`Object configuration settings "${e}" must be an object`);let s=xx(t,i,{ignoreArrays:!0});if(r===null)return s;for(let[o,a]of Object.entries(r)){let l=`${e}.${o}`;if(!i.properties[o])throw new Pe(`Unrecognized configuration settings found: ${e}.${o} - run "yarn config -v" to see the list of settings supported in Yarn`);s.set(o,kx(t,l,a,i.properties[o],n))}return s}function pke(t,e,r,i,n){let s=new Map;if(typeof r!="object"||Array.isArray(r))throw new Pe(`Map configuration settings "${e}" must be an object`);if(r===null)return s;for(let[o,a]of Object.entries(r)){let l=i.normalizeKeys?i.normalizeKeys(o):o,c=`${e}['${l}']`,u=i.valueDefinition;s.set(l,kx(t,c,a,u,n))}return s}function xx(t,e,{ignoreArrays:r=!1}={}){switch(e.type){case ye.SHAPE:{if(e.isArray&&!r)return[];let i=new Map;for(let[n,s]of Object.entries(e.properties))i.set(n,xx(t,s));return i}break;case ye.MAP:return e.isArray&&!r?[]:new Map;case ye.ABSOLUTE_PATH:return e.default===null?null:t.projectCwd===null?x.isAbsolute(e.default)?x.normalize(e.default):e.isNullable?null:void 0:Array.isArray(e.default)?e.default.map(i=>x.resolve(t.projectCwd,i)):x.resolve(t.projectCwd,e.default);default:return e.default}}function Qw(t,e,r){if(e.type===ye.SECRET&&typeof t=="string"&&r.hideSecrets)return fke;if(e.type===ye.ABSOLUTE_PATH&&typeof t=="string"&&r.getNativePaths)return H.fromPortablePath(t);if(e.isArray&&Array.isArray(t)){let i=[];for(let n of t)i.push(Qw(n,e,r));return i}if(e.type===ye.MAP&&t instanceof Map){let i=new Map;for(let[n,s]of t.entries())i.set(n,Qw(s,e.valueDefinition,r));return i}if(e.type===ye.SHAPE&&t instanceof Map){let i=new Map;for(let[n,s]of t.entries()){let o=e.properties[n];i.set(n,Qw(s,o,r))}return i}return t}function dke(){let t={};for(let[e,r]of Object.entries(process.env))e=e.toLowerCase(),!!e.startsWith(Bw)&&(e=(0,i4.default)(e.slice(Bw.length)),t[e]=r);return t}function bw(){let t=`${Bw}rc_filename`;for(let[e,r]of Object.entries(process.env))if(e.toLowerCase()===t&&typeof r=="string")return r;return bx}var al;(function(i){i[i.LOCKFILE=0]="LOCKFILE",i[i.MANIFEST=1]="MANIFEST",i[i.NONE=2]="NONE"})(al||(al={}));var Za=class{constructor(e){this.projectCwd=null;this.plugins=new Map;this.settings=new Map;this.values=new Map;this.sources=new Map;this.invalid=new Map;this.packageExtensions=new Map;this.limits=new Map;this.startingCwd=e}static create(e,r,i){let n=new Za(e);typeof r!="undefined"&&!(r instanceof Map)&&(n.projectCwd=r),n.importSettings(vx);let s=typeof i!="undefined"?i:r instanceof Map?r:new Map;for(let[o,a]of s)n.activatePlugin(o,a);return n}static async find(e,r,{lookup:i=0,strict:n=!0,usePath:s=!1,useRc:o=!0}={}){let a=dke();delete a.rcFilename;let l=await Za.findRcFiles(e),c=await Za.findHomeRcFile();if(c){let b=l.find(S=>S.path===c.path);b?b.strict=!1:l.push(ie(N({},c),{strict:!1}))}let u=({ignoreCwd:b,yarnPath:S,ignorePath:k,lockfileFilename:T})=>({ignoreCwd:b,yarnPath:S,ignorePath:k,lockfileFilename:T}),g=j=>{var Z=j,{ignoreCwd:b,yarnPath:S,ignorePath:k,lockfileFilename:T}=Z,Y=Tr(Z,["ignoreCwd","yarnPath","ignorePath","lockfileFilename"]);return Y},f=new Za(e);f.importSettings(u(vx)),f.useWithSource("",u(a),e,{strict:!1});for(let{path:b,cwd:S,data:k}of l)f.useWithSource(b,u(k),S,{strict:!1});if(s){let b=f.get("yarnPath"),S=f.get("ignorePath");if(b!==null&&!S)return f}let h=f.get("lockfileFilename"),p;switch(i){case 0:p=await Za.findProjectCwd(e,h);break;case 1:p=await Za.findProjectCwd(e,null);break;case 2:K.existsSync(x.join(e,"package.json"))?p=x.resolve(e):p=null;break}f.startingCwd=e,f.projectCwd=p,f.importSettings(g(vx));let m=new Map([["@@core",h8]]),y=b=>"default"in b?b.default:b;if(r!==null){for(let T of r.plugins.keys())m.set(T,y(r.modules.get(T)));let b=new Map;for(let T of yx())b.set(T,()=>Ng(T));for(let[T,Y]of r.modules)b.set(T,()=>Y);let S=new Set,k=async(T,Y)=>{let{factory:j,name:Z}=Ng(T);if(S.has(Z))return;let J=new Map(b),re=A=>{if(J.has(A))return J.get(A)();throw new Pe(`This plugin cannot access the package referenced via ${A} which is neither a builtin, nor an exposed entry`)},ee=await Rg(async()=>y(await j(re)),A=>`${A} (when initializing ${Z}, defined in ${Y})`);b.set(Z,()=>ee),S.add(Z),m.set(Z,ee)};if(a.plugins)for(let T of a.plugins.split(";")){let Y=x.resolve(e,H.toPortablePath(T));await k(Y,"")}for(let{path:T,cwd:Y,data:j}of l)if(!!o&&!!Array.isArray(j.plugins))for(let Z of j.plugins){let J=typeof Z!="string"?Z.path:Z,re=x.resolve(Y,H.toPortablePath(J));await k(re,T)}}for(let[b,S]of m)f.activatePlugin(b,S);f.useWithSource("",g(a),e,{strict:n});for(let{path:b,cwd:S,data:k,strict:T}of l)f.useWithSource(b,g(k),S,{strict:T!=null?T:n});return f.get("enableGlobalCache")&&(f.values.set("cacheFolder",`${f.get("globalFolder")}/cache`),f.sources.set("cacheFolder","")),await f.refreshPackageExtensions(),f}static async findRcFiles(e){let r=bw(),i=[],n=e,s=null;for(;n!==s;){s=n;let o=x.join(s,r);if(K.existsSync(o)){let a=await K.readFilePromise(o,"utf8"),l;try{l=Qi(a)}catch(c){let u="";throw a.match(/^\s+(?!-)[^:]+\s+\S+/m)&&(u=" (in particular, make sure you list the colons after each key name)"),new Pe(`Parse error when loading ${o}; please check it's proper Yaml${u}`)}i.push({path:o,cwd:s,data:l})}n=x.dirname(s)}return i}static async findHomeRcFile(){let e=bw(),r=vd(),i=x.join(r,e);if(K.existsSync(i)){let n=await K.readFilePromise(i,"utf8"),s=Qi(n);return{path:i,cwd:r,data:s}}return null}static async findProjectCwd(e,r){let i=null,n=e,s=null;for(;n!==s;){if(s=n,K.existsSync(x.join(s,"package.json"))&&(i=s),r!==null){if(K.existsSync(x.join(s,r))){i=s;break}}else if(i!==null)break;n=x.dirname(s)}return i}static async updateConfiguration(e,r){let i=bw(),n=x.join(e,i),s=K.existsSync(n)?Qi(await K.readFilePromise(n,"utf8")):{},o=!1,a;if(typeof r=="function"){try{a=r(s)}catch{a=r({})}if(a===s)return}else{a=s;for(let l of Object.keys(r)){let c=s[l],u=r[l],g;if(typeof u=="function")try{g=u(c)}catch{g=u(void 0)}else g=u;c!==g&&(a[l]=g,o=!0)}if(!o)return}await K.changeFilePromise(n,La(a),{automaticNewlines:!0})}static async updateHomeConfiguration(e){let r=vd();return await Za.updateConfiguration(r,e)}activatePlugin(e,r){this.plugins.set(e,r),typeof r.configuration!="undefined"&&this.importSettings(r.configuration)}importSettings(e){for(let[r,i]of Object.entries(e))if(i!=null){if(this.settings.has(r))throw new Error(`Cannot redefine settings "${r}"`);this.settings.set(r,i),this.values.set(r,xx(this,i))}}useWithSource(e,r,i,n){try{this.use(e,r,i,n)}catch(s){throw s.message+=` (in ${et(this,e,Ye.PATH)})`,s}}use(e,r,i,{strict:n=!0,overwrite:s=!1}={}){n=n&&this.get("enableStrictSettings");for(let o of["enableStrictSettings",...Object.keys(r)]){if(typeof r[o]=="undefined"||o==="plugins"||e===""&&gke.has(o))continue;if(o==="rcFilename")throw new Pe(`The rcFilename settings can only be set via ${`${Bw}RC_FILENAME`.toUpperCase()}, not via a rc file`);let l=this.settings.get(o);if(!l){if(n)throw new Pe(`Unrecognized or legacy configuration settings found: ${o} - run "yarn config -v" to see the list of settings supported in Yarn`);this.invalid.set(o,e);continue}if(this.sources.has(o)&&!(s||l.type===ye.MAP||l.isArray&&l.concatenateValues))continue;let c;try{c=kx(this,o,r[o],l,i)}catch(u){throw u.message+=` in ${et(this,e,Ye.PATH)}`,u}if(o==="enableStrictSettings"&&e!==""){n=c;continue}if(l.type===ye.MAP){let u=this.values.get(o);this.values.set(o,new Map(s?[...u,...c]:[...c,...u])),this.sources.set(o,`${this.sources.get(o)}, ${e}`)}else if(l.isArray&&l.concatenateValues){let u=this.values.get(o);this.values.set(o,s?[...u,...c]:[...c,...u]),this.sources.set(o,`${this.sources.get(o)}, ${e}`)}else this.values.set(o,c),this.sources.set(o,e)}}get(e){if(!this.values.has(e))throw new Error(`Invalid configuration key "${e}"`);return this.values.get(e)}getSpecial(e,{hideSecrets:r=!1,getNativePaths:i=!1}){let n=this.get(e),s=this.settings.get(e);if(typeof s=="undefined")throw new Pe(`Couldn't find a configuration settings named "${e}"`);return Qw(n,s,{hideSecrets:r,getNativePaths:i})}getSubprocessStreams(e,{header:r,prefix:i,report:n}){let s,o,a=K.createWriteStream(e);if(this.get("enableInlineBuilds")){let l=n.createStreamReporter(`${i} ${et(this,"STDOUT","green")}`),c=n.createStreamReporter(`${i} ${et(this,"STDERR","red")}`);s=new Bx.PassThrough,s.pipe(l),s.pipe(a),o=new Bx.PassThrough,o.pipe(c),o.pipe(a)}else s=a,o=a,typeof r!="undefined"&&s.write(`${r} -`);return{stdout:s,stderr:o}}makeResolver(){let e=[];for(let r of this.plugins.values())for(let i of r.resolvers||[])e.push(new i);return new Bd([new Ew,new oi,new dx,...e])}makeFetcher(){let e=[];for(let r of this.plugins.values())for(let i of r.fetchers||[])e.push(new i);return new wd([new bd,new Qd,...e])}getLinkers(){let e=[];for(let r of this.plugins.values())for(let i of r.linkers||[])e.push(new i);return e}getSupportedArchitectures(){let e=Sd(),r=this.get("supportedArchitectures"),i=r.get("os");i!==null&&(i=i.map(o=>o==="current"?e.os:o));let n=r.get("cpu");n!==null&&(n=n.map(o=>o==="current"?e.cpu:o));let s=r.get("libc");return s!==null&&(s=qo(s,o=>{var a;return o==="current"?(a=e.libc)!=null?a:qo.skip:o})),{os:i,cpu:n,libc:s}}async refreshPackageExtensions(){this.packageExtensions=new Map;let e=this.packageExtensions,r=(i,n,{userProvided:s=!1}={})=>{if(!ho(i.range))throw new Error("Only semver ranges are allowed as keys for the packageExtensions setting");let o=new At;o.load(n,{yamlCompatibilityMode:!0});let a=Pg(e,i.identHash),l=[];a.push([i.range,l]);let c={status:qi.Inactive,userProvided:s,parentDescriptor:i};for(let u of o.dependencies.values())l.push(ie(N({},c),{type:yi.Dependency,descriptor:u}));for(let u of o.peerDependencies.values())l.push(ie(N({},c),{type:yi.PeerDependency,descriptor:u}));for(let[u,g]of o.peerDependenciesMeta)for(let[f,h]of Object.entries(g))l.push(ie(N({},c),{type:yi.PeerDependencyMeta,selector:u,key:f,value:h}))};await this.triggerHook(i=>i.registerPackageExtensions,this,r);for(let[i,n]of this.get("packageExtensions"))r(sl(i,!0),Fy(n),{userProvided:!0})}normalizePackage(e){let r=ud(e);if(this.packageExtensions==null)throw new Error("refreshPackageExtensions has to be called before normalizing packages");let i=this.packageExtensions.get(e.identHash);if(typeof i!="undefined"){let s=e.version;if(s!==null){for(let[o,a]of i)if(!!Uc(s,o))for(let l of a)switch(l.status===qi.Inactive&&(l.status=qi.Redundant),l.type){case yi.Dependency:typeof r.dependencies.get(l.descriptor.identHash)=="undefined"&&(l.status=qi.Active,r.dependencies.set(l.descriptor.identHash,l.descriptor));break;case yi.PeerDependency:typeof r.peerDependencies.get(l.descriptor.identHash)=="undefined"&&(l.status=qi.Active,r.peerDependencies.set(l.descriptor.identHash,l.descriptor));break;case yi.PeerDependencyMeta:{let c=r.peerDependenciesMeta.get(l.selector);(typeof c=="undefined"||!Object.prototype.hasOwnProperty.call(c,l.key)||c[l.key]!==l.value)&&(l.status=qi.Active,Ja(r.peerDependenciesMeta,l.selector,()=>({}))[l.key]=l.value)}break;default:GS(l);break}}}let n=s=>s.scope?`${s.scope}__${s.name}`:`${s.name}`;for(let s of r.peerDependenciesMeta.keys()){let o=An(s);r.peerDependencies.has(o.identHash)||r.peerDependencies.set(o.identHash,rr(o,"*"))}for(let s of r.peerDependencies.values()){if(s.scope==="types")continue;let o=n(s),a=Vo("types",o),l=Ot(a);r.peerDependencies.has(a.identHash)||r.peerDependenciesMeta.has(l)||(r.peerDependencies.set(a.identHash,rr(a,"*")),r.peerDependenciesMeta.set(l,{optional:!0}))}return r.dependencies=new Map(xn(r.dependencies,([,s])=>Pn(s))),r.peerDependencies=new Map(xn(r.peerDependencies,([,s])=>Pn(s))),r}getLimit(e){return Ja(this.limits,e,()=>(0,n4.default)(this.get(e)))}async triggerHook(e,...r){for(let i of this.plugins.values()){let n=i.hooks;if(!n)continue;let s=e(n);!s||await s(...r)}}async triggerMultipleHooks(e,r){for(let i of r)await this.triggerHook(e,...i)}async reduceHook(e,r,...i){let n=r;for(let s of this.plugins.values()){let o=s.hooks;if(!o)continue;let a=e(o);!a||(n=await a(n,...i))}return n}async firstHook(e,...r){for(let i of this.plugins.values()){let n=i.hooks;if(!n)continue;let s=e(n);if(!s)continue;let o=await s(...r);if(typeof o!="undefined")return o}return null}},we=Za;we.telemetry=null;var ns;(function(i){i[i.Never=0]="Never",i[i.ErrorCode=1]="ErrorCode",i[i.Always=2]="Always"})(ns||(ns={}));var vw=class extends ct{constructor({fileName:e,code:r,signal:i}){let n=we.create(x.cwd()),s=et(n,e,Ye.PATH);super($.EXCEPTION,`Child ${s} reported an error`,o=>{Cke(r,i,{configuration:n,report:o})});this.code=Dx(r,i)}},Rx=class extends vw{constructor({fileName:e,code:r,signal:i,stdout:n,stderr:s}){super({fileName:e,code:r,signal:i});this.stdout=n,this.stderr=s}};function jc(t){return t!==null&&typeof t.fd=="number"}var Yc=new Set;function Fx(){}function Nx(){for(let t of Yc)t.kill()}async function $o(t,e,{cwd:r,env:i=process.env,strict:n=!1,stdin:s=null,stdout:o,stderr:a,end:l=2}){let c=["pipe","pipe","pipe"];s===null?c[0]="ignore":jc(s)&&(c[0]=s),jc(o)&&(c[1]=o),jc(a)&&(c[2]=a);let u=(0,Px.default)(t,e,{cwd:H.fromPortablePath(r),env:ie(N({},i),{PWD:H.fromPortablePath(r)}),stdio:c});Yc.add(u),Yc.size===1&&(process.on("SIGINT",Fx),process.on("SIGTERM",Nx)),!jc(s)&&s!==null&&s.pipe(u.stdin),jc(o)||u.stdout.pipe(o,{end:!1}),jc(a)||u.stderr.pipe(a,{end:!1});let g=()=>{for(let f of new Set([o,a]))jc(f)||f.end()};return new Promise((f,h)=>{u.on("error",p=>{Yc.delete(u),Yc.size===0&&(process.off("SIGINT",Fx),process.off("SIGTERM",Nx)),(l===2||l===1)&&g(),h(p)}),u.on("close",(p,m)=>{Yc.delete(u),Yc.size===0&&(process.off("SIGINT",Fx),process.off("SIGTERM",Nx)),(l===2||l===1&&p>0)&&g(),p===0||!n?f({code:Dx(p,m)}):h(new vw({fileName:t,code:p,signal:m}))})})}async function mke(t,e,{cwd:r,env:i=process.env,encoding:n="utf8",strict:s=!1}){let o=["ignore","pipe","pipe"],a=[],l=[],c=H.fromPortablePath(r);typeof i.PWD!="undefined"&&(i=ie(N({},i),{PWD:c}));let u=(0,Px.default)(t,e,{cwd:c,env:i,stdio:o});return u.stdout.on("data",g=>{a.push(g)}),u.stderr.on("data",g=>{l.push(g)}),await new Promise((g,f)=>{u.on("error",h=>{let p=we.create(r),m=et(p,t,Ye.PATH);f(new ct($.EXCEPTION,`Process ${m} failed to spawn`,y=>{y.reportError($.EXCEPTION,` ${Jo(p,{label:"Thrown Error",value:go(Ye.NO_HINT,h.message)})}`)}))}),u.on("close",(h,p)=>{let m=n==="buffer"?Buffer.concat(a):Buffer.concat(a).toString(n),y=n==="buffer"?Buffer.concat(l):Buffer.concat(l).toString(n);h===0||!s?g({code:Dx(h,p),stdout:m,stderr:y}):f(new Rx({fileName:t,code:h,signal:p,stdout:m,stderr:y}))})})}var Eke=new Map([["SIGINT",2],["SIGQUIT",3],["SIGKILL",9],["SIGTERM",15]]);function Dx(t,e){let r=Eke.get(e);return typeof r!="undefined"?128+r:t!=null?t:1}function Cke(t,e,{configuration:r,report:i}){i.reportError($.EXCEPTION,` ${Jo(r,t!==null?{label:"Exit Code",value:go(Ye.NUMBER,t)}:{label:"Exit Signal",value:go(Ye.CODE,e)})}`)}var ir={};ft(ir,{Method:()=>fl,RequestError:()=>j5.RequestError,del:()=>DDe,get:()=>xDe,getNetworkSettings:()=>W5,post:()=>$P,put:()=>PDe,request:()=>Md});var U5=ge(Yw()),H5=ge(require("https")),G5=ge(require("http")),VP=ge(rs()),XP=ge(K5()),qw=ge(require("url"));var j5=ge(Yw()),Y5=new Map,q5=new Map,QDe=new G5.Agent({keepAlive:!0}),vDe=new H5.Agent({keepAlive:!0});function J5(t){let e=new qw.URL(t),r={host:e.hostname,headers:{}};return e.port&&(r.port=Number(e.port)),{proxy:r}}async function ZP(t){return Ja(q5,t,()=>K.readFilePromise(t).then(e=>(q5.set(t,e),e)))}function SDe({statusCode:t,statusMessage:e},r){let i=et(r,t,Ye.NUMBER),n=`https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/${t}`;return Lg(r,`${i}${e?` (${e})`:""}`,n)}async function Jw(t,{configuration:e,customErrorMessage:r}){var i,n;try{return await t}catch(s){if(s.name!=="HTTPError")throw s;let o=(n=r==null?void 0:r(s))!=null?n:(i=s.response.body)==null?void 0:i.error;o==null&&(s.message.startsWith("Response code")?o="The remote server failed to provide the requested resource":o=s.message),s instanceof U5.TimeoutError&&s.event==="socket"&&(o+=`(can be increased via ${et(e,"httpTimeout",Ye.SETTING)})`);let a=new ct($.NETWORK_ERROR,o,l=>{s.response&&l.reportError($.NETWORK_ERROR,` ${Jo(e,{label:"Response Code",value:go(Ye.NO_HINT,SDe(s.response,e))})}`),s.request&&(l.reportError($.NETWORK_ERROR,` ${Jo(e,{label:"Request Method",value:go(Ye.NO_HINT,s.request.options.method)})}`),l.reportError($.NETWORK_ERROR,` ${Jo(e,{label:"Request URL",value:go(Ye.URL,s.request.requestUrl)})}`)),s.request.redirects.length>0&&l.reportError($.NETWORK_ERROR,` ${Jo(e,{label:"Request Redirects",value:go(Ye.NO_HINT,ZS(e,s.request.redirects,Ye.URL))})}`),s.request.retryCount===s.request.options.retry.limit&&l.reportError($.NETWORK_ERROR,` ${Jo(e,{label:"Request Retry Count",value:go(Ye.NO_HINT,`${et(e,s.request.retryCount,Ye.NUMBER)} (can be increased via ${et(e,"httpRetry",Ye.SETTING)})`)})}`)});throw a.originalError=s,a}}function W5(t,e){let r=[...e.configuration.get("networkSettings")].sort(([o],[a])=>a.length-o.length),i={enableNetwork:void 0,caFilePath:void 0,httpProxy:void 0,httpsProxy:void 0,httpsKeyFilePath:void 0,httpsCertFilePath:void 0},n=Object.keys(i),s=typeof t=="string"?new qw.URL(t):t;for(let[o,a]of r)if(VP.default.isMatch(s.hostname,o))for(let l of n){let c=a.get(l);c!==null&&typeof i[l]=="undefined"&&(i[l]=c)}for(let o of n)typeof i[o]=="undefined"&&(i[o]=e.configuration.get(o));return i}var fl;(function(n){n.GET="GET",n.PUT="PUT",n.POST="POST",n.DELETE="DELETE"})(fl||(fl={}));async function Md(t,e,{configuration:r,headers:i,jsonRequest:n,jsonResponse:s,method:o=fl.GET}){let a=async()=>await kDe(t,e,{configuration:r,headers:i,jsonRequest:n,jsonResponse:s,method:o});return await(await r.reduceHook(c=>c.wrapNetworkRequest,a,{target:t,body:e,configuration:r,headers:i,jsonRequest:n,jsonResponse:s,method:o}))()}async function xDe(t,n){var s=n,{configuration:e,jsonResponse:r}=s,i=Tr(s,["configuration","jsonResponse"]);let o=Ja(Y5,t,()=>Jw(Md(t,null,N({configuration:e},i)),{configuration:e}).then(a=>(Y5.set(t,a.body),a.body)));return Buffer.isBuffer(o)===!1&&(o=await o),r?JSON.parse(o.toString()):o}async function PDe(t,e,n){var s=n,{customErrorMessage:r}=s,i=Tr(s,["customErrorMessage"]);return(await Jw(Md(t,e,ie(N({},i),{method:fl.PUT})),i)).body}async function $P(t,e,n){var s=n,{customErrorMessage:r}=s,i=Tr(s,["customErrorMessage"]);return(await Jw(Md(t,e,ie(N({},i),{method:fl.POST})),i)).body}async function DDe(t,i){var n=i,{customErrorMessage:e}=n,r=Tr(n,["customErrorMessage"]);return(await Jw(Md(t,null,ie(N({},r),{method:fl.DELETE})),r)).body}async function kDe(t,e,{configuration:r,headers:i,jsonRequest:n,jsonResponse:s,method:o=fl.GET}){let a=typeof t=="string"?new qw.URL(t):t,l=W5(a,{configuration:r});if(l.enableNetwork===!1)throw new Error(`Request to '${a.href}' has been blocked because of your configuration settings`);if(a.protocol==="http:"&&!VP.default.isMatch(a.hostname,r.get("unsafeHttpWhitelist")))throw new Error(`Unsafe http requests must be explicitly whitelisted in your configuration (${a.hostname})`);let u={agent:{http:l.httpProxy?XP.default.httpOverHttp(J5(l.httpProxy)):QDe,https:l.httpsProxy?XP.default.httpsOverHttp(J5(l.httpsProxy)):vDe},headers:i,method:o};u.responseType=s?"json":"buffer",e!==null&&(Buffer.isBuffer(e)||!n&&typeof e=="string"?u.body=e:u.json=e);let g=r.get("httpTimeout"),f=r.get("httpRetry"),h=r.get("enableStrictSsl"),p=l.caFilePath,m=l.httpsCertFilePath,y=l.httpsKeyFilePath,{default:b}=await Promise.resolve().then(()=>ge(Yw())),S=p?await ZP(p):void 0,k=m?await ZP(m):void 0,T=y?await ZP(y):void 0,Y=b.extend(N({timeout:{socket:g},retry:f,https:{rejectUnauthorized:h,certificateAuthority:S,certificate:k,key:T}},u));return r.getLimit("networkConcurrency")(()=>Y(a))}var Zt={};ft(Zt,{PackageManager:()=>hn,detectPackageManager:()=>o6,executePackageAccessibleBinary:()=>u6,executePackageScript:()=>AB,executePackageShellcode:()=>hD,executeWorkspaceAccessibleBinary:()=>VRe,executeWorkspaceLifecycleScript:()=>c6,executeWorkspaceScript:()=>l6,getPackageAccessibleBinaries:()=>lB,getWorkspaceAccessibleBinaries:()=>A6,hasPackageScript:()=>WRe,hasWorkspaceScript:()=>fD,makeScriptEnv:()=>qd,maybeExecuteWorkspaceLifecycleScript:()=>_Re,prepareExternalProject:()=>JRe});var Kd={};ft(Kd,{getLibzipPromise:()=>fn,getLibzipSync:()=>Z5});var X5=ge(_5());var hl=["number","number"],rD;(function(L){L[L.ZIP_ER_OK=0]="ZIP_ER_OK",L[L.ZIP_ER_MULTIDISK=1]="ZIP_ER_MULTIDISK",L[L.ZIP_ER_RENAME=2]="ZIP_ER_RENAME",L[L.ZIP_ER_CLOSE=3]="ZIP_ER_CLOSE",L[L.ZIP_ER_SEEK=4]="ZIP_ER_SEEK",L[L.ZIP_ER_READ=5]="ZIP_ER_READ",L[L.ZIP_ER_WRITE=6]="ZIP_ER_WRITE",L[L.ZIP_ER_CRC=7]="ZIP_ER_CRC",L[L.ZIP_ER_ZIPCLOSED=8]="ZIP_ER_ZIPCLOSED",L[L.ZIP_ER_NOENT=9]="ZIP_ER_NOENT",L[L.ZIP_ER_EXISTS=10]="ZIP_ER_EXISTS",L[L.ZIP_ER_OPEN=11]="ZIP_ER_OPEN",L[L.ZIP_ER_TMPOPEN=12]="ZIP_ER_TMPOPEN",L[L.ZIP_ER_ZLIB=13]="ZIP_ER_ZLIB",L[L.ZIP_ER_MEMORY=14]="ZIP_ER_MEMORY",L[L.ZIP_ER_CHANGED=15]="ZIP_ER_CHANGED",L[L.ZIP_ER_COMPNOTSUPP=16]="ZIP_ER_COMPNOTSUPP",L[L.ZIP_ER_EOF=17]="ZIP_ER_EOF",L[L.ZIP_ER_INVAL=18]="ZIP_ER_INVAL",L[L.ZIP_ER_NOZIP=19]="ZIP_ER_NOZIP",L[L.ZIP_ER_INTERNAL=20]="ZIP_ER_INTERNAL",L[L.ZIP_ER_INCONS=21]="ZIP_ER_INCONS",L[L.ZIP_ER_REMOVE=22]="ZIP_ER_REMOVE",L[L.ZIP_ER_DELETED=23]="ZIP_ER_DELETED",L[L.ZIP_ER_ENCRNOTSUPP=24]="ZIP_ER_ENCRNOTSUPP",L[L.ZIP_ER_RDONLY=25]="ZIP_ER_RDONLY",L[L.ZIP_ER_NOPASSWD=26]="ZIP_ER_NOPASSWD",L[L.ZIP_ER_WRONGPASSWD=27]="ZIP_ER_WRONGPASSWD",L[L.ZIP_ER_OPNOTSUPP=28]="ZIP_ER_OPNOTSUPP",L[L.ZIP_ER_INUSE=29]="ZIP_ER_INUSE",L[L.ZIP_ER_TELL=30]="ZIP_ER_TELL",L[L.ZIP_ER_COMPRESSED_DATA=31]="ZIP_ER_COMPRESSED_DATA"})(rD||(rD={}));var V5=t=>({get HEAP8(){return t.HEAP8},get HEAPU8(){return t.HEAPU8},errors:rD,SEEK_SET:0,SEEK_CUR:1,SEEK_END:2,ZIP_CHECKCONS:4,ZIP_CREATE:1,ZIP_EXCL:2,ZIP_TRUNCATE:8,ZIP_RDONLY:16,ZIP_FL_OVERWRITE:8192,ZIP_FL_COMPRESSED:4,ZIP_OPSYS_DOS:0,ZIP_OPSYS_AMIGA:1,ZIP_OPSYS_OPENVMS:2,ZIP_OPSYS_UNIX:3,ZIP_OPSYS_VM_CMS:4,ZIP_OPSYS_ATARI_ST:5,ZIP_OPSYS_OS_2:6,ZIP_OPSYS_MACINTOSH:7,ZIP_OPSYS_Z_SYSTEM:8,ZIP_OPSYS_CPM:9,ZIP_OPSYS_WINDOWS_NTFS:10,ZIP_OPSYS_MVS:11,ZIP_OPSYS_VSE:12,ZIP_OPSYS_ACORN_RISC:13,ZIP_OPSYS_VFAT:14,ZIP_OPSYS_ALTERNATE_MVS:15,ZIP_OPSYS_BEOS:16,ZIP_OPSYS_TANDEM:17,ZIP_OPSYS_OS_400:18,ZIP_OPSYS_OS_X:19,ZIP_CM_DEFAULT:-1,ZIP_CM_STORE:0,ZIP_CM_DEFLATE:8,uint08S:t._malloc(1),uint16S:t._malloc(2),uint32S:t._malloc(4),uint64S:t._malloc(8),malloc:t._malloc,free:t._free,getValue:t.getValue,open:t.cwrap("zip_open","number",["string","number","number"]),openFromSource:t.cwrap("zip_open_from_source","number",["number","number","number"]),close:t.cwrap("zip_close","number",["number"]),discard:t.cwrap("zip_discard",null,["number"]),getError:t.cwrap("zip_get_error","number",["number"]),getName:t.cwrap("zip_get_name","string",["number","number","number"]),getNumEntries:t.cwrap("zip_get_num_entries","number",["number","number"]),delete:t.cwrap("zip_delete","number",["number","number"]),stat:t.cwrap("zip_stat","number",["number","string","number","number"]),statIndex:t.cwrap("zip_stat_index","number",["number",...hl,"number","number"]),fopen:t.cwrap("zip_fopen","number",["number","string","number"]),fopenIndex:t.cwrap("zip_fopen_index","number",["number",...hl,"number"]),fread:t.cwrap("zip_fread","number",["number","number","number","number"]),fclose:t.cwrap("zip_fclose","number",["number"]),dir:{add:t.cwrap("zip_dir_add","number",["number","string"])},file:{add:t.cwrap("zip_file_add","number",["number","string","number","number"]),getError:t.cwrap("zip_file_get_error","number",["number"]),getExternalAttributes:t.cwrap("zip_file_get_external_attributes","number",["number",...hl,"number","number","number"]),setExternalAttributes:t.cwrap("zip_file_set_external_attributes","number",["number",...hl,"number","number","number"]),setMtime:t.cwrap("zip_file_set_mtime","number",["number",...hl,"number","number"]),setCompression:t.cwrap("zip_set_file_compression","number",["number",...hl,"number","number"])},ext:{countSymlinks:t.cwrap("zip_ext_count_symlinks","number",["number"])},error:{initWithCode:t.cwrap("zip_error_init_with_code",null,["number","number"]),strerror:t.cwrap("zip_error_strerror","string",["number"])},name:{locate:t.cwrap("zip_name_locate","number",["number","string","number"])},source:{fromUnattachedBuffer:t.cwrap("zip_source_buffer_create","number",["number","number","number","number"]),fromBuffer:t.cwrap("zip_source_buffer","number",["number","number",...hl,"number"]),free:t.cwrap("zip_source_free",null,["number"]),keep:t.cwrap("zip_source_keep",null,["number"]),open:t.cwrap("zip_source_open","number",["number"]),close:t.cwrap("zip_source_close","number",["number"]),seek:t.cwrap("zip_source_seek","number",["number",...hl,"number"]),tell:t.cwrap("zip_source_tell","number",["number"]),read:t.cwrap("zip_source_read","number",["number","number","number"]),error:t.cwrap("zip_source_error","number",["number"]),setMtime:t.cwrap("zip_source_set_mtime","number",["number","number"])},struct:{stat:t.cwrap("zipstruct_stat","number",[]),statS:t.cwrap("zipstruct_statS","number",[]),statName:t.cwrap("zipstruct_stat_name","string",["number"]),statIndex:t.cwrap("zipstruct_stat_index","number",["number"]),statSize:t.cwrap("zipstruct_stat_size","number",["number"]),statCompSize:t.cwrap("zipstruct_stat_comp_size","number",["number"]),statCompMethod:t.cwrap("zipstruct_stat_comp_method","number",["number"]),statMtime:t.cwrap("zipstruct_stat_mtime","number",["number"]),statCrc:t.cwrap("zipstruct_stat_crc","number",["number"]),error:t.cwrap("zipstruct_error","number",[]),errorS:t.cwrap("zipstruct_errorS","number",[]),errorCodeZip:t.cwrap("zipstruct_error_code_zip","number",["number"])}});var iD=null;function Z5(){return iD===null&&(iD=V5((0,X5.default)())),iD}async function fn(){return Z5()}var Hd={};ft(Hd,{ShellError:()=>Os,execute:()=>tB,globUtils:()=>zw});var c_=ge(BS()),u_=ge(require("os")),ss=ge(require("stream")),g_=ge(require("util"));var Os=class extends Error{constructor(e){super(e);this.name="ShellError"}};var zw={};ft(zw,{fastGlobOptions:()=>t_,isBraceExpansion:()=>r_,isGlobPattern:()=>RDe,match:()=>FDe,micromatchOptions:()=>Vw});var $5=ge(rw()),e_=ge(require("fs")),_w=ge(rs()),Vw={strictBrackets:!0},t_={onlyDirectories:!1,onlyFiles:!1};function RDe(t){if(!_w.default.scan(t,Vw).isGlob)return!1;try{_w.default.parse(t,Vw)}catch{return!1}return!0}function FDe(t,{cwd:e,baseFs:r}){return(0,$5.default)(t,ie(N({},t_),{cwd:H.fromPortablePath(e),fs:XE(e_.default,new Xh(r))}))}function r_(t){return _w.default.scan(t,Vw).isBrace}var i_=ge(MQ()),ta=ge(require("stream")),n_=ge(require("string_decoder")),Fn;(function(i){i[i.STDIN=0]="STDIN",i[i.STDOUT=1]="STDOUT",i[i.STDERR=2]="STDERR"})(Fn||(Fn={}));var Jc=new Set;function nD(){}function sD(){for(let t of Jc)t.kill()}function s_(t,e,r,i){return n=>{let s=n[0]instanceof ta.Transform?"pipe":n[0],o=n[1]instanceof ta.Transform?"pipe":n[1],a=n[2]instanceof ta.Transform?"pipe":n[2],l=(0,i_.default)(t,e,ie(N({},i),{stdio:[s,o,a]}));return Jc.add(l),Jc.size===1&&(process.on("SIGINT",nD),process.on("SIGTERM",sD)),n[0]instanceof ta.Transform&&n[0].pipe(l.stdin),n[1]instanceof ta.Transform&&l.stdout.pipe(n[1],{end:!1}),n[2]instanceof ta.Transform&&l.stderr.pipe(n[2],{end:!1}),{stdin:l.stdin,promise:new Promise(c=>{l.on("error",u=>{switch(Jc.delete(l),Jc.size===0&&(process.off("SIGINT",nD),process.off("SIGTERM",sD)),u.code){case"ENOENT":n[2].write(`command not found: ${t} -`),c(127);break;case"EACCES":n[2].write(`permission denied: ${t} -`),c(128);break;default:n[2].write(`uncaught error: ${u.message} -`),c(1);break}}),l.on("exit",u=>{Jc.delete(l),Jc.size===0&&(process.off("SIGINT",nD),process.off("SIGTERM",sD)),c(u!==null?u:129)})})}}}function o_(t){return e=>{let r=e[0]==="pipe"?new ta.PassThrough:e[0];return{stdin:r,promise:Promise.resolve().then(()=>t({stdin:r,stdout:e[1],stderr:e[2]}))}}}var Co=class{constructor(e){this.stream=e}close(){}get(){return this.stream}},a_=class{constructor(){this.stream=null}close(){if(this.stream===null)throw new Error("Assertion failed: No stream attached");this.stream.end()}attach(e){this.stream=e}get(){if(this.stream===null)throw new Error("Assertion failed: No stream attached");return this.stream}},Ud=class{constructor(e,r){this.stdin=null;this.stdout=null;this.stderr=null;this.pipe=null;this.ancestor=e,this.implementation=r}static start(e,{stdin:r,stdout:i,stderr:n}){let s=new Ud(null,e);return s.stdin=r,s.stdout=i,s.stderr=n,s}pipeTo(e,r=1){let i=new Ud(this,e),n=new a_;return i.pipe=n,i.stdout=this.stdout,i.stderr=this.stderr,(r&1)==1?this.stdout=n:this.ancestor!==null&&(this.stderr=this.ancestor.stdout),(r&2)==2?this.stderr=n:this.ancestor!==null&&(this.stderr=this.ancestor.stderr),i}async exec(){let e=["ignore","ignore","ignore"];if(this.pipe)e[0]="pipe";else{if(this.stdin===null)throw new Error("Assertion failed: No input stream registered");e[0]=this.stdin.get()}let r;if(this.stdout===null)throw new Error("Assertion failed: No output stream registered");r=this.stdout,e[1]=r.get();let i;if(this.stderr===null)throw new Error("Assertion failed: No error stream registered");i=this.stderr,e[2]=i.get();let n=this.implementation(e);return this.pipe&&this.pipe.attach(n.stdin),await n.promise.then(s=>(r.close(),i.close(),s))}async run(){let e=[];for(let i=this;i;i=i.ancestor)e.push(i.exec());return(await Promise.all(e))[0]}};function Xw(t,e){return Ud.start(t,e)}function A_(t,e=null){let r=new ta.PassThrough,i=new n_.StringDecoder,n="";return r.on("data",s=>{let o=i.write(s),a;do if(a=o.indexOf(` -`),a!==-1){let l=n+o.substring(0,a);o=o.substring(a+1),n="",t(e!==null?`${e} ${l}`:l)}while(a!==-1);n+=o}),r.on("end",()=>{let s=i.end();s!==""&&t(e!==null?`${e} ${s}`:s)}),r}function l_(t,{prefix:e}){return{stdout:A_(r=>t.stdout.write(`${r} -`),t.stdout.isTTY?e:null),stderr:A_(r=>t.stderr.write(`${r} -`),t.stderr.isTTY?e:null)}}var NDe=(0,g_.promisify)(setTimeout);var zi;(function(r){r[r.Readable=1]="Readable",r[r.Writable=2]="Writable"})(zi||(zi={}));function f_(t,e,r){let i=new ss.PassThrough({autoDestroy:!0});switch(t){case Fn.STDIN:(e&1)==1&&r.stdin.pipe(i,{end:!1}),(e&2)==2&&r.stdin instanceof ss.Writable&&i.pipe(r.stdin,{end:!1});break;case Fn.STDOUT:(e&1)==1&&r.stdout.pipe(i,{end:!1}),(e&2)==2&&i.pipe(r.stdout,{end:!1});break;case Fn.STDERR:(e&1)==1&&r.stderr.pipe(i,{end:!1}),(e&2)==2&&i.pipe(r.stderr,{end:!1});break;default:throw new Os(`Bad file descriptor: "${t}"`)}return i}function Zw(t,e={}){let r=N(N({},t),e);return r.environment=N(N({},t.environment),e.environment),r.variables=N(N({},t.variables),e.variables),r}var LDe=new Map([["cd",async([t=(0,u_.homedir)(),...e],r,i)=>{let n=x.resolve(i.cwd,H.toPortablePath(t));if(!(await r.baseFs.statPromise(n).catch(o=>{throw o.code==="ENOENT"?new Os(`cd: no such file or directory: ${t}`):o})).isDirectory())throw new Os(`cd: not a directory: ${t}`);return i.cwd=n,0}],["pwd",async(t,e,r)=>(r.stdout.write(`${H.fromPortablePath(r.cwd)} -`),0)],[":",async(t,e,r)=>0],["true",async(t,e,r)=>0],["false",async(t,e,r)=>1],["exit",async([t,...e],r,i)=>i.exitCode=parseInt(t!=null?t:i.variables["?"],10)],["echo",async(t,e,r)=>(r.stdout.write(`${t.join(" ")} -`),0)],["sleep",async([t],e,r)=>{if(typeof t=="undefined")throw new Os("sleep: missing operand");let i=Number(t);if(Number.isNaN(i))throw new Os(`sleep: invalid time interval '${t}'`);return await NDe(1e3*i,0)}],["__ysh_run_procedure",async(t,e,r)=>{let i=r.procedures[t[0]];return await Xw(i,{stdin:new Co(r.stdin),stdout:new Co(r.stdout),stderr:new Co(r.stderr)}).run()}],["__ysh_set_redirects",async(t,e,r)=>{let i=r.stdin,n=r.stdout,s=r.stderr,o=[],a=[],l=[],c=0;for(;t[c]!=="--";){let g=t[c++],{type:f,fd:h}=JSON.parse(g),p=S=>{switch(h){case null:case 0:o.push(S);break;default:throw new Error(`Unsupported file descriptor: "${h}"`)}},m=S=>{switch(h){case null:case 1:a.push(S);break;case 2:l.push(S);break;default:throw new Error(`Unsupported file descriptor: "${h}"`)}},y=Number(t[c++]),b=c+y;for(let S=c;Se.baseFs.createReadStream(x.resolve(r.cwd,H.toPortablePath(t[S]))));break;case"<<<":p(()=>{let k=new ss.PassThrough;return process.nextTick(()=>{k.write(`${t[S]} -`),k.end()}),k});break;case"<&":p(()=>f_(Number(t[S]),1,r));break;case">":case">>":{let k=x.resolve(r.cwd,H.toPortablePath(t[S]));m(k==="/dev/null"?new ss.Writable({autoDestroy:!0,emitClose:!0,write(T,Y,j){setImmediate(j)}}):e.baseFs.createWriteStream(k,f===">>"?{flags:"a"}:void 0))}break;case">&":m(f_(Number(t[S]),2,r));break;default:throw new Error(`Assertion failed: Unsupported redirection type: "${f}"`)}}if(o.length>0){let g=new ss.PassThrough;i=g;let f=h=>{if(h===o.length)g.end();else{let p=o[h]();p.pipe(g,{end:!1}),p.on("end",()=>{f(h+1)})}};f(0)}if(a.length>0){let g=new ss.PassThrough;n=g;for(let f of a)g.pipe(f)}if(l.length>0){let g=new ss.PassThrough;s=g;for(let f of l)g.pipe(f)}let u=await Xw(Gd(t.slice(c+1),e,r),{stdin:new Co(i),stdout:new Co(n),stderr:new Co(s)}).run();return await Promise.all(a.map(g=>new Promise((f,h)=>{g.on("error",p=>{h(p)}),g.on("close",()=>{f()}),g.end()}))),await Promise.all(l.map(g=>new Promise((f,h)=>{g.on("error",p=>{h(p)}),g.on("close",()=>{f()}),g.end()}))),u}]]);async function TDe(t,e,r){let i=[],n=new ss.PassThrough;return n.on("data",s=>i.push(s)),await $w(t,e,Zw(r,{stdout:n})),Buffer.concat(i).toString().replace(/[\r\n]+$/,"")}async function h_(t,e,r){let i=t.map(async s=>{let o=await nA(s.args,e,r);return{name:s.name,value:o.join(" ")}});return(await Promise.all(i)).reduce((s,o)=>(s[o.name]=o.value,s),{})}function eB(t){return t.match(/[^ \r\n\t]+/g)||[]}async function p_(t,e,r,i,n=i){switch(t.name){case"$":i(String(process.pid));break;case"#":i(String(e.args.length));break;case"@":if(t.quoted)for(let s of e.args)n(s);else for(let s of e.args){let o=eB(s);for(let a=0;a=0&&st+e,subtraction:(t,e)=>t-e,multiplication:(t,e)=>t*e,division:(t,e)=>Math.trunc(t/e)};async function jd(t,e,r){if(t.type==="number"){if(Number.isInteger(t.value))return t.value;throw new Error(`Invalid number: "${t.value}", only integers are allowed`)}else if(t.type==="variable"){let i=[];await p_(ie(N({},t),{quoted:!0}),e,r,s=>i.push(s));let n=Number(i.join(" "));return Number.isNaN(n)?jd({type:"variable",name:i.join(" ")},e,r):jd({type:"number",value:n},e,r)}else return ODe[t.type](await jd(t.left,e,r),await jd(t.right,e,r))}async function nA(t,e,r){let i=new Map,n=[],s=[],o=u=>{s.push(u)},a=()=>{s.length>0&&n.push(s.join("")),s=[]},l=u=>{o(u),a()},c=(u,g,f)=>{let h=JSON.stringify({type:u,fd:g}),p=i.get(h);typeof p=="undefined"&&i.set(h,p=[]),p.push(f)};for(let u of t){let g=!1;switch(u.type){case"redirection":{let f=await nA(u.args,e,r);for(let h of f)c(u.subtype,u.fd,h)}break;case"argument":for(let f of u.segments)switch(f.type){case"text":o(f.text);break;case"glob":o(f.pattern),g=!0;break;case"shell":{let h=await TDe(f.shell,e,r);if(f.quoted)o(h);else{let p=eB(h);for(let m=0;m0){let u=[];for(let[g,f]of i.entries())u.splice(u.length,0,g,String(f.length),...f);n.splice(0,0,"__ysh_set_redirects",...u,"--")}return n}function Gd(t,e,r){e.builtins.has(t[0])||(t=["command",...t]);let i=H.fromPortablePath(r.cwd),n=r.environment;typeof n.PWD!="undefined"&&(n=ie(N({},n),{PWD:i}));let[s,...o]=t;if(s==="command")return s_(o[0],o.slice(1),e,{cwd:i,env:n});let a=e.builtins.get(s);if(typeof a=="undefined")throw new Error(`Assertion failed: A builtin should exist for "${s}"`);return o_(async({stdin:l,stdout:c,stderr:u})=>{let{stdin:g,stdout:f,stderr:h}=r;r.stdin=l,r.stdout=c,r.stderr=u;try{return await a(o,e,r)}finally{r.stdin=g,r.stdout=f,r.stderr=h}})}function MDe(t,e,r){return i=>{let n=new ss.PassThrough,s=$w(t,e,Zw(r,{stdin:n}));return{stdin:n,promise:s}}}function KDe(t,e,r){return i=>{let n=new ss.PassThrough,s=$w(t,e,r);return{stdin:n,promise:s}}}function d_(t,e,r,i){if(e.length===0)return t;{let n;do n=String(Math.random());while(Object.prototype.hasOwnProperty.call(i.procedures,n));return i.procedures=N({},i.procedures),i.procedures[n]=t,Gd([...e,"__ysh_run_procedure",n],r,i)}}async function C_(t,e,r){let i=t,n=null,s=null;for(;i;){let o=i.then?N({},r):r,a;switch(i.type){case"command":{let l=await nA(i.args,e,r),c=await h_(i.envs,e,r);a=i.envs.length?Gd(l,e,Zw(o,{environment:c})):Gd(l,e,o)}break;case"subshell":{let l=await nA(i.args,e,r),c=MDe(i.subshell,e,o);a=d_(c,l,e,o)}break;case"group":{let l=await nA(i.args,e,r),c=KDe(i.group,e,o);a=d_(c,l,e,o)}break;case"envs":{let l=await h_(i.envs,e,r);o.environment=N(N({},o.environment),l),a=Gd(["true"],e,o)}break}if(typeof a=="undefined")throw new Error("Assertion failed: An action should have been generated");if(n===null)s=Xw(a,{stdin:new Co(o.stdin),stdout:new Co(o.stdout),stderr:new Co(o.stderr)});else{if(s===null)throw new Error("Assertion failed: The execution pipeline should have been setup");switch(n){case"|":s=s.pipeTo(a,Fn.STDOUT);break;case"|&":s=s.pipeTo(a,Fn.STDOUT|Fn.STDERR);break}}i.then?(n=i.then.type,i=i.then.chain):i=null}if(s===null)throw new Error("Assertion failed: The execution pipeline should have been setup");return await s.run()}async function UDe(t,e,r,{background:i=!1}={}){function n(s){let o=["#2E86AB","#A23B72","#F18F01","#C73E1D","#CCE2A3"],a=o[s%o.length];return c_.default.hex(a)}if(i){let s=r.nextBackgroundJobIndex++,o=n(s),a=`[${s}]`,l=o(a),{stdout:c,stderr:u}=l_(r,{prefix:l});return r.backgroundJobs.push(C_(t,e,Zw(r,{stdout:c,stderr:u})).catch(g=>u.write(`${g.message} -`)).finally(()=>{r.stdout.isTTY&&r.stdout.write(`Job ${l}, '${o(Xu(t))}' has ended -`)})),0}return await C_(t,e,r)}async function HDe(t,e,r,{background:i=!1}={}){let n,s=a=>{n=a,r.variables["?"]=String(a)},o=async a=>{try{return await UDe(a.chain,e,r,{background:i&&typeof a.then=="undefined"})}catch(l){if(!(l instanceof Os))throw l;return r.stderr.write(`${l.message} -`),1}};for(s(await o(t));t.then;){if(r.exitCode!==null)return r.exitCode;switch(t.then.type){case"&&":n===0&&s(await o(t.then.line));break;case"||":n!==0&&s(await o(t.then.line));break;default:throw new Error(`Assertion failed: Unsupported command type: "${t.then.type}"`)}t=t.then.line}return n}async function $w(t,e,r){let i=r.backgroundJobs;r.backgroundJobs=[];let n=0;for(let{command:s,type:o}of t){if(n=await HDe(s,e,r,{background:o==="&"}),r.exitCode!==null)return r.exitCode;r.variables["?"]=String(n)}return await Promise.all(r.backgroundJobs),r.backgroundJobs=i,n}function m_(t){switch(t.type){case"variable":return t.name==="@"||t.name==="#"||t.name==="*"||Number.isFinite(parseInt(t.name,10))||"defaultValue"in t&&!!t.defaultValue&&t.defaultValue.some(e=>Yd(e))||"alternativeValue"in t&&!!t.alternativeValue&&t.alternativeValue.some(e=>Yd(e));case"arithmetic":return oD(t.arithmetic);case"shell":return aD(t.shell);default:return!1}}function Yd(t){switch(t.type){case"redirection":return t.args.some(e=>Yd(e));case"argument":return t.segments.some(e=>m_(e));default:throw new Error(`Assertion failed: Unsupported argument type: "${t.type}"`)}}function oD(t){switch(t.type){case"variable":return m_(t);case"number":return!1;default:return oD(t.left)||oD(t.right)}}function aD(t){return t.some(({command:e})=>{for(;e;){let r=e.chain;for(;r;){let i;switch(r.type){case"subshell":i=aD(r.subshell);break;case"command":i=r.envs.some(n=>n.args.some(s=>Yd(s)))||r.args.some(n=>Yd(n));break}if(i)return!0;if(!r.then)break;r=r.then.chain}if(!e.then)break;e=e.then.line}return!1})}async function tB(t,e=[],{baseFs:r=new ar,builtins:i={},cwd:n=H.toPortablePath(process.cwd()),env:s=process.env,stdin:o=process.stdin,stdout:a=process.stdout,stderr:l=process.stderr,variables:c={},glob:u=zw}={}){let g={};for(let[p,m]of Object.entries(s))typeof m!="undefined"&&(g[p]=m);let f=new Map(LDe);for(let[p,m]of Object.entries(i))f.set(p,m);o===null&&(o=new ss.PassThrough,o.end());let h=$E(t,u);if(!aD(h)&&h.length>0&&e.length>0){let{command:p}=h[h.length-1];for(;p.then;)p=p.then.line;let m=p.chain;for(;m.then;)m=m.then.chain;m.type==="command"&&(m.args=m.args.concat(e.map(y=>({type:"argument",segments:[{type:"text",text:y}]}))))}return await $w(h,{args:e,baseFs:r,builtins:f,initialStdin:o,initialStdout:a,initialStderr:l,glob:u},{cwd:n,environment:g,exitCode:null,procedures:{},stdin:o,stdout:a,stderr:l,variables:Object.assign({},c,{["?"]:0}),nextBackgroundJobIndex:1,backgroundJobs:[]})}var n6=ge(rB()),s6=ge(lg()),Wc=ge(require("stream"));var $_=ge(Z_()),sB=ge(pc());var e6=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],t6=80,KRe=new Set([$.FETCH_NOT_CACHED,$.UNUSED_CACHE_ENTRY]),URe=5,oB=sB.default.GITHUB_ACTIONS?{start:t=>`::group::${t} -`,end:t=>`::endgroup:: -`}:sB.default.TRAVIS?{start:t=>`travis_fold:start:${t} -`,end:t=>`travis_fold:end:${t} -`}:sB.default.GITLAB?{start:t=>`section_start:${Math.floor(Date.now()/1e3)}:${t.toLowerCase().replace(/\W+/g,"_")}[collapsed=true]\r${t} -`,end:t=>`section_end:${Math.floor(Date.now()/1e3)}:${t.toLowerCase().replace(/\W+/g,"_")}\r`}:null,r6=new Date,HRe=["iTerm.app","Apple_Terminal"].includes(process.env.TERM_PROGRAM)||!!process.env.WT_SESSION,GRe=t=>t,aB=GRe({patrick:{date:[17,3],chars:["\u{1F340}","\u{1F331}"],size:40},simba:{date:[19,7],chars:["\u{1F981}","\u{1F334}"],size:40},jack:{date:[31,10],chars:["\u{1F383}","\u{1F987}"],size:40},hogsfather:{date:[31,12],chars:["\u{1F389}","\u{1F384}"],size:40},default:{chars:["=","-"],size:80}}),jRe=HRe&&Object.keys(aB).find(t=>{let e=aB[t];return!(e.date&&(e.date[0]!==r6.getDate()||e.date[1]!==r6.getMonth()+1))})||"default";function i6(t,{configuration:e,json:r}){if(!e.get("enableMessageNames"))return"";let n=qA(t===null?0:t);return!r&&t===null?et(e,n,"grey"):n}function gD(t,{configuration:e,json:r}){let i=i6(t,{configuration:e,json:r});if(!i||t===null||t===$.UNNAMED)return i;let n=$[t],s=`https://yarnpkg.com/advanced/error-codes#${i}---${n}`.toLowerCase();return Lg(e,i,s)}var Je=class extends Ji{constructor({configuration:e,stdout:r,json:i=!1,includeFooter:n=!0,includeLogs:s=!i,includeInfos:o=s,includeWarnings:a=s,forgettableBufferSize:l=URe,forgettableNames:c=new Set}){super();this.uncommitted=new Set;this.cacheHitCount=0;this.cacheMissCount=0;this.lastCacheMiss=null;this.warningCount=0;this.errorCount=0;this.startTime=Date.now();this.indent=0;this.progress=new Map;this.progressTime=0;this.progressFrame=0;this.progressTimeout=null;this.progressStyle=null;this.progressMaxScaledSize=null;this.forgettableLines=[];if(sd(this,{configuration:e}),this.configuration=e,this.forgettableBufferSize=l,this.forgettableNames=new Set([...c,...KRe]),this.includeFooter=n,this.includeInfos=o,this.includeWarnings=a,this.json=i,this.stdout=r,e.get("enableProgressBars")&&!i&&r.isTTY&&r.columns>22){let u=e.get("progressBarStyle")||jRe;if(!Object.prototype.hasOwnProperty.call(aB,u))throw new Error("Assertion failed: Invalid progress bar style");this.progressStyle=aB[u];let g="\u27A4 YN0000: \u250C ".length,f=Math.max(0,Math.min(r.columns-g,80));this.progressMaxScaledSize=Math.floor(this.progressStyle.size*f/80)}}static async start(e,r){let i=new this(e),n=process.emitWarning;process.emitWarning=(s,o)=>{if(typeof s!="string"){let l=s;s=l.message,o=o!=null?o:l.name}let a=typeof o!="undefined"?`${o}: ${s}`:s;i.reportWarning($.UNNAMED,a)};try{await r(i)}catch(s){i.reportExceptionOnce(s)}finally{await i.finalize(),process.emitWarning=n}return i}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(e){this.cacheHitCount+=1}reportCacheMiss(e,r){this.lastCacheMiss=e,this.cacheMissCount+=1,typeof r!="undefined"&&!this.configuration.get("preferAggregateCacheInfo")&&this.reportInfo($.FETCH_NOT_CACHED,r)}startSectionSync({reportHeader:e,reportFooter:r,skipIfEmpty:i},n){let s={committed:!1,action:()=>{e==null||e()}};i?this.uncommitted.add(s):(s.action(),s.committed=!0);let o=Date.now();try{return n()}catch(a){throw this.reportExceptionOnce(a),a}finally{let a=Date.now();this.uncommitted.delete(s),s.committed&&(r==null||r(a-o))}}async startSectionPromise({reportHeader:e,reportFooter:r,skipIfEmpty:i},n){let s={committed:!1,action:()=>{e==null||e()}};i?this.uncommitted.add(s):(s.action(),s.committed=!0);let o=Date.now();try{return await n()}catch(a){throw this.reportExceptionOnce(a),a}finally{let a=Date.now();this.uncommitted.delete(s),s.committed&&(r==null||r(a-o))}}startTimerImpl(e,r,i){let n=typeof r=="function"?{}:r;return{cb:typeof r=="function"?r:i,reportHeader:()=>{this.reportInfo(null,`\u250C ${e}`),this.indent+=1,oB!==null&&!this.json&&this.includeInfos&&this.stdout.write(oB.start(e))},reportFooter:o=>{this.indent-=1,oB!==null&&!this.json&&this.includeInfos&&this.stdout.write(oB.end(e)),this.configuration.get("enableTimers")&&o>200?this.reportInfo(null,`\u2514 Completed in ${et(this.configuration,o,Ye.DURATION)}`):this.reportInfo(null,"\u2514 Completed")},skipIfEmpty:n.skipIfEmpty}}startTimerSync(e,r,i){let o=this.startTimerImpl(e,r,i),{cb:n}=o,s=Tr(o,["cb"]);return this.startSectionSync(s,n)}async startTimerPromise(e,r,i){let o=this.startTimerImpl(e,r,i),{cb:n}=o,s=Tr(o,["cb"]);return this.startSectionPromise(s,n)}async startCacheReport(e){let r=this.configuration.get("preferAggregateCacheInfo")?{cacheHitCount:this.cacheHitCount,cacheMissCount:this.cacheMissCount}:null;try{return await e()}catch(i){throw this.reportExceptionOnce(i),i}finally{r!==null&&this.reportCacheChanges(r)}}reportSeparator(){this.indent===0?this.writeLineWithForgettableReset(""):this.reportInfo(null,"")}reportInfo(e,r){if(!this.includeInfos)return;this.commit();let i=this.formatNameWithHyperlink(e),n=i?`${i}: `:"",s=`${et(this.configuration,"\u27A4","blueBright")} ${n}${this.formatIndent()}${r}`;if(this.json)this.reportJson({type:"info",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:r});else if(this.forgettableNames.has(e))if(this.forgettableLines.push(s),this.forgettableLines.length>this.forgettableBufferSize){for(;this.forgettableLines.length>this.forgettableBufferSize;)this.forgettableLines.shift();this.writeLines(this.forgettableLines,{truncate:!0})}else this.writeLine(s,{truncate:!0});else this.writeLineWithForgettableReset(s)}reportWarning(e,r){if(this.warningCount+=1,!this.includeWarnings)return;this.commit();let i=this.formatNameWithHyperlink(e),n=i?`${i}: `:"";this.json?this.reportJson({type:"warning",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:r}):this.writeLineWithForgettableReset(`${et(this.configuration,"\u27A4","yellowBright")} ${n}${this.formatIndent()}${r}`)}reportError(e,r){this.errorCount+=1,this.commit();let i=this.formatNameWithHyperlink(e),n=i?`${i}: `:"";this.json?this.reportJson({type:"error",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:r}):this.writeLineWithForgettableReset(`${et(this.configuration,"\u27A4","redBright")} ${n}${this.formatIndent()}${r}`,{truncate:!1})}reportProgress(e){if(this.progressStyle===null)return ie(N({},Promise.resolve()),{stop:()=>{}});if(e.hasProgress&&e.hasTitle)throw new Error("Unimplemented: Progress bars can't have both progress and titles.");let r=!1,i=Promise.resolve().then(async()=>{let s={progress:e.hasProgress?0:void 0,title:e.hasTitle?"":void 0};this.progress.set(e,{definition:s,lastScaledSize:e.hasProgress?-1:void 0,lastTitle:void 0}),this.refreshProgress({delta:-1});for await(let{progress:o,title:a}of e)r||s.progress===o&&s.title===a||(s.progress=o,s.title=a,this.refreshProgress());n()}),n=()=>{r||(r=!0,this.progress.delete(e),this.refreshProgress({delta:1}))};return ie(N({},i),{stop:n})}reportJson(e){this.json&&this.writeLineWithForgettableReset(`${JSON.stringify(e)}`)}async finalize(){if(!this.includeFooter)return;let e="";this.errorCount>0?e="Failed with errors":this.warningCount>0?e="Done with warnings":e="Done";let r=et(this.configuration,Date.now()-this.startTime,Ye.DURATION),i=this.configuration.get("enableTimers")?`${e} in ${r}`:e;this.errorCount>0?this.reportError($.UNNAMED,i):this.warningCount>0?this.reportWarning($.UNNAMED,i):this.reportInfo($.UNNAMED,i)}writeLine(e,{truncate:r}={}){this.clearProgress({clear:!0}),this.stdout.write(`${this.truncate(e,{truncate:r})} -`),this.writeProgress()}writeLineWithForgettableReset(e,{truncate:r}={}){this.forgettableLines=[],this.writeLine(e,{truncate:r})}writeLines(e,{truncate:r}={}){this.clearProgress({delta:e.length});for(let i of e)this.stdout.write(`${this.truncate(i,{truncate:r})} -`);this.writeProgress()}reportCacheChanges({cacheHitCount:e,cacheMissCount:r}){let i=this.cacheHitCount-e,n=this.cacheMissCount-r;if(i===0&&n===0)return;let s="";this.cacheHitCount>1?s+=`${this.cacheHitCount} packages were already cached`:this.cacheHitCount===1?s+=" - one package was already cached":s+="No packages were cached",this.cacheHitCount>0?this.cacheMissCount>1?s+=`, ${this.cacheMissCount} had to be fetched`:this.cacheMissCount===1&&(s+=`, one had to be fetched (${Bt(this.configuration,this.lastCacheMiss)})`):this.cacheMissCount>1?s+=` - ${this.cacheMissCount} packages had to be fetched`:this.cacheMissCount===1&&(s+=` - one package had to be fetched (${Bt(this.configuration,this.lastCacheMiss)})`),this.reportInfo($.FETCH_NOT_CACHED,s)}commit(){let e=this.uncommitted;this.uncommitted=new Set;for(let r of e)r.committed=!0,r.action()}clearProgress({delta:e=0,clear:r=!1}){this.progressStyle!==null&&this.progress.size+e>0&&(this.stdout.write(`[${this.progress.size+e}A`),(e>0||r)&&this.stdout.write(""))}writeProgress(){if(this.progressStyle===null||(this.progressTimeout!==null&&clearTimeout(this.progressTimeout),this.progressTimeout=null,this.progress.size===0))return;let e=Date.now();e-this.progressTime>t6&&(this.progressFrame=(this.progressFrame+1)%e6.length,this.progressTime=e);let r=e6[this.progressFrame];for(let i of this.progress.values()){let n="";if(typeof i.lastScaledSize!="undefined"){let l=this.progressStyle.chars[0].repeat(i.lastScaledSize),c=this.progressStyle.chars[1].repeat(this.progressMaxScaledSize-i.lastScaledSize);n=` ${l}${c}`}let s=this.formatName(null),o=s?`${s}: `:"",a=i.definition.title?` ${i.definition.title}`:"";this.stdout.write(`${et(this.configuration,"\u27A4","blueBright")} ${o}${r}${n}${a} -`)}this.progressTimeout=setTimeout(()=>{this.refreshProgress({force:!0})},t6)}refreshProgress({delta:e=0,force:r=!1}={}){let i=!1,n=!1;if(r||this.progress.size===0)i=!0;else for(let s of this.progress.values()){let o=typeof s.definition.progress!="undefined"?Math.trunc(this.progressMaxScaledSize*s.definition.progress):void 0,a=s.lastScaledSize;s.lastScaledSize=o;let l=s.lastTitle;if(s.lastTitle=s.definition.title,o!==a||(n=l!==s.definition.title)){i=!0;break}}i&&(this.clearProgress({delta:e,clear:n}),this.writeProgress())}truncate(e,{truncate:r}={}){return this.progressStyle===null&&(r=!1),typeof r=="undefined"&&(r=this.configuration.get("preferTruncatedLines")),r&&(e=(0,$_.default)(e,0,this.stdout.columns-1)),e}formatName(e){return i6(e,{configuration:this.configuration,json:this.json})}formatNameWithHyperlink(e){return gD(e,{configuration:this.configuration,json:this.json})}formatIndent(){return"\u2502 ".repeat(this.indent)}};var Kr="3.2.1";var hn;(function(n){n.Yarn1="Yarn Classic",n.Yarn2="Yarn",n.Npm="npm",n.Pnpm="pnpm"})(hn||(hn={}));async function sA(t,e,r,i=[]){if(process.platform==="win32"){let n=`@goto #_undefined_# 2>NUL || @title %COMSPEC% & @setlocal & @"${r}" ${i.map(s=>`"${s.replace('"','""')}"`).join(" ")} %*`;await K.writeFilePromise(x.format({dir:t,name:e,ext:".cmd"}),n)}await K.writeFilePromise(x.join(t,e),`#!/bin/sh -exec "${r}" ${i.map(n=>`'${n.replace(/'/g,`'"'"'`)}'`).join(" ")} "$@" -`,{mode:493})}async function o6(t){let e=await At.tryFind(t);if(e==null?void 0:e.packageManager){let i=fw(e.packageManager);if(i==null?void 0:i.name){let n=`found ${JSON.stringify({packageManager:e.packageManager})} in manifest`,[s]=i.reference.split(".");switch(i.name){case"yarn":return{packageManager:Number(s)===1?hn.Yarn1:hn.Yarn2,reason:n};case"npm":return{packageManager:hn.Npm,reason:n};case"pnpm":return{packageManager:hn.Pnpm,reason:n}}}}let r;try{r=await K.readFilePromise(x.join(t,Pt.lockfile),"utf8")}catch{}return r!==void 0?r.match(/^__metadata:$/m)?{packageManager:hn.Yarn2,reason:'"__metadata" key found in yarn.lock'}:{packageManager:hn.Yarn1,reason:'"__metadata" key not found in yarn.lock, must be a Yarn classic lockfile'}:K.existsSync(x.join(t,"package-lock.json"))?{packageManager:hn.Npm,reason:`found npm's "package-lock.json" lockfile`}:K.existsSync(x.join(t,"pnpm-lock.yaml"))?{packageManager:hn.Pnpm,reason:`found pnpm's "pnpm-lock.yaml" lockfile`}:null}async function qd({project:t,locator:e,binFolder:r,lifecycleScript:i}){var l,c;let n={};for(let[u,g]of Object.entries(process.env))typeof g!="undefined"&&(n[u.toLowerCase()!=="path"?u:"PATH"]=g);let s=H.fromPortablePath(r);n.BERRY_BIN_FOLDER=H.fromPortablePath(s);let o=process.env.COREPACK_ROOT?H.join(process.env.COREPACK_ROOT,"dist/yarn.js"):process.argv[1];if(await Promise.all([sA(r,"node",process.execPath),...Kr!==null?[sA(r,"run",process.execPath,[o,"run"]),sA(r,"yarn",process.execPath,[o]),sA(r,"yarnpkg",process.execPath,[o]),sA(r,"node-gyp",process.execPath,[o,"run","--top-level","node-gyp"])]:[]]),t&&(n.INIT_CWD=H.fromPortablePath(t.configuration.startingCwd),n.PROJECT_CWD=H.fromPortablePath(t.cwd)),n.PATH=n.PATH?`${s}${H.delimiter}${n.PATH}`:`${s}`,n.npm_execpath=`${s}${H.sep}yarn`,n.npm_node_execpath=`${s}${H.sep}node`,e){if(!t)throw new Error("Assertion failed: Missing project");let u=t.tryWorkspaceByLocator(e),g=u?(l=u.manifest.version)!=null?l:"":(c=t.storedPackages.get(e.locatorHash).version)!=null?c:"";n.npm_package_name=Ot(e),n.npm_package_version=g}let a=Kr!==null?`yarn/${Kr}`:`yarn/${Ng("@yarnpkg/core").version}-core`;return n.npm_config_user_agent=`${a} npm/? node/${process.version} ${process.platform} ${process.arch}`,i&&(n.npm_lifecycle_event=i),t&&await t.configuration.triggerHook(u=>u.setupScriptEnvironment,t,n,async(u,g,f)=>await sA(r,Jr(u),g,f)),n}var YRe=2,qRe=(0,s6.default)(YRe);async function JRe(t,e,{configuration:r,report:i,workspace:n=null,locator:s=null}){await qRe(async()=>{await K.mktempPromise(async o=>{let a=x.join(o,"pack.log"),l=null,{stdout:c,stderr:u}=r.getSubprocessStreams(a,{prefix:H.fromPortablePath(t),report:i}),g=s&&Xo(s)?fd(s):s,f=g?Ds(g):"an external project";c.write(`Packing ${f} from sources -`);let h=await o6(t),p;h!==null?(c.write(`Using ${h.packageManager} for bootstrap. Reason: ${h.reason} - -`),p=h.packageManager):(c.write(`No package manager configuration detected; defaulting to Yarn - -`),p=hn.Yarn2),await K.mktempPromise(async m=>{let y=await qd({binFolder:m}),S=new Map([[hn.Yarn1,async()=>{let T=n!==null?["workspace",n]:[],Y=await $o("yarn",["set","version","classic","--only-if-needed"],{cwd:t,env:y,stdin:l,stdout:c,stderr:u,end:ns.ErrorCode});if(Y.code!==0)return Y.code;await K.appendFilePromise(x.join(t,".npmignore"),`/.yarn -`),c.write(` -`),delete y.NODE_ENV;let j=await $o("yarn",["install"],{cwd:t,env:y,stdin:l,stdout:c,stderr:u,end:ns.ErrorCode});if(j.code!==0)return j.code;c.write(` -`);let Z=await $o("yarn",[...T,"pack","--filename",H.fromPortablePath(e)],{cwd:t,env:y,stdin:l,stdout:c,stderr:u});return Z.code!==0?Z.code:0}],[hn.Yarn2,async()=>{let T=n!==null?["workspace",n]:[];y.YARN_ENABLE_INLINE_BUILDS="1";let Y=x.join(t,Pt.lockfile);await K.existsPromise(Y)||await K.writeFilePromise(Y,"");let j=await $o("yarn",[...T,"pack","--install-if-needed","--filename",H.fromPortablePath(e)],{cwd:t,env:y,stdin:l,stdout:c,stderr:u});return j.code!==0?j.code:0}],[hn.Npm,async()=>{if(n!==null){let A=new Wc.PassThrough,oe=Fg(A);A.pipe(c,{end:!1});let le=await $o("npm",["--version"],{cwd:t,env:y,stdin:l,stdout:A,stderr:u,end:ns.Never});if(A.end(),le.code!==0)return c.end(),u.end(),le.code;let X=(await oe).toString().trim();if(!Uc(X,">=7.x")){let O=Vo(null,"npm"),L=rr(O,X),pe=rr(O,">=7.x");throw new Error(`Workspaces aren't supported by ${sr(r,L)}; please upgrade to ${sr(r,pe)} (npm has been detected as the primary package manager for ${et(r,t,Ye.PATH)})`)}}let T=n!==null?["--workspace",n]:[];delete y.npm_config_user_agent,delete y.npm_config_production,delete y.NPM_CONFIG_PRODUCTION,delete y.NODE_ENV;let Y=await $o("npm",["install"],{cwd:t,env:y,stdin:l,stdout:c,stderr:u,end:ns.ErrorCode});if(Y.code!==0)return Y.code;let j=new Wc.PassThrough,Z=Fg(j);j.pipe(c);let J=await $o("npm",["pack","--silent",...T],{cwd:t,env:y,stdin:l,stdout:j,stderr:u});if(J.code!==0)return J.code;let re=(await Z).toString().trim().replace(/^.*\n/s,""),ee=x.resolve(t,H.toPortablePath(re));return await K.renamePromise(ee,e),0}]]).get(p);if(typeof S=="undefined")throw new Error("Assertion failed: Unsupported workflow");let k=await S();if(!(k===0||typeof k=="undefined"))throw K.detachTemp(o),new ct($.PACKAGE_PREPARATION_FAILED,`Packing the package failed (exit code ${k}, logs can be found here: ${et(r,a,Ye.PATH)})`)})})})}async function WRe(t,e,{project:r}){let i=r.tryWorkspaceByLocator(t);if(i!==null)return fD(i,e);let n=r.storedPackages.get(t.locatorHash);if(!n)throw new Error(`Package for ${Bt(r.configuration,t)} not found in the project`);return await Es.openPromise(async s=>{let o=r.configuration,a=r.configuration.getLinkers(),l={project:r,report:new Je({stdout:new Wc.PassThrough,configuration:o})},c=a.find(h=>h.supportsPackage(n,l));if(!c)throw new Error(`The package ${Bt(r.configuration,n)} isn't supported by any of the available linkers`);let u=await c.findPackageLocation(n,l),g=new _t(u,{baseFs:s});return(await At.find(Ke.dot,{baseFs:g})).scripts.has(e)},{libzip:await fn()})}async function AB(t,e,r,{cwd:i,project:n,stdin:s,stdout:o,stderr:a}){return await K.mktempPromise(async l=>{let{manifest:c,env:u,cwd:g}=await a6(t,{project:n,binFolder:l,cwd:i,lifecycleScript:e}),f=c.scripts.get(e);if(typeof f=="undefined")return 1;let h=async()=>await tB(f,r,{cwd:g,env:u,stdin:s,stdout:o,stderr:a});return await(await n.configuration.reduceHook(m=>m.wrapScriptExecution,h,n,t,e,{script:f,args:r,cwd:g,env:u,stdin:s,stdout:o,stderr:a}))()})}async function hD(t,e,r,{cwd:i,project:n,stdin:s,stdout:o,stderr:a}){return await K.mktempPromise(async l=>{let{env:c,cwd:u}=await a6(t,{project:n,binFolder:l,cwd:i});return await tB(e,r,{cwd:u,env:c,stdin:s,stdout:o,stderr:a})})}async function zRe(t,{binFolder:e,cwd:r,lifecycleScript:i}){let n=await qd({project:t.project,locator:t.anchoredLocator,binFolder:e,lifecycleScript:i});return await Promise.all(Array.from(await A6(t),([s,[,o]])=>sA(e,Jr(s),process.execPath,[o]))),typeof r=="undefined"&&(r=x.dirname(await K.realpathPromise(x.join(t.cwd,"package.json")))),{manifest:t.manifest,binFolder:e,env:n,cwd:r}}async function a6(t,{project:e,binFolder:r,cwd:i,lifecycleScript:n}){let s=e.tryWorkspaceByLocator(t);if(s!==null)return zRe(s,{binFolder:r,cwd:i,lifecycleScript:n});let o=e.storedPackages.get(t.locatorHash);if(!o)throw new Error(`Package for ${Bt(e.configuration,t)} not found in the project`);return await Es.openPromise(async a=>{let l=e.configuration,c=e.configuration.getLinkers(),u={project:e,report:new Je({stdout:new Wc.PassThrough,configuration:l})},g=c.find(y=>y.supportsPackage(o,u));if(!g)throw new Error(`The package ${Bt(e.configuration,o)} isn't supported by any of the available linkers`);let f=await qd({project:e,locator:t,binFolder:r,lifecycleScript:n});await Promise.all(Array.from(await lB(t,{project:e}),([y,[,b]])=>sA(r,Jr(y),process.execPath,[b])));let h=await g.findPackageLocation(o,u),p=new _t(h,{baseFs:a}),m=await At.find(Ke.dot,{baseFs:p});return typeof i=="undefined"&&(i=h),{manifest:m,binFolder:r,env:f,cwd:i}},{libzip:await fn()})}async function l6(t,e,r,{cwd:i,stdin:n,stdout:s,stderr:o}){return await AB(t.anchoredLocator,e,r,{cwd:i,project:t.project,stdin:n,stdout:s,stderr:o})}function fD(t,e){return t.manifest.scripts.has(e)}async function c6(t,e,{cwd:r,report:i}){let{configuration:n}=t.project,s=null;await K.mktempPromise(async o=>{let a=x.join(o,`${e}.log`),l=`# This file contains the result of Yarn calling the "${e}" lifecycle script inside a workspace ("${H.fromPortablePath(t.cwd)}") -`,{stdout:c,stderr:u}=n.getSubprocessStreams(a,{report:i,prefix:Bt(n,t.anchoredLocator),header:l});i.reportInfo($.LIFECYCLE_SCRIPT,`Calling the "${e}" lifecycle script`);let g=await l6(t,e,[],{cwd:r,stdin:s,stdout:c,stderr:u});if(c.end(),u.end(),g!==0)throw K.detachTemp(o),new ct($.LIFECYCLE_SCRIPT,`${(0,n6.default)(e)} script failed (exit code ${et(n,g,Ye.NUMBER)}, logs can be found here: ${et(n,a,Ye.PATH)}); run ${et(n,`yarn ${e}`,Ye.CODE)} to investigate`)})}async function _Re(t,e,r){fD(t,e)&&await c6(t,e,r)}async function lB(t,{project:e}){let r=e.configuration,i=new Map,n=e.storedPackages.get(t.locatorHash);if(!n)throw new Error(`Package for ${Bt(r,t)} not found in the project`);let s=new Wc.Writable,o=r.getLinkers(),a={project:e,report:new Je({configuration:r,stdout:s})},l=new Set([t.locatorHash]);for(let u of n.dependencies.values()){let g=e.storedResolutions.get(u.descriptorHash);if(!g)throw new Error(`Assertion failed: The resolution (${sr(r,u)}) should have been registered`);l.add(g)}let c=await Promise.all(Array.from(l,async u=>{let g=e.storedPackages.get(u);if(!g)throw new Error(`Assertion failed: The package (${u}) should have been registered`);if(g.bin.size===0)return qo.skip;let f=o.find(p=>p.supportsPackage(g,a));if(!f)return qo.skip;let h=null;try{h=await f.findPackageLocation(g,a)}catch(p){if(p.code==="LOCATOR_NOT_INSTALLED")return qo.skip;throw p}return{dependency:g,packageLocation:h}}));for(let u of c){if(u===qo.skip)continue;let{dependency:g,packageLocation:f}=u;for(let[h,p]of g.bin)i.set(h,[g,H.fromPortablePath(x.resolve(f,p))])}return i}async function A6(t){return await lB(t.anchoredLocator,{project:t.project})}async function u6(t,e,r,{cwd:i,project:n,stdin:s,stdout:o,stderr:a,nodeArgs:l=[],packageAccessibleBinaries:c}){c!=null||(c=await lB(t,{project:n}));let u=c.get(e);if(!u)throw new Error(`Binary not found (${e}) for ${Bt(n.configuration,t)}`);return await K.mktempPromise(async g=>{let[,f]=u,h=await qd({project:n,locator:t,binFolder:g});await Promise.all(Array.from(c,([m,[,y]])=>sA(h.BERRY_BIN_FOLDER,Jr(m),process.execPath,[y])));let p;try{p=await $o(process.execPath,[...l,f,...r],{cwd:i,env:h,stdin:s,stdout:o,stderr:a})}finally{await K.removePromise(h.BERRY_BIN_FOLDER)}return p.code})}async function VRe(t,e,r,{cwd:i,stdin:n,stdout:s,stderr:o,packageAccessibleBinaries:a}){return await u6(t.anchoredLocator,e,r,{project:t.project,cwd:i,stdin:n,stdout:s,stderr:o,packageAccessibleBinaries:a})}var wi={};ft(wi,{convertToZip:()=>oLe,extractArchiveTo:()=>ALe,makeArchiveFromDirectory:()=>sLe});var i7=ge(require("stream")),n7=ge(X9());var Z9=ge(require("os")),$9=ge(lg()),e7=ge(require("worker_threads")),vl=Symbol("kTaskInfo"),SR=class{constructor(e){this.source=e;this.workers=[];this.limit=(0,$9.default)(Math.max(1,(0,Z9.cpus)().length));this.cleanupInterval=setInterval(()=>{if(this.limit.pendingCount===0&&this.limit.activeCount===0){let r=this.workers.pop();r?r.terminate():clearInterval(this.cleanupInterval)}},5e3).unref()}createWorker(){this.cleanupInterval.refresh();let e=new e7.Worker(this.source,{eval:!0,execArgv:[...process.execArgv,"--unhandled-rejections=strict"]});return e.on("message",r=>{if(!e[vl])throw new Error("Assertion failed: Worker sent a result without having a task assigned");e[vl].resolve(r),e[vl]=null,e.unref(),this.workers.push(e)}),e.on("error",r=>{var i;(i=e[vl])==null||i.reject(r),e[vl]=null}),e.on("exit",r=>{var i;r!==0&&((i=e[vl])==null||i.reject(new Error(`Worker exited with code ${r}`))),e[vl]=null}),e}run(e){return this.limit(()=>{var i;let r=(i=this.workers.pop())!=null?i:this.createWorker();return r.ref(),new Promise((n,s)=>{r[vl]={resolve:n,reject:s},r.postMessage(e)})})}};var s7=ge(r7());async function sLe(t,{baseFs:e=new ar,prefixPath:r=Ke.root,compressionLevel:i,inMemory:n=!1}={}){let s=await fn(),o;if(n)o=new Ai(null,{libzip:s,level:i});else{let l=await K.mktempPromise(),c=x.join(l,"archive.zip");o=new Ai(c,{create:!0,libzip:s,level:i})}let a=x.resolve(Ke.root,r);return await o.copyPromise(a,t,{baseFs:e,stableTime:!0,stableSort:!0}),o}var o7;async function oLe(t,e){let r=await K.mktempPromise(),i=x.join(r,"archive.zip");return o7||(o7=new SR((0,s7.getContent)())),await o7.run({tmpFile:i,tgz:t,opts:e}),new Ai(i,{libzip:await fn(),level:e.compressionLevel})}async function*aLe(t){let e=new n7.default.Parse,r=new i7.PassThrough({objectMode:!0,autoDestroy:!0,emitClose:!0});e.on("entry",i=>{r.write(i)}),e.on("error",i=>{r.destroy(i)}),e.on("close",()=>{r.destroyed||r.end()}),e.end(t);for await(let i of r){let n=i;yield n,n.resume()}}async function ALe(t,e,{stripComponents:r=0,prefixPath:i=Ke.dot}={}){var s,o;function n(a){if(a.path[0]==="/")return!0;let l=a.path.split(/\//g);return!!(l.some(c=>c==="..")||l.length<=r)}for await(let a of aLe(t)){if(n(a))continue;let l=x.normalize(H.toPortablePath(a.path)).replace(/\/$/,"").split(/\//g);if(l.length<=r)continue;let c=l.slice(r).join("/"),u=x.join(i,c),g=420;switch((a.type==="Directory"||(((s=a.mode)!=null?s:0)&73)!=0)&&(g|=73),a.type){case"Directory":e.mkdirpSync(x.dirname(u),{chmod:493,utimes:[Dr.SAFE_TIME,Dr.SAFE_TIME]}),e.mkdirSync(u,{mode:g}),e.utimesSync(u,Dr.SAFE_TIME,Dr.SAFE_TIME);break;case"OldFile":case"File":e.mkdirpSync(x.dirname(u),{chmod:493,utimes:[Dr.SAFE_TIME,Dr.SAFE_TIME]}),e.writeFileSync(u,await Fg(a),{mode:g}),e.utimesSync(u,Dr.SAFE_TIME,Dr.SAFE_TIME);break;case"SymbolicLink":e.mkdirpSync(x.dirname(u),{chmod:493,utimes:[Dr.SAFE_TIME,Dr.SAFE_TIME]}),e.symlinkSync(a.linkpath,u),(o=e.lutimesSync)==null||o.call(e,u,Dr.SAFE_TIME,Dr.SAFE_TIME);break}}return e}var As={};ft(As,{emitList:()=>lLe,emitTree:()=>g7,treeNodeToJson:()=>u7,treeNodeToTreeify:()=>c7});var l7=ge(A7());function c7(t,{configuration:e}){let r={},i=(n,s)=>{let o=Array.isArray(n)?n.entries():Object.entries(n);for(let[a,{label:l,value:c,children:u}]of o){let g=[];typeof l!="undefined"&&g.push(Ty(e,l,Dc.BOLD)),typeof c!="undefined"&&g.push(et(e,c[0],c[1])),g.length===0&&g.push(Ty(e,`${a}`,Dc.BOLD));let f=g.join(": "),h=s[f]={};typeof u!="undefined"&&i(u,h)}};if(typeof t.children=="undefined")throw new Error("The root node must only contain children");return i(t.children,r),r}function u7(t){let e=r=>{var s;if(typeof r.children=="undefined"){if(typeof r.value=="undefined")throw new Error("Assertion failed: Expected a value to be set if the children are missing");return Rc(r.value[0],r.value[1])}let i=Array.isArray(r.children)?r.children.entries():Object.entries((s=r.children)!=null?s:{}),n=Array.isArray(r.children)?[]:{};for(let[o,a]of i)n[o]=e(a);return typeof r.value=="undefined"?n:{value:Rc(r.value[0],r.value[1]),children:n}};return e(t)}function lLe(t,{configuration:e,stdout:r,json:i}){let n=t.map(s=>({value:s}));g7({children:n},{configuration:e,stdout:r,json:i})}function g7(t,{configuration:e,stdout:r,json:i,separators:n=0}){var o;if(i){let a=Array.isArray(t.children)?t.children.values():Object.values((o=t.children)!=null?o:{});for(let l of a)r.write(`${JSON.stringify(u7(l))} -`);return}let s=(0,l7.asTree)(c7(t,{configuration:e}),!1,!1);if(n>=1&&(s=s.replace(/^([├└]─)/gm,`\u2502 -$1`).replace(/^│\n/,"")),n>=2)for(let a=0;a<2;++a)s=s.replace(/^([│ ].{2}[├│ ].{2}[^\n]+\n)(([│ ]).{2}[├└].{2}[^\n]*\n[│ ].{2}[│ ].{2}[├└]─)/gm,`$1$3 \u2502 -$2`).replace(/^│\n/,"");if(n>=3)throw new Error("Only the first two levels are accepted by treeUtils.emitTree");r.write(s)}var f7=ge(require("crypto")),PR=ge(require("fs"));var cLe=8,Nt=class{constructor(e,{configuration:r,immutable:i=r.get("enableImmutableCache"),check:n=!1}){this.markedFiles=new Set;this.mutexes=new Map;this.cacheId=`-${(0,f7.randomBytes)(8).toString("hex")}.tmp`;this.configuration=r,this.cwd=e,this.immutable=i,this.check=n;let s=r.get("cacheKeyOverride");if(s!==null)this.cacheKey=`${s}`;else{let o=r.get("compressionLevel"),a=o!==nc?`c${o}`:"";this.cacheKey=[cLe,a].join("")}}static async find(e,{immutable:r,check:i}={}){let n=new Nt(e.get("cacheFolder"),{configuration:e,immutable:r,check:i});return await n.setup(),n}get mirrorCwd(){if(!this.configuration.get("enableMirror"))return null;let e=`${this.configuration.get("globalFolder")}/cache`;return e!==this.cwd?e:null}getVersionFilename(e){return`${jg(e)}-${this.cacheKey}.zip`}getChecksumFilename(e,r){let n=uLe(r).slice(0,10);return`${jg(e)}-${n}.zip`}getLocatorPath(e,r,i={}){var s;return this.mirrorCwd===null||((s=i.unstablePackages)==null?void 0:s.has(e.locatorHash))?x.resolve(this.cwd,this.getVersionFilename(e)):r===null||DR(r)!==this.cacheKey?null:x.resolve(this.cwd,this.getChecksumFilename(e,r))}getLocatorMirrorPath(e){let r=this.mirrorCwd;return r!==null?x.resolve(r,this.getVersionFilename(e)):null}async setup(){if(!this.configuration.get("enableGlobalCache"))if(this.immutable){if(!await K.existsPromise(this.cwd))throw new ct($.IMMUTABLE_CACHE,"Cache path does not exist.")}else{await K.mkdirPromise(this.cwd,{recursive:!0});let e=x.resolve(this.cwd,".gitignore");await K.changeFilePromise(e,`/.gitignore -*.flock -*.tmp -`)}(this.mirrorCwd||!this.immutable)&&await K.mkdirPromise(this.mirrorCwd||this.cwd,{recursive:!0})}async fetchPackageFromCache(e,r,a){var l=a,{onHit:i,onMiss:n,loader:s}=l,o=Tr(l,["onHit","onMiss","loader"]);var A;let c=this.getLocatorMirrorPath(e),u=new ar,g=()=>{let oe=new Ai(null,{libzip:Y}),le=x.join(Ke.root,gx(e));return oe.mkdirSync(le,{recursive:!0}),oe.writeJsonSync(x.join(le,Pt.manifest),{name:Ot(e),mocked:!0}),oe},f=async(oe,le=null)=>{var O;if(le===null&&((O=o.unstablePackages)==null?void 0:O.has(e.locatorHash)))return null;let X=!o.skipIntegrityCheck||!r?`${this.cacheKey}/${await lw(oe)}`:r;if(le!==null){let L=!o.skipIntegrityCheck||!r?`${this.cacheKey}/${await lw(le)}`:r;if(X!==L)throw new ct($.CACHE_CHECKSUM_MISMATCH,"The remote archive doesn't match the local checksum - has the local cache been corrupted?")}if(r!==null&&X!==r){let L;switch(this.check?L="throw":DR(r)!==DR(X)?L="update":L=this.configuration.get("checksumBehavior"),L){case"ignore":return r;case"update":return X;default:case"throw":throw new ct($.CACHE_CHECKSUM_MISMATCH,"The remote archive doesn't match the expected checksum")}}return X},h=async oe=>{if(!s)throw new Error(`Cache check required but no loader configured for ${Bt(this.configuration,e)}`);let le=await s(),X=le.getRealPath();return le.saveAndClose(),await K.chmodPromise(X,420),await f(oe,X)},p=async()=>{if(c===null||!await K.existsPromise(c)){let oe=await s(),le=oe.getRealPath();return oe.saveAndClose(),{source:"loader",path:le}}return{source:"mirror",path:c}},m=async()=>{if(!s)throw new Error(`Cache entry required but missing for ${Bt(this.configuration,e)}`);if(this.immutable)throw new ct($.IMMUTABLE_CACHE,`Cache entry required but missing for ${Bt(this.configuration,e)}`);let{path:oe,source:le}=await p(),X=await f(oe),O=this.getLocatorPath(e,X,o);if(!O)throw new Error("Assertion failed: Expected the cache path to be available");let L=[];le!=="mirror"&&c!==null&&L.push(async()=>{let Ce=`${c}${this.cacheId}`;await K.copyFilePromise(oe,Ce,PR.default.constants.COPYFILE_FICLONE),await K.chmodPromise(Ce,420),await K.renamePromise(Ce,c)}),(!o.mirrorWriteOnly||c===null)&&L.push(async()=>{let Ce=`${O}${this.cacheId}`;await K.copyFilePromise(oe,Ce,PR.default.constants.COPYFILE_FICLONE),await K.chmodPromise(Ce,420),await K.renamePromise(Ce,O)});let pe=o.mirrorWriteOnly&&c!=null?c:O;return await Promise.all(L.map(Ce=>Ce())),[!1,pe,X]},y=async()=>{let le=(async()=>{var Oe;let X=this.getLocatorPath(e,r,o),O=X!==null?await u.existsPromise(X):!1,L=!!((Oe=o.mockedPackages)==null?void 0:Oe.has(e.locatorHash))&&(!this.check||!O),pe=L||O,Ce=pe?i:n;if(Ce&&Ce(),pe){let te=null,se=X;return L||(te=this.check?await h(se):await f(se)),[L,se,te]}else return m()})();this.mutexes.set(e.locatorHash,le);try{return await le}finally{this.mutexes.delete(e.locatorHash)}};for(let oe;oe=this.mutexes.get(e.locatorHash);)await oe;let[b,S,k]=await y();this.markedFiles.add(S);let T,Y=await fn(),j=b?()=>g():()=>new Ai(S,{baseFs:u,libzip:Y,readOnly:!0}),Z=new Vh(()=>YS(()=>T=j(),oe=>`Failed to open the cache entry for ${Bt(this.configuration,e)}: ${oe}`),x),J=new Da(S,{baseFs:Z,pathUtils:x}),re=()=>{T==null||T.discardAndClose()},ee=((A=o.unstablePackages)==null?void 0:A.has(e.locatorHash))?null:k;return[J,re,ee]}};function DR(t){let e=t.indexOf("/");return e!==-1?t.slice(0,e):null}function uLe(t){let e=t.indexOf("/");return e!==-1?t.slice(e+1):t}var ls;(function(r){r[r.SCRIPT=0]="SCRIPT",r[r.SHELLCODE=1]="SHELLCODE"})(ls||(ls={}));var gA=class extends Ji{constructor({configuration:e,stdout:r,suggestInstall:i=!0}){super();this.errorCount=0;sd(this,{configuration:e}),this.configuration=e,this.stdout=r,this.suggestInstall=i}static async start(e,r){let i=new this(e);try{await r(i)}catch(n){i.reportExceptionOnce(n)}finally{await i.finalize()}return i}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(e){}reportCacheMiss(e){}startSectionSync(e,r){return r()}async startSectionPromise(e,r){return await r()}startTimerSync(e,r,i){return(typeof r=="function"?r:i)()}async startTimerPromise(e,r,i){return await(typeof r=="function"?r:i)()}async startCacheReport(e){return await e()}reportSeparator(){}reportInfo(e,r){}reportWarning(e,r){}reportError(e,r){this.errorCount+=1,this.stdout.write(`${et(this.configuration,"\u27A4","redBright")} ${this.formatNameWithHyperlink(e)}: ${r} -`)}reportProgress(e){let r=Promise.resolve().then(async()=>{for await(let{}of e);}),i=()=>{};return ie(N({},r),{stop:i})}reportJson(e){}async finalize(){this.errorCount>0&&(this.stdout.write(` -`),this.stdout.write(`${et(this.configuration,"\u27A4","redBright")} Errors happened when preparing the environment required to run this command. -`),this.suggestInstall&&this.stdout.write(`${et(this.configuration,"\u27A4","redBright")} This might be caused by packages being missing from the lockfile, in which case running "yarn install" might help. -`))}formatNameWithHyperlink(e){return gD(e,{configuration:this.configuration,json:!1})}};var p0=ge(require("crypto")),n$=ge(V7()),d0=ge(r$()),s$=ge(lg()),o$=ge(ri()),sF=ge(require("util")),oF=ge(require("v8")),aF=ge(require("zlib"));var WKe=[[/^(git(?:\+(?:https|ssh))?:\/\/.*(?:\.git)?)#(.*)$/,(t,e,r,i)=>`${r}#commit=${i}`],[/^https:\/\/((?:[^/]+?)@)?codeload\.github\.com\/([^/]+\/[^/]+)\/tar\.gz\/([0-9a-f]+)$/,(t,e,r="",i,n)=>`https://${r}github.com/${i}.git#commit=${n}`],[/^https:\/\/((?:[^/]+?)@)?github\.com\/([^/]+\/[^/]+?)(?:\.git)?#([0-9a-f]+)$/,(t,e,r="",i,n)=>`https://${r}github.com/${i}.git#commit=${n}`],[/^https?:\/\/[^/]+\/(?:[^/]+\/)*(?:@.+(?:\/|(?:%2f)))?([^/]+)\/(?:-|download)\/\1-[^/]+\.tgz(?:#|$)/,t=>`npm:${t}`],[/^https:\/\/npm\.pkg\.github\.com\/download\/(?:@[^/]+)\/(?:[^/]+)\/(?:[^/]+)\/(?:[0-9a-f]+)(?:#|$)/,t=>`npm:${t}`],[/^https:\/\/npm\.fontawesome\.com\/(?:@[^/]+)\/([^/]+)\/-\/([^/]+)\/\1-\2.tgz(?:#|$)/,t=>`npm:${t}`],[/^https?:\/\/(?:[^\\.]+)\.jfrog\.io\/.*\/(@[^/]+)\/([^/]+)\/-\/\1\/\2-(?:[.\d\w-]+)\.tgz(?:#|$)/,(t,e)=>hw({protocol:"npm:",source:null,selector:t,params:{__archiveUrl:e}})],[/^[^/]+\.tgz#[0-9a-f]+$/,t=>`npm:${t}`]],rF=class{constructor(e){this.resolver=e;this.resolutions=null}async setup(e,{report:r}){let i=x.join(e.cwd,e.configuration.get("lockfileFilename"));if(!K.existsSync(i))return;let n=await K.readFilePromise(i,"utf8"),s=Qi(n);if(Object.prototype.hasOwnProperty.call(s,"__metadata"))return;let o=this.resolutions=new Map;for(let a of Object.keys(s)){let l=dd(a);if(!l){r.reportWarning($.YARN_IMPORT_FAILED,`Failed to parse the string "${a}" into a proper descriptor`);continue}ho(l.range)&&(l=rr(l,`npm:${l.range}`));let{version:c,resolved:u}=s[a];if(!u)continue;let g;for(let[h,p]of WKe){let m=u.match(h);if(m){g=p(c,...m);break}}if(!g){r.reportWarning($.YARN_IMPORT_FAILED,`${sr(e.configuration,l)}: Only some patterns can be imported from legacy lockfiles (not "${u}")`);continue}let f=l;try{let h=Gg(l.range),p=dd(h.selector,!0);p&&(f=p)}catch{}o.set(l.descriptorHash,cn(f,g))}}supportsDescriptor(e,r){return this.resolutions?this.resolutions.has(e.descriptorHash):!1}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){if(!this.resolutions)throw new Error("Assertion failed: The resolution store should have been setup");let n=this.resolutions.get(e.descriptorHash);if(!n)throw new Error("Assertion failed: The resolution should have been registered");return await this.resolver.getCandidates(ax(n),r,i)}async getSatisfying(e,r,i){return null}async resolve(e,r){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}};var iF=class{constructor(e){this.resolver=e}supportsDescriptor(e,r){return!!(r.project.storedResolutions.get(e.descriptorHash)||r.project.originalPackages.has(gw(e).locatorHash))}supportsLocator(e,r){return!!(r.project.originalPackages.has(e.locatorHash)&&!r.project.lockfileNeedsRefresh)}shouldPersistResolution(e,r){throw new Error("The shouldPersistResolution method shouldn't be called on the lockfile resolver, which would always answer yes")}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return this.resolver.getResolutionDependencies(e,r)}async getCandidates(e,r,i){let n=i.project.originalPackages.get(gw(e).locatorHash);if(n)return[n];let s=i.project.storedResolutions.get(e.descriptorHash);if(!s)throw new Error("Expected the resolution to have been successful - resolution not found");if(n=i.project.originalPackages.get(s),!n)throw new Error("Expected the resolution to have been successful - package not found");return[n]}async getSatisfying(e,r,i){return null}async resolve(e,r){let i=r.project.originalPackages.get(e.locatorHash);if(!i)throw new Error("The lockfile resolver isn't meant to resolve packages - they should already have been stored into a cache");return i}};var nF=class{constructor(e){this.resolver=e}supportsDescriptor(e,r){return this.resolver.supportsDescriptor(e,r)}supportsLocator(e,r){return this.resolver.supportsLocator(e,r)}shouldPersistResolution(e,r){return this.resolver.shouldPersistResolution(e,r)}bindDescriptor(e,r,i){return this.resolver.bindDescriptor(e,r,i)}getResolutionDependencies(e,r){return this.resolver.getResolutionDependencies(e,r)}async getCandidates(e,r,i){throw new ct($.MISSING_LOCKFILE_ENTRY,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}async getSatisfying(e,r,i){throw new ct($.MISSING_LOCKFILE_ENTRY,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}async resolve(e,r){throw new ct($.MISSING_LOCKFILE_ENTRY,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}};var pi=class extends Ji{reportCacheHit(e){}reportCacheMiss(e){}startSectionSync(e,r){return r()}async startSectionPromise(e,r){return await r()}startTimerSync(e,r,i){return(typeof r=="function"?r:i)()}async startTimerPromise(e,r,i){return await(typeof r=="function"?r:i)()}async startCacheReport(e){return await e()}reportSeparator(){}reportInfo(e,r){}reportWarning(e,r){}reportError(e,r){}reportProgress(e){let r=Promise.resolve().then(async()=>{for await(let{}of e);}),i=()=>{};return ie(N({},r),{stop:i})}reportJson(e){}async finalize(){}};var i$=ge(sx());var bC=class{constructor(e,{project:r}){this.workspacesCwds=new Set;this.dependencies=new Map;this.project=r,this.cwd=e}async setup(){var s;this.manifest=(s=await At.tryFind(this.cwd))!=null?s:new At,this.relativeCwd=x.relative(this.project.cwd,this.cwd)||Ke.dot;let e=this.manifest.name?this.manifest.name:Vo(null,`${this.computeCandidateName()}-${ln(this.relativeCwd).substring(0,6)}`),r=this.manifest.version?this.manifest.version:"0.0.0";this.locator=cn(e,r),this.anchoredDescriptor=rr(this.locator,`${oi.protocol}${this.relativeCwd}`),this.anchoredLocator=cn(this.locator,`${oi.protocol}${this.relativeCwd}`);let i=this.manifest.workspaceDefinitions.map(({pattern:o})=>o),n=await(0,i$.default)(i,{cwd:H.fromPortablePath(this.cwd),expandDirectories:!1,onlyDirectories:!0,onlyFiles:!1,ignore:["**/node_modules","**/.git","**/.yarn"]});n.sort();for(let o of n){let a=x.resolve(this.cwd,H.toPortablePath(o));K.existsSync(x.join(a,"package.json"))&&this.workspacesCwds.add(a)}}accepts(e){var o;let r=e.indexOf(":"),i=r!==-1?e.slice(0,r+1):null,n=r!==-1?e.slice(r+1):e;if(i===oi.protocol&&x.normalize(n)===this.relativeCwd||i===oi.protocol&&(n==="*"||n==="^"||n==="~"))return!0;let s=ho(n);return s?i===oi.protocol?s.test((o=this.manifest.version)!=null?o:"0.0.0"):this.project.configuration.get("enableTransparentWorkspaces")&&this.manifest.version!==null?s.test(this.manifest.version):!1:!1}computeCandidateName(){return this.cwd===this.project.cwd?"root-workspace":`${x.basename(this.cwd)}`||"unnamed-workspace"}getRecursiveWorkspaceDependencies({dependencies:e=At.hardDependencies}={}){let r=new Set,i=n=>{for(let s of e)for(let o of n.manifest[s].values()){let a=this.project.tryWorkspaceByDescriptor(o);a===null||r.has(a)||(r.add(a),i(a))}};return i(this),r}getRecursiveWorkspaceDependents({dependencies:e=At.hardDependencies}={}){let r=new Set,i=n=>{for(let s of this.project.workspaces)e.some(a=>[...s.manifest[a].values()].some(l=>{let c=this.project.tryWorkspaceByDescriptor(l);return c!==null&&pd(c.anchoredLocator,n.anchoredLocator)}))&&!r.has(s)&&(r.add(s),i(s))};return i(this),r}getRecursiveWorkspaceChildren(){let e=[];for(let r of this.workspacesCwds){let i=this.project.workspacesByCwd.get(r);i&&e.push(i,...i.getRecursiveWorkspaceChildren())}return e}async persistManifest(){let e={};this.manifest.exportTo(e);let r=x.join(this.cwd,At.fileName),i=`${JSON.stringify(e,null,this.manifest.indent)} -`;await K.changeFilePromise(r,i,{automaticNewlines:!0}),this.manifest.raw=e}};var a$=6,zKe=1,_Ke=/ *, */g,A$=/\/$/,VKe=32,XKe=(0,sF.promisify)(aF.default.gzip),ZKe=(0,sF.promisify)(aF.default.gunzip),di;(function(r){r.UpdateLockfile="update-lockfile",r.SkipBuild="skip-build"})(di||(di={}));var AF={restoreInstallersCustomData:["installersCustomData"],restoreResolutions:["accessibleLocators","conditionalLocators","disabledLocators","optionalBuilds","storedDescriptors","storedResolutions","storedPackages","lockFileChecksum"],restoreBuildState:["storedBuildState"]},l$=t=>ln(`${zKe}`,t),ze=class{constructor(e,{configuration:r}){this.resolutionAliases=new Map;this.workspaces=[];this.workspacesByCwd=new Map;this.workspacesByIdent=new Map;this.storedResolutions=new Map;this.storedDescriptors=new Map;this.storedPackages=new Map;this.storedChecksums=new Map;this.storedBuildState=new Map;this.accessibleLocators=new Set;this.conditionalLocators=new Set;this.disabledLocators=new Set;this.originalPackages=new Map;this.optionalBuilds=new Set;this.lockfileNeedsRefresh=!1;this.peerRequirements=new Map;this.installersCustomData=new Map;this.lockFileChecksum=null;this.installStateChecksum=null;this.configuration=r,this.cwd=e}static async find(e,r){var p,m,y;if(!e.projectCwd)throw new Pe(`No project found in ${r}`);let i=e.projectCwd,n=r,s=null;for(;s!==e.projectCwd;){if(s=n,K.existsSync(x.join(s,Pt.manifest))){i=s;break}n=x.dirname(s)}let o=new ze(e.projectCwd,{configuration:e});(p=we.telemetry)==null||p.reportProject(o.cwd),await o.setupResolutions(),await o.setupWorkspaces(),(m=we.telemetry)==null||m.reportWorkspaceCount(o.workspaces.length),(y=we.telemetry)==null||y.reportDependencyCount(o.workspaces.reduce((b,S)=>b+S.manifest.dependencies.size+S.manifest.devDependencies.size,0));let a=o.tryWorkspaceByCwd(i);if(a)return{project:o,workspace:a,locator:a.anchoredLocator};let l=await o.findLocatorForLocation(`${i}/`,{strict:!0});if(l)return{project:o,locator:l,workspace:null};let c=et(e,o.cwd,Ye.PATH),u=et(e,x.relative(o.cwd,i),Ye.PATH),g=`- If ${c} isn't intended to be a project, remove any yarn.lock and/or package.json file there.`,f=`- If ${c} is intended to be a project, it might be that you forgot to list ${u} in its workspace configuration.`,h=`- Finally, if ${c} is fine and you intend ${u} to be treated as a completely separate project (not even a workspace), create an empty yarn.lock file in it.`;throw new Pe(`The nearest package directory (${et(e,i,Ye.PATH)}) doesn't seem to be part of the project declared in ${et(e,o.cwd,Ye.PATH)}. - -${[g,f,h].join(` -`)}`)}async setupResolutions(){var i;this.storedResolutions=new Map,this.storedDescriptors=new Map,this.storedPackages=new Map,this.lockFileChecksum=null;let e=x.join(this.cwd,this.configuration.get("lockfileFilename")),r=this.configuration.get("defaultLanguageName");if(K.existsSync(e)){let n=await K.readFilePromise(e,"utf8");this.lockFileChecksum=l$(n);let s=Qi(n);if(s.__metadata){let o=s.__metadata.version,a=s.__metadata.cacheKey;this.lockfileNeedsRefresh=o0;){let r=e;e=[];for(let i of r){if(this.workspacesByCwd.has(i))continue;let n=await this.addWorkspace(i),s=this.storedPackages.get(n.anchoredLocator.locatorHash);s&&(n.dependencies=s.dependencies);for(let o of n.workspacesCwds)e.push(o)}}}async addWorkspace(e){let r=new bC(e,{project:this});await r.setup();let i=this.workspacesByIdent.get(r.locator.identHash);if(typeof i!="undefined")throw new Error(`Duplicate workspace name ${gi(this.configuration,r.locator)}: ${H.fromPortablePath(e)} conflicts with ${H.fromPortablePath(i.cwd)}`);return this.workspaces.push(r),this.workspacesByCwd.set(e,r),this.workspacesByIdent.set(r.locator.identHash,r),r}get topLevelWorkspace(){return this.getWorkspaceByCwd(this.cwd)}tryWorkspaceByCwd(e){x.isAbsolute(e)||(e=x.resolve(this.cwd,e)),e=x.normalize(e).replace(/\/+$/,"");let r=this.workspacesByCwd.get(e);return r||null}getWorkspaceByCwd(e){let r=this.tryWorkspaceByCwd(e);if(!r)throw new Error(`Workspace not found (${e})`);return r}tryWorkspaceByFilePath(e){let r=null;for(let i of this.workspaces)x.relative(i.cwd,e).startsWith("../")||r&&r.cwd.length>=i.cwd.length||(r=i);return r||null}getWorkspaceByFilePath(e){let r=this.tryWorkspaceByFilePath(e);if(!r)throw new Error(`Workspace not found (${e})`);return r}tryWorkspaceByIdent(e){let r=this.workspacesByIdent.get(e.identHash);return typeof r=="undefined"?null:r}getWorkspaceByIdent(e){let r=this.tryWorkspaceByIdent(e);if(!r)throw new Error(`Workspace not found (${gi(this.configuration,e)})`);return r}tryWorkspaceByDescriptor(e){let r=this.tryWorkspaceByIdent(e);return r===null||(nl(e)&&(e=gd(e)),!r.accepts(e.range))?null:r}getWorkspaceByDescriptor(e){let r=this.tryWorkspaceByDescriptor(e);if(r===null)throw new Error(`Workspace not found (${sr(this.configuration,e)})`);return r}tryWorkspaceByLocator(e){let r=this.tryWorkspaceByIdent(e);return r===null||(Xo(e)&&(e=fd(e)),r.locator.locatorHash!==e.locatorHash&&r.anchoredLocator.locatorHash!==e.locatorHash)?null:r}getWorkspaceByLocator(e){let r=this.tryWorkspaceByLocator(e);if(!r)throw new Error(`Workspace not found (${Bt(this.configuration,e)})`);return r}refreshWorkspaceDependencies(){for(let e of this.workspaces){let r=this.storedPackages.get(e.anchoredLocator.locatorHash);if(!r)throw new Error(`Assertion failed: Expected workspace ${md(this.configuration,e)} (${et(this.configuration,x.join(e.cwd,Pt.manifest),Ye.PATH)}) to have been resolved. Run "yarn install" to update the lockfile`);e.dependencies=new Map(r.dependencies)}}forgetResolution(e){let r=n=>{this.storedResolutions.delete(n),this.storedDescriptors.delete(n)},i=n=>{this.originalPackages.delete(n),this.storedPackages.delete(n),this.accessibleLocators.delete(n)};if("descriptorHash"in e){let n=this.storedResolutions.get(e.descriptorHash);r(e.descriptorHash);let s=new Set(this.storedResolutions.values());typeof n!="undefined"&&!s.has(n)&&i(n)}if("locatorHash"in e){i(e.locatorHash);for(let[n,s]of this.storedResolutions)s===e.locatorHash&&r(n)}}forgetTransientResolutions(){let e=this.configuration.makeResolver();for(let r of this.originalPackages.values()){let i;try{i=e.shouldPersistResolution(r,{project:this,resolver:e})}catch{i=!1}i||this.forgetResolution(r)}}forgetVirtualResolutions(){for(let e of this.storedPackages.values())for(let[r,i]of e.dependencies)nl(i)&&e.dependencies.set(r,gd(i))}getDependencyMeta(e,r){let i={},s=this.topLevelWorkspace.manifest.dependenciesMeta.get(Ot(e));if(!s)return i;let o=s.get(null);if(o&&Object.assign(i,o),r===null||!o$.default.valid(r))return i;for(let[a,l]of s)a!==null&&a===r&&Object.assign(i,l);return i}async findLocatorForLocation(e,{strict:r=!1}={}){let i=new pi,n=this.configuration.getLinkers(),s={project:this,report:i};for(let o of n){let a=await o.findPackageLocator(e,s);if(a){if(r&&(await o.findPackageLocation(a,s)).replace(A$,"")!==e.replace(A$,""))continue;return a}}return null}async resolveEverything(e){if(!this.workspacesByCwd||!this.workspacesByIdent)throw new Error("Workspaces must have been setup before calling this function");this.forgetVirtualResolutions(),e.lockfileOnly||this.forgetTransientResolutions();let r=e.resolver||this.configuration.makeResolver(),i=new rF(r);await i.setup(this,{report:e.report});let n=e.lockfileOnly?[new nF(r)]:[i,r],s=new Bd([new iF(r),...n]),o=this.configuration.makeFetcher(),a=e.lockfileOnly?{project:this,report:e.report,resolver:s}:{project:this,report:e.report,resolver:s,fetchOptions:{project:this,cache:e.cache,checksums:this.storedChecksums,report:e.report,fetcher:o,cacheOptions:{mirrorWriteOnly:!0}}},l=new Map,c=new Map,u=new Map,g=new Map,f=new Map,h=new Map,p=this.topLevelWorkspace.anchoredLocator,m=new Set,y=[],b=wx(),S=this.configuration.getSupportedArchitectures();await e.report.startProgressPromise(Ji.progressViaTitle(),async re=>{let ee=async O=>{let L=await Rg(async()=>await s.resolve(O,a),Oe=>`${Bt(this.configuration,O)}: ${Oe}`);if(!pd(O,L))throw new Error(`Assertion failed: The locator cannot be changed by the resolver (went from ${Bt(this.configuration,O)} to ${Bt(this.configuration,L)})`);g.set(L.locatorHash,L);let pe=this.configuration.normalizePackage(L);for(let[Oe,te]of pe.dependencies){let se=await this.configuration.reduceHook(he=>he.reduceDependency,te,this,pe,te,{resolver:s,resolveOptions:a});if(!hd(te,se))throw new Error("Assertion failed: The descriptor ident cannot be changed through aliases");let be=s.bindDescriptor(se,O,a);pe.dependencies.set(Oe,be)}let Ce=uo([...pe.dependencies.values()].map(Oe=>X(Oe)));return y.push(Ce),Ce.catch(()=>{}),c.set(pe.locatorHash,pe),pe},A=async O=>{let L=f.get(O.locatorHash);if(typeof L!="undefined")return L;let pe=Promise.resolve().then(()=>ee(O));return f.set(O.locatorHash,pe),pe},oe=async(O,L)=>{let pe=await X(L);return l.set(O.descriptorHash,O),u.set(O.descriptorHash,pe.locatorHash),pe},le=async O=>{re.setTitle(sr(this.configuration,O));let L=this.resolutionAliases.get(O.descriptorHash);if(typeof L!="undefined")return oe(O,this.storedDescriptors.get(L));let pe=s.getResolutionDependencies(O,a),Ce=new Map(await uo(pe.map(async se=>{let be=s.bindDescriptor(se,p,a),he=await X(be);return m.add(he.locatorHash),[se.descriptorHash,he]}))),te=(await Rg(async()=>await s.getCandidates(O,Ce,a),se=>`${sr(this.configuration,O)}: ${se}`))[0];if(typeof te=="undefined")throw new Error(`${sr(this.configuration,O)}: No candidates found`);return l.set(O.descriptorHash,O),u.set(O.descriptorHash,te.locatorHash),A(te)},X=O=>{let L=h.get(O.descriptorHash);if(typeof L!="undefined")return L;l.set(O.descriptorHash,O);let pe=Promise.resolve().then(()=>le(O));return h.set(O.descriptorHash,pe),pe};for(let O of this.workspaces){let L=O.anchoredDescriptor;y.push(X(L))}for(;y.length>0;){let O=[...y];y.length=0,await uo(O)}});let k=new Set(this.resolutionAliases.values()),T=new Set(c.keys()),Y=new Set,j=new Map;$Ke({project:this,report:e.report,accessibleLocators:Y,volatileDescriptors:k,optionalBuilds:T,peerRequirements:j,allDescriptors:l,allResolutions:u,allPackages:c});for(let re of m)T.delete(re);for(let re of k)l.delete(re),u.delete(re);let Z=new Set,J=new Set;for(let re of c.values())re.conditions!=null&&(!T.has(re.locatorHash)||(dw(re,S)||(dw(re,b)&&e.report.reportWarningOnce($.GHOST_ARCHITECTURE,`${Bt(this.configuration,re)}: Your current architecture (${process.platform}-${process.arch}) is supported by this package, but is missing from the ${et(this.configuration,"supportedArchitectures",Di.SETTING)} setting`),J.add(re.locatorHash)),Z.add(re.locatorHash)));this.storedResolutions=u,this.storedDescriptors=l,this.storedPackages=c,this.accessibleLocators=Y,this.conditionalLocators=Z,this.disabledLocators=J,this.originalPackages=g,this.optionalBuilds=T,this.peerRequirements=j,this.refreshWorkspaceDependencies()}async fetchEverything({cache:e,report:r,fetcher:i,mode:n}){let s={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators},o=i||this.configuration.makeFetcher(),a={checksums:this.storedChecksums,project:this,cache:e,fetcher:o,report:r,cacheOptions:s},l=Array.from(new Set(xn(this.storedResolutions.values(),[f=>{let h=this.storedPackages.get(f);if(!h)throw new Error("Assertion failed: The locator should have been registered");return Ds(h)}])));n===di.UpdateLockfile&&(l=l.filter(f=>!this.storedChecksums.has(f)));let c=!1,u=Ji.progressViaCounter(l.length);r.reportProgress(u);let g=(0,s$.default)(VKe);if(await r.startCacheReport(async()=>{await uo(l.map(f=>g(async()=>{let h=this.storedPackages.get(f);if(!h)throw new Error("Assertion failed: The locator should have been registered");if(Xo(h))return;let p;try{p=await o.fetch(h,a)}catch(m){m.message=`${Bt(this.configuration,h)}: ${m.message}`,r.reportExceptionOnce(m),c=m;return}p.checksum!=null?this.storedChecksums.set(h.locatorHash,p.checksum):this.storedChecksums.delete(h.locatorHash),p.releaseFs&&p.releaseFs()}).finally(()=>{u.tick()})))}),c)throw c}async linkEverything({cache:e,report:r,fetcher:i,mode:n}){var A,oe,le;let s={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators,skipIntegrityCheck:!0},o=i||this.configuration.makeFetcher(),a={checksums:this.storedChecksums,project:this,cache:e,fetcher:o,report:r,skipIntegrityCheck:!0,cacheOptions:s},l=this.configuration.getLinkers(),c={project:this,report:r},u=new Map(l.map(X=>{let O=X.makeInstaller(c),L=O.getCustomDataKey(),pe=this.installersCustomData.get(L);return typeof pe!="undefined"&&O.attachCustomData(pe),[X,O]})),g=new Map,f=new Map,h=new Map,p=new Map(await uo([...this.accessibleLocators].map(async X=>{let O=this.storedPackages.get(X);if(!O)throw new Error("Assertion failed: The locator should have been registered");return[X,await o.fetch(O,a)]}))),m=[];for(let X of this.accessibleLocators){let O=this.storedPackages.get(X);if(typeof O=="undefined")throw new Error("Assertion failed: The locator should have been registered");let L=p.get(O.locatorHash);if(typeof L=="undefined")throw new Error("Assertion failed: The fetch result should have been registered");let pe=[],Ce=te=>{pe.push(te)},Oe=this.tryWorkspaceByLocator(O);if(Oe!==null){let te=[],{scripts:se}=Oe.manifest;for(let he of["preinstall","install","postinstall"])se.has(he)&&te.push([ls.SCRIPT,he]);try{for(let[he,Fe]of u)if(he.supportsPackage(O,c)&&(await Fe.installPackage(O,L,{holdFetchResult:Ce})).buildDirective!==null)throw new Error("Assertion failed: Linkers can't return build directives for workspaces; this responsibility befalls to the Yarn core")}finally{pe.length===0?(A=L.releaseFs)==null||A.call(L):m.push(uo(pe).catch(()=>{}).then(()=>{var he;(he=L.releaseFs)==null||he.call(L)}))}let be=x.join(L.packageFs.getRealPath(),L.prefixPath);f.set(O.locatorHash,be),!Xo(O)&&te.length>0&&h.set(O.locatorHash,{directives:te,buildLocations:[be]})}else{let te=l.find(he=>he.supportsPackage(O,c));if(!te)throw new ct($.LINKER_NOT_FOUND,`${Bt(this.configuration,O)} isn't supported by any available linker`);let se=u.get(te);if(!se)throw new Error("Assertion failed: The installer should have been registered");let be;try{be=await se.installPackage(O,L,{holdFetchResult:Ce})}finally{pe.length===0?(oe=L.releaseFs)==null||oe.call(L):m.push(uo(pe).then(()=>{}).then(()=>{var he;(he=L.releaseFs)==null||he.call(L)}))}g.set(O.locatorHash,te),f.set(O.locatorHash,be.packageLocation),be.buildDirective&&be.buildDirective.length>0&&be.packageLocation&&h.set(O.locatorHash,{directives:be.buildDirective,buildLocations:[be.packageLocation]})}}let y=new Map;for(let X of this.accessibleLocators){let O=this.storedPackages.get(X);if(!O)throw new Error("Assertion failed: The locator should have been registered");let L=this.tryWorkspaceByLocator(O)!==null,pe=async(Ce,Oe)=>{let te=f.get(O.locatorHash);if(typeof te=="undefined")throw new Error(`Assertion failed: The package (${Bt(this.configuration,O)}) should have been registered`);let se=[];for(let be of O.dependencies.values()){let he=this.storedResolutions.get(be.descriptorHash);if(typeof he=="undefined")throw new Error(`Assertion failed: The resolution (${sr(this.configuration,be)}, from ${Bt(this.configuration,O)})should have been registered`);let Fe=this.storedPackages.get(he);if(typeof Fe=="undefined")throw new Error(`Assertion failed: The package (${he}, resolved from ${sr(this.configuration,be)}) should have been registered`);let Ue=this.tryWorkspaceByLocator(Fe)===null?g.get(he):null;if(typeof Ue=="undefined")throw new Error(`Assertion failed: The package (${he}, resolved from ${sr(this.configuration,be)}) should have been registered`);Ue===Ce||Ue===null?f.get(Fe.locatorHash)!==null&&se.push([be,Fe]):!L&&te!==null&&Pg(y,he).push(te)}te!==null&&await Oe.attachInternalDependencies(O,se)};if(L)for(let[Ce,Oe]of u)Ce.supportsPackage(O,c)&&await pe(Ce,Oe);else{let Ce=g.get(O.locatorHash);if(!Ce)throw new Error("Assertion failed: The linker should have been found");let Oe=u.get(Ce);if(!Oe)throw new Error("Assertion failed: The installer should have been registered");await pe(Ce,Oe)}}for(let[X,O]of y){let L=this.storedPackages.get(X);if(!L)throw new Error("Assertion failed: The package should have been registered");let pe=g.get(L.locatorHash);if(!pe)throw new Error("Assertion failed: The linker should have been found");let Ce=u.get(pe);if(!Ce)throw new Error("Assertion failed: The installer should have been registered");await Ce.attachExternalDependents(L,O)}let b=new Map;for(let X of u.values()){let O=await X.finalizeInstall();for(let L of(le=O==null?void 0:O.records)!=null?le:[])h.set(L.locatorHash,{directives:L.buildDirective,buildLocations:L.buildLocations});typeof(O==null?void 0:O.customData)!="undefined"&&b.set(X.getCustomDataKey(),O.customData)}if(this.installersCustomData=b,await uo(m),n===di.SkipBuild)return;let S=new Set(this.storedPackages.keys()),k=new Set(h.keys());for(let X of k)S.delete(X);let T=(0,p0.createHash)("sha512");T.update(process.versions.node),await this.configuration.triggerHook(X=>X.globalHashGeneration,this,X=>{T.update("\0"),T.update(X)});let Y=T.digest("hex"),j=new Map,Z=X=>{let O=j.get(X.locatorHash);if(typeof O!="undefined")return O;let L=this.storedPackages.get(X.locatorHash);if(typeof L=="undefined")throw new Error("Assertion failed: The package should have been registered");let pe=(0,p0.createHash)("sha512");pe.update(X.locatorHash),j.set(X.locatorHash,"");for(let Ce of L.dependencies.values()){let Oe=this.storedResolutions.get(Ce.descriptorHash);if(typeof Oe=="undefined")throw new Error(`Assertion failed: The resolution (${sr(this.configuration,Ce)}) should have been registered`);let te=this.storedPackages.get(Oe);if(typeof te=="undefined")throw new Error("Assertion failed: The package should have been registered");pe.update(Z(te))}return O=pe.digest("hex"),j.set(X.locatorHash,O),O},J=(X,O)=>{let L=(0,p0.createHash)("sha512");L.update(Y),L.update(Z(X));for(let pe of O)L.update(pe);return L.digest("hex")},re=new Map,ee=!1;for(;k.size>0;){let X=k.size,O=[];for(let L of k){let pe=this.storedPackages.get(L);if(!pe)throw new Error("Assertion failed: The package should have been registered");let Ce=!0;for(let se of pe.dependencies.values()){let be=this.storedResolutions.get(se.descriptorHash);if(!be)throw new Error(`Assertion failed: The resolution (${sr(this.configuration,se)}) should have been registered`);if(k.has(be)){Ce=!1;break}}if(!Ce)continue;k.delete(L);let Oe=h.get(pe.locatorHash);if(!Oe)throw new Error("Assertion failed: The build directive should have been registered");let te=J(pe,Oe.buildLocations);if(this.storedBuildState.get(pe.locatorHash)===te){re.set(pe.locatorHash,te);continue}ee||(await this.persistInstallStateFile(),ee=!0),this.storedBuildState.has(pe.locatorHash)?r.reportInfo($.MUST_REBUILD,`${Bt(this.configuration,pe)} must be rebuilt because its dependency tree changed`):r.reportInfo($.MUST_BUILD,`${Bt(this.configuration,pe)} must be built because it never has been before or the last one failed`);for(let se of Oe.buildLocations){if(!x.isAbsolute(se))throw new Error(`Assertion failed: Expected the build location to be absolute (not ${se})`);O.push((async()=>{for(let[be,he]of Oe.directives){let Fe=`# This file contains the result of Yarn building a package (${Ds(pe)}) -`;switch(be){case ls.SCRIPT:Fe+=`# Script name: ${he} -`;break;case ls.SHELLCODE:Fe+=`# Script code: ${he} -`;break}let Ue=null;if(!await K.mktempPromise(async Se=>{let de=x.join(Se,"build.log"),{stdout:V,stderr:Qe}=this.configuration.getSubprocessStreams(de,{header:Fe,prefix:Bt(this.configuration,pe),report:r}),ce;try{switch(be){case ls.SCRIPT:ce=await AB(pe,he,[],{cwd:se,project:this,stdin:Ue,stdout:V,stderr:Qe});break;case ls.SHELLCODE:ce=await hD(pe,he,[],{cwd:se,project:this,stdin:Ue,stdout:V,stderr:Qe});break}}catch(gt){Qe.write(gt.stack),ce=1}if(V.end(),Qe.end(),ce===0)return re.set(pe.locatorHash,te),!0;K.detachTemp(Se);let fe=`${Bt(this.configuration,pe)} couldn't be built successfully (exit code ${et(this.configuration,ce,Ye.NUMBER)}, logs can be found here: ${et(this.configuration,de,Ye.PATH)})`;return this.optionalBuilds.has(pe.locatorHash)?(r.reportInfo($.BUILD_FAILED,fe),re.set(pe.locatorHash,te),!0):(r.reportError($.BUILD_FAILED,fe),!1)}))return}})())}}if(await uo(O),X===k.size){let L=Array.from(k).map(pe=>{let Ce=this.storedPackages.get(pe);if(!Ce)throw new Error("Assertion failed: The package should have been registered");return Bt(this.configuration,Ce)}).join(", ");r.reportError($.CYCLIC_DEPENDENCIES,`Some packages have circular dependencies that make their build order unsatisfiable - as a result they won't be built (affected packages are: ${L})`);break}}this.storedBuildState=re}async install(e){var a,l;let r=this.configuration.get("nodeLinker");(a=we.telemetry)==null||a.reportInstall(r),await e.report.startTimerPromise("Project validation",{skipIfEmpty:!0},async()=>{await this.configuration.triggerHook(c=>c.validateProject,this,{reportWarning:e.report.reportWarning.bind(e.report),reportError:e.report.reportError.bind(e.report)})});for(let c of this.configuration.packageExtensions.values())for(let[,u]of c)for(let g of u)g.status=qi.Inactive;let i=x.join(this.cwd,this.configuration.get("lockfileFilename")),n=null;if(e.immutable)try{n=await K.readFilePromise(i,"utf8")}catch(c){throw c.code==="ENOENT"?new ct($.FROZEN_LOCKFILE_EXCEPTION,"The lockfile would have been created by this install, which is explicitly forbidden."):c}await e.report.startTimerPromise("Resolution step",async()=>{await this.resolveEverything(e)}),await e.report.startTimerPromise("Post-resolution validation",{skipIfEmpty:!0},async()=>{for(let[,c]of this.configuration.packageExtensions)for(let[,u]of c)for(let g of u)if(g.userProvided){let f=et(this.configuration,g,Ye.PACKAGE_EXTENSION);switch(g.status){case qi.Inactive:e.report.reportWarning($.UNUSED_PACKAGE_EXTENSION,`${f}: No matching package in the dependency tree; you may not need this rule anymore.`);break;case qi.Redundant:e.report.reportWarning($.REDUNDANT_PACKAGE_EXTENSION,`${f}: This rule seems redundant when applied on the original package; the extension may have been applied upstream.`);break}}if(n!==null){let c=ec(n,this.generateLockfile());if(c!==n){let u=(0,n$.structuredPatch)(i,i,n,c);e.report.reportSeparator();for(let g of u.hunks){e.report.reportInfo(null,`@@ -${g.oldStart},${g.oldLines} +${g.newStart},${g.newLines} @@`);for(let f of g.lines)f.startsWith("+")?e.report.reportError($.FROZEN_LOCKFILE_EXCEPTION,et(this.configuration,f,Ye.ADDED)):f.startsWith("-")?e.report.reportError($.FROZEN_LOCKFILE_EXCEPTION,et(this.configuration,f,Ye.REMOVED)):e.report.reportInfo(null,et(this.configuration,f,"grey"))}throw e.report.reportSeparator(),new ct($.FROZEN_LOCKFILE_EXCEPTION,"The lockfile would have been modified by this install, which is explicitly forbidden.")}}});for(let c of this.configuration.packageExtensions.values())for(let[,u]of c)for(let g of u)g.userProvided&&g.status===qi.Active&&((l=we.telemetry)==null||l.reportPackageExtension(Rc(g,Ye.PACKAGE_EXTENSION)));await e.report.startTimerPromise("Fetch step",async()=>{await this.fetchEverything(e),(typeof e.persistProject=="undefined"||e.persistProject)&&e.mode!==di.UpdateLockfile&&await this.cacheCleanup(e)});let s=e.immutable?[...new Set(this.configuration.get("immutablePatterns"))].sort():[],o=await Promise.all(s.map(async c=>cw(c,{cwd:this.cwd})));(typeof e.persistProject=="undefined"||e.persistProject)&&await this.persist(),await e.report.startTimerPromise("Link step",async()=>{if(e.mode===di.UpdateLockfile){e.report.reportWarning($.UPDATE_LOCKFILE_ONLY_SKIP_LINK,`Skipped due to ${et(this.configuration,"mode=update-lockfile",Ye.CODE)}`);return}await this.linkEverything(e);let c=await Promise.all(s.map(async u=>cw(u,{cwd:this.cwd})));for(let u=0;uc.afterAllInstalled,this,e)}generateLockfile(){let e=new Map;for(let[n,s]of this.storedResolutions.entries()){let o=e.get(s);o||e.set(s,o=new Set),o.add(n)}let r={};r.__metadata={version:a$,cacheKey:void 0};for(let[n,s]of e.entries()){let o=this.originalPackages.get(n);if(!o)continue;let a=[];for(let f of s){let h=this.storedDescriptors.get(f);if(!h)throw new Error("Assertion failed: The descriptor should have been registered");a.push(h)}let l=a.map(f=>Pn(f)).sort().join(", "),c=new At;c.version=o.linkType===Qt.HARD?o.version:"0.0.0-use.local",c.languageName=o.languageName,c.dependencies=new Map(o.dependencies),c.peerDependencies=new Map(o.peerDependencies),c.dependenciesMeta=new Map(o.dependenciesMeta),c.peerDependenciesMeta=new Map(o.peerDependenciesMeta),c.bin=new Map(o.bin);let u,g=this.storedChecksums.get(o.locatorHash);if(typeof g!="undefined"){let f=g.indexOf("/");if(f===-1)throw new Error("Assertion failed: Expected the checksum to reference its cache key");let h=g.slice(0,f),p=g.slice(f+1);typeof r.__metadata.cacheKey=="undefined"&&(r.__metadata.cacheKey=h),h===r.__metadata.cacheKey?u=p:u=g}r[l]=ie(N({},c.exportTo({},{compatibilityMode:!1})),{linkType:o.linkType.toLowerCase(),resolution:Ds(o),checksum:u,conditions:o.conditions||void 0})}return`${[`# This file is generated by running "yarn install" inside your project. -`,`# Manual changes might be lost - proceed with caution! -`].join("")} -`+La(r)}async persistLockfile(){let e=x.join(this.cwd,this.configuration.get("lockfileFilename")),r="";try{r=await K.readFilePromise(e,"utf8")}catch(s){}let i=this.generateLockfile(),n=ec(r,i);n!==r&&(await K.writeFilePromise(e,n),this.lockFileChecksum=l$(n),this.lockfileNeedsRefresh=!1)}async persistInstallStateFile(){let e=[];for(let o of Object.values(AF))e.push(...o);let r=(0,d0.default)(this,e),i=oF.default.serialize(r),n=ln(i);if(this.installStateChecksum===n)return;let s=this.configuration.get("installStatePath");await K.mkdirPromise(x.dirname(s),{recursive:!0}),await K.writeFilePromise(s,await XKe(i)),this.installStateChecksum=n}async restoreInstallState({restoreInstallersCustomData:e=!0,restoreResolutions:r=!0,restoreBuildState:i=!0}={}){let n=this.configuration.get("installStatePath"),s;try{let o=await ZKe(await K.readFilePromise(n));s=oF.default.deserialize(o),this.installStateChecksum=ln(o)}catch{r&&await this.applyLightResolution();return}e&&typeof s.installersCustomData!="undefined"&&(this.installersCustomData=s.installersCustomData),i&&Object.assign(this,(0,d0.default)(s,AF.restoreBuildState)),r&&(s.lockFileChecksum===this.lockFileChecksum?(Object.assign(this,(0,d0.default)(s,AF.restoreResolutions)),this.refreshWorkspaceDependencies()):await this.applyLightResolution())}async applyLightResolution(){await this.resolveEverything({lockfileOnly:!0,report:new pi}),await this.persistInstallStateFile()}async persist(){await this.persistLockfile();for(let e of this.workspacesByCwd.values())await e.persistManifest()}async cacheCleanup({cache:e,report:r}){if(this.configuration.get("enableGlobalCache"))return;let i=new Set([".gitignore"]);if(!Ix(e.cwd,this.cwd)||!await K.existsPromise(e.cwd))return;let n=this.configuration.get("preferAggregateCacheInfo"),s=0,o=null;for(let a of await K.readdirPromise(e.cwd)){if(i.has(a))continue;let l=x.resolve(e.cwd,a);e.markedFiles.has(l)||(o=a,e.immutable?r.reportError($.IMMUTABLE_CACHE,`${et(this.configuration,x.basename(l),"magenta")} appears to be unused and would be marked for deletion, but the cache is immutable`):(n?s+=1:r.reportInfo($.UNUSED_CACHE_ENTRY,`${et(this.configuration,x.basename(l),"magenta")} appears to be unused - removing`),await K.removePromise(l)))}n&&s!==0&&r.reportInfo($.UNUSED_CACHE_ENTRY,s>1?`${s} packages appeared to be unused and were removed`:`${o} appeared to be unused and was removed`),e.markedFiles.clear()}};function $Ke({project:t,allDescriptors:e,allResolutions:r,allPackages:i,accessibleLocators:n=new Set,optionalBuilds:s=new Set,peerRequirements:o=new Map,volatileDescriptors:a=new Set,report:l,tolerateMissingPackages:c=!1}){var re;let u=new Map,g=[],f=new Map,h=new Map,p=new Map,m=new Map,y=new Map,b=new Map(t.workspaces.map(ee=>{let A=ee.anchoredLocator.locatorHash,oe=i.get(A);if(typeof oe=="undefined"){if(c)return[A,null];throw new Error("Assertion failed: The workspace should have an associated package")}return[A,ud(oe)]})),S=()=>{let ee=K.mktempSync(),A=x.join(ee,"stacktrace.log"),oe=String(g.length+1).length,le=g.map((X,O)=>`${`${O+1}.`.padStart(oe," ")} ${Ds(X)} -`).join("");throw K.writeFileSync(A,le),K.detachTemp(ee),new ct($.STACK_OVERFLOW_RESOLUTION,`Encountered a stack overflow when resolving peer dependencies; cf ${H.fromPortablePath(A)}`)},k=ee=>{let A=r.get(ee.descriptorHash);if(typeof A=="undefined")throw new Error("Assertion failed: The resolution should have been registered");let oe=i.get(A);if(!oe)throw new Error("Assertion failed: The package could not be found");return oe},T=(ee,A,oe,{top:le,optional:X})=>{g.length>1e3&&S(),g.push(A);let O=Y(ee,A,oe,{top:le,optional:X});return g.pop(),O},Y=(ee,A,oe,{top:le,optional:X})=>{if(n.has(A.locatorHash))return;n.add(A.locatorHash),X||s.delete(A.locatorHash);let O=i.get(A.locatorHash);if(!O){if(c)return;throw new Error(`Assertion failed: The package (${Bt(t.configuration,A)}) should have been registered`)}let L=[],pe=[],Ce=[],Oe=[],te=[];for(let be of Array.from(O.dependencies.values())){if(O.peerDependencies.has(be.identHash)&&O.locatorHash!==le)continue;if(nl(be))throw new Error("Assertion failed: Virtual packages shouldn't be encountered when virtualizing a branch");a.delete(be.descriptorHash);let he=X;if(!he){let Qe=O.dependenciesMeta.get(Ot(be));if(typeof Qe!="undefined"){let ce=Qe.get(null);typeof ce!="undefined"&&ce.optional&&(he=!0)}}let Fe=r.get(be.descriptorHash);if(!Fe){if(c)continue;throw new Error(`Assertion failed: The resolution (${sr(t.configuration,be)}) should have been registered`)}let Ue=b.get(Fe)||i.get(Fe);if(!Ue)throw new Error(`Assertion failed: The package (${Fe}, resolved from ${sr(t.configuration,be)}) should have been registered`);if(Ue.peerDependencies.size===0){T(be,Ue,new Map,{top:le,optional:he});continue}let xe,Se,de=new Set,V;pe.push(()=>{xe=Ax(be,A.locatorHash),Se=lx(Ue,A.locatorHash),O.dependencies.delete(be.identHash),O.dependencies.set(xe.identHash,xe),r.set(xe.descriptorHash,Se.locatorHash),e.set(xe.descriptorHash,xe),i.set(Se.locatorHash,Se),L.push([Ue,xe,Se])}),Ce.push(()=>{var Qe;V=new Map;for(let ce of Se.peerDependencies.values()){let fe=O.dependencies.get(ce.identHash);if(!fe&&hd(A,ce)&&(ee.identHash===A.identHash?fe=ee:(fe=rr(A,ee.range),e.set(fe.descriptorHash,fe),r.set(fe.descriptorHash,A.locatorHash),a.delete(fe.descriptorHash))),(!fe||fe.range==="missing:")&&Se.dependencies.has(ce.identHash)){Se.peerDependencies.delete(ce.identHash);continue}fe||(fe=rr(ce,"missing:")),Se.dependencies.set(fe.identHash,fe),nl(fe)&&xc(p,fe.descriptorHash).add(Se.locatorHash),f.set(fe.identHash,fe),fe.range==="missing:"&&de.add(fe.identHash),V.set(ce.identHash,(Qe=oe.get(ce.identHash))!=null?Qe:Se.locatorHash)}Se.dependencies=new Map(xn(Se.dependencies,([ce,fe])=>Ot(fe)))}),Oe.push(()=>{if(!i.has(Se.locatorHash))return;let Qe=u.get(Ue.locatorHash);typeof Qe=="number"&&Qe>=2&&S();let ce=u.get(Ue.locatorHash),fe=typeof ce!="undefined"?ce+1:1;u.set(Ue.locatorHash,fe),T(xe,Se,V,{top:le,optional:he}),u.set(Ue.locatorHash,fe-1)}),te.push(()=>{let Qe=O.dependencies.get(be.identHash);if(typeof Qe=="undefined")throw new Error("Assertion failed: Expected the peer dependency to have been turned into a dependency");let ce=r.get(Qe.descriptorHash);if(typeof ce=="undefined")throw new Error("Assertion failed: Expected the descriptor to be registered");if(xc(y,ce).add(A.locatorHash),!!i.has(Se.locatorHash)){for(let fe of Se.peerDependencies.values()){let gt=V.get(fe.identHash);if(typeof gt=="undefined")throw new Error("Assertion failed: Expected the peer dependency ident to be registered");Pg(Dg(m,gt),Ot(fe)).push(Se.locatorHash)}for(let fe of de)Se.dependencies.delete(fe)}})}for(let be of[...pe,...Ce])be();let se;do{se=!0;for(let[be,he,Fe]of L){let Ue=Dg(h,be.locatorHash),xe=ln(...[...Fe.dependencies.values()].map(Qe=>{let ce=Qe.range!=="missing:"?r.get(Qe.descriptorHash):"missing:";if(typeof ce=="undefined")throw new Error(`Assertion failed: Expected the resolution for ${sr(t.configuration,Qe)} to have been registered`);return ce===le?`${ce} (top)`:ce}),he.identHash),Se=Ue.get(xe);if(typeof Se=="undefined"){Ue.set(xe,he);continue}if(Se===he)continue;i.delete(Fe.locatorHash),e.delete(he.descriptorHash),r.delete(he.descriptorHash),n.delete(Fe.locatorHash);let de=p.get(he.descriptorHash)||[],V=[O.locatorHash,...de];p.delete(he.descriptorHash);for(let Qe of V){let ce=i.get(Qe);typeof ce!="undefined"&&(ce.dependencies.get(he.identHash).descriptorHash!==Se.descriptorHash&&(se=!1),ce.dependencies.set(he.identHash,Se))}}}while(!se);for(let be of[...Oe,...te])be()};for(let ee of t.workspaces){let A=ee.anchoredLocator;a.delete(ee.anchoredDescriptor.descriptorHash),T(ee.anchoredDescriptor,A,new Map,{top:A.locatorHash,optional:!1})}var j;(function(oe){oe[oe.NotProvided=0]="NotProvided",oe[oe.NotCompatible=1]="NotCompatible"})(j||(j={}));let Z=[];for(let[ee,A]of y){let oe=i.get(ee);if(typeof oe=="undefined")throw new Error("Assertion failed: Expected the root to be registered");let le=m.get(ee);if(typeof le!="undefined")for(let X of A){let O=i.get(X);if(typeof O!="undefined")for(let[L,pe]of le){let Ce=An(L);if(O.peerDependencies.has(Ce.identHash))continue;let Oe=`p${ln(X,L,ee).slice(0,5)}`;o.set(Oe,{subject:X,requested:Ce,rootRequester:ee,allRequesters:pe});let te=oe.dependencies.get(Ce.identHash);if(typeof te!="undefined"){let se=k(te),be=(re=se.version)!=null?re:"0.0.0",he=new Set;for(let Ue of pe){let xe=i.get(Ue);if(typeof xe=="undefined")throw new Error("Assertion failed: Expected the link to be registered");let Se=xe.peerDependencies.get(Ce.identHash);if(typeof Se=="undefined")throw new Error("Assertion failed: Expected the ident to be registered");he.add(Se.range)}[...he].every(Ue=>{if(Ue.startsWith(oi.protocol)){if(!t.tryWorkspaceByLocator(se))return!1;Ue=Ue.slice(oi.protocol.length),(Ue==="^"||Ue==="~")&&(Ue="*")}return Uc(be,Ue)})||Z.push({type:1,subject:O,requested:Ce,requester:oe,version:be,hash:Oe,requirementCount:pe.length})}else{let se=oe.peerDependenciesMeta.get(L);(se==null?void 0:se.optional)||Z.push({type:0,subject:O,requested:Ce,requester:oe,hash:Oe})}}}}let J=[ee=>ux(ee.subject),ee=>Ot(ee.requested),ee=>`${ee.type}`];l==null||l.startSectionSync({reportFooter:()=>{l.reportWarning($.UNNAMED,`Some peer dependencies are incorrectly met; run ${et(t.configuration,"yarn explain peer-requirements ",Ye.CODE)} for details, where ${et(t.configuration,"",Ye.CODE)} is the six-letter p-prefixed code`)},skipIfEmpty:!0},()=>{for(let ee of xn(Z,J))switch(ee.type){case 0:l.reportWarning($.MISSING_PEER_DEPENDENCY,`${Bt(t.configuration,ee.subject)} doesn't provide ${gi(t.configuration,ee.requested)} (${et(t.configuration,ee.hash,Ye.CODE)}), requested by ${gi(t.configuration,ee.requester)}`);break;case 1:{let A=ee.requirementCount>1?"and some of its descendants request":"requests";l.reportWarning($.INCOMPATIBLE_PEER_DEPENDENCY,`${Bt(t.configuration,ee.subject)} provides ${gi(t.configuration,ee.requested)} (${et(t.configuration,ee.hash,Ye.CODE)}) with version ${Cd(t.configuration,ee.version)}, which doesn't satisfy what ${gi(t.configuration,ee.requester)} ${A}`)}break}})}var aa;(function(l){l.VERSION="version",l.COMMAND_NAME="commandName",l.PLUGIN_NAME="pluginName",l.INSTALL_COUNT="installCount",l.PROJECT_COUNT="projectCount",l.WORKSPACE_COUNT="workspaceCount",l.DEPENDENCY_COUNT="dependencyCount",l.EXTENSION="packageExtension"})(aa||(aa={}));var QC=class{constructor(e,r){this.values=new Map;this.hits=new Map;this.enumerators=new Map;this.configuration=e;let i=this.getRegistryPath();this.isNew=!K.existsSync(i),this.sendReport(r),this.startBuffer()}reportVersion(e){this.reportValue(aa.VERSION,e.replace(/-git\..*/,"-git"))}reportCommandName(e){this.reportValue(aa.COMMAND_NAME,e||"")}reportPluginName(e){this.reportValue(aa.PLUGIN_NAME,e)}reportProject(e){this.reportEnumerator(aa.PROJECT_COUNT,e)}reportInstall(e){this.reportHit(aa.INSTALL_COUNT,e)}reportPackageExtension(e){this.reportValue(aa.EXTENSION,e)}reportWorkspaceCount(e){this.reportValue(aa.WORKSPACE_COUNT,String(e))}reportDependencyCount(e){this.reportValue(aa.DEPENDENCY_COUNT,String(e))}reportValue(e,r){xc(this.values,e).add(r)}reportEnumerator(e,r){xc(this.enumerators,e).add(ln(r))}reportHit(e,r="*"){let i=Dg(this.hits,e),n=Ja(i,r,()=>0);i.set(r,n+1)}getRegistryPath(){let e=this.configuration.get("globalFolder");return x.join(e,"telemetry.json")}sendReport(e){var u,g,f;let r=this.getRegistryPath(),i;try{i=K.readJsonSync(r)}catch{i={}}let n=Date.now(),s=this.configuration.get("telemetryInterval")*24*60*60*1e3,a=((u=i.lastUpdate)!=null?u:n+s+Math.floor(s*Math.random()))+s;if(a>n&&i.lastUpdate!=null)return;try{K.mkdirSync(x.dirname(r),{recursive:!0}),K.writeJsonSync(r,{lastUpdate:n})}catch{return}if(a>n||!i.blocks)return;let l=`https://browser-http-intake.logs.datadoghq.eu/v1/input/${e}?ddsource=yarn`,c=h=>$P(l,h,{configuration:this.configuration}).catch(()=>{});for(let[h,p]of Object.entries((g=i.blocks)!=null?g:{})){if(Object.keys(p).length===0)continue;let m=p;m.userId=h,m.reportType="primary";for(let S of Object.keys((f=m.enumerators)!=null?f:{}))m.enumerators[S]=m.enumerators[S].length;c(m);let y=new Map,b=20;for(let[S,k]of Object.entries(m.values))k.length>0&&y.set(S,k.slice(0,b));for(;y.size>0;){let S={};S.userId=h,S.reportType="secondary",S.metrics={};for(let[k,T]of y)S.metrics[k]=T.shift(),T.length===0&&y.delete(k);c(S)}}}applyChanges(){var o,a,l,c,u,g,f,h,p;let e=this.getRegistryPath(),r;try{r=K.readJsonSync(e)}catch{r={}}let i=(o=this.configuration.get("telemetryUserId"))!=null?o:"*",n=r.blocks=(a=r.blocks)!=null?a:{},s=n[i]=(l=n[i])!=null?l:{};for(let m of this.hits.keys()){let y=s.hits=(c=s.hits)!=null?c:{},b=y[m]=(u=y[m])!=null?u:{};for(let[S,k]of this.hits.get(m))b[S]=((g=b[S])!=null?g:0)+k}for(let m of["values","enumerators"])for(let y of this[m].keys()){let b=s[m]=(f=s[m])!=null?f:{};b[y]=[...new Set([...(h=b[y])!=null?h:[],...(p=this[m].get(y))!=null?p:[]])]}K.mkdirSync(x.dirname(e),{recursive:!0}),K.writeJsonSync(e,r)}startBuffer(){process.on("exit",()=>{try{this.applyChanges()}catch{}})}};var lF=ge(require("child_process")),c$=ge(pc());var cF=ge(require("fs"));var Tf=new Map([["constraints",[["constraints","query"],["constraints","source"],["constraints"]]],["exec",[]],["interactive-tools",[["search"],["upgrade-interactive"]]],["stage",[["stage"]]],["typescript",[]],["version",[["version","apply"],["version","check"],["version"]]],["workspace-tools",[["workspaces","focus"],["workspaces","foreach"]]]]);function e1e(t){let e=H.fromPortablePath(t);process.on("SIGINT",()=>{}),e?(0,lF.execFileSync)(process.execPath,[e,...process.argv.slice(2)],{stdio:"inherit",env:ie(N({},process.env),{YARN_IGNORE_PATH:"1",YARN_IGNORE_CWD:"1"})}):(0,lF.execFileSync)(e,process.argv.slice(2),{stdio:"inherit",env:ie(N({},process.env),{YARN_IGNORE_PATH:"1",YARN_IGNORE_CWD:"1"})})}async function C0({binaryVersion:t,pluginConfiguration:e}){async function r(){let n=new ys({binaryLabel:"Yarn Package Manager",binaryName:"yarn",binaryVersion:t});try{await i(n)}catch(s){process.stdout.write(n.error(s)),process.exitCode=1}}async function i(n){var m,y,b,S,k;let s=process.versions.node,o=">=12 <14 || 14.2 - 14.9 || >14.10.0";if(!ve.parseOptionalBoolean(process.env.YARN_IGNORE_NODE)&&!Wt.satisfiesWithPrereleases(s,o))throw new Pe(`This tool requires a Node version compatible with ${o} (got ${s}). Upgrade Node, or set \`YARN_IGNORE_NODE=1\` in your environment.`);let l=await we.find(H.toPortablePath(process.cwd()),e,{usePath:!0,strict:!1}),c=l.get("yarnPath"),u=l.get("ignorePath"),g=l.get("ignoreCwd"),f=H.toPortablePath(H.resolve(process.argv[1])),h=T=>K.readFilePromise(T).catch(()=>Buffer.of());if(!u&&!g&&await(async()=>c===f||Buffer.compare(...await Promise.all([h(c),h(f)]))===0)()){process.env.YARN_IGNORE_PATH="1",process.env.YARN_IGNORE_CWD="1",await i(n);return}else if(c!==null&&!u)if(!K.existsSync(c))process.stdout.write(n.error(new Error(`The "yarn-path" option has been set (in ${l.sources.get("yarnPath")}), but the specified location doesn't exist (${c}).`))),process.exitCode=1;else try{e1e(c)}catch(T){process.exitCode=T.code||1}else{u&&delete process.env.YARN_IGNORE_PATH,l.get("enableTelemetry")&&!c$.isCI&&process.stdout.isTTY&&(we.telemetry=new QC(l,"puba9cdc10ec5790a2cf4969dd413a47270")),(m=we.telemetry)==null||m.reportVersion(t);for(let[Z,J]of l.plugins.entries()){Tf.has((b=(y=Z.match(/^@yarnpkg\/plugin-(.*)$/))==null?void 0:y[1])!=null?b:"")&&((S=we.telemetry)==null||S.reportPluginName(Z));for(let re of J.commands||[])n.register(re)}let Y=n.process(process.argv.slice(2));Y.help||(k=we.telemetry)==null||k.reportCommandName(Y.path.join(" "));let j=Y.cwd;if(typeof j!="undefined"&&!g){let Z=(0,cF.realpathSync)(process.cwd()),J=(0,cF.realpathSync)(j);if(Z!==J){process.chdir(j),await r();return}}await n.runExit(Y,{cwd:H.toPortablePath(process.cwd()),plugins:e,quiet:!1,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr})}}return r().catch(n=>{process.stdout.write(n.stack||n.message),process.exitCode=1}).finally(()=>K.rmtempPromise())}function u$(t){t.Command.Path=(...e)=>r=>{r.paths=r.paths||[],r.paths.push(e)};for(let e of["Array","Boolean","String","Proxy","Rest","Counter"])t.Command[e]=(...r)=>(i,n)=>{let s=t.Option[e](...r);Object.defineProperty(i,`__${n}`,{configurable:!1,enumerable:!0,get(){return s},set(o){this[n]=o}})};return t}var VC={};ft(VC,{BaseCommand:()=>Le,WorkspaceRequiredError:()=>ht,getDynamicLibs:()=>Qie,getPluginConfiguration:()=>W0,main:()=>C0,openWorkspace:()=>zf,pluginCommands:()=>Tf});var Le=class extends Re{constructor(){super(...arguments);this.cwd=W.String("--cwd",{hidden:!0})}};var ht=class extends Pe{constructor(e,r){let i=x.relative(e,r),n=x.join(e,At.fileName);super(`This command can only be run from within a workspace of your project (${i} isn't a workspace of ${n}).`)}};var oqe=ge(ri());Is();var aqe=ge(AN()),Qie=()=>new Map([["@yarnpkg/cli",VC],["@yarnpkg/core",vC],["@yarnpkg/fslib",$h],["@yarnpkg/libzip",Kd],["@yarnpkg/parsers",ap],["@yarnpkg/shell",Hd],["clipanion",mp],["semver",oqe],["typanion",ag],["yup",aqe]]);async function zf(t,e){let{project:r,workspace:i}=await ze.find(t,e);if(!i)throw new ht(r.cwd,e);return i}var v9e=ge(ri());Is();var S9e=ge(AN());var uL={};ft(uL,{dedupeUtils:()=>YN,default:()=>E4e,suggestUtils:()=>DN});var SAe=ge(pc());var Nse=ge(em());Is();var DN={};ft(DN,{Modifier:()=>ga,Strategy:()=>Vr,Target:()=>Hr,WorkspaceModifier:()=>Zf,applyModifier:()=>Pse,extractDescriptorFromPath:()=>NN,extractRangeModifier:()=>xse,fetchDescriptorFrom:()=>FN,findProjectDescriptors:()=>Fse,getModifier:()=>tm,getSuggestedDescriptors:()=>rm,makeWorkspaceDescriptor:()=>Rse,toWorkspaceModifier:()=>Dse});var RN=ge(ri()),QJe="workspace:",Hr;(function(i){i.REGULAR="dependencies",i.DEVELOPMENT="devDependencies",i.PEER="peerDependencies"})(Hr||(Hr={}));var ga;(function(i){i.CARET="^",i.TILDE="~",i.EXACT=""})(ga||(ga={}));var Zf;(function(i){i.CARET="^",i.TILDE="~",i.EXACT="*"})(Zf||(Zf={}));var Vr;(function(s){s.KEEP="keep",s.REUSE="reuse",s.PROJECT="project",s.LATEST="latest",s.CACHE="cache"})(Vr||(Vr={}));function tm(t,e){return t.exact?ga.EXACT:t.caret?ga.CARET:t.tilde?ga.TILDE:e.configuration.get("defaultSemverRangePrefix")}var vJe=/^([\^~]?)[0-9]+(?:\.[0-9]+){0,2}(?:-\S+)?$/;function xse(t,{project:e}){let r=t.match(vJe);return r?r[1]:e.configuration.get("defaultSemverRangePrefix")}function Pse(t,e){let{protocol:r,source:i,params:n,selector:s}=P.parseRange(t.range);return RN.default.valid(s)&&(s=`${e}${t.range}`),P.makeDescriptor(t,P.makeRange({protocol:r,source:i,params:n,selector:s}))}function Dse(t){switch(t){case ga.CARET:return Zf.CARET;case ga.TILDE:return Zf.TILDE;case ga.EXACT:return Zf.EXACT;default:throw new Error(`Assertion failed: Unknown modifier: "${t}"`)}}function Rse(t,e){return P.makeDescriptor(t.anchoredDescriptor,`${QJe}${Dse(e)}`)}async function Fse(t,{project:e,target:r}){let i=new Map,n=s=>{let o=i.get(s.descriptorHash);return o||i.set(s.descriptorHash,o={descriptor:s,locators:[]}),o};for(let s of e.workspaces)if(r===Hr.PEER){let o=s.manifest.peerDependencies.get(t.identHash);o!==void 0&&n(o).locators.push(s.locator)}else{let o=s.manifest.dependencies.get(t.identHash),a=s.manifest.devDependencies.get(t.identHash);r===Hr.DEVELOPMENT?a!==void 0?n(a).locators.push(s.locator):o!==void 0&&n(o).locators.push(s.locator):o!==void 0?n(o).locators.push(s.locator):a!==void 0&&n(a).locators.push(s.locator)}return i}async function NN(t,{cwd:e,workspace:r}){return await SJe(async i=>{x.isAbsolute(t)||(t=x.relative(r.cwd,x.resolve(e,t)),t.match(/^\.{0,2}\//)||(t=`./${t}`));let{project:n}=r,s=await FN(P.makeIdent(null,"archive"),t,{project:r.project,cache:i,workspace:r});if(!s)throw new Error("Assertion failed: The descriptor should have been found");let o=new pi,a=n.configuration.makeResolver(),l=n.configuration.makeFetcher(),c={checksums:n.storedChecksums,project:n,cache:i,fetcher:l,report:o,resolver:a},u=a.bindDescriptor(s,r.anchoredLocator,c),g=P.convertDescriptorToLocator(u),f=await l.fetch(g,c),h=await At.find(f.prefixPath,{baseFs:f.packageFs});if(!h.name)throw new Error("Target path doesn't have a name");return P.makeDescriptor(h.name,t)})}async function rm(t,{project:e,workspace:r,cache:i,target:n,modifier:s,strategies:o,maxResults:a=Infinity}){if(!(a>=0))throw new Error(`Invalid maxResults (${a})`);if(t.range!=="unknown")return{suggestions:[{descriptor:t,name:`Use ${P.prettyDescriptor(e.configuration,t)}`,reason:"(unambiguous explicit request)"}],rejections:[]};let l=typeof r!="undefined"&&r!==null&&r.manifest[n].get(t.identHash)||null,c=[],u=[],g=async f=>{try{await f()}catch(h){u.push(h)}};for(let f of o){if(c.length>=a)break;switch(f){case Vr.KEEP:await g(async()=>{l&&c.push({descriptor:l,name:`Keep ${P.prettyDescriptor(e.configuration,l)}`,reason:"(no changes)"})});break;case Vr.REUSE:await g(async()=>{for(let{descriptor:h,locators:p}of(await Fse(t,{project:e,target:n})).values()){if(p.length===1&&p[0].locatorHash===r.anchoredLocator.locatorHash&&o.includes(Vr.KEEP))continue;let m=`(originally used by ${P.prettyLocator(e.configuration,p[0])}`;m+=p.length>1?` and ${p.length-1} other${p.length>2?"s":""})`:")",c.push({descriptor:h,name:`Reuse ${P.prettyDescriptor(e.configuration,h)}`,reason:m})}});break;case Vr.CACHE:await g(async()=>{for(let h of e.storedDescriptors.values())h.identHash===t.identHash&&c.push({descriptor:h,name:`Reuse ${P.prettyDescriptor(e.configuration,h)}`,reason:"(already used somewhere in the lockfile)"})});break;case Vr.PROJECT:await g(async()=>{if(r.manifest.name!==null&&t.identHash===r.manifest.name.identHash)return;let h=e.tryWorkspaceByIdent(t);if(h===null)return;let p=Rse(h,s);c.push({descriptor:p,name:`Attach ${P.prettyDescriptor(e.configuration,p)}`,reason:`(local workspace at ${Ae.pretty(e.configuration,h.relativeCwd,Ae.Type.PATH)})`})});break;case Vr.LATEST:await g(async()=>{if(t.range!=="unknown")c.push({descriptor:t,name:`Use ${P.prettyRange(e.configuration,t.range)}`,reason:"(explicit range requested)"});else if(n===Hr.PEER)c.push({descriptor:P.makeDescriptor(t,"*"),name:"Use *",reason:"(catch-all peer dependency pattern)"});else if(!e.configuration.get("enableNetwork"))c.push({descriptor:null,name:"Resolve from latest",reason:Ae.pretty(e.configuration,"(unavailable because enableNetwork is toggled off)","grey")});else{let h=await FN(t,"latest",{project:e,cache:i,workspace:r,preserveModifier:!1});h&&(h=Pse(h,s),c.push({descriptor:h,name:`Use ${P.prettyDescriptor(e.configuration,h)}`,reason:"(resolved from latest)"}))}});break}}return{suggestions:c.slice(0,a),rejections:u.slice(0,a)}}async function FN(t,e,{project:r,cache:i,workspace:n,preserveModifier:s=!0}){let o=P.makeDescriptor(t,e),a=new pi,l=r.configuration.makeFetcher(),c=r.configuration.makeResolver(),u={project:r,fetcher:l,cache:i,checksums:r.storedChecksums,report:a,cacheOptions:{skipIntegrityCheck:!0},skipIntegrityCheck:!0},g=ie(N({},u),{resolver:c,fetchOptions:u}),f=c.bindDescriptor(o,n.anchoredLocator,g),h=await c.getCandidates(f,new Map,g);if(h.length===0)return null;let p=h[0],{protocol:m,source:y,params:b,selector:S}=P.parseRange(P.convertToManifestRange(p.reference));if(m===r.configuration.get("defaultProtocol")&&(m=null),RN.default.valid(S)&&s!==!1){let k=typeof s=="string"?s:o.range;S=xse(k,{project:r})+S}return P.makeDescriptor(p,P.makeRange({protocol:m,source:y,params:b,selector:S}))}async function SJe(t){return await K.mktempPromise(async e=>{let r=we.create(e);return r.useWithSource(e,{enableMirror:!1,compressionLevel:0},e,{overwrite:!0}),await t(new Nt(e,{configuration:r,check:!1,immutable:!1}))})}var im=class extends Le{constructor(){super(...arguments);this.json=W.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.exact=W.Boolean("-E,--exact",!1,{description:"Don't use any semver modifier on the resolved range"});this.tilde=W.Boolean("-T,--tilde",!1,{description:"Use the `~` semver modifier on the resolved range"});this.caret=W.Boolean("-C,--caret",!1,{description:"Use the `^` semver modifier on the resolved range"});this.dev=W.Boolean("-D,--dev",!1,{description:"Add a package as a dev dependency"});this.peer=W.Boolean("-P,--peer",!1,{description:"Add a package as a peer dependency"});this.optional=W.Boolean("-O,--optional",!1,{description:"Add / upgrade a package to an optional regular / peer dependency"});this.preferDev=W.Boolean("--prefer-dev",!1,{description:"Add / upgrade a package to a dev dependency"});this.interactive=W.Boolean("-i,--interactive",{description:"Reuse the specified package from other workspaces in the project"});this.cached=W.Boolean("--cached",!1,{description:"Reuse the highest version already used somewhere within the project"});this.mode=W.String("--mode",{description:"Change what artifacts installs generate",validator:nn(di)});this.silent=W.Boolean("--silent",{hidden:!0});this.packages=W.Rest()}async execute(){var m;let e=await we.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(r.cwd,this.context.cwd);await r.restoreInstallState({restoreResolutions:!1});let s=(m=this.interactive)!=null?m:e.get("preferInteractive"),o=tm(this,r),a=[...s?[Vr.REUSE]:[],Vr.PROJECT,...this.cached?[Vr.CACHE]:[],Vr.LATEST],l=s?Infinity:1,c=await Promise.all(this.packages.map(async y=>{let b=y.match(/^\.{0,2}\//)?await NN(y,{cwd:this.context.cwd,workspace:i}):P.tryParseDescriptor(y),S=y.match(/^(https?:|git@github)/);if(S)throw new Pe(`It seems you are trying to add a package using a ${Ae.pretty(e,`${S[0]}...`,Di.RANGE)} url; we now require package names to be explicitly specified. -Try running the command again with the package name prefixed: ${Ae.pretty(e,"yarn add",Di.CODE)} ${Ae.pretty(e,P.makeDescriptor(P.makeIdent(null,"my-package"),`${S[0]}...`),Di.DESCRIPTOR)}`);if(!b)throw new Pe(`The ${Ae.pretty(e,y,Di.CODE)} string didn't match the required format (package-name@range). Did you perhaps forget to explicitly reference the package name?`);let k=kJe(i,b,{dev:this.dev,peer:this.peer,preferDev:this.preferDev,optional:this.optional}),T=await rm(b,{project:r,workspace:i,cache:n,target:k,modifier:o,strategies:a,maxResults:l});return[b,T,k]})),u=await gA.start({configuration:e,stdout:this.context.stdout,suggestInstall:!1},async y=>{for(let[b,{suggestions:S,rejections:k}]of c)if(S.filter(Y=>Y.descriptor!==null).length===0){let[Y]=k;if(typeof Y=="undefined")throw new Error("Assertion failed: Expected an error to have been set");r.configuration.get("enableNetwork")?y.reportError($.CANT_SUGGEST_RESOLUTIONS,`${P.prettyDescriptor(e,b)} can't be resolved to a satisfying range`):y.reportError($.CANT_SUGGEST_RESOLUTIONS,`${P.prettyDescriptor(e,b)} can't be resolved to a satisfying range (note: network resolution has been disabled)`),y.reportSeparator(),y.reportExceptionOnce(Y)}});if(u.hasErrors())return u.exitCode();let g=!1,f=[],h=[];for(let[,{suggestions:y},b]of c){let S,k=y.filter(Z=>Z.descriptor!==null),T=k[0].descriptor,Y=k.every(Z=>P.areDescriptorsEqual(Z.descriptor,T));k.length===1||Y?S=T:(g=!0,{answer:S}=await(0,Nse.prompt)({type:"select",name:"answer",message:"Which range do you want to use?",choices:y.map(({descriptor:Z,name:J,reason:re})=>Z?{name:J,hint:re,descriptor:Z}:{name:J,hint:re,disabled:!0}),onCancel:()=>process.exit(130),result(Z){return this.find(Z,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout}));let j=i.manifest[b].get(S.identHash);(typeof j=="undefined"||j.descriptorHash!==S.descriptorHash)&&(i.manifest[b].set(S.identHash,S),this.optional&&(b==="dependencies"?i.manifest.ensureDependencyMeta(ie(N({},S),{range:"unknown"})).optional=!0:b==="peerDependencies"&&(i.manifest.ensurePeerDependencyMeta(ie(N({},S),{range:"unknown"})).optional=!0)),typeof j=="undefined"?f.push([i,b,S,a]):h.push([i,b,j,S]))}return await e.triggerMultipleHooks(y=>y.afterWorkspaceDependencyAddition,f),await e.triggerMultipleHooks(y=>y.afterWorkspaceDependencyReplacement,h),g&&this.context.stdout.write(` -`),(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout,includeLogs:!this.context.quiet},async y=>{await r.install({cache:n,report:y,mode:this.mode})})).exitCode()}};im.paths=[["add"]],im.usage=Re.Usage({description:"add dependencies to the project",details:"\n This command adds a package to the package.json for the nearest workspace.\n\n - If it didn't exist before, the package will by default be added to the regular `dependencies` field, but this behavior can be overriden thanks to the `-D,--dev` flag (which will cause the dependency to be added to the `devDependencies` field instead) and the `-P,--peer` flag (which will do the same but for `peerDependencies`).\n\n - If the package was already listed in your dependencies, it will by default be upgraded whether it's part of your `dependencies` or `devDependencies` (it won't ever update `peerDependencies`, though).\n\n - If set, the `--prefer-dev` flag will operate as a more flexible `-D,--dev` in that it will add the package to your `devDependencies` if it isn't already listed in either `dependencies` or `devDependencies`, but it will also happily upgrade your `dependencies` if that's what you already use (whereas `-D,--dev` would throw an exception).\n\n - If set, the `-O,--optional` flag will add the package to the `optionalDependencies` field and, in combination with the `-P,--peer` flag, it will add the package as an optional peer dependency. If the package was already listed in your `dependencies`, it will be upgraded to `optionalDependencies`. If the package was already listed in your `peerDependencies`, in combination with the `-P,--peer` flag, it will be upgraded to an optional peer dependency: `\"peerDependenciesMeta\": { \"\": { \"optional\": true } }`\n\n - If the added package doesn't specify a range at all its `latest` tag will be resolved and the returned version will be used to generate a new semver range (using the `^` modifier by default unless otherwise configured via the `defaultSemverRangePrefix` configuration, or the `~` modifier if `-T,--tilde` is specified, or no modifier at all if `-E,--exact` is specified). Two exceptions to this rule: the first one is that if the package is a workspace then its local version will be used, and the second one is that if you use `-P,--peer` the default range will be `*` and won't be resolved at all.\n\n - If the added package specifies a range (such as `^1.0.0`, `latest`, or `rc`), Yarn will add this range as-is in the resulting package.json entry (in particular, tags such as `rc` will be encoded as-is rather than being converted into a semver range).\n\n If the `--cached` option is used, Yarn will preferably reuse the highest version already used somewhere within the project, even if through a transitive dependency.\n\n If the `-i,--interactive` option is used (or if the `preferInteractive` settings is toggled on) the command will first try to check whether other workspaces in the project use the specified package and, if so, will offer to reuse them.\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n For a compilation of all the supported protocols, please consult the dedicated page from our website: https://yarnpkg.com/features/protocols.\n ",examples:[["Add a regular package to the current workspace","$0 add lodash"],["Add a specific version for a package to the current workspace","$0 add lodash@1.2.3"],["Add a package from a GitHub repository (the master branch) to the current workspace using a URL","$0 add lodash@https://github.com/lodash/lodash"],["Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol","$0 add lodash@github:lodash/lodash"],["Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol (shorthand)","$0 add lodash@lodash/lodash"],["Add a package from a specific branch of a GitHub repository to the current workspace using the GitHub protocol (shorthand)","$0 add lodash-es@lodash/lodash#es"]]});var Lse=im;function kJe(t,e,{dev:r,peer:i,preferDev:n,optional:s}){let o=t.manifest[Hr.REGULAR].has(e.identHash),a=t.manifest[Hr.DEVELOPMENT].has(e.identHash),l=t.manifest[Hr.PEER].has(e.identHash);if((r||i)&&o)throw new Pe(`Package "${P.prettyIdent(t.project.configuration,e)}" is already listed as a regular dependency - remove the -D,-P flags or remove it from your dependencies first`);if(!r&&!i&&l)throw new Pe(`Package "${P.prettyIdent(t.project.configuration,e)}" is already listed as a peer dependency - use either of -D or -P, or remove it from your peer dependencies first`);if(s&&a)throw new Pe(`Package "${P.prettyIdent(t.project.configuration,e)}" is already listed as a dev dependency - remove the -O flag or remove it from your dev dependencies first`);if(s&&!i&&l)throw new Pe(`Package "${P.prettyIdent(t.project.configuration,e)}" is already listed as a peer dependency - remove the -O flag or add the -P flag or remove it from your peer dependencies first`);if((r||n)&&s)throw new Pe(`Package "${P.prettyIdent(t.project.configuration,e)}" cannot simultaneously be a dev dependency and an optional dependency`);return i?Hr.PEER:r||n?Hr.DEVELOPMENT:o?Hr.REGULAR:a?Hr.DEVELOPMENT:Hr.REGULAR}var nm=class extends Le{constructor(){super(...arguments);this.verbose=W.Boolean("-v,--verbose",!1,{description:"Print both the binary name and the locator of the package that provides the binary"});this.json=W.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.name=W.String({required:!1})}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),{project:r,locator:i}=await ze.find(e,this.context.cwd);if(await r.restoreInstallState(),this.name){let o=(await Zt.getPackageAccessibleBinaries(i,{project:r})).get(this.name);if(!o)throw new Pe(`Couldn't find a binary named "${this.name}" for package "${P.prettyLocator(e,i)}"`);let[,a]=o;return this.context.stdout.write(`${a} -`),0}return(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout},async s=>{let o=await Zt.getPackageAccessibleBinaries(i,{project:r}),l=Array.from(o.keys()).reduce((c,u)=>Math.max(c,u.length),0);for(let[c,[u,g]]of o)s.reportJson({name:c,source:P.stringifyIdent(u),path:g});if(this.verbose)for(let[c,[u]]of o)s.reportInfo(null,`${c.padEnd(l," ")} ${P.prettyLocator(e,u)}`);else for(let c of o.keys())s.reportInfo(null,c)})).exitCode()}};nm.paths=[["bin"]],nm.usage=Re.Usage({description:"get the path to a binary script",details:` - When used without arguments, this command will print the list of all the binaries available in the current workspace. Adding the \`-v,--verbose\` flag will cause the output to contain both the binary name and the locator of the package that provides the binary. - - When an argument is specified, this command will just print the path to the binary on the standard output and exit. Note that the reported path may be stored within a zip archive. - `,examples:[["List all the available binaries","$0 bin"],["Print the path to a specific binary","$0 bin eslint"]]});var Tse=nm;var sm=class extends Le{constructor(){super(...arguments);this.mirror=W.Boolean("--mirror",!1,{description:"Remove the global cache files instead of the local cache files"});this.all=W.Boolean("--all",!1,{description:"Remove both the global cache files and the local cache files of the current project"})}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),r=await Nt.find(e);return(await Je.start({configuration:e,stdout:this.context.stdout},async()=>{let n=(this.all||this.mirror)&&r.mirrorCwd!==null,s=!this.mirror;n&&(await K.removePromise(r.mirrorCwd),await e.triggerHook(o=>o.cleanGlobalArtifacts,e)),s&&await K.removePromise(r.cwd)})).exitCode()}};sm.paths=[["cache","clean"],["cache","clear"]],sm.usage=Re.Usage({description:"remove the shared cache files",details:` - This command will remove all the files from the cache. - `,examples:[["Remove all the local archives","$0 cache clean"],["Remove all the archives stored in the ~/.yarn directory","$0 cache clean --mirror"]]});var Ose=sm;var Mse=ge(x0()),LN=ge(require("util")),om=class extends Le{constructor(){super(...arguments);this.json=W.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.unsafe=W.Boolean("--no-redacted",!1,{description:"Don't redact secrets (such as tokens) from the output"});this.name=W.String()}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),r=this.name.replace(/[.[].*$/,""),i=this.name.replace(/^[^.[]*/,"");if(typeof e.settings.get(r)=="undefined")throw new Pe(`Couldn't find a configuration settings named "${r}"`);let s=e.getSpecial(r,{hideSecrets:!this.unsafe,getNativePaths:!0}),o=ve.convertMapsToIndexableObjects(s),a=i?(0,Mse.default)(o,i):o,l=await Je.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async c=>{c.reportJson(a)});if(!this.json){if(typeof a=="string")return this.context.stdout.write(`${a} -`),l.exitCode();LN.inspect.styles.name="cyan",this.context.stdout.write(`${(0,LN.inspect)(a,{depth:Infinity,colors:e.get("enableColors"),compact:!1})} -`)}return l.exitCode()}};om.paths=[["config","get"]],om.usage=Re.Usage({description:"read a configuration settings",details:` - This command will print a configuration setting. - - Secrets (such as tokens) will be redacted from the output by default. If this behavior isn't desired, set the \`--no-redacted\` to get the untransformed value. - `,examples:[["Print a simple configuration setting","yarn config get yarnPath"],["Print a complex configuration setting","yarn config get packageExtensions"],["Print a nested field from the configuration",`yarn config get 'npmScopes["my-company"].npmRegistryServer'`],["Print a token from the configuration","yarn config get npmAuthToken --no-redacted"],["Print a configuration setting as JSON","yarn config get packageExtensions --json"]]});var Kse=om;var Xoe=ge(HN()),Zoe=ge(x0()),$oe=ge(Voe()),GN=ge(require("util")),Am=class extends Le{constructor(){super(...arguments);this.json=W.Boolean("--json",!1,{description:"Set complex configuration settings to JSON values"});this.home=W.Boolean("-H,--home",!1,{description:"Update the home configuration instead of the project configuration"});this.name=W.String();this.value=W.String()}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),r=()=>{if(!e.projectCwd)throw new Pe("This command must be run from within a project folder");return e.projectCwd},i=this.name.replace(/[.[].*$/,""),n=this.name.replace(/^[^.[]*\.?/,"");if(typeof e.settings.get(i)=="undefined")throw new Pe(`Couldn't find a configuration settings named "${i}"`);if(i==="enableStrictSettings")throw new Pe("This setting only affects the file it's in, and thus cannot be set from the CLI");let o=this.json?JSON.parse(this.value):this.value;await(this.home?h=>we.updateHomeConfiguration(h):h=>we.updateConfiguration(r(),h))(h=>{if(n){let p=(0,Xoe.default)(h);return(0,$oe.default)(p,this.name,o),p}else return ie(N({},h),{[i]:o})});let c=(await we.find(this.context.cwd,this.context.plugins)).getSpecial(i,{hideSecrets:!0,getNativePaths:!0}),u=ve.convertMapsToIndexableObjects(c),g=n?(0,Zoe.default)(u,n):u;return(await Je.start({configuration:e,includeFooter:!1,stdout:this.context.stdout},async h=>{GN.inspect.styles.name="cyan",h.reportInfo($.UNNAMED,`Successfully set ${this.name} to ${(0,GN.inspect)(g,{depth:Infinity,colors:e.get("enableColors"),compact:!1})}`)})).exitCode()}};Am.paths=[["config","set"]],Am.usage=Re.Usage({description:"change a configuration settings",details:` - This command will set a configuration setting. - - When used without the \`--json\` flag, it can only set a simple configuration setting (a string, a number, or a boolean). - - When used with the \`--json\` flag, it can set both simple and complex configuration settings, including Arrays and Objects. - `,examples:[["Set a simple configuration setting (a string, a number, or a boolean)","yarn config set initScope myScope"],["Set a simple configuration setting (a string, a number, or a boolean) using the `--json` flag",'yarn config set initScope --json \\"myScope\\"'],["Set a complex configuration setting (an Array) using the `--json` flag",`yarn config set unsafeHttpWhitelist --json '["*.example.com", "example.com"]'`],["Set a complex configuration setting (an Object) using the `--json` flag",`yarn config set packageExtensions --json '{ "@babel/parser@*": { "dependencies": { "@babel/types": "*" } } }'`],["Set a nested configuration setting",'yarn config set npmScopes.company.npmRegistryServer "https://npm.example.com"'],["Set a nested configuration setting using indexed access for non-simple keys",`yarn config set 'npmRegistries["//npm.example.com"].npmAuthToken' "ffffffff-ffff-ffff-ffff-ffffffffffff"`]]});var eae=Am;var lae=ge(HN()),cae=ge(kC()),uae=ge(Aae()),lm=class extends Le{constructor(){super(...arguments);this.home=W.Boolean("-H,--home",!1,{description:"Update the home configuration instead of the project configuration"});this.name=W.String()}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),r=()=>{if(!e.projectCwd)throw new Pe("This command must be run from within a project folder");return e.projectCwd},i=this.name.replace(/[.[].*$/,""),n=this.name.replace(/^[^.[]*\.?/,"");if(typeof e.settings.get(i)=="undefined")throw new Pe(`Couldn't find a configuration settings named "${i}"`);let o=this.home?l=>we.updateHomeConfiguration(l):l=>we.updateConfiguration(r(),l);return(await Je.start({configuration:e,includeFooter:!1,stdout:this.context.stdout},async l=>{let c=!1;await o(u=>{if(!(0,cae.default)(u,this.name))return l.reportWarning($.UNNAMED,`Configuration doesn't contain setting ${this.name}; there is nothing to unset`),c=!0,u;let g=n?(0,lae.default)(u):N({},u);return(0,uae.default)(g,this.name),g}),c||l.reportInfo($.UNNAMED,`Successfully unset ${this.name}`)})).exitCode()}};lm.paths=[["config","unset"]],lm.usage=Re.Usage({description:"unset a configuration setting",details:` - This command will unset a configuration setting. - `,examples:[["Unset a simple configuration setting","yarn config unset initScope"],["Unset a complex configuration setting","yarn config unset packageExtensions"],["Unset a nested configuration setting","yarn config unset npmScopes.company.npmRegistryServer"]]});var gae=lm;var jN=ge(require("util")),cm=class extends Le{constructor(){super(...arguments);this.verbose=W.Boolean("-v,--verbose",!1,{description:"Print the setting description on top of the regular key/value information"});this.why=W.Boolean("--why",!1,{description:"Print the reason why a setting is set a particular way"});this.json=W.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await we.find(this.context.cwd,this.context.plugins,{strict:!1});return(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout},async i=>{if(e.invalid.size>0&&!this.json){for(let[n,s]of e.invalid)i.reportError($.INVALID_CONFIGURATION_KEY,`Invalid configuration key "${n}" in ${s}`);i.reportSeparator()}if(this.json){let n=ve.sortMap(e.settings.keys(),s=>s);for(let s of n){let o=e.settings.get(s),a=e.getSpecial(s,{hideSecrets:!0,getNativePaths:!0}),l=e.sources.get(s);this.verbose?i.reportJson({key:s,effective:a,source:l}):i.reportJson(N({key:s,effective:a,source:l},o))}}else{let n=ve.sortMap(e.settings.keys(),a=>a),s=n.reduce((a,l)=>Math.max(a,l.length),0),o={breakLength:Infinity,colors:e.get("enableColors"),maxArrayLength:2};if(this.why||this.verbose){let a=n.map(c=>{let u=e.settings.get(c);if(!u)throw new Error(`Assertion failed: This settings ("${c}") should have been registered`);let g=this.why?e.sources.get(c)||"":u.description;return[c,g]}),l=a.reduce((c,[,u])=>Math.max(c,u.length),0);for(let[c,u]of a)i.reportInfo(null,`${c.padEnd(s," ")} ${u.padEnd(l," ")} ${(0,jN.inspect)(e.getSpecial(c,{hideSecrets:!0,getNativePaths:!0}),o)}`)}else for(let a of n)i.reportInfo(null,`${a.padEnd(s," ")} ${(0,jN.inspect)(e.getSpecial(a,{hideSecrets:!0,getNativePaths:!0}),o)}`)}})).exitCode()}};cm.paths=[["config"]],cm.usage=Re.Usage({description:"display the current configuration",details:` - This command prints the current active configuration settings. - `,examples:[["Print the active configuration settings","$0 config"]]});var fae=cm;Is();var YN={};ft(YN,{Strategy:()=>yu,acceptedStrategies:()=>D8e,dedupe:()=>qN});var hae=ge(rs()),yu;(function(e){e.HIGHEST="highest"})(yu||(yu={}));var D8e=new Set(Object.values(yu)),R8e={highest:async(t,e,{resolver:r,fetcher:i,resolveOptions:n,fetchOptions:s})=>{let o=new Map;for(let[a,l]of t.storedResolutions){let c=t.storedDescriptors.get(a);if(typeof c=="undefined")throw new Error(`Assertion failed: The descriptor (${a}) should have been registered`);ve.getSetWithDefault(o,c.identHash).add(l)}return Array.from(t.storedDescriptors.values(),async a=>{if(e.length&&!hae.default.isMatch(P.stringifyIdent(a),e))return null;let l=t.storedResolutions.get(a.descriptorHash);if(typeof l=="undefined")throw new Error(`Assertion failed: The resolution (${a.descriptorHash}) should have been registered`);let c=t.originalPackages.get(l);if(typeof c=="undefined"||!r.shouldPersistResolution(c,n))return null;let u=o.get(a.identHash);if(typeof u=="undefined")throw new Error(`Assertion failed: The resolutions (${a.identHash}) should have been registered`);if(u.size===1)return null;let g=[...u].map(y=>{let b=t.originalPackages.get(y);if(typeof b=="undefined")throw new Error(`Assertion failed: The package (${y}) should have been registered`);return b.reference}),f=await r.getSatisfying(a,g,n),h=f==null?void 0:f[0];if(typeof h=="undefined")return null;let p=h.locatorHash,m=t.originalPackages.get(p);if(typeof m=="undefined")throw new Error(`Assertion failed: The package (${p}) should have been registered`);return p===l?null:{descriptor:a,currentPackage:c,updatedPackage:m}})}};async function qN(t,{strategy:e,patterns:r,cache:i,report:n}){let{configuration:s}=t,o=new pi,a=s.makeResolver(),l=s.makeFetcher(),c={cache:i,checksums:t.storedChecksums,fetcher:l,project:t,report:o,skipIntegrityCheck:!0,cacheOptions:{skipIntegrityCheck:!0}},u={project:t,resolver:a,report:o,fetchOptions:c};return await n.startTimerPromise("Deduplication step",async()=>{let f=await R8e[e](t,r,{resolver:a,resolveOptions:u,fetcher:l,fetchOptions:c}),h=Ji.progressViaCounter(f.length);n.reportProgress(h);let p=0;await Promise.all(f.map(b=>b.then(S=>{if(S===null)return;p++;let{descriptor:k,currentPackage:T,updatedPackage:Y}=S;n.reportInfo($.UNNAMED,`${P.prettyDescriptor(s,k)} can be deduped from ${P.prettyLocator(s,T)} to ${P.prettyLocator(s,Y)}`),n.reportJson({descriptor:P.stringifyDescriptor(k),currentResolution:P.stringifyLocator(T),updatedResolution:P.stringifyLocator(Y)}),t.storedResolutions.set(k.descriptorHash,Y.locatorHash)}).finally(()=>h.tick())));let m;switch(p){case 0:m="No packages";break;case 1:m="One package";break;default:m=`${p} packages`}let y=Ae.pretty(s,e,Ae.Type.CODE);return n.reportInfo($.UNNAMED,`${m} can be deduped using the ${y} strategy`),p})}var um=class extends Le{constructor(){super(...arguments);this.strategy=W.String("-s,--strategy",yu.HIGHEST,{description:"The strategy to use when deduping dependencies",validator:nn(yu)});this.check=W.Boolean("-c,--check",!1,{description:"Exit with exit code 1 when duplicates are found, without persisting the dependency tree"});this.json=W.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.mode=W.String("--mode",{description:"Change what artifacts installs generate",validator:nn(di)});this.patterns=W.Rest()}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),{project:r}=await ze.find(e,this.context.cwd),i=await Nt.find(e);await r.restoreInstallState({restoreResolutions:!1});let n=0,s=await Je.start({configuration:e,includeFooter:!1,stdout:this.context.stdout,json:this.json},async o=>{n=await qN(r,{strategy:this.strategy,patterns:this.patterns,cache:i,report:o})});return s.hasErrors()?s.exitCode():this.check?n?1:0:(await Je.start({configuration:e,stdout:this.context.stdout,json:this.json},async a=>{await r.install({cache:i,report:a,mode:this.mode})})).exitCode()}};um.paths=[["dedupe"]],um.usage=Re.Usage({description:"deduplicate dependencies with overlapping ranges",details:"\n Duplicates are defined as descriptors with overlapping ranges being resolved and locked to different locators. They are a natural consequence of Yarn's deterministic installs, but they can sometimes pile up and unnecessarily increase the size of your project.\n\n This command dedupes dependencies in the current project using different strategies (only one is implemented at the moment):\n\n - `highest`: Reuses (where possible) the locators with the highest versions. This means that dependencies can only be upgraded, never downgraded. It's also guaranteed that it never takes more than a single pass to dedupe the entire dependency tree.\n\n **Note:** Even though it never produces a wrong dependency tree, this command should be used with caution, as it modifies the dependency tree, which can sometimes cause problems when packages don't strictly follow semver recommendations. Because of this, it is recommended to also review the changes manually.\n\n If set, the `-c,--check` flag will only report the found duplicates, without persisting the modified dependency tree. If changes are found, the command will exit with a non-zero exit code, making it suitable for CI purposes.\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n ### In-depth explanation:\n\n Yarn doesn't deduplicate dependencies by default, otherwise installs wouldn't be deterministic and the lockfile would be useless. What it actually does is that it tries to not duplicate dependencies in the first place.\n\n **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@*`will cause Yarn to reuse `foo@2.3.4`, even if the latest `foo` is actually `foo@2.10.14`, thus preventing unnecessary duplication.\n\n Duplication happens when Yarn can't unlock dependencies that have already been locked inside the lockfile.\n\n **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@2.10.14` will cause Yarn to install `foo@2.10.14` because the existing resolution doesn't satisfy the range `2.10.14`. This behavior can lead to (sometimes) unwanted duplication, since now the lockfile contains 2 separate resolutions for the 2 `foo` descriptors, even though they have overlapping ranges, which means that the lockfile can be simplified so that both descriptors resolve to `foo@2.10.14`.\n ",examples:[["Dedupe all packages","$0 dedupe"],["Dedupe all packages using a specific strategy","$0 dedupe --strategy highest"],["Dedupe a specific package","$0 dedupe lodash"],["Dedupe all packages with the `@babel/*` scope","$0 dedupe '@babel/*'"],["Check for duplicates (can be used as a CI step)","$0 dedupe --check"]]});var pae=um;var nb=class extends Le{async execute(){let{plugins:e}=await we.find(this.context.cwd,this.context.plugins),r=[];for(let o of e){let{commands:a}=o[1];if(a){let c=ys.from(a).definitions();r.push([o[0],c])}}let i=this.cli.definitions(),n=(o,a)=>o.split(" ").slice(1).join()===a.split(" ").slice(1).join(),s=Cae()["@yarnpkg/builder"].bundles.standard;for(let o of r){let a=o[1];for(let l of a)i.find(c=>n(c.path,l.path)).plugin={name:o[0],isDefault:s.includes(o[0])}}this.context.stdout.write(`${JSON.stringify(i,null,2)} -`)}};nb.paths=[["--clipanion=definitions"]];var mae=nb;var sb=class extends Le{async execute(){this.context.stdout.write(this.cli.usage(null))}};sb.paths=[["help"],["--help"],["-h"]];var Eae=sb;var JN=class extends Le{constructor(){super(...arguments);this.leadingArgument=W.String();this.args=W.Proxy()}async execute(){if(this.leadingArgument.match(/[\\/]/)&&!P.tryParseIdent(this.leadingArgument)){let e=x.resolve(this.context.cwd,H.toPortablePath(this.leadingArgument));return await this.cli.run(this.args,{cwd:e})}else return await this.cli.run(["run",this.leadingArgument,...this.args])}},Iae=JN;var ob=class extends Le{async execute(){this.context.stdout.write(`${Kr||""} -`)}};ob.paths=[["-v"],["--version"]];var yae=ob;var gm=class extends Le{constructor(){super(...arguments);this.commandName=W.String();this.args=W.Proxy()}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),{project:r,locator:i}=await ze.find(e,this.context.cwd);return await r.restoreInstallState(),await Zt.executePackageShellcode(i,this.commandName,this.args,{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,project:r})}};gm.paths=[["exec"]],gm.usage=Re.Usage({description:"execute a shell script",details:` - This command simply executes a shell script within the context of the root directory of the active workspace using the portable shell. - - It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment). - `,examples:[["Execute a single shell command","$0 exec echo Hello World"],["Execute a shell script",'$0 exec "tsc & babel src --out-dir lib"']]});var wae=gm;Is();var fm=class extends Le{constructor(){super(...arguments);this.hash=W.String({required:!1,validator:hp(fp(),[pp(/^p[0-9a-f]{5}$/)])})}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),{project:r}=await ze.find(e,this.context.cwd);return await r.restoreInstallState({restoreResolutions:!1}),await r.applyLightResolution(),typeof this.hash!="undefined"?await F8e(this.hash,r,{stdout:this.context.stdout}):(await Je.start({configuration:e,stdout:this.context.stdout,includeFooter:!1},async n=>{var o;let s=[([,a])=>P.stringifyLocator(r.storedPackages.get(a.subject)),([,a])=>P.stringifyIdent(a.requested)];for(let[a,l]of ve.sortMap(r.peerRequirements,s)){let c=r.storedPackages.get(l.subject);if(typeof c=="undefined")throw new Error("Assertion failed: Expected the subject package to have been registered");let u=r.storedPackages.get(l.rootRequester);if(typeof u=="undefined")throw new Error("Assertion failed: Expected the root package to have been registered");let g=(o=c.dependencies.get(l.requested.identHash))!=null?o:null,f=Ae.pretty(e,a,Ae.Type.CODE),h=P.prettyLocator(e,c),p=P.prettyIdent(e,l.requested),m=P.prettyIdent(e,u),y=l.allRequesters.length-1,b=`descendant${y===1?"":"s"}`,S=y>0?` and ${y} ${b}`:"",k=g!==null?"provides":"doesn't provide";n.reportInfo(null,`${f} \u2192 ${h} ${k} ${p} to ${m}${S}`)}})).exitCode()}};fm.paths=[["explain","peer-requirements"]],fm.usage=Re.Usage({description:"explain a set of peer requirements",details:` - A set of peer requirements represents all peer requirements that a dependent must satisfy when providing a given peer request to a requester and its descendants. - - When the hash argument is specified, this command prints a detailed explanation of all requirements of the set corresponding to the hash and whether they're satisfied or not. - - When used without arguments, this command lists all sets of peer requirements and the corresponding hash that can be used to get detailed information about a given set. - - **Note:** A hash is a six-letter p-prefixed code that can be obtained from peer dependency warnings or from the list of all peer requirements (\`yarn explain peer-requirements\`). - `,examples:[["Explain the corresponding set of peer requirements for a hash","$0 explain peer-requirements p1a4ed"],["List all sets of peer requirements","$0 explain peer-requirements"]]});var Bae=fm;async function F8e(t,e,r){let{configuration:i}=e,n=e.peerRequirements.get(t);if(typeof n=="undefined")throw new Error(`No peerDependency requirements found for hash: "${t}"`);return(await Je.start({configuration:i,stdout:r.stdout,includeFooter:!1},async o=>{var b,S;let a=e.storedPackages.get(n.subject);if(typeof a=="undefined")throw new Error("Assertion failed: Expected the subject package to have been registered");let l=e.storedPackages.get(n.rootRequester);if(typeof l=="undefined")throw new Error("Assertion failed: Expected the root package to have been registered");let c=(b=a.dependencies.get(n.requested.identHash))!=null?b:null,u=c!==null?e.storedResolutions.get(c.descriptorHash):null;if(typeof u=="undefined")throw new Error("Assertion failed: Expected the resolution to have been registered");let g=u!==null?e.storedPackages.get(u):null;if(typeof g=="undefined")throw new Error("Assertion failed: Expected the provided package to have been registered");let f=[...n.allRequesters.values()].map(k=>{let T=e.storedPackages.get(k);if(typeof T=="undefined")throw new Error("Assertion failed: Expected the package to be registered");let Y=P.devirtualizeLocator(T),j=e.storedPackages.get(Y.locatorHash);if(typeof j=="undefined")throw new Error("Assertion failed: Expected the package to be registered");let Z=j.peerDependencies.get(n.requested.identHash);if(typeof Z=="undefined")throw new Error("Assertion failed: Expected the peer dependency to be registered");return{pkg:T,peerDependency:Z}});if(g!==null){let k=f.every(({peerDependency:T})=>Wt.satisfiesWithPrereleases(g.version,T.range));o.reportInfo($.UNNAMED,`${P.prettyLocator(i,a)} provides ${P.prettyLocator(i,g)} with version ${P.prettyReference(i,(S=g.version)!=null?S:"")}, which ${k?"satisfies":"doesn't satisfy"} the following requirements:`)}else o.reportInfo($.UNNAMED,`${P.prettyLocator(i,a)} doesn't provide ${P.prettyIdent(i,n.requested)}, breaking the following requirements:`);o.reportSeparator();let h=Ae.mark(i),p=[];for(let{pkg:k,peerDependency:T}of ve.sortMap(f,Y=>P.stringifyLocator(Y.pkg))){let j=(g!==null?Wt.satisfiesWithPrereleases(g.version,T.range):!1)?h.Check:h.Cross;p.push({stringifiedLocator:P.stringifyLocator(k),prettyLocator:P.prettyLocator(i,k),prettyRange:P.prettyRange(i,T.range),mark:j})}let m=Math.max(...p.map(({stringifiedLocator:k})=>k.length)),y=Math.max(...p.map(({prettyRange:k})=>k.length));for(let{stringifiedLocator:k,prettyLocator:T,prettyRange:Y,mark:j}of ve.sortMap(p,({stringifiedLocator:Z})=>Z))o.reportInfo(null,`${T.padEnd(m+(T.length-k.length)," ")} \u2192 ${Y.padEnd(y," ")} ${j}`);p.length>1&&(o.reportSeparator(),o.reportInfo($.UNNAMED,`Note: these requirements start with ${P.prettyLocator(e.configuration,l)}`))})).exitCode()}Is();var bae=ge(ri()),hm=class extends Le{constructor(){super(...arguments);this.onlyIfNeeded=W.Boolean("--only-if-needed",!1,{description:"Only lock the Yarn version if it isn't already locked"});this.version=W.String()}async execute(){let e=await we.find(this.context.cwd,this.context.plugins);if(e.get("yarnPath")&&this.onlyIfNeeded)return 0;let r=()=>{if(typeof Kr=="undefined")throw new Pe("The --install flag can only be used without explicit version specifier from the Yarn CLI");return`file://${process.argv[1]}`},i;if(this.version==="self")i=r();else if(this.version==="latest"||this.version==="berry"||this.version==="stable")i=`https://repo.yarnpkg.com/${await pm(e,"stable")}/packages/yarnpkg-cli/bin/yarn.js`;else if(this.version==="canary")i=`https://repo.yarnpkg.com/${await pm(e,"canary")}/packages/yarnpkg-cli/bin/yarn.js`;else if(this.version==="classic")i="https://nightly.yarnpkg.com/latest.js";else if(this.version.match(/^https?:/))i=this.version;else if(this.version.match(/^\.{0,2}[\\/]/)||H.isAbsolute(this.version))i=`file://${H.resolve(this.version)}`;else if(Wt.satisfiesWithPrereleases(this.version,">=2.0.0"))i=`https://repo.yarnpkg.com/${this.version}/packages/yarnpkg-cli/bin/yarn.js`;else if(Wt.satisfiesWithPrereleases(this.version,"^0.x || ^1.x"))i=`https://github.com/yarnpkg/yarn/releases/download/v${this.version}/yarn-${this.version}.js`;else if(Wt.validRange(this.version))i=`https://repo.yarnpkg.com/${await N8e(e,this.version)}/packages/yarnpkg-cli/bin/yarn.js`;else throw new Pe(`Invalid version descriptor "${this.version}"`);return(await Je.start({configuration:e,stdout:this.context.stdout,includeLogs:!this.context.quiet},async s=>{let o="file://",a;i.startsWith(o)?(s.reportInfo($.UNNAMED,`Downloading ${Ae.pretty(e,i,Di.URL)}`),a=await K.readFilePromise(H.toPortablePath(i.slice(o.length)))):(s.reportInfo($.UNNAMED,`Retrieving ${Ae.pretty(e,i,Di.PATH)}`),a=await ir.get(i,{configuration:e})),await WN(e,null,a,{report:s})})).exitCode()}};hm.paths=[["set","version"]],hm.usage=Re.Usage({description:"lock the Yarn version used by the project",details:"\n This command will download a specific release of Yarn directly from the Yarn GitHub repository, will store it inside your project, and will change the `yarnPath` settings from your project `.yarnrc.yml` file to point to the new file.\n\n A very good use case for this command is to enforce the version of Yarn used by the any single member of your team inside a same project - by doing this you ensure that you have control on Yarn upgrades and downgrades (including on your deployment servers), and get rid of most of the headaches related to someone using a slightly different version and getting a different behavior than you.\n\n The version specifier can be:\n\n - a tag:\n - `latest` / `berry` / `stable` -> the most recent stable berry (`>=2.0.0`) release\n - `canary` -> the most recent canary (release candidate) berry (`>=2.0.0`) release\n - `classic` -> the most recent classic (`^0.x || ^1.x`) release\n\n - a semver range (e.g. `2.x`) -> the most recent version satisfying the range (limited to berry releases)\n\n - a semver version (e.g. `2.4.1`, `1.22.1`)\n\n - a local file referenced through either a relative or absolute path\n\n - `self` -> the version used to invoke the command\n ",examples:[["Download the latest release from the Yarn repository","$0 set version latest"],["Download the latest canary release from the Yarn repository","$0 set version canary"],["Download the latest classic release from the Yarn repository","$0 set version classic"],["Download the most recent Yarn 3 build","$0 set version 3.x"],["Download a specific Yarn 2 build","$0 set version 2.0.0-rc.30"],["Switch back to a specific Yarn 1 release","$0 set version 1.22.1"],["Use a release from the local filesystem","$0 set version ./yarn.cjs"],["Use a release from a URL","$0 set version https://repo.yarnpkg.com/3.1.0/packages/yarnpkg-cli/bin/yarn.js"],["Download the version used to invoke the command","$0 set version self"]]});var Qae=hm;async function N8e(t,e){let i=(await ir.get("https://repo.yarnpkg.com/tags",{configuration:t,jsonResponse:!0})).tags.filter(n=>Wt.satisfiesWithPrereleases(n,e));if(i.length===0)throw new Pe(`No matching release found for range ${Ae.pretty(t,e,Ae.Type.RANGE)}.`);return i[0]}async function pm(t,e){let r=await ir.get("https://repo.yarnpkg.com/tags",{configuration:t,jsonResponse:!0});if(!r.latest[e])throw new Pe(`Tag ${Ae.pretty(t,e,Ae.Type.RANGE)} not found`);return r.latest[e]}async function WN(t,e,r,{report:i}){var g;e===null&&await K.mktempPromise(async f=>{let h=x.join(f,"yarn.cjs");await K.writeFilePromise(h,r);let{stdout:p}=await Fr.execvp(process.execPath,[H.fromPortablePath(h),"--version"],{cwd:f,env:ie(N({},process.env),{YARN_IGNORE_PATH:"1"})});if(e=p.trim(),!bae.default.valid(e))throw new Error(`Invalid semver version. ${Ae.pretty(t,"yarn --version",Ae.Type.CODE)} returned: -${e}`)});let n=(g=t.projectCwd)!=null?g:t.startingCwd,s=x.resolve(n,".yarn/releases"),o=x.resolve(s,`yarn-${e}.cjs`),a=x.relative(t.startingCwd,o),l=x.relative(n,o),c=t.get("yarnPath"),u=c===null||c.startsWith(`${s}/`);if(i.reportInfo($.UNNAMED,`Saving the new release in ${Ae.pretty(t,a,"magenta")}`),await K.removePromise(x.dirname(o)),await K.mkdirPromise(x.dirname(o),{recursive:!0}),await K.writeFilePromise(o,r,{mode:493}),u){await we.updateConfiguration(n,{yarnPath:l});let f=await At.tryFind(n)||new At;f.packageManager=`yarn@${e&&ve.isTaggedYarnVersion(e)?e:await pm(t,"stable")}`;let h={};f.exportTo(h);let p=x.join(n,At.fileName),m=`${JSON.stringify(h,null,f.indent)} -`;await K.changeFilePromise(p,m,{automaticNewlines:!0})}}function vae(t){return $[bI(t)]}var L8e=/## (?YN[0-9]{4}) - `(?[A-Z_]+)`\n\n(?
(?:.(?!##))+)/gs;async function T8e(t){let r=`https://repo.yarnpkg.com/${ve.isTaggedYarnVersion(Kr)?Kr:await pm(t,"canary")}/packages/gatsby/content/advanced/error-codes.md`,i=await ir.get(r,{configuration:t});return new Map(Array.from(i.toString().matchAll(L8e),({groups:n})=>{if(!n)throw new Error("Assertion failed: Expected the match to have been successful");let s=vae(n.code);if(n.name!==s)throw new Error(`Assertion failed: Invalid error code data: Expected "${n.name}" to be named "${s}"`);return[n.code,n.details]}))}var dm=class extends Le{constructor(){super(...arguments);this.code=W.String({required:!1,validator:hp(fp(),[pp(/^YN[0-9]{4}$/)])});this.json=W.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await we.find(this.context.cwd,this.context.plugins);if(typeof this.code!="undefined"){let r=vae(this.code),i=Ae.pretty(e,r,Ae.Type.CODE),n=this.cli.format().header(`${this.code} - ${i}`),o=(await T8e(e)).get(this.code),a=typeof o!="undefined"?Ae.jsonOrPretty(this.json,e,Ae.tuple(Ae.Type.MARKDOWN,{text:o,format:this.cli.format(),paragraphs:!0})):`This error code does not have a description. - -You can help us by editing this page on GitHub \u{1F642}: -${Ae.jsonOrPretty(this.json,e,Ae.tuple(Ae.Type.URL,"https://github.com/yarnpkg/berry/blob/master/packages/gatsby/content/advanced/error-codes.md"))} -`;this.json?this.context.stdout.write(`${JSON.stringify({code:this.code,name:r,details:a})} -`):this.context.stdout.write(`${n} - -${a} -`)}else{let r={children:ve.mapAndFilter(Object.entries($),([i,n])=>Number.isNaN(Number(i))?ve.mapAndFilter.skip:{label:qA(Number(i)),value:Ae.tuple(Ae.Type.CODE,n)})};As.emitTree(r,{configuration:e,stdout:this.context.stdout,json:this.json})}}};dm.paths=[["explain"]],dm.usage=Re.Usage({description:"explain an error code",details:` - When the code argument is specified, this command prints its name and its details. - - When used without arguments, this command lists all error codes and their names. - `,examples:[["Explain an error code","$0 explain YN0006"],["List all error codes","$0 explain"]]});var Sae=dm;var kae=ge(rs()),Cm=class extends Le{constructor(){super(...arguments);this.all=W.Boolean("-A,--all",!1,{description:"Print versions of a package from the whole project"});this.recursive=W.Boolean("-R,--recursive",!1,{description:"Print information for all packages, including transitive dependencies"});this.extra=W.Array("-X,--extra",[],{description:"An array of requests of extra data provided by plugins"});this.cache=W.Boolean("--cache",!1,{description:"Print information about the cache entry of a package (path, size, checksum)"});this.dependents=W.Boolean("--dependents",!1,{description:"Print all dependents for each matching package"});this.manifest=W.Boolean("--manifest",!1,{description:"Print data obtained by looking at the package archive (license, homepage, ...)"});this.nameOnly=W.Boolean("--name-only",!1,{description:"Only print the name for the matching packages"});this.virtuals=W.Boolean("--virtuals",!1,{description:"Print each instance of the virtual packages"});this.json=W.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.patterns=W.Rest()}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i&&!this.all)throw new ht(r.cwd,this.context.cwd);await r.restoreInstallState();let s=new Set(this.extra);this.cache&&s.add("cache"),this.dependents&&s.add("dependents"),this.manifest&&s.add("manifest");let o=(k,{recursive:T})=>{let Y=k.anchoredLocator.locatorHash,j=new Map,Z=[Y];for(;Z.length>0;){let J=Z.shift();if(j.has(J))continue;let re=r.storedPackages.get(J);if(typeof re=="undefined")throw new Error("Assertion failed: Expected the package to be registered");if(j.set(J,re),P.isVirtualLocator(re)&&Z.push(P.devirtualizeLocator(re).locatorHash),!(!T&&J!==Y))for(let ee of re.dependencies.values()){let A=r.storedResolutions.get(ee.descriptorHash);if(typeof A=="undefined")throw new Error("Assertion failed: Expected the resolution to be registered");Z.push(A)}}return j.values()},a=({recursive:k})=>{let T=new Map;for(let Y of r.workspaces)for(let j of o(Y,{recursive:k}))T.set(j.locatorHash,j);return T.values()},l=({all:k,recursive:T})=>k&&T?r.storedPackages.values():k?a({recursive:T}):o(i,{recursive:T}),c=({all:k,recursive:T})=>{let Y=l({all:k,recursive:T}),j=this.patterns.map(re=>{let ee=P.parseLocator(re),A=kae.default.makeRe(P.stringifyIdent(ee)),oe=P.isVirtualLocator(ee),le=oe?P.devirtualizeLocator(ee):ee;return X=>{let O=P.stringifyIdent(X);if(!A.test(O))return!1;if(ee.reference==="unknown")return!0;let L=P.isVirtualLocator(X),pe=L?P.devirtualizeLocator(X):X;return!(oe&&L&&ee.reference!==X.reference||le.reference!==pe.reference)}}),Z=ve.sortMap([...Y],re=>P.stringifyLocator(re));return{selection:Z.filter(re=>j.length===0||j.some(ee=>ee(re))),sortedLookup:Z}},{selection:u,sortedLookup:g}=c({all:this.all,recursive:this.recursive});if(u.length===0)throw new Pe("No package matched your request");let f=new Map;if(this.dependents)for(let k of g)for(let T of k.dependencies.values()){let Y=r.storedResolutions.get(T.descriptorHash);if(typeof Y=="undefined")throw new Error("Assertion failed: Expected the resolution to be registered");ve.getArrayWithDefault(f,Y).push(k)}let h=new Map;for(let k of g){if(!P.isVirtualLocator(k))continue;let T=P.devirtualizeLocator(k);ve.getArrayWithDefault(h,T.locatorHash).push(k)}let p={},m={children:p},y=e.makeFetcher(),b={project:r,fetcher:y,cache:n,checksums:r.storedChecksums,report:new pi,cacheOptions:{skipIntegrityCheck:!0},skipIntegrityCheck:!0},S=[async(k,T,Y)=>{var J,re;if(!T.has("manifest"))return;let j=await y.fetch(k,b),Z;try{Z=await At.find(j.prefixPath,{baseFs:j.packageFs})}finally{(J=j.releaseFs)==null||J.call(j)}Y("Manifest",{License:Ae.tuple(Ae.Type.NO_HINT,Z.license),Homepage:Ae.tuple(Ae.Type.URL,(re=Z.raw.homepage)!=null?re:null)})},async(k,T,Y)=>{var A;if(!T.has("cache"))return;let j={mockedPackages:r.disabledLocators,unstablePackages:r.conditionalLocators},Z=(A=r.storedChecksums.get(k.locatorHash))!=null?A:null,J=n.getLocatorPath(k,Z,j),re;if(J!==null)try{re=K.statSync(J)}catch{}let ee=typeof re!="undefined"?[re.size,Ae.Type.SIZE]:void 0;Y("Cache",{Checksum:Ae.tuple(Ae.Type.NO_HINT,Z),Path:Ae.tuple(Ae.Type.PATH,J),Size:ee})}];for(let k of u){let T=P.isVirtualLocator(k);if(!this.virtuals&&T)continue;let Y={},j={value:[k,Ae.Type.LOCATOR],children:Y};if(p[P.stringifyLocator(k)]=j,this.nameOnly){delete j.children;continue}let Z=h.get(k.locatorHash);typeof Z!="undefined"&&(Y.Instances={label:"Instances",value:Ae.tuple(Ae.Type.NUMBER,Z.length)}),Y.Version={label:"Version",value:Ae.tuple(Ae.Type.NO_HINT,k.version)};let J=(ee,A)=>{let oe={};if(Y[ee]=oe,Array.isArray(A))oe.children=A.map(le=>({value:le}));else{let le={};oe.children=le;for(let[X,O]of Object.entries(A))typeof O!="undefined"&&(le[X]={label:X,value:O})}};if(!T){for(let ee of S)await ee(k,s,J);await e.triggerHook(ee=>ee.fetchPackageInfo,k,s,J)}k.bin.size>0&&!T&&J("Exported Binaries",[...k.bin.keys()].map(ee=>Ae.tuple(Ae.Type.PATH,ee)));let re=f.get(k.locatorHash);typeof re!="undefined"&&re.length>0&&J("Dependents",re.map(ee=>Ae.tuple(Ae.Type.LOCATOR,ee))),k.dependencies.size>0&&!T&&J("Dependencies",[...k.dependencies.values()].map(ee=>{var le;let A=r.storedResolutions.get(ee.descriptorHash),oe=typeof A!="undefined"&&(le=r.storedPackages.get(A))!=null?le:null;return Ae.tuple(Ae.Type.RESOLUTION,{descriptor:ee,locator:oe})})),k.peerDependencies.size>0&&T&&J("Peer dependencies",[...k.peerDependencies.values()].map(ee=>{var X,O;let A=k.dependencies.get(ee.identHash),oe=typeof A!="undefined"&&(X=r.storedResolutions.get(A.descriptorHash))!=null?X:null,le=oe!==null&&(O=r.storedPackages.get(oe))!=null?O:null;return Ae.tuple(Ae.Type.RESOLUTION,{descriptor:ee,locator:le})}))}As.emitTree(m,{configuration:e,json:this.json,stdout:this.context.stdout,separators:this.nameOnly?0:2})}};Cm.paths=[["info"]],Cm.usage=Re.Usage({description:"see information related to packages",details:"\n This command prints various information related to the specified packages, accepting glob patterns.\n\n By default, if the locator reference is missing, Yarn will default to print the information about all the matching direct dependencies of the package for the active workspace. To instead print all versions of the package that are direct dependencies of any of your workspaces, use the `-A,--all` flag. Adding the `-R,--recursive` flag will also report transitive dependencies.\n\n Some fields will be hidden by default in order to keep the output readable, but can be selectively displayed by using additional options (`--dependents`, `--manifest`, `--virtuals`, ...) described in the option descriptions.\n\n Note that this command will only print the information directly related to the selected packages - if you wish to know why the package is there in the first place, use `yarn why` which will do just that (it also provides a `-R,--recursive` flag that may be of some help).\n ",examples:[["Show information about Lodash","$0 info lodash"]]});var xae=Cm;var ab=ge(pc());Is();var mm=class extends Le{constructor(){super(...arguments);this.json=W.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.immutable=W.Boolean("--immutable",{description:"Abort with an error exit code if the lockfile was to be modified"});this.immutableCache=W.Boolean("--immutable-cache",{description:"Abort with an error exit code if the cache folder was to be modified"});this.checkCache=W.Boolean("--check-cache",!1,{description:"Always refetch the packages and ensure that their checksums are consistent"});this.inlineBuilds=W.Boolean("--inline-builds",{description:"Verbosely print the output of the build steps of dependencies"});this.mode=W.String("--mode",{description:"Change what artifacts installs generate",validator:nn(di)});this.cacheFolder=W.String("--cache-folder",{hidden:!0});this.frozenLockfile=W.Boolean("--frozen-lockfile",{hidden:!0});this.ignoreEngines=W.Boolean("--ignore-engines",{hidden:!0});this.nonInteractive=W.Boolean("--non-interactive",{hidden:!0});this.preferOffline=W.Boolean("--prefer-offline",{hidden:!0});this.production=W.Boolean("--production",{hidden:!0});this.registry=W.String("--registry",{hidden:!0});this.silent=W.Boolean("--silent",{hidden:!0});this.networkTimeout=W.String("--network-timeout",{hidden:!0})}async execute(){var g;let e=await we.find(this.context.cwd,this.context.plugins);typeof this.inlineBuilds!="undefined"&&e.useWithSource("",{enableInlineBuilds:this.inlineBuilds},e.startingCwd,{overwrite:!0});let r=!!process.env.FUNCTION_TARGET||!!process.env.GOOGLE_RUNTIME,i=async(f,{error:h})=>{let p=await Je.start({configuration:e,stdout:this.context.stdout,includeFooter:!1},async m=>{h?m.reportError($.DEPRECATED_CLI_SETTINGS,f):m.reportWarning($.DEPRECATED_CLI_SETTINGS,f)});return p.hasErrors()?p.exitCode():null};if(typeof this.ignoreEngines!="undefined"){let f=await i("The --ignore-engines option is deprecated; engine checking isn't a core feature anymore",{error:!ab.default.VERCEL});if(f!==null)return f}if(typeof this.registry!="undefined"){let f=await i("The --registry option is deprecated; prefer setting npmRegistryServer in your .yarnrc.yml file",{error:!1});if(f!==null)return f}if(typeof this.preferOffline!="undefined"){let f=await i("The --prefer-offline flag is deprecated; use the --cached flag with 'yarn add' instead",{error:!ab.default.VERCEL});if(f!==null)return f}if(typeof this.production!="undefined"){let f=await i("The --production option is deprecated on 'install'; use 'yarn workspaces focus' instead",{error:!0});if(f!==null)return f}if(typeof this.nonInteractive!="undefined"){let f=await i("The --non-interactive option is deprecated",{error:!r});if(f!==null)return f}if(typeof this.frozenLockfile!="undefined"&&(await i("The --frozen-lockfile option is deprecated; use --immutable and/or --immutable-cache instead",{error:!1}),this.immutable=this.frozenLockfile),typeof this.cacheFolder!="undefined"){let f=await i("The cache-folder option has been deprecated; use rc settings instead",{error:!ab.default.NETLIFY});if(f!==null)return f}let n=this.mode===di.UpdateLockfile;if(n&&(this.immutable||this.immutableCache))throw new Pe(`${Ae.pretty(e,"--immutable",Ae.Type.CODE)} and ${Ae.pretty(e,"--immutable-cache",Ae.Type.CODE)} cannot be used with ${Ae.pretty(e,"--mode=update-lockfile",Ae.Type.CODE)}`);let s=((g=this.immutable)!=null?g:e.get("enableImmutableInstalls"))&&!n,o=this.immutableCache&&!n;if(e.projectCwd!==null){let f=await Je.start({configuration:e,json:this.json,stdout:this.context.stdout,includeFooter:!1},async h=>{await O8e(e,s)&&(h.reportInfo($.AUTOMERGE_SUCCESS,"Automatically fixed merge conflicts \u{1F44D}"),h.reportSeparator())});if(f.hasErrors())return f.exitCode()}if(e.projectCwd!==null&&typeof e.sources.get("nodeLinker")=="undefined"){let f=e.projectCwd,h;try{h=await K.readFilePromise(x.join(f,Pt.lockfile),"utf8")}catch{}if(h==null?void 0:h.includes("yarn lockfile v1")){let p=await Je.start({configuration:e,json:this.json,stdout:this.context.stdout,includeFooter:!1},async m=>{m.reportInfo($.AUTO_NM_SUCCESS,"Migrating from Yarn 1; automatically enabling the compatibility node-modules linker \u{1F44D}"),m.reportSeparator(),e.use("",{nodeLinker:"node-modules"},f,{overwrite:!0}),await we.updateConfiguration(f,{nodeLinker:"node-modules"})});if(p.hasErrors())return p.exitCode()}}if(e.projectCwd!==null){let f=await Je.start({configuration:e,json:this.json,stdout:this.context.stdout,includeFooter:!1},async h=>{var p;((p=we.telemetry)==null?void 0:p.isNew)&&(h.reportInfo($.TELEMETRY_NOTICE,"Yarn will periodically gather anonymous telemetry: https://yarnpkg.com/advanced/telemetry"),h.reportInfo($.TELEMETRY_NOTICE,`Run ${Ae.pretty(e,"yarn config set --home enableTelemetry 0",Ae.Type.CODE)} to disable`),h.reportSeparator())});if(f.hasErrors())return f.exitCode()}let{project:a,workspace:l}=await ze.find(e,this.context.cwd),c=await Nt.find(e,{immutable:o,check:this.checkCache});if(!l)throw new ht(a.cwd,this.context.cwd);return await a.restoreInstallState({restoreResolutions:!1}),(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout,includeLogs:!0},async f=>{await a.install({cache:c,report:f,immutable:s,mode:this.mode})})).exitCode()}};mm.paths=[["install"],Re.Default],mm.usage=Re.Usage({description:"install the project dependencies",details:` - This command sets up your project if needed. The installation is split into four different steps that each have their own characteristics: - - - **Resolution:** First the package manager will resolve your dependencies. The exact way a dependency version is privileged over another isn't standardized outside of the regular semver guarantees. If a package doesn't resolve to what you would expect, check that all dependencies are correctly declared (also check our website for more information: ). - - - **Fetch:** Then we download all the dependencies if needed, and make sure that they're all stored within our cache (check the value of \`cacheFolder\` in \`yarn config\` to see where the cache files are stored). - - - **Link:** Then we send the dependency tree information to internal plugins tasked with writing them on the disk in some form (for example by generating the .pnp.cjs file you might know). - - - **Build:** Once the dependency tree has been written on the disk, the package manager will now be free to run the build scripts for all packages that might need it, in a topological order compatible with the way they depend on one another. See https://yarnpkg.com/advanced/lifecycle-scripts for detail. - - Note that running this command is not part of the recommended workflow. Yarn supports zero-installs, which means that as long as you store your cache and your .pnp.cjs file inside your repository, everything will work without requiring any install right after cloning your repository or switching branches. - - If the \`--immutable\` option is set (defaults to true on CI), Yarn will abort with an error exit code if the lockfile was to be modified (other paths can be added using the \`immutablePatterns\` configuration setting). For backward compatibility we offer an alias under the name of \`--frozen-lockfile\`, but it will be removed in a later release. - - If the \`--immutable-cache\` option is set, Yarn will abort with an error exit code if the cache folder was to be modified (either because files would be added, or because they'd be removed). - - If the \`--check-cache\` option is set, Yarn will always refetch the packages and will ensure that their checksum matches what's 1/ described in the lockfile 2/ inside the existing cache files (if present). This is recommended as part of your CI workflow if you're both following the Zero-Installs model and accepting PRs from third-parties, as they'd otherwise have the ability to alter the checked-in packages before submitting them. - - If the \`--inline-builds\` option is set, Yarn will verbosely print the output of the build steps of your dependencies (instead of writing them into individual files). This is likely useful mostly for debug purposes only when using Docker-like environments. - - If the \`--mode=\` option is set, Yarn will change which artifacts are generated. The modes currently supported are: - - - \`skip-build\` will not run the build scripts at all. Note that this is different from setting \`enableScripts\` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run. - - - \`update-lockfile\` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost. - `,examples:[["Install the project","$0 install"],["Validate a project when using Zero-Installs","$0 install --immutable --immutable-cache"],["Validate a project when using Zero-Installs (slightly safer if you accept external PRs)","$0 install --immutable --immutable-cache --check-cache"]]});var Pae=mm,M8e="|||||||",K8e=">>>>>>>",U8e="=======",Dae="<<<<<<<";async function O8e(t,e){if(!t.projectCwd)return!1;let r=x.join(t.projectCwd,t.get("lockfileFilename"));if(!await K.existsPromise(r))return!1;let i=await K.readFilePromise(r,"utf8");if(!i.includes(Dae))return!1;if(e)throw new ct($.AUTOMERGE_IMMUTABLE,"Cannot autofix a lockfile when running an immutable install");let[n,s]=H8e(i),o,a;try{o=Qi(n),a=Qi(s)}catch(c){throw new ct($.AUTOMERGE_FAILED_TO_PARSE,"The individual variants of the lockfile failed to parse")}let l=N(N({},o),a);for(let[c,u]of Object.entries(l))typeof u=="string"&&delete l[c];return await K.changeFilePromise(r,La(l),{automaticNewlines:!0}),!0}function H8e(t){let e=[[],[]],r=t.split(/\r?\n/g),i=!1;for(;r.length>0;){let n=r.shift();if(typeof n=="undefined")throw new Error("Assertion failed: Some lines should remain");if(n.startsWith(Dae)){for(;r.length>0;){let s=r.shift();if(typeof s=="undefined")throw new Error("Assertion failed: Some lines should remain");if(s===U8e){i=!1;break}else if(i||s.startsWith(M8e)){i=!0;continue}else e[0].push(s)}for(;r.length>0;){let s=r.shift();if(typeof s=="undefined")throw new Error("Assertion failed: Some lines should remain");if(s.startsWith(K8e))break;e[1].push(s)}}else e[0].push(n),e[1].push(n)}return[e[0].join(` -`),e[1].join(` -`)]}var Em=class extends Le{constructor(){super(...arguments);this.all=W.Boolean("-A,--all",!1,{description:"Link all workspaces belonging to the target project to the current one"});this.private=W.Boolean("-p,--private",!1,{description:"Also link private workspaces belonging to the target project to the current one"});this.relative=W.Boolean("-r,--relative",!1,{description:"Link workspaces using relative paths instead of absolute paths"});this.destination=W.String()}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(r.cwd,this.context.cwd);await r.restoreInstallState({restoreResolutions:!1});let s=x.resolve(this.context.cwd,H.toPortablePath(this.destination)),o=await we.find(s,this.context.plugins,{useRc:!1,strict:!1}),{project:a,workspace:l}=await ze.find(o,s);if(r.cwd===a.cwd)throw new Pe("Invalid destination; Can't link the project to itself");if(!l)throw new ht(a.cwd,s);let c=r.topLevelWorkspace,u=[];if(this.all){for(let f of a.workspaces)f.manifest.name&&(!f.manifest.private||this.private)&&u.push(f);if(u.length===0)throw new Pe("No workspace found to be linked in the target project")}else{if(!l.manifest.name)throw new Pe("The target workspace doesn't have a name and thus cannot be linked");if(l.manifest.private&&!this.private)throw new Pe("The target workspace is marked private - use the --private flag to link it anyway");u.push(l)}for(let f of u){let h=P.stringifyIdent(f.locator),p=this.relative?x.relative(r.cwd,f.cwd):f.cwd;c.manifest.resolutions.push({pattern:{descriptor:{fullName:h}},reference:`portal:${p}`})}return(await Je.start({configuration:e,stdout:this.context.stdout},async f=>{await r.install({cache:n,report:f})})).exitCode()}};Em.paths=[["link"]],Em.usage=Re.Usage({description:"connect the local project to another one",details:"\n This command will set a new `resolutions` field in the project-level manifest and point it to the workspace at the specified location (even if part of another project).\n ",examples:[["Register a remote workspace for use in the current project","$0 link ~/ts-loader"],["Register all workspaces from a remote project for use in the current project","$0 link ~/jest --all"]]});var Rae=Em;var Im=class extends Le{constructor(){super(...arguments);this.args=W.Proxy()}async execute(){return this.cli.run(["exec","node",...this.args])}};Im.paths=[["node"]],Im.usage=Re.Usage({description:"run node with the hook already setup",details:` - This command simply runs Node. It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment). - - The Node process will use the exact same version of Node as the one used to run Yarn itself, which might be a good way to ensure that your commands always use a consistent Node version. - `,examples:[["Run a Node script","$0 node ./my-script.js"]]});var Fae=Im;var Gae=ge(require("os"));var Lae=ge(require("os"));var G8e="https://raw.githubusercontent.com/yarnpkg/berry/master/plugins.yml";async function wu(t){let e=await ir.get(G8e,{configuration:t});return Qi(e.toString())}var ym=class extends Le{constructor(){super(...arguments);this.json=W.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await we.find(this.context.cwd,this.context.plugins);return(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout},async i=>{let n=await wu(e);for(let s of Object.entries(n)){let[l,o]=s,a=o,{experimental:c}=a,u=Tr(a,["experimental"]);let g=l;c&&(g+=" [experimental]"),i.reportJson(N({name:l,experimental:c},u)),i.reportInfo(null,g)}})).exitCode()}};ym.paths=[["plugin","list"]],ym.usage=Re.Usage({category:"Plugin-related commands",description:"list the available official plugins",details:"\n This command prints the plugins available directly from the Yarn repository. Only those plugins can be referenced by name in `yarn plugin import`.\n ",examples:[["List the official plugins","$0 plugin list"]]});var Nae=ym;var j8e=/^[0-9]+$/;function Tae(t){return j8e.test(t)?`pull/${t}/head`:t}var Y8e=({repository:t,branch:e},r)=>[["git","init",H.fromPortablePath(r)],["git","remote","add","origin",t],["git","fetch","origin","--depth=1",Tae(e)],["git","reset","--hard","FETCH_HEAD"]],q8e=({branch:t})=>[["git","fetch","origin","--depth=1",Tae(t),"--force"],["git","reset","--hard","FETCH_HEAD"],["git","clean","-dfx"]],J8e=({plugins:t,noMinify:e},r)=>[["yarn","build:cli",...new Array().concat(...t.map(i=>["--plugin",x.resolve(r,i)])),...e?["--no-minify"]:[],"|"]],wm=class extends Le{constructor(){super(...arguments);this.installPath=W.String("--path",{description:"The path where the repository should be cloned to"});this.repository=W.String("--repository","https://github.com/yarnpkg/berry.git",{description:"The repository that should be cloned"});this.branch=W.String("--branch","master",{description:"The branch of the repository that should be cloned"});this.plugins=W.Array("--plugin",[],{description:"An array of additional plugins that should be included in the bundle"});this.noMinify=W.Boolean("--no-minify",!1,{description:"Build a bundle for development (debugging) - non-minified and non-mangled"});this.force=W.Boolean("-f,--force",!1,{description:"Always clone the repository instead of trying to fetch the latest commits"});this.skipPlugins=W.Boolean("--skip-plugins",!1,{description:"Skip updating the contrib plugins"})}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),{project:r}=await ze.find(e,this.context.cwd),i=typeof this.installPath!="undefined"?x.resolve(this.context.cwd,H.toPortablePath(this.installPath)):x.resolve(H.toPortablePath((0,Lae.tmpdir)()),"yarnpkg-sources",Dn.makeHash(this.repository).slice(0,6));return(await Je.start({configuration:e,stdout:this.context.stdout},async s=>{await _N(this,{configuration:e,report:s,target:i}),s.reportSeparator(),s.reportInfo($.UNNAMED,"Building a fresh bundle"),s.reportSeparator(),await Bm(J8e(this,i),{configuration:e,context:this.context,target:i}),s.reportSeparator();let o=x.resolve(i,"packages/yarnpkg-cli/bundles/yarn.js"),a=await K.readFilePromise(o);await WN(e,"sources",a,{report:s}),this.skipPlugins||await W8e(this,{project:r,report:s,target:i})})).exitCode()}};wm.paths=[["set","version","from","sources"]],wm.usage=Re.Usage({description:"build Yarn from master",details:` - This command will clone the Yarn repository into a temporary folder, then build it. The resulting bundle will then be copied into the local project. - - By default, it also updates all contrib plugins to the same commit the bundle is built from. This behavior can be disabled by using the \`--skip-plugins\` flag. - `,examples:[["Build Yarn from master","$0 set version from sources"]]});var Oae=wm;async function Bm(t,{configuration:e,context:r,target:i}){for(let[n,...s]of t){let o=s[s.length-1]==="|";if(o&&s.pop(),o)await Fr.pipevp(n,s,{cwd:i,stdin:r.stdin,stdout:r.stdout,stderr:r.stderr,strict:!0});else{r.stdout.write(`${Ae.pretty(e,` $ ${[n,...s].join(" ")}`,"grey")} -`);try{await Fr.execvp(n,s,{cwd:i,strict:!0})}catch(a){throw r.stdout.write(a.stdout||a.stack),a}}}}async function _N(t,{configuration:e,report:r,target:i}){let n=!1;if(!t.force&&K.existsSync(x.join(i,".git"))){r.reportInfo($.UNNAMED,"Fetching the latest commits"),r.reportSeparator();try{await Bm(q8e(t),{configuration:e,context:t.context,target:i}),n=!0}catch(s){r.reportSeparator(),r.reportWarning($.UNNAMED,"Repository update failed; we'll try to regenerate it")}}n||(r.reportInfo($.UNNAMED,"Cloning the remote repository"),r.reportSeparator(),await K.removePromise(i),await K.mkdirPromise(i,{recursive:!0}),await Bm(Y8e(t,i),{configuration:e,context:t.context,target:i}))}async function W8e(t,{project:e,report:r,target:i}){let n=await wu(e.configuration),s=new Set(Object.keys(n));for(let o of e.configuration.plugins.keys())!s.has(o)||await zN(o,t,{project:e,report:r,target:i})}var Mae=ge(ri()),Kae=ge(require("url")),Uae=ge(require("vm"));var bm=class extends Le{constructor(){super(...arguments);this.name=W.String()}async execute(){let e=await we.find(this.context.cwd,this.context.plugins);return(await Je.start({configuration:e,stdout:this.context.stdout},async i=>{let{project:n}=await ze.find(e,this.context.cwd),s,o;if(this.name.match(/^\.{0,2}[\\/]/)||H.isAbsolute(this.name)){let a=x.resolve(this.context.cwd,H.toPortablePath(this.name));i.reportInfo($.UNNAMED,`Reading ${Ae.pretty(e,a,Ae.Type.PATH)}`),s=x.relative(n.cwd,a),o=await K.readFilePromise(a)}else{let a;if(this.name.match(/^https?:/)){try{new Kae.URL(this.name)}catch{throw new ct($.INVALID_PLUGIN_REFERENCE,`Plugin specifier "${this.name}" is neither a plugin name nor a valid url`)}s=this.name,a=this.name}else{let l=P.parseLocator(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-"));if(l.reference!=="unknown"&&!Mae.default.valid(l.reference))throw new ct($.UNNAMED,"Official plugins only accept strict version references. Use an explicit URL if you wish to download them from another location.");let c=P.stringifyIdent(l),u=await wu(e);if(!Object.prototype.hasOwnProperty.call(u,c))throw new ct($.PLUGIN_NAME_NOT_FOUND,`Couldn't find a plugin named "${c}" on the remote registry. Note that only the plugins referenced on our website (https://github.com/yarnpkg/berry/blob/master/plugins.yml) can be referenced by their name; any other plugin will have to be referenced through its public url (for example https://github.com/yarnpkg/berry/raw/master/packages/plugin-typescript/bin/%40yarnpkg/plugin-typescript.js).`);s=c,a=u[c].url,l.reference!=="unknown"?a=a.replace(/\/master\//,`/${c}/${l.reference}/`):Kr!==null&&(a=a.replace(/\/master\//,`/@yarnpkg/cli/${Kr}/`))}i.reportInfo($.UNNAMED,`Downloading ${Ae.pretty(e,a,"green")}`),o=await ir.get(a,{configuration:e})}await VN(s,o,{project:n,report:i})})).exitCode()}};bm.paths=[["plugin","import"]],bm.usage=Re.Usage({category:"Plugin-related commands",description:"download a plugin",details:` - This command downloads the specified plugin from its remote location and updates the configuration to reference it in further CLI invocations. - - Three types of plugin references are accepted: - - - If the plugin is stored within the Yarn repository, it can be referenced by name. - - Third-party plugins can be referenced directly through their public urls. - - Local plugins can be referenced by their path on the disk. - - Plugins cannot be downloaded from the npm registry, and aren't allowed to have dependencies (they need to be bundled into a single file, possibly thanks to the \`@yarnpkg/builder\` package). - `,examples:[['Download and activate the "@yarnpkg/plugin-exec" plugin',"$0 plugin import @yarnpkg/plugin-exec"],['Download and activate the "@yarnpkg/plugin-exec" plugin (shorthand)',"$0 plugin import exec"],["Download and activate a community plugin","$0 plugin import https://example.org/path/to/plugin.js"],["Activate a local plugin","$0 plugin import ./path/to/plugin.js"]]});var Hae=bm;async function VN(t,e,{project:r,report:i}){let{configuration:n}=r,s={},o={exports:s};(0,Uae.runInNewContext)(e.toString(),{module:o,exports:s});let a=o.exports.name,l=`.yarn/plugins/${a}.cjs`,c=x.resolve(r.cwd,l);i.reportInfo($.UNNAMED,`Saving the new plugin in ${Ae.pretty(n,l,"magenta")}`),await K.mkdirPromise(x.dirname(c),{recursive:!0}),await K.writeFilePromise(c,e);let u={path:l,spec:t};await we.updateConfiguration(r.cwd,g=>{let f=[],h=!1;for(let p of g.plugins||[]){let m=typeof p!="string"?p.path:p,y=x.resolve(r.cwd,H.toPortablePath(m)),{name:b}=ve.dynamicRequire(y);b!==a?f.push(p):(f.push(u),h=!0)}return h||f.push(u),ie(N({},g),{plugins:f})})}var z8e=({pluginName:t,noMinify:e},r)=>[["yarn",`build:${t}`,...e?["--no-minify"]:[],"|"]],Qm=class extends Le{constructor(){super(...arguments);this.installPath=W.String("--path",{description:"The path where the repository should be cloned to"});this.repository=W.String("--repository","https://github.com/yarnpkg/berry.git",{description:"The repository that should be cloned"});this.branch=W.String("--branch","master",{description:"The branch of the repository that should be cloned"});this.noMinify=W.Boolean("--no-minify",!1,{description:"Build a plugin for development (debugging) - non-minified and non-mangled"});this.force=W.Boolean("-f,--force",!1,{description:"Always clone the repository instead of trying to fetch the latest commits"});this.name=W.String()}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),r=typeof this.installPath!="undefined"?x.resolve(this.context.cwd,H.toPortablePath(this.installPath)):x.resolve(H.toPortablePath((0,Gae.tmpdir)()),"yarnpkg-sources",Dn.makeHash(this.repository).slice(0,6));return(await Je.start({configuration:e,stdout:this.context.stdout},async n=>{let{project:s}=await ze.find(e,this.context.cwd),o=P.parseIdent(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-")),a=P.stringifyIdent(o),l=await wu(e);if(!Object.prototype.hasOwnProperty.call(l,a))throw new ct($.PLUGIN_NAME_NOT_FOUND,`Couldn't find a plugin named "${a}" on the remote registry. Note that only the plugins referenced on our website (https://github.com/yarnpkg/berry/blob/master/plugins.yml) can be built and imported from sources.`);let c=a;await _N(this,{configuration:e,report:n,target:r}),await zN(c,this,{project:s,report:n,target:r})})).exitCode()}};Qm.paths=[["plugin","import","from","sources"]],Qm.usage=Re.Usage({category:"Plugin-related commands",description:"build a plugin from sources",details:` - This command clones the Yarn repository into a temporary folder, builds the specified contrib plugin and updates the configuration to reference it in further CLI invocations. - - The plugins can be referenced by their short name if sourced from the official Yarn repository. - `,examples:[['Build and activate the "@yarnpkg/plugin-exec" plugin',"$0 plugin import from sources @yarnpkg/plugin-exec"],['Build and activate the "@yarnpkg/plugin-exec" plugin (shorthand)',"$0 plugin import from sources exec"]]});var jae=Qm;async function zN(t,{context:e,noMinify:r},{project:i,report:n,target:s}){let o=t.replace(/@yarnpkg\//,""),{configuration:a}=i;n.reportSeparator(),n.reportInfo($.UNNAMED,`Building a fresh ${o}`),n.reportSeparator(),await Bm(z8e({pluginName:o,noMinify:r},s),{configuration:a,context:e,target:s}),n.reportSeparator();let l=x.resolve(s,`packages/${o}/bundles/${t}.js`),c=await K.readFilePromise(l);await VN(t,c,{project:i,report:n})}var vm=class extends Le{constructor(){super(...arguments);this.name=W.String()}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),{project:r}=await ze.find(e,this.context.cwd);return(await Je.start({configuration:e,stdout:this.context.stdout},async n=>{let s=this.name,o=P.parseIdent(s);if(!e.plugins.has(s))throw new Pe(`${P.prettyIdent(e,o)} isn't referenced by the current configuration`);let a=`.yarn/plugins/${s}.cjs`,l=x.resolve(r.cwd,a);K.existsSync(l)&&(n.reportInfo($.UNNAMED,`Removing ${Ae.pretty(e,a,Ae.Type.PATH)}...`),await K.removePromise(l)),n.reportInfo($.UNNAMED,"Updating the configuration..."),await we.updateConfiguration(r.cwd,c=>{if(!Array.isArray(c.plugins))return c;let u=c.plugins.filter(g=>g.path!==a);return c.plugins.length===u.length?c:ie(N({},c),{plugins:u})})})).exitCode()}};vm.paths=[["plugin","remove"]],vm.usage=Re.Usage({category:"Plugin-related commands",description:"remove a plugin",details:` - This command deletes the specified plugin from the .yarn/plugins folder and removes it from the configuration. - - **Note:** The plugins have to be referenced by their name property, which can be obtained using the \`yarn plugin runtime\` command. Shorthands are not allowed. - `,examples:[["Remove a plugin imported from the Yarn repository","$0 plugin remove @yarnpkg/plugin-typescript"],["Remove a plugin imported from a local file","$0 plugin remove my-local-plugin"]]});var Yae=vm;var Sm=class extends Le{constructor(){super(...arguments);this.json=W.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await we.find(this.context.cwd,this.context.plugins);return(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout},async i=>{for(let n of e.plugins.keys()){let s=this.context.plugins.plugins.has(n),o=n;s&&(o+=" [builtin]"),i.reportJson({name:n,builtin:s}),i.reportInfo(null,`${o}`)}})).exitCode()}};Sm.paths=[["plugin","runtime"]],Sm.usage=Re.Usage({category:"Plugin-related commands",description:"list the active plugins",details:` - This command prints the currently active plugins. Will be displayed both builtin plugins and external plugins. - `,examples:[["List the currently active plugins","$0 plugin runtime"]]});var qae=Sm;var km=class extends Le{constructor(){super(...arguments);this.idents=W.Rest()}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(r.cwd,this.context.cwd);let s=new Set;for(let a of this.idents)s.add(P.parseIdent(a).identHash);if(await r.restoreInstallState({restoreResolutions:!1}),await r.resolveEverything({cache:n,report:new pi}),s.size>0)for(let a of r.storedPackages.values())s.has(a.identHash)&&r.storedBuildState.delete(a.locatorHash);else r.storedBuildState.clear();return(await Je.start({configuration:e,stdout:this.context.stdout,includeLogs:!this.context.quiet},async a=>{await r.install({cache:n,report:a})})).exitCode()}};km.paths=[["rebuild"]],km.usage=Re.Usage({description:"rebuild the project's native packages",details:` - This command will automatically cause Yarn to forget about previous compilations of the given packages and to run them again. - - Note that while Yarn forgets the compilation, the previous artifacts aren't erased from the filesystem and may affect the next builds (in good or bad). To avoid this, you may remove the .yarn/unplugged folder, or any other relevant location where packages might have been stored (Yarn may offer a way to do that automatically in the future). - - By default all packages will be rebuilt, but you can filter the list by specifying the names of the packages you want to clear from memory. - `,examples:[["Rebuild all packages","$0 rebuild"],["Rebuild fsevents only","$0 rebuild fsevents"]]});var Jae=km;var XN=ge(rs());Is();var xm=class extends Le{constructor(){super(...arguments);this.all=W.Boolean("-A,--all",!1,{description:"Apply the operation to all workspaces from the current project"});this.mode=W.String("--mode",{description:"Change what artifacts installs generate",validator:nn(di)});this.patterns=W.Rest()}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(r.cwd,this.context.cwd);await r.restoreInstallState({restoreResolutions:!1});let s=this.all?r.workspaces:[i],o=[Hr.REGULAR,Hr.DEVELOPMENT,Hr.PEER],a=[],l=!1,c=[];for(let h of this.patterns){let p=!1,m=P.parseIdent(h);for(let y of s){let b=[...y.manifest.peerDependenciesMeta.keys()];for(let S of(0,XN.default)(b,h))y.manifest.peerDependenciesMeta.delete(S),l=!0,p=!0;for(let S of o){let k=y.manifest.getForScope(S),T=[...k.values()].map(Y=>P.stringifyIdent(Y));for(let Y of(0,XN.default)(T,P.stringifyIdent(m))){let{identHash:j}=P.parseIdent(Y),Z=k.get(j);if(typeof Z=="undefined")throw new Error("Assertion failed: Expected the descriptor to be registered");y.manifest[S].delete(j),c.push([y,S,Z]),l=!0,p=!0}}}p||a.push(h)}let u=a.length>1?"Patterns":"Pattern",g=a.length>1?"don't":"doesn't",f=this.all?"any":"this";if(a.length>0)throw new Pe(`${u} ${Ae.prettyList(e,a,Di.CODE)} ${g} match any packages referenced by ${f} workspace`);return l?(await e.triggerMultipleHooks(p=>p.afterWorkspaceDependencyRemoval,c),(await Je.start({configuration:e,stdout:this.context.stdout},async p=>{await r.install({cache:n,report:p,mode:this.mode})})).exitCode()):0}};xm.paths=[["remove"]],xm.usage=Re.Usage({description:"remove dependencies from the project",details:` - This command will remove the packages matching the specified patterns from the current workspace. - - If the \`--mode=\` option is set, Yarn will change which artifacts are generated. The modes currently supported are: - - - \`skip-build\` will not run the build scripts at all. Note that this is different from setting \`enableScripts\` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run. - - - \`update-lockfile\` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost. - - This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them. - `,examples:[["Remove a dependency from the current project","$0 remove lodash"],["Remove a dependency from all workspaces at once","$0 remove lodash --all"],["Remove all dependencies starting with `eslint-`","$0 remove 'eslint-*'"],["Remove all dependencies with the `@babel` scope","$0 remove '@babel/*'"],["Remove all dependencies matching `react-dom` or `react-helmet`","$0 remove 'react-{dom,helmet}'"]]});var Wae=xm;var zae=ge(require("util")),Ab=class extends Le{async execute(){let e=await we.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(r.cwd,this.context.cwd);return(await Je.start({configuration:e,stdout:this.context.stdout},async s=>{let o=i.manifest.scripts,a=ve.sortMap(o.keys(),u=>u),l={breakLength:Infinity,colors:e.get("enableColors"),maxArrayLength:2},c=a.reduce((u,g)=>Math.max(u,g.length),0);for(let[u,g]of o.entries())s.reportInfo(null,`${u.padEnd(c," ")} ${(0,zae.inspect)(g,l)}`)})).exitCode()}};Ab.paths=[["run"]];var _ae=Ab;var Pm=class extends Le{constructor(){super(...arguments);this.inspect=W.String("--inspect",!1,{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"});this.inspectBrk=W.String("--inspect-brk",!1,{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"});this.topLevel=W.Boolean("-T,--top-level",!1,{description:"Check the root workspace for scripts and/or binaries instead of the current one"});this.binariesOnly=W.Boolean("-B,--binaries-only",!1,{description:"Ignore any user defined scripts and only check for binaries"});this.silent=W.Boolean("--silent",{hidden:!0});this.scriptName=W.String();this.args=W.Proxy()}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),{project:r,workspace:i,locator:n}=await ze.find(e,this.context.cwd);await r.restoreInstallState();let s=this.topLevel?r.topLevelWorkspace.anchoredLocator:n;if(!this.binariesOnly&&await Zt.hasPackageScript(s,this.scriptName,{project:r}))return await Zt.executePackageScript(s,this.scriptName,this.args,{project:r,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});let o=await Zt.getPackageAccessibleBinaries(s,{project:r});if(o.get(this.scriptName)){let l=[];return this.inspect&&(typeof this.inspect=="string"?l.push(`--inspect=${this.inspect}`):l.push("--inspect")),this.inspectBrk&&(typeof this.inspectBrk=="string"?l.push(`--inspect-brk=${this.inspectBrk}`):l.push("--inspect-brk")),await Zt.executePackageAccessibleBinary(s,this.scriptName,this.args,{cwd:this.context.cwd,project:r,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,nodeArgs:l,packageAccessibleBinaries:o})}if(!this.topLevel&&!this.binariesOnly&&i&&this.scriptName.includes(":")){let c=(await Promise.all(r.workspaces.map(async u=>u.manifest.scripts.has(this.scriptName)?u:null))).filter(u=>u!==null);if(c.length===1)return await Zt.executeWorkspaceScript(c[0],this.scriptName,this.args,{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})}if(this.topLevel)throw this.scriptName==="node-gyp"?new Pe(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${P.prettyLocator(e,n)}). This typically happens because some package depends on "node-gyp" to build itself, but didn't list it in their dependencies. To fix that, please run "yarn add node-gyp" into your top-level workspace. You also can open an issue on the repository of the specified package to suggest them to use an optional peer dependency.`):new Pe(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${P.prettyLocator(e,n)}).`);{if(this.scriptName==="global")throw new Pe("The 'yarn global' commands have been removed in 2.x - consider using 'yarn dlx' or a third-party plugin instead");let l=[this.scriptName].concat(this.args);for(let[c,u]of Tf)for(let g of u)if(l.length>=g.length&&JSON.stringify(l.slice(0,g.length))===JSON.stringify(g))throw new Pe(`Couldn't find a script named "${this.scriptName}", but a matching command can be found in the ${c} plugin. You can install it with "yarn plugin import ${c}".`);throw new Pe(`Couldn't find a script named "${this.scriptName}".`)}}};Pm.paths=[["run"]],Pm.usage=Re.Usage({description:"run a script defined in the package.json",details:` - This command will run a tool. The exact tool that will be executed will depend on the current state of your workspace: - - - If the \`scripts\` field from your local package.json contains a matching script name, its definition will get executed. - - - Otherwise, if one of the local workspace's dependencies exposes a binary with a matching name, this binary will get executed. - - - Otherwise, if the specified name contains a colon character and if one of the workspaces in the project contains exactly one script with a matching name, then this script will get executed. - - Whatever happens, the cwd of the spawned process will be the workspace that declares the script (which makes it possible to call commands cross-workspaces using the third syntax). - `,examples:[["Run the tests from the local workspace","$0 run test"],['Same thing, but without the "run" keyword',"$0 test"],["Inspect Webpack while running","$0 run --inspect-brk webpack"]]});var Vae=Pm;var Dm=class extends Le{constructor(){super(...arguments);this.save=W.Boolean("-s,--save",!1,{description:"Persist the resolution inside the top-level manifest"});this.descriptor=W.String();this.resolution=W.String()}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(await r.restoreInstallState({restoreResolutions:!1}),!i)throw new ht(r.cwd,this.context.cwd);let s=P.parseDescriptor(this.descriptor,!0),o=P.makeDescriptor(s,this.resolution);return r.storedDescriptors.set(s.descriptorHash,s),r.storedDescriptors.set(o.descriptorHash,o),r.resolutionAliases.set(s.descriptorHash,o.descriptorHash),(await Je.start({configuration:e,stdout:this.context.stdout},async l=>{await r.install({cache:n,report:l})})).exitCode()}};Dm.paths=[["set","resolution"]],Dm.usage=Re.Usage({description:"enforce a package resolution",details:'\n This command updates the resolution table so that `descriptor` is resolved by `resolution`.\n\n Note that by default this command only affect the current resolution table - meaning that this "manual override" will disappear if you remove the lockfile, or if the package disappear from the table. If you wish to make the enforced resolution persist whatever happens, add the `-s,--save` flag which will also edit the `resolutions` field from your top-level manifest.\n\n Note that no attempt is made at validating that `resolution` is a valid resolution entry for `descriptor`.\n ',examples:[["Force all instances of lodash@npm:^1.2.3 to resolve to 1.5.0","$0 set resolution lodash@npm:^1.2.3 1.5.0"]]});var Xae=Dm;var Zae=ge(rs()),Rm=class extends Le{constructor(){super(...arguments);this.all=W.Boolean("-A,--all",!1,{description:"Unlink all workspaces belonging to the target project from the current one"});this.leadingArguments=W.Rest()}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(r.cwd,this.context.cwd);let s=r.topLevelWorkspace,o=new Set;if(this.leadingArguments.length===0&&this.all)for(let{pattern:l,reference:c}of s.manifest.resolutions)c.startsWith("portal:")&&o.add(l.descriptor.fullName);if(this.leadingArguments.length>0)for(let l of this.leadingArguments){let c=x.resolve(this.context.cwd,H.toPortablePath(l));if(ve.isPathLike(l)){let u=await we.find(c,this.context.plugins,{useRc:!1,strict:!1}),{project:g,workspace:f}=await ze.find(u,c);if(!f)throw new ht(g.cwd,c);if(this.all){for(let h of g.workspaces)h.manifest.name&&o.add(P.stringifyIdent(h.locator));if(o.size===0)throw new Pe("No workspace found to be unlinked in the target project")}else{if(!f.manifest.name)throw new Pe("The target workspace doesn't have a name and thus cannot be unlinked");o.add(P.stringifyIdent(f.locator))}}else{let u=[...s.manifest.resolutions.map(({pattern:g})=>g.descriptor.fullName)];for(let g of(0,Zae.default)(u,l))o.add(g)}}return s.manifest.resolutions=s.manifest.resolutions.filter(({pattern:l})=>!o.has(l.descriptor.fullName)),(await Je.start({configuration:e,stdout:this.context.stdout},async l=>{await r.install({cache:n,report:l})})).exitCode()}};Rm.paths=[["unlink"]],Rm.usage=Re.Usage({description:"disconnect the local project from another one",details:` - This command will remove any resolutions in the project-level manifest that would have been added via a yarn link with similar arguments. - `,examples:[["Unregister a remote workspace in the current project","$0 unlink ~/ts-loader"],["Unregister all workspaces from a remote project in the current project","$0 unlink ~/jest --all"],["Unregister all previously linked workspaces","$0 unlink --all"],["Unregister all workspaces matching a glob","$0 unlink '@babel/*' 'pkg-{a,b}'"]]});var $ae=Rm;var eAe=ge(em()),ZN=ge(rs());Is();var rh=class extends Le{constructor(){super(...arguments);this.interactive=W.Boolean("-i,--interactive",{description:"Offer various choices, depending on the detected upgrade paths"});this.exact=W.Boolean("-E,--exact",!1,{description:"Don't use any semver modifier on the resolved range"});this.tilde=W.Boolean("-T,--tilde",!1,{description:"Use the `~` semver modifier on the resolved range"});this.caret=W.Boolean("-C,--caret",!1,{description:"Use the `^` semver modifier on the resolved range"});this.recursive=W.Boolean("-R,--recursive",!1,{description:"Resolve again ALL resolutions for those packages"});this.mode=W.String("--mode",{description:"Change what artifacts installs generate",validator:nn(di)});this.patterns=W.Rest()}async execute(){return this.recursive?await this.executeUpRecursive():await this.executeUpClassic()}async executeUpRecursive(){let e=await we.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(r.cwd,this.context.cwd);await r.restoreInstallState({restoreResolutions:!1});let s=[...r.storedDescriptors.values()],o=s.map(u=>P.stringifyIdent(u)),a=new Set;for(let u of this.patterns){if(P.parseDescriptor(u).range!=="unknown")throw new Pe("Ranges aren't allowed when using --recursive");for(let g of(0,ZN.default)(o,u)){let f=P.parseIdent(g);a.add(f.identHash)}}let l=s.filter(u=>a.has(u.identHash));for(let u of l)r.storedDescriptors.delete(u.descriptorHash),r.storedResolutions.delete(u.descriptorHash);return(await Je.start({configuration:e,stdout:this.context.stdout},async u=>{await r.install({cache:n,report:u})})).exitCode()}async executeUpClassic(){var m;let e=await we.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(r.cwd,this.context.cwd);await r.restoreInstallState({restoreResolutions:!1});let s=(m=this.interactive)!=null?m:e.get("preferInteractive"),o=tm(this,r),a=s?[Vr.KEEP,Vr.REUSE,Vr.PROJECT,Vr.LATEST]:[Vr.PROJECT,Vr.LATEST],l=[],c=[];for(let y of this.patterns){let b=!1,S=P.parseDescriptor(y);for(let k of r.workspaces)for(let T of[Hr.REGULAR,Hr.DEVELOPMENT]){let j=[...k.manifest.getForScope(T).values()].map(Z=>P.stringifyIdent(Z));for(let Z of(0,ZN.default)(j,P.stringifyIdent(S))){let J=P.parseIdent(Z),re=k.manifest[T].get(J.identHash);if(typeof re=="undefined")throw new Error("Assertion failed: Expected the descriptor to be registered");let ee=P.makeDescriptor(J,S.range);l.push(Promise.resolve().then(async()=>[k,T,re,await rm(ee,{project:r,workspace:k,cache:n,target:T,modifier:o,strategies:a})])),b=!0}}b||c.push(y)}if(c.length>1)throw new Pe(`Patterns ${Ae.prettyList(e,c,Di.CODE)} don't match any packages referenced by any workspace`);if(c.length>0)throw new Pe(`Pattern ${Ae.prettyList(e,c,Di.CODE)} doesn't match any packages referenced by any workspace`);let u=await Promise.all(l),g=await gA.start({configuration:e,stdout:this.context.stdout,suggestInstall:!1},async y=>{for(let[,,b,{suggestions:S,rejections:k}]of u){let T=S.filter(Y=>Y.descriptor!==null);if(T.length===0){let[Y]=k;if(typeof Y=="undefined")throw new Error("Assertion failed: Expected an error to have been set");let j=this.cli.error(Y);r.configuration.get("enableNetwork")?y.reportError($.CANT_SUGGEST_RESOLUTIONS,`${P.prettyDescriptor(e,b)} can't be resolved to a satisfying range - -${j}`):y.reportError($.CANT_SUGGEST_RESOLUTIONS,`${P.prettyDescriptor(e,b)} can't be resolved to a satisfying range (note: network resolution has been disabled) - -${j}`)}else T.length>1&&!s&&y.reportError($.CANT_SUGGEST_RESOLUTIONS,`${P.prettyDescriptor(e,b)} has multiple possible upgrade strategies; use -i to disambiguate manually`)}});if(g.hasErrors())return g.exitCode();let f=!1,h=[];for(let[y,b,,{suggestions:S}]of u){let k,T=S.filter(J=>J.descriptor!==null),Y=T[0].descriptor,j=T.every(J=>P.areDescriptorsEqual(J.descriptor,Y));T.length===1||j?k=Y:(f=!0,{answer:k}=await(0,eAe.prompt)({type:"select",name:"answer",message:`Which range to you want to use in ${P.prettyWorkspace(e,y)} \u276F ${b}?`,choices:S.map(({descriptor:J,name:re,reason:ee})=>J?{name:re,hint:ee,descriptor:J}:{name:re,hint:ee,disabled:!0}),onCancel:()=>process.exit(130),result(J){return this.find(J,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout}));let Z=y.manifest[b].get(k.identHash);if(typeof Z=="undefined")throw new Error("Assertion failed: This descriptor should have a matching entry");if(Z.descriptorHash!==k.descriptorHash)y.manifest[b].set(k.identHash,k),h.push([y,b,Z,k]);else{let J=e.makeResolver(),re={project:r,resolver:J},ee=J.bindDescriptor(Z,y.anchoredLocator,re);r.forgetResolution(ee)}}return await e.triggerMultipleHooks(y=>y.afterWorkspaceDependencyReplacement,h),f&&this.context.stdout.write(` -`),(await Je.start({configuration:e,stdout:this.context.stdout},async y=>{await r.install({cache:n,report:y,mode:this.mode})})).exitCode()}};rh.paths=[["up"]],rh.usage=Re.Usage({description:"upgrade dependencies across the project",details:"\n This command upgrades the packages matching the list of specified patterns to their latest available version across the whole project (regardless of whether they're part of `dependencies` or `devDependencies` - `peerDependencies` won't be affected). This is a project-wide command: all workspaces will be upgraded in the process.\n\n If `-R,--recursive` is set the command will change behavior and no other switch will be allowed. When operating under this mode `yarn up` will force all ranges matching the selected packages to be resolved again (often to the highest available versions) before being stored in the lockfile. It however won't touch your manifests anymore, so depending on your needs you might want to run both `yarn up` and `yarn up -R` to cover all bases.\n\n If `-i,--interactive` is set (or if the `preferInteractive` settings is toggled on) the command will offer various choices, depending on the detected upgrade paths. Some upgrades require this flag in order to resolve ambiguities.\n\n The, `-C,--caret`, `-E,--exact` and `-T,--tilde` options have the same meaning as in the `add` command (they change the modifier used when the range is missing or a tag, and are ignored when the range is explicitly set).\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n Generally you can see `yarn up` as a counterpart to what was `yarn upgrade --latest` in Yarn 1 (ie it ignores the ranges previously listed in your manifests), but unlike `yarn upgrade` which only upgraded dependencies in the current workspace, `yarn up` will upgrade all workspaces at the same time.\n\n This command accepts glob patterns as arguments (if valid Descriptors and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n **Note:** The ranges have to be static, only the package scopes and names can contain glob patterns.\n ",examples:[["Upgrade all instances of lodash to the latest release","$0 up lodash"],["Upgrade all instances of lodash to the latest release, but ask confirmation for each","$0 up lodash -i"],["Upgrade all instances of lodash to 1.2.3","$0 up lodash@1.2.3"],["Upgrade all instances of packages with the `@babel` scope to the latest release","$0 up '@babel/*'"],["Upgrade all instances of packages containing the word `jest` to the latest release","$0 up '*jest*'"],["Upgrade all instances of packages with the `@babel` scope to 7.0.0","$0 up '@babel/*@7.0.0'"]]}),rh.schema=[gv("recursive",mc.Forbids,["interactive","exact","tilde","caret"],{ignore:[void 0,!1]})];var tAe=rh;var Fm=class extends Le{constructor(){super(...arguments);this.recursive=W.Boolean("-R,--recursive",!1,{description:"List, for each workspace, what are all the paths that lead to the dependency"});this.json=W.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.peers=W.Boolean("--peers",!1,{description:"Also print the peer dependencies that match the specified name"});this.package=W.String()}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(r.cwd,this.context.cwd);await r.restoreInstallState();let n=P.parseIdent(this.package).identHash,s=this.recursive?V8e(r,n,{configuration:e,peers:this.peers}):_8e(r,n,{configuration:e,peers:this.peers});As.emitTree(s,{configuration:e,stdout:this.context.stdout,json:this.json,separators:1})}};Fm.paths=[["why"]],Fm.usage=Re.Usage({description:"display the reason why a package is needed",details:` - This command prints the exact reasons why a package appears in the dependency tree. - - If \`-R,--recursive\` is set, the listing will go in depth and will list, for each workspaces, what are all the paths that lead to the dependency. Note that the display is somewhat optimized in that it will not print the package listing twice for a single package, so if you see a leaf named "Foo" when looking for "Bar", it means that "Foo" already got printed higher in the tree. - `,examples:[["Explain why lodash is used in your project","$0 why lodash"]]});var rAe=Fm;function _8e(t,e,{configuration:r,peers:i}){let n=ve.sortMap(t.storedPackages.values(),a=>P.stringifyLocator(a)),s={},o={children:s};for(let a of n){let l={},c=null;for(let u of a.dependencies.values()){if(!i&&a.peerDependencies.has(u.identHash))continue;let g=t.storedResolutions.get(u.descriptorHash);if(!g)throw new Error("Assertion failed: The resolution should have been registered");let f=t.storedPackages.get(g);if(!f)throw new Error("Assertion failed: The package should have been registered");if(f.identHash!==e)continue;if(c===null){let p=P.stringifyLocator(a);s[p]={value:[a,Ae.Type.LOCATOR],children:l}}let h=P.stringifyLocator(f);l[h]={value:[{descriptor:u,locator:f},Ae.Type.DEPENDENT]}}}return o}function V8e(t,e,{configuration:r,peers:i}){let n=ve.sortMap(t.workspaces,f=>P.stringifyLocator(f.anchoredLocator)),s=new Set,o=new Set,a=f=>{if(s.has(f.locatorHash))return o.has(f.locatorHash);if(s.add(f.locatorHash),f.identHash===e)return o.add(f.locatorHash),!0;let h=!1;f.identHash===e&&(h=!0);for(let p of f.dependencies.values()){if(!i&&f.peerDependencies.has(p.identHash))continue;let m=t.storedResolutions.get(p.descriptorHash);if(!m)throw new Error("Assertion failed: The resolution should have been registered");let y=t.storedPackages.get(m);if(!y)throw new Error("Assertion failed: The package should have been registered");a(y)&&(h=!0)}return h&&o.add(f.locatorHash),h};for(let f of n){let h=t.storedPackages.get(f.anchoredLocator.locatorHash);if(!h)throw new Error("Assertion failed: The package should have been registered");a(h)}let l=new Set,c={},u={children:c},g=(f,h,p)=>{if(!o.has(f.locatorHash))return;let m=p!==null?Ae.tuple(Ae.Type.DEPENDENT,{locator:f,descriptor:p}):Ae.tuple(Ae.Type.LOCATOR,f),y={},b={value:m,children:y},S=P.stringifyLocator(f);if(h[S]=b,!l.has(f.locatorHash)&&(l.add(f.locatorHash),!(p!==null&&t.tryWorkspaceByLocator(f))))for(let k of f.dependencies.values()){if(!i&&f.peerDependencies.has(k.identHash))continue;let T=t.storedResolutions.get(k.descriptorHash);if(!T)throw new Error("Assertion failed: The resolution should have been registered");let Y=t.storedPackages.get(T);if(!Y)throw new Error("Assertion failed: The package should have been registered");g(Y,y,k)}};for(let f of n){let h=t.storedPackages.get(f.anchoredLocator.locatorHash);if(!h)throw new Error("Assertion failed: The package should have been registered");g(h,c,null)}return u}var cL={};ft(cL,{default:()=>C4e,gitUtils:()=>Bu});var Bu={};ft(Bu,{TreeishProtocols:()=>On,clone:()=>aL,fetchBase:()=>BAe,fetchChangedFiles:()=>bAe,fetchChangedWorkspaces:()=>p4e,fetchRoot:()=>wAe,isGitUrl:()=>nh,lsRemote:()=>yAe,normalizeLocator:()=>nL,normalizeRepoUrl:()=>Nm,resolveUrl:()=>oL,splitRepoUrl:()=>Lm});var rL=ge(CAe()),mAe=ge(rB()),ih=ge(require("querystring")),iL=ge(ri()),EAe=ge(require("url"));function IAe(){return ie(N({},process.env),{GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND||`${process.env.GIT_SSH||"ssh"} -o BatchMode=yes`})}var h4e=[/^ssh:/,/^git(?:\+[^:]+)?:/,/^(?:git\+)?https?:[^#]+\/[^#]+(?:\.git)(?:#.*)?$/,/^git@[^#]+\/[^#]+\.git(?:#.*)?$/,/^(?:github:|https:\/\/github\.com\/)?(?!\.{1,2}\/)([a-zA-Z._0-9-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z._0-9-]+?)(?:\.git)?(?:#.*)?$/,/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/],On;(function(n){n.Commit="commit",n.Head="head",n.Tag="tag",n.Semver="semver"})(On||(On={}));function nh(t){return t?h4e.some(e=>!!t.match(e)):!1}function Lm(t){t=Nm(t);let e=t.indexOf("#");if(e===-1)return{repo:t,treeish:{protocol:On.Head,request:"HEAD"},extra:{}};let r=t.slice(0,e),i=t.slice(e+1);if(i.match(/^[a-z]+=/)){let n=ih.default.parse(i);for(let[l,c]of Object.entries(n))if(typeof c!="string")throw new Error(`Assertion failed: The ${l} parameter must be a literal string`);let s=Object.values(On).find(l=>Object.prototype.hasOwnProperty.call(n,l)),o,a;typeof s!="undefined"?(o=s,a=n[s]):(o=On.Head,a="HEAD");for(let l of Object.values(On))delete n[l];return{repo:r,treeish:{protocol:o,request:a},extra:n}}else{let n=i.indexOf(":"),s,o;return n===-1?(s=null,o=i):(s=i.slice(0,n),o=i.slice(n+1)),{repo:r,treeish:{protocol:s,request:o},extra:{}}}}function Nm(t,{git:e=!1}={}){var r;if(t=t.replace(/^git\+https:/,"https:"),t=t.replace(/^(?:github:|https:\/\/github\.com\/)?(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)(?:\.git)?(#.*)?$/,"https://github.com/$1/$2.git$3"),t=t.replace(/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/,"https://github.com/$1/$2.git#$3"),e){t=t.replace(/^git\+([^:]+):/,"$1:");let i;try{i=EAe.default.parse(t)}catch{i=null}i&&i.protocol==="ssh:"&&((r=i.path)==null?void 0:r.startsWith("/:"))&&(t=t.replace(/^ssh:\/\//,""))}return t}function nL(t){return P.makeLocator(t,Nm(t.reference))}async function yAe(t,e){let r=Nm(t,{git:!0});if(!ir.getNetworkSettings(`https://${(0,rL.default)(r).resource}`,{configuration:e}).enableNetwork)throw new Error(`Request to '${r}' has been blocked because of your configuration settings`);let n=await sL("listing refs",["ls-remote",r],{cwd:e.startingCwd,env:IAe()},{configuration:e,normalizedRepoUrl:r}),s=new Map,o=/^([a-f0-9]{40})\t([^\n]+)/gm,a;for(;(a=o.exec(n.stdout))!==null;)s.set(a[2],a[1]);return s}async function oL(t,e){let{repo:r,treeish:{protocol:i,request:n},extra:s}=Lm(t),o=await yAe(r,e),a=(c,u)=>{switch(c){case On.Commit:{if(!u.match(/^[a-f0-9]{40}$/))throw new Error("Invalid commit hash");return ih.default.stringify(ie(N({},s),{commit:u}))}case On.Head:{let g=o.get(u==="HEAD"?u:`refs/heads/${u}`);if(typeof g=="undefined")throw new Error(`Unknown head ("${u}")`);return ih.default.stringify(ie(N({},s),{commit:g}))}case On.Tag:{let g=o.get(`refs/tags/${u}`);if(typeof g=="undefined")throw new Error(`Unknown tag ("${u}")`);return ih.default.stringify(ie(N({},s),{commit:g}))}case On.Semver:{let g=Wt.validRange(u);if(!g)throw new Error(`Invalid range ("${u}")`);let f=new Map([...o.entries()].filter(([p])=>p.startsWith("refs/tags/")).map(([p,m])=>[iL.default.parse(p.slice(10)),m]).filter(p=>p[0]!==null)),h=iL.default.maxSatisfying([...f.keys()],g);if(h===null)throw new Error(`No matching range ("${u}")`);return ih.default.stringify(ie(N({},s),{commit:f.get(h)}))}case null:{let g;if((g=l(On.Commit,u))!==null||(g=l(On.Tag,u))!==null||(g=l(On.Head,u))!==null)return g;throw u.match(/^[a-f0-9]+$/)?new Error(`Couldn't resolve "${u}" as either a commit, a tag, or a head - if a commit, use the 40-characters commit hash`):new Error(`Couldn't resolve "${u}" as either a commit, a tag, or a head`)}default:throw new Error(`Invalid Git resolution protocol ("${c}")`)}},l=(c,u)=>{try{return a(c,u)}catch(g){return null}};return`${r}#${a(i,n)}`}async function aL(t,e){return await e.getLimit("cloneConcurrency")(async()=>{let{repo:r,treeish:{protocol:i,request:n}}=Lm(t);if(i!=="commit")throw new Error("Invalid treeish protocol when cloning");let s=Nm(r,{git:!0});if(ir.getNetworkSettings(`https://${(0,rL.default)(s).resource}`,{configuration:e}).enableNetwork===!1)throw new Error(`Request to '${s}' has been blocked because of your configuration settings`);let o=await K.mktempPromise(),a={cwd:o,env:IAe()};return await sL("cloning the repository",["clone","-c core.autocrlf=false",s,H.fromPortablePath(o)],a,{configuration:e,normalizedRepoUrl:s}),await sL("switching branch",["checkout",`${n}`],a,{configuration:e,normalizedRepoUrl:s}),o})}async function wAe(t){let e=null,r,i=t;do r=i,await K.existsPromise(x.join(r,".git"))&&(e=r),i=x.dirname(r);while(e===null&&i!==r);return e}async function BAe(t,{baseRefs:e}){if(e.length===0)throw new Pe("Can't run this command with zero base refs specified.");let r=[];for(let a of e){let{code:l}=await Fr.execvp("git",["merge-base",a,"HEAD"],{cwd:t});l===0&&r.push(a)}if(r.length===0)throw new Pe(`No ancestor could be found between any of HEAD and ${e.join(", ")}`);let{stdout:i}=await Fr.execvp("git",["merge-base","HEAD",...r],{cwd:t,strict:!0}),n=i.trim(),{stdout:s}=await Fr.execvp("git",["show","--quiet","--pretty=format:%s",n],{cwd:t,strict:!0}),o=s.trim();return{hash:n,title:o}}async function bAe(t,{base:e,project:r}){let i=ve.buildIgnorePattern(r.configuration.get("changesetIgnorePatterns")),{stdout:n}=await Fr.execvp("git",["diff","--name-only",`${e}`],{cwd:t,strict:!0}),s=n.split(/\r\n|\r|\n/).filter(c=>c.length>0).map(c=>x.resolve(t,H.toPortablePath(c))),{stdout:o}=await Fr.execvp("git",["ls-files","--others","--exclude-standard"],{cwd:t,strict:!0}),a=o.split(/\r\n|\r|\n/).filter(c=>c.length>0).map(c=>x.resolve(t,H.toPortablePath(c))),l=[...new Set([...s,...a].sort())];return i?l.filter(c=>!x.relative(r.cwd,c).match(i)):l}async function p4e({ref:t,project:e}){if(e.configuration.projectCwd===null)throw new Pe("This command can only be run from within a Yarn project");let r=[x.resolve(e.cwd,e.configuration.get("cacheFolder")),x.resolve(e.cwd,e.configuration.get("installStatePath")),x.resolve(e.cwd,e.configuration.get("lockfileFilename")),x.resolve(e.cwd,e.configuration.get("virtualFolder"))];await e.configuration.triggerHook(o=>o.populateYarnPaths,e,o=>{o!=null&&r.push(o)});let i=await wAe(e.configuration.projectCwd);if(i==null)throw new Pe("This command can only be run on Git repositories");let n=await BAe(i,{baseRefs:typeof t=="string"?[t]:e.configuration.get("changesetBaseRefs")}),s=await bAe(i,{base:n.hash,project:e});return new Set(ve.mapAndFilter(s,o=>{let a=e.tryWorkspaceByFilePath(o);return a===null?ve.mapAndFilter.skip:r.some(l=>o.startsWith(l))?ve.mapAndFilter.skip:a}))}async function sL(t,e,r,{configuration:i,normalizedRepoUrl:n}){try{return await Fr.execvp("git",e,ie(N({},r),{strict:!0}))}catch(s){if(!(s instanceof Fr.ExecError))throw s;let o=s.reportExtra,a=s.stderr.toString();throw new ct($.EXCEPTION,`Failed ${t}`,l=>{l.reportError($.EXCEPTION,` ${Ae.prettyField(i,{label:"Repository URL",value:Ae.tuple(Ae.Type.URL,n)})}`);for(let c of a.matchAll(/^(.+?): (.*)$/gm)){let[,u,g]=c;u=u.toLowerCase();let f=u==="error"?"Error":`${(0,mAe.default)(u)} Error`;l.reportError($.EXCEPTION,` ${Ae.prettyField(i,{label:f,value:Ae.tuple(Ae.Type.NO_HINT,g)})}`)}o==null||o(l)})}}var AL=class{supports(e,r){return nh(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,n=nL(e),s=new Map(r.checksums);s.set(n.locatorHash,i);let o=ie(N({},r),{checksums:s}),a=await this.downloadHosted(n,o);if(a!==null)return a;let[l,c,u]=await r.cache.fetchPackageFromCache(e,i,N({onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${P.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote repository`),loader:()=>this.cloneFromRemote(n,o),skipIntegrityCheck:r.skipIntegrityCheck},r.cacheOptions));return{packageFs:l,releaseFs:c,prefixPath:P.getIdentVendorPath(e),checksum:u}}async downloadHosted(e,r){return r.project.configuration.reduceHook(i=>i.fetchHostedRepository,null,e,r)}async cloneFromRemote(e,r){let i=await aL(e.reference,r.project.configuration),n=Lm(e.reference),s=x.join(i,"package.tgz");await Zt.prepareExternalProject(i,s,{configuration:r.project.configuration,report:r.report,workspace:n.extra.workspace,locator:e});let o=await K.readFilePromise(s);return await ve.releaseAfterUseAsync(async()=>await wi.convertToZip(o,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:P.getIdentVendorPath(e),stripComponents:1}))}};var lL=class{supportsDescriptor(e,r){return nh(e.range)}supportsLocator(e,r){return nh(e.reference)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){let n=await oL(e.range,i.project.configuration);return[P.makeLocator(e,n)]}async getSatisfying(e,r,i){return null}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),n=await ve.releaseAfterUseAsync(async()=>await At.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return ie(N({},e),{version:n.version||"0.0.0",languageName:n.languageName||r.project.configuration.get("defaultLanguageName"),linkType:Qt.HARD,conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var d4e={configuration:{changesetBaseRefs:{description:"The base git refs that the current HEAD is compared against when detecting changes. Supports git branches, tags, and commits.",type:ye.STRING,isArray:!0,isNullable:!1,default:["master","origin/master","upstream/master","main","origin/main","upstream/main"]},changesetIgnorePatterns:{description:"Array of glob patterns; files matching them will be ignored when fetching the changed files",type:ye.STRING,default:[],isArray:!0},cloneConcurrency:{description:"Maximal number of concurrent clones",type:ye.NUMBER,default:2}},fetchers:[AL],resolvers:[lL]};var C4e=d4e;var Tm=class extends Le{constructor(){super(...arguments);this.since=W.String("--since",{description:"Only include workspaces that have been changed since the specified ref.",tolerateBoolean:!0});this.recursive=W.Boolean("-R,--recursive",!1,{description:"Find packages via dependencies/devDependencies instead of using the workspaces field"});this.verbose=W.Boolean("-v,--verbose",!1,{description:"Also return the cross-dependencies between workspaces"});this.json=W.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),{project:r}=await ze.find(e,this.context.cwd);return(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout},async n=>{let s=this.since?await Bu.fetchChangedWorkspaces({ref:this.since,project:r}):r.workspaces,o=new Set(s);if(this.recursive)for(let a of[...s].map(l=>l.getRecursiveWorkspaceDependents()))for(let l of a)o.add(l);for(let a of o){let{manifest:l}=a,c;if(this.verbose){let u=new Set,g=new Set;for(let f of At.hardDependencies)for(let[h,p]of l.getForScope(f)){let m=r.tryWorkspaceByDescriptor(p);m===null?r.workspacesByIdent.has(h)&&g.add(p):u.add(m)}c={workspaceDependencies:Array.from(u).map(f=>f.relativeCwd),mismatchedWorkspaceDependencies:Array.from(g).map(f=>P.stringifyDescriptor(f))}}n.reportInfo(null,`${a.relativeCwd}`),n.reportJson(N({location:a.relativeCwd,name:l.name?P.stringifyIdent(l.name):null},c))}})).exitCode()}};Tm.paths=[["workspaces","list"]],Tm.usage=Re.Usage({category:"Workspace-related commands",description:"list all available workspaces",details:"\n This command will print the list of all workspaces in the project.\n\n - If `--since` is set, Yarn will only list workspaces that have been modified since the specified ref. By default Yarn will use the refs specified by the `changesetBaseRefs` configuration option.\n\n - If `-R,--recursive` is set, Yarn will find workspaces to run the command on by recursively evaluating `dependencies` and `devDependencies` fields, instead of looking at the `workspaces` fields.\n\n - If both the `-v,--verbose` and `--json` options are set, Yarn will also return the cross-dependencies between each workspaces (useful when you wish to automatically generate Buck / Bazel rules).\n "});var QAe=Tm;var Om=class extends Le{constructor(){super(...arguments);this.workspaceName=W.String();this.commandName=W.String();this.args=W.Proxy()}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(r.cwd,this.context.cwd);let n=r.workspaces,s=new Map(n.map(a=>{let l=P.convertToIdent(a.locator);return[P.stringifyIdent(l),a]})),o=s.get(this.workspaceName);if(o===void 0){let a=Array.from(s.keys()).sort();throw new Pe(`Workspace '${this.workspaceName}' not found. Did you mean any of the following: - - ${a.join(` - - `)}?`)}return this.cli.run([this.commandName,...this.args],{cwd:o.cwd})}};Om.paths=[["workspace"]],Om.usage=Re.Usage({category:"Workspace-related commands",description:"run a command within the specified workspace",details:` - This command will run a given sub-command on a single workspace. - `,examples:[["Add a package to a single workspace","yarn workspace components add -D react"],["Run build script on a single workspace","yarn workspace components run build"]]});var vAe=Om;var m4e={configuration:{enableImmutableInstalls:{description:"If true (the default on CI), prevents the install command from modifying the lockfile",type:ye.BOOLEAN,default:SAe.isCI},defaultSemverRangePrefix:{description:"The default save prefix: '^', '~' or ''",type:ye.STRING,values:["^","~",""],default:ga.CARET}},commands:[Ose,Kse,eae,gae,Xae,Oae,Qae,QAe,mae,Eae,Iae,yae,Lse,Tse,fae,pae,wae,Bae,Sae,xae,Pae,Rae,$ae,Fae,jae,Hae,Yae,Nae,qae,Jae,Wae,_ae,Vae,tAe,rAe,vAe]},E4e=m4e;var pL={};ft(pL,{default:()=>y4e});var qe={optional:!0},kAe=[["@tailwindcss/aspect-ratio@<0.2.1",{peerDependencies:{tailwindcss:"^2.0.2"}}],["@tailwindcss/line-clamp@<0.2.1",{peerDependencies:{tailwindcss:"^2.0.2"}}],["@fullhuman/postcss-purgecss@3.1.3 || 3.1.3-alpha.0",{peerDependencies:{postcss:"^8.0.0"}}],["@samverschueren/stream-to-observable@<0.3.1",{peerDependenciesMeta:{rxjs:qe,zenObservable:qe}}],["any-observable@<0.5.1",{peerDependenciesMeta:{rxjs:qe,zenObservable:qe}}],["@pm2/agent@<1.0.4",{dependencies:{debug:"*"}}],["debug@<4.2.0",{peerDependenciesMeta:{["supports-color"]:qe}}],["got@<11",{dependencies:{["@types/responselike"]:"^1.0.0",["@types/keyv"]:"^3.1.1"}}],["cacheable-lookup@<4.1.2",{dependencies:{["@types/keyv"]:"^3.1.1"}}],["http-link-dataloader@*",{peerDependencies:{graphql:"^0.13.1 || ^14.0.0"}}],["typescript-language-server@*",{dependencies:{["vscode-jsonrpc"]:"^5.0.1",["vscode-languageserver-protocol"]:"^3.15.0"}}],["postcss-syntax@*",{peerDependenciesMeta:{["postcss-html"]:qe,["postcss-jsx"]:qe,["postcss-less"]:qe,["postcss-markdown"]:qe,["postcss-scss"]:qe}}],["jss-plugin-rule-value-function@<=10.1.1",{dependencies:{["tiny-warning"]:"^1.0.2"}}],["ink-select-input@<4.1.0",{peerDependencies:{react:"^16.8.2"}}],["license-webpack-plugin@<2.3.18",{peerDependenciesMeta:{webpack:qe}}],["snowpack@>=3.3.0",{dependencies:{["node-gyp"]:"^7.1.0"}}],["promise-inflight@*",{peerDependenciesMeta:{bluebird:qe}}],["reactcss@*",{peerDependencies:{react:"*"}}],["react-color@<=2.19.0",{peerDependencies:{react:"*"}}],["gatsby-plugin-i18n@*",{dependencies:{ramda:"^0.24.1"}}],["useragent@^2.0.0",{dependencies:{request:"^2.88.0",yamlparser:"0.0.x",semver:"5.5.x"}}],["@apollographql/apollo-tools@*",{peerDependencies:{graphql:"^14.2.1 || ^15.0.0"}}],["material-table@^2.0.0",{dependencies:{"@babel/runtime":"^7.11.2"}}],["@babel/parser@*",{dependencies:{"@babel/types":"^7.8.3"}}],["fork-ts-checker-webpack-plugin@<=6.3.4",{peerDependencies:{eslint:">= 6",typescript:">= 2.7",webpack:">= 4","vue-template-compiler":"*"},peerDependenciesMeta:{eslint:qe,"vue-template-compiler":qe}}],["rc-animate@<=3.1.1",{peerDependencies:{react:">=16.9.0","react-dom":">=16.9.0"}}],["react-bootstrap-table2-paginator@*",{dependencies:{classnames:"^2.2.6"}}],["react-draggable@<=4.4.3",{peerDependencies:{react:">= 16.3.0","react-dom":">= 16.3.0"}}],["apollo-upload-client@<14",{peerDependencies:{graphql:"14 - 15"}}],["react-instantsearch-core@<=6.7.0",{peerDependencies:{algoliasearch:">= 3.1 < 5"}}],["react-instantsearch-dom@<=6.7.0",{dependencies:{"react-fast-compare":"^3.0.0"}}],["ws@<7.2.1",{peerDependencies:{bufferutil:"^4.0.1","utf-8-validate":"^5.0.2"},peerDependenciesMeta:{bufferutil:qe,"utf-8-validate":qe}}],["react-portal@*",{peerDependencies:{"react-dom":"^15.0.0-0 || ^16.0.0-0 || ^17.0.0-0"}}],["react-scripts@<=4.0.1",{peerDependencies:{react:"*"}}],["testcafe@<=1.10.1",{dependencies:{"@babel/plugin-transform-for-of":"^7.12.1","@babel/runtime":"^7.12.5"}}],["testcafe-legacy-api@<=4.2.0",{dependencies:{"testcafe-hammerhead":"^17.0.1","read-file-relative":"^1.2.0"}}],["@google-cloud/firestore@<=4.9.3",{dependencies:{protobufjs:"^6.8.6"}}],["gatsby-source-apiserver@*",{dependencies:{["babel-polyfill"]:"^6.26.0"}}],["@webpack-cli/package-utils@<=1.0.1-alpha.4",{dependencies:{["cross-spawn"]:"^7.0.3"}}],["gatsby-remark-prismjs@<3.3.28",{dependencies:{lodash:"^4"}}],["gatsby-plugin-favicon@*",{peerDependencies:{webpack:"*"}}],["gatsby-plugin-sharp@<=4.6.0-next.3",{dependencies:{debug:"^4.3.1"}}],["gatsby-react-router-scroll@<=5.6.0-next.0",{dependencies:{["prop-types"]:"^15.7.2"}}],["@rebass/forms@*",{dependencies:{["@styled-system/should-forward-prop"]:"^5.0.0"},peerDependencies:{react:"^16.8.6"}}],["rebass@*",{peerDependencies:{react:"^16.8.6"}}],["@ant-design/react-slick@<=0.28.3",{peerDependencies:{react:">=16.0.0"}}],["mqtt@<4.2.7",{dependencies:{duplexify:"^4.1.1"}}],["vue-cli-plugin-vuetify@<=2.0.3",{dependencies:{semver:"^6.3.0"},peerDependenciesMeta:{"sass-loader":qe,"vuetify-loader":qe}}],["vue-cli-plugin-vuetify@<=2.0.4",{dependencies:{"null-loader":"^3.0.0"}}],["@vuetify/cli-plugin-utils@<=0.0.4",{dependencies:{semver:"^6.3.0"},peerDependenciesMeta:{"sass-loader":qe}}],["@vue/cli-plugin-typescript@<=5.0.0-alpha.0",{dependencies:{"babel-loader":"^8.1.0"}}],["@vue/cli-plugin-typescript@<=5.0.0-beta.0",{dependencies:{"@babel/core":"^7.12.16"},peerDependencies:{"vue-template-compiler":"^2.0.0"},peerDependenciesMeta:{"vue-template-compiler":qe}}],["cordova-ios@<=6.3.0",{dependencies:{underscore:"^1.9.2"}}],["cordova-lib@<=10.0.1",{dependencies:{underscore:"^1.9.2"}}],["git-node-fs@*",{peerDependencies:{"js-git":"^0.7.8"},peerDependenciesMeta:{"js-git":qe}}],["consolidate@*",{peerDependencies:{velocityjs:"^2.0.1",tinyliquid:"^0.2.34","liquid-node":"^3.0.1",jade:"^1.11.0","then-jade":"*",dust:"^0.3.0","dustjs-helpers":"^1.7.4","dustjs-linkedin":"^2.7.5",swig:"^1.4.2","swig-templates":"^2.0.3","razor-tmpl":"^1.3.1",atpl:">=0.7.6",liquor:"^0.0.5",twig:"^1.15.2",ejs:"^3.1.5",eco:"^1.1.0-rc-3",jazz:"^0.0.18",jqtpl:"~1.1.0",hamljs:"^0.6.2",hamlet:"^0.3.3",whiskers:"^0.4.0","haml-coffee":"^1.14.1","hogan.js":"^3.0.2",templayed:">=0.2.3",handlebars:"^4.7.6",underscore:"^1.11.0",lodash:"^4.17.20",pug:"^3.0.0","then-pug":"*",qejs:"^3.0.5",walrus:"^0.10.1",mustache:"^4.0.1",just:"^0.1.8",ect:"^0.5.9",mote:"^0.2.0",toffee:"^0.3.6",dot:"^1.1.3","bracket-template":"^1.1.5",ractive:"^1.3.12",nunjucks:"^3.2.2",htmling:"^0.0.8","babel-core":"^6.26.3",plates:"~0.4.11","react-dom":"^16.13.1",react:"^16.13.1","arc-templates":"^0.5.3",vash:"^0.13.0",slm:"^2.0.0",marko:"^3.14.4",teacup:"^2.0.0","coffee-script":"^1.12.7",squirrelly:"^5.1.0",twing:"^5.0.2"},peerDependenciesMeta:{velocityjs:qe,tinyliquid:qe,"liquid-node":qe,jade:qe,"then-jade":qe,dust:qe,"dustjs-helpers":qe,"dustjs-linkedin":qe,swig:qe,"swig-templates":qe,"razor-tmpl":qe,atpl:qe,liquor:qe,twig:qe,ejs:qe,eco:qe,jazz:qe,jqtpl:qe,hamljs:qe,hamlet:qe,whiskers:qe,"haml-coffee":qe,"hogan.js":qe,templayed:qe,handlebars:qe,underscore:qe,lodash:qe,pug:qe,"then-pug":qe,qejs:qe,walrus:qe,mustache:qe,just:qe,ect:qe,mote:qe,toffee:qe,dot:qe,"bracket-template":qe,ractive:qe,nunjucks:qe,htmling:qe,"babel-core":qe,plates:qe,"react-dom":qe,react:qe,"arc-templates":qe,vash:qe,slm:qe,marko:qe,teacup:qe,"coffee-script":qe,squirrelly:qe,twing:qe}}],["vue-loader@<=16.3.1",{peerDependencies:{"@vue/compiler-sfc":"^3.0.8",webpack:"^4.1.0 || ^5.0.0-0"}}],["scss-parser@*",{dependencies:{lodash:"^4.17.21"}}],["query-ast@*",{dependencies:{lodash:"^4.17.21"}}],["redux-thunk@<=2.3.0",{peerDependencies:{redux:"^4.0.0"}}],["skypack@<=0.3.2",{dependencies:{tar:"^6.1.0"}}],["@npmcli/metavuln-calculator@<2.0.0",{dependencies:{"json-parse-even-better-errors":"^2.3.1"}}],["bin-links@<2.3.0",{dependencies:{"mkdirp-infer-owner":"^1.0.2"}}],["rollup-plugin-polyfill-node@<=0.8.0",{peerDependencies:{rollup:"^1.20.0 || ^2.0.0"}}],["snowpack@<3.8.6",{dependencies:{"magic-string":"^0.25.7"}}],["elm-webpack-loader@*",{dependencies:{temp:"^0.9.4"}}],["winston-transport@<=4.4.0",{dependencies:{logform:"^2.2.0"}}],["jest-vue-preprocessor@*",{dependencies:{"@babel/core":"7.8.7","@babel/template":"7.8.6"},peerDependencies:{pug:"^2.0.4"},peerDependenciesMeta:{pug:qe}}],["redux-persist@*",{peerDependencies:{react:">=16"},peerDependenciesMeta:{react:qe}}],["sodium@>=3",{dependencies:{"node-gyp":"^3.8.0"}}],["babel-plugin-graphql-tag@<=3.1.0",{peerDependencies:{graphql:"^14.0.0 || ^15.0.0"}}],["@playwright/test@<=1.14.1",{dependencies:{"jest-matcher-utils":"^26.4.2"}}],...["babel-plugin-remove-graphql-queries@<3.14.0-next.1","babel-preset-gatsby-package@<1.14.0-next.1","create-gatsby@<1.14.0-next.1","gatsby-admin@<0.24.0-next.1","gatsby-cli@<3.14.0-next.1","gatsby-core-utils@<2.14.0-next.1","gatsby-design-tokens@<3.14.0-next.1","gatsby-legacy-polyfills@<1.14.0-next.1","gatsby-plugin-benchmark-reporting@<1.14.0-next.1","gatsby-plugin-graphql-config@<0.23.0-next.1","gatsby-plugin-image@<1.14.0-next.1","gatsby-plugin-mdx@<2.14.0-next.1","gatsby-plugin-netlify-cms@<5.14.0-next.1","gatsby-plugin-no-sourcemaps@<3.14.0-next.1","gatsby-plugin-page-creator@<3.14.0-next.1","gatsby-plugin-preact@<5.14.0-next.1","gatsby-plugin-preload-fonts@<2.14.0-next.1","gatsby-plugin-schema-snapshot@<2.14.0-next.1","gatsby-plugin-styletron@<6.14.0-next.1","gatsby-plugin-subfont@<3.14.0-next.1","gatsby-plugin-utils@<1.14.0-next.1","gatsby-recipes@<0.25.0-next.1","gatsby-source-shopify@<5.6.0-next.1","gatsby-source-wikipedia@<3.14.0-next.1","gatsby-transformer-screenshot@<3.14.0-next.1","gatsby-worker@<0.5.0-next.1"].map(t=>[t,{dependencies:{"@babel/runtime":"^7.14.8"}}]),["gatsby-core-utils@<2.14.0-next.1",{dependencies:{got:"8.3.2"}}],["gatsby-plugin-gatsby-cloud@<=3.1.0-next.0",{dependencies:{"gatsby-core-utils":"^2.13.0-next.0"}}],["gatsby-plugin-gatsby-cloud@<=3.2.0-next.1",{peerDependencies:{webpack:"*"}}],["babel-plugin-remove-graphql-queries@<=3.14.0-next.1",{dependencies:{"gatsby-core-utils":"^2.8.0-next.1"}}],["gatsby-plugin-netlify@3.13.0-next.1",{dependencies:{"gatsby-core-utils":"^2.13.0-next.0"}}],["clipanion-v3-codemod@<=0.2.0",{peerDependencies:{jscodeshift:"^0.11.0"}}],["react-live@*",{peerDependencies:{"react-dom":"*",react:"*"}}],["webpack@<4.44.1",{peerDependenciesMeta:{"webpack-cli":qe,"webpack-command":qe}}],["webpack@<5.0.0-beta.23",{peerDependenciesMeta:{"webpack-cli":qe}}],["webpack-dev-server@<3.10.2",{peerDependenciesMeta:{"webpack-cli":qe}}],["@docusaurus/responsive-loader@<1.5.0",{peerDependenciesMeta:{sharp:qe,jimp:qe}}],["eslint-module-utils@*",{peerDependenciesMeta:{"eslint-import-resolver-node":qe,"eslint-import-resolver-typescript":qe,"eslint-import-resolver-webpack":qe,"@typescript-eslint/parser":qe}}],["eslint-plugin-import@*",{peerDependenciesMeta:{"@typescript-eslint/parser":qe}}],["critters-webpack-plugin@<3.0.2",{peerDependenciesMeta:{"html-webpack-plugin":qe}}],["terser@<=5.10.0",{dependencies:{acorn:"^8.5.0"}}],["babel-preset-react-app@10.0.x",{dependencies:{"@babel/plugin-proposal-private-property-in-object":"^7.16.0"}}],["eslint-config-react-app@*",{peerDependenciesMeta:{typescript:qe}}],["@vue/eslint-config-typescript@*",{peerDependenciesMeta:{typescript:qe}}],["unplugin-vue2-script-setup@<0.9.1",{peerDependencies:{"@vue/composition-api":"^1.4.3","@vue/runtime-dom":"^3.2.26"}}]];var gL;function xAe(){return typeof gL=="undefined"&&(gL=require("zlib").brotliDecompressSync(Buffer.from("G7weAByFTVk3Vs7UfHhq4yykgEM7pbW7TI43SG2S5tvGrwHBAzdz+s/npQ6tgEvobvxisrPIadkXeUAJotBn5bDZ5kAhcRqsIHe3F75Walet5hNalwgFDtxb0BiDUjiUQkjG0yW2hto9HPgiCkm316d6bC0kST72YN7D7rfkhCE9x4J0XwB0yavalxpUu2t9xszHrmtwalOxT7VslsxWcB1qpqZwERUra4psWhTV8BgwWeizurec82Caf1ABL11YMfbf8FJ9JBceZOkgmvrQPbC9DUldX/yMbmX06UQluCEjSwUoyO+EZPIjofr+/oAZUck2enraRD+oWLlnlYnj8xB+gwSo9lmmks4fXv574qSqcWA6z21uYkzMu3EWj+K23RxeQlLqiE35/rC8GcS4CGkKHKKq+zAIQwD9iRDNfiAqueLLpicFFrNsAI4zeTD/eO9MHcnRa5m8UT+M2+V+AkFST4BlKneiAQRSdST8KEAIyFlULt6wa9EBd0Ds28VmpaxquJdVt+nwdEs5xUskI13OVtFyY0UrQIRAlCuvvWivvlSKQfTO+2Q8OyUR1W5RvetaPz4jD27hdtwHFFA1Ptx6Ee/t2cY2rg2G46M1pNDRf2pWhvpy8pqMnuI3++4OF3+7OFIWXGjh+o7Nr2jNvbiYcQdQS1h903/jVFgOpA0yJ78z+x759bFA0rq+6aY5qPB4FzS3oYoLupDUhD9nDz6F6H7hpnlMf18KNKDu4IKjTWwrAnY6MFQw1W6ymOALHlFyCZmQhldg1MQHaMVVQTVgDC60TfaBqG++Y8PEoFhN/PBTZT175KNP/BlHDYGOOBmnBdzqJKplZ/ljiVG0ZBzfqeBRrrUkn6rA54462SgiliKoYVnbeptMdXNfAuaupIEi0bApF10TlgHfmEJAPUVidRVFyDupSem5po5vErPqWKhKbUIp0LozpYsIKK57dM/HKr+nguF+7924IIWMICkQ8JUigs9D+W+c4LnNoRtPPKNRUiCYmP+Jfo2lfKCKw8qpraEeWU3uiNRO6zcyKQoXPR5htmzzLznke7b4YbXW3I1lIRzmgG02Udb58U+7TpwyN7XymCgH+wuPDthZVQvRZuEP+SnLtMicz9m5zASWOBiAcLmkuFlTKuHspSIhCBD0yUPKcxu81A+4YD78rA2vtwsUEday9WNyrShyrl60rWmA+SmbYZkQOwFJWArxRYYc5jGhA5ikxYw1rx3ei4NmeX/lKiwpZ9Ln1tV2Ae7sArvxuVLbJjqJRjW1vFXAyHpvLG+8MJ6T2Ubx5M2KDa2SN6vuIGxJ9WQM9Mk3Q7aCNiZONXllhqq24DmoLbQfW2rYWsOgHWjtOmIQMyMKdiHZDjoyIq5+U700nZ6odJAoYXPQBvFNiQ78d5jaXliBqLTJEqUCwi+LiH2mx92EmNKDsJL74Z613+3lf20pxkV1+erOrjj8pW00vsPaahKUM+05ssd5uwM7K482KWEf3TCwlg/o3e5ngto7qSMz7YteIgCsF1UOcsLk7F7MxWbvrPMY473ew0G+noVL8EPbkmEMftMSeL6HFub/zy+2JQ==","base64")).toString()),gL}var fL;function PAe(){return typeof fL=="undefined"&&(fL=require("zlib").brotliDecompressSync(Buffer.from("G8MSIIzURnVBnObTcvb3XE6v2S9Qgc2K801Oa5otNKEtK8BINZNcaQHy+9/vf/WXBimwutXC33P2DPc64pps5rz7NGGWaOKNSPL4Y2KRE8twut2lFOIN+OXPtRmPMRhMTILib2bEQx43az2I5d3YS8Roa5UZpF/ujHb3Djd3GDvYUfvFYSUQ39vb2cmifp/rgB4J/65JK3wRBTvMBoNBmn3mbXC63/gbBkW/2IRPri0O8bcsRBsmarF328pAln04nyJFkwUAvNu934supAqLtyerZZpJ8I8suJHhf/ocMV+scKwa8NOiDKIPXw6Ex/EEZD6TEGaW8N5zvNHYF10l6Lfooj7D5W2k3dgvQSbp2Wv8TGOayS978gxlOLVjTGXs66ozewbrjwElLtyrYNnWTfzzdEutgROUFPVMhnMoy8EjJLLlWwIEoySxliim9kYW30JUHiPVyjt0iAw/ZpPmCbUCltYPnq6ZNblIKhTNhqS/oqC9iya5sGKZTOVsTEg34n92uZTf2iPpcZih8rPW8CzA+adIGmyCPcKdLMsBLShd+zuEbTrqpwuh+DLmracZcjPC5Sdf5odDAhKpFuOsQS67RT+1VgWWygSv3YwxDnylc04/PYuaMeIzhBkLrvs7e/OUzRTF56MmfY6rI63QtEjEQzq637zQqJ39nNhu3NmoRRhW/086bHGBUtx0PE0j3aEGvkdh9WJC8y8j8mqqke9/dQ5la+Q3ba4RlhvTbnfQhPDDab3tUifkjKuOsp13mXEmO00Mu88F/M67R7LXfoFDFLNtgCSWjWX+3Jn1371pJTK9xPBiMJafvDjtFyAzu8rxeQ0TKMQXNPs5xxiBOd+BRJP8KP88XPtJIbZKh/cdW8KvBUkpqKpGoiIaA32c3/JnQr4efXt85mXvidOvn/eU3Pase1typLYBalJ14mCso9h79nuMOuCa/kZAOkJHmTjP5RM2WNoPasZUAnT1TAE/NH25hUxcQv6hQWR/m1PKk4ooXMcM4SR1iYU3fUohvqk4RY2hbmTVVIXv6TvqO+0doOjgeVFAcom+RlwJQmOVH7pr1Q9LoJT6n1DeQEB+NHygsATbIwTcOKZlJsY8G4+suX1uQLjUWwLjjs0mvSvZcLTpIGAekeR7GCgl8eo3ndAqEe2XCav4huliHjdbIPBsGJuPX7lrO9HX1UbXRH5opOe1x6JsOSgHZR+EaxuXVhpLLxm6jk1LJtZfHSc6BKPun3CpYYVMJGwEUyk8MTGG0XL5MfEwaXpnc9TKnBmlGn6nHiGREc3ysn47XIBDzA+YvFdjZzVIEDcKGpS6PbUJehFRjEne8D0lVU1XuRtlgszq6pTNlQ/3MzNOEgCWPyTct22V2mEi2krizn5VDo9B19/X2DB3hCGRMM7ONbtnAcIx/OWB1u5uPbW1gsH8irXxT/IzG0PoXWYjhbMsH3KTuoOl5o17PulcgvsfTSnKFM354GWI8luqZnrswWjiXy3G+Vbyo1KMopFmmvBwNELgaS8z8dNZchx/Cl/xjddxhMcyqtzFyONb2Zdu90NkI8pAeufe7YlXrp53v8Dj/l8vWeVspRKBGXScBBPI/HinSTGmLDOGGOCIyH0JFdOZx0gWsacNlQLJMIrBhqRxXxHF/5pseWwejlAAvZ3klZSDSYY8mkToaWejXhgNomeGtx1DTLEUFMRkgF5yFB22WYdJnaWN14r1YJj81hGi45+jrADS5nYRhCiSlCJJ1nL8pYX+HDSMhdTEWyRcgHVp/IsUIZYMfT+YYncUQPgcxNGCHfZ88vDdrcUuaGIl6zhAsiaq7R5dfqrqXH/JcBhfjT8D0azayIyEz75Nxp6YkcyDxlJq3EXnJUpqDohJJOysL1t1uNiHESlvsxPb5cpbW0+ICZqJmUZus1BMW0F5IVBODLIo2zHHjA0=","base64")).toString()),fL}var hL;function DAe(){return typeof hL=="undefined"&&(hL=require("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),hL}var RAe=new Map([[P.makeIdent(null,"fsevents").identHash,xAe],[P.makeIdent(null,"resolve").identHash,PAe],[P.makeIdent(null,"typescript").identHash,DAe]]),I4e={hooks:{registerPackageExtensions:async(t,e)=>{for(let[r,i]of kAe)e(P.parseDescriptor(r,!0),i)},getBuiltinPatch:async(t,e)=>{var s;let r="compat/";if(!e.startsWith(r))return;let i=P.parseIdent(e.slice(r.length)),n=(s=RAe.get(i.identHash))==null?void 0:s();return typeof n!="undefined"?n:null},reduceDependency:async(t,e,r,i)=>typeof RAe.get(t.identHash)=="undefined"?t:P.makeDescriptor(t,P.makeRange({protocol:"patch:",source:P.stringifyDescriptor(t),selector:`~builtin`,params:null}))}},y4e=I4e;var dL={};ft(dL,{default:()=>B4e});var lb=class extends Le{constructor(){super(...arguments);this.pkg=W.String("-p,--package",{description:"The package to run the provided command from"});this.quiet=W.Boolean("-q,--quiet",!1,{description:"Only report critical errors instead of printing the full install logs"});this.command=W.String();this.args=W.Proxy()}async execute(){let e=[];this.pkg&&e.push("--package",this.pkg),this.quiet&&e.push("--quiet");let r=P.parseIdent(this.command),i=P.makeIdent(r.scope,`create-${r.name}`);return this.cli.run(["dlx",...e,P.stringifyIdent(i),...this.args])}};lb.paths=[["create"]];var FAe=lb;var Mm=class extends Le{constructor(){super(...arguments);this.packages=W.Array("-p,--package",{description:"The package(s) to install before running the command"});this.quiet=W.Boolean("-q,--quiet",!1,{description:"Only report critical errors instead of printing the full install logs"});this.command=W.String();this.args=W.Proxy()}async execute(){return we.telemetry=null,await K.mktempPromise(async e=>{var p;let r=x.join(e,`dlx-${process.pid}`);await K.mkdirPromise(r),await K.writeFilePromise(x.join(r,"package.json"),`{} -`),await K.writeFilePromise(x.join(r,"yarn.lock"),"");let i=x.join(r,".yarnrc.yml"),n=await we.findProjectCwd(this.context.cwd,Pt.lockfile),s=!(await we.find(this.context.cwd,null,{strict:!1})).get("enableGlobalCache"),o=n!==null?x.join(n,".yarnrc.yml"):null;o!==null&&K.existsSync(o)?(await K.copyFilePromise(o,i),await we.updateConfiguration(r,m=>{let y=ie(N({},m),{enableGlobalCache:s,enableTelemetry:!1});return Array.isArray(m.plugins)&&(y.plugins=m.plugins.map(b=>{let S=typeof b=="string"?b:b.path,k=H.isAbsolute(S)?S:H.resolve(H.fromPortablePath(n),S);return typeof b=="string"?k:{path:k,spec:b.spec}})),y})):await K.writeFilePromise(i,`enableGlobalCache: ${s} -enableTelemetry: false -`);let a=(p=this.packages)!=null?p:[this.command],l=P.parseDescriptor(this.command).name,c=await this.cli.run(["add","--",...a],{cwd:r,quiet:this.quiet});if(c!==0)return c;this.quiet||this.context.stdout.write(` -`);let u=await we.find(r,this.context.plugins),{project:g,workspace:f}=await ze.find(u,r);if(f===null)throw new ht(g.cwd,r);await g.restoreInstallState();let h=await Zt.getWorkspaceAccessibleBinaries(f);return h.has(l)===!1&&h.size===1&&typeof this.packages=="undefined"&&(l=Array.from(h)[0][0]),await Zt.executeWorkspaceAccessibleBinary(f,l,this.args,{packageAccessibleBinaries:h,cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})})}};Mm.paths=[["dlx"]],Mm.usage=Re.Usage({description:"run a package in a temporary environment",details:"\n This command will install a package within a temporary environment, and run its binary script if it contains any. The binary will run within the current cwd.\n\n By default Yarn will download the package named `command`, but this can be changed through the use of the `-p,--package` flag which will instruct Yarn to still run the same command but from a different package.\n\n Using `yarn dlx` as a replacement of `yarn add` isn't recommended, as it makes your project non-deterministic (Yarn doesn't keep track of the packages installed through `dlx` - neither their name, nor their version).\n ",examples:[["Use create-react-app to create a new React app","yarn dlx create-react-app ./my-app"],["Install multiple packages for a single command",`yarn dlx -p typescript -p ts-node ts-node --transpile-only -e "console.log('hello!')"`]]});var NAe=Mm;var w4e={commands:[FAe,NAe]},B4e=w4e;var QL={};ft(QL,{default:()=>v4e,fileUtils:()=>CL});var sh=/^(?:[a-zA-Z]:[\\/]|\.{0,2}\/)/,Km=/^[^?]*\.(?:tar\.gz|tgz)(?:::.*)?$/,Xr="file:";var CL={};ft(CL,{makeArchiveFromLocator:()=>cb,makeBufferFromLocator:()=>IL,makeLocator:()=>EL,makeSpec:()=>LAe,parseSpec:()=>mL});function mL(t){let{params:e,selector:r}=P.parseRange(t),i=H.toPortablePath(r);return{parentLocator:e&&typeof e.locator=="string"?P.parseLocator(e.locator):null,path:i}}function LAe({parentLocator:t,path:e,folderHash:r,protocol:i}){let n=t!==null?{locator:P.stringifyLocator(t)}:{},s=typeof r!="undefined"?{hash:r}:{};return P.makeRange({protocol:i,source:e,selector:e,params:N(N({},s),n)})}function EL(t,{parentLocator:e,path:r,folderHash:i,protocol:n}){return P.makeLocator(t,LAe({parentLocator:e,path:r,folderHash:i,protocol:n}))}async function cb(t,{protocol:e,fetchOptions:r,inMemory:i=!1}){let{parentLocator:n,path:s}=P.parseFileStyleRange(t.reference,{protocol:e}),o=x.isAbsolute(s)?{packageFs:new _t(Ke.root),prefixPath:Ke.dot,localPath:Ke.root}:await r.fetcher.fetch(n,r),a=o.localPath?{packageFs:new _t(Ke.root),prefixPath:x.relative(Ke.root,o.localPath)}:o;o!==a&&o.releaseFs&&o.releaseFs();let l=a.packageFs,c=x.join(a.prefixPath,s);return await ve.releaseAfterUseAsync(async()=>await wi.makeArchiveFromDirectory(c,{baseFs:l,prefixPath:P.getIdentVendorPath(t),compressionLevel:r.project.configuration.get("compressionLevel"),inMemory:i}),a.releaseFs)}async function IL(t,{protocol:e,fetchOptions:r}){return(await cb(t,{protocol:e,fetchOptions:r,inMemory:!0})).getBufferAndClose()}var yL=class{supports(e,r){return!!e.reference.startsWith(Xr)}getLocalPath(e,r){let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:Xr});if(x.isAbsolute(n))return n;let s=r.fetcher.getLocalPath(i,r);return s===null?null:x.resolve(s,n)}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,N({onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${P.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,r),skipIntegrityCheck:r.skipIntegrityCheck},r.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:o}}async fetchFromDisk(e,r){return cb(e,{protocol:Xr,fetchOptions:r})}};var b4e=2,wL=class{supportsDescriptor(e,r){return e.range.match(sh)?!0:!!e.range.startsWith(Xr)}supportsLocator(e,r){return!!e.reference.startsWith(Xr)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,i){return sh.test(e.range)&&(e=P.makeDescriptor(e,`${Xr}${e.range}`)),P.bindDescriptor(e,{locator:P.stringifyLocator(r)})}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){if(!i.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{path:n,parentLocator:s}=mL(e.range);if(s===null)throw new Error("Assertion failed: The descriptor should have been bound");let o=await IL(P.makeLocator(e,P.makeRange({protocol:Xr,source:n,selector:n,params:{locator:P.stringifyLocator(s)}})),{protocol:Xr,fetchOptions:i.fetchOptions}),a=Dn.makeHash(`${b4e}`,o).slice(0,6);return[EL(e,{parentLocator:s,path:n,folderHash:a,protocol:Xr})]}async getSatisfying(e,r,i){return null}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),n=await ve.releaseAfterUseAsync(async()=>await At.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return ie(N({},e),{version:n.version||"0.0.0",languageName:n.languageName||r.project.configuration.get("defaultLanguageName"),linkType:Qt.HARD,conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var BL=class{supports(e,r){return Km.test(e.reference)?!!e.reference.startsWith(Xr):!1}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,N({onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${P.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,r),skipIntegrityCheck:r.skipIntegrityCheck},r.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromDisk(e,r){let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:Xr}),s=x.isAbsolute(n)?{packageFs:new _t(Ke.root),prefixPath:Ke.dot,localPath:Ke.root}:await r.fetcher.fetch(i,r),o=s.localPath?{packageFs:new _t(Ke.root),prefixPath:x.relative(Ke.root,s.localPath)}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=x.join(o.prefixPath,n),c=await a.readFilePromise(l);return await ve.releaseAfterUseAsync(async()=>await wi.convertToZip(c,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:P.getIdentVendorPath(e),stripComponents:1}),o.releaseFs)}};var bL=class{supportsDescriptor(e,r){return Km.test(e.range)?!!(e.range.startsWith(Xr)||sh.test(e.range)):!1}supportsLocator(e,r){return Km.test(e.reference)?!!e.reference.startsWith(Xr):!1}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,i){return sh.test(e.range)&&(e=P.makeDescriptor(e,`${Xr}${e.range}`)),P.bindDescriptor(e,{locator:P.stringifyLocator(r)})}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){let n=e.range;return n.startsWith(Xr)&&(n=n.slice(Xr.length)),[P.makeLocator(e,`${Xr}${H.toPortablePath(n)}`)]}async getSatisfying(e,r,i){return null}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),n=await ve.releaseAfterUseAsync(async()=>await At.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return ie(N({},e),{version:n.version||"0.0.0",languageName:n.languageName||r.project.configuration.get("defaultLanguageName"),linkType:Qt.HARD,conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var Q4e={fetchers:[BL,yL],resolvers:[bL,wL]},v4e=Q4e;var SL={};ft(SL,{default:()=>x4e});var TAe=ge(require("querystring")),OAe=[/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+)\/tarball\/([^/#]+)(?:#(.*))?$/,/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+?)(?:\.git)?(?:#(.*))?$/];function MAe(t){return t?OAe.some(e=>!!t.match(e)):!1}function KAe(t){let e;for(let a of OAe)if(e=t.match(a),e)break;if(!e)throw new Error(S4e(t));let[,r,i,n,s="master"]=e,{commit:o}=TAe.default.parse(s);return s=o||s.replace(/[^:]*:/,""),{auth:r,username:i,reponame:n,treeish:s}}function S4e(t){return`Input cannot be parsed as a valid GitHub URL ('${t}').`}var vL=class{supports(e,r){return!!MAe(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,N({onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${P.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from GitHub`),loader:()=>this.fetchFromNetwork(e,r),skipIntegrityCheck:r.skipIntegrityCheck},r.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,r){let i=await ir.get(this.getLocatorUrl(e,r),{configuration:r.project.configuration});return await K.mktempPromise(async n=>{let s=new _t(n);await wi.extractArchiveTo(i,s,{stripComponents:1});let o=Bu.splitRepoUrl(e.reference),a=x.join(n,"package.tgz");await Zt.prepareExternalProject(n,a,{configuration:r.project.configuration,report:r.report,workspace:o.extra.workspace,locator:e});let l=await K.readFilePromise(a);return await wi.convertToZip(l,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:P.getIdentVendorPath(e),stripComponents:1})})}getLocatorUrl(e,r){let{auth:i,username:n,reponame:s,treeish:o}=KAe(e.reference);return`https://${i?`${i}@`:""}github.com/${n}/${s}/archive/${o}.tar.gz`}};var k4e={hooks:{async fetchHostedRepository(t,e,r){if(t!==null)return t;let i=new vL;if(!i.supports(e,r))return null;try{return await i.fetch(e,r)}catch(n){return null}}}},x4e=k4e;var PL={};ft(PL,{default:()=>D4e});var Um=/^[^?]*\.(?:tar\.gz|tgz)(?:\?.*)?$/,Hm=/^https?:/;var kL=class{supports(e,r){return Um.test(e.reference)?!!Hm.test(e.reference):!1}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,N({onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${P.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,r),skipIntegrityCheck:r.skipIntegrityCheck},r.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,r){let i=await ir.get(e.reference,{configuration:r.project.configuration});return await wi.convertToZip(i,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:P.getIdentVendorPath(e),stripComponents:1})}};var xL=class{supportsDescriptor(e,r){return Um.test(e.range)?!!Hm.test(e.range):!1}supportsLocator(e,r){return Um.test(e.reference)?!!Hm.test(e.reference):!1}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){return[P.convertDescriptorToLocator(e)]}async getSatisfying(e,r,i){return null}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),n=await ve.releaseAfterUseAsync(async()=>await At.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return ie(N({},e),{version:n.version||"0.0.0",languageName:n.languageName||r.project.configuration.get("defaultLanguageName"),linkType:Qt.HARD,conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var P4e={fetchers:[kL],resolvers:[xL]},D4e=P4e;var NL={};ft(NL,{default:()=>Rze});var gle=ge(ule()),FL=ge(require("util")),Gm=class extends Le{constructor(){super(...arguments);this.private=W.Boolean("-p,--private",!1,{description:"Initialize a private package"});this.workspace=W.Boolean("-w,--workspace",!1,{description:"Initialize a workspace root with a `packages/` directory"});this.install=W.String("-i,--install",!1,{tolerateBoolean:!0,description:"Initialize a package with a specific bundle that will be locked in the project"});this.usev2=W.Boolean("-2",!1,{hidden:!0});this.yes=W.Boolean("-y,--yes",{hidden:!0});this.assumeFreshProject=W.Boolean("--assume-fresh-project",!1,{hidden:!0})}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),r=typeof this.install=="string"?this.install:this.usev2||this.install===!0?"latest":null;return r!==null?await this.executeProxy(e,r):await this.executeRegular(e)}async executeProxy(e,r){if(e.projectCwd!==null&&e.projectCwd!==this.context.cwd)throw new Pe("Cannot use the --install flag from within a project subdirectory");K.existsSync(this.context.cwd)||await K.mkdirPromise(this.context.cwd,{recursive:!0});let i=x.join(this.context.cwd,e.get("lockfileFilename"));K.existsSync(i)||await K.writeFilePromise(i,"");let n=await this.cli.run(["set","version",r],{quiet:!0});if(n!==0)return n;let s=[];return this.private&&s.push("-p"),this.workspace&&s.push("-w"),this.yes&&s.push("-y"),await K.mktempPromise(async o=>{let{code:a}=await Fr.pipevp("yarn",["init",...s],{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,env:await Zt.makeScriptEnv({binFolder:o})});return a})}async executeRegular(e){var l;let r=null;try{r=(await ze.find(e,this.context.cwd)).project}catch{r=null}K.existsSync(this.context.cwd)||await K.mkdirPromise(this.context.cwd,{recursive:!0});let i=await At.tryFind(this.context.cwd)||new At,n=Object.fromEntries(e.get("initFields").entries());i.load(n),i.name=(l=i.name)!=null?l:P.makeIdent(e.get("initScope"),x.basename(this.context.cwd)),i.packageManager=Kr&&ve.isTaggedYarnVersion(Kr)?`yarn@${Kr}`:null,typeof i.raw.private=="undefined"&&(this.private||this.workspace&&i.workspaceDefinitions.length===0)&&(i.private=!0),this.workspace&&i.workspaceDefinitions.length===0&&(await K.mkdirPromise(x.join(this.context.cwd,"packages"),{recursive:!0}),i.workspaceDefinitions=[{pattern:"packages/*"}]);let s={};i.exportTo(s),FL.inspect.styles.name="cyan",this.context.stdout.write(`${(0,FL.inspect)(s,{depth:Infinity,colors:!0,compact:!1})} -`);let o=x.join(this.context.cwd,At.fileName);await K.changeFilePromise(o,`${JSON.stringify(s,null,2)} -`,{automaticNewlines:!0});let a=x.join(this.context.cwd,"README.md");if(K.existsSync(a)||await K.writeFilePromise(a,`# ${P.stringifyIdent(i.name)} -`),!r||r.cwd===this.context.cwd){let c=x.join(this.context.cwd,Pt.lockfile);K.existsSync(c)||await K.writeFilePromise(c,"");let g=[".yarn/*","!.yarn/patches","!.yarn/plugins","!.yarn/releases","!.yarn/sdks","!.yarn/versions","","# Swap the comments on the following lines if you don't wish to use zero-installs","# Documentation here: https://yarnpkg.com/features/zero-installs","!.yarn/cache","#.pnp.*"].map(y=>`${y} -`).join(""),f=x.join(this.context.cwd,".gitignore");K.existsSync(f)||await K.writeFilePromise(f,g);let h={["*"]:{endOfLine:"lf",insertFinalNewline:!0},["*.{js,json,yml}"]:{charset:"utf-8",indentStyle:"space",indentSize:2}};(0,gle.default)(h,e.get("initEditorConfig"));let p=`root = true -`;for(let[y,b]of Object.entries(h)){p+=` -[${y}] -`;for(let[S,k]of Object.entries(b))p+=`${S.replace(/[A-Z]/g,Y=>`_${Y.toLowerCase()}`)} = ${k} -`}let m=x.join(this.context.cwd,".editorconfig");K.existsSync(m)||await K.writeFilePromise(m,p),K.existsSync(x.join(this.context.cwd,".git"))||await Fr.execvp("git",["init"],{cwd:this.context.cwd})}}};Gm.paths=[["init"]],Gm.usage=Re.Usage({description:"create a new package",details:"\n This command will setup a new package in your local directory.\n\n If the `-p,--private` or `-w,--workspace` options are set, the package will be private by default.\n\n If the `-w,--workspace` option is set, the package will be configured to accept a set of workspaces in the `packages/` directory.\n\n If the `-i,--install` option is given a value, Yarn will first download it using `yarn set version` and only then forward the init call to the newly downloaded bundle. Without arguments, the downloaded bundle will be `latest`.\n\n The initial settings of the manifest can be changed by using the `initScope` and `initFields` configuration values. Additionally, Yarn will generate an EditorConfig file whose rules can be altered via `initEditorConfig`, and will initialize a Git repository in the current directory.\n ",examples:[["Create a new package in the local directory","yarn init"],["Create a new private package in the local directory","yarn init -p"],["Create a new package and store the Yarn release inside","yarn init -i=latest"],["Create a new private package and defines it as a workspace root","yarn init -w"]]});var fle=Gm;var Dze={configuration:{initScope:{description:"Scope used when creating packages via the init command",type:ye.STRING,default:null},initFields:{description:"Additional fields to set when creating packages via the init command",type:ye.MAP,valueDefinition:{description:"",type:ye.ANY}},initEditorConfig:{description:"Extra rules to define in the generator editorconfig",type:ye.MAP,valueDefinition:{description:"",type:ye.ANY}}},commands:[fle]},Rze=Dze;var KL={};ft(KL,{default:()=>Nze});var EA="portal:",IA="link:";var LL=class{supports(e,r){return!!e.reference.startsWith(EA)}getLocalPath(e,r){let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:EA});if(x.isAbsolute(n))return n;let s=r.fetcher.getLocalPath(i,r);return s===null?null:x.resolve(s,n)}async fetch(e,r){var c;let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:EA}),s=x.isAbsolute(n)?{packageFs:new _t(Ke.root),prefixPath:Ke.dot,localPath:Ke.root}:await r.fetcher.fetch(i,r),o=s.localPath?{packageFs:new _t(Ke.root),prefixPath:x.relative(Ke.root,s.localPath),localPath:Ke.root}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=x.resolve((c=o.localPath)!=null?c:o.packageFs.getRealPath(),o.prefixPath,n);return s.localPath?{packageFs:new _t(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Ke.dot,localPath:l}:{packageFs:new Ra(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Ke.dot}}};var TL=class{supportsDescriptor(e,r){return!!e.range.startsWith(EA)}supportsLocator(e,r){return!!e.reference.startsWith(EA)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,i){return P.bindDescriptor(e,{locator:P.stringifyLocator(r)})}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){let n=e.range.slice(EA.length);return[P.makeLocator(e,`${EA}${H.toPortablePath(n)}`)]}async getSatisfying(e,r,i){return null}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),n=await ve.releaseAfterUseAsync(async()=>await At.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return ie(N({},e),{version:n.version||"0.0.0",languageName:n.languageName||r.project.configuration.get("defaultLanguageName"),linkType:Qt.SOFT,conditions:n.getConditions(),dependencies:new Map([...n.dependencies]),peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var OL=class{supports(e,r){return!!e.reference.startsWith(IA)}getLocalPath(e,r){let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:IA});if(x.isAbsolute(n))return n;let s=r.fetcher.getLocalPath(i,r);return s===null?null:x.resolve(s,n)}async fetch(e,r){var c;let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:IA}),s=x.isAbsolute(n)?{packageFs:new _t(Ke.root),prefixPath:Ke.dot,localPath:Ke.root}:await r.fetcher.fetch(i,r),o=s.localPath?{packageFs:new _t(Ke.root),prefixPath:x.relative(Ke.root,s.localPath),localPath:Ke.root}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=x.resolve((c=o.localPath)!=null?c:o.packageFs.getRealPath(),o.prefixPath,n);return s.localPath?{packageFs:new _t(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Ke.dot,discardFromLookup:!0,localPath:l}:{packageFs:new Ra(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Ke.dot,discardFromLookup:!0}}};var ML=class{supportsDescriptor(e,r){return!!e.range.startsWith(IA)}supportsLocator(e,r){return!!e.reference.startsWith(IA)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,i){return P.bindDescriptor(e,{locator:P.stringifyLocator(r)})}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){let n=e.range.slice(IA.length);return[P.makeLocator(e,`${IA}${H.toPortablePath(n)}`)]}async getSatisfying(e,r,i){return null}async resolve(e,r){return ie(N({},e),{version:"0.0.0",languageName:r.project.configuration.get("defaultLanguageName"),linkType:Qt.SOFT,conditions:null,dependencies:new Map,peerDependencies:new Map,dependenciesMeta:new Map,peerDependenciesMeta:new Map,bin:new Map})}};var Fze={fetchers:[OL,LL],resolvers:[ML,TL]},Nze=Fze;var fT={};ft(fT,{default:()=>j5e});var Mn;(function(i){i[i.REGULAR=0]="REGULAR",i[i.WORKSPACE=1]="WORKSPACE",i[i.EXTERNAL_SOFT_LINK=2]="EXTERNAL_SOFT_LINK"})(Mn||(Mn={}));var yA;(function(i){i[i.YES=0]="YES",i[i.NO=1]="NO",i[i.DEPENDS=2]="DEPENDS"})(yA||(yA={}));var UL=(t,e)=>`${t}@${e}`,hle=(t,e)=>{let r=e.indexOf("#"),i=r>=0?e.substring(r+1):e;return UL(t,i)},Io;(function(s){s[s.NONE=-1]="NONE",s[s.PERF=0]="PERF",s[s.CHECK=1]="CHECK",s[s.REASONS=2]="REASONS",s[s.INTENSIVE_CHECK=9]="INTENSIVE_CHECK"})(Io||(Io={}));var dle=(t,e={})=>{let r=e.debugLevel||Number(process.env.NM_DEBUG_LEVEL||-1),i=e.check||r>=9,n=e.hoistingLimits||new Map,s={check:i,debugLevel:r,hoistingLimits:n,fastLookupPossible:!0},o;s.debugLevel>=0&&(o=Date.now());let a=Lze(t,s),l=!1,c=0;do l=HL(a,[a],new Set([a.locator]),new Map,s).anotherRoundNeeded,s.fastLookupPossible=!1,c++;while(l);if(s.debugLevel>=0&&console.log(`hoist time: ${Date.now()-o}ms, rounds: ${c}`),s.debugLevel>=1){let u=jm(a);if(HL(a,[a],new Set([a.locator]),new Map,s).isGraphChanged)throw new Error(`The hoisting result is not terminal, prev tree: -${u}, next tree: -${jm(a)}`);let f=ple(a);if(f)throw new Error(`${f}, after hoisting finished: -${jm(a)}`)}return s.debugLevel>=2&&console.log(jm(a)),Tze(a)},Oze=t=>{let e=t[t.length-1],r=new Map,i=new Set,n=s=>{if(!i.has(s)){i.add(s);for(let o of s.hoistedDependencies.values())r.set(o.name,o);for(let o of s.dependencies.values())s.peerNames.has(o.name)||n(o)}};return n(e),r},Mze=t=>{let e=t[t.length-1],r=new Map,i=new Set,n=new Set,s=(o,a)=>{if(i.has(o))return;i.add(o);for(let c of o.hoistedDependencies.values())if(!a.has(c.name)){let u;for(let g of t)u=g.dependencies.get(c.name),u&&r.set(u.name,u)}let l=new Set;for(let c of o.dependencies.values())l.add(c.name);for(let c of o.dependencies.values())o.peerNames.has(c.name)||s(c,l)};return s(e,n),r},Cle=(t,e)=>{if(e.decoupled)return e;let{name:r,references:i,ident:n,locator:s,dependencies:o,originalDependencies:a,hoistedDependencies:l,peerNames:c,reasons:u,isHoistBorder:g,hoistPriority:f,dependencyKind:h,hoistedFrom:p,hoistedTo:m}=e,y={name:r,references:new Set(i),ident:n,locator:s,dependencies:new Map(o),originalDependencies:new Map(a),hoistedDependencies:new Map(l),peerNames:new Set(c),reasons:new Map(u),decoupled:!0,isHoistBorder:g,hoistPriority:f,dependencyKind:h,hoistedFrom:new Map(p),hoistedTo:new Map(m)},b=y.dependencies.get(r);return b&&b.ident==y.ident&&y.dependencies.set(r,y),t.dependencies.set(y.name,y),y},Kze=(t,e)=>{let r=new Map([[t.name,[t.ident]]]);for(let n of t.dependencies.values())t.peerNames.has(n.name)||r.set(n.name,[n.ident]);let i=Array.from(e.keys());i.sort((n,s)=>{let o=e.get(n),a=e.get(s);return a.hoistPriority!==o.hoistPriority?a.hoistPriority-o.hoistPriority:a.peerDependents.size!==o.peerDependents.size?a.peerDependents.size-o.peerDependents.size:a.dependents.size-o.dependents.size});for(let n of i){let s=n.substring(0,n.indexOf("@",1)),o=n.substring(s.length+1);if(!t.peerNames.has(s)){let a=r.get(s);a||(a=[],r.set(s,a)),a.indexOf(o)<0&&a.push(o)}}return r},GL=t=>{let e=new Set,r=(i,n=new Set)=>{if(!n.has(i)){n.add(i);for(let s of i.peerNames)if(!t.peerNames.has(s)){let o=t.dependencies.get(s);o&&!e.has(o)&&r(o,n)}e.add(i)}};for(let i of t.dependencies.values())t.peerNames.has(i.name)||r(i);return e},HL=(t,e,r,i,n,s=new Set)=>{let o=e[e.length-1];if(s.has(o))return{anotherRoundNeeded:!1,isGraphChanged:!1};s.add(o);let a=Hze(o),l=Kze(o,a),c=t==o?new Map:n.fastLookupPossible?Oze(e):Mze(e),u,g=!1,f=!1,h=new Map(Array.from(l.entries()).map(([m,y])=>[m,y[0]])),p=new Map;do{let m=Uze(t,e,r,c,h,l,i,p,n);m.isGraphChanged&&(f=!0),m.anotherRoundNeeded&&(g=!0),u=!1;for(let[y,b]of l)b.length>1&&!o.dependencies.has(y)&&(h.delete(y),b.shift(),h.set(y,b[0]),u=!0)}while(u);for(let m of o.dependencies.values())if(!o.peerNames.has(m.name)&&!r.has(m.locator)){r.add(m.locator);let y=HL(t,[...e,m],r,p,n);y.isGraphChanged&&(f=!0),y.anotherRoundNeeded&&(g=!0),r.delete(m.locator)}return{anotherRoundNeeded:g,isGraphChanged:f}},Gze=t=>{for(let[e,r]of t.dependencies)if(!t.peerNames.has(e)&&r.ident!==t.ident)return!0;return!1},jze=(t,e,r,i,n,s,o,a,{outputReason:l,fastLookupPossible:c})=>{let u,g=null,f=new Set;l&&(u=`${Array.from(e).map(y=>Ni(y)).join("\u2192")}`);let h=r[r.length-1],m=!(i.ident===h.ident);if(l&&!m&&(g="- self-reference"),m&&(m=i.dependencyKind!==1,l&&!m&&(g="- workspace")),m&&i.dependencyKind===2&&(m=!Gze(i),l&&!m&&(g="- external soft link with unhoisted dependencies")),m&&(m=h.dependencyKind!==1||h.hoistedFrom.has(i.name)||e.size===1,l&&!m&&(g=h.reasons.get(i.name))),m&&(m=!t.peerNames.has(i.name),l&&!m&&(g=`- cannot shadow peer: ${Ni(t.originalDependencies.get(i.name).locator)} at ${u}`)),m){let y=!1,b=n.get(i.name);if(y=!b||b.ident===i.ident,l&&!y&&(g=`- filled by: ${Ni(b.locator)} at ${u}`),y)for(let S=r.length-1;S>=1;S--){let T=r[S].dependencies.get(i.name);if(T&&T.ident!==i.ident){y=!1;let Y=a.get(h);Y||(Y=new Set,a.set(h,Y)),Y.add(i.name),l&&(g=`- filled by ${Ni(T.locator)} at ${r.slice(0,S).map(j=>Ni(j.locator)).join("\u2192")}`);break}}m=y}if(m&&(m=s.get(i.name)===i.ident,l&&!m&&(g=`- filled by: ${Ni(o.get(i.name)[0])} at ${u}`)),m){let y=!0,b=new Set(i.peerNames);for(let S=r.length-1;S>=1;S--){let k=r[S];for(let T of b){if(k.peerNames.has(T)&&k.originalDependencies.has(T))continue;let Y=k.dependencies.get(T);Y&&t.dependencies.get(T)!==Y&&(S===r.length-1?f.add(Y):(f=null,y=!1,l&&(g=`- peer dependency ${Ni(Y.locator)} from parent ${Ni(k.locator)} was not hoisted to ${u}`))),b.delete(T)}if(!y)break}m=y}if(m&&!c)for(let y of i.hoistedDependencies.values()){let b=n.get(y.name)||t.dependencies.get(y.name);if(!b||y.ident!==b.ident){m=!1,l&&(g=`- previously hoisted dependency mismatch, needed: ${Ni(y.locator)}, available: ${Ni(b==null?void 0:b.locator)}`);break}}return f!==null&&f.size>0?{isHoistable:2,dependsOn:f,reason:g}:{isHoistable:m?0:1,reason:g}},ub=t=>`${t.name}@${t.locator}`,Uze=(t,e,r,i,n,s,o,a,l)=>{let c=e[e.length-1],u=new Set,g=!1,f=!1,h=(b,S,k,T,Y)=>{if(u.has(T))return;let j=[...S,ub(T)],Z=[...k,ub(T)],J=new Map,re=new Map;for(let X of GL(T)){let O=jze(c,r,[c,...b,T],X,i,n,s,a,{outputReason:l.debugLevel>=2,fastLookupPossible:l.fastLookupPossible});if(re.set(X,O),O.isHoistable===2)for(let L of O.dependsOn){let pe=J.get(L.name)||new Set;pe.add(X.name),J.set(L.name,pe)}}let ee=new Set,A=(X,O,L)=>{if(!ee.has(X)){ee.add(X),re.set(X,{isHoistable:1,reason:L});for(let pe of J.get(X.name)||[])A(T.dependencies.get(pe),O,l.debugLevel>=2?`- peer dependency ${Ni(X.locator)} from parent ${Ni(T.locator)} was not hoisted`:"")}};for(let[X,O]of re)O.isHoistable===1&&A(X,O,O.reason);let oe=!1;for(let X of re.keys())if(!ee.has(X)){f=!0;let O=o.get(T);O&&O.has(X.name)&&(g=!0),oe=!0,T.dependencies.delete(X.name),T.hoistedDependencies.set(X.name,X),T.reasons.delete(X.name);let L=c.dependencies.get(X.name);if(l.debugLevel>=2){let pe=Array.from(S).concat([T.locator]).map(Oe=>Ni(Oe)).join("\u2192"),Ce=c.hoistedFrom.get(X.name);Ce||(Ce=[],c.hoistedFrom.set(X.name,Ce)),Ce.push(pe),T.hoistedTo.set(X.name,Array.from(e).map(Oe=>Ni(Oe.locator)).join("\u2192"))}if(!L)c.ident!==X.ident&&(c.dependencies.set(X.name,X),Y.add(X));else for(let pe of X.references)L.references.add(pe)}if(T.dependencyKind===2&&oe&&(g=!0),l.check){let X=ple(t);if(X)throw new Error(`${X}, after hoisting dependencies of ${[c,...b,T].map(O=>Ni(O.locator)).join("\u2192")}: -${jm(t)}`)}let le=GL(T);for(let X of le)if(ee.has(X)){let O=re.get(X);if((n.get(X.name)===X.ident||!T.reasons.has(X.name))&&O.isHoistable!==0&&T.reasons.set(X.name,O.reason),!X.isHoistBorder&&Z.indexOf(ub(X))<0){u.add(T);let pe=Cle(T,X);h([...b,T],j,Z,pe,m),u.delete(T)}}},p,m=new Set(GL(c)),y=Array.from(e).map(b=>ub(b));do{p=m,m=new Set;for(let b of p){if(b.locator===c.locator||b.isHoistBorder)continue;let S=Cle(c,b);h([],Array.from(r),y,S,m)}}while(m.size>0);return{anotherRoundNeeded:g,isGraphChanged:f}},ple=t=>{let e=[],r=new Set,i=new Set,n=(s,o,a)=>{if(r.has(s)||(r.add(s),i.has(s)))return;let l=new Map(o);for(let c of s.dependencies.values())s.peerNames.has(c.name)||l.set(c.name,c);for(let c of s.originalDependencies.values()){let u=l.get(c.name),g=()=>`${Array.from(i).concat([s]).map(f=>Ni(f.locator)).join("\u2192")}`;if(s.peerNames.has(c.name)){let f=o.get(c.name);(f!==u||!f||f.ident!==c.ident)&&e.push(`${g()} - broken peer promise: expected ${c.ident} but found ${f&&f.ident}`)}else{let f=a.hoistedFrom.get(s.name),h=s.hoistedTo.get(c.name),p=`${f?` hoisted from ${f.join(", ")}`:""}`,m=`${h?` hoisted to ${h}`:""}`,y=`${g()}${p}`;u?u.ident!==c.ident&&e.push(`${y} - broken require promise for ${c.name}${m}: expected ${c.ident}, but found: ${u.ident}`):e.push(`${y} - broken require promise: no required dependency ${c.name}${m} found`)}}i.add(s);for(let c of s.dependencies.values())s.peerNames.has(c.name)||n(c,l,s);i.delete(s)};return n(t,t.dependencies,t),e.join(` -`)},Lze=(t,e)=>{let{identName:r,name:i,reference:n,peerNames:s}=t,o={name:i,references:new Set([n]),locator:UL(r,n),ident:hle(r,n),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(s),reasons:new Map,decoupled:!0,isHoistBorder:!0,hoistPriority:0,dependencyKind:1,hoistedFrom:new Map,hoistedTo:new Map},a=new Map([[t,o]]),l=(c,u)=>{let g=a.get(c),f=!!g;if(!g){let{name:h,identName:p,reference:m,peerNames:y,hoistPriority:b,dependencyKind:S}=c,k=e.hoistingLimits.get(u.locator);g={name:h,references:new Set([m]),locator:UL(p,m),ident:hle(p,m),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(y),reasons:new Map,decoupled:!0,isHoistBorder:k?k.has(h):!1,hoistPriority:b||0,dependencyKind:S||0,hoistedFrom:new Map,hoistedTo:new Map},a.set(c,g)}if(u.dependencies.set(c.name,g),u.originalDependencies.set(c.name,g),f){let h=new Set,p=m=>{if(!h.has(m)){h.add(m),m.decoupled=!1;for(let y of m.dependencies.values())m.peerNames.has(y.name)||p(y)}};p(g)}else for(let h of c.dependencies)l(h,g)};for(let c of t.dependencies)l(c,o);return o},jL=t=>t.substring(0,t.indexOf("@",1)),Tze=t=>{let e={name:t.name,identName:jL(t.locator),references:new Set(t.references),dependencies:new Set},r=new Set([t]),i=(n,s,o)=>{let a=r.has(n),l;if(s===n)l=o;else{let{name:c,references:u,locator:g}=n;l={name:c,identName:jL(g),references:u,dependencies:new Set}}if(o.dependencies.add(l),!a){r.add(n);for(let c of n.dependencies.values())n.peerNames.has(c.name)||i(c,n,l);r.delete(n)}};for(let n of t.dependencies.values())i(n,t,e);return e},Hze=t=>{let e=new Map,r=new Set([t]),i=o=>`${o.name}@${o.ident}`,n=o=>{let a=i(o),l=e.get(a);return l||(l={dependents:new Set,peerDependents:new Set,hoistPriority:0},e.set(a,l)),l},s=(o,a)=>{let l=!!r.has(a);if(n(a).dependents.add(o.ident),!l){r.add(a);for(let u of a.dependencies.values()){let g=n(u);g.hoistPriority=Math.max(g.hoistPriority,u.hoistPriority),a.peerNames.has(u.name)?g.peerDependents.add(a.ident):s(a,u)}}};for(let o of t.dependencies.values())t.peerNames.has(o.name)||s(t,o);return e},Ni=t=>{if(!t)return"none";let e=t.indexOf("@",1),r=t.substring(0,e);r.endsWith("$wsroot$")&&(r=`wh:${r.replace("$wsroot$","")}`);let i=t.substring(e+1);if(i==="workspace:.")return".";if(i){let n=(i.indexOf("#")>0?i.split("#")[1]:i).replace("npm:","");return i.startsWith("virtual")&&(r=`v:${r}`),n.startsWith("workspace")&&(r=`w:${r}`,n=""),`${r}${n?`@${n}`:""}`}else return`${r}`},mle=5e4,jm=t=>{let e=0,r=(n,s,o="")=>{if(e>mle||s.has(n))return"";e++;let a=Array.from(n.dependencies.values()).sort((c,u)=>c.name===u.name?0:c.name>u.name?1:-1),l="";s.add(n);for(let c=0;c":"")+(f!==u.name?`a:${u.name}:`:"")+Ni(u.locator)+(g?` ${g}`:"")} -`,l+=r(u,s,`${o}${cmle?` -Tree is too large, part of the tree has been dunped -`:"")};var yo;(function(r){r.HARD="HARD",r.SOFT="SOFT"})(yo||(yo={}));var Kn;(function(i){i.WORKSPACES="workspaces",i.DEPENDENCIES="dependencies",i.NONE="none"})(Kn||(Kn={}));var Ele="node_modules",bu="$wsroot$";var Ym=(t,e)=>{let{packageTree:r,hoistingLimits:i,errors:n,preserveSymlinksRequired:s}=Yze(t,e),o=null;if(n.length===0){let a=dle(r,{hoistingLimits:i});o=qze(t,a,e)}return{tree:o,errors:n,preserveSymlinksRequired:s}},fa=t=>`${t.name}@${t.reference}`,YL=t=>{let e=new Map;for(let[r,i]of t.entries())if(!i.dirList){let n=e.get(i.locator);n||(n={target:i.target,linkType:i.linkType,locations:[],aliases:i.aliases},e.set(i.locator,n)),n.locations.push(r)}for(let r of e.values())r.locations=r.locations.sort((i,n)=>{let s=i.split(x.delimiter).length,o=n.split(x.delimiter).length;return n===i?0:s!==o?o-s:n>i?1:-1});return e},Ile=(t,e)=>{let r=P.isVirtualLocator(t)?P.devirtualizeLocator(t):t,i=P.isVirtualLocator(e)?P.devirtualizeLocator(e):e;return P.areLocatorsEqual(r,i)},qL=(t,e,r,i)=>{if(t.linkType!==yo.SOFT)return!1;let n=H.toPortablePath(r.resolveVirtual&&e.reference&&e.reference.startsWith("virtual:")?r.resolveVirtual(t.packageLocation):t.packageLocation);return x.contains(i,n)===null},Jze=t=>{let e=t.getPackageInformation(t.topLevel);if(e===null)throw new Error("Assertion failed: Expected the top-level package to have been registered");if(t.findPackageLocator(e.packageLocation)===null)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");let i=H.toPortablePath(e.packageLocation.slice(0,-1)),n=new Map,s={children:new Map},o=t.getDependencyTreeRoots(),a=new Map,l=new Set,c=(f,h)=>{let p=fa(f);if(l.has(p))return;l.add(p);let m=t.getPackageInformation(f);if(m){let y=h?fa(h):"";if(fa(f)!==y&&m.linkType===yo.SOFT&&!qL(m,f,t,i)){let b=yle(m,f,t);(!a.get(b)||f.reference.startsWith("workspace:"))&&a.set(b,f)}for(let[b,S]of m.packageDependencies)S!==null&&(m.packagePeers.has(b)||c(t.getLocator(b,S),f))}};for(let f of o)c(f,null);let u=i.split(x.sep);for(let f of a.values()){let h=t.getPackageInformation(f),m=H.toPortablePath(h.packageLocation.slice(0,-1)).split(x.sep).slice(u.length),y=s;for(let b of m){let S=y.children.get(b);S||(S={children:new Map},y.children.set(b,S)),y=S}y.workspaceLocator=f}let g=(f,h)=>{if(f.workspaceLocator){let p=fa(h),m=n.get(p);m||(m=new Set,n.set(p,m)),m.add(f.workspaceLocator)}for(let p of f.children.values())g(p,f.workspaceLocator||h)};for(let f of s.children.values())g(f,s.workspaceLocator);return n},Yze=(t,e)=>{let r=[],i=!1,n=new Map,s=Jze(t),o=t.getPackageInformation(t.topLevel);if(o===null)throw new Error("Assertion failed: Expected the top-level package to have been registered");let a=t.findPackageLocator(o.packageLocation);if(a===null)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");let l=H.toPortablePath(o.packageLocation.slice(0,-1)),c={name:a.name,identName:a.name,reference:a.reference,peerNames:o.packagePeers,dependencies:new Set,dependencyKind:Mn.WORKSPACE},u=new Map,g=(h,p)=>`${fa(p)}:${h}`,f=(h,p,m,y,b,S,k,T)=>{var X,O;let Y=g(h,m),j=u.get(Y),Z=!!j;!Z&&m.name===a.name&&m.reference===a.reference&&(j=c,u.set(Y,c));let J=qL(p,m,t,l);if(!j){let L=Mn.REGULAR;J?L=Mn.EXTERNAL_SOFT_LINK:p.linkType===yo.SOFT&&m.name.endsWith(bu)&&(L=Mn.WORKSPACE),j={name:h,identName:m.name,reference:m.reference,dependencies:new Set,peerNames:L===Mn.WORKSPACE?new Set:p.packagePeers,dependencyKind:L},u.set(Y,j)}let re;if(J?re=2:b.linkType===yo.SOFT?re=1:re=0,j.hoistPriority=Math.max(j.hoistPriority||0,re),T&&!J){let L=fa({name:y.identName,reference:y.reference}),pe=n.get(L)||new Set;n.set(L,pe),pe.add(j.name)}let ee=new Map(p.packageDependencies);if(e.project){let L=e.project.workspacesByCwd.get(H.toPortablePath(p.packageLocation.slice(0,-1)));if(L){let pe=new Set([...Array.from(L.manifest.peerDependencies.values(),Ce=>P.stringifyIdent(Ce)),...Array.from(L.manifest.peerDependenciesMeta.keys())]);for(let Ce of pe)ee.has(Ce)||(ee.set(Ce,S.get(Ce)||null),j.peerNames.add(Ce))}}let A=fa({name:m.name.replace(bu,""),reference:m.reference}),oe=s.get(A);if(oe)for(let L of oe)ee.set(`${L.name}${bu}`,L.reference);(p!==b||p.linkType!==yo.SOFT||!J&&(!e.selfReferencesByCwd||e.selfReferencesByCwd.get(k)))&&y.dependencies.add(j);let le=m!==a&&p.linkType===yo.SOFT&&!m.name.endsWith(bu)&&!J;if(!Z&&!le){let L=new Map;for(let[pe,Ce]of ee)if(Ce!==null){let Oe=t.getLocator(pe,Ce),te=t.getLocator(pe.replace(bu,""),Ce),se=t.getPackageInformation(te);if(se===null)throw new Error("Assertion failed: Expected the package to have been registered");let be=qL(se,Oe,t,l);if(e.validateExternalSoftLinks&&e.project&&be){se.packageDependencies.size>0&&(i=!0);for(let[Se,de]of se.packageDependencies)if(de!==null){let V=P.parseLocator(Array.isArray(de)?`${de[0]}@${de[1]}`:`${Se}@${de}`);if(fa(V)!==fa(Oe)){let Qe=ee.get(Se);if(Qe){let ce=P.parseLocator(Array.isArray(Qe)?`${Qe[0]}@${Qe[1]}`:`${Se}@${Qe}`);Ile(ce,V)||r.push({messageName:$.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK,text:`Cannot link ${P.prettyIdent(e.project.configuration,P.parseIdent(Oe.name))} into ${P.prettyLocator(e.project.configuration,P.parseLocator(`${m.name}@${m.reference}`))} dependency ${P.prettyLocator(e.project.configuration,V)} conflicts with parent dependency ${P.prettyLocator(e.project.configuration,ce)}`})}else{let ce=L.get(Se);if(ce){let fe=ce.target,gt=P.parseLocator(Array.isArray(fe)?`${fe[0]}@${fe[1]}`:`${Se}@${fe}`);Ile(gt,V)||r.push({messageName:$.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK,text:`Cannot link ${P.prettyIdent(e.project.configuration,P.parseIdent(Oe.name))} into ${P.prettyLocator(e.project.configuration,P.parseLocator(`${m.name}@${m.reference}`))} dependency ${P.prettyLocator(e.project.configuration,V)} conflicts with dependency ${P.prettyLocator(e.project.configuration,gt)} from sibling portal ${P.prettyIdent(e.project.configuration,P.parseIdent(ce.portal.name))}`})}else L.set(Se,{target:V.reference,portal:Oe})}}}}let he=(X=e.hoistingLimitsByCwd)==null?void 0:X.get(k),Fe=be?k:x.relative(l,H.toPortablePath(se.packageLocation))||Ke.dot,Ue=(O=e.hoistingLimitsByCwd)==null?void 0:O.get(Fe),xe=he===Kn.DEPENDENCIES||Ue===Kn.DEPENDENCIES||Ue===Kn.WORKSPACES;f(pe,se,Oe,j,p,ee,Fe,xe)}}};return f(a.name,o,a,c,o,o.packageDependencies,Ke.dot,!1),{packageTree:c,hoistingLimits:n,errors:r,preserveSymlinksRequired:i}};function yle(t,e,r){let i=r.resolveVirtual&&e.reference&&e.reference.startsWith("virtual:")?r.resolveVirtual(t.packageLocation):t.packageLocation;return H.toPortablePath(i||t.packageLocation)}function Wze(t,e,r){let i=e.getLocator(t.name.replace(bu,""),t.reference),n=e.getPackageInformation(i);if(n===null)throw new Error("Assertion failed: Expected the package to be registered");let s,o;return r.pnpifyFs?(o=H.toPortablePath(n.packageLocation),s=yo.SOFT):(o=yle(n,t,e),s=n.linkType),{linkType:s,target:o}}var qze=(t,e,r)=>{let i=new Map,n=(u,g,f)=>{let{linkType:h,target:p}=Wze(u,t,r);return{locator:fa(u),nodePath:g,target:p,linkType:h,aliases:f}},s=u=>{let[g,f]=u.split("/");return f?{scope:Jr(g),name:Jr(f)}:{scope:null,name:Jr(g)}},o=new Set,a=(u,g,f)=>{if(!o.has(u)){o.add(u);for(let h of u.dependencies){if(h===u)continue;let p=Array.from(h.references).sort(),m={name:h.identName,reference:p[0]},{name:y,scope:b}=s(h.name),S=b?[b,y]:[y],k=x.join(g,Ele),T=x.join(k,...S),Y=`${f}/${m.name}`,j=n(m,f,p.slice(1)),Z=!1;if(j.linkType===yo.SOFT&&r.project){let J=r.project.workspacesByCwd.get(j.target.slice(0,-1));Z=!!(J&&!J.manifest.name)}if(!h.name.endsWith(bu)&&!Z){let J=i.get(T);if(J){if(J.dirList)throw new Error(`Assertion failed: ${T} cannot merge dir node with leaf node`);{let oe=P.parseLocator(J.locator),le=P.parseLocator(j.locator);if(J.linkType!==j.linkType)throw new Error(`Assertion failed: ${T} cannot merge nodes with different link types ${J.nodePath}/${P.stringifyLocator(oe)} and ${f}/${P.stringifyLocator(le)}`);if(oe.identHash!==le.identHash)throw new Error(`Assertion failed: ${T} cannot merge nodes with different idents ${J.nodePath}/${P.stringifyLocator(oe)} and ${f}/s${P.stringifyLocator(le)}`);j.aliases=[...j.aliases,...J.aliases,P.parseLocator(J.locator).reference]}}i.set(T,j);let re=T.split("/"),ee=re.indexOf(Ele),A=re.length-1;for(;ee>=0&&A>ee;){let oe=H.toPortablePath(re.slice(0,A).join(x.sep)),le=Jr(re[A]),X=i.get(oe);if(!X)i.set(oe,{dirList:new Set([le])});else if(X.dirList){if(X.dirList.has(le))break;X.dirList.add(le)}A--}}a(h,j.linkType===yo.SOFT?j.target:T,Y)}}},l=n({name:e.name,reference:Array.from(e.references)[0]},"",[]),c=l.target;return i.set(c,l),a(e,c,""),i};var rT={};ft(rT,{PnpInstaller:()=>ah,PnpLinker:()=>vu,default:()=>C5e,getPnpPath:()=>Dl,jsInstallUtils:()=>ha,pnpUtils:()=>eT,quotePathIfNeeded:()=>qle});var jle=ge(ri()),Yle=ge(require("url"));var wle;(function(r){r.HARD="HARD",r.SOFT="SOFT"})(wle||(wle={}));var er;(function(f){f.DEFAULT="DEFAULT",f.TOP_LEVEL="TOP_LEVEL",f.FALLBACK_EXCLUSION_LIST="FALLBACK_EXCLUSION_LIST",f.FALLBACK_EXCLUSION_ENTRIES="FALLBACK_EXCLUSION_ENTRIES",f.FALLBACK_EXCLUSION_DATA="FALLBACK_EXCLUSION_DATA",f.PACKAGE_REGISTRY_DATA="PACKAGE_REGISTRY_DATA",f.PACKAGE_REGISTRY_ENTRIES="PACKAGE_REGISTRY_ENTRIES",f.PACKAGE_STORE_DATA="PACKAGE_STORE_DATA",f.PACKAGE_STORE_ENTRIES="PACKAGE_STORE_ENTRIES",f.PACKAGE_INFORMATION_DATA="PACKAGE_INFORMATION_DATA",f.PACKAGE_DEPENDENCIES="PACKAGE_DEPENDENCIES",f.PACKAGE_DEPENDENCY="PACKAGE_DEPENDENCY"})(er||(er={}));var Ble={[er.DEFAULT]:{collapsed:!1,next:{["*"]:er.DEFAULT}},[er.TOP_LEVEL]:{collapsed:!1,next:{fallbackExclusionList:er.FALLBACK_EXCLUSION_LIST,packageRegistryData:er.PACKAGE_REGISTRY_DATA,["*"]:er.DEFAULT}},[er.FALLBACK_EXCLUSION_LIST]:{collapsed:!1,next:{["*"]:er.FALLBACK_EXCLUSION_ENTRIES}},[er.FALLBACK_EXCLUSION_ENTRIES]:{collapsed:!0,next:{["*"]:er.FALLBACK_EXCLUSION_DATA}},[er.FALLBACK_EXCLUSION_DATA]:{collapsed:!0,next:{["*"]:er.DEFAULT}},[er.PACKAGE_REGISTRY_DATA]:{collapsed:!1,next:{["*"]:er.PACKAGE_REGISTRY_ENTRIES}},[er.PACKAGE_REGISTRY_ENTRIES]:{collapsed:!0,next:{["*"]:er.PACKAGE_STORE_DATA}},[er.PACKAGE_STORE_DATA]:{collapsed:!1,next:{["*"]:er.PACKAGE_STORE_ENTRIES}},[er.PACKAGE_STORE_ENTRIES]:{collapsed:!0,next:{["*"]:er.PACKAGE_INFORMATION_DATA}},[er.PACKAGE_INFORMATION_DATA]:{collapsed:!1,next:{packageDependencies:er.PACKAGE_DEPENDENCIES,["*"]:er.DEFAULT}},[er.PACKAGE_DEPENDENCIES]:{collapsed:!1,next:{["*"]:er.PACKAGE_DEPENDENCY}},[er.PACKAGE_DEPENDENCY]:{collapsed:!0,next:{["*"]:er.DEFAULT}}};function zze(t,e,r){let i="";i+="[";for(let n=0,s=t.length;ns(o)));let n=r.map((s,o)=>o);return n.sort((s,o)=>{for(let a of i){let l=a[s]a[o]?1:0;if(l!==0)return l}return 0}),n.map(s=>r[s])}function Zze(t){let e=new Map,r=qm(t.fallbackExclusionList||[],[({name:i,reference:n})=>i,({name:i,reference:n})=>n]);for(let{name:i,reference:n}of r){let s=e.get(i);typeof s=="undefined"&&e.set(i,s=new Set),s.add(n)}return Array.from(e).map(([i,n])=>[i,Array.from(n)])}function $ze(t){return qm(t.fallbackPool||[],([e])=>e)}function e5e(t){let e=[];for(let[r,i]of qm(t.packageRegistry,([n])=>n===null?"0":`1${n}`)){let n=[];e.push([r,n]);for(let[s,{packageLocation:o,packageDependencies:a,packagePeers:l,linkType:c,discardFromLookup:u}]of qm(i,([g])=>g===null?"0":`1${g}`)){let g=[];r!==null&&s!==null&&!a.has(r)&&g.push([r,s]);for(let[p,m]of qm(a.entries(),([y])=>y))g.push([p,m]);let f=l&&l.size>0?Array.from(l):void 0,h=u||void 0;n.push([s,{packageLocation:o,packageDependencies:g,packagePeers:f,linkType:c,discardFromLookup:h}])}}return e}function Jm(t){return{__info:["This file is automatically generated. Do not touch it, or risk","your modifications being lost. We also recommend you not to read","it either without using the @yarnpkg/pnp package, as the data layout","is entirely unspecified and WILL change from a version to another."],dependencyTreeRoots:t.dependencyTreeRoots,enableTopLevelFallback:t.enableTopLevelFallback||!1,ignorePatternData:t.ignorePattern||null,fallbackExclusionList:Zze(t),fallbackPool:$ze(t),packageRegistryData:e5e(t)}}var kle=ge(Sle());function xle(t,e){return[t?`${t} -`:"",`/* eslint-disable */ - -`,`try { -`,` Object.freeze({}).detectStrictMode = true; -`,`} catch (error) { -`," throw new Error(`The whole PnP file got strict-mode-ified, which is known to break (Emscripten libraries aren't strict mode). This usually happens when the file goes through Babel.`);\n",`} -`,` -`,`function $$SETUP_STATE(hydrateRuntimeState, basePath) { -`,e.replace(/^/gm," "),`} -`,` -`,(0,kle.default)()].join("")}function t5e(t){return JSON.stringify(t,null,2)}function r5e(t){return`'${t.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\n/g,`\\ -`)}'`}function i5e(t){return[`return hydrateRuntimeState(JSON.parse(${r5e(Qle(t))}), {basePath: basePath || __dirname}); -`].join("")}function n5e(t){return[`var path = require('path'); -`,`var dataLocation = path.resolve(__dirname, ${JSON.stringify(t)}); -`,`return hydrateRuntimeState(require(dataLocation), {basePath: basePath || path.dirname(dataLocation)}); -`].join("")}function Ple(t){let e=Jm(t),r=i5e(e);return xle(t.shebang,r)}function Dle(t){let e=Jm(t),r=n5e(t.dataLocation),i=xle(t.shebang,r);return{dataFile:t5e(e),loaderFile:i}}var Nle=ge(require("fs")),c5e=ge(require("path")),Lle=ge(require("util"));function WL(t,{basePath:e}){let r=H.toPortablePath(e),i=x.resolve(r),n=t.ignorePatternData!==null?new RegExp(t.ignorePatternData):null,s=new Map,o=new Map(t.packageRegistryData.map(([g,f])=>[g,new Map(f.map(([h,p])=>{var k;if(g===null!=(h===null))throw new Error("Assertion failed: The name and reference should be null, or neither should");let m=(k=p.discardFromLookup)!=null?k:!1,y={name:g,reference:h},b=s.get(p.packageLocation);b?(b.discardFromLookup=b.discardFromLookup&&m,m||(b.locator=y)):s.set(p.packageLocation,{locator:y,discardFromLookup:m});let S=null;return[h,{packageDependencies:new Map(p.packageDependencies),packagePeers:new Set(p.packagePeers),linkType:p.linkType,discardFromLookup:m,get packageLocation(){return S||(S=x.join(i,p.packageLocation))}}]}))])),a=new Map(t.fallbackExclusionList.map(([g,f])=>[g,new Set(f)])),l=new Map(t.fallbackPool),c=t.dependencyTreeRoots,u=t.enableTopLevelFallback;return{basePath:r,dependencyTreeRoots:c,enableTopLevelFallback:u,fallbackExclusionList:a,fallbackPool:l,ignorePattern:n,packageLocatorsByLocations:s,packageRegistry:o}}var Wm=ge(require("module"));function oh(t,e){if(typeof t=="string")return t;if(t){let r,i;if(Array.isArray(t)){for(r=0;r0)return(f=oh(n[g],u))?f.replace("*",c.substring(g.length-1)):Qu(i,c,1)}return Qu(i,c)}}var zL=ge(require("util"));var ur;(function(c){c.API_ERROR="API_ERROR",c.BUILTIN_NODE_RESOLUTION_FAILED="BUILTIN_NODE_RESOLUTION_FAILED",c.EXPORTS_RESOLUTION_FAILED="EXPORTS_RESOLUTION_FAILED",c.MISSING_DEPENDENCY="MISSING_DEPENDENCY",c.MISSING_PEER_DEPENDENCY="MISSING_PEER_DEPENDENCY",c.QUALIFIED_PATH_RESOLUTION_FAILED="QUALIFIED_PATH_RESOLUTION_FAILED",c.INTERNAL="INTERNAL",c.UNDECLARED_DEPENDENCY="UNDECLARED_DEPENDENCY",c.UNSUPPORTED="UNSUPPORTED"})(ur||(ur={}));var o5e=new Set([ur.BUILTIN_NODE_RESOLUTION_FAILED,ur.MISSING_DEPENDENCY,ur.MISSING_PEER_DEPENDENCY,ur.QUALIFIED_PATH_RESOLUTION_FAILED,ur.UNDECLARED_DEPENDENCY]);function ai(t,e,r={},i){i!=null||(i=o5e.has(t)?"MODULE_NOT_FOUND":t);let n={configurable:!0,writable:!0,enumerable:!1};return Object.defineProperties(new Error(e),{code:ie(N({},n),{value:i}),pnpCode:ie(N({},n),{value:t}),data:ie(N({},n),{value:r})})}function wo(t){return H.normalize(H.fromPortablePath(t))}var a5e=ge(require("fs")),Fle=ge(require("module")),A5e=ge(require("path")),l5e=new Set(Fle.Module.builtinModules||Object.keys(process.binding("natives"))),fb=t=>t.startsWith("node:")||l5e.has(t);function _L(t,e){let r=Number(process.env.PNP_ALWAYS_WARN_ON_FALLBACK)>0,i=Number(process.env.PNP_DEBUG_LEVEL),n=/^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:node:)?(?:@[^/]+\/)?[^/]+)\/*(.*|)$/,s=/^(\/|\.{1,2}(\/|$))/,o=/\/$/,a=/^\.{0,2}\//,l={name:null,reference:null},c=[],u=new Set;if(t.enableTopLevelFallback===!0&&c.push(l),e.compatibilityMode!==!1)for(let te of["react-scripts","gatsby"]){let se=t.packageRegistry.get(te);if(se)for(let be of se.keys()){if(be===null)throw new Error("Assertion failed: This reference shouldn't be null");c.push({name:te,reference:be})}}let{ignorePattern:g,packageRegistry:f,packageLocatorsByLocations:h}=t;function p(te,se){return{fn:te,args:se,error:null,result:null}}function m(te){var Ue,xe,Se,de,V,Qe;let se=(Se=(xe=(Ue=process.stderr)==null?void 0:Ue.hasColors)==null?void 0:xe.call(Ue))!=null?Se:process.stdout.isTTY,be=(ce,fe)=>`[${ce}m${fe}`,he=te.error;console.error(he?be("31;1",`\u2716 ${(de=te.error)==null?void 0:de.message.replace(/\n.*/s,"")}`):be("33;1","\u203C Resolution")),te.args.length>0&&console.error();for(let ce of te.args)console.error(` ${be("37;1","In \u2190")} ${(0,zL.inspect)(ce,{colors:se,compact:!0})}`);te.result&&(console.error(),console.error(` ${be("37;1","Out \u2192")} ${(0,zL.inspect)(te.result,{colors:se,compact:!0})}`));let Fe=(Qe=(V=new Error().stack.match(/(?<=^ +)at.*/gm))==null?void 0:V.slice(2))!=null?Qe:[];if(Fe.length>0){console.error();for(let ce of Fe)console.error(` ${be("38;5;244",ce)}`)}console.error()}function y(te,se){if(e.allowDebug===!1)return se;if(Number.isFinite(i)){if(i>=2)return(...be)=>{let he=p(te,be);try{return he.result=se(...be)}catch(Fe){throw he.error=Fe}finally{m(he)}};if(i>=1)return(...be)=>{try{return se(...be)}catch(he){let Fe=p(te,be);throw Fe.error=he,m(Fe),he}}}return se}function b(te){let se=A(te);if(!se)throw ai(ur.INTERNAL,"Couldn't find a matching entry in the dependency tree for the specified parent (this is probably an internal error)");return se}function S(te){if(te.name===null)return!0;for(let se of t.dependencyTreeRoots)if(se.name===te.name&&se.reference===te.reference)return!0;return!1}let k=new Set(["default","node","require"]);function T(te,se=k){let be=X(x.join(te,"internal.js"),{resolveIgnored:!0,includeDiscardFromLookup:!0});if(be===null)throw ai(ur.INTERNAL,`The locator that owns the "${te}" path can't be found inside the dependency tree (this is probably an internal error)`);let{packageLocation:he}=b(be),Fe=x.join(he,Pt.manifest);if(!e.fakeFs.existsSync(Fe))return null;let Ue=JSON.parse(e.fakeFs.readFileSync(Fe,"utf8")),xe=x.contains(he,te);if(xe===null)throw ai(ur.INTERNAL,"unqualifiedPath doesn't contain the packageLocation (this is probably an internal error)");a.test(xe)||(xe=`./${xe}`);let Se;try{Se=Rle(Ue,x.normalize(xe),{conditions:se,unsafe:!0})}catch(de){throw ai(ur.EXPORTS_RESOLUTION_FAILED,de.message,{unqualifiedPath:wo(te),locator:be,pkgJson:Ue,subpath:wo(xe),conditions:se},"ERR_PACKAGE_PATH_NOT_EXPORTED")}return typeof Se=="string"?x.join(he,Se):null}function Y(te,se,{extensions:be}){let he;try{se.push(te),he=e.fakeFs.statSync(te)}catch(Fe){}if(he&&!he.isDirectory())return e.fakeFs.realpathSync(te);if(he&&he.isDirectory()){let Fe;try{Fe=JSON.parse(e.fakeFs.readFileSync(x.join(te,Pt.manifest),"utf8"))}catch(xe){}let Ue;if(Fe&&Fe.main&&(Ue=x.resolve(te,Fe.main)),Ue&&Ue!==te){let xe=Y(Ue,se,{extensions:be});if(xe!==null)return xe}}for(let Fe=0,Ue=be.length;Fe{let Se=JSON.stringify(xe.name);if(he.has(Se))return;he.add(Se);let de=oe(xe);for(let V of de)if(b(V).packagePeers.has(te))Fe(V);else{let ce=be.get(V.name);typeof ce=="undefined"&&be.set(V.name,ce=new Set),ce.add(V.reference)}};Fe(se);let Ue=[];for(let xe of[...be.keys()].sort())for(let Se of[...be.get(xe)].sort())Ue.push({name:xe,reference:Se});return Ue}function X(te,{resolveIgnored:se=!1,includeDiscardFromLookup:be=!1}={}){if(J(te)&&!se)return null;let he=x.relative(t.basePath,te);he.match(s)||(he=`./${he}`),he.endsWith("/")||(he=`${he}/`);do{let Fe=h.get(he);if(typeof Fe=="undefined"||Fe.discardFromLookup&&!be){he=he.substring(0,he.lastIndexOf("/",he.length-2)+1);continue}return Fe.locator}while(he!=="");return null}function O(te,se,{considerBuiltins:be=!0}={}){if(te==="pnpapi")return H.toPortablePath(e.pnpapiResolution);if(be&&fb(te))return null;let he=wo(te),Fe=se&&wo(se);if(se&&J(se)&&(!x.isAbsolute(te)||X(te)===null)){let Se=Z(te,se);if(Se===!1)throw ai(ur.BUILTIN_NODE_RESOLUTION_FAILED,`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer was explicitely ignored by the regexp) - -Require request: "${he}" -Required by: ${Fe} -`,{request:he,issuer:Fe});return H.toPortablePath(Se)}let Ue,xe=te.match(n);if(xe){if(!se)throw ai(ur.API_ERROR,"The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:he,issuer:Fe});let[,Se,de]=xe,V=X(se);if(!V){let Gt=Z(te,se);if(Gt===!1)throw ai(ur.BUILTIN_NODE_RESOLUTION_FAILED,`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer doesn't seem to be part of the Yarn-managed dependency tree). - -Require path: "${he}" -Required by: ${Fe} -`,{request:he,issuer:Fe});return H.toPortablePath(Gt)}let ce=b(V).packageDependencies.get(Se),fe=null;if(ce==null&&V.name!==null){let Gt=t.fallbackExclusionList.get(V.name);if(!Gt||!Gt.has(V.reference)){for(let Ti=0,Vs=c.length;TiS(Qr))?gt=ai(ur.MISSING_PEER_DEPENDENCY,`${V.name} tried to access ${Se} (a peer dependency) but it isn't provided by your application; this makes the require call ambiguous and unsound. - -Required package: ${Se}${Se!==he?` (via "${he}")`:""} -Required by: ${V.name}@${V.reference} (via ${Fe}) -${Gt.map(Qr=>`Ancestor breaking the chain: ${Qr.name}@${Qr.reference} -`).join("")} -`,{request:he,issuer:Fe,issuerLocator:Object.assign({},V),dependencyName:Se,brokenAncestors:Gt}):gt=ai(ur.MISSING_PEER_DEPENDENCY,`${V.name} tried to access ${Se} (a peer dependency) but it isn't provided by its ancestors; this makes the require call ambiguous and unsound. - -Required package: ${Se}${Se!==he?` (via "${he}")`:""} -Required by: ${V.name}@${V.reference} (via ${Fe}) - -${Gt.map(Qr=>`Ancestor breaking the chain: ${Qr.name}@${Qr.reference} -`).join("")} -`,{request:he,issuer:Fe,issuerLocator:Object.assign({},V),dependencyName:Se,brokenAncestors:Gt})}else ce===void 0&&(!be&&fb(te)?S(V)?gt=ai(ur.UNDECLARED_DEPENDENCY,`Your application tried to access ${Se}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${Se} isn't otherwise declared in your dependencies, this makes the require call ambiguous and unsound. - -Required package: ${Se}${Se!==he?` (via "${he}")`:""} -Required by: ${Fe} -`,{request:he,issuer:Fe,dependencyName:Se}):gt=ai(ur.UNDECLARED_DEPENDENCY,`${V.name} tried to access ${Se}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${Se} isn't otherwise declared in ${V.name}'s dependencies, this makes the require call ambiguous and unsound. - -Required package: ${Se}${Se!==he?` (via "${he}")`:""} -Required by: ${Fe} -`,{request:he,issuer:Fe,issuerLocator:Object.assign({},V),dependencyName:Se}):S(V)?gt=ai(ur.UNDECLARED_DEPENDENCY,`Your application tried to access ${Se}, but it isn't declared in your dependencies; this makes the require call ambiguous and unsound. - -Required package: ${Se}${Se!==he?` (via "${he}")`:""} -Required by: ${Fe} -`,{request:he,issuer:Fe,dependencyName:Se}):gt=ai(ur.UNDECLARED_DEPENDENCY,`${V.name} tried to access ${Se}, but it isn't declared in its dependencies; this makes the require call ambiguous and unsound. - -Required package: ${Se}${Se!==he?` (via "${he}")`:""} -Required by: ${V.name}@${V.reference} (via ${Fe}) -`,{request:he,issuer:Fe,issuerLocator:Object.assign({},V),dependencyName:Se}));if(ce==null){if(fe===null||gt===null)throw gt||new Error("Assertion failed: Expected an error to have been set");ce=fe;let Gt=gt.message.replace(/\n.*/g,"");gt.message=Gt,!u.has(Gt)&&i!==0&&(u.add(Gt),process.emitWarning(gt))}let Ht=Array.isArray(ce)?{name:ce[0],reference:ce[1]}:{name:Se,reference:ce},Mt=b(Ht);if(!Mt.packageLocation)throw ai(ur.MISSING_DEPENDENCY,`A dependency seems valid but didn't get installed for some reason. This might be caused by a partial install, such as dev vs prod. - -Required package: ${Ht.name}@${Ht.reference}${Ht.name!==he?` (via "${he}")`:""} -Required by: ${V.name}@${V.reference} (via ${Fe}) -`,{request:he,issuer:Fe,dependencyLocator:Object.assign({},Ht)});let mi=Mt.packageLocation;de?Ue=x.join(mi,de):Ue=mi}else if(x.isAbsolute(te))Ue=x.normalize(te);else{if(!se)throw ai(ur.API_ERROR,"The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:he,issuer:Fe});let Se=x.resolve(se);se.match(o)?Ue=x.normalize(x.join(Se,te)):Ue=x.normalize(x.join(x.dirname(Se),te))}return x.normalize(Ue)}function L(te,se,be=k){if(s.test(te))return se;let he=T(se,be);return he?x.normalize(he):se}function pe(te,{extensions:se=Object.keys(Wm.Module._extensions)}={}){var Fe,Ue;let be=[],he=Y(te,be,{extensions:se});if(he)return x.normalize(he);{let xe=wo(te),Se=X(te);if(Se){let{packageLocation:de}=b(Se),V=!0;try{e.fakeFs.accessSync(de)}catch(Qe){if((Qe==null?void 0:Qe.code)==="ENOENT")V=!1;else{let ce=((Ue=(Fe=Qe==null?void 0:Qe.message)!=null?Fe:Qe)!=null?Ue:"empty exception thrown").replace(/^[A-Z]/,fe=>fe.toLowerCase());throw ai(ur.QUALIFIED_PATH_RESOLUTION_FAILED,`Required package exists but could not be accessed (${ce}). - -Missing package: ${Se.name}@${Se.reference} -Expected package location: ${wo(de)} -`,{unqualifiedPath:xe,extensions:se})}}if(!V){let Qe=de.includes("/unplugged/")?"Required unplugged package missing from disk. This may happen when switching branches without running installs (unplugged packages must be fully materialized on disk to work).":"Required package missing from disk. If you keep your packages inside your repository then restarting the Node process may be enough. Otherwise, try to run an install first.";throw ai(ur.QUALIFIED_PATH_RESOLUTION_FAILED,`${Qe} - -Missing package: ${Se.name}@${Se.reference} -Expected package location: ${wo(de)} -`,{unqualifiedPath:xe,extensions:se})}}throw ai(ur.QUALIFIED_PATH_RESOLUTION_FAILED,`Qualified path resolution failed: we looked for the following paths, but none could be accessed. - -Source path: ${xe} -${be.map(de=>`Not found: ${wo(de)} -`).join("")}`,{unqualifiedPath:xe,extensions:se})}}function Ce(te,se,{considerBuiltins:be,extensions:he,conditions:Fe}={}){try{let Ue=O(te,se,{considerBuiltins:be});if(te==="pnpapi")return Ue;if(Ue===null)return null;let xe=()=>se!==null?J(se):!1,Se=(!be||!fb(te))&&!xe()?L(te,Ue,Fe):Ue;return pe(Se,{extensions:he})}catch(Ue){throw Object.prototype.hasOwnProperty.call(Ue,"pnpCode")&&Object.assign(Ue.data,{request:wo(te),issuer:se&&wo(se)}),Ue}}function Oe(te){let se=x.normalize(te),be=Wr.resolveVirtual(se);return be!==se?be:null}return{VERSIONS:re,topLevel:ee,getLocator:(te,se)=>Array.isArray(se)?{name:se[0],reference:se[1]}:{name:te,reference:se},getDependencyTreeRoots:()=>[...t.dependencyTreeRoots],getAllLocators(){let te=[];for(let[se,be]of f)for(let he of be.keys())se!==null&&he!==null&&te.push({name:se,reference:he});return te},getPackageInformation:te=>{let se=A(te);if(se===null)return null;let be=H.fromPortablePath(se.packageLocation);return ie(N({},se),{packageLocation:be})},findPackageLocator:te=>X(H.toPortablePath(te)),resolveToUnqualified:y("resolveToUnqualified",(te,se,be)=>{let he=se!==null?H.toPortablePath(se):null,Fe=O(H.toPortablePath(te),he,be);return Fe===null?null:H.fromPortablePath(Fe)}),resolveUnqualified:y("resolveUnqualified",(te,se)=>H.fromPortablePath(pe(H.toPortablePath(te),se))),resolveRequest:y("resolveRequest",(te,se,be)=>{let he=se!==null?H.toPortablePath(se):null,Fe=Ce(H.toPortablePath(te),he,be);return Fe===null?null:H.fromPortablePath(Fe)}),resolveVirtual:y("resolveVirtual",te=>{let se=Oe(H.toPortablePath(te));return se!==null?H.fromPortablePath(se):null})}}var YQt=(0,Lle.promisify)(Nle.readFile);var Tle=(t,e,r)=>{let i=Jm(t),n=WL(i,{basePath:e}),s=H.join(e,Pt.pnpCjs);return _L(n,{fakeFs:r,pnpapiResolution:s})};var XL=ge(Mle());var ha={};ft(ha,{checkAndReportManifestCompatibility:()=>Ule,checkManifestCompatibility:()=>Kle,extractBuildScripts:()=>hb,getExtractHint:()=>ZL,hasBindingGyp:()=>$L});function Kle(t){return P.isPackageCompatible(t,Wg.getArchitectureSet())}function Ule(t,e,{configuration:r,report:i}){return Kle(t)?!0:(i==null||i.reportWarningOnce($.INCOMPATIBLE_ARCHITECTURE,`${P.prettyLocator(r,t)} The ${Wg.getArchitectureName()} architecture is incompatible with this package, ${e} skipped.`),!1)}function hb(t,e,r,{configuration:i,report:n}){let s=[];for(let a of["preinstall","install","postinstall"])e.manifest.scripts.has(a)&&s.push([ls.SCRIPT,a]);return!e.manifest.scripts.has("install")&&e.misc.hasBindingGyp&&s.push([ls.SHELLCODE,"node-gyp rebuild"]),s.length===0?[]:t.linkType!==Qt.HARD?(n==null||n.reportWarningOnce($.SOFT_LINK_BUILD,`${P.prettyLocator(i,t)} lists build scripts, but is referenced through a soft link. Soft links don't support build scripts, so they'll be ignored.`),[]):r&&r.built===!1?(n==null||n.reportInfoOnce($.BUILD_DISABLED,`${P.prettyLocator(i,t)} lists build scripts, but its build has been explicitly disabled through configuration.`),[]):!i.get("enableScripts")&&!r.built?(n==null||n.reportWarningOnce($.DISABLED_BUILD_SCRIPTS,`${P.prettyLocator(i,t)} lists build scripts, but all build scripts have been disabled.`),[]):Ule(t,"build",{configuration:i,report:n})?s:[]}var u5e=new Set([".exe",".h",".hh",".hpp",".c",".cc",".cpp",".java",".jar",".node"]);function ZL(t){return t.packageFs.getExtractHint({relevantExtensions:u5e})}function $L(t){let e=x.join(t.prefixPath,"binding.gyp");return t.packageFs.existsSync(e)}var eT={};ft(eT,{getUnpluggedPath:()=>zm});function zm(t,{configuration:e}){return x.resolve(e.get("pnpUnpluggedFolder"),P.slugifyLocator(t))}var g5e=new Set([P.makeIdent(null,"nan").identHash,P.makeIdent(null,"node-gyp").identHash,P.makeIdent(null,"node-pre-gyp").identHash,P.makeIdent(null,"node-addon-api").identHash,P.makeIdent(null,"fsevents").identHash]),vu=class{constructor(){this.mode="strict";this.pnpCache=new Map}supportsPackage(e,r){return this.isEnabled(r)}async findPackageLocation(e,r){if(!this.isEnabled(r))throw new Error("Assertion failed: Expected the PnP linker to be enabled");let i=Dl(r.project).cjs;if(!K.existsSync(i))throw new Pe(`The project in ${Ae.pretty(r.project.configuration,`${r.project.cwd}/package.json`,Ae.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let n=ve.getFactoryWithDefault(this.pnpCache,i,()=>ve.dynamicRequire(i,{cachingStrategy:ve.CachingStrategy.FsTime})),s={name:P.stringifyIdent(e),reference:e.reference},o=n.getPackageInformation(s);if(!o)throw new Pe(`Couldn't find ${P.prettyLocator(r.project.configuration,e)} in the currently installed PnP map - running an install might help`);return H.toPortablePath(o.packageLocation)}async findPackageLocator(e,r){if(!this.isEnabled(r))return null;let i=Dl(r.project).cjs;if(!K.existsSync(i))return null;let s=ve.getFactoryWithDefault(this.pnpCache,i,()=>ve.dynamicRequire(i,{cachingStrategy:ve.CachingStrategy.FsTime})).findPackageLocator(H.fromPortablePath(e));return s?P.makeLocator(P.parseIdent(s.name),s.reference):null}makeInstaller(e){return new ah(e)}isEnabled(e){return!(e.project.configuration.get("nodeLinker")!=="pnp"||e.project.configuration.get("pnpMode")!==this.mode)}},ah=class{constructor(e){this.opts=e;this.mode="strict";this.asyncActions=new ve.AsyncActions(10);this.packageRegistry=new Map;this.virtualTemplates=new Map;this.isESMLoaderRequired=!1;this.customData={store:new Map};this.unpluggedPaths=new Set;this.opts=e}getCustomDataKey(){return JSON.stringify({name:"PnpInstaller",version:2})}attachCustomData(e){this.customData=e}async installPackage(e,r,i){let n=P.stringifyIdent(e),s=e.reference,o=!!this.opts.project.tryWorkspaceByLocator(e),a=P.isVirtualLocator(e),l=e.peerDependencies.size>0&&!a,c=!l&&!o,u=!l&&e.linkType!==Qt.SOFT,g,f;if(c||u){let k=a?P.devirtualizeLocator(e):e;g=this.customData.store.get(k.locatorHash),typeof g=="undefined"&&(g=await f5e(r),e.linkType===Qt.HARD&&this.customData.store.set(k.locatorHash,g)),g.manifest.type==="module"&&(this.isESMLoaderRequired=!0),f=this.opts.project.getDependencyMeta(k,e.version)}let h=c?hb(e,g,f,{configuration:this.opts.project.configuration,report:this.opts.report}):[],p=u?await this.unplugPackageIfNeeded(e,g,r,f,i):r.packageFs;if(x.isAbsolute(r.prefixPath))throw new Error(`Assertion failed: Expected the prefix path (${r.prefixPath}) to be relative to the parent`);let m=x.resolve(p.getRealPath(),r.prefixPath),y=tT(this.opts.project.cwd,m),b=new Map,S=new Set;if(a){for(let k of e.peerDependencies.values())b.set(P.stringifyIdent(k),null),S.add(P.stringifyIdent(k));if(!o){let k=P.devirtualizeLocator(e);this.virtualTemplates.set(k.locatorHash,{location:tT(this.opts.project.cwd,Wr.resolveVirtual(m)),locator:k})}}return ve.getMapWithDefault(this.packageRegistry,n).set(s,{packageLocation:y,packageDependencies:b,packagePeers:S,linkType:e.linkType,discardFromLookup:r.discardFromLookup||!1}),{packageLocation:m,buildDirective:h.length>0?h:null}}async attachInternalDependencies(e,r){let i=this.getPackageInformation(e);for(let[n,s]of r){let o=P.areIdentsEqual(n,s)?s.reference:[P.stringifyIdent(s),s.reference];i.packageDependencies.set(P.stringifyIdent(n),o)}}async attachExternalDependents(e,r){for(let i of r)this.getDiskInformation(i).packageDependencies.set(P.stringifyIdent(e),e.reference)}async finalizeInstall(){if(this.opts.project.configuration.get("pnpMode")!==this.mode)return;let e=Dl(this.opts.project);if(K.existsSync(e.cjsLegacy)&&(this.opts.report.reportWarning($.UNNAMED,`Removing the old ${Ae.pretty(this.opts.project.configuration,Pt.pnpJs,Ae.Type.PATH)} file. You might need to manually update existing references to reference the new ${Ae.pretty(this.opts.project.configuration,Pt.pnpCjs,Ae.Type.PATH)} file. If you use Editor SDKs, you'll have to rerun ${Ae.pretty(this.opts.project.configuration,"yarn sdks",Ae.Type.CODE)}.`),await K.removePromise(e.cjsLegacy)),this.isEsmEnabled()||await K.removePromise(e.esmLoader),this.opts.project.configuration.get("nodeLinker")!=="pnp"){await K.removePromise(e.cjs),await K.removePromise(this.opts.project.configuration.get("pnpDataPath")),await K.removePromise(e.esmLoader);return}for(let{locator:u,location:g}of this.virtualTemplates.values())ve.getMapWithDefault(this.packageRegistry,P.stringifyIdent(u)).set(u.reference,{packageLocation:g,packageDependencies:new Map,packagePeers:new Set,linkType:Qt.SOFT,discardFromLookup:!1});this.packageRegistry.set(null,new Map([[null,this.getPackageInformation(this.opts.project.topLevelWorkspace.anchoredLocator)]]));let r=this.opts.project.configuration.get("pnpFallbackMode"),i=this.opts.project.workspaces.map(({anchoredLocator:u})=>({name:P.stringifyIdent(u),reference:u.reference})),n=r!=="none",s=[],o=new Map,a=ve.buildIgnorePattern([".yarn/sdks/**",...this.opts.project.configuration.get("pnpIgnorePatterns")]),l=this.packageRegistry,c=this.opts.project.configuration.get("pnpShebang");if(r==="dependencies-only")for(let u of this.opts.project.storedPackages.values())this.opts.project.tryWorkspaceByLocator(u)&&s.push({name:P.stringifyIdent(u),reference:u.reference});return await this.asyncActions.wait(),await this.finalizeInstallWithPnp({dependencyTreeRoots:i,enableTopLevelFallback:n,fallbackExclusionList:s,fallbackPool:o,ignorePattern:a,packageRegistry:l,shebang:c}),{customData:this.customData}}async transformPnpSettings(e){}isEsmEnabled(){if(this.opts.project.configuration.sources.has("pnpEnableEsmLoader"))return this.opts.project.configuration.get("pnpEnableEsmLoader");if(this.isESMLoaderRequired)return!0;for(let e of this.opts.project.workspaces)if(e.manifest.type==="module")return!0;return!1}async finalizeInstallWithPnp(e){let r=Dl(this.opts.project),i=this.opts.project.configuration.get("pnpDataPath"),n=await this.locateNodeModules(e.ignorePattern);if(n.length>0){this.opts.report.reportWarning($.DANGEROUS_NODE_MODULES,"One or more node_modules have been detected and will be removed. This operation may take some time.");for(let o of n)await K.removePromise(o)}if(await this.transformPnpSettings(e),this.opts.project.configuration.get("pnpEnableInlining")){let o=Ple(e);await K.changeFilePromise(r.cjs,o,{automaticNewlines:!0,mode:493}),await K.removePromise(i)}else{let o=x.relative(x.dirname(r.cjs),i),{dataFile:a,loaderFile:l}=Dle(ie(N({},e),{dataLocation:o}));await K.changeFilePromise(r.cjs,l,{automaticNewlines:!0,mode:493}),await K.changeFilePromise(i,a,{automaticNewlines:!0,mode:420})}this.isEsmEnabled()&&(this.opts.report.reportWarning($.UNNAMED,"ESM support for PnP uses the experimental loader API and is therefore experimental"),await K.changeFilePromise(r.esmLoader,(0,XL.default)(),{automaticNewlines:!0,mode:420}));let s=this.opts.project.configuration.get("pnpUnpluggedFolder");if(this.unpluggedPaths.size===0)await K.removePromise(s);else for(let o of await K.readdirPromise(s)){let a=x.resolve(s,o);this.unpluggedPaths.has(a)||await K.removePromise(a)}}async locateNodeModules(e){let r=[],i=e?new RegExp(e):null;for(let n of this.opts.project.workspaces){let s=x.join(n.cwd,"node_modules");if(i&&i.test(x.relative(this.opts.project.cwd,n.cwd))||!K.existsSync(s))continue;let o=await K.readdirPromise(s,{withFileTypes:!0}),a=o.filter(l=>!l.isDirectory()||l.name===".bin"||!l.name.startsWith("."));if(a.length===o.length)r.push(s);else for(let l of a)r.push(x.join(s,l.name))}return r}async unplugPackageIfNeeded(e,r,i,n,s){return this.shouldBeUnplugged(e,r,n)?this.unplugPackage(e,i,s):i.packageFs}shouldBeUnplugged(e,r,i){return typeof i.unplugged!="undefined"?i.unplugged:g5e.has(e.identHash)||e.conditions!=null?!0:r.manifest.preferUnplugged!==null?r.manifest.preferUnplugged:!!(hb(e,r,i,{configuration:this.opts.project.configuration}).length>0||r.misc.extractHint)}async unplugPackage(e,r,i){let n=zm(e,{configuration:this.opts.project.configuration});return this.opts.project.disabledLocators.has(e.locatorHash)?new Da(n,{baseFs:r.packageFs,pathUtils:x}):(this.unpluggedPaths.add(n),i.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{let s=x.join(n,r.prefixPath,".ready");await K.existsPromise(s)||(this.opts.project.storedBuildState.delete(e.locatorHash),await K.mkdirPromise(n,{recursive:!0}),await K.copyPromise(n,Ke.dot,{baseFs:r.packageFs,overwrite:!1}),await K.writeFilePromise(s,""))})),new _t(n))}getPackageInformation(e){let r=P.stringifyIdent(e),i=e.reference,n=this.packageRegistry.get(r);if(!n)throw new Error(`Assertion failed: The package information store should have been available (for ${P.prettyIdent(this.opts.project.configuration,e)})`);let s=n.get(i);if(!s)throw new Error(`Assertion failed: The package information should have been available (for ${P.prettyLocator(this.opts.project.configuration,e)})`);return s}getDiskInformation(e){let r=ve.getMapWithDefault(this.packageRegistry,"@@disk"),i=tT(this.opts.project.cwd,e);return ve.getFactoryWithDefault(r,i,()=>({packageLocation:i,packageDependencies:new Map,packagePeers:new Set,linkType:Qt.SOFT,discardFromLookup:!1}))}};function tT(t,e){let r=x.relative(t,e);return r.match(/^\.{0,2}\//)||(r=`./${r}`),r.replace(/\/?$/,"/")}async function f5e(t){var i;let e=(i=await At.tryFind(t.prefixPath,{baseFs:t.packageFs}))!=null?i:new At,r=new Set(["preinstall","install","postinstall"]);for(let n of e.scripts.keys())r.has(n)||e.scripts.delete(n);return{manifest:{scripts:e.scripts,preferUnplugged:e.preferUnplugged,type:e.type},misc:{extractHint:ZL(t),hasBindingGyp:$L(t)}}}var Hle=ge(rs());var _m=class extends Le{constructor(){super(...arguments);this.all=W.Boolean("-A,--all",!1,{description:"Unplug direct dependencies from the entire project"});this.recursive=W.Boolean("-R,--recursive",!1,{description:"Unplug both direct and transitive dependencies"});this.json=W.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.patterns=W.Rest()}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(r.cwd,this.context.cwd);if(e.get("nodeLinker")!=="pnp")throw new Pe("This command can only be used if the `nodeLinker` option is set to `pnp`");await r.restoreInstallState();let s=new Set(this.patterns),o=this.patterns.map(f=>{let h=P.parseDescriptor(f),p=h.range!=="unknown"?h:P.makeDescriptor(h,"*");if(!Wt.validRange(p.range))throw new Pe(`The range of the descriptor patterns must be a valid semver range (${P.prettyDescriptor(e,p)})`);return m=>{let y=P.stringifyIdent(m);return!Hle.default.isMatch(y,P.stringifyIdent(p))||m.version&&!Wt.satisfiesWithPrereleases(m.version,p.range)?!1:(s.delete(f),!0)}}),a=()=>{let f=[];for(let h of r.storedPackages.values())!r.tryWorkspaceByLocator(h)&&!P.isVirtualLocator(h)&&o.some(p=>p(h))&&f.push(h);return f},l=f=>{let h=new Set,p=[],m=(y,b)=>{if(!h.has(y.locatorHash)&&(h.add(y.locatorHash),!r.tryWorkspaceByLocator(y)&&o.some(S=>S(y))&&p.push(y),!(b>0&&!this.recursive)))for(let S of y.dependencies.values()){let k=r.storedResolutions.get(S.descriptorHash);if(!k)throw new Error("Assertion failed: The resolution should have been registered");let T=r.storedPackages.get(k);if(!T)throw new Error("Assertion failed: The package should have been registered");m(T,b+1)}};for(let y of f){let b=r.storedPackages.get(y.anchoredLocator.locatorHash);if(!b)throw new Error("Assertion failed: The package should have been registered");m(b,0)}return p},c,u;if(this.all&&this.recursive?(c=a(),u="the project"):this.all?(c=l(r.workspaces),u="any workspace"):(c=l([i]),u="this workspace"),s.size>1)throw new Pe(`Patterns ${Ae.prettyList(e,s,Ae.Type.CODE)} don't match any packages referenced by ${u}`);if(s.size>0)throw new Pe(`Pattern ${Ae.prettyList(e,s,Ae.Type.CODE)} doesn't match any packages referenced by ${u}`);return c=ve.sortMap(c,f=>P.stringifyLocator(f)),(await Je.start({configuration:e,stdout:this.context.stdout,json:this.json},async f=>{var h;for(let p of c){let m=(h=p.version)!=null?h:"unknown",y=r.topLevelWorkspace.manifest.ensureDependencyMeta(P.makeDescriptor(p,m));y.unplugged=!0,f.reportInfo($.UNNAMED,`Will unpack ${P.prettyLocator(e,p)} to ${Ae.pretty(e,zm(p,{configuration:e}),Ae.Type.PATH)}`),f.reportJson({locator:P.stringifyLocator(p),version:m})}await r.topLevelWorkspace.persistManifest(),f.reportSeparator(),await r.install({cache:n,report:f})})).exitCode()}};_m.paths=[["unplug"]],_m.usage=Re.Usage({description:"force the unpacking of a list of packages",details:"\n This command will add the selectors matching the specified patterns to the list of packages that must be unplugged when installed.\n\n A package being unplugged means that instead of being referenced directly through its archive, it will be unpacked at install time in the directory configured via `pnpUnpluggedFolder`. Note that unpacking packages this way is generally not recommended because it'll make it harder to store your packages within the repository. However, it's a good approach to quickly and safely debug some packages, and can even sometimes be required depending on the context (for example when the package contains shellscripts).\n\n Running the command will set a persistent flag inside your top-level `package.json`, in the `dependenciesMeta` field. As such, to undo its effects, you'll need to revert the changes made to the manifest and run `yarn install` to apply the modification.\n\n By default, only direct dependencies from the current workspace are affected. If `-A,--all` is set, direct dependencies from the entire project are affected. Using the `-R,--recursive` flag will affect transitive dependencies as well as direct ones.\n\n This command accepts glob patterns inside the scope and name components (not the range). Make sure to escape the patterns to prevent your own shell from trying to expand them.\n ",examples:[["Unplug the lodash dependency from the active workspace","yarn unplug lodash"],["Unplug all instances of lodash referenced by any workspace","yarn unplug lodash -A"],["Unplug all instances of lodash referenced by the active workspace and its dependencies","yarn unplug lodash -R"],["Unplug all instances of lodash, anywhere","yarn unplug lodash -AR"],["Unplug one specific version of lodash","yarn unplug lodash@1.2.3"],["Unplug all packages with the `@babel` scope","yarn unplug '@babel/*'"],["Unplug all packages (only for testing, not recommended)","yarn unplug -R '*'"]]});var Gle=_m;var Dl=t=>({cjs:x.join(t.cwd,Pt.pnpCjs),cjsLegacy:x.join(t.cwd,Pt.pnpJs),esmLoader:x.join(t.cwd,".pnp.loader.mjs")}),qle=t=>/\s/.test(t)?JSON.stringify(t):t;async function h5e(t,e,r){let i=Dl(t),n=`--require ${qle(H.fromPortablePath(i.cjs))}`;if(K.existsSync(i.esmLoader)&&(n=`${n} --experimental-loader ${(0,Yle.pathToFileURL)(H.fromPortablePath(i.esmLoader)).href}`),i.cjs.includes(" ")&&jle.default.lt(process.versions.node,"12.0.0"))throw new Error(`Expected the build location to not include spaces when using Node < 12.0.0 (${process.versions.node})`);if(K.existsSync(i.cjs)){let s=e.NODE_OPTIONS||"",o=/\s*--require\s+\S*\.pnp\.c?js\s*/g,a=/\s*--experimental-loader\s+\S*\.pnp\.loader\.mjs\s*/;s=s.replace(o," ").replace(a," ").trim(),s=s?`${n} ${s}`:n,e.NODE_OPTIONS=s}}async function p5e(t,e){let r=Dl(t);e(r.cjs),e(r.esmLoader),e(t.configuration.get("pnpDataPath")),e(t.configuration.get("pnpUnpluggedFolder"))}var d5e={hooks:{populateYarnPaths:p5e,setupScriptEnvironment:h5e},configuration:{nodeLinker:{description:'The linker used for installing Node packages, one of: "pnp", "node-modules"',type:ye.STRING,default:"pnp"},pnpMode:{description:"If 'strict', generates standard PnP maps. If 'loose', merges them with the n_m resolution.",type:ye.STRING,default:"strict"},pnpShebang:{description:"String to prepend to the generated PnP script",type:ye.STRING,default:"#!/usr/bin/env node"},pnpIgnorePatterns:{description:"Array of glob patterns; files matching them will use the classic resolution",type:ye.STRING,default:[],isArray:!0},pnpEnableEsmLoader:{description:"If true, Yarn will generate an ESM loader (`.pnp.loader.mjs`). If this is not explicitly set Yarn tries to automatically detect whether ESM support is required.",type:ye.BOOLEAN,default:!1},pnpEnableInlining:{description:"If true, the PnP data will be inlined along with the generated loader",type:ye.BOOLEAN,default:!0},pnpFallbackMode:{description:"If true, the generated PnP loader will follow the top-level fallback rule",type:ye.STRING,default:"dependencies-only"},pnpUnpluggedFolder:{description:"Folder where the unplugged packages must be stored",type:ye.ABSOLUTE_PATH,default:"./.yarn/unplugged"},pnpDataPath:{description:"Path of the file where the PnP data (used by the loader) must be written",type:ye.ABSOLUTE_PATH,default:"./.pnp.data.json"}},linkers:[vu],commands:[Gle]},C5e=d5e;var Xle=ge(Vle());var aT=ge(require("crypto")),Zle=ge(require("fs")),$le=1,Gr="node_modules",pb=".bin",ece=".yarn-state.yml",Li;(function(i){i.CLASSIC="classic",i.HARDLINKS_LOCAL="hardlinks-local",i.HARDLINKS_GLOBAL="hardlinks-global"})(Li||(Li={}));var AT=class{constructor(){this.installStateCache=new Map}supportsPackage(e,r){return this.isEnabled(r)}async findPackageLocation(e,r){if(!this.isEnabled(r))throw new Error("Assertion failed: Expected the node-modules linker to be enabled");let i=r.project.tryWorkspaceByLocator(e);if(i)return i.cwd;let n=await ve.getFactoryWithDefault(this.installStateCache,r.project.cwd,async()=>await lT(r.project,{unrollAliases:!0}));if(n===null)throw new Pe("Couldn't find the node_modules state file - running an install might help (findPackageLocation)");let s=n.locatorMap.get(P.stringifyLocator(e));if(!s){let a=new Pe(`Couldn't find ${P.prettyLocator(r.project.configuration,e)} in the currently installed node_modules map - running an install might help`);throw a.code="LOCATOR_NOT_INSTALLED",a}let o=r.project.configuration.startingCwd;return s.locations.find(a=>x.contains(o,a))||s.locations[0]}async findPackageLocator(e,r){if(!this.isEnabled(r))return null;let i=await ve.getFactoryWithDefault(this.installStateCache,r.project.cwd,async()=>await lT(r.project,{unrollAliases:!0}));if(i===null)return null;let{locationRoot:n,segments:s}=db(x.resolve(e),{skipPrefix:r.project.cwd}),o=i.locationTree.get(n);if(!o)return null;let a=o.locator;for(let l of s){if(o=o.children.get(l),!o)break;a=o.locator||a}return P.parseLocator(a)}makeInstaller(e){return new tce(e)}isEnabled(e){return e.project.configuration.get("nodeLinker")==="node-modules"}},tce=class{constructor(e){this.opts=e;this.localStore=new Map;this.realLocatorChecksums=new Map;this.customData={store:new Map}}getCustomDataKey(){return JSON.stringify({name:"NodeModulesInstaller",version:2})}attachCustomData(e){this.customData=e}async installPackage(e,r){var u;let i=x.resolve(r.packageFs.getRealPath(),r.prefixPath),n=this.customData.store.get(e.locatorHash);if(typeof n=="undefined"&&(n=await N5e(e,r),e.linkType===Qt.HARD&&this.customData.store.set(e.locatorHash,n)),!P.isPackageCompatible(e,this.opts.project.configuration.getSupportedArchitectures()))return{packageLocation:null,buildDirective:null};let s=new Map,o=new Set;s.has(P.stringifyIdent(e))||s.set(P.stringifyIdent(e),e.reference);let a=e;if(P.isVirtualLocator(e)){a=P.devirtualizeLocator(e);for(let g of e.peerDependencies.values())s.set(P.stringifyIdent(g),null),o.add(P.stringifyIdent(g))}let l={packageLocation:`${H.fromPortablePath(i)}/`,packageDependencies:s,packagePeers:o,linkType:e.linkType,discardFromLookup:(u=r.discardFromLookup)!=null?u:!1};this.localStore.set(e.locatorHash,{pkg:e,customPackageData:n,dependencyMeta:this.opts.project.getDependencyMeta(e,e.version),pnpNode:l});let c=r.checksum?r.checksum.substring(r.checksum.indexOf("/")+1):null;return this.realLocatorChecksums.set(a.locatorHash,c),{packageLocation:i,buildDirective:null}}async attachInternalDependencies(e,r){let i=this.localStore.get(e.locatorHash);if(typeof i=="undefined")throw new Error("Assertion failed: Expected information object to have been registered");for(let[n,s]of r){let o=P.areIdentsEqual(n,s)?s.reference:[P.stringifyIdent(s),s.reference];i.pnpNode.packageDependencies.set(P.stringifyIdent(n),o)}}async attachExternalDependents(e,r){throw new Error("External dependencies haven't been implemented for the node-modules linker")}async finalizeInstall(){if(this.opts.project.configuration.get("nodeLinker")!=="node-modules")return;let e=new Wr({baseFs:new Es({libzip:await fn(),maxOpenFiles:80,readOnlyArchives:!0})}),r=await lT(this.opts.project),i=this.opts.project.configuration.get("nmMode");(r===null||i!==r.nmMode)&&(this.opts.project.storedBuildState.clear(),r={locatorMap:new Map,binSymlinks:new Map,locationTree:new Map,nmMode:i,mtimeMs:0});let n=new Map(this.opts.project.workspaces.map(f=>{var p,m;let h=this.opts.project.configuration.get("nmHoistingLimits");try{h=ve.validateEnum(Kn,(m=(p=f.manifest.installConfig)==null?void 0:p.hoistingLimits)!=null?m:h)}catch(y){let b=P.prettyWorkspace(this.opts.project.configuration,f);this.opts.report.reportWarning($.INVALID_MANIFEST,`${b}: Invalid 'installConfig.hoistingLimits' value. Expected one of ${Object.values(Kn).join(", ")}, using default: "${h}"`)}return[f.relativeCwd,h]})),s=new Map(this.opts.project.workspaces.map(f=>{var p,m;let h=this.opts.project.configuration.get("nmSelfReferences");return h=(m=(p=f.manifest.installConfig)==null?void 0:p.selfReferences)!=null?m:h,[f.relativeCwd,h]})),o={VERSIONS:{std:1},topLevel:{name:null,reference:null},getLocator:(f,h)=>Array.isArray(h)?{name:h[0],reference:h[1]}:{name:f,reference:h},getDependencyTreeRoots:()=>this.opts.project.workspaces.map(f=>{let h=f.anchoredLocator;return{name:P.stringifyIdent(f.locator),reference:h.reference}}),getPackageInformation:f=>{let h=f.reference===null?this.opts.project.topLevelWorkspace.anchoredLocator:P.makeLocator(P.parseIdent(f.name),f.reference),p=this.localStore.get(h.locatorHash);if(typeof p=="undefined")throw new Error("Assertion failed: Expected the package reference to have been registered");return p.pnpNode},findPackageLocator:f=>{let h=this.opts.project.tryWorkspaceByCwd(H.toPortablePath(f));if(h!==null){let p=h.anchoredLocator;return{name:P.stringifyIdent(p),reference:p.reference}}throw new Error("Assertion failed: Unimplemented")},resolveToUnqualified:()=>{throw new Error("Assertion failed: Unimplemented")},resolveUnqualified:()=>{throw new Error("Assertion failed: Unimplemented")},resolveRequest:()=>{throw new Error("Assertion failed: Unimplemented")},resolveVirtual:f=>H.fromPortablePath(Wr.resolveVirtual(H.toPortablePath(f)))},{tree:a,errors:l,preserveSymlinksRequired:c}=Ym(o,{pnpifyFs:!1,validateExternalSoftLinks:!0,hoistingLimitsByCwd:n,project:this.opts.project,selfReferencesByCwd:s});if(!a){for(let{messageName:f,text:h}of l)this.opts.report.reportError(f,h);return}let u=YL(a);await L5e(r,u,{baseFs:e,project:this.opts.project,report:this.opts.report,realLocatorChecksums:this.realLocatorChecksums,loadManifest:async f=>{let h=P.parseLocator(f),p=this.localStore.get(h.locatorHash);if(typeof p=="undefined")throw new Error("Assertion failed: Expected the slot to exist");return p.customPackageData.manifest}});let g=[];for(let[f,h]of u.entries()){if(rce(f))continue;let p=P.parseLocator(f),m=this.localStore.get(p.locatorHash);if(typeof m=="undefined")throw new Error("Assertion failed: Expected the slot to exist");if(this.opts.project.tryWorkspaceByLocator(m.pkg))continue;let y=ha.extractBuildScripts(m.pkg,m.customPackageData,m.dependencyMeta,{configuration:this.opts.project.configuration,report:this.opts.report});y.length!==0&&g.push({buildLocations:h.locations,locatorHash:p.locatorHash,buildDirective:y})}return c&&this.opts.report.reportWarning($.NM_PRESERVE_SYMLINKS_REQUIRED,`The application uses portals and that's why ${Ae.pretty(this.opts.project.configuration,"--preserve-symlinks",Ae.Type.CODE)} Node option is required for launching it`),{customData:this.customData,records:g}}};async function N5e(t,e){var n;let r=(n=await At.tryFind(e.prefixPath,{baseFs:e.packageFs}))!=null?n:new At,i=new Set(["preinstall","install","postinstall"]);for(let s of r.scripts.keys())i.has(s)||r.scripts.delete(s);return{manifest:{bin:r.bin,scripts:r.scripts},misc:{extractHint:ha.getExtractHint(e),hasBindingGyp:ha.hasBindingGyp(e)}}}async function T5e(t,e,r,i,{installChangedByUser:n}){let s="";s+=`# Warning: This file is automatically generated. Removing it is fine, but will -`,s+=`# cause your node_modules installation to become invalidated. -`,s+=` -`,s+=`__metadata: -`,s+=` version: ${$le} -`,s+=` nmMode: ${i.value} -`;let o=Array.from(e.keys()).sort(),a=P.stringifyLocator(t.topLevelWorkspace.anchoredLocator);for(let u of o){let g=e.get(u);s+=` -`,s+=`${JSON.stringify(u)}: -`,s+=` locations: -`;for(let f of g.locations){let h=x.contains(t.cwd,f);if(h===null)throw new Error(`Assertion failed: Expected the path to be within the project (${f})`);s+=` - ${JSON.stringify(h)} -`}if(g.aliases.length>0){s+=` aliases: -`;for(let f of g.aliases)s+=` - ${JSON.stringify(f)} -`}if(u===a&&r.size>0){s+=` bin: -`;for(let[f,h]of r){let p=x.contains(t.cwd,f);if(p===null)throw new Error(`Assertion failed: Expected the path to be within the project (${f})`);s+=` ${JSON.stringify(p)}: -`;for(let[m,y]of h){let b=x.relative(x.join(f,Gr),y);s+=` ${JSON.stringify(m)}: ${JSON.stringify(b)} -`}}}}let l=t.cwd,c=x.join(l,Gr,ece);n&&await K.removePromise(c),await K.changeFilePromise(c,s,{automaticNewlines:!0})}async function lT(t,{unrollAliases:e=!1}={}){let r=t.cwd,i=x.join(r,Gr,ece),n;try{n=await K.statPromise(i)}catch(c){}if(!n)return null;let s=Qi(await K.readFilePromise(i,"utf8"));if(s.__metadata.version>$le)return null;let o=s.__metadata.nmMode||Li.CLASSIC,a=new Map,l=new Map;delete s.__metadata;for(let[c,u]of Object.entries(s)){let g=u.locations.map(h=>x.join(r,h)),f=u.bin;if(f)for(let[h,p]of Object.entries(f)){let m=x.join(r,H.toPortablePath(h)),y=ve.getMapWithDefault(l,m);for(let[b,S]of Object.entries(p))y.set(Jr(b),H.toPortablePath([m,Gr,S].join(x.sep)))}if(a.set(c,{target:Ke.dot,linkType:Qt.HARD,locations:g,aliases:u.aliases||[]}),e&&u.aliases)for(let h of u.aliases){let{scope:p,name:m}=P.parseLocator(c),y=P.makeLocator(P.makeIdent(p,m),h),b=P.stringifyLocator(y);a.set(b,{target:Ke.dot,linkType:Qt.HARD,locations:g,aliases:[]})}}return{locatorMap:a,binSymlinks:l,locationTree:ice(a,{skipPrefix:t.cwd}),nmMode:o,mtimeMs:n.mtimeMs}}var lh=async(t,e)=>{if(t.split(x.sep).indexOf(Gr)<0)throw new Error(`Assertion failed: trying to remove dir that doesn't contain node_modules: ${t}`);try{if(!e.innerLoop){let i=e.allowSymlink?await K.statPromise(t):await K.lstatPromise(t);if(e.allowSymlink&&!i.isDirectory()||!e.allowSymlink&&i.isSymbolicLink()){await K.unlinkPromise(t);return}}let r=await K.readdirPromise(t,{withFileTypes:!0});for(let i of r){let n=x.join(t,Jr(i.name));i.isDirectory()?(i.name!==Gr||e&&e.innerLoop)&&await lh(n,{innerLoop:!0,contentsOnly:!1}):await K.unlinkPromise(n)}e.contentsOnly||await K.rmdirPromise(t)}catch(r){if(r.code!=="ENOENT"&&r.code!=="ENOTEMPTY")throw r}},nce=4,db=(t,{skipPrefix:e})=>{let r=x.contains(e,t);if(r===null)throw new Error(`Assertion failed: Writing attempt prevented to ${t} which is outside project root: ${e}`);let i=r.split(x.sep).filter(l=>l!==""),n=i.indexOf(Gr),s=i.slice(0,n).join(x.sep),o=x.join(e,s),a=i.slice(n);return{locationRoot:o,segments:a}},ice=(t,{skipPrefix:e})=>{let r=new Map;if(t===null)return r;let i=()=>({children:new Map,linkType:Qt.HARD});for(let[n,s]of t.entries()){if(s.linkType===Qt.SOFT&&x.contains(e,s.target)!==null){let a=ve.getFactoryWithDefault(r,s.target,i);a.locator=n,a.linkType=s.linkType}for(let o of s.locations){let{locationRoot:a,segments:l}=db(o,{skipPrefix:e}),c=ve.getFactoryWithDefault(r,a,i);for(let u=0;u{let r;try{process.platform==="win32"&&(r=await K.lstatPromise(t))}catch(i){}process.platform=="win32"&&(!r||r.isDirectory())?await K.symlinkPromise(t,e,"junction"):await K.symlinkPromise(x.relative(x.dirname(e),t),e)};async function sce(t,e,r){let i=x.join(t,Jr(`${aT.default.randomBytes(16).toString("hex")}.tmp`));try{await K.writeFilePromise(i,r);try{await K.linkPromise(i,e)}catch(n){}}finally{await K.unlinkPromise(i)}}async function O5e({srcPath:t,dstPath:e,srcMode:r,globalHardlinksStore:i,baseFs:n,nmMode:s,digest:o}){if(s.value===Li.HARDLINKS_GLOBAL&&i&&o){let l=x.join(i,o.substring(0,2),`${o.substring(2)}.dat`),c;try{if(await Dn.checksumFile(l,{baseFs:K,algorithm:"sha1"})!==o){let g=x.join(i,Jr(`${aT.default.randomBytes(16).toString("hex")}.tmp`));await K.renamePromise(l,g);let f=await n.readFilePromise(t);await K.writeFilePromise(g,f);try{await K.linkPromise(g,l),await K.unlinkPromise(g)}catch(h){}}await K.linkPromise(l,e),c=!0}catch(u){c=!1}if(!c){let u=await n.readFilePromise(t);await sce(i,l,u);try{await K.linkPromise(l,e)}catch(g){g&&g.code&&g.code=="EXDEV"&&(s.value=Li.HARDLINKS_LOCAL,await n.copyFilePromise(t,e))}}}else await n.copyFilePromise(t,e);let a=r&511;a!==420&&await K.chmodPromise(e,a)}var Rl;(function(i){i.FILE="file",i.DIRECTORY="directory",i.SYMLINK="symlink"})(Rl||(Rl={}));var M5e=async(t,e,{baseFs:r,globalHardlinksStore:i,nmMode:n,packageChecksum:s})=>{await K.mkdirPromise(t,{recursive:!0});let o=async(l=Ke.dot)=>{let c=x.join(e,l),u=await r.readdirPromise(c,{withFileTypes:!0}),g=new Map;for(let f of u){let h=x.join(l,f.name),p,m=x.join(c,f.name);if(f.isFile()){if(p={kind:Rl.FILE,mode:(await r.lstatPromise(m)).mode},n.value===Li.HARDLINKS_GLOBAL){let y=await Dn.checksumFile(m,{baseFs:r,algorithm:"sha1"});p.digest=y}}else if(f.isDirectory())p={kind:Rl.DIRECTORY};else if(f.isSymbolicLink())p={kind:Rl.SYMLINK,symlinkTo:await r.readlinkPromise(m)};else throw new Error(`Unsupported file type (file: ${m}, mode: 0o${await r.statSync(m).mode.toString(8).padStart(6,"0")})`);if(g.set(h,p),f.isDirectory()&&h!==Gr){let y=await o(h);for(let[b,S]of y)g.set(b,S)}}return g},a;if(n.value===Li.HARDLINKS_GLOBAL&&i&&s){let l=x.join(i,s.substring(0,2),`${s.substring(2)}.json`);try{a=new Map(Object.entries(JSON.parse(await K.readFilePromise(l,"utf8"))))}catch(c){a=await o(),await sce(i,l,Buffer.from(JSON.stringify(Object.fromEntries(a))))}}else a=await o();for(let[l,c]of a){let u=x.join(e,l),g=x.join(t,l);c.kind===Rl.DIRECTORY?await K.mkdirPromise(g,{recursive:!0}):c.kind===Rl.FILE?await O5e({srcPath:u,dstPath:g,srcMode:c.mode,digest:c.digest,nmMode:n,baseFs:r,globalHardlinksStore:i}):c.kind===Rl.SYMLINK&&await cT(x.resolve(x.dirname(g),c.symlinkTo),g)}};function K5e(t,e,r,i){let n=new Map,s=new Map,o=new Map,a=!1,l=(c,u,g,f,h)=>{let p=!0,m=x.join(c,u),y=new Set;if(u===Gr||u.startsWith("@")){let S;try{S=K.statSync(m)}catch(T){}p=!!S,S?S.mtimeMs>r?(a=!0,y=new Set(K.readdirSync(m))):y=new Set(g.children.get(u).children.keys()):a=!0;let k=e.get(c);if(k){let T=x.join(c,Gr,pb),Y;try{Y=K.statSync(T)}catch(j){}if(!Y)a=!0;else if(Y.mtimeMs>r){a=!0;let j=new Set(K.readdirSync(T)),Z=new Map;s.set(c,Z);for(let[J,re]of k)j.has(J)&&Z.set(J,re)}else s.set(c,k)}}else p=h.has(u);let b=g.children.get(u);if(p){let{linkType:S,locator:k}=b,T={children:new Map,linkType:S,locator:k};if(f.children.set(u,T),k){let Y=ve.getSetWithDefault(o,k);Y.add(m),o.set(k,Y)}for(let Y of b.children.keys())l(m,Y,b,T,y)}else b.locator&&i.storedBuildState.delete(P.parseLocator(b.locator).locatorHash)};for(let[c,u]of t){let{linkType:g,locator:f}=u,h={children:new Map,linkType:g,locator:f};if(n.set(c,h),f){let p=ve.getSetWithDefault(o,u.locator);p.add(c),o.set(u.locator,p)}u.children.has(Gr)&&l(c,Gr,u,h,new Set)}return{locationTree:n,binSymlinks:s,locatorLocations:o,installChangedByUser:a}}function rce(t){let e=P.parseDescriptor(t);return P.isVirtualDescriptor(e)&&(e=P.devirtualizeDescriptor(e)),e.range.startsWith("link:")}async function U5e(t,e,r,{loadManifest:i}){let n=new Map;for(let[a,{locations:l}]of t){let c=rce(a)?null:await i(a,l[0]),u=new Map;if(c)for(let[g,f]of c.bin){let h=x.join(l[0],f);f!==""&&K.existsSync(h)&&u.set(g,f)}n.set(a,u)}let s=new Map,o=(a,l,c)=>{let u=new Map,g=x.contains(r,a);if(c.locator&&g!==null){let f=n.get(c.locator);for(let[h,p]of f){let m=x.join(a,H.toPortablePath(p));u.set(Jr(h),m)}for(let[h,p]of c.children){let m=x.join(a,h),y=o(m,m,p);y.size>0&&s.set(a,new Map([...s.get(a)||new Map,...y]))}}else for(let[f,h]of c.children){let p=o(x.join(a,f),l,h);for(let[m,y]of p)u.set(m,y)}return u};for(let[a,l]of e){let c=o(a,a,l);c.size>0&&s.set(a,new Map([...s.get(a)||new Map,...c]))}return s}var oce=(t,e)=>{if(!t||!e)return t===e;let r=P.parseLocator(t);P.isVirtualLocator(r)&&(r=P.devirtualizeLocator(r));let i=P.parseLocator(e);return P.isVirtualLocator(i)&&(i=P.devirtualizeLocator(i)),P.areLocatorsEqual(r,i)};function uT(t){return x.join(t.get("globalFolder"),"store")}async function L5e(t,e,{baseFs:r,project:i,report:n,loadManifest:s,realLocatorChecksums:o}){let a=x.join(i.cwd,Gr),{locationTree:l,binSymlinks:c,locatorLocations:u,installChangedByUser:g}=K5e(t.locationTree,t.binSymlinks,t.mtimeMs,i),f=ice(e,{skipPrefix:i.cwd}),h=[],p=async({srcDir:J,dstDir:re,linkType:ee,globalHardlinksStore:A,nmMode:oe,packageChecksum:le})=>{let X=(async()=>{try{ee===Qt.SOFT?(await K.mkdirPromise(x.dirname(re),{recursive:!0}),await cT(x.resolve(J),re)):await M5e(re,J,{baseFs:r,globalHardlinksStore:A,nmMode:oe,packageChecksum:le})}catch(O){throw O.message=`While persisting ${J} -> ${re} ${O.message}`,O}finally{T.tick()}})().then(()=>h.splice(h.indexOf(X),1));h.push(X),h.length>nce&&await Promise.race(h)},m=async(J,re,ee)=>{let A=(async()=>{let oe=async(le,X,O)=>{try{O.innerLoop||await K.mkdirPromise(X,{recursive:!0});let L=await K.readdirPromise(le,{withFileTypes:!0});for(let pe of L){if(!O.innerLoop&&pe.name===pb)continue;let Ce=x.join(le,pe.name),Oe=x.join(X,pe.name);pe.isDirectory()?(pe.name!==Gr||O&&O.innerLoop)&&(await K.mkdirPromise(Oe,{recursive:!0}),await oe(Ce,Oe,ie(N({},O),{innerLoop:!0}))):Z.value===Li.HARDLINKS_LOCAL||Z.value===Li.HARDLINKS_GLOBAL?await K.linkPromise(Ce,Oe):await K.copyFilePromise(Ce,Oe,Zle.default.constants.COPYFILE_FICLONE)}}catch(L){throw O.innerLoop||(L.message=`While cloning ${le} -> ${X} ${L.message}`),L}finally{O.innerLoop||T.tick()}};await oe(J,re,ee)})().then(()=>h.splice(h.indexOf(A),1));h.push(A),h.length>nce&&await Promise.race(h)},y=async(J,re,ee)=>{if(ee)for(let[A,oe]of re.children){let le=ee.children.get(A);await y(x.join(J,A),oe,le)}else{re.children.has(Gr)&&await lh(x.join(J,Gr),{contentsOnly:!1});let A=x.basename(J)===Gr&&f.has(x.join(x.dirname(J),x.sep));await lh(J,{contentsOnly:J===a,allowSymlink:A})}};for(let[J,re]of l){let ee=f.get(J);for(let[A,oe]of re.children){if(A===".")continue;let le=ee&&ee.children.get(A),X=x.join(J,A);await y(X,oe,le)}}let b=async(J,re,ee)=>{if(ee){oce(re.locator,ee.locator)||await lh(J,{contentsOnly:re.linkType===Qt.HARD});for(let[A,oe]of re.children){let le=ee.children.get(A);await b(x.join(J,A),oe,le)}}else{re.children.has(Gr)&&await lh(x.join(J,Gr),{contentsOnly:!0});let A=x.basename(J)===Gr&&f.has(x.join(x.dirname(J),x.sep));await lh(J,{contentsOnly:re.linkType===Qt.HARD,allowSymlink:A})}};for(let[J,re]of f){let ee=l.get(J);for(let[A,oe]of re.children){if(A===".")continue;let le=ee&&ee.children.get(A);await b(x.join(J,A),oe,le)}}let S=new Map,k=[];for(let[J,re]of u)for(let ee of re){let{locationRoot:A,segments:oe}=db(ee,{skipPrefix:i.cwd}),le=f.get(A),X=A;if(le){for(let O of oe)if(X=x.join(X,O),le=le.children.get(O),!le)break;if(le){let O=oce(le.locator,J),L=e.get(le.locator),pe=L.target,Ce=X,Oe=L.linkType;if(O)S.has(pe)||S.set(pe,Ce);else if(pe!==Ce){let te=P.parseLocator(le.locator);P.isVirtualLocator(te)&&(te=P.devirtualizeLocator(te)),k.push({srcDir:pe,dstDir:Ce,linkType:Oe,realLocatorHash:te.locatorHash})}}}}for(let[J,{locations:re}]of e.entries())for(let ee of re){let{locationRoot:A,segments:oe}=db(ee,{skipPrefix:i.cwd}),le=l.get(A),X=f.get(A),O=A,L=e.get(J),pe=P.parseLocator(J);P.isVirtualLocator(pe)&&(pe=P.devirtualizeLocator(pe));let Ce=pe.locatorHash,Oe=L.target,te=ee;if(Oe===te)continue;let se=L.linkType;for(let be of oe)X=X.children.get(be);if(!le)k.push({srcDir:Oe,dstDir:te,linkType:se,realLocatorHash:Ce});else for(let be of oe)if(O=x.join(O,be),le=le.children.get(be),!le){k.push({srcDir:Oe,dstDir:te,linkType:se,realLocatorHash:Ce});break}}let T=Ji.progressViaCounter(k.length),Y=n.reportProgress(T),j=i.configuration.get("nmMode"),Z={value:j};try{let J=Z.value===Li.HARDLINKS_GLOBAL?`${uT(i.configuration)}/v1`:null;if(J&&!await K.existsPromise(J)){await K.mkdirpPromise(J);for(let ee=0;ee<256;ee++)await K.mkdirPromise(x.join(J,ee.toString(16).padStart(2,"0")))}for(let ee of k)(ee.linkType===Qt.SOFT||!S.has(ee.srcDir))&&(S.set(ee.srcDir,ee.dstDir),await p(ie(N({},ee),{globalHardlinksStore:J,nmMode:Z,packageChecksum:o.get(ee.realLocatorHash)||null})));await Promise.all(h),h.length=0;for(let ee of k){let A=S.get(ee.srcDir);ee.linkType!==Qt.SOFT&&ee.dstDir!==A&&await m(A,ee.dstDir,{nmMode:Z})}await Promise.all(h),await K.mkdirPromise(a,{recursive:!0});let re=await U5e(e,f,i.cwd,{loadManifest:s});await H5e(c,re,i.cwd),await T5e(i,e,re,Z,{installChangedByUser:g}),j==Li.HARDLINKS_GLOBAL&&Z.value==Li.HARDLINKS_LOCAL&&n.reportWarningOnce($.NM_HARDLINKS_MODE_DOWNGRADED,"'nmMode' has been downgraded to 'hardlinks-local' due to global cache and install folder being on different devices")}finally{Y.stop()}}async function H5e(t,e,r){for(let i of t.keys()){if(x.contains(r,i)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${i}`);if(!e.has(i)){let n=x.join(i,Gr,pb);await K.removePromise(n)}}for(let[i,n]of e){if(x.contains(r,i)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${i}`);let s=x.join(i,Gr,pb),o=t.get(i)||new Map;await K.mkdirPromise(s,{recursive:!0});for(let a of o.keys())n.has(a)||(await K.removePromise(x.join(s,a)),process.platform==="win32"&&await K.removePromise(x.join(s,Jr(`${a}.cmd`))));for(let[a,l]of n){let c=o.get(a),u=x.join(s,a);c!==l&&(process.platform==="win32"?await(0,Xle.default)(H.fromPortablePath(l),H.fromPortablePath(u),{createPwshFile:!1}):(await K.removePromise(u),await cT(l,u),x.contains(r,await K.realpathPromise(l))!==null&&await K.chmodPromise(l,493)))}}}var gT=class extends vu{constructor(){super(...arguments);this.mode="loose"}makeInstaller(e){return new ace(e)}},ace=class extends ah{constructor(){super(...arguments);this.mode="loose"}async transformPnpSettings(e){let r=new Wr({baseFs:new Es({libzip:await fn(),maxOpenFiles:80,readOnlyArchives:!0})}),i=Tle(e,this.opts.project.cwd,r),{tree:n,errors:s}=Ym(i,{pnpifyFs:!1,project:this.opts.project});if(!n){for(let{messageName:u,text:g}of s)this.opts.report.reportError(u,g);return}let o=new Map;e.fallbackPool=o;let a=(u,g)=>{let f=P.parseLocator(g.locator),h=P.stringifyIdent(f);h===u?o.set(u,f.reference):o.set(u,[h,f.reference])},l=x.join(this.opts.project.cwd,Pt.nodeModules),c=n.get(l);if(typeof c!="undefined"){if("target"in c)throw new Error("Assertion failed: Expected the root junction point to be a directory");for(let u of c.dirList){let g=x.join(l,u),f=n.get(g);if(typeof f=="undefined")throw new Error("Assertion failed: Expected the child to have been registered");if("target"in f)a(u,f);else for(let h of f.dirList){let p=x.join(g,h),m=n.get(p);if(typeof m=="undefined")throw new Error("Assertion failed: Expected the subchild to have been registered");if("target"in m)a(`${u}/${h}`,m);else throw new Error("Assertion failed: Expected the leaf junction to be a package")}}}}};var G5e={hooks:{cleanGlobalArtifacts:async t=>{let e=uT(t);await K.removePromise(e)}},configuration:{nmHoistingLimits:{description:"Prevent packages to be hoisted past specific levels",type:ye.STRING,values:[Kn.WORKSPACES,Kn.DEPENDENCIES,Kn.NONE],default:Kn.NONE},nmMode:{description:'If set to "hardlinks-local" Yarn will utilize hardlinks to reduce disk space consumption inside "node_modules" directories. With "hardlinks-global" Yarn will use global content addressable storage to reduce "node_modules" size across all the projects using this option.',type:ye.STRING,values:[Li.CLASSIC,Li.HARDLINKS_LOCAL,Li.HARDLINKS_GLOBAL],default:Li.CLASSIC},nmSelfReferences:{description:"If set to 'false' the workspace will not be allowed to require itself and corresponding self-referencing symlink will not be created",type:ye.BOOLEAN,default:!0}},linkers:[AT,gT]},j5e=G5e;var gO={};ft(gO,{default:()=>XVe,npmConfigUtils:()=>br,npmHttpUtils:()=>zt,npmPublishUtils:()=>Bh});var gce=ge(ri());var Cr="npm:";var zt={};ft(zt,{AuthType:()=>cs,customPackageError:()=>J5e,del:()=>_5e,get:()=>Bo,getIdentUrl:()=>Nl,handleInvalidAuthenticationError:()=>Fl,post:()=>W5e,put:()=>z5e});var cce=ge(em()),uce=ge(require("url"));var br={};ft(br,{RegistryType:()=>wA,getAuditRegistry:()=>Y5e,getAuthConfiguration:()=>pT,getDefaultRegistry:()=>Cb,getPublishRegistry:()=>Ace,getRegistryConfiguration:()=>lce,getScopeConfiguration:()=>hT,getScopeRegistry:()=>BA,normalizeRegistry:()=>pa});var wA;(function(i){i.AUDIT_REGISTRY="npmAuditRegistry",i.FETCH_REGISTRY="npmRegistryServer",i.PUBLISH_REGISTRY="npmPublishRegistry"})(wA||(wA={}));function pa(t){return t.replace(/\/$/,"")}function Y5e(t,{configuration:e}){let r=e.get(wA.AUDIT_REGISTRY);return r!==null?pa(r):Ace(t,{configuration:e})}function Ace(t,{configuration:e}){var r;return((r=t.publishConfig)==null?void 0:r.registry)?pa(t.publishConfig.registry):t.name?BA(t.name.scope,{configuration:e,type:wA.PUBLISH_REGISTRY}):Cb({configuration:e,type:wA.PUBLISH_REGISTRY})}function BA(t,{configuration:e,type:r=wA.FETCH_REGISTRY}){let i=hT(t,{configuration:e});if(i===null)return Cb({configuration:e,type:r});let n=i.get(r);return n===null?Cb({configuration:e,type:r}):pa(n)}function Cb({configuration:t,type:e=wA.FETCH_REGISTRY}){let r=t.get(e);return pa(r!==null?r:t.get(wA.FETCH_REGISTRY))}function lce(t,{configuration:e}){let r=e.get("npmRegistries"),i=pa(t),n=r.get(i);if(typeof n!="undefined")return n;let s=r.get(i.replace(/^[a-z]+:/,""));return typeof s!="undefined"?s:null}function hT(t,{configuration:e}){if(t===null)return null;let i=e.get("npmScopes").get(t);return i||null}function pT(t,{configuration:e,ident:r}){let i=r&&hT(r.scope,{configuration:e});return(i==null?void 0:i.get("npmAuthIdent"))||(i==null?void 0:i.get("npmAuthToken"))?i:lce(t,{configuration:e})||e}var cs;(function(n){n[n.NO_AUTH=0]="NO_AUTH",n[n.BEST_EFFORT=1]="BEST_EFFORT",n[n.CONFIGURATION=2]="CONFIGURATION",n[n.ALWAYS_AUTH=3]="ALWAYS_AUTH"})(cs||(cs={}));async function Fl(t,{attemptedAs:e,registry:r,headers:i,configuration:n}){var s,o;if(mb(t))throw new ct($.AUTHENTICATION_INVALID,"Invalid OTP token");if(((s=t.originalError)==null?void 0:s.name)==="HTTPError"&&((o=t.originalError)==null?void 0:o.response.statusCode)===401)throw new ct($.AUTHENTICATION_INVALID,`Invalid authentication (${typeof e!="string"?`as ${await q5e(r,i,{configuration:n})}`:`attempted as ${e}`})`)}function J5e(t){var e;return((e=t.response)==null?void 0:e.statusCode)===404?"Package not found":null}function Nl(t){return t.scope?`/@${t.scope}%2f${t.name}`:`/${t.name}`}async function Bo(t,a){var l=a,{configuration:e,headers:r,ident:i,authType:n,registry:s}=l,o=Tr(l,["configuration","headers","ident","authType","registry"]);if(i&&typeof s=="undefined"&&(s=BA(i.scope,{configuration:e})),i&&i.scope&&typeof n=="undefined"&&(n=1),typeof s!="string")throw new Error("Assertion failed: The registry should be a string");let c=await Eb(s,{authType:n,configuration:e,ident:i});c&&(r=ie(N({},r),{authorization:c}));try{return await ir.get(t.charAt(0)==="/"?`${s}${t}`:t,N({configuration:e,headers:r},o))}catch(u){throw await Fl(u,{registry:s,configuration:e,headers:r}),u}}async function W5e(t,e,u){var g=u,{attemptedAs:r,configuration:i,headers:n,ident:s,authType:o=3,registry:a,otp:l}=g,c=Tr(g,["attemptedAs","configuration","headers","ident","authType","registry","otp"]);if(s&&typeof a=="undefined"&&(a=BA(s.scope,{configuration:i})),typeof a!="string")throw new Error("Assertion failed: The registry should be a string");let f=await Eb(a,{authType:o,configuration:i,ident:s});f&&(n=ie(N({},n),{authorization:f})),l&&(n=N(N({},n),ch(l)));try{return await ir.post(a+t,e,N({configuration:i,headers:n},c))}catch(h){if(!mb(h)||l)throw await Fl(h,{attemptedAs:r,registry:a,configuration:i,headers:n}),h;l=await dT();let p=N(N({},n),ch(l));try{return await ir.post(`${a}${t}`,e,N({configuration:i,headers:p},c))}catch(m){throw await Fl(m,{attemptedAs:r,registry:a,configuration:i,headers:n}),m}}}async function z5e(t,e,u){var g=u,{attemptedAs:r,configuration:i,headers:n,ident:s,authType:o=3,registry:a,otp:l}=g,c=Tr(g,["attemptedAs","configuration","headers","ident","authType","registry","otp"]);if(s&&typeof a=="undefined"&&(a=BA(s.scope,{configuration:i})),typeof a!="string")throw new Error("Assertion failed: The registry should be a string");let f=await Eb(a,{authType:o,configuration:i,ident:s});f&&(n=ie(N({},n),{authorization:f})),l&&(n=N(N({},n),ch(l)));try{return await ir.put(a+t,e,N({configuration:i,headers:n},c))}catch(h){if(!mb(h))throw await Fl(h,{attemptedAs:r,registry:a,configuration:i,headers:n}),h;l=await dT();let p=N(N({},n),ch(l));try{return await ir.put(`${a}${t}`,e,N({configuration:i,headers:p},c))}catch(m){throw await Fl(m,{attemptedAs:r,registry:a,configuration:i,headers:n}),m}}}async function _5e(t,c){var u=c,{attemptedAs:e,configuration:r,headers:i,ident:n,authType:s=3,registry:o,otp:a}=u,l=Tr(u,["attemptedAs","configuration","headers","ident","authType","registry","otp"]);if(n&&typeof o=="undefined"&&(o=BA(n.scope,{configuration:r})),typeof o!="string")throw new Error("Assertion failed: The registry should be a string");let g=await Eb(o,{authType:s,configuration:r,ident:n});g&&(i=ie(N({},i),{authorization:g})),a&&(i=N(N({},i),ch(a)));try{return await ir.del(o+t,N({configuration:r,headers:i},l))}catch(f){if(!mb(f)||a)throw await Fl(f,{attemptedAs:e,registry:o,configuration:r,headers:i}),f;a=await dT();let h=N(N({},i),ch(a));try{return await ir.del(`${o}${t}`,N({configuration:r,headers:h},l))}catch(p){throw await Fl(p,{attemptedAs:e,registry:o,configuration:r,headers:i}),p}}}async function Eb(t,{authType:e=2,configuration:r,ident:i}){let n=pT(t,{configuration:r,ident:i}),s=V5e(n,e);if(!s)return null;let o=await r.reduceHook(a=>a.getNpmAuthenticationHeader,void 0,t,{configuration:r,ident:i});if(o)return o;if(n.get("npmAuthToken"))return`Bearer ${n.get("npmAuthToken")}`;if(n.get("npmAuthIdent")){let a=n.get("npmAuthIdent");return a.includes(":")?`Basic ${Buffer.from(a).toString("base64")}`:`Basic ${a}`}if(s&&e!==1)throw new ct($.AUTHENTICATION_NOT_FOUND,"No authentication configured for request");return null}function V5e(t,e){switch(e){case 2:return t.get("npmAlwaysAuth");case 1:case 3:return!0;case 0:return!1;default:throw new Error("Unreachable")}}async function q5e(t,e,{configuration:r}){var i;if(typeof e=="undefined"||typeof e.authorization=="undefined")return"an anonymous user";try{return(i=(await ir.get(new uce.URL(`${t}/-/whoami`).href,{configuration:r,headers:e,jsonResponse:!0})).username)!=null?i:"an unknown user"}catch{return"an unknown user"}}async function dT(){if(process.env.TEST_ENV)return process.env.TEST_NPM_2FA_TOKEN||"";let{otp:t}=await(0,cce.prompt)({type:"password",name:"otp",message:"One-time password:",required:!0,onCancel:()=>process.exit(130)});return t}function mb(t){var e,r;if(((e=t.originalError)==null?void 0:e.name)!=="HTTPError")return!1;try{return((r=t.originalError)==null?void 0:r.response.headers["www-authenticate"].split(/,\s*/).map(n=>n.toLowerCase())).includes("otp")}catch(i){return!1}}function ch(t){return{["npm-otp"]:t}}var CT=class{supports(e,r){if(!e.reference.startsWith(Cr))return!1;let{selector:i,params:n}=P.parseRange(e.reference);return!(!gce.default.valid(i)||n===null||typeof n.__archiveUrl!="string")}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,N({onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${P.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,r),skipIntegrityCheck:r.skipIntegrityCheck},r.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,r){let{params:i}=P.parseRange(e.reference);if(i===null||typeof i.__archiveUrl!="string")throw new Error("Assertion failed: The archiveUrl querystring parameter should have been available");let n=await Bo(i.__archiveUrl,{configuration:r.project.configuration,ident:e});return await wi.convertToZip(n,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:P.getIdentVendorPath(e),stripComponents:1})}};var mT=class{supportsDescriptor(e,r){return!(!e.range.startsWith(Cr)||!P.tryParseDescriptor(e.range.slice(Cr.length),!0))}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Unreachable")}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){let i=P.parseDescriptor(e.range.slice(Cr.length),!0);return r.resolver.getResolutionDependencies(i,r)}async getCandidates(e,r,i){let n=P.parseDescriptor(e.range.slice(Cr.length),!0);return await i.resolver.getCandidates(n,r,i)}async getSatisfying(e,r,i){let n=P.parseDescriptor(e.range.slice(Cr.length),!0);return i.resolver.getSatisfying(n,r,i)}resolve(e,r){throw new Error("Unreachable")}};var fce=ge(ri()),hce=ge(require("url"));var bo=class{supports(e,r){if(!e.reference.startsWith(Cr))return!1;let i=new hce.URL(e.reference);return!(!fce.default.valid(i.pathname)||i.searchParams.has("__archiveUrl"))}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,N({onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${P.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote registry`),loader:()=>this.fetchFromNetwork(e,r),skipIntegrityCheck:r.skipIntegrityCheck},r.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,r){let i;try{i=await Bo(bo.getLocatorUrl(e),{configuration:r.project.configuration,ident:e})}catch(n){i=await Bo(bo.getLocatorUrl(e).replace(/%2f/g,"/"),{configuration:r.project.configuration,ident:e})}return await wi.convertToZip(i,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:P.getIdentVendorPath(e),stripComponents:1})}static isConventionalTarballUrl(e,r,{configuration:i}){let n=BA(e.scope,{configuration:i}),s=bo.getLocatorUrl(e);return r=r.replace(/^https?:(\/\/(?:[^/]+\.)?npmjs.org(?:$|\/))/,"https:$1"),n=n.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),r=r.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),r===n+s||r===n+s.replace(/%2f/g,"/")}static getLocatorUrl(e){let r=Wt.clean(e.reference.slice(Cr.length));if(r===null)throw new ct($.RESOLVER_NOT_FOUND,"The npm semver resolver got selected, but the version isn't semver");return`${Nl(e)}/-/${e.name}-${r}.tgz`}};var pce=ge(ri());var Ib=P.makeIdent(null,"node-gyp"),X5e=/\b(node-gyp|prebuild-install)\b/,ET=class{supportsDescriptor(e,r){return e.range.startsWith(Cr)?!!Wt.validRange(e.range.slice(Cr.length)):!1}supportsLocator(e,r){if(!e.reference.startsWith(Cr))return!1;let{selector:i}=P.parseRange(e.reference);return!!pce.default.valid(i)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){let n=Wt.validRange(e.range.slice(Cr.length));if(n===null)throw new Error(`Expected a valid range, got ${e.range.slice(Cr.length)}`);let s=await Bo(Nl(e),{configuration:i.project.configuration,ident:e,jsonResponse:!0}),o=ve.mapAndFilter(Object.keys(s.versions),c=>{try{let u=new Wt.SemVer(c);if(n.test(u))return u}catch{}return ve.mapAndFilter.skip}),a=o.filter(c=>!s.versions[c.raw].deprecated),l=a.length>0?a:o;return l.sort((c,u)=>-c.compare(u)),l.map(c=>{let u=P.makeLocator(e,`${Cr}${c.raw}`),g=s.versions[c.raw].dist.tarball;return bo.isConventionalTarballUrl(u,g,{configuration:i.project.configuration})?u:P.bindLocator(u,{__archiveUrl:g})})}async getSatisfying(e,r,i){let n=Wt.validRange(e.range.slice(Cr.length));if(n===null)throw new Error(`Expected a valid range, got ${e.range.slice(Cr.length)}`);return ve.mapAndFilter(r,s=>{try{let{selector:o}=P.parseRange(s,{requireProtocol:Cr}),a=new Wt.SemVer(o);if(n.test(a))return{reference:s,version:a}}catch{}return ve.mapAndFilter.skip}).sort((s,o)=>-s.version.compare(o.version)).map(({reference:s})=>P.makeLocator(e,s))}async resolve(e,r){let{selector:i}=P.parseRange(e.reference),n=Wt.clean(i);if(n===null)throw new ct($.RESOLVER_NOT_FOUND,"The npm semver resolver got selected, but the version isn't semver");let s=await Bo(Nl(e),{configuration:r.project.configuration,ident:e,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(s,"versions"))throw new ct($.REMOTE_INVALID,'Registry returned invalid data for - missing "versions" field');if(!Object.prototype.hasOwnProperty.call(s.versions,n))throw new ct($.REMOTE_NOT_FOUND,`Registry failed to return reference "${n}"`);let o=new At;if(o.load(s.versions[n]),!o.dependencies.has(Ib.identHash)&&!o.peerDependencies.has(Ib.identHash)){for(let a of o.scripts.values())if(a.match(X5e)){o.dependencies.set(Ib.identHash,P.makeDescriptor(Ib,"latest")),r.report.reportWarningOnce($.NODE_GYP_INJECTED,`${P.prettyLocator(r.project.configuration,e)}: Implicit dependencies on node-gyp are discouraged`);break}}if(typeof o.raw.deprecated=="string"&&o.raw.deprecated!==""){let a=P.prettyLocator(r.project.configuration,e),l=o.raw.deprecated.match(/\S/)?`${a} is deprecated: ${o.raw.deprecated}`:`${a} is deprecated`;r.report.reportWarningOnce($.DEPRECATED_PACKAGE,l)}return ie(N({},e),{version:n,languageName:"node",linkType:Qt.HARD,conditions:o.getConditions(),dependencies:o.dependencies,peerDependencies:o.peerDependencies,dependenciesMeta:o.dependenciesMeta,peerDependenciesMeta:o.peerDependenciesMeta,bin:o.bin})}};var IT=class{supportsDescriptor(e,r){return!(!e.range.startsWith(Cr)||!qg.test(e.range.slice(Cr.length)))}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Unreachable")}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){let n=e.range.slice(Cr.length),s=await Bo(Nl(e),{configuration:i.project.configuration,ident:e,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(s,"dist-tags"))throw new ct($.REMOTE_INVALID,'Registry returned invalid data - missing "dist-tags" field');let o=s["dist-tags"];if(!Object.prototype.hasOwnProperty.call(o,n))throw new ct($.REMOTE_NOT_FOUND,`Registry failed to return tag "${n}"`);let a=o[n],l=P.makeLocator(e,`${Cr}${a}`),c=s.versions[a].dist.tarball;return bo.isConventionalTarballUrl(l,c,{configuration:i.project.configuration})?[l]:[P.bindLocator(l,{__archiveUrl:c})]}async getSatisfying(e,r,i){return null}async resolve(e,r){throw new Error("Unreachable")}};var Bh={};ft(Bh,{getGitHead:()=>_Ve,makePublishBody:()=>zVe});var AO={};ft(AO,{default:()=>PVe,packUtils:()=>SA});var SA={};ft(SA,{genPackList:()=>Gb,genPackStream:()=>aO,genPackageManifest:()=>jue,hasPackScripts:()=>sO,prepareForPack:()=>oO});var nO=ge(rs()),Hue=ge(Uue()),Gue=ge(require("zlib")),EVe=["/package.json","/readme","/readme.*","/license","/license.*","/licence","/licence.*","/changelog","/changelog.*"],IVe=["/package.tgz",".github",".git",".hg","node_modules",".npmignore",".gitignore",".#*",".DS_Store"];async function sO(t){return!!(Zt.hasWorkspaceScript(t,"prepack")||Zt.hasWorkspaceScript(t,"postpack"))}async function oO(t,{report:e},r){await Zt.maybeExecuteWorkspaceLifecycleScript(t,"prepack",{report:e});try{let i=x.join(t.cwd,At.fileName);await K.existsPromise(i)&&await t.manifest.loadFile(i,{baseFs:K}),await r()}finally{await Zt.maybeExecuteWorkspaceLifecycleScript(t,"postpack",{report:e})}}async function aO(t,e){var s,o;typeof e=="undefined"&&(e=await Gb(t));let r=new Set;for(let a of(o=(s=t.manifest.publishConfig)==null?void 0:s.executableFiles)!=null?o:new Set)r.add(x.normalize(a));for(let a of t.manifest.bin.values())r.add(x.normalize(a));let i=Hue.default.pack();process.nextTick(async()=>{for(let a of e){let l=x.normalize(a),c=x.resolve(t.cwd,l),u=x.join("package",l),g=await K.lstatPromise(c),f={name:u,mtime:new Date(Dr.SAFE_TIME*1e3)},h=r.has(l)?493:420,p,m,y=new Promise((S,k)=>{p=S,m=k}),b=S=>{S?m(S):p()};if(g.isFile()){let S;l==="package.json"?S=Buffer.from(JSON.stringify(await jue(t),null,2)):S=await K.readFilePromise(c),i.entry(ie(N({},f),{mode:h,type:"file"}),S,b)}else g.isSymbolicLink()?i.entry(ie(N({},f),{mode:h,type:"symlink",linkname:await K.readlinkPromise(c)}),b):b(new Error(`Unsupported file type ${g.mode} for ${H.fromPortablePath(l)}`));await y}i.finalize()});let n=(0,Gue.createGzip)();return i.pipe(n),n}async function jue(t){let e=JSON.parse(JSON.stringify(t.manifest.raw));return await t.project.configuration.triggerHook(r=>r.beforeWorkspacePacking,t,e),e}async function Gb(t){var g,f,h,p,m,y,b,S;let e=t.project,r=e.configuration,i={accept:[],reject:[]};for(let k of IVe)i.reject.push(k);for(let k of EVe)i.accept.push(k);i.reject.push(r.get("rcFilename"));let n=k=>{if(k===null||!k.startsWith(`${t.cwd}/`))return;let T=x.relative(t.cwd,k),Y=x.resolve(Ke.root,T);i.reject.push(Y)};n(x.resolve(e.cwd,r.get("lockfileFilename"))),n(r.get("cacheFolder")),n(r.get("globalFolder")),n(r.get("installStatePath")),n(r.get("virtualFolder")),n(r.get("yarnPath")),await r.triggerHook(k=>k.populateYarnPaths,e,k=>{n(k)});for(let k of e.workspaces){let T=x.relative(t.cwd,k.cwd);T!==""&&!T.match(/^(\.\.)?\//)&&i.reject.push(`/${T}`)}let s={accept:[],reject:[]},o=(f=(g=t.manifest.publishConfig)==null?void 0:g.main)!=null?f:t.manifest.main,a=(p=(h=t.manifest.publishConfig)==null?void 0:h.module)!=null?p:t.manifest.module,l=(y=(m=t.manifest.publishConfig)==null?void 0:m.browser)!=null?y:t.manifest.browser,c=(S=(b=t.manifest.publishConfig)==null?void 0:b.bin)!=null?S:t.manifest.bin;o!=null&&s.accept.push(x.resolve(Ke.root,o)),a!=null&&s.accept.push(x.resolve(Ke.root,a)),typeof l=="string"&&s.accept.push(x.resolve(Ke.root,l));for(let k of c.values())s.accept.push(x.resolve(Ke.root,k));if(l instanceof Map)for(let[k,T]of l.entries())s.accept.push(x.resolve(Ke.root,k)),typeof T=="string"&&s.accept.push(x.resolve(Ke.root,T));let u=t.manifest.files!==null;if(u){s.reject.push("/*");for(let k of t.manifest.files)Yue(s.accept,k,{cwd:Ke.root})}return await yVe(t.cwd,{hasExplicitFileList:u,globalList:i,ignoreList:s})}async function yVe(t,{hasExplicitFileList:e,globalList:r,ignoreList:i}){let n=[],s=new Ra(t),o=[[Ke.root,[i]]];for(;o.length>0;){let[a,l]=o.pop(),c=await s.lstatPromise(a);if(!Jue(a,{globalList:r,ignoreLists:c.isDirectory()?null:l}))if(c.isDirectory()){let u=await s.readdirPromise(a),g=!1,f=!1;if(!e||a!==Ke.root)for(let m of u)g=g||m===".gitignore",f=f||m===".npmignore";let h=f?await que(s,a,".npmignore"):g?await que(s,a,".gitignore"):null,p=h!==null?[h].concat(l):l;Jue(a,{globalList:r,ignoreLists:l})&&(p=[...l,{accept:[],reject:["**/*"]}]);for(let m of u)o.push([x.resolve(a,m),p])}else(c.isFile()||c.isSymbolicLink())&&n.push(x.relative(Ke.root,a))}return n.sort()}async function que(t,e,r){let i={accept:[],reject:[]},n=await t.readFilePromise(x.join(e,r),"utf8");for(let s of n.split(/\n/g))Yue(i.reject,s,{cwd:e});return i}function wVe(t,{cwd:e}){let r=t[0]==="!";return r&&(t=t.slice(1)),t.match(/\.{0,1}\//)&&(t=x.resolve(e,t)),r&&(t=`!${t}`),t}function Yue(t,e,{cwd:r}){let i=e.trim();i===""||i[0]==="#"||t.push(wVe(i,{cwd:r}))}var us;(function(i){i[i.None=0]="None",i[i.Match=1]="Match",i[i.NegatedMatch=2]="NegatedMatch"})(us||(us={}));function Jue(t,{globalList:e,ignoreLists:r}){let i=jb(t,e.accept);if(i!==0)return i===2;let n=jb(t,e.reject);if(n!==0)return n===1;if(r!==null)for(let s of r){let o=jb(t,s.accept);if(o!==0)return o===2;let a=jb(t,s.reject);if(a!==0)return a===1}return!1}function jb(t,e){let r=e,i=[];for(let n=0;n{await oO(i,{report:l},async()=>{l.reportJson({base:H.fromPortablePath(i.cwd)});let c=await Gb(i);for(let u of c)l.reportInfo(null,H.fromPortablePath(u)),l.reportJson({location:H.fromPortablePath(u)});if(!this.dryRun){let u=await aO(i,c),g=K.createWriteStream(s);u.pipe(g),await new Promise(f=>{g.on("finish",f)})}}),this.dryRun||(l.reportInfo($.UNNAMED,`Package archive generated in ${Ae.pretty(e,s,Ae.Type.PATH)}`),l.reportJson({output:H.fromPortablePath(s)}))})).exitCode()}};lE.paths=[["pack"]],lE.usage=Re.Usage({description:"generate a tarball from the active workspace",details:"\n This command will turn the active workspace into a compressed archive suitable for publishing. The archive will by default be stored at the root of the workspace (`package.tgz`).\n\n If the `-o,---out` is set the archive will be created at the specified path. The `%s` and `%v` variables can be used within the path and will be respectively replaced by the package name and version.\n ",examples:[["Create an archive from the active workspace","yarn pack"],["List the files that would be made part of the workspace's archive","yarn pack --dry-run"],["Name and output the archive in a dedicated folder","yarn pack --out /artifacts/%s-%v.tgz"]]});var zue=lE;function BVe(t,{workspace:e}){let r=t.replace("%s",bVe(e)).replace("%v",QVe(e));return H.toPortablePath(r)}function bVe(t){return t.manifest.name!==null?P.slugifyIdent(t.manifest.name):"package"}function QVe(t){return t.manifest.version!==null?t.manifest.version:"unknown"}var vVe=["dependencies","devDependencies","peerDependencies"],SVe="workspace:",kVe=(t,e)=>{var i,n;e.publishConfig&&(e.publishConfig.main&&(e.main=e.publishConfig.main),e.publishConfig.browser&&(e.browser=e.publishConfig.browser),e.publishConfig.module&&(e.module=e.publishConfig.module),e.publishConfig.browser&&(e.browser=e.publishConfig.browser),e.publishConfig.exports&&(e.exports=e.publishConfig.exports),e.publishConfig.bin&&(e.bin=e.publishConfig.bin));let r=t.project;for(let s of vVe)for(let o of t.manifest.getForScope(s).values()){let a=r.tryWorkspaceByDescriptor(o),l=P.parseRange(o.range);if(l.protocol===SVe)if(a===null){if(r.tryWorkspaceByIdent(o)===null)throw new ct($.WORKSPACE_NOT_FOUND,`${P.prettyDescriptor(r.configuration,o)}: No local workspace found for this range`)}else{let c;P.areDescriptorsEqual(o,a.anchoredDescriptor)||l.selector==="*"?c=(i=a.manifest.version)!=null?i:"0.0.0":l.selector==="~"||l.selector==="^"?c=`${l.selector}${(n=a.manifest.version)!=null?n:"0.0.0"}`:c=l.selector;let u=s==="dependencies"?P.makeDescriptor(o,"unknown"):null,g=u!==null&&t.manifest.ensureDependencyMeta(u).optional?"optionalDependencies":s;e[g][P.stringifyIdent(o)]=c}}},xVe={hooks:{beforeWorkspacePacking:kVe},commands:[zue]},PVe=xVe;var ige=ge(require("crypto")),nge=ge(rge()),sge=ge(require("url"));async function zVe(t,e,{access:r,tag:i,registry:n,gitHead:s}){let o=t.project.configuration,a=t.manifest.name,l=t.manifest.version,c=P.stringifyIdent(a),u=(0,ige.createHash)("sha1").update(e).digest("hex"),g=nge.default.fromData(e).toString();typeof r=="undefined"&&(t.manifest.publishConfig&&typeof t.manifest.publishConfig.access=="string"?r=t.manifest.publishConfig.access:o.get("npmPublishAccess")!==null?r=o.get("npmPublishAccess"):a.scope?r="restricted":r="public");let f=await SA.genPackageManifest(t),h=`${c}-${l}.tgz`,p=new sge.URL(`${pa(n)}/${c}/-/${h}`);return{_id:c,_attachments:{[h]:{content_type:"application/octet-stream",data:e.toString("base64"),length:e.length}},name:c,access:r,["dist-tags"]:{[i]:l},versions:{[l]:ie(N({},f),{_id:`${c}@${l}`,name:c,version:l,gitHead:s,dist:{shasum:u,integrity:g,tarball:p.toString()}})}}}async function _Ve(t){try{let{stdout:e}=await Fr.execvp("git",["rev-parse","--revs-only","HEAD"],{cwd:t});return e.trim()===""?void 0:e.trim()}catch{return}}var fO={npmAlwaysAuth:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:ye.BOOLEAN,default:!1},npmAuthIdent:{description:"Authentication identity for the npm registry (_auth in npm and yarn v1)",type:ye.SECRET,default:null},npmAuthToken:{description:"Authentication token for the npm registry (_authToken in npm and yarn v1)",type:ye.SECRET,default:null}},oge={npmAuditRegistry:{description:"Registry to query for audit reports",type:ye.STRING,default:null},npmPublishRegistry:{description:"Registry to push packages to",type:ye.STRING,default:null},npmRegistryServer:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:ye.STRING,default:"https://registry.yarnpkg.com"}},VVe={configuration:ie(N(N({},fO),oge),{npmScopes:{description:"Settings per package scope",type:ye.MAP,valueDefinition:{description:"",type:ye.SHAPE,properties:N(N({},fO),oge)}},npmRegistries:{description:"Settings per registry",type:ye.MAP,normalizeKeys:pa,valueDefinition:{description:"",type:ye.SHAPE,properties:N({},fO)}}}),fetchers:[CT,bo],resolvers:[mT,ET,IT]},XVe=VVe;var CO={};ft(CO,{default:()=>o9e});Is();var Ia;(function(i){i.All="all",i.Production="production",i.Development="development"})(Ia||(Ia={}));var vo;(function(s){s.Info="info",s.Low="low",s.Moderate="moderate",s.High="high",s.Critical="critical"})(vo||(vo={}));var Yb=[vo.Info,vo.Low,vo.Moderate,vo.High,vo.Critical];function age(t,e){let r=[],i=new Set,n=o=>{i.has(o)||(i.add(o),r.push(o))};for(let o of e)n(o);let s=new Set;for(;r.length>0;){let o=r.shift(),a=t.storedResolutions.get(o);if(typeof a=="undefined")throw new Error("Assertion failed: Expected the resolution to have been registered");let l=t.storedPackages.get(a);if(!!l){s.add(o);for(let c of l.dependencies.values())n(c.descriptorHash)}}return s}function ZVe(t,e){return new Set([...t].filter(r=>!e.has(r)))}function $Ve(t,e,{all:r}){let i=r?t.workspaces:[e],n=i.map(f=>f.manifest),s=new Set(n.map(f=>[...f.dependencies].map(([h,p])=>h)).flat()),o=new Set(n.map(f=>[...f.devDependencies].map(([h,p])=>h)).flat()),a=i.map(f=>[...f.dependencies.values()]).flat(),l=a.filter(f=>s.has(f.identHash)).map(f=>f.descriptorHash),c=a.filter(f=>o.has(f.identHash)).map(f=>f.descriptorHash),u=age(t,l),g=age(t,c);return ZVe(g,u)}function Age(t){let e={};for(let r of t)e[P.stringifyIdent(r)]=P.parseRange(r.range).selector;return e}function lge(t){if(typeof t=="undefined")return new Set;let e=Yb.indexOf(t),r=Yb.slice(e);return new Set(r)}function e9e(t,e){let r=lge(e),i={};for(let n of r)i[n]=t[n];return i}function cge(t,e){var i;let r=e9e(t,e);for(let n of Object.keys(r))if((i=r[n])!=null?i:0>0)return!0;return!1}function uge(t,e){var s;let r={},i={children:r},n=Object.values(t.advisories);if(e!=null){let o=lge(e);n=n.filter(a=>o.has(a.severity))}for(let o of ve.sortMap(n,a=>a.module_name))r[o.module_name]={label:o.module_name,value:Ae.tuple(Ae.Type.RANGE,o.findings.map(a=>a.version).join(", ")),children:{Issue:{label:"Issue",value:Ae.tuple(Ae.Type.NO_HINT,o.title)},URL:{label:"URL",value:Ae.tuple(Ae.Type.URL,o.url)},Severity:{label:"Severity",value:Ae.tuple(Ae.Type.NO_HINT,o.severity)},["Vulnerable Versions"]:{label:"Vulnerable Versions",value:Ae.tuple(Ae.Type.RANGE,o.vulnerable_versions)},["Patched Versions"]:{label:"Patched Versions",value:Ae.tuple(Ae.Type.RANGE,o.patched_versions)},Via:{label:"Via",value:Ae.tuple(Ae.Type.NO_HINT,Array.from(new Set(o.findings.map(a=>a.paths).flat().map(a=>a.split(">")[0]))).join(", "))},Recommendation:{label:"Recommendation",value:Ae.tuple(Ae.Type.NO_HINT,(s=o.recommendation)==null?void 0:s.replace(/\n/g," "))}}};return i}function gge(t,e,{all:r,environment:i}){let n=r?t.workspaces:[e],s=[Ia.All,Ia.Production].includes(i),o=[];if(s)for(let c of n)for(let u of c.manifest.dependencies.values())o.push(u);let a=[Ia.All,Ia.Development].includes(i),l=[];if(a)for(let c of n)for(let u of c.manifest.devDependencies.values())l.push(u);return Age([...o,...l].filter(c=>P.parseRange(c.range).protocol===null))}function fge(t,e,{all:r}){var s;let i=$Ve(t,e,{all:r}),n={};for(let o of t.storedPackages.values())n[P.stringifyIdent(o)]={version:(s=o.version)!=null?s:"0.0.0",integrity:o.identHash,requires:Age(o.dependencies.values()),dev:i.has(P.convertLocatorToDescriptor(o).descriptorHash)};return n}var gE=class extends Le{constructor(){super(...arguments);this.all=W.Boolean("-A,--all",!1,{description:"Audit dependencies from all workspaces"});this.recursive=W.Boolean("-R,--recursive",!1,{description:"Audit transitive dependencies as well"});this.environment=W.String("--environment",Ia.All,{description:"Which environments to cover",validator:nn(Ia)});this.json=W.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.severity=W.String("--severity",vo.Info,{description:"Minimal severity requested for packages to be displayed",validator:nn(vo)})}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(r.cwd,this.context.cwd);await r.restoreInstallState();let n=gge(r,i,{all:this.all,environment:this.environment}),s=fge(r,i,{all:this.all});if(!this.recursive)for(let f of Object.keys(s))Object.prototype.hasOwnProperty.call(n,f)?s[f].requires={}:delete s[f];let o={requires:n,dependencies:s},a=br.getAuditRegistry(i.manifest,{configuration:e}),l,c=await gA.start({configuration:e,stdout:this.context.stdout},async()=>{l=await zt.post("/-/npm/v1/security/audits/quick",o,{authType:zt.AuthType.BEST_EFFORT,configuration:e,jsonResponse:!0,registry:a})});if(c.hasErrors())return c.exitCode();let u=cge(l.metadata.vulnerabilities,this.severity);return!this.json&&u?(As.emitTree(uge(l,this.severity),{configuration:e,json:this.json,stdout:this.context.stdout,separators:2}),1):(await Je.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async f=>{f.reportJson(l),u||f.reportInfo($.EXCEPTION,"No audit suggestions")})).exitCode()}};gE.paths=[["npm","audit"]],gE.usage=Re.Usage({description:"perform a vulnerability audit against the installed packages",details:` - This command checks for known security reports on the packages you use. The reports are by default extracted from the npm registry, and may or may not be relevant to your actual program (not all vulnerabilities affect all code paths). - - For consistency with our other commands the default is to only check the direct dependencies for the active workspace. To extend this search to all workspaces, use \`-A,--all\`. To extend this search to both direct and transitive dependencies, use \`-R,--recursive\`. - - Applying the \`--severity\` flag will limit the audit table to vulnerabilities of the corresponding severity and above. Valid values are ${Yb.map(e=>`\`${e}\``).join(", ")}. - - If the \`--json\` flag is set, Yarn will print the output exactly as received from the registry. Regardless of this flag, the process will exit with a non-zero exit code if a report is found for the selected packages. - - To understand the dependency tree requiring vulnerable packages, check the raw report with the \`--json\` flag or use \`yarn why \` to get more information as to who depends on them. - `,examples:[["Checks for known security issues with the installed packages. The output is a list of known issues.","yarn npm audit"],["Audit dependencies in all workspaces","yarn npm audit --all"],["Limit auditing to `dependencies` (excludes `devDependencies`)","yarn npm audit --environment production"],["Show audit report as valid JSON","yarn npm audit --json"],["Audit all direct and transitive dependencies","yarn npm audit --recursive"],["Output moderate (or more severe) vulnerabilities","yarn npm audit --severity moderate"]]});var hge=gE;var hO=ge(ri()),pO=ge(require("util")),fE=class extends Le{constructor(){super(...arguments);this.fields=W.String("-f,--fields",{description:"A comma-separated list of manifest fields that should be displayed"});this.json=W.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.packages=W.Rest()}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),{project:r}=await ze.find(e,this.context.cwd),i=typeof this.fields!="undefined"?new Set(["name",...this.fields.split(/\s*,\s*/)]):null,n=[],s=!1,o=await Je.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async a=>{for(let l of this.packages){let c;if(l==="."){let k=r.topLevelWorkspace;if(!k.manifest.name)throw new Pe(`Missing ${Ae.pretty(e,"name",Ae.Type.CODE)} field in ${H.fromPortablePath(x.join(k.cwd,Pt.manifest))}`);c=P.makeDescriptor(k.manifest.name,"unknown")}else c=P.parseDescriptor(l);let u=zt.getIdentUrl(c),g=dO(await zt.get(u,{configuration:e,ident:c,jsonResponse:!0,customErrorMessage:zt.customPackageError})),f=Object.keys(g.versions).sort(hO.default.compareLoose),p=g["dist-tags"].latest||f[f.length-1],m=Wt.validRange(c.range);if(m){let k=hO.default.maxSatisfying(f,m);k!==null?p=k:(a.reportWarning($.UNNAMED,`Unmet range ${P.prettyRange(e,c.range)}; falling back to the latest version`),s=!0)}else Object.prototype.hasOwnProperty.call(g["dist-tags"],c.range)?p=g["dist-tags"][c.range]:c.range!=="unknown"&&(a.reportWarning($.UNNAMED,`Unknown tag ${P.prettyRange(e,c.range)}; falling back to the latest version`),s=!0);let y=g.versions[p],b=ie(N(N({},g),y),{version:p,versions:f}),S;if(i!==null){S={};for(let k of i){let T=b[k];if(typeof T!="undefined")S[k]=T;else{a.reportWarning($.EXCEPTION,`The ${Ae.pretty(e,k,Ae.Type.CODE)} field doesn't exist inside ${P.prettyIdent(e,c)}'s information`),s=!0;continue}}}else this.json||(delete b.dist,delete b.readme,delete b.users),S=b;a.reportJson(S),this.json||n.push(S)}});pO.inspect.styles.name="cyan";for(let a of n)(a!==n[0]||s)&&this.context.stdout.write(` -`),this.context.stdout.write(`${(0,pO.inspect)(a,{depth:Infinity,colors:!0,compact:!1})} -`);return o.exitCode()}};fE.paths=[["npm","info"]],fE.usage=Re.Usage({category:"Npm-related commands",description:"show information about a package",details:"\n This command fetches information about a package from the npm registry and prints it in a tree format.\n\n The package does not have to be installed locally, but needs to have been published (in particular, local changes will be ignored even for workspaces).\n\n Append `@` to the package argument to provide information specific to the latest version that satisfies the range or to the corresponding tagged version. If the range is invalid or if there is no version satisfying the range, the command will print a warning and fall back to the latest version.\n\n If the `-f,--fields` option is set, it's a comma-separated list of fields which will be used to only display part of the package information.\n\n By default, this command won't return the `dist`, `readme`, and `users` fields, since they are often very long. To explicitly request those fields, explicitly list them with the `--fields` flag or request the output in JSON mode.\n ",examples:[["Show all available information about react (except the `dist`, `readme`, and `users` fields)","yarn npm info react"],["Show all available information about react as valid JSON (including the `dist`, `readme`, and `users` fields)","yarn npm info react --json"],["Show all available information about react@16.12.0","yarn npm info react@16.12.0"],["Show all available information about react@next","yarn npm info react@next"],["Show the description of react","yarn npm info react --fields description"],["Show all available versions of react","yarn npm info react --fields versions"],["Show the readme of react","yarn npm info react --fields readme"],["Show a few fields of react","yarn npm info react --fields homepage,repository"]]});var pge=fE;function dO(t){if(Array.isArray(t)){let e=[];for(let r of t)r=dO(r),r&&e.push(r);return e}else if(typeof t=="object"&&t!==null){let e={};for(let r of Object.keys(t)){if(r.startsWith("_"))continue;let i=dO(t[r]);i&&(e[r]=i)}return e}else return t||null}var dge=ge(em()),hE=class extends Le{constructor(){super(...arguments);this.scope=W.String("-s,--scope",{description:"Login to the registry configured for a given scope"});this.publish=W.Boolean("--publish",!1,{description:"Login to the publish registry"})}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),r=await qb({configuration:e,cwd:this.context.cwd,publish:this.publish,scope:this.scope});return(await Je.start({configuration:e,stdout:this.context.stdout},async n=>{let s=await r9e({registry:r,report:n,stdin:this.context.stdin,stdout:this.context.stdout}),o=`/-/user/org.couchdb.user:${encodeURIComponent(s.name)}`,a=await zt.put(o,s,{attemptedAs:s.name,configuration:e,registry:r,jsonResponse:!0,authType:zt.AuthType.NO_AUTH});return await t9e(r,a.token,{configuration:e,scope:this.scope}),n.reportInfo($.UNNAMED,"Successfully logged in")})).exitCode()}};hE.paths=[["npm","login"]],hE.usage=Re.Usage({category:"Npm-related commands",description:"store new login info to access the npm registry",details:"\n This command will ask you for your username, password, and 2FA One-Time-Password (when it applies). It will then modify your local configuration (in your home folder, never in the project itself) to reference the new tokens thus generated.\n\n Adding the `-s,--scope` flag will cause the authentication to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\n\n Adding the `--publish` flag will cause the authentication to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\n ",examples:[["Login to the default registry","yarn npm login"],["Login to the registry linked to the @my-scope registry","yarn npm login --scope my-scope"],["Login to the publish registry for the current package","yarn npm login --publish"]]});var Cge=hE;async function qb({scope:t,publish:e,configuration:r,cwd:i}){return t&&e?br.getScopeRegistry(t,{configuration:r,type:br.RegistryType.PUBLISH_REGISTRY}):t?br.getScopeRegistry(t,{configuration:r}):e?br.getPublishRegistry((await zf(r,i)).manifest,{configuration:r}):br.getDefaultRegistry({configuration:r})}async function t9e(t,e,{configuration:r,scope:i}){let n=o=>a=>{let l=ve.isIndexableObject(a)?a:{},c=l[o],u=ve.isIndexableObject(c)?c:{};return ie(N({},l),{[o]:ie(N({},u),{npmAuthToken:e})})},s=i?{npmScopes:n(i)}:{npmRegistries:n(t)};return await we.updateHomeConfiguration(s)}async function r9e({registry:t,report:e,stdin:r,stdout:i}){if(process.env.TEST_ENV)return{name:process.env.TEST_NPM_USER||"",password:process.env.TEST_NPM_PASSWORD||""};e.reportInfo($.UNNAMED,`Logging in to ${t}`);let n=!1;t.match(/^https:\/\/npm\.pkg\.github\.com(\/|$)/)&&(e.reportInfo($.UNNAMED,"You seem to be using the GitHub Package Registry. Tokens must be generated with the 'repo', 'write:packages', and 'read:packages' permissions."),n=!0),e.reportSeparator();let{username:s,password:o}=await(0,dge.prompt)([{type:"input",name:"username",message:"Username:",required:!0,onCancel:()=>process.exit(130),stdin:r,stdout:i},{type:"password",name:"password",message:n?"Token:":"Password:",required:!0,onCancel:()=>process.exit(130),stdin:r,stdout:i}]);return e.reportSeparator(),{name:s,password:o}}var bh=new Set(["npmAuthIdent","npmAuthToken"]),pE=class extends Le{constructor(){super(...arguments);this.scope=W.String("-s,--scope",{description:"Logout of the registry configured for a given scope"});this.publish=W.Boolean("--publish",!1,{description:"Logout of the publish registry"});this.all=W.Boolean("-A,--all",!1,{description:"Logout of all registries"})}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),r=async()=>{var l;let n=await qb({configuration:e,cwd:this.context.cwd,publish:this.publish,scope:this.scope}),s=await we.find(this.context.cwd,this.context.plugins),o=P.makeIdent((l=this.scope)!=null?l:null,"pkg");return!br.getAuthConfiguration(n,{configuration:s,ident:o}).get("npmAuthToken")};return(await Je.start({configuration:e,stdout:this.context.stdout},async n=>{if(this.all&&(await i9e(),n.reportInfo($.UNNAMED,"Successfully logged out from everything")),this.scope){await mge("npmScopes",this.scope),await r()?n.reportInfo($.UNNAMED,`Successfully logged out from ${this.scope}`):n.reportWarning($.UNNAMED,"Scope authentication settings removed, but some other ones settings still apply to it");return}let s=await qb({configuration:e,cwd:this.context.cwd,publish:this.publish});await mge("npmRegistries",s),await r()?n.reportInfo($.UNNAMED,`Successfully logged out from ${s}`):n.reportWarning($.UNNAMED,"Registry authentication settings removed, but some other ones settings still apply to it")})).exitCode()}};pE.paths=[["npm","logout"]],pE.usage=Re.Usage({category:"Npm-related commands",description:"logout of the npm registry",details:"\n This command will log you out by modifying your local configuration (in your home folder, never in the project itself) to delete all credentials linked to a registry.\n\n Adding the `-s,--scope` flag will cause the deletion to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\n\n Adding the `--publish` flag will cause the deletion to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\n\n Adding the `-A,--all` flag will cause the deletion to be done against all registries and scopes.\n ",examples:[["Logout of the default registry","yarn npm logout"],["Logout of the @my-scope scope","yarn npm logout --scope my-scope"],["Logout of the publish registry for the current package","yarn npm logout --publish"],["Logout of all registries","yarn npm logout --all"]]});var Ege=pE;function n9e(t,e){let r=t[e];if(!ve.isIndexableObject(r))return!1;let i=new Set(Object.keys(r));if([...bh].every(s=>!i.has(s)))return!1;for(let s of bh)i.delete(s);if(i.size===0)return t[e]=void 0,!0;let n=N({},r);for(let s of bh)delete n[s];return t[e]=n,!0}async function i9e(){let t=e=>{let r=!1,i=ve.isIndexableObject(e)?N({},e):{};i.npmAuthToken&&(delete i.npmAuthToken,r=!0);for(let n of Object.keys(i))n9e(i,n)&&(r=!0);if(Object.keys(i).length!==0)return r?i:e};return await we.updateHomeConfiguration({npmRegistries:t,npmScopes:t})}async function mge(t,e){return await we.updateHomeConfiguration({[t]:r=>{let i=ve.isIndexableObject(r)?r:{};if(!Object.prototype.hasOwnProperty.call(i,e))return r;let n=i[e],s=ve.isIndexableObject(n)?n:{},o=new Set(Object.keys(s));if([...bh].every(l=>!o.has(l)))return r;for(let l of bh)o.delete(l);if(o.size===0)return Object.keys(i).length===1?void 0:ie(N({},i),{[e]:void 0});let a={};for(let l of bh)a[l]=void 0;return ie(N({},i),{[e]:N(N({},s),a)})}})}var dE=class extends Le{constructor(){super(...arguments);this.access=W.String("--access",{description:"The access for the published package (public or restricted)"});this.tag=W.String("--tag","latest",{description:"The tag on the registry that the package should be attached to"});this.tolerateRepublish=W.Boolean("--tolerate-republish",!1,{description:"Warn and exit when republishing an already existing version of a package"});this.otp=W.String("--otp",{description:"The OTP token to use with the command"})}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(r.cwd,this.context.cwd);if(i.manifest.private)throw new Pe("Private workspaces cannot be published");if(i.manifest.name===null||i.manifest.version===null)throw new Pe("Workspaces must have valid names and versions to be published on an external registry");await r.restoreInstallState();let n=i.manifest.name,s=i.manifest.version,o=br.getPublishRegistry(i.manifest,{configuration:e});return(await Je.start({configuration:e,stdout:this.context.stdout},async l=>{var c,u;if(this.tolerateRepublish)try{let g=await zt.get(zt.getIdentUrl(n),{configuration:e,registry:o,ident:n,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(g,"versions"))throw new ct($.REMOTE_INVALID,'Registry returned invalid data for - missing "versions" field');if(Object.prototype.hasOwnProperty.call(g.versions,s)){l.reportWarning($.UNNAMED,`Registry already knows about version ${s}; skipping.`);return}}catch(g){if(((u=(c=g.originalError)==null?void 0:c.response)==null?void 0:u.statusCode)!==404)throw g}await Zt.maybeExecuteWorkspaceLifecycleScript(i,"prepublish",{report:l}),await SA.prepareForPack(i,{report:l},async()=>{let g=await SA.genPackList(i);for(let y of g)l.reportInfo(null,y);let f=await SA.genPackStream(i,g),h=await ve.bufferStream(f),p=await Bh.getGitHead(i.cwd),m=await Bh.makePublishBody(i,h,{access:this.access,tag:this.tag,registry:o,gitHead:p});await zt.put(zt.getIdentUrl(n),m,{configuration:e,registry:o,ident:n,otp:this.otp,jsonResponse:!0})}),l.reportInfo($.UNNAMED,"Package archive published")})).exitCode()}};dE.paths=[["npm","publish"]],dE.usage=Re.Usage({category:"Npm-related commands",description:"publish the active workspace to the npm registry",details:'\n This command will pack the active workspace into a fresh archive and upload it to the npm registry.\n\n The package will by default be attached to the `latest` tag on the registry, but this behavior can be overriden by using the `--tag` option.\n\n Note that for legacy reasons scoped packages are by default published with an access set to `restricted` (aka "private packages"). This requires you to register for a paid npm plan. In case you simply wish to publish a public scoped package to the registry (for free), just add the `--access public` flag. This behavior can be enabled by default through the `npmPublishAccess` settings.\n ',examples:[["Publish the active workspace","yarn npm publish"]]});var Ige=dE;var wge=ge(ri());var CE=class extends Le{constructor(){super(...arguments);this.json=W.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=W.String({required:!1})}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await ze.find(e,this.context.cwd),n;if(typeof this.package!="undefined")n=P.parseIdent(this.package);else{if(!i)throw new ht(r.cwd,this.context.cwd);if(!i.manifest.name)throw new Pe(`Missing 'name' field in ${H.fromPortablePath(x.join(i.cwd,Pt.manifest))}`);n=i.manifest.name}let s=await mE(n,e),a={children:ve.sortMap(Object.entries(s),([l])=>l).map(([l,c])=>({value:Ae.tuple(Ae.Type.RESOLUTION,{descriptor:P.makeDescriptor(n,l),locator:P.makeLocator(n,c)})}))};return As.emitTree(a,{configuration:e,json:this.json,stdout:this.context.stdout})}};CE.paths=[["npm","tag","list"]],CE.usage=Re.Usage({category:"Npm-related commands",description:"list all dist-tags of a package",details:` - This command will list all tags of a package from the npm registry. - - If the package is not specified, Yarn will default to the current workspace. - `,examples:[["List all tags of package `my-pkg`","yarn npm tag list my-pkg"]]});var yge=CE;async function mE(t,e){let r=`/-/package${zt.getIdentUrl(t)}/dist-tags`;return zt.get(r,{configuration:e,ident:t,jsonResponse:!0,customErrorMessage:zt.customPackageError})}var EE=class extends Le{constructor(){super(...arguments);this.package=W.String();this.tag=W.String()}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(r.cwd,this.context.cwd);let n=P.parseDescriptor(this.package,!0),s=n.range;if(!wge.default.valid(s))throw new Pe(`The range ${Ae.pretty(e,n.range,Ae.Type.RANGE)} must be a valid semver version`);let o=br.getPublishRegistry(i.manifest,{configuration:e}),a=Ae.pretty(e,n,Ae.Type.IDENT),l=Ae.pretty(e,s,Ae.Type.RANGE),c=Ae.pretty(e,this.tag,Ae.Type.CODE);return(await Je.start({configuration:e,stdout:this.context.stdout},async g=>{let f=await mE(n,e);Object.prototype.hasOwnProperty.call(f,this.tag)&&f[this.tag]===s&&g.reportWarning($.UNNAMED,`Tag ${c} is already set to version ${l}`);let h=`/-/package${zt.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await zt.put(h,s,{configuration:e,registry:o,ident:n,jsonRequest:!0,jsonResponse:!0}),g.reportInfo($.UNNAMED,`Tag ${c} added to version ${l} of package ${a}`)})).exitCode()}};EE.paths=[["npm","tag","add"]],EE.usage=Re.Usage({category:"Npm-related commands",description:"add a tag for a specific version of a package",details:` - This command will add a tag to the npm registry for a specific version of a package. If the tag already exists, it will be overwritten. - `,examples:[["Add a `beta` tag for version `2.3.4-beta.4` of package `my-pkg`","yarn npm tag add my-pkg@2.3.4-beta.4 beta"]]});var Bge=EE;var IE=class extends Le{constructor(){super(...arguments);this.package=W.String();this.tag=W.String()}async execute(){if(this.tag==="latest")throw new Pe("The 'latest' tag cannot be removed.");let e=await we.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(r.cwd,this.context.cwd);let n=P.parseIdent(this.package),s=br.getPublishRegistry(i.manifest,{configuration:e}),o=Ae.pretty(e,this.tag,Ae.Type.CODE),a=Ae.pretty(e,n,Ae.Type.IDENT),l=await mE(n,e);if(!Object.prototype.hasOwnProperty.call(l,this.tag))throw new Pe(`${o} is not a tag of package ${a}`);return(await Je.start({configuration:e,stdout:this.context.stdout},async u=>{let g=`/-/package${zt.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await zt.del(g,{configuration:e,registry:s,ident:n,jsonResponse:!0}),u.reportInfo($.UNNAMED,`Tag ${o} removed from package ${a}`)})).exitCode()}};IE.paths=[["npm","tag","remove"]],IE.usage=Re.Usage({category:"Npm-related commands",description:"remove a tag from a package",details:` - This command will remove a tag from a package from the npm registry. - `,examples:[["Remove the `beta` tag from package `my-pkg`","yarn npm tag remove my-pkg beta"]]});var bge=IE;var yE=class extends Le{constructor(){super(...arguments);this.scope=W.String("-s,--scope",{description:"Print username for the registry configured for a given scope"});this.publish=W.Boolean("--publish",!1,{description:"Print username for the publish registry"})}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),r;return this.scope&&this.publish?r=br.getScopeRegistry(this.scope,{configuration:e,type:br.RegistryType.PUBLISH_REGISTRY}):this.scope?r=br.getScopeRegistry(this.scope,{configuration:e}):this.publish?r=br.getPublishRegistry((await zf(e,this.context.cwd)).manifest,{configuration:e}):r=br.getDefaultRegistry({configuration:e}),(await Je.start({configuration:e,stdout:this.context.stdout},async n=>{var o,a;let s;try{s=await zt.get("/-/whoami",{configuration:e,registry:r,authType:zt.AuthType.ALWAYS_AUTH,jsonResponse:!0,ident:this.scope?P.makeIdent(this.scope,""):void 0})}catch(l){if(((o=l.response)==null?void 0:o.statusCode)===401||((a=l.response)==null?void 0:a.statusCode)===403){n.reportError($.AUTHENTICATION_INVALID,"Authentication failed - your credentials may have expired");return}else throw l}n.reportInfo($.UNNAMED,s.username)})).exitCode()}};yE.paths=[["npm","whoami"]],yE.usage=Re.Usage({category:"Npm-related commands",description:"display the name of the authenticated user",details:"\n Print the username associated with the current authentication settings to the standard output.\n\n When using `-s,--scope`, the username printed will be the one that matches the authentication settings of the registry associated with the given scope (those settings can be overriden using the `npmRegistries` map, and the registry associated with the scope is configured via the `npmScopes` map).\n\n When using `--publish`, the registry we'll select will by default be the one used when publishing packages (`publishConfig.registry` or `npmPublishRegistry` if available, otherwise we'll fallback to the regular `npmRegistryServer`).\n ",examples:[["Print username for the default registry","yarn npm whoami"],["Print username for the registry on a given scope","yarn npm whoami --scope company"]]});var Qge=yE;var s9e={configuration:{npmPublishAccess:{description:"Default access of the published packages",type:ye.STRING,default:null}},commands:[hge,pge,Cge,Ege,Ige,Bge,yge,bge,Qge]},o9e=s9e;var QO={};ft(QO,{default:()=>w9e,patchUtils:()=>mO});var mO={};ft(mO,{applyPatchFile:()=>zb,diffFolders:()=>wO,extractPackageToDisk:()=>yO,extractPatchFlags:()=>Fge,isParentRequired:()=>IO,loadPatchFiles:()=>QE,makeDescriptor:()=>E9e,makeLocator:()=>EO,parseDescriptor:()=>BE,parseLocator:()=>bE,parsePatchFile:()=>Wb});var wE=class extends Error{constructor(e,r){super(`Cannot apply hunk #${e+1}`);this.hunk=r}};var a9e=/^@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))? @@.*/;function Qh(t){return x.relative(Ke.root,x.resolve(Ke.root,H.toPortablePath(t)))}function A9e(t){let e=t.trim().match(a9e);if(!e)throw new Error(`Bad header line: '${t}'`);return{original:{start:Math.max(Number(e[1]),1),length:Number(e[3]||1)},patched:{start:Math.max(Number(e[4]),1),length:Number(e[6]||1)}}}var l9e=420,c9e=493,Zr;(function(i){i.Context="context",i.Insertion="insertion",i.Deletion="deletion"})(Zr||(Zr={}));var vge=()=>({semverExclusivity:null,diffLineFromPath:null,diffLineToPath:null,oldMode:null,newMode:null,deletedFileMode:null,newFileMode:null,renameFrom:null,renameTo:null,beforeHash:null,afterHash:null,fromPath:null,toPath:null,hunks:null}),u9e=t=>({header:A9e(t),parts:[]}),g9e={["@"]:"header",["-"]:Zr.Deletion,["+"]:Zr.Insertion,[" "]:Zr.Context,["\\"]:"pragma",undefined:Zr.Context};function h9e(t){let e=[],r=vge(),i="parsing header",n=null,s=null;function o(){n&&(s&&(n.parts.push(s),s=null),r.hunks.push(n),n=null)}function a(){o(),e.push(r),r=vge()}for(let l=0;l0?"patch":"mode change",S=null;switch(b){case"rename":{if(!u||!g)throw new Error("Bad parser state: rename from & to not given");e.push({type:"rename",semverExclusivity:i,fromPath:Qh(u),toPath:Qh(g)}),S=g}break;case"file deletion":{let k=n||p;if(!k)throw new Error("Bad parse state: no path given for file deletion");e.push({type:"file deletion",semverExclusivity:i,hunk:y&&y[0]||null,path:Qh(k),mode:Jb(l),hash:f})}break;case"file creation":{let k=s||m;if(!k)throw new Error("Bad parse state: no path given for file creation");e.push({type:"file creation",semverExclusivity:i,hunk:y&&y[0]||null,path:Qh(k),mode:Jb(c),hash:h})}break;case"patch":case"mode change":S=m||s;break;default:ve.assertNever(b);break}S&&o&&a&&o!==a&&e.push({type:"mode change",semverExclusivity:i,path:Qh(S),oldMode:Jb(o),newMode:Jb(a)}),S&&y&&y.length&&e.push({type:"patch",semverExclusivity:i,path:Qh(S),hunks:y,beforeHash:f,afterHash:h})}if(e.length===0)throw new Error("Unable to parse patch file: No changes found. Make sure the patch is a valid UTF8 encoded string");return e}function Jb(t){let e=parseInt(t,8)&511;if(e!==l9e&&e!==c9e)throw new Error(`Unexpected file mode string: ${t}`);return e}function Wb(t){let e=t.split(/\n/g);return e[e.length-1]===""&&e.pop(),p9e(h9e(e))}function f9e(t){let e=0,r=0;for(let{type:i,lines:n}of t.parts)switch(i){case Zr.Context:r+=n.length,e+=n.length;break;case Zr.Deletion:e+=n.length;break;case Zr.Insertion:r+=n.length;break;default:ve.assertNever(i);break}if(e!==t.header.original.length||r!==t.header.patched.length){let i=n=>n<0?n:`+${n}`;throw new Error(`hunk header integrity check failed (expected @@ ${i(t.header.original.length)} ${i(t.header.patched.length)} @@, got @@ ${i(e)} ${i(r)} @@)`)}}async function vh(t,e,r){let i=await t.lstatPromise(e),n=await r();if(typeof n!="undefined"&&(e=n),t.lutimesPromise)await t.lutimesPromise(e,i.atime,i.mtime);else if(!i.isSymbolicLink())await t.utimesPromise(e,i.atime,i.mtime);else throw new Error("Cannot preserve the time values of a symlink")}async function zb(t,{baseFs:e=new ar,dryRun:r=!1,version:i=null}={}){for(let n of t)if(!(n.semverExclusivity!==null&&i!==null&&!Wt.satisfiesWithPrereleases(i,n.semverExclusivity)))switch(n.type){case"file deletion":if(r){if(!e.existsSync(n.path))throw new Error(`Trying to delete a file that doesn't exist: ${n.path}`)}else await vh(e,x.dirname(n.path),async()=>{await e.unlinkPromise(n.path)});break;case"rename":if(r){if(!e.existsSync(n.fromPath))throw new Error(`Trying to move a file that doesn't exist: ${n.fromPath}`)}else await vh(e,x.dirname(n.fromPath),async()=>{await vh(e,x.dirname(n.toPath),async()=>{await vh(e,n.fromPath,async()=>(await e.movePromise(n.fromPath,n.toPath),n.toPath))})});break;case"file creation":if(r){if(e.existsSync(n.path))throw new Error(`Trying to create a file that already exists: ${n.path}`)}else{let s=n.hunk?n.hunk.parts[0].lines.join(` -`)+(n.hunk.parts[0].noNewlineAtEndOfFile?"":` -`):"";await e.mkdirpPromise(x.dirname(n.path),{chmod:493,utimes:[Dr.SAFE_TIME,Dr.SAFE_TIME]}),await e.writeFilePromise(n.path,s,{mode:n.mode}),await e.utimesPromise(n.path,Dr.SAFE_TIME,Dr.SAFE_TIME)}break;case"patch":await vh(e,n.path,async()=>{await d9e(n,{baseFs:e,dryRun:r})});break;case"mode change":{let o=(await e.statPromise(n.path)).mode;if(Sge(n.newMode)!==Sge(o))continue;await vh(e,n.path,async()=>{await e.chmodPromise(n.path,n.newMode)})}break;default:ve.assertNever(n);break}}function Sge(t){return(t&64)>0}function kge(t){return t.replace(/\s+$/,"")}function C9e(t,e){return kge(t)===kge(e)}async function d9e({hunks:t,path:e},{baseFs:r,dryRun:i=!1}){let n=await r.statSync(e).mode,o=(await r.readFileSync(e,"utf8")).split(/\n/),a=[],l=0,c=0;for(let g of t){let f=Math.max(c,g.header.patched.start+l),h=Math.max(0,f-c),p=Math.max(0,o.length-f-g.header.original.length),m=Math.max(h,p),y=0,b=0,S=null;for(;y<=m;){if(y<=h&&(b=f-y,S=xge(g,o,b),S!==null)){y=-y;break}if(y<=p&&(b=f+y,S=xge(g,o,b),S!==null))break;y+=1}if(S===null)throw new wE(t.indexOf(g),g);a.push(S),l+=y,c=b+g.header.original.length}if(i)return;let u=0;for(let g of a)for(let f of g)switch(f.type){case"splice":{let h=f.index+u;o.splice(h,f.numToDelete,...f.linesToInsert),u+=f.linesToInsert.length-f.numToDelete}break;case"pop":o.pop();break;case"push":o.push(f.line);break;default:ve.assertNever(f);break}await r.writeFilePromise(e,o.join(` -`),{mode:n})}function xge(t,e,r){let i=[];for(let n of t.parts)switch(n.type){case Zr.Context:case Zr.Deletion:{for(let s of n.lines){let o=e[r];if(o==null||!C9e(o,s))return null;r+=1}n.type===Zr.Deletion&&(i.push({type:"splice",index:r-n.lines.length,numToDelete:n.lines.length,linesToInsert:[]}),n.noNewlineAtEndOfFile&&i.push({type:"push",line:""}))}break;case Zr.Insertion:i.push({type:"splice",index:r,numToDelete:0,linesToInsert:n.lines}),n.noNewlineAtEndOfFile&&i.push({type:"pop"});break;default:ve.assertNever(n.type);break}return i}var m9e=/^builtin<([^>]+)>$/;function Pge(t,e){let{source:r,selector:i,params:n}=P.parseRange(t);if(r===null)throw new Error("Patch locators must explicitly define their source");let s=i?i.split(/&/).map(c=>H.toPortablePath(c)):[],o=n&&typeof n.locator=="string"?P.parseLocator(n.locator):null,a=n&&typeof n.version=="string"?n.version:null,l=e(r);return{parentLocator:o,sourceItem:l,patchPaths:s,sourceVersion:a}}function BE(t){let i=Pge(t.range,P.parseDescriptor),{sourceItem:e}=i,r=Tr(i,["sourceItem"]);return ie(N({},r),{sourceDescriptor:e})}function bE(t){let i=Pge(t.reference,P.parseLocator),{sourceItem:e}=i,r=Tr(i,["sourceItem"]);return ie(N({},r),{sourceLocator:e})}function Dge({parentLocator:t,sourceItem:e,patchPaths:r,sourceVersion:i,patchHash:n},s){let o=t!==null?{locator:P.stringifyLocator(t)}:{},a=typeof i!="undefined"?{version:i}:{},l=typeof n!="undefined"?{hash:n}:{};return P.makeRange({protocol:"patch:",source:s(e),selector:r.join("&"),params:N(N(N({},a),l),o)})}function E9e(t,{parentLocator:e,sourceDescriptor:r,patchPaths:i}){return P.makeLocator(t,Dge({parentLocator:e,sourceItem:r,patchPaths:i},P.stringifyDescriptor))}function EO(t,{parentLocator:e,sourcePackage:r,patchPaths:i,patchHash:n}){return P.makeLocator(t,Dge({parentLocator:e,sourceItem:r,sourceVersion:r.version,patchPaths:i,patchHash:n},P.stringifyLocator))}function Rge({onAbsolute:t,onRelative:e,onBuiltin:r},i){i.startsWith("~")&&(i=i.slice(1));let s=i.match(m9e);return s!==null?r(s[1]):x.isAbsolute(i)?t(i):e(i)}function Fge(t){let e=t.startsWith("~");return e&&(t=t.slice(1)),{optional:e}}function IO(t){return Rge({onAbsolute:()=>!1,onRelative:()=>!0,onBuiltin:()=>!1},t)}async function QE(t,e,r){let i=t!==null?await r.fetcher.fetch(t,r):null,n=i&&i.localPath?{packageFs:new _t(Ke.root),prefixPath:x.relative(Ke.root,i.localPath)}:i;i&&i!==n&&i.releaseFs&&i.releaseFs();let s=await ve.releaseAfterUseAsync(async()=>await Promise.all(e.map(async o=>{let a=Fge(o),l=await Rge({onAbsolute:async()=>await K.readFilePromise(o,"utf8"),onRelative:async()=>{if(n===null)throw new Error("Assertion failed: The parent locator should have been fetched");return await n.packageFs.readFilePromise(x.join(n.prefixPath,o),"utf8")},onBuiltin:async c=>await r.project.configuration.firstHook(u=>u.getBuiltinPatch,r.project,c)},o);return ie(N({},a),{source:l})})));for(let o of s)typeof o.source=="string"&&(o.source=o.source.replace(/\r\n?/g,` -`));return s}async function yO(t,{cache:e,project:r}){let i=r.storedPackages.get(t.locatorHash);if(typeof i=="undefined")throw new Error("Assertion failed: Expected the package to be registered");let n=r.storedChecksums,s=new pi,o=r.configuration.makeFetcher(),a=await o.fetch(t,{cache:e,project:r,fetcher:o,checksums:n,report:s}),l=await K.mktempPromise(),c=x.join(l,"source"),u=x.join(l,"user"),g=x.join(l,".yarn-patch.json");return await Promise.all([K.copyPromise(c,a.prefixPath,{baseFs:a.packageFs}),K.copyPromise(u,a.prefixPath,{baseFs:a.packageFs}),K.writeJsonPromise(g,{locator:P.stringifyLocator(t),version:i.version})]),K.detachTemp(l),u}async function wO(t,e){let r=H.fromPortablePath(t).replace(/\\/g,"/"),i=H.fromPortablePath(e).replace(/\\/g,"/"),{stdout:n,stderr:s}=await Fr.execvp("git",["-c","core.safecrlf=false","diff","--src-prefix=a/","--dst-prefix=b/","--ignore-cr-at-eol","--full-index","--no-index","--text",r,i],{cwd:H.toPortablePath(process.cwd()),env:ie(N({},process.env),{GIT_CONFIG_NOSYSTEM:"1",HOME:"",XDG_CONFIG_HOME:"",USERPROFILE:""})});if(s.length>0)throw new Error(`Unable to diff directories. Make sure you have a recent version of 'git' available in PATH. -The following error was reported by 'git': -${s}`);let o=r.startsWith("/")?a=>a.slice(1):a=>a;return n.replace(new RegExp(`(a|b)(${ve.escapeRegExp(`/${o(r)}/`)})`,"g"),"$1/").replace(new RegExp(`(a|b)${ve.escapeRegExp(`/${o(i)}/`)}`,"g"),"$1/").replace(new RegExp(ve.escapeRegExp(`${r}/`),"g"),"").replace(new RegExp(ve.escapeRegExp(`${i}/`),"g"),"")}function Nge(t,{configuration:e,report:r}){for(let i of t.parts)for(let n of i.lines)switch(i.type){case Zr.Context:r.reportInfo(null,` ${Ae.pretty(e,n,"grey")}`);break;case Zr.Deletion:r.reportError($.FROZEN_LOCKFILE_EXCEPTION,`- ${Ae.pretty(e,n,Ae.Type.REMOVED)}`);break;case Zr.Insertion:r.reportError($.FROZEN_LOCKFILE_EXCEPTION,`+ ${Ae.pretty(e,n,Ae.Type.ADDED)}`);break;default:ve.assertNever(i.type)}}var BO=class{supports(e,r){return!!e.reference.startsWith("patch:")}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,N({onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${P.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.patchPackage(e,r),skipIntegrityCheck:r.skipIntegrityCheck},r.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:o}}async patchPackage(e,r){let{parentLocator:i,sourceLocator:n,sourceVersion:s,patchPaths:o}=bE(e),a=await QE(i,o,r),l=await K.mktempPromise(),c=x.join(l,"current.zip"),u=await r.fetcher.fetch(n,r),g=P.getIdentVendorPath(e),f=await fn(),h=new Ai(c,{libzip:f,create:!0,level:r.project.configuration.get("compressionLevel")});await ve.releaseAfterUseAsync(async()=>{await h.copyPromise(g,u.prefixPath,{baseFs:u.packageFs,stableSort:!0})},u.releaseFs),h.saveAndClose();for(let{source:p,optional:m}of a){if(p===null)continue;let y=new Ai(c,{libzip:f,level:r.project.configuration.get("compressionLevel")}),b=new _t(x.resolve(Ke.root,g),{baseFs:y});try{await zb(Wb(p),{baseFs:b,version:s})}catch(S){if(!(S instanceof wE))throw S;let k=r.project.configuration.get("enableInlineHunks"),T=!k&&!m?" (set enableInlineHunks for details)":"",Y=`${P.prettyLocator(r.project.configuration,e)}: ${S.message}${T}`,j=Z=>{!k||Nge(S.hunk,{configuration:r.project.configuration,report:Z})};if(y.discardAndClose(),m){r.report.reportWarningOnce($.PATCH_HUNK_FAILED,Y,{reportExtra:j});continue}else throw new ct($.PATCH_HUNK_FAILED,Y,j)}y.saveAndClose()}return new Ai(c,{libzip:f,level:r.project.configuration.get("compressionLevel")})}};var I9e=3,bO=class{supportsDescriptor(e,r){return!!e.range.startsWith("patch:")}supportsLocator(e,r){return!!e.reference.startsWith("patch:")}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,i){let{patchPaths:n}=BE(e);return n.every(s=>!IO(s))?e:P.bindDescriptor(e,{locator:P.stringifyLocator(r)})}getResolutionDependencies(e,r){let{sourceDescriptor:i}=BE(e);return[i]}async getCandidates(e,r,i){if(!i.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{parentLocator:n,sourceDescriptor:s,patchPaths:o}=BE(e),a=await QE(n,o,i.fetchOptions),l=r.get(s.descriptorHash);if(typeof l=="undefined")throw new Error("Assertion failed: The dependency should have been resolved");let c=Dn.makeHash(`${I9e}`,...a.map(u=>JSON.stringify(u))).slice(0,6);return[EO(e,{parentLocator:n,sourcePackage:l,patchPaths:o,patchHash:c})]}async getSatisfying(e,r,i){return null}async resolve(e,r){let{sourceLocator:i}=bE(e),n=await r.resolver.resolve(i,r);return N(N({},n),e)}};var vE=class extends Le{constructor(){super(...arguments);this.save=W.Boolean("-s,--save",!1,{description:"Add the patch to your resolution entries"});this.patchFolder=W.String()}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(r.cwd,this.context.cwd);await r.restoreInstallState();let n=x.resolve(this.context.cwd,H.toPortablePath(this.patchFolder)),s=x.join(n,"../source"),o=x.join(n,"../.yarn-patch.json");if(!K.existsSync(s))throw new Pe("The argument folder didn't get created by 'yarn patch'");let a=await wO(s,n),l=await K.readJsonPromise(o),c=P.parseLocator(l.locator,!0);if(!r.storedPackages.has(c.locatorHash))throw new Pe("No package found in the project for the given locator");if(!this.save){this.context.stdout.write(a);return}let u=e.get("patchFolder"),g=x.join(u,`${P.slugifyLocator(c)}.patch`);await K.mkdirPromise(u,{recursive:!0}),await K.writeFilePromise(g,a);let f=x.relative(r.cwd,g);r.topLevelWorkspace.manifest.resolutions.push({pattern:{descriptor:{fullName:P.stringifyIdent(c),description:l.version}},reference:`patch:${P.stringifyLocator(c)}#${f}`}),await r.persist()}};vE.paths=[["patch-commit"]],vE.usage=Re.Usage({description:"generate a patch out of a directory",details:"\n By default, this will print a patchfile on stdout based on the diff between the folder passed in and the original version of the package. Such file is suitable for consumption with the `patch:` protocol.\n\n With the `-s,--save` option set, the patchfile won't be printed on stdout anymore and will instead be stored within a local file (by default kept within `.yarn/patches`, but configurable via the `patchFolder` setting). A `resolutions` entry will also be added to your top-level manifest, referencing the patched package via the `patch:` protocol.\n\n Note that only folders generated by `yarn patch` are accepted as valid input for `yarn patch-commit`.\n "});var Lge=vE;var SE=class extends Le{constructor(){super(...arguments);this.json=W.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=W.String()}async execute(){let e=await we.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(r.cwd,this.context.cwd);await r.restoreInstallState();let s=P.parseLocator(this.package);if(s.reference==="unknown"){let o=ve.mapAndFilter([...r.storedPackages.values()],a=>a.identHash!==s.identHash?ve.mapAndFilter.skip:P.isVirtualLocator(a)?ve.mapAndFilter.skip:a);if(o.length===0)throw new Pe("No package found in the project for the given locator");if(o.length>1)throw new Pe(`Multiple candidate packages found; explicitly choose one of them (use \`yarn why \` to get more information as to who depends on them): -${o.map(a=>` -- ${P.prettyLocator(e,a)}`).join("")}`);s=o[0]}if(!r.storedPackages.has(s.locatorHash))throw new Pe("No package found in the project for the given locator");await Je.start({configuration:e,json:this.json,stdout:this.context.stdout},async o=>{let a=await yO(s,{cache:n,project:r});o.reportJson({locator:P.stringifyLocator(s),path:H.fromPortablePath(a)}),o.reportInfo($.UNNAMED,`Package ${P.prettyLocator(e,s)} got extracted with success!`),o.reportInfo($.UNNAMED,`You can now edit the following folder: ${Ae.pretty(e,H.fromPortablePath(a),"magenta")}`),o.reportInfo($.UNNAMED,`Once you are done run ${Ae.pretty(e,`yarn patch-commit -s ${process.platform==="win32"?'"':""}${H.fromPortablePath(a)}${process.platform==="win32"?'"':""}`,"cyan")} and Yarn will store a patchfile based on your changes.`)})}};SE.paths=[["patch"]],SE.usage=Re.Usage({description:"prepare a package for patching",details:"\n This command will cause a package to be extracted in a temporary directory intended to be editable at will.\n \n Once you're done with your changes, run `yarn patch-commit -s ` (with `` being the temporary directory you received) to generate a patchfile and register it into your top-level manifest via the `patch:` protocol. Run `yarn patch-commit -h` for more details.\n "});var Tge=SE;var y9e={configuration:{enableInlineHunks:{description:"If true, the installs will print unmatched patch hunks",type:ye.BOOLEAN,default:!1},patchFolder:{description:"Folder where the patch files must be written",type:ye.ABSOLUTE_PATH,default:"./.yarn/patches"}},commands:[Lge,Tge],fetchers:[BO],resolvers:[bO]},w9e=y9e;var xO={};ft(xO,{default:()=>Q9e});var vO=class{supportsPackage(e,r){return this.isEnabled(r)}async findPackageLocation(e,r){if(!this.isEnabled(r))throw new Error("Assertion failed: Expected the pnpm linker to be enabled");let i=SO(),n=r.project.installersCustomData.get(i);if(!n)throw new Pe(`The project in ${Ae.pretty(r.project.configuration,`${r.project.cwd}/package.json`,Ae.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let s=n.pathByLocator.get(e.locatorHash);if(typeof s=="undefined")throw new Pe(`Couldn't find ${P.prettyLocator(r.project.configuration,e)} in the currently installed pnpm map - running an install might help`);return s}async findPackageLocator(e,r){if(!this.isEnabled(r))return null;let i=SO(),n=r.project.installersCustomData.get(i);if(!n)throw new Pe(`The project in ${Ae.pretty(r.project.configuration,`${r.project.cwd}/package.json`,Ae.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let s=e.match(/(^.*\/node_modules\/(@[^/]*\/)?[^/]+)(\/.*$)/);if(s){let l=n.locatorByPath.get(s[1]);if(l)return l}let o=e,a=e;do{a=o,o=x.dirname(a);let l=n.locatorByPath.get(a);if(l)return l}while(o!==a);return null}makeInstaller(e){return new Oge(e)}isEnabled(e){return e.project.configuration.get("nodeLinker")==="pnpm"}},Oge=class{constructor(e){this.opts=e;this.asyncActions=new ve.AsyncActions(10);this.customData={pathByLocator:new Map,locatorByPath:new Map}}getCustomDataKey(){return SO()}attachCustomData(e){}async installPackage(e,r,i){switch(e.linkType){case Qt.SOFT:return this.installPackageSoft(e,r,i);case Qt.HARD:return this.installPackageHard(e,r,i)}throw new Error("Assertion failed: Unsupported package link type")}async installPackageSoft(e,r,i){let n=x.resolve(r.packageFs.getRealPath(),r.prefixPath);return this.customData.pathByLocator.set(e.locatorHash,n),{packageLocation:n,buildDirective:null}}async installPackageHard(e,r,i){var u;let n=B9e(e,{project:this.opts.project});this.customData.locatorByPath.set(n,P.stringifyLocator(e)),this.customData.pathByLocator.set(e.locatorHash,n),i.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{await K.mkdirPromise(n,{recursive:!0}),await K.copyPromise(n,r.prefixPath,{baseFs:r.packageFs,overwrite:!1})}));let o=P.isVirtualLocator(e)?P.devirtualizeLocator(e):e,a={manifest:(u=await At.tryFind(r.prefixPath,{baseFs:r.packageFs}))!=null?u:new At,misc:{hasBindingGyp:ha.hasBindingGyp(r)}},l=this.opts.project.getDependencyMeta(o,e.version),c=ha.extractBuildScripts(e,a,l,{configuration:this.opts.project.configuration,report:this.opts.report});return{packageLocation:n,buildDirective:c}}async attachInternalDependencies(e,r){this.opts.project.configuration.get("nodeLinker")==="pnpm"&&(!Uge(e,{project:this.opts.project})||this.asyncActions.reduce(e.locatorHash,async i=>{await i;let n=this.customData.pathByLocator.get(e.locatorHash);if(typeof n=="undefined")throw new Error(`Assertion failed: Expected the package to have been registered (${P.stringifyLocator(e)})`);let s=x.join(n,Pt.nodeModules),o=[],a=await Hge(s);for(let[l,c]of r){let u=c;Uge(c,{project:this.opts.project})||(this.opts.report.reportWarning($.UNNAMED,"The pnpm linker doesn't support providing different versions to workspaces' peer dependencies"),u=P.devirtualizeLocator(c));let g=this.customData.pathByLocator.get(u.locatorHash);if(typeof g=="undefined")throw new Error(`Assertion failed: Expected the package to have been registered (${P.stringifyLocator(c)})`);let f=P.stringifyIdent(l),h=x.join(s,f),p=x.relative(x.dirname(h),g),m=a.get(f);a.delete(f),o.push(Promise.resolve().then(async()=>{if(m){if(m.isSymbolicLink()&&await K.readlinkPromise(h)===p)return;await K.removePromise(h)}await K.mkdirpPromise(x.dirname(h)),process.platform=="win32"?await K.symlinkPromise(g,h,"junction"):await K.symlinkPromise(p,h)}))}o.push(Gge(s,a)),await Promise.all(o)}))}async attachExternalDependents(e,r){throw new Error("External dependencies haven't been implemented for the pnpm linker")}async finalizeInstall(){let e=Kge(this.opts.project);if(this.opts.project.configuration.get("nodeLinker")!=="pnpm")await K.removePromise(e);else{let r=[],i=new Set;for(let s of this.customData.pathByLocator.values()){let o=x.contains(e,s);if(o!==null){let[a,,...l]=o.split(x.sep);i.add(a);let c=x.join(e,a);r.push(K.readdirPromise(c).then(u=>Promise.all(u.map(async g=>{let f=x.join(c,g);if(g===Pt.nodeModules){let h=await Hge(f);return h.delete(l.join(x.sep)),Gge(f,h)}else return K.removePromise(f)}))).catch(u=>{if(u.code!=="ENOENT")throw u}))}}let n;try{n=await K.readdirPromise(e)}catch{n=[]}for(let s of n)i.has(s)||r.push(K.removePromise(x.join(e,s)));await Promise.all(r)}return await this.asyncActions.wait(),await kO(e),this.opts.project.configuration.get("nodeLinker")!=="node-modules"&&await kO(Mge(this.opts.project)),{customData:this.customData}}};function SO(){return JSON.stringify({name:"PnpmInstaller",version:2})}function Mge(t){return x.join(t.cwd,Pt.nodeModules)}function Kge(t){return x.join(Mge(t),".store")}function B9e(t,{project:e}){let r=P.slugifyLocator(t),i=P.getIdentVendorPath(t);return x.join(Kge(e),r,i)}function Uge(t,{project:e}){return!P.isVirtualLocator(t)||!e.tryWorkspaceByLocator(t)}async function Hge(t){let e=new Map,r=[];try{r=await K.readdirPromise(t,{withFileTypes:!0})}catch(i){if(i.code!=="ENOENT")throw i}try{for(let i of r)if(!i.name.startsWith("."))if(i.name.startsWith("@")){let n=await K.readdirPromise(x.join(t,i.name),{withFileTypes:!0});if(n.length===0)e.set(i.name,i);else for(let s of n)e.set(`${i.name}/${s.name}`,s)}else e.set(i.name,i)}catch(i){if(i.code!=="ENOENT")throw i}return e}async function Gge(t,e){var n;let r=[],i=new Set;for(let s of e.keys()){r.push(K.removePromise(x.join(t,s)));let o=(n=P.tryParseIdent(s))==null?void 0:n.scope;o&&i.add(`@${o}`)}return Promise.all(r).then(()=>Promise.all([...i].map(s=>kO(x.join(t,s)))))}async function kO(t){try{await K.rmdirPromise(t)}catch(e){if(e.code!=="ENOENT"&&e.code!=="ENOTEMPTY")throw e}}var b9e={linkers:[vO]},Q9e=b9e;var W0=()=>({modules:new Map([["@yarnpkg/cli",VC],["@yarnpkg/core",vC],["@yarnpkg/fslib",$h],["@yarnpkg/libzip",Kd],["@yarnpkg/parsers",ap],["@yarnpkg/shell",Hd],["clipanion",u$(mp)],["semver",v9e],["typanion",ag],["yup",S9e],["@yarnpkg/plugin-essentials",uL],["@yarnpkg/plugin-compat",pL],["@yarnpkg/plugin-dlx",dL],["@yarnpkg/plugin-file",QL],["@yarnpkg/plugin-git",cL],["@yarnpkg/plugin-github",SL],["@yarnpkg/plugin-http",PL],["@yarnpkg/plugin-init",NL],["@yarnpkg/plugin-link",KL],["@yarnpkg/plugin-nm",fT],["@yarnpkg/plugin-npm",gO],["@yarnpkg/plugin-npm-cli",CO],["@yarnpkg/plugin-pack",AO],["@yarnpkg/plugin-patch",QO],["@yarnpkg/plugin-pnp",rT],["@yarnpkg/plugin-pnpm",xO]]),plugins:new Set(["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-dlx","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-link","@yarnpkg/plugin-nm","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp","@yarnpkg/plugin-pnpm"])});C0({binaryVersion:Kr||"",pluginConfiguration:W0()});})(); -/*! - * buildToken - * Builds OAuth token prefix (helper function) - * - * @name buildToken - * @function - * @param {GitUrl} obj The parsed Git url object. - * @return {String} token prefix - */ -/*! - * fill-range - * - * Copyright (c) 2014-present, Jon Schlinkert. - * Licensed under the MIT License. - */ -/*! - * is-extglob - * - * Copyright (c) 2014-2016, Jon Schlinkert. - * Licensed under the MIT License. - */ -/*! - * is-glob - * - * Copyright (c) 2014-2017, Jon Schlinkert. - * Released under the MIT License. - */ -/*! - * is-number - * - * Copyright (c) 2014-present, Jon Schlinkert. - * Released under the MIT License. - */ -/*! - * is-windows - * - * Copyright © 2015-2018, Jon Schlinkert. - * Released under the MIT License. - */ -/*! - * to-regex-range - * - * Copyright (c) 2015-present, Jon Schlinkert. - * Released under the MIT License. - */ diff --git a/.yarnrc.yml b/.yarnrc.yml index 88e75dd0..40c9b6f2 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -3,5 +3,3 @@ nodeLinker: node-modules plugins: - path: ".yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs" spec: "@yarnpkg/plugin-interactive-tools" - -yarnPath: .yarn/releases/yarn-3.2.1.cjs diff --git a/package.json b/package.json index a0f5582a..a6ea1873 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,5 @@ { "private": true, - "name": "hashi", "description": "", "author": { "name": "gnosis", @@ -8,23 +7,17 @@ }, "scripts": { "prepare": "husky install", - "preinstall": "yarn contracts:install", - "build": "yarn contracts:build", - "test": "yarn contracts:test", - "lint": "yarn contracts:lint", - "coverage": "yarn contracts:coverage", - "contracts:install": "cd packages/evm && yarn install", - "contracts:build": "cd packages/evm && yarn build", - "contracts:test": "cd packages/evm && yarn test", - "contracts:lint": "cd packages/evm && yarn lint", - "contracts:coverage": "cd packages/evm && yarn coverage" + "postinstall": "patch-package" }, "devDependencies": { "@commitlint/cli": "^17.5.1", "@commitlint/config-conventional": "^17.4.4", "husky": "^8.0.3", + "patch-package": "8.0.0", "prettier": "^2.8.7", "prettier-plugin-solidity": "^1.0.0" }, - "packageManager": "yarn@3.2.1" + "workspaces": [ + "packages/*" + ] } diff --git a/packages/evm/contracts/adapters/Electron/ElectronAdapter.sol b/packages/evm/contracts/adapters/Electron/ElectronAdapter.sol index 7dc62580..4e43d706 100644 --- a/packages/evm/contracts/adapters/Electron/ElectronAdapter.sol +++ b/packages/evm/contracts/adapters/Electron/ElectronAdapter.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.20; +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { BlockHashAdapter } from "../BlockHashAdapter.sol"; import { ILightClient } from "./interfaces/ILightClient.sol"; import { Merkle } from "./lib/Merkle.sol"; import { Receipt } from "./lib/Receipt.sol"; -import { Ownable } from "openzeppelin/access/Ownable.sol"; contract ElectronAdapter is BlockHashAdapter, Ownable { ILightClient public lightClient; diff --git a/packages/evm/contracts/adapters/Router/RouterReporter.sol b/packages/evm/contracts/adapters/Router/RouterReporter.sol index bb0199d3..fe4f889c 100644 --- a/packages/evm/contracts/adapters/Router/RouterReporter.sol +++ b/packages/evm/contracts/adapters/Router/RouterReporter.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; -import { Strings } from "@openzeppelin/contracts/utils/Strings.sol"; import { Reporter } from "../Reporter.sol"; import { IGateway } from "@routerprotocol/evm-gateway-contracts/contracts/IGateway.sol"; import { Strings } from "@openzeppelin/contracts/utils/Strings.sol"; diff --git a/packages/evm/package.json b/packages/evm/package.json index bb3835d3..3f9de61f 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -1,5 +1,6 @@ { - "name": "@gnosis/hashi", + "name": "@gnosis/hashi-evm", + "private": true, "description": "", "version": "0.1.1", "author": { @@ -19,6 +20,7 @@ "@nomicfoundation/hardhat-toolbox": "^2.0.0", "@nomiclabs/hardhat-ethers": "^2.2.1", "@nomiclabs/hardhat-etherscan": "^3.1.2", + "@openzeppelin/contracts-upgradeable": "^4.8.1", "@trivago/prettier-plugin-sort-imports": "^4.0.0", "@typechain/ethers-v5": "^10.1.1", "@typechain/hardhat": "^6.1.4", @@ -37,7 +39,7 @@ "eslint-config-prettier": "^8.5.0", "ethers": "^5.7.2", "fs-extra": "^10.1.0", - "hardhat": "^2.19.4", + "hardhat": "2.19.4", "hardhat-gas-reporter": "^1.0.9", "lint-staged": "^13.0.4", "lodash": "^4.17.21", @@ -74,17 +76,11 @@ }, "scripts": { "clean": "shx rm -rf ./artifacts ./cache ./coverage ./types ./coverage.json && yarn typechain", - "commit": "git-cz", "build": "hardhat compile", - "compile": "cross-env TS_NODE_TRANSPILE_ONLY=true hardhat compile", "coverage": "hardhat coverage --solcoverjs ./.solcover.js --temp artifacts --testfiles \"test/**/*.ts\" && yarn typechain", - "deploy:hashi": "hardhat deploy:Hashi", - "deploy:girigiribashi": "hardhat deploy:ShoyuBashi", - "deploy:headerstorage": "hardhat deploy:HeaderStorage", "lint": "yarn lint:sol && yarn lint:ts && yarn prettier:check", "lint:sol": "solhint --max-warnings 0 \"contracts/**/*.sol\"", "lint:ts": "eslint --ignore-path ./.eslintignore --ext .js,.ts .", - "postinstall": "DOTENV_CONFIG_PATH=./.env.example yarn typechain", "postpublish": "pinst --enable", "prepublishOnly": "pinst --disable", "prettier:check": "prettier --check \"**/*.{js,json,md,sol,ts,yml}\"", @@ -97,12 +93,10 @@ "@chainlink/contracts-ccip": "^0.7.6", "@connext/interfaces": "^2.0.0", "@hyperlane-xyz/core": "^3.1.10", - "@openzeppelin/contracts-upgradeable": "^4.8.1", "@polytope-labs/solidity-merkle-trees": "^0.2.1", "@routerprotocol/evm-gateway-contracts": "^1.1.13", "hardhat-change-network": "^0.0.7", "hardhat-deploy": "^0.11.31", - "openzeppelin": "npm:@openzeppelin/contracts@4.3.3", "solidity-rlp": "^2.0.8" } } diff --git a/packages/evm/yarn.lock b/packages/evm/yarn.lock deleted file mode 100644 index 231c8271..00000000 --- a/packages/evm/yarn.lock +++ /dev/null @@ -1,10541 +0,0 @@ -# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! - -__metadata: - version: 6 - cacheKey: 8 - -"@axelar-network/axelar-gmp-sdk-solidity@npm:^5.6.2": - version: 5.6.2 - resolution: "@axelar-network/axelar-gmp-sdk-solidity@npm:5.6.2" - checksum: d36260a18e0303446685fac3a04c14503454de830320b55ddb0d4382ef0d970c4cfd759029b17b1b6178f85cf3300500aa94705690e752b398dfbc32c414cf2d - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.18.6": - version: 7.21.4 - resolution: "@babel/code-frame@npm:7.21.4" - dependencies: - "@babel/highlight": ^7.18.6 - checksum: e5390e6ec1ac58dcef01d4f18eaf1fd2f1325528661ff6d4a5de8979588b9f5a8e852a54a91b923846f7a5c681b217f0a45c2524eb9560553160cd963b7d592c - languageName: node - linkType: hard - -"@babel/generator@npm:7.17.7": - version: 7.17.7 - resolution: "@babel/generator@npm:7.17.7" - dependencies: - "@babel/types": ^7.17.0 - jsesc: ^2.5.1 - source-map: ^0.5.0 - checksum: e7344b9b4559115f2754ecc2ae9508412ea6a8f617544cd3d3f17cabc727bd30630765f96c8a4ebc8901ded1492a3a6c23d695a4f1e8f3042f860b30c891985c - languageName: node - linkType: hard - -"@babel/generator@npm:^7.17.3": - version: 7.21.4 - resolution: "@babel/generator@npm:7.21.4" - dependencies: - "@babel/types": ^7.21.4 - "@jridgewell/gen-mapping": ^0.3.2 - "@jridgewell/trace-mapping": ^0.3.17 - jsesc: ^2.5.1 - checksum: 9ffbb526a53bb8469b5402f7b5feac93809b09b2a9f82fcbfcdc5916268a65dae746a1f2479e03ba4fb0776facd7c892191f63baa61ab69b2cfdb24f7b92424d - languageName: node - linkType: hard - -"@babel/helper-environment-visitor@npm:^7.16.7": - version: 7.18.9 - resolution: "@babel/helper-environment-visitor@npm:7.18.9" - checksum: b25101f6162ddca2d12da73942c08ad203d7668e06663df685634a8fde54a98bc015f6f62938e8554457a592a024108d45b8f3e651fd6dcdb877275b73cc4420 - languageName: node - linkType: hard - -"@babel/helper-function-name@npm:^7.16.7": - version: 7.21.0 - resolution: "@babel/helper-function-name@npm:7.21.0" - dependencies: - "@babel/template": ^7.20.7 - "@babel/types": ^7.21.0 - checksum: d63e63c3e0e3e8b3138fa47b0cd321148a300ef12b8ee951196994dcd2a492cc708aeda94c2c53759a5c9177fffaac0fd8778791286746f72a000976968daf4e - languageName: node - linkType: hard - -"@babel/helper-hoist-variables@npm:^7.16.7": - version: 7.18.6 - resolution: "@babel/helper-hoist-variables@npm:7.18.6" - dependencies: - "@babel/types": ^7.18.6 - checksum: fd9c35bb435fda802bf9ff7b6f2df06308a21277c6dec2120a35b09f9de68f68a33972e2c15505c1a1a04b36ec64c9ace97d4a9e26d6097b76b4396b7c5fa20f - languageName: node - linkType: hard - -"@babel/helper-split-export-declaration@npm:^7.16.7": - version: 7.18.6 - resolution: "@babel/helper-split-export-declaration@npm:7.18.6" - dependencies: - "@babel/types": ^7.18.6 - checksum: c6d3dede53878f6be1d869e03e9ffbbb36f4897c7cc1527dc96c56d127d834ffe4520a6f7e467f5b6f3c2843ea0e81a7819d66ae02f707f6ac057f3d57943a2b - languageName: node - linkType: hard - -"@babel/helper-string-parser@npm:^7.19.4": - version: 7.19.4 - resolution: "@babel/helper-string-parser@npm:7.19.4" - checksum: b2f8a3920b30dfac81ec282ac4ad9598ea170648f8254b10f475abe6d944808fb006aab325d3eb5a8ad3bea8dfa888cfa6ef471050dae5748497c110ec060943 - languageName: node - linkType: hard - -"@babel/helper-validator-identifier@npm:^7.16.7, @babel/helper-validator-identifier@npm:^7.18.6, @babel/helper-validator-identifier@npm:^7.19.1": - version: 7.19.1 - resolution: "@babel/helper-validator-identifier@npm:7.19.1" - checksum: 0eca5e86a729162af569b46c6c41a63e18b43dbe09fda1d2a3c8924f7d617116af39cac5e4cd5d431bb760b4dca3c0970e0c444789b1db42bcf1fa41fbad0a3a - languageName: node - linkType: hard - -"@babel/highlight@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/highlight@npm:7.18.6" - dependencies: - "@babel/helper-validator-identifier": ^7.18.6 - chalk: ^2.0.0 - js-tokens: ^4.0.0 - checksum: 92d8ee61549de5ff5120e945e774728e5ccd57fd3b2ed6eace020ec744823d4a98e242be1453d21764a30a14769ecd62170fba28539b211799bbaf232bbb2789 - languageName: node - linkType: hard - -"@babel/parser@npm:^7.17.3, @babel/parser@npm:^7.20.5, @babel/parser@npm:^7.20.7": - version: 7.21.4 - resolution: "@babel/parser@npm:7.21.4" - bin: - parser: ./bin/babel-parser.js - checksum: de610ecd1bff331766d0c058023ca11a4f242bfafefc42caf926becccfb6756637d167c001987ca830dd4b34b93c629a4cef63f8c8c864a8564cdfde1989ac77 - languageName: node - linkType: hard - -"@babel/runtime@npm:^7.17.2, @babel/runtime@npm:^7.23.2": - version: 7.23.2 - resolution: "@babel/runtime@npm:7.23.2" - dependencies: - regenerator-runtime: ^0.14.0 - checksum: 6c4df4839ec75ca10175f636d6362f91df8a3137f86b38f6cd3a4c90668a0fe8e9281d320958f4fbd43b394988958585a17c3aab2a4ea6bf7316b22916a371fb - languageName: node - linkType: hard - -"@babel/template@npm:^7.20.7": - version: 7.20.7 - resolution: "@babel/template@npm:7.20.7" - dependencies: - "@babel/code-frame": ^7.18.6 - "@babel/parser": ^7.20.7 - "@babel/types": ^7.20.7 - checksum: 2eb1a0ab8d415078776bceb3473d07ab746e6bb4c2f6ca46ee70efb284d75c4a32bb0cd6f4f4946dec9711f9c0780e8e5d64b743208deac6f8e9858afadc349e - languageName: node - linkType: hard - -"@babel/traverse@npm:7.17.3": - version: 7.17.3 - resolution: "@babel/traverse@npm:7.17.3" - dependencies: - "@babel/code-frame": ^7.16.7 - "@babel/generator": ^7.17.3 - "@babel/helper-environment-visitor": ^7.16.7 - "@babel/helper-function-name": ^7.16.7 - "@babel/helper-hoist-variables": ^7.16.7 - "@babel/helper-split-export-declaration": ^7.16.7 - "@babel/parser": ^7.17.3 - "@babel/types": ^7.17.0 - debug: ^4.1.0 - globals: ^11.1.0 - checksum: 780d7ecf711758174989794891af08d378f81febdb8932056c0d9979524bf0298e28f8e7708a872d7781151506c28f56c85c63ea3f1f654662c2fcb8a3eb9fdc - languageName: node - linkType: hard - -"@babel/types@npm:7.17.0": - version: 7.17.0 - resolution: "@babel/types@npm:7.17.0" - dependencies: - "@babel/helper-validator-identifier": ^7.16.7 - to-fast-properties: ^2.0.0 - checksum: 12e5a287986fe557188e87b2c5202223f1dc83d9239a196ab936fdb9f8c1eb0be717ff19f934b5fad4e29a75586d5798f74bed209bccea1c20376b9952056f0e - languageName: node - linkType: hard - -"@babel/types@npm:^7.17.0, @babel/types@npm:^7.18.6, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.0, @babel/types@npm:^7.21.4, @babel/types@npm:^7.8.3": - version: 7.21.4 - resolution: "@babel/types@npm:7.21.4" - dependencies: - "@babel/helper-string-parser": ^7.19.4 - "@babel/helper-validator-identifier": ^7.19.1 - to-fast-properties: ^2.0.0 - checksum: 587bc55a91ce003b0f8aa10d70070f8006560d7dc0360dc0406d306a2cb2a10154e2f9080b9c37abec76907a90b330a536406cb75e6bdc905484f37b75c73219 - languageName: node - linkType: hard - -"@chainlink/contracts-ccip@npm:^0.7.6": - version: 0.7.6 - resolution: "@chainlink/contracts-ccip@npm:0.7.6" - dependencies: - "@eth-optimism/contracts": ^0.5.21 - "@openzeppelin/contracts": ~4.3.3 - "@openzeppelin/contracts-upgradeable-4.7.3": "npm:@openzeppelin/contracts-upgradeable@v4.7.3" - "@openzeppelin/contracts-v0.7": "npm:@openzeppelin/contracts@v3.4.2" - checksum: 6acf068a82297d7738f88a542c6d533f23c42ff4bf855fc8efcc49c0d24281ba62007c9aa6a6b66384603bea1cfe2b281cec8d35f280b2900abca81775f30495 - languageName: node - linkType: hard - -"@chainsafe/as-sha256@npm:^0.3.1": - version: 0.3.1 - resolution: "@chainsafe/as-sha256@npm:0.3.1" - checksum: 58ea733be1657b0e31dbf48b0dba862da0833df34a81c1460c7352f04ce90874f70003cbf34d0afb9e5e53a33ee2d63a261a8b12462be85b2ba0a6f7f13d6150 - languageName: node - linkType: hard - -"@chainsafe/persistent-merkle-tree@npm:^0.4.2": - version: 0.4.2 - resolution: "@chainsafe/persistent-merkle-tree@npm:0.4.2" - dependencies: - "@chainsafe/as-sha256": ^0.3.1 - checksum: f9cfcb2132a243992709715dbd28186ab48c7c0c696f29d30857693cca5526bf753974a505ef68ffd5623bbdbcaa10f9083f4dd40bf99eb6408e451cc26a1a9e - languageName: node - linkType: hard - -"@chainsafe/persistent-merkle-tree@npm:^0.5.0": - version: 0.5.0 - resolution: "@chainsafe/persistent-merkle-tree@npm:0.5.0" - dependencies: - "@chainsafe/as-sha256": ^0.3.1 - checksum: 2c67203da776c79cd3a6132e2d672fe132393b2e63dc71604e3134acc8c0ec25cc5e431051545939ea0f7c5ff2066fb806b9e5cab974ca085d046226a1671f7d - languageName: node - linkType: hard - -"@chainsafe/ssz@npm:^0.10.0": - version: 0.10.2 - resolution: "@chainsafe/ssz@npm:0.10.2" - dependencies: - "@chainsafe/as-sha256": ^0.3.1 - "@chainsafe/persistent-merkle-tree": ^0.5.0 - checksum: 6bb70cf741d0a19dd0b28b3f6f067b96fa39f556e2eefa6ac745b21db9c3b3a8393dc3cca8ff4a6ce065ed71ddc3fb1b2b390a92004b9d01067c26e2558e5503 - languageName: node - linkType: hard - -"@chainsafe/ssz@npm:^0.9.2": - version: 0.9.4 - resolution: "@chainsafe/ssz@npm:0.9.4" - dependencies: - "@chainsafe/as-sha256": ^0.3.1 - "@chainsafe/persistent-merkle-tree": ^0.4.2 - case: ^1.6.3 - checksum: c6eaedeae9e5618b3c666ff4507a27647f665a8dcf17d5ca86da4ed4788c5a93868f256d0005467d184fdf35ec03f323517ec2e55ec42492d769540a2ec396bc - languageName: node - linkType: hard - -"@commitlint/cli@npm:^17.3.0": - version: 17.5.1 - resolution: "@commitlint/cli@npm:17.5.1" - dependencies: - "@commitlint/format": ^17.4.4 - "@commitlint/lint": ^17.4.4 - "@commitlint/load": ^17.5.0 - "@commitlint/read": ^17.5.1 - "@commitlint/types": ^17.4.4 - execa: ^5.0.0 - lodash.isfunction: ^3.0.9 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - yargs: ^17.0.0 - bin: - commitlint: cli.js - checksum: 2bdd26b3215796dccb16b0d7459d3b0db7f6324800aa73b97a8cdf79b77f3691d85ee88f37fa6cf20c97ac664f31dcb6ad7aef1da3c3b32d7bb12f18d49a37f2 - languageName: node - linkType: hard - -"@commitlint/config-conventional@npm:^17.3.0": - version: 17.4.4 - resolution: "@commitlint/config-conventional@npm:17.4.4" - dependencies: - conventional-changelog-conventionalcommits: ^5.0.0 - checksum: 679d92509fe6e53ee0cc4202f8069d88360c4f9dbd7ab74114bb28278a196da517ef711dfe69893033a66e54ffc29e8df2ccf63cfd746a89c82a053949473c4b - languageName: node - linkType: hard - -"@commitlint/config-validator@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/config-validator@npm:17.4.4" - dependencies: - "@commitlint/types": ^17.4.4 - ajv: ^8.11.0 - checksum: 71ee818608ed5c74832cdd63531c0f61b21758fba9f8b876205485ece4f047c9582bc3f323a20a5de700e3451296614d15448437270a82194eff7d71317b47ff - languageName: node - linkType: hard - -"@commitlint/ensure@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/ensure@npm:17.4.4" - dependencies: - "@commitlint/types": ^17.4.4 - lodash.camelcase: ^4.3.0 - lodash.kebabcase: ^4.1.1 - lodash.snakecase: ^4.1.1 - lodash.startcase: ^4.4.0 - lodash.upperfirst: ^4.3.1 - checksum: c21c189f22d8d3265e93256d101b72ef7cbdf8660438081799b9a4a8bd47d33133f250bbed858ab9bcc0d249d1c95ac58eddd9e5b46314d64ff049d0479d0d71 - languageName: node - linkType: hard - -"@commitlint/execute-rule@npm:^17.4.0": - version: 17.4.0 - resolution: "@commitlint/execute-rule@npm:17.4.0" - checksum: 17d8e56ab00bd45fdecb0ed33186d2020ce261250d6a516204b6509610b75af8c930e7226b1111af3de298db32a7e4d0ba2c9cc7ed67db5ba5159eeed634f067 - languageName: node - linkType: hard - -"@commitlint/format@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/format@npm:17.4.4" - dependencies: - "@commitlint/types": ^17.4.4 - chalk: ^4.1.0 - checksum: 832d9641129f2da8d32389b4a47db59d41eb1adfab742723972cad64b833c4af9e253f96757b27664fedae61644dd4c01d21f775773b45b604bd7f93b23a27d2 - languageName: node - linkType: hard - -"@commitlint/is-ignored@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/is-ignored@npm:17.4.4" - dependencies: - "@commitlint/types": ^17.4.4 - semver: 7.3.8 - checksum: 716631ecd6aece8642d76c1a99e1cdc24bad79f22199d1d4bad73d9b12edb3578ed7d6f23947ca28d4bb637e08a1738e55dd693c165a2d395c10560a988ffc05 - languageName: node - linkType: hard - -"@commitlint/lint@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/lint@npm:17.4.4" - dependencies: - "@commitlint/is-ignored": ^17.4.4 - "@commitlint/parse": ^17.4.4 - "@commitlint/rules": ^17.4.4 - "@commitlint/types": ^17.4.4 - checksum: bf04a9f9a1435e0d3cd03c58b6bf924613d0278b66b0a5d0e18eb96c7af9eeb02871e739a4d7d9312b2b4178f6f8ae9a49ba74382b4e28f623e1bf0af7067946 - languageName: node - linkType: hard - -"@commitlint/load@npm:>6.1.1, @commitlint/load@npm:^17.5.0": - version: 17.5.0 - resolution: "@commitlint/load@npm:17.5.0" - dependencies: - "@commitlint/config-validator": ^17.4.4 - "@commitlint/execute-rule": ^17.4.0 - "@commitlint/resolve-extends": ^17.4.4 - "@commitlint/types": ^17.4.4 - "@types/node": "*" - chalk: ^4.1.0 - cosmiconfig: ^8.0.0 - cosmiconfig-typescript-loader: ^4.0.0 - lodash.isplainobject: ^4.0.6 - lodash.merge: ^4.6.2 - lodash.uniq: ^4.5.0 - resolve-from: ^5.0.0 - ts-node: ^10.8.1 - typescript: ^4.6.4 || ^5.0.0 - checksum: c039114b0ad67bb9d8b05ec635d847bd5ab760528f0fb203411f433585bdab5472f4f5c7856dfc417cf64c05576f54c1afc4997a813f529304e0156bfc1d6cc8 - languageName: node - linkType: hard - -"@commitlint/message@npm:^17.4.2": - version: 17.4.2 - resolution: "@commitlint/message@npm:17.4.2" - checksum: 55b6cfeb57f7c9f913e18821aa4d972a6b6faa78c62741390996151f99554396f6df68ccfee86c163d24d8c27a4dbbcb50ef03c2972ab0a7a21d89daa2f9a519 - languageName: node - linkType: hard - -"@commitlint/parse@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/parse@npm:17.4.4" - dependencies: - "@commitlint/types": ^17.4.4 - conventional-changelog-angular: ^5.0.11 - conventional-commits-parser: ^3.2.2 - checksum: 2a6e5b0a5cdea21c879a3919a0227c0d7f3fa1f343808bcb09e3e7f25b0dc494dcca8af32982e7a65640b53c3e6cf138ebf685b657dd55173160bc0fa4e58916 - languageName: node - linkType: hard - -"@commitlint/read@npm:^17.5.1": - version: 17.5.1 - resolution: "@commitlint/read@npm:17.5.1" - dependencies: - "@commitlint/top-level": ^17.4.0 - "@commitlint/types": ^17.4.4 - fs-extra: ^11.0.0 - git-raw-commits: ^2.0.11 - minimist: ^1.2.6 - checksum: 62ee4f7a47b22a8571ae313bca36b418805a248f4986557f38f06317c44b6d18072889f95e7bc22bbb33a2f2b08236f74596ff28e3dbd0894249477a9df367c3 - languageName: node - linkType: hard - -"@commitlint/resolve-extends@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/resolve-extends@npm:17.4.4" - dependencies: - "@commitlint/config-validator": ^17.4.4 - "@commitlint/types": ^17.4.4 - import-fresh: ^3.0.0 - lodash.mergewith: ^4.6.2 - resolve-from: ^5.0.0 - resolve-global: ^1.0.0 - checksum: d7bf1ff1ad3db8750421b252d79cf7b96cf07d72cad8cc3f73c1363a8e68c0afde611d38ae6f213bbb54e3248160c6b9425578f3d0f8f790e84aea811d748b3e - languageName: node - linkType: hard - -"@commitlint/rules@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/rules@npm:17.4.4" - dependencies: - "@commitlint/ensure": ^17.4.4 - "@commitlint/message": ^17.4.2 - "@commitlint/to-lines": ^17.4.0 - "@commitlint/types": ^17.4.4 - execa: ^5.0.0 - checksum: f36525f6e234df6a17d47457b733a1fc10e3e01db1aa6fb45b18cbaf74b7915f634ab65f73d2412787137c366046f8264126c2f21ad9023ac6b68ec8b1cee8f4 - languageName: node - linkType: hard - -"@commitlint/to-lines@npm:^17.4.0": - version: 17.4.0 - resolution: "@commitlint/to-lines@npm:17.4.0" - checksum: 841f90f606238e145ab4ba02940662d511fc04fe553619900152a8542170fe664031b95d820ffaeb8864d4851344278e662ef29637d763fc19fd828e0f8d139b - languageName: node - linkType: hard - -"@commitlint/top-level@npm:^17.4.0": - version: 17.4.0 - resolution: "@commitlint/top-level@npm:17.4.0" - dependencies: - find-up: ^5.0.0 - checksum: 14cd77e982d2dd7989718dafdbf7a2168a5fb387005e0686c2dfa9ffc36bb9a749e5d80a151884459e4d8c88564339688dca26e9c711abe043beeb3f30c3dfd6 - languageName: node - linkType: hard - -"@commitlint/types@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/types@npm:17.4.4" - dependencies: - chalk: ^4.1.0 - checksum: 03c52429052d161710896d198000196bd2e60be0fd71459b22133dd83dee43e8d05ea8ee703c8369823bc40f77a54881b80d8aa4368ac52aea7f30fb234b73d2 - languageName: node - linkType: hard - -"@connext/interfaces@npm:^2.0.0": - version: 2.0.3 - resolution: "@connext/interfaces@npm:2.0.3" - checksum: e305765dd436fff8dbcc643c263c9532763cbd9ee166ada193b386b56c3732f487808469c48c0a3a4243d32fa1aae9825e2b497956850861b14f3ed7e406524c - languageName: node - linkType: hard - -"@cosmjs/encoding@npm:^0.31.3": - version: 0.31.3 - resolution: "@cosmjs/encoding@npm:0.31.3" - dependencies: - base64-js: ^1.3.0 - bech32: ^1.1.4 - readonly-date: ^1.0.0 - checksum: dadef0579828299be20a64edf820ac8770c0cc47a842594bc9b494f160a347b745941d795360755ccbe385b9d0912aa54753479d1a70ff762d2d334693952ff9 - languageName: node - linkType: hard - -"@cspotcode/source-map-support@npm:^0.8.0": - version: 0.8.1 - resolution: "@cspotcode/source-map-support@npm:0.8.1" - dependencies: - "@jridgewell/trace-mapping": 0.3.9 - checksum: 5718f267085ed8edb3e7ef210137241775e607ee18b77d95aa5bd7514f47f5019aa2d82d96b3bf342ef7aa890a346fa1044532ff7cc3009e7d24fce3ce6200fa - languageName: node - linkType: hard - -"@eslint-community/eslint-utils@npm:^4.2.0": - version: 4.4.0 - resolution: "@eslint-community/eslint-utils@npm:4.4.0" - dependencies: - eslint-visitor-keys: ^3.3.0 - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: cdfe3ae42b4f572cbfb46d20edafe6f36fc5fb52bf2d90875c58aefe226892b9677fef60820e2832caf864a326fe4fc225714c46e8389ccca04d5f9288aabd22 - languageName: node - linkType: hard - -"@eslint-community/regexpp@npm:^4.4.0": - version: 4.5.0 - resolution: "@eslint-community/regexpp@npm:4.5.0" - checksum: 99c01335947dbd7f2129e954413067e217ccaa4e219fe0917b7d2bd96135789384b8fedbfb8eb09584d5130b27a7b876a7150ab7376f51b3a0c377d5ce026a10 - languageName: node - linkType: hard - -"@eslint/eslintrc@npm:^2.0.2": - version: 2.0.2 - resolution: "@eslint/eslintrc@npm:2.0.2" - dependencies: - ajv: ^6.12.4 - debug: ^4.3.2 - espree: ^9.5.1 - 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 - checksum: cfcf5e12c7b2c4476482e7f12434e76eae16fcd163ee627309adb10b761e5caa4a4e52ed7be464423320ff3d11eca5b50de5bf8be3e25834222470835dd5c801 - languageName: node - linkType: hard - -"@eslint/js@npm:8.37.0": - version: 8.37.0 - resolution: "@eslint/js@npm:8.37.0" - checksum: 7a07fb085c94ce1538949012c292fd3a6cd734f149bc03af6157dfbd8a7477678899ef57b4a27e15b36470a997389ad79a0533d5880c71e67720ae1a7de7c62d - languageName: node - linkType: hard - -"@eth-optimism/contracts@npm:^0.5.21": - version: 0.5.40 - resolution: "@eth-optimism/contracts@npm:0.5.40" - dependencies: - "@eth-optimism/core-utils": 0.12.0 - "@ethersproject/abstract-provider": ^5.7.0 - "@ethersproject/abstract-signer": ^5.7.0 - peerDependencies: - ethers: ^5 - checksum: 11dde466c90b886efe8b5fd123fa5893187a4ff84839213d417f90ae4e45bf00b2f62d56e4ebe23ba5dd7ec33beed22c4c41e206add35fce0db073fe2dbae6ba - languageName: node - linkType: hard - -"@eth-optimism/contracts@npm:^0.6.0": - version: 0.6.0 - resolution: "@eth-optimism/contracts@npm:0.6.0" - dependencies: - "@eth-optimism/core-utils": 0.12.0 - "@ethersproject/abstract-provider": ^5.7.0 - "@ethersproject/abstract-signer": ^5.7.0 - peerDependencies: - ethers: ^5 - checksum: 52e9a6cc6ad9bf3ab085d3be501fa4c89e48865baa8aee01aff39c2b007b69600304c7e8f8f4e00d67396e48a0dbfe3a260437efd3a4d7216424cece52639870 - languageName: node - linkType: hard - -"@eth-optimism/core-utils@npm:0.12.0": - version: 0.12.0 - resolution: "@eth-optimism/core-utils@npm:0.12.0" - dependencies: - "@ethersproject/abi": ^5.7.0 - "@ethersproject/abstract-provider": ^5.7.0 - "@ethersproject/address": ^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/keccak256": ^5.7.0 - "@ethersproject/properties": ^5.7.0 - "@ethersproject/providers": ^5.7.0 - "@ethersproject/rlp": ^5.7.0 - "@ethersproject/transactions": ^5.7.0 - "@ethersproject/web": ^5.7.0 - bufio: ^1.0.7 - chai: ^4.3.4 - checksum: 1c820107c44bdbb46becb1b00fd0dabb44f3ac8f54e6da7872a5a134411fad26f53b193225da55e79d6a8d7f0d01cc16a123db5d41ebaf02ca78360249a4b52a - languageName: node - linkType: hard - -"@ethersproject/abi@npm:5.7.0, @ethersproject/abi@npm:^5.0.0-beta.146, @ethersproject/abi@npm:^5.0.9, @ethersproject/abi@npm:^5.1.2, @ethersproject/abi@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/abi@npm:5.7.0" - 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 - checksum: bc6962bb6cb854e4d2a4d65b2c49c716477675b131b1363312234bdbb7e19badb7d9ce66f4ca2a70ae2ea84f7123dbc4e300a1bfe5d58864a7eafabc1466627e - languageName: node - linkType: hard - -"@ethersproject/abstract-provider@npm:5.7.0, @ethersproject/abstract-provider@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/abstract-provider@npm:5.7.0" - 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 - checksum: 74cf4696245cf03bb7cc5b6cbf7b4b89dd9a79a1c4688126d214153a938126d4972d42c93182198653ce1de35f2a2cad68be40337d4774b3698a39b28f0228a8 - languageName: node - linkType: hard - -"@ethersproject/abstract-signer@npm:5.7.0, @ethersproject/abstract-signer@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/abstract-signer@npm:5.7.0" - 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 - checksum: a823dac9cfb761e009851050ebebd5b229d1b1cc4a75b125c2da130ff37e8218208f7f9d1386f77407705b889b23d4a230ad67185f8872f083143e0073cbfbe3 - languageName: node - linkType: hard - -"@ethersproject/address@npm:5.7.0, @ethersproject/address@npm:^5.0.2, @ethersproject/address@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/address@npm:5.7.0" - 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 - checksum: 64ea5ebea9cc0e845c413e6cb1e54e157dd9fc0dffb98e239d3a3efc8177f2ff798cd4e3206cf3660ee8faeb7bef1a47dc0ebef0d7b132c32e61e550c7d4c843 - languageName: node - linkType: hard - -"@ethersproject/base64@npm:5.7.0, @ethersproject/base64@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/base64@npm:5.7.0" - dependencies: - "@ethersproject/bytes": ^5.7.0 - checksum: 7dd5d734d623582f08f665434f53685041a3d3b334a0e96c0c8afa8bbcaab934d50e5b6b980e826a8fde8d353e0b18f11e61faf17468177274b8e7c69cd9742b - languageName: node - linkType: hard - -"@ethersproject/basex@npm:5.7.0, @ethersproject/basex@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/basex@npm:5.7.0" - dependencies: - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/properties": ^5.7.0 - checksum: 326087b7e1f3787b5fe6cd1cf2b4b5abfafbc355a45e88e22e5e9d6c845b613ffc5301d629b28d5c4d5e2bfe9ec424e6782c804956dff79be05f0098cb5817de - languageName: node - linkType: hard - -"@ethersproject/bignumber@npm:5.7.0, @ethersproject/bignumber@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/bignumber@npm:5.7.0" - dependencies: - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - bn.js: ^5.2.1 - checksum: 8c9a134b76f3feb4ec26a5a27379efb4e156b8fb2de0678a67788a91c7f4e30abe9d948638458e4b20f2e42380da0adacc7c9389d05fce070692edc6ae9b4904 - languageName: node - linkType: hard - -"@ethersproject/bytes@npm:5.7.0, @ethersproject/bytes@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/bytes@npm:5.7.0" - dependencies: - "@ethersproject/logger": ^5.7.0 - checksum: 66ad365ceaab5da1b23b72225c71dce472cf37737af5118181fa8ab7447d696bea15ca22e3a0e8836fdd8cfac161afe321a7c67d0dde96f9f645ddd759676621 - languageName: node - linkType: hard - -"@ethersproject/constants@npm:5.7.0, @ethersproject/constants@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/constants@npm:5.7.0" - dependencies: - "@ethersproject/bignumber": ^5.7.0 - checksum: 6d4b1355747cce837b3e76ec3bde70e4732736f23b04f196f706ebfa5d4d9c2be50904a390d4d40ce77803b98d03d16a9b6898418e04ba63491933ce08c4ba8a - languageName: node - linkType: hard - -"@ethersproject/contracts@npm:5.7.0, @ethersproject/contracts@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/contracts@npm:5.7.0" - 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 - checksum: 6ccf1121cba01b31e02f8c507cb971ab6bfed85706484a9ec09878ef1594a62215f43c4fdef8f4a4875b99c4a800bc95e3be69b1803f8ce479e07634b5a740c0 - languageName: node - linkType: hard - -"@ethersproject/hash@npm:5.7.0, @ethersproject/hash@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/hash@npm:5.7.0" - 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 - checksum: 6e9fa8d14eb08171cd32f17f98cc108ec2aeca74a427655f0d689c550fee0b22a83b3b400fad7fb3f41cf14d4111f87f170aa7905bcbcd1173a55f21b06262ef - languageName: node - linkType: hard - -"@ethersproject/hdnode@npm:5.7.0, @ethersproject/hdnode@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/hdnode@npm:5.7.0" - 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 - checksum: bfe5ca2d89a42de73655f853170ef4766b933c5f481cddad709b3aca18823275b096e572f92d1602a052f80b426edde44ad6b9d028799775a7dad4a5bbed2133 - languageName: node - linkType: hard - -"@ethersproject/json-wallets@npm:5.7.0, @ethersproject/json-wallets@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/json-wallets@npm:5.7.0" - 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 - checksum: f583458d22db62efaaf94d38dd243482776a45bf90f9f3882fbad5aa0b8fd288b41eb7c1ff8ec0b99c9b751088e43d6173530db64dd33c59f9d8daa8d7ad5aa2 - languageName: node - linkType: hard - -"@ethersproject/keccak256@npm:5.7.0, @ethersproject/keccak256@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/keccak256@npm:5.7.0" - dependencies: - "@ethersproject/bytes": ^5.7.0 - js-sha3: 0.8.0 - checksum: ff70950d82203aab29ccda2553422cbac2e7a0c15c986bd20a69b13606ed8bb6e4fdd7b67b8d3b27d4f841e8222cbaccd33ed34be29f866fec7308f96ed244c6 - languageName: node - linkType: hard - -"@ethersproject/logger@npm:5.7.0, @ethersproject/logger@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/logger@npm:5.7.0" - checksum: 075ab2f605f1fd0813f2e39c3308f77b44a67732b36e712d9bc085f22a84aac4da4f71b39bee50fe78da3e1c812673fadc41180c9970fe5e486e91ea17befe0d - languageName: node - linkType: hard - -"@ethersproject/networks@npm:5.7.1, @ethersproject/networks@npm:^5.7.0": - version: 5.7.1 - resolution: "@ethersproject/networks@npm:5.7.1" - dependencies: - "@ethersproject/logger": ^5.7.0 - checksum: 0339f312304c17d9a0adce550edb825d4d2c8c9468c1634c44172c67a9ed256f594da62c4cda5c3837a0f28b7fabc03aca9b492f68ff1fdad337ee861b27bd5d - languageName: node - linkType: hard - -"@ethersproject/pbkdf2@npm:5.7.0, @ethersproject/pbkdf2@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/pbkdf2@npm:5.7.0" - dependencies: - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/sha2": ^5.7.0 - checksum: b895adb9e35a8a127e794f7aadc31a2424ef355a70e51cde10d457e3e888bb8102373199a540cf61f2d6b9a32e47358f9c65b47d559f42bf8e596b5fd67901e9 - languageName: node - linkType: hard - -"@ethersproject/properties@npm:5.7.0, @ethersproject/properties@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/properties@npm:5.7.0" - dependencies: - "@ethersproject/logger": ^5.7.0 - checksum: 6ab0ccf0c3aadc9221e0cdc5306ce6cd0df7f89f77d77bccdd1277182c9ead0202cd7521329ba3acde130820bf8af299e17cf567d0d497c736ee918207bbf59f - languageName: node - linkType: hard - -"@ethersproject/providers@npm:5.7.2, @ethersproject/providers@npm:^5.7.0, @ethersproject/providers@npm:^5.7.1, @ethersproject/providers@npm:^5.7.2": - version: 5.7.2 - resolution: "@ethersproject/providers@npm:5.7.2" - 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 - checksum: 1754c731a5ca6782ae9677f4a9cd8b6246c4ef21a966c9a01b133750f3c578431ec43ec254e699969c4a0f87e84463ded50f96b415600aabd37d2056aee58c19 - languageName: node - linkType: hard - -"@ethersproject/random@npm:5.7.0, @ethersproject/random@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/random@npm:5.7.0" - dependencies: - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - checksum: 017829c91cff6c76470852855108115b0b52c611b6be817ed1948d56ba42d6677803ec2012aa5ae298a7660024156a64c11fcf544e235e239ab3f89f0fff7345 - languageName: node - linkType: hard - -"@ethersproject/rlp@npm:5.7.0, @ethersproject/rlp@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/rlp@npm:5.7.0" - dependencies: - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - checksum: bce165b0f7e68e4d091c9d3cf47b247cac33252df77a095ca4281d32d5eeaaa3695d9bc06b2b057c5015353a68df89f13a4a54a72e888e4beeabbe56b15dda6e - languageName: node - linkType: hard - -"@ethersproject/sha2@npm:5.7.0, @ethersproject/sha2@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/sha2@npm:5.7.0" - dependencies: - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - hash.js: 1.1.7 - checksum: 09321057c022effbff4cc2d9b9558228690b5dd916329d75c4b1ffe32ba3d24b480a367a7cc92d0f0c0b1c896814d03351ae4630e2f1f7160be2bcfbde435dbc - languageName: node - linkType: hard - -"@ethersproject/signing-key@npm:5.7.0, @ethersproject/signing-key@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/signing-key@npm:5.7.0" - 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 - checksum: 8f8de09b0aac709683bbb49339bc0a4cd2f95598f3546436c65d6f3c3a847ffa98e06d35e9ed2b17d8030bd2f02db9b7bd2e11c5cf8a71aad4537487ab4cf03a - languageName: node - linkType: hard - -"@ethersproject/solidity@npm:5.7.0, @ethersproject/solidity@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/solidity@npm:5.7.0" - 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 - checksum: 9a02f37f801c96068c3e7721f83719d060175bc4e80439fe060e92bd7acfcb6ac1330c7e71c49f4c2535ca1308f2acdcb01e00133129aac00581724c2d6293f3 - languageName: node - linkType: hard - -"@ethersproject/strings@npm:5.7.0, @ethersproject/strings@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/strings@npm:5.7.0" - dependencies: - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/constants": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - checksum: 5ff78693ae3fdf3cf23e1f6dc047a61e44c8197d2408c42719fef8cb7b7b3613a4eec88ac0ed1f9f5558c74fe0de7ae3195a29ca91a239c74b9f444d8e8b50df - languageName: node - linkType: hard - -"@ethersproject/transactions@npm:5.7.0, @ethersproject/transactions@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/transactions@npm:5.7.0" - 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 - checksum: a31b71996d2b283f68486241bff0d3ea3f1ba0e8f1322a8fffc239ccc4f4a7eb2ea9994b8fd2f093283fd75f87bae68171e01b6265261f821369aca319884a79 - languageName: node - linkType: hard - -"@ethersproject/units@npm:5.7.0": - version: 5.7.0 - resolution: "@ethersproject/units@npm:5.7.0" - dependencies: - "@ethersproject/bignumber": ^5.7.0 - "@ethersproject/constants": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - checksum: 304714f848cd32e57df31bf545f7ad35c2a72adae957198b28cbc62166daa929322a07bff6e9c9ac4577ab6aa0de0546b065ed1b2d20b19e25748b7d475cb0fc - languageName: node - linkType: hard - -"@ethersproject/wallet@npm:5.7.0, @ethersproject/wallet@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/wallet@npm:5.7.0" - 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 - checksum: a4009bf7331eddab38e3015b5e9101ef92de7f705b00a6196b997db0e5635b6d83561674d46c90c6f77b87c0500fe4a6b0183ba13749efc22db59c99deb82fbd - languageName: node - linkType: hard - -"@ethersproject/web@npm:5.7.1, @ethersproject/web@npm:^5.7.0": - version: 5.7.1 - resolution: "@ethersproject/web@npm:5.7.1" - 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 - checksum: 7028c47103f82fd2e2c197ce0eecfacaa9180ffeec7de7845b1f4f9b19d84081b7a48227aaddde05a4aaa526af574a9a0ce01cc0fc75e3e371f84b38b5b16b2b - languageName: node - linkType: hard - -"@ethersproject/wordlists@npm:5.7.0, @ethersproject/wordlists@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/wordlists@npm:5.7.0" - 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 - checksum: 30eb6eb0731f9ef5faa44bf9c0c6e950bcaaef61e4d2d9ce0ae6d341f4e2d6d1f4ab4f8880bfce03b7aac4b862fb740e1421170cfbf8e2aafc359277d49e6e97 - languageName: node - linkType: hard - -"@gar/promisify@npm:^1.1.3": - version: 1.1.3 - resolution: "@gar/promisify@npm:1.1.3" - checksum: 4059f790e2d07bf3c3ff3e0fec0daa8144fe35c1f6e0111c9921bd32106adaa97a4ab096ad7dab1e28ee6a9060083c4d1a4ada42a7f5f3f7a96b8812e2b757c1 - languageName: node - linkType: hard - -"@gnosis/hashi@workspace:.": - version: 0.0.0-use.local - resolution: "@gnosis/hashi@workspace:." - dependencies: - "@axelar-network/axelar-gmp-sdk-solidity": ^5.6.2 - "@chainlink/contracts-ccip": ^0.7.6 - "@commitlint/cli": ^17.3.0 - "@commitlint/config-conventional": ^17.3.0 - "@connext/interfaces": ^2.0.0 - "@ethersproject/abi": ^5.7.0 - "@ethersproject/abstract-signer": ^5.7.0 - "@ethersproject/bignumber": ^5.7.0 - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/providers": ^5.7.2 - "@hyperlane-xyz/core": ^3.1.10 - "@nomicfoundation/hardhat-chai-matchers": ^1.0.4 - "@nomicfoundation/hardhat-network-helpers": ^1.0.8 - "@nomicfoundation/hardhat-toolbox": ^2.0.0 - "@nomiclabs/hardhat-ethers": ^2.2.1 - "@nomiclabs/hardhat-etherscan": ^3.1.2 - "@openzeppelin/contracts-upgradeable": ^4.8.1 - "@polytope-labs/solidity-merkle-trees": ^0.2.1 - "@routerprotocol/evm-gateway-contracts": ^1.1.13 - "@trivago/prettier-plugin-sort-imports": ^4.0.0 - "@typechain/ethers-v5": ^10.1.1 - "@typechain/hardhat": ^6.1.4 - "@types/chai": ^4.3.4 - "@types/fs-extra": ^9.0.13 - "@types/mocha": ^10.0.0 - "@types/node": ^18.11.9 - "@typescript-eslint/eslint-plugin": ^5.44.0 - "@typescript-eslint/parser": ^5.44.0 - chai: ^4.3.7 - commitizen: ^4.2.5 - cross-env: ^7.0.3 - cz-conventional-changelog: ^3.3.0 - dotenv: ^16.0.3 - eslint: ^8.28.0 - eslint-config-prettier: ^8.5.0 - ethers: ^5.7.2 - fs-extra: ^10.1.0 - hardhat: ^2.19.4 - hardhat-change-network: ^0.0.7 - hardhat-deploy: ^0.11.31 - hardhat-gas-reporter: ^1.0.9 - lint-staged: ^13.0.4 - lodash: ^4.17.21 - mocha: ^10.1.0 - openzeppelin: "npm:@openzeppelin/contracts@4.3.3" - pinst: ^3.0.0 - prettier: ^2.8.7 - prettier-plugin-solidity: ^1.0.0 - shx: ^0.3.4 - solhint: ^3.3.7 - solhint-plugin-prettier: ^0.0.5 - solidity-coverage: ^0.8.2 - solidity-rlp: ^2.0.8 - ts-generator: ^0.1.1 - ts-node: ^10.9.1 - typechain: ^8.1.1 - typescript: ^4.9.3 - languageName: unknown - linkType: soft - -"@humanwhocodes/config-array@npm:^0.11.8": - version: 0.11.8 - resolution: "@humanwhocodes/config-array@npm:0.11.8" - dependencies: - "@humanwhocodes/object-schema": ^1.2.1 - debug: ^4.1.1 - minimatch: ^3.0.5 - checksum: 0fd6b3c54f1674ce0a224df09b9c2f9846d20b9e54fabae1281ecfc04f2e6ad69bf19e1d6af6a28f88e8aa3990168b6cb9e1ef755868c3256a630605ec2cb1d3 - languageName: node - linkType: hard - -"@humanwhocodes/module-importer@npm:^1.0.1": - version: 1.0.1 - resolution: "@humanwhocodes/module-importer@npm:1.0.1" - checksum: 0fd22007db8034a2cdf2c764b140d37d9020bbfce8a49d3ec5c05290e77d4b0263b1b972b752df8c89e5eaa94073408f2b7d977aed131faf6cf396ebb5d7fb61 - languageName: node - linkType: hard - -"@humanwhocodes/object-schema@npm:^1.2.1": - version: 1.2.1 - resolution: "@humanwhocodes/object-schema@npm:1.2.1" - checksum: a824a1ec31591231e4bad5787641f59e9633827d0a2eaae131a288d33c9ef0290bd16fda8da6f7c0fcb014147865d12118df10db57f27f41e20da92369fcb3f1 - languageName: node - linkType: hard - -"@hyperlane-xyz/core@npm:^3.1.10": - version: 3.1.10 - resolution: "@hyperlane-xyz/core@npm:3.1.10" - dependencies: - "@eth-optimism/contracts": ^0.6.0 - "@hyperlane-xyz/utils": 3.1.10 - "@openzeppelin/contracts": ^4.9.3 - "@openzeppelin/contracts-upgradeable": ^v4.9.3 - peerDependencies: - "@ethersproject/abi": "*" - "@ethersproject/providers": "*" - "@types/sinon-chai": "*" - checksum: af099ebb9d4615ab7ce89ab0611563cbe9699a405161e3ce67b4ab203ea65bff4148e0c46eaecacc9698525d2d591fe55198c7692f8008e828e199b5de2630fd - languageName: node - linkType: hard - -"@hyperlane-xyz/utils@npm:3.1.10": - version: 3.1.10 - resolution: "@hyperlane-xyz/utils@npm:3.1.10" - dependencies: - "@cosmjs/encoding": ^0.31.3 - "@solana/web3.js": ^1.78.0 - bignumber.js: ^9.1.1 - ethers: ^5.7.2 - checksum: c549a3a73f6c4e666f0344bf5443cac07a8aea4039e2af13adc26c430d81f68d7254f3d3a5d18bcdf30f6ea41ea5ab1c7f723f81ae23bad36ee1292c290247c9 - languageName: node - linkType: hard - -"@jridgewell/gen-mapping@npm:^0.3.2": - version: 0.3.2 - resolution: "@jridgewell/gen-mapping@npm:0.3.2" - dependencies: - "@jridgewell/set-array": ^1.0.1 - "@jridgewell/sourcemap-codec": ^1.4.10 - "@jridgewell/trace-mapping": ^0.3.9 - checksum: 1832707a1c476afebe4d0fbbd4b9434fdb51a4c3e009ab1e9938648e21b7a97049fa6009393bdf05cab7504108413441df26d8a3c12193996e65493a4efb6882 - languageName: node - linkType: hard - -"@jridgewell/resolve-uri@npm:3.1.0, @jridgewell/resolve-uri@npm:^3.0.3": - version: 3.1.0 - resolution: "@jridgewell/resolve-uri@npm:3.1.0" - checksum: b5ceaaf9a110fcb2780d1d8f8d4a0bfd216702f31c988d8042e5f8fbe353c55d9b0f55a1733afdc64806f8e79c485d2464680ac48a0d9fcadb9548ee6b81d267 - languageName: node - linkType: hard - -"@jridgewell/set-array@npm:^1.0.1": - version: 1.1.2 - resolution: "@jridgewell/set-array@npm:1.1.2" - checksum: 69a84d5980385f396ff60a175f7177af0b8da4ddb81824cb7016a9ef914eee9806c72b6b65942003c63f7983d4f39a5c6c27185bbca88eb4690b62075602e28e - languageName: node - linkType: hard - -"@jridgewell/sourcemap-codec@npm:1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.10": - version: 1.4.14 - resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" - checksum: 61100637b6d173d3ba786a5dff019e1a74b1f394f323c1fee337ff390239f053b87266c7a948777f4b1ee68c01a8ad0ab61e5ff4abb5a012a0b091bec391ab97 - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:0.3.9": - version: 0.3.9 - resolution: "@jridgewell/trace-mapping@npm:0.3.9" - dependencies: - "@jridgewell/resolve-uri": ^3.0.3 - "@jridgewell/sourcemap-codec": ^1.4.10 - checksum: d89597752fd88d3f3480845691a05a44bd21faac18e2185b6f436c3b0fd0c5a859fbbd9aaa92050c4052caf325ad3e10e2e1d1b64327517471b7d51babc0ddef - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.9": - version: 0.3.17 - resolution: "@jridgewell/trace-mapping@npm:0.3.17" - dependencies: - "@jridgewell/resolve-uri": 3.1.0 - "@jridgewell/sourcemap-codec": 1.4.14 - checksum: 9d703b859cff5cd83b7308fd457a431387db5db96bd781a63bf48e183418dd9d3d44e76b9e4ae13237f6abeeb25d739ec9215c1d5bfdd08f66f750a50074a339 - languageName: node - linkType: hard - -"@metamask/eth-sig-util@npm:^4.0.0": - version: 4.0.1 - resolution: "@metamask/eth-sig-util@npm:4.0.1" - dependencies: - ethereumjs-abi: ^0.6.8 - ethereumjs-util: ^6.2.1 - ethjs-util: ^0.1.6 - tweetnacl: ^1.0.3 - tweetnacl-util: ^0.15.1 - checksum: 740df4c92a1282e6be4c00c86c1a8ccfb93e767596e43f6da895aa5bab4a28fc3c2209f0327db34924a4a1e9db72bc4d3dddfcfc45cca0b218c9ccbf7d1b1445 - languageName: node - linkType: hard - -"@morgan-stanley/ts-mocking-bird@npm:^0.6.2": - version: 0.6.4 - resolution: "@morgan-stanley/ts-mocking-bird@npm:0.6.4" - dependencies: - lodash: ^4.17.16 - uuid: ^7.0.3 - peerDependencies: - jasmine: 2.x || 3.x || 4.x - jest: 26.x || 27.x || 28.x - typescript: ">=4.2" - peerDependenciesMeta: - jasmine: - optional: true - jest: - optional: true - checksum: 7d788007c86b6b1455943105c71e5fe60c5087377f78cf6f8281d7f8978ed47322e4e8e6b21c137e5089389d141b0dd6f0e0b12dc53d440604abfa93a7463095 - languageName: node - linkType: hard - -"@noble/curves@npm:^1.2.0": - version: 1.2.0 - resolution: "@noble/curves@npm:1.2.0" - dependencies: - "@noble/hashes": 1.3.2 - checksum: bb798d7a66d8e43789e93bc3c2ddff91a1e19fdb79a99b86cd98f1e5eff0ee2024a2672902c2576ef3577b6f282f3b5c778bebd55761ddbb30e36bf275e83dd0 - languageName: node - linkType: hard - -"@noble/hashes@npm:1.2.0, @noble/hashes@npm:~1.2.0": - version: 1.2.0 - resolution: "@noble/hashes@npm:1.2.0" - checksum: 8ca080ce557b8f40fb2f78d3aedffd95825a415ac8e13d7ffe3643f8626a8c2d99a3e5975b555027ac24316d8b3c02a35b8358567c0c23af681e6573602aa434 - languageName: node - linkType: hard - -"@noble/hashes@npm:1.3.2, @noble/hashes@npm:^1.3.1": - version: 1.3.2 - resolution: "@noble/hashes@npm:1.3.2" - checksum: fe23536b436539d13f90e4b9be843cc63b1b17666a07634a2b1259dded6f490be3d050249e6af98076ea8f2ea0d56f578773c2197f2aa0eeaa5fba5bc18ba474 - languageName: node - linkType: hard - -"@noble/secp256k1@npm:1.7.1, @noble/secp256k1@npm:~1.7.0": - version: 1.7.1 - resolution: "@noble/secp256k1@npm:1.7.1" - checksum: d2301f1f7690368d8409a3152450458f27e54df47e3f917292de3de82c298770890c2de7c967d237eff9c95b70af485389a9695f73eb05a43e2bd562d18b18cb - languageName: node - linkType: hard - -"@nodelib/fs.scandir@npm:2.1.5": - version: 2.1.5 - resolution: "@nodelib/fs.scandir@npm:2.1.5" - dependencies: - "@nodelib/fs.stat": 2.0.5 - run-parallel: ^1.1.9 - checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59 - languageName: node - linkType: hard - -"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": - version: 2.0.5 - resolution: "@nodelib/fs.stat@npm:2.0.5" - checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 - languageName: node - linkType: hard - -"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": - version: 1.2.8 - resolution: "@nodelib/fs.walk@npm:1.2.8" - dependencies: - "@nodelib/fs.scandir": 2.1.5 - fastq: ^1.6.0 - checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53 - languageName: node - linkType: hard - -"@nomicfoundation/ethereumjs-block@npm:5.0.2": - version: 5.0.2 - resolution: "@nomicfoundation/ethereumjs-block@npm:5.0.2" - dependencies: - "@nomicfoundation/ethereumjs-common": 4.0.2 - "@nomicfoundation/ethereumjs-rlp": 5.0.2 - "@nomicfoundation/ethereumjs-trie": 6.0.2 - "@nomicfoundation/ethereumjs-tx": 5.0.2 - "@nomicfoundation/ethereumjs-util": 9.0.2 - ethereum-cryptography: 0.1.3 - ethers: ^5.7.1 - checksum: 7ff744f44a01f1c059ca7812a1cfc8089f87aa506af6cb39c78331dca71b32993cbd6fa05ad03f8c4f4fab73bb998a927af69e0d8ff01ae192ee5931606e09f5 - languageName: node - linkType: hard - -"@nomicfoundation/ethereumjs-blockchain@npm:7.0.2": - version: 7.0.2 - resolution: "@nomicfoundation/ethereumjs-blockchain@npm:7.0.2" - dependencies: - "@nomicfoundation/ethereumjs-block": 5.0.2 - "@nomicfoundation/ethereumjs-common": 4.0.2 - "@nomicfoundation/ethereumjs-ethash": 3.0.2 - "@nomicfoundation/ethereumjs-rlp": 5.0.2 - "@nomicfoundation/ethereumjs-trie": 6.0.2 - "@nomicfoundation/ethereumjs-tx": 5.0.2 - "@nomicfoundation/ethereumjs-util": 9.0.2 - abstract-level: ^1.0.3 - debug: ^4.3.3 - ethereum-cryptography: 0.1.3 - level: ^8.0.0 - lru-cache: ^5.1.1 - memory-level: ^1.0.0 - checksum: b7e440dcd73e32aa72d13bfd28cb472773c9c60ea808a884131bf7eb3f42286ad594a0864215f599332d800f3fe1f772fff4b138d2dcaa8f41e4d8389bff33e7 - languageName: node - linkType: hard - -"@nomicfoundation/ethereumjs-common@npm:4.0.2": - version: 4.0.2 - resolution: "@nomicfoundation/ethereumjs-common@npm:4.0.2" - dependencies: - "@nomicfoundation/ethereumjs-util": 9.0.2 - crc-32: ^1.2.0 - checksum: f0d84704d6254d374299c19884312bd5666974b4b6f342d3f10bc76e549de78d20e45a53d25fbdc146268a52335497127e4f069126da7c60ac933a158e704887 - languageName: node - linkType: hard - -"@nomicfoundation/ethereumjs-ethash@npm:3.0.2": - version: 3.0.2 - resolution: "@nomicfoundation/ethereumjs-ethash@npm:3.0.2" - dependencies: - "@nomicfoundation/ethereumjs-block": 5.0.2 - "@nomicfoundation/ethereumjs-rlp": 5.0.2 - "@nomicfoundation/ethereumjs-util": 9.0.2 - abstract-level: ^1.0.3 - bigint-crypto-utils: ^3.0.23 - ethereum-cryptography: 0.1.3 - checksum: e4011e4019dd9b92f7eeebfc1e6c9a9685c52d8fd0ee4f28f03e50048a23b600c714490827f59fdce497b3afb503b3fd2ebf6815ff307e9949c3efeff1403278 - languageName: node - linkType: hard - -"@nomicfoundation/ethereumjs-evm@npm:2.0.2": - version: 2.0.2 - resolution: "@nomicfoundation/ethereumjs-evm@npm:2.0.2" - dependencies: - "@ethersproject/providers": ^5.7.1 - "@nomicfoundation/ethereumjs-common": 4.0.2 - "@nomicfoundation/ethereumjs-tx": 5.0.2 - "@nomicfoundation/ethereumjs-util": 9.0.2 - debug: ^4.3.3 - ethereum-cryptography: 0.1.3 - mcl-wasm: ^0.7.1 - rustbn.js: ~0.2.0 - checksum: a23cf570836ddc147606b02df568069de946108e640f902358fef67e589f6b371d856056ee44299d9b4e3497f8ae25faa45e6b18fefd90e9b222dc6a761d85f0 - languageName: node - linkType: hard - -"@nomicfoundation/ethereumjs-rlp@npm:5.0.2": - version: 5.0.2 - resolution: "@nomicfoundation/ethereumjs-rlp@npm:5.0.2" - bin: - rlp: bin/rlp - checksum: a74434cadefca9aa8754607cc1ad7bb4bbea4ee61c6214918e60a5bbee83206850346eb64e39fd1fe97f854c7ec0163e01148c0c881dda23881938f0645a0ef2 - languageName: node - linkType: hard - -"@nomicfoundation/ethereumjs-statemanager@npm:2.0.2": - version: 2.0.2 - resolution: "@nomicfoundation/ethereumjs-statemanager@npm:2.0.2" - dependencies: - "@nomicfoundation/ethereumjs-common": 4.0.2 - "@nomicfoundation/ethereumjs-rlp": 5.0.2 - debug: ^4.3.3 - ethereum-cryptography: 0.1.3 - ethers: ^5.7.1 - js-sdsl: ^4.1.4 - checksum: 3ab6578e252e53609afd98d8ba42a99f182dcf80252f23ed9a5e0471023ffb2502130f85fc47fa7c94cd149f9be799ed9a0942ca52a143405be9267f4ad94e64 - languageName: node - linkType: hard - -"@nomicfoundation/ethereumjs-trie@npm:6.0.2": - version: 6.0.2 - resolution: "@nomicfoundation/ethereumjs-trie@npm:6.0.2" - dependencies: - "@nomicfoundation/ethereumjs-rlp": 5.0.2 - "@nomicfoundation/ethereumjs-util": 9.0.2 - "@types/readable-stream": ^2.3.13 - ethereum-cryptography: 0.1.3 - readable-stream: ^3.6.0 - checksum: d4da918d333851b9f2cce7dbd25ab5753e0accd43d562d98fd991b168b6a08d1794528f0ade40fe5617c84900378376fe6256cdbe52c8d66bf4c53293bbc7c40 - languageName: node - linkType: hard - -"@nomicfoundation/ethereumjs-tx@npm:5.0.2": - version: 5.0.2 - resolution: "@nomicfoundation/ethereumjs-tx@npm:5.0.2" - dependencies: - "@chainsafe/ssz": ^0.9.2 - "@ethersproject/providers": ^5.7.2 - "@nomicfoundation/ethereumjs-common": 4.0.2 - "@nomicfoundation/ethereumjs-rlp": 5.0.2 - "@nomicfoundation/ethereumjs-util": 9.0.2 - ethereum-cryptography: 0.1.3 - checksum: 0bbcea75786b2ccb559afe2ecc9866fb4566a9f157b6ffba4f50960d14f4b3da2e86e273f6fadda9b860e67cfcabf589970fb951b328cb5f900a585cd21842a2 - languageName: node - linkType: hard - -"@nomicfoundation/ethereumjs-util@npm:9.0.2": - version: 9.0.2 - resolution: "@nomicfoundation/ethereumjs-util@npm:9.0.2" - dependencies: - "@chainsafe/ssz": ^0.10.0 - "@nomicfoundation/ethereumjs-rlp": 5.0.2 - ethereum-cryptography: 0.1.3 - checksum: 3a08f7b88079ef9f53b43da9bdcb8195498fd3d3911c2feee2571f4d1204656053f058b2f650471c86f7d2d0ba2f814768c7cfb0f266eede41c848356afc4900 - languageName: node - linkType: hard - -"@nomicfoundation/ethereumjs-vm@npm:7.0.2": - version: 7.0.2 - resolution: "@nomicfoundation/ethereumjs-vm@npm:7.0.2" - dependencies: - "@nomicfoundation/ethereumjs-block": 5.0.2 - "@nomicfoundation/ethereumjs-blockchain": 7.0.2 - "@nomicfoundation/ethereumjs-common": 4.0.2 - "@nomicfoundation/ethereumjs-evm": 2.0.2 - "@nomicfoundation/ethereumjs-rlp": 5.0.2 - "@nomicfoundation/ethereumjs-statemanager": 2.0.2 - "@nomicfoundation/ethereumjs-trie": 6.0.2 - "@nomicfoundation/ethereumjs-tx": 5.0.2 - "@nomicfoundation/ethereumjs-util": 9.0.2 - debug: ^4.3.3 - ethereum-cryptography: 0.1.3 - mcl-wasm: ^0.7.1 - rustbn.js: ~0.2.0 - checksum: 1c25ba4d0644cadb8a2b0241a4bb02e578bfd7f70e3492b855c2ab5c120cb159cb8f7486f84dc1597884bd1697feedbfb5feb66e91352afb51f3694fd8e4a043 - languageName: node - linkType: hard - -"@nomicfoundation/hardhat-chai-matchers@npm:^1.0.4": - version: 1.0.6 - resolution: "@nomicfoundation/hardhat-chai-matchers@npm:1.0.6" - dependencies: - "@ethersproject/abi": ^5.1.2 - "@types/chai-as-promised": ^7.1.3 - chai-as-promised: ^7.1.1 - deep-eql: ^4.0.1 - ordinal: ^1.0.3 - peerDependencies: - "@nomiclabs/hardhat-ethers": ^2.0.0 - chai: ^4.2.0 - ethers: ^5.0.0 - hardhat: ^2.9.4 - checksum: c388e5ed9068f2ba7c227737ab7312dd03405d5fab195247b061f2fa52e700fbd0fb65359c2d4f2086f2905bfca642c19a9122d034533edd936f89aea65ac7f2 - languageName: node - linkType: hard - -"@nomicfoundation/hardhat-network-helpers@npm:^1.0.8": - version: 1.0.8 - resolution: "@nomicfoundation/hardhat-network-helpers@npm:1.0.8" - dependencies: - ethereumjs-util: ^7.1.4 - peerDependencies: - hardhat: ^2.9.5 - checksum: cf865301fa7a8cebf5c249bc872863d2e69f0f3d14cceadbc5d5761bd97745f38fdb17c9074d46ef0d3a75748f43c0e14d37a54a09ae3b7e0e981c7f437c8553 - languageName: node - linkType: hard - -"@nomicfoundation/hardhat-toolbox@npm:^2.0.0": - version: 2.0.2 - resolution: "@nomicfoundation/hardhat-toolbox@npm:2.0.2" - peerDependencies: - "@ethersproject/abi": ^5.4.7 - "@ethersproject/providers": ^5.4.7 - "@nomicfoundation/hardhat-chai-matchers": ^1.0.0 - "@nomicfoundation/hardhat-network-helpers": ^1.0.0 - "@nomiclabs/hardhat-ethers": ^2.0.0 - "@nomiclabs/hardhat-etherscan": ^3.0.0 - "@typechain/ethers-v5": ^10.1.0 - "@typechain/hardhat": ^6.1.2 - "@types/chai": ^4.2.0 - "@types/mocha": ">=9.1.0" - "@types/node": ">=12.0.0" - chai: ^4.2.0 - ethers: ^5.4.7 - hardhat: ^2.11.0 - hardhat-gas-reporter: ^1.0.8 - solidity-coverage: ^0.8.1 - ts-node: ">=8.0.0" - typechain: ^8.1.0 - typescript: ">=4.5.0" - checksum: a2eafb709acbabe40de4871c4e8684a03098f045dba4fc6c6e9281358d072f386a668488c109e2a36b8eade01dc4c4f9e8a76fa45c92591857c590c6e19f1ae7 - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer-darwin-arm64@npm:0.1.1": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer-darwin-arm64@npm:0.1.1" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer-darwin-x64@npm:0.1.1": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer-darwin-x64@npm:0.1.1" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer-freebsd-x64@npm:0.1.1": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer-freebsd-x64@npm:0.1.1" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@npm:0.1.1": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer-linux-arm64-gnu@npm:0.1.1" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer-linux-arm64-musl@npm:0.1.1": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer-linux-arm64-musl@npm:0.1.1" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer-linux-x64-gnu@npm:0.1.1": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer-linux-x64-gnu@npm:0.1.1" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer-linux-x64-musl@npm:0.1.1": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer-linux-x64-musl@npm:0.1.1" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@npm:0.1.1": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer-win32-arm64-msvc@npm:0.1.1" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@npm:0.1.1": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer-win32-ia32-msvc@npm:0.1.1" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer-win32-x64-msvc@npm:0.1.1": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer-win32-x64-msvc@npm:0.1.1" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer@npm:^0.1.0": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer@npm:0.1.1" - dependencies: - "@nomicfoundation/solidity-analyzer-darwin-arm64": 0.1.1 - "@nomicfoundation/solidity-analyzer-darwin-x64": 0.1.1 - "@nomicfoundation/solidity-analyzer-freebsd-x64": 0.1.1 - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": 0.1.1 - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": 0.1.1 - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": 0.1.1 - "@nomicfoundation/solidity-analyzer-linux-x64-musl": 0.1.1 - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": 0.1.1 - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": 0.1.1 - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": 0.1.1 - dependenciesMeta: - "@nomicfoundation/solidity-analyzer-darwin-arm64": - optional: true - "@nomicfoundation/solidity-analyzer-darwin-x64": - optional: true - "@nomicfoundation/solidity-analyzer-freebsd-x64": - optional: true - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": - optional: true - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": - optional: true - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": - optional: true - "@nomicfoundation/solidity-analyzer-linux-x64-musl": - optional: true - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": - optional: true - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": - optional: true - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": - optional: true - checksum: 038cffafd5769e25256b5b8bef88d95cc1c021274a65c020cf84aceb3237752a3b51645fdb0687f5516a2bdfebf166fcf50b08ab64857925100213e0654b266b - languageName: node - linkType: hard - -"@nomiclabs/hardhat-ethers@npm:^2.2.1": - version: 2.2.2 - resolution: "@nomiclabs/hardhat-ethers@npm:2.2.2" - peerDependencies: - ethers: ^5.0.0 - hardhat: ^2.0.0 - checksum: f7b880cbb3fbf809b5d01619112231be9ef8dc3c2880960d2382813fa19b783670ee2d982ebd43d8867281ad82854ca0d16626c013d0d834eb3b19a65dc0c851 - languageName: node - linkType: hard - -"@nomiclabs/hardhat-etherscan@npm:^3.1.2": - version: 3.1.7 - resolution: "@nomiclabs/hardhat-etherscan@npm:3.1.7" - dependencies: - "@ethersproject/abi": ^5.1.2 - "@ethersproject/address": ^5.0.2 - cbor: ^8.1.0 - chalk: ^2.4.2 - debug: ^4.1.1 - fs-extra: ^7.0.1 - lodash: ^4.17.11 - semver: ^6.3.0 - table: ^6.8.0 - undici: ^5.14.0 - peerDependencies: - hardhat: ^2.0.4 - checksum: 32d74e567e78a940a79cbe49c5dee0eb5cda0a4c0c34a9badfaf13d45e6054d9e717c28b8d2b0b20f29721a484af15a52d391fb60768222c4b13de92ef0f72b3 - languageName: node - linkType: hard - -"@npmcli/fs@npm:^2.1.0": - version: 2.1.2 - resolution: "@npmcli/fs@npm:2.1.2" - dependencies: - "@gar/promisify": ^1.1.3 - semver: ^7.3.5 - checksum: 405074965e72d4c9d728931b64d2d38e6ea12066d4fad651ac253d175e413c06fe4350970c783db0d749181da8fe49c42d3880bd1cbc12cd68e3a7964d820225 - languageName: node - linkType: hard - -"@npmcli/move-file@npm:^2.0.0": - version: 2.0.1 - resolution: "@npmcli/move-file@npm:2.0.1" - dependencies: - mkdirp: ^1.0.4 - rimraf: ^3.0.2 - checksum: 52dc02259d98da517fae4cb3a0a3850227bdae4939dda1980b788a7670636ca2b4a01b58df03dd5f65c1e3cb70c50fa8ce5762b582b3f499ec30ee5ce1fd9380 - languageName: node - linkType: hard - -"@openzeppelin/contracts-upgradeable-4.7.3@npm:@openzeppelin/contracts-upgradeable@v4.7.3": - version: 4.7.3 - resolution: "@openzeppelin/contracts-upgradeable@npm:4.7.3" - checksum: c9ffb40cb847a975d440204fc6a811f43af960050242f707332b984d29bd16dc242ffa0935de61867aeb9e0357fadedb16b09b276deda5e9775582face831021 - languageName: node - linkType: hard - -"@openzeppelin/contracts-upgradeable@npm:^4.7.3": - version: 4.9.6 - resolution: "@openzeppelin/contracts-upgradeable@npm:4.9.6" - checksum: 481075e7222cab025ae55304263fca69a2d04305521957bc16d2aece9fa2b86b6914711724822493e3d04df7e793469cd0bcb1e09f0ddd10cb4e360ac7eed12a - languageName: node - linkType: hard - -"@openzeppelin/contracts-upgradeable@npm:^4.8.1": - version: 4.8.2 - resolution: "@openzeppelin/contracts-upgradeable@npm:4.8.2" - checksum: b1ad40e5d0c4d3bcfea7c74b772fb2c830562f2863ea8f816a603113146e0614dc806b32d9b1649f8c88ceb93dbf8b394abf8dbeb9022fc09e546858c4fe71e9 - languageName: node - linkType: hard - -"@openzeppelin/contracts-upgradeable@npm:^v4.9.3": - version: 4.9.3 - resolution: "@openzeppelin/contracts-upgradeable@npm:4.9.3" - checksum: bda0240b1d44c913ec5a4e109c622f216c2bbd7b468d210822f75782a5f7fe0609d08bf03b78b253333625e99e507cf2f75212f1de3b274bd9fc64ae967aeec3 - languageName: node - linkType: hard - -"@openzeppelin/contracts-v0.7@npm:@openzeppelin/contracts@v3.4.2": - version: 3.4.2 - resolution: "@openzeppelin/contracts@npm:3.4.2" - checksum: 0c90f029fe50a49643588e4c8670dae3bbf31795133a6ddce9bdcbc258486332700bb732287baabf7bf807f39182fe8ea2ffa19aa5caf359b1b9c0f083280748 - languageName: node - linkType: hard - -"@openzeppelin/contracts@npm:^4.4.1": - version: 4.9.6 - resolution: "@openzeppelin/contracts@npm:4.9.6" - checksum: 274b6e968268294f12d5ca4f0278f6e6357792c8bb4d76664f83dbdc325f780541538a127e6a6e97e4f018088b42f65952014dec9c745c0fa25081f43ef9c4bf - languageName: node - linkType: hard - -"@openzeppelin/contracts@npm:^4.9.3": - version: 4.9.3 - resolution: "@openzeppelin/contracts@npm:4.9.3" - checksum: 4932063e733b35fa7669b9fe2053f69b062366c5c208b0c6cfa1ac451712100c78acff98120c3a4b88d94154c802be05d160d71f37e7d74cadbe150964458838 - languageName: node - linkType: hard - -"@openzeppelin/contracts@npm:~4.3.3, openzeppelin@npm:@openzeppelin/contracts@4.3.3": - version: 4.3.3 - resolution: "@openzeppelin/contracts@npm:4.3.3" - checksum: 73eb23e7acc8531931076d11251629bdc8579c99ef921a3facbd8abf7b860bc214c97a4bd56cd67db7c9d1db837765132640f24987aac8097a13960bb41ca6d1 - languageName: node - linkType: hard - -"@polytope-labs/solidity-merkle-trees@npm:^0.2.1": - version: 0.2.1 - resolution: "@polytope-labs/solidity-merkle-trees@npm:0.2.1" - checksum: c6808f104565a17305d3857932c87fb026d046bbe199ddb572bb2683758bee70fbda587585a2488c37832fe2524f45c4782516a6a497e00c57fc576a7499c6da - languageName: node - linkType: hard - -"@routerprotocol/evm-gateway-contracts@npm:^1.1.13": - version: 1.1.13 - resolution: "@routerprotocol/evm-gateway-contracts@npm:1.1.13" - dependencies: - "@openzeppelin/contracts": ^4.4.1 - "@openzeppelin/contracts-upgradeable": ^4.7.3 - checksum: 08898738eaf06d330a96ada9c1760ddc5ee8e3f7871eca425d1ce66a3c1496766d1509f40aec203b6f1dd6f077696fdf5c7e489ba3291f0377261e556d4999cc - languageName: node - linkType: hard - -"@scure/base@npm:~1.1.0": - version: 1.1.1 - resolution: "@scure/base@npm:1.1.1" - checksum: b4fc810b492693e7e8d0107313ac74c3646970c198bbe26d7332820886fa4f09441991023ec9aa3a2a51246b74409ab5ebae2e8ef148bbc253da79ac49130309 - languageName: node - linkType: hard - -"@scure/bip32@npm:1.1.5": - version: 1.1.5 - resolution: "@scure/bip32@npm:1.1.5" - dependencies: - "@noble/hashes": ~1.2.0 - "@noble/secp256k1": ~1.7.0 - "@scure/base": ~1.1.0 - checksum: b08494ab0d2b1efee7226d1b5100db5157ebea22a78bb87126982a76a186cb3048413e8be0ba2622d00d048a20acbba527af730de86c132a77de616eb9907a3b - languageName: node - linkType: hard - -"@scure/bip39@npm:1.1.1": - version: 1.1.1 - resolution: "@scure/bip39@npm:1.1.1" - dependencies: - "@noble/hashes": ~1.2.0 - "@scure/base": ~1.1.0 - checksum: fbb594c50696fa9c14e891d872f382e50a3f919b6c96c55ef2fb10c7102c546dafb8f099a62bd114c12a00525b595dcf7381846f383f0ddcedeaa6e210747d2f - languageName: node - linkType: hard - -"@sentry/core@npm:5.30.0": - version: 5.30.0 - resolution: "@sentry/core@npm:5.30.0" - dependencies: - "@sentry/hub": 5.30.0 - "@sentry/minimal": 5.30.0 - "@sentry/types": 5.30.0 - "@sentry/utils": 5.30.0 - tslib: ^1.9.3 - checksum: 8a2b22687e70d76fa4381bce215d770b6c08561c5ff5d6afe39c8c3c509c18ee7384ad0be3aee18d3a858a3c88e1d2821cf10eb5e05646376a33200903b56da2 - languageName: node - linkType: hard - -"@sentry/hub@npm:5.30.0": - version: 5.30.0 - resolution: "@sentry/hub@npm:5.30.0" - dependencies: - "@sentry/types": 5.30.0 - "@sentry/utils": 5.30.0 - tslib: ^1.9.3 - checksum: 09f778cc78765213f1e35a3ee6da3a8e02a706e8a7e5b7f84614707f4b665c7297b700a1849ab2ca1f02ede5884fd9ae893e58dc65f04f35ccdfee17e99ee93d - languageName: node - linkType: hard - -"@sentry/minimal@npm:5.30.0": - version: 5.30.0 - resolution: "@sentry/minimal@npm:5.30.0" - dependencies: - "@sentry/hub": 5.30.0 - "@sentry/types": 5.30.0 - tslib: ^1.9.3 - checksum: 934650f6989ce51f425c7c4b4d4d9bfecface8162a36d21df8a241f780ab1716dd47b81e2170e4cc624797ed1eebe10f71e4876c1e25b787860daaef75ca7a0c - languageName: node - linkType: hard - -"@sentry/node@npm:^5.18.1": - version: 5.30.0 - resolution: "@sentry/node@npm:5.30.0" - dependencies: - "@sentry/core": 5.30.0 - "@sentry/hub": 5.30.0 - "@sentry/tracing": 5.30.0 - "@sentry/types": 5.30.0 - "@sentry/utils": 5.30.0 - cookie: ^0.4.1 - https-proxy-agent: ^5.0.0 - lru_map: ^0.3.3 - tslib: ^1.9.3 - checksum: 5f0367cc52f9d716c64ba727e2a5c8592364494c8fdadfb3df2d0ee9d7956b886fb3ec674370292d2a7b7e1d9a8e1b84c69c06e8a4a064be8d4687698df0090c - languageName: node - linkType: hard - -"@sentry/tracing@npm:5.30.0": - version: 5.30.0 - resolution: "@sentry/tracing@npm:5.30.0" - dependencies: - "@sentry/hub": 5.30.0 - "@sentry/minimal": 5.30.0 - "@sentry/types": 5.30.0 - "@sentry/utils": 5.30.0 - tslib: ^1.9.3 - checksum: 720c07b111e8128e70a939ab4e9f9cfd13dc23303b27575afddabab08d08f9b94499017c76a9ffe253bf3ca40833e8f9262cf6dc546ba24da6eb74fedae5f92b - languageName: node - linkType: hard - -"@sentry/types@npm:5.30.0": - version: 5.30.0 - resolution: "@sentry/types@npm:5.30.0" - checksum: de7df777824c8e311f143c6fd7de220b24f25b5018312fe8f67d93bebf0f3cdd32bbca9f155846f5c31441d940eebe27c8338000321559a743264c7e41dda560 - languageName: node - linkType: hard - -"@sentry/utils@npm:5.30.0": - version: 5.30.0 - resolution: "@sentry/utils@npm:5.30.0" - dependencies: - "@sentry/types": 5.30.0 - tslib: ^1.9.3 - checksum: 27b259a136c664427641dd32ee3dc490553f3b5e92986accfa829d14063ebc69b191e92209ac9c40fbc367f74cfa17dc93b4c40981d666711fd57b4d51a82062 - languageName: node - linkType: hard - -"@solana/buffer-layout@npm:^4.0.0": - version: 4.0.1 - resolution: "@solana/buffer-layout@npm:4.0.1" - dependencies: - buffer: ~6.0.3 - checksum: bf846888e813187243d4008a7a9f58b49d16cbd995b9d7f1b72898aa510ed77b1ce5e8468e7b2fd26dd81e557a4e74a666e21fccb95f123c1f740d41138bbacd - languageName: node - linkType: hard - -"@solana/web3.js@npm:^1.78.0": - version: 1.87.5 - resolution: "@solana/web3.js@npm:1.87.5" - dependencies: - "@babel/runtime": ^7.23.2 - "@noble/curves": ^1.2.0 - "@noble/hashes": ^1.3.1 - "@solana/buffer-layout": ^4.0.0 - agentkeepalive: ^4.3.0 - bigint-buffer: ^1.1.5 - bn.js: ^5.2.1 - borsh: ^0.7.0 - bs58: ^4.0.1 - buffer: 6.0.3 - fast-stable-stringify: ^1.0.0 - jayson: ^4.1.0 - node-fetch: ^2.6.12 - rpc-websockets: ^7.5.1 - superstruct: ^0.14.2 - checksum: 3435479f70715edaa647ac9e0c67a6dc8daa55e6cf4d9026cea867217fc64e2febabb89133c477fbc26a40501be994d2e260a780f8b4747da4b6d4a288e59aec - languageName: node - linkType: hard - -"@solidity-parser/parser@npm:^0.14.0, @solidity-parser/parser@npm:^0.14.1": - version: 0.14.5 - resolution: "@solidity-parser/parser@npm:0.14.5" - dependencies: - antlr4ts: ^0.5.0-alpha.4 - checksum: 9e85a0d4f8a05a11db6022444b70b2f353e2358467b1cce44cdda703ae1e3c7337e1b8cbc2eec8e14a8f34f9c60b42f325e5fe9b3c934cc980e35091e292d7ee - languageName: node - linkType: hard - -"@solidity-parser/parser@npm:^0.16.0": - version: 0.16.0 - resolution: "@solidity-parser/parser@npm:0.16.0" - dependencies: - antlr4ts: ^0.5.0-alpha.4 - checksum: 6ccbdab334331a58fde2a739cff76d5a99d836186b7899e8e027266f2af2a4bddc77c9c2abd01307cea6c470345d48edc470049e9672143b73f4aff3c8976183 - languageName: node - linkType: hard - -"@tootallnate/once@npm:2": - version: 2.0.0 - resolution: "@tootallnate/once@npm:2.0.0" - checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 - languageName: node - linkType: hard - -"@trivago/prettier-plugin-sort-imports@npm:^4.0.0": - version: 4.1.1 - resolution: "@trivago/prettier-plugin-sort-imports@npm:4.1.1" - dependencies: - "@babel/generator": 7.17.7 - "@babel/parser": ^7.20.5 - "@babel/traverse": 7.17.3 - "@babel/types": 7.17.0 - javascript-natural-sort: 0.7.1 - lodash: ^4.17.21 - peerDependencies: - "@vue/compiler-sfc": 3.x - prettier: 2.x - peerDependenciesMeta: - "@vue/compiler-sfc": - optional: true - checksum: 09b4c3c3f4a9e7883737acf92ae7f2a59eb3f7a6f104621a883bdb2a962dcf98398891489267a6fdbba1227a3484676f8d7470e1b3bc6422b4f457382fd030ce - languageName: node - linkType: hard - -"@tsconfig/node10@npm:^1.0.7": - version: 1.0.9 - resolution: "@tsconfig/node10@npm:1.0.9" - checksum: a33ae4dc2a621c0678ac8ac4bceb8e512ae75dac65417a2ad9b022d9b5411e863c4c198b6ba9ef659e14b9fb609bbec680841a2e84c1172df7a5ffcf076539df - languageName: node - linkType: hard - -"@tsconfig/node12@npm:^1.0.7": - version: 1.0.11 - resolution: "@tsconfig/node12@npm:1.0.11" - checksum: 5ce29a41b13e7897a58b8e2df11269c5395999e588b9a467386f99d1d26f6c77d1af2719e407621412520ea30517d718d5192a32403b8dfcc163bf33e40a338a - languageName: node - linkType: hard - -"@tsconfig/node14@npm:^1.0.0": - version: 1.0.3 - resolution: "@tsconfig/node14@npm:1.0.3" - checksum: 19275fe80c4c8d0ad0abed6a96dbf00642e88b220b090418609c4376e1cef81bf16237bf170ad1b341452feddb8115d8dd2e5acdfdea1b27422071163dc9ba9d - languageName: node - linkType: hard - -"@tsconfig/node16@npm:^1.0.2": - version: 1.0.3 - resolution: "@tsconfig/node16@npm:1.0.3" - checksum: 3a8b657dd047495b7ad23437d6afd20297ce90380ff0bdee93fc7d39a900dbd8d9e26e53ff6b465e7967ce2adf0b218782590ce9013285121e6a5928fbd6819f - languageName: node - linkType: hard - -"@typechain/ethers-v5@npm:^10.1.1": - version: 10.2.0 - resolution: "@typechain/ethers-v5@npm:10.2.0" - dependencies: - lodash: ^4.17.15 - ts-essentials: ^7.0.1 - peerDependencies: - "@ethersproject/abi": ^5.0.0 - "@ethersproject/bytes": ^5.0.0 - "@ethersproject/providers": ^5.0.0 - ethers: ^5.1.3 - typechain: ^8.1.1 - typescript: ">=4.3.0" - checksum: 22f7109f22a6e2b459c45aaf5424143b6129455659aa132ab447ed14d24bb68a6b3b4021008244faca743d469208037a7766d3d9c3ab49db42d36f4e382887c4 - languageName: node - linkType: hard - -"@typechain/hardhat@npm:^6.1.4": - version: 6.1.5 - resolution: "@typechain/hardhat@npm:6.1.5" - dependencies: - fs-extra: ^9.1.0 - peerDependencies: - "@ethersproject/abi": ^5.4.7 - "@ethersproject/providers": ^5.4.7 - "@typechain/ethers-v5": ^10.2.0 - ethers: ^5.4.7 - hardhat: ^2.9.9 - typechain: ^8.1.1 - checksum: ccb4df6eae69d6560125d6eb014989d0097213818d0fdf91a077bacee746f39356de6d11b3f582d55df7d6924bcfffc31e412502bbbe3a5be8e3310197ce4f61 - languageName: node - linkType: hard - -"@types/bn.js@npm:^4.11.3": - version: 4.11.6 - resolution: "@types/bn.js@npm:4.11.6" - dependencies: - "@types/node": "*" - checksum: 7f66f2c7b7b9303b3205a57184261974b114495736b77853af5b18d857c0b33e82ce7146911e86e87a87837de8acae28986716fd381ac7c301fd6e8d8b6c811f - languageName: node - linkType: hard - -"@types/bn.js@npm:^5.1.0": - version: 5.1.1 - resolution: "@types/bn.js@npm:5.1.1" - dependencies: - "@types/node": "*" - checksum: e50ed2dd3abe997e047caf90e0352c71e54fc388679735217978b4ceb7e336e51477791b715f49fd77195ac26dd296c7bad08a3be9750e235f9b2e1edb1b51c2 - languageName: node - linkType: hard - -"@types/chai-as-promised@npm:^7.1.3": - version: 7.1.5 - resolution: "@types/chai-as-promised@npm:7.1.5" - dependencies: - "@types/chai": "*" - checksum: 7c1345c6e32513d52d8e562ec173c23161648d6b792046525f18803a9932d7b3ad3dca8f0181e3c529ec42b106099f174e34edeb184d61dc93e32c98b5132fd4 - languageName: node - linkType: hard - -"@types/chai@npm:*, @types/chai@npm:^4.3.4": - version: 4.3.4 - resolution: "@types/chai@npm:4.3.4" - checksum: 571184967beb03bf64c4392a13a7d44e72da9af5a1e83077ff81c39cf59c0fda2a5c78d2005084601cf8f3d11726608574d8b5b4a0e3e9736792807afd926cd0 - languageName: node - linkType: hard - -"@types/concat-stream@npm:^1.6.0": - version: 1.6.1 - resolution: "@types/concat-stream@npm:1.6.1" - dependencies: - "@types/node": "*" - checksum: 7d211e74331affd3578b5469244f5cef84a93775f38332adb3ef12413559a23862bc682c6873d0a404b01c9d5d5f7d3ae091fe835b435b633eb420e3055b3e56 - languageName: node - linkType: hard - -"@types/connect@npm:^3.4.33": - version: 3.4.38 - resolution: "@types/connect@npm:3.4.38" - dependencies: - "@types/node": "*" - checksum: 7eb1bc5342a9604facd57598a6c62621e244822442976c443efb84ff745246b10d06e8b309b6e80130026a396f19bf6793b7cecd7380169f369dac3bfc46fb99 - languageName: node - linkType: hard - -"@types/form-data@npm:0.0.33": - version: 0.0.33 - resolution: "@types/form-data@npm:0.0.33" - dependencies: - "@types/node": "*" - checksum: f0c283fdef2dd7191168a37b9cb2625af3cfbd7f72b5a514f938bea0a135669f79d736186d434b9e81150b47ef1bf20d97b188014a00583556fad6ce59fb9bbf - languageName: node - linkType: hard - -"@types/fs-extra@npm:^9.0.13": - version: 9.0.13 - resolution: "@types/fs-extra@npm:9.0.13" - dependencies: - "@types/node": "*" - checksum: add79e212acd5ac76b97b9045834e03a7996aef60a814185e0459088fd290519a3c1620865d588fa36c4498bf614210d2a703af5cf80aa1dbc125db78f6edac3 - languageName: node - linkType: hard - -"@types/glob@npm:^7.1.1": - version: 7.2.0 - resolution: "@types/glob@npm:7.2.0" - dependencies: - "@types/minimatch": "*" - "@types/node": "*" - checksum: 6ae717fedfdfdad25f3d5a568323926c64f52ef35897bcac8aca8e19bc50c0bd84630bbd063e5d52078b2137d8e7d3c26eabebd1a2f03ff350fff8a91e79fc19 - languageName: node - linkType: hard - -"@types/json-schema@npm:^7.0.9": - version: 7.0.11 - resolution: "@types/json-schema@npm:7.0.11" - checksum: 527bddfe62db9012fccd7627794bd4c71beb77601861055d87e3ee464f2217c85fca7a4b56ae677478367bbd248dbde13553312b7d4dbc702a2f2bbf60c4018d - languageName: node - linkType: hard - -"@types/lru-cache@npm:^5.1.0": - version: 5.1.1 - resolution: "@types/lru-cache@npm:5.1.1" - checksum: e1d6c0085f61b16ec5b3073ec76ad1be4844ea036561c3f145fc19f71f084b58a6eb600b14128aa95809d057d28f1d147c910186ae51219f58366ffd2ff2e118 - languageName: node - linkType: hard - -"@types/minimatch@npm:*": - version: 5.1.2 - resolution: "@types/minimatch@npm:5.1.2" - checksum: 0391a282860c7cb6fe262c12b99564732401bdaa5e395bee9ca323c312c1a0f45efbf34dce974682036e857db59a5c9b1da522f3d6055aeead7097264c8705a8 - languageName: node - linkType: hard - -"@types/minimist@npm:^1.2.0": - version: 1.2.2 - resolution: "@types/minimist@npm:1.2.2" - checksum: b8da83c66eb4aac0440e64674b19564d9d86c80ae273144db9681e5eeff66f238ade9515f5006ffbfa955ceff8b89ad2bd8ec577d7caee74ba101431fb07045d - languageName: node - linkType: hard - -"@types/mkdirp@npm:^0.5.2": - version: 0.5.2 - resolution: "@types/mkdirp@npm:0.5.2" - dependencies: - "@types/node": "*" - checksum: 21e6681ee18cee6314dbe0f57ada48981912b76de8266f438ba2573770d60aaa8dd376baad3f20e2346696a7cca84b0aadd1737222341553a0091831a46e6ad1 - languageName: node - linkType: hard - -"@types/mocha@npm:^10.0.0": - version: 10.0.1 - resolution: "@types/mocha@npm:10.0.1" - checksum: 224ea9fce7b1734ccdb9aa99a622d902a538ce1847bca7fd22c5fb38adcf3ed536f50f48f587085db988a4bb3c2eb68f4b98e1cd6a38bc5547bd3bbbedc54495 - languageName: node - linkType: hard - -"@types/node@npm:*, @types/node@npm:^18.11.9": - version: 18.15.11 - resolution: "@types/node@npm:18.15.11" - checksum: 977b4ad04708897ff0eb049ecf82246d210939c82461922d20f7d2dcfd81bbc661582ba3af28869210f7e8b1934529dcd46bff7d448551400f9d48b9d3bddec3 - languageName: node - linkType: hard - -"@types/node@npm:^10.0.3": - version: 10.17.60 - resolution: "@types/node@npm:10.17.60" - checksum: 2cdb3a77d071ba8513e5e8306fa64bf50e3c3302390feeaeff1fd325dd25c8441369715dfc8e3701011a72fed5958c7dfa94eb9239a81b3c286caa4d97db6eef - languageName: node - linkType: hard - -"@types/node@npm:^12.12.54": - version: 12.20.55 - resolution: "@types/node@npm:12.20.55" - checksum: e4f86785f4092706e0d3b0edff8dca5a13b45627e4b36700acd8dfe6ad53db71928c8dee914d4276c7fd3b6ccd829aa919811c9eb708a2c8e4c6eb3701178c37 - languageName: node - linkType: hard - -"@types/node@npm:^8.0.0": - version: 8.10.66 - resolution: "@types/node@npm:8.10.66" - checksum: c52039de862654a139abdc6a51de532a69dd80516ac35a959c3b3a2831ecbaaf065b0df5f9db943f5e28b544ebb9a891730d52b52f7a169b86a82bc060210000 - languageName: node - linkType: hard - -"@types/normalize-package-data@npm:^2.4.0": - version: 2.4.1 - resolution: "@types/normalize-package-data@npm:2.4.1" - checksum: e87bccbf11f95035c89a132b52b79ce69a1e3652fe55962363063c9c0dae0fe2477ebc585e03a9652adc6f381d24ba5589cc5e51849df4ced3d3e004a7d40ed5 - languageName: node - linkType: hard - -"@types/pbkdf2@npm:^3.0.0": - version: 3.1.0 - resolution: "@types/pbkdf2@npm:3.1.0" - dependencies: - "@types/node": "*" - checksum: d15024b1957c21cf3b8887329d9bd8dfde754cf13a09d76ae25f1391cfc62bb8b8d7b760773c5dbaa748172fba8b3e0c3dbe962af6ccbd69b76df12a48dfba40 - languageName: node - linkType: hard - -"@types/prettier@npm:^2.1.1": - version: 2.7.2 - resolution: "@types/prettier@npm:2.7.2" - checksum: b47d76a5252265f8d25dd2fe2a5a61dc43ba0e6a96ffdd00c594cb4fd74c1982c2e346497e3472805d97915407a09423804cc2110a0b8e1b22cffcab246479b7 - languageName: node - linkType: hard - -"@types/qs@npm:^6.2.31, @types/qs@npm:^6.9.7": - version: 6.9.7 - resolution: "@types/qs@npm:6.9.7" - checksum: 7fd6f9c25053e9b5bb6bc9f9f76c1d89e6c04f7707a7ba0e44cc01f17ef5284adb82f230f542c2d5557d69407c9a40f0f3515e8319afd14e1e16b5543ac6cdba - languageName: node - linkType: hard - -"@types/readable-stream@npm:^2.3.13": - version: 2.3.15 - resolution: "@types/readable-stream@npm:2.3.15" - dependencies: - "@types/node": "*" - safe-buffer: ~5.1.1 - checksum: ec36f525cad09b6c65a1dafcb5ad99b9e2ed824ec49b7aa23180ac427e5d35b8a0706193ecd79ab4253a283ad485ba03d5917a98daaaa144f0ea34f4823e9d82 - languageName: node - linkType: hard - -"@types/resolve@npm:^0.0.8": - version: 0.0.8 - resolution: "@types/resolve@npm:0.0.8" - dependencies: - "@types/node": "*" - checksum: f241bb773ab14b14500623ac3b57c52006ce32b20426b6d8bf2fe5fdc0344f42c77ac0f94ff57b443ae1d320a1a86c62b4e47239f0321699404402fbeb24bad6 - languageName: node - linkType: hard - -"@types/secp256k1@npm:^4.0.1": - version: 4.0.3 - resolution: "@types/secp256k1@npm:4.0.3" - dependencies: - "@types/node": "*" - checksum: 1bd10b9afa724084b655dc81b7b315def3d2d0e272014ef16009fa76e17537411c07c0695fdea412bc7b36d2a02687f5fea33522d55b8ef29eda42992f812913 - languageName: node - linkType: hard - -"@types/semver@npm:^7.3.12": - version: 7.3.13 - resolution: "@types/semver@npm:7.3.13" - checksum: 00c0724d54757c2f4bc60b5032fe91cda6410e48689633d5f35ece8a0a66445e3e57fa1d6e07eb780f792e82ac542948ec4d0b76eb3484297b79bd18b8cf1cb0 - languageName: node - linkType: hard - -"@types/ws@npm:^7.4.4": - version: 7.4.7 - resolution: "@types/ws@npm:7.4.7" - dependencies: - "@types/node": "*" - checksum: b4c9b8ad209620c9b21e78314ce4ff07515c0cadab9af101c1651e7bfb992d7fd933bd8b9c99d110738fd6db523ed15f82f29f50b45510288da72e964dedb1a3 - languageName: node - linkType: hard - -"@typescript-eslint/eslint-plugin@npm:^5.44.0": - version: 5.57.1 - resolution: "@typescript-eslint/eslint-plugin@npm:5.57.1" - dependencies: - "@eslint-community/regexpp": ^4.4.0 - "@typescript-eslint/scope-manager": 5.57.1 - "@typescript-eslint/type-utils": 5.57.1 - "@typescript-eslint/utils": 5.57.1 - debug: ^4.3.4 - grapheme-splitter: ^1.0.4 - ignore: ^5.2.0 - natural-compare-lite: ^1.4.0 - semver: ^7.3.7 - tsutils: ^3.21.0 - peerDependencies: - "@typescript-eslint/parser": ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 3ea842ef9615e298e28c6687c4dc285577ea0995944410553b3ca514ce9d437534b6e89114e9398c1a370324afe7a4a251c8c49540bb3bf13dcadde9ada3ecc2 - languageName: node - linkType: hard - -"@typescript-eslint/parser@npm:^5.44.0": - version: 5.57.1 - resolution: "@typescript-eslint/parser@npm:5.57.1" - dependencies: - "@typescript-eslint/scope-manager": 5.57.1 - "@typescript-eslint/types": 5.57.1 - "@typescript-eslint/typescript-estree": 5.57.1 - debug: ^4.3.4 - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: db61a12a67bc45d814297e7f089768c0849f18162b330279aa15121223ec3b18d80df4c327f4ca0a40a7bddb9150ba1a9379fce00bc0e4a10cc189d04e36f0e3 - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:5.57.1": - version: 5.57.1 - resolution: "@typescript-eslint/scope-manager@npm:5.57.1" - dependencies: - "@typescript-eslint/types": 5.57.1 - "@typescript-eslint/visitor-keys": 5.57.1 - checksum: 4f03d54372f0591fbc5f6e0267a6f1b73e3012e8a319c1893829e0b8e71f882e17a696995dc8b11e700162daf74444fd2d8f55dba314e1a95221a9d3eabcfb2b - languageName: node - linkType: hard - -"@typescript-eslint/type-utils@npm:5.57.1": - version: 5.57.1 - resolution: "@typescript-eslint/type-utils@npm:5.57.1" - dependencies: - "@typescript-eslint/typescript-estree": 5.57.1 - "@typescript-eslint/utils": 5.57.1 - debug: ^4.3.4 - tsutils: ^3.21.0 - peerDependencies: - eslint: "*" - peerDependenciesMeta: - typescript: - optional: true - checksum: 06fab95315fc1ffdaaa011e6ec1ae538826ef3d9b422e2c926dbe9b83e55d9e8bdaa07c43317a4c0a59b40a24c5c48a7c8284e6a18780475a65894b1b949fc23 - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:5.57.1": - version: 5.57.1 - resolution: "@typescript-eslint/types@npm:5.57.1" - checksum: 21789eb697904bbb44a18df961d5918e7c5bd90c79df3a8b8b835da81d0c0f42c7eeb2d05f77cafe49a7367ae7f549a0c8281656ea44b6dc56ae1bf19a3a1eae - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:5.57.1": - version: 5.57.1 - resolution: "@typescript-eslint/typescript-estree@npm:5.57.1" - dependencies: - "@typescript-eslint/types": 5.57.1 - "@typescript-eslint/visitor-keys": 5.57.1 - debug: ^4.3.4 - globby: ^11.1.0 - is-glob: ^4.0.3 - semver: ^7.3.7 - tsutils: ^3.21.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: bf96520f6de562838a40c3f009fc61fbee5369621071cd0d1dba4470b2b2f746cf79afe4ffa3fbccb8913295a2fbb3d89681d5178529e8da4987c46ed4e5cbed - languageName: node - linkType: hard - -"@typescript-eslint/utils@npm:5.57.1": - version: 5.57.1 - resolution: "@typescript-eslint/utils@npm:5.57.1" - dependencies: - "@eslint-community/eslint-utils": ^4.2.0 - "@types/json-schema": ^7.0.9 - "@types/semver": ^7.3.12 - "@typescript-eslint/scope-manager": 5.57.1 - "@typescript-eslint/types": 5.57.1 - "@typescript-eslint/typescript-estree": 5.57.1 - eslint-scope: ^5.1.1 - semver: ^7.3.7 - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 12e55144c8087f4e8f0f22e5693f3901b81bb7899dec42c7bfe540ac672a802028b688884bb43bd67bcf3cd3546a7205d207afcd948c731c19f551ea61267205 - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:5.57.1": - version: 5.57.1 - resolution: "@typescript-eslint/visitor-keys@npm:5.57.1" - dependencies: - "@typescript-eslint/types": 5.57.1 - eslint-visitor-keys: ^3.3.0 - checksum: d187dfac044b7c0f24264a9ba5eebcf6651412d840b4aaba8eacabff7e771babcd67c738525b1f7c9eb8c94b7edfe7658f6de99f5fdc9745e409c538c1374674 - languageName: node - linkType: hard - -"JSONStream@npm:^1.0.4, JSONStream@npm:^1.3.5": - version: 1.3.5 - resolution: "JSONStream@npm:1.3.5" - dependencies: - jsonparse: ^1.2.0 - through: ">=2.2.7 <3" - bin: - JSONStream: ./bin.js - checksum: 2605fa124260c61bad38bb65eba30d2f72216a78e94d0ab19b11b4e0327d572b8d530c0c9cc3b0764f727ad26d39e00bf7ebad57781ca6368394d73169c59e46 - languageName: node - linkType: hard - -"abbrev@npm:1, abbrev@npm:^1.0.0": - version: 1.1.1 - resolution: "abbrev@npm:1.1.1" - checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 - languageName: node - linkType: hard - -"abbrev@npm:1.0.x": - version: 1.0.9 - resolution: "abbrev@npm:1.0.9" - checksum: 46460c897b4ce62cd9b1bd4a853cc46e771a1f1d929f5443f3945a976f8be5388891bf9e5f8a9862baa29587349e16c48596b6a621404d46d3b184fe9bd9fb26 - languageName: node - linkType: hard - -"abstract-level@npm:^1.0.0, abstract-level@npm:^1.0.2, abstract-level@npm:^1.0.3": - version: 1.0.3 - resolution: "abstract-level@npm:1.0.3" - dependencies: - buffer: ^6.0.3 - catering: ^2.1.0 - is-buffer: ^2.0.5 - level-supports: ^4.0.0 - level-transcoder: ^1.0.1 - module-error: ^1.0.1 - queue-microtask: ^1.2.3 - checksum: 70d61a3924526ebc257b138992052f9ff571a6cee5a7660836e37a1cc7081273c3acf465dd2f5e1897b38dc743a6fd9dba14a5d8a2a9d39e5787cd3da99f301d - languageName: node - linkType: hard - -"acorn-jsx@npm:^5.3.2": - version: 5.3.2 - resolution: "acorn-jsx@npm:5.3.2" - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: c3d3b2a89c9a056b205b69530a37b972b404ee46ec8e5b341666f9513d3163e2a4f214a71f4dfc7370f5a9c07472d2fd1c11c91c3f03d093e37637d95da98950 - languageName: node - linkType: hard - -"acorn-walk@npm:^8.1.1": - version: 8.2.0 - resolution: "acorn-walk@npm:8.2.0" - checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1 - languageName: node - linkType: hard - -"acorn@npm:^8.4.1, acorn@npm:^8.8.0": - version: 8.8.2 - resolution: "acorn@npm:8.8.2" - bin: - acorn: bin/acorn - checksum: f790b99a1bf63ef160c967e23c46feea7787e531292bb827126334612c234ed489a0dc2c7ba33156416f0ffa8d25bf2b0fdb7f35c2ba60eb3e960572bece4001 - languageName: node - linkType: hard - -"address@npm:^1.0.1": - version: 1.2.2 - resolution: "address@npm:1.2.2" - checksum: ace439960c1e3564d8f523aff23a841904bf33a2a7c2e064f7f60a064194075758b9690e65bd9785692a4ef698a998c57eb74d145881a1cecab8ba658ddb1607 - languageName: node - linkType: hard - -"adm-zip@npm:^0.4.16": - version: 0.4.16 - resolution: "adm-zip@npm:0.4.16" - checksum: 5ea46664d8b3b073fffeb7f934705fea288708745e708cffc1dd732ce3d2672cecd476b243f9d051892fd12952db2b6bd061975e1ff40057246f6d0cb6534a50 - languageName: node - linkType: hard - -"aes-js@npm:3.0.0": - version: 3.0.0 - resolution: "aes-js@npm:3.0.0" - checksum: 251e26d533cd1a915b44896b17d5ed68c24a02484cfdd2e74ec700a309267db96651ea4eb657bf20aac32a3baa61f6e34edf8e2fec2de440a655da9942d334b8 - languageName: node - linkType: hard - -"agent-base@npm:6, agent-base@npm:^6.0.2": - version: 6.0.2 - resolution: "agent-base@npm:6.0.2" - dependencies: - debug: 4 - checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d - languageName: node - linkType: hard - -"agentkeepalive@npm:^4.2.1": - version: 4.3.0 - resolution: "agentkeepalive@npm:4.3.0" - dependencies: - debug: ^4.1.0 - depd: ^2.0.0 - humanize-ms: ^1.2.1 - checksum: 982453aa44c11a06826c836025e5162c846e1200adb56f2d075400da7d32d87021b3b0a58768d949d824811f5654223d5a8a3dad120921a2439625eb847c6260 - languageName: node - linkType: hard - -"agentkeepalive@npm:^4.3.0": - version: 4.5.0 - resolution: "agentkeepalive@npm:4.5.0" - dependencies: - humanize-ms: ^1.2.1 - checksum: 13278cd5b125e51eddd5079f04d6fe0914ac1b8b91c1f3db2c1822f99ac1a7457869068997784342fe455d59daaff22e14fb7b8c3da4e741896e7e31faf92481 - languageName: node - linkType: hard - -"aggregate-error@npm:^3.0.0": - version: 3.1.0 - resolution: "aggregate-error@npm:3.1.0" - dependencies: - clean-stack: ^2.0.0 - indent-string: ^4.0.0 - checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 - languageName: node - linkType: hard - -"ajv@npm:^6.10.0, ajv@npm:^6.12.3, ajv@npm:^6.12.4, ajv@npm:^6.12.6": - version: 6.12.6 - resolution: "ajv@npm:6.12.6" - 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 - checksum: 874972efe5c4202ab0a68379481fbd3d1b5d0a7bd6d3cc21d40d3536ebff3352a2a1fabb632d4fd2cc7fe4cbdcd5ed6782084c9bbf7f32a1536d18f9da5007d4 - languageName: node - linkType: hard - -"ajv@npm:^8.0.1, ajv@npm:^8.11.0": - version: 8.12.0 - resolution: "ajv@npm:8.12.0" - dependencies: - fast-deep-equal: ^3.1.1 - json-schema-traverse: ^1.0.0 - require-from-string: ^2.0.2 - uri-js: ^4.2.2 - checksum: 4dc13714e316e67537c8b31bc063f99a1d9d9a497eb4bbd55191ac0dcd5e4985bbb71570352ad6f1e76684fb6d790928f96ba3b2d4fd6e10024be9612fe3f001 - languageName: node - linkType: hard - -"amdefine@npm:>=0.0.4": - version: 1.0.1 - resolution: "amdefine@npm:1.0.1" - checksum: 9d4e15b94641643a9385b2841b4cb2bcf4e8e2f741ea4bd475c93ad7bab261ad4ed827a32e9c549b38b98759c4526c173ae4e6dde8caeb75ee5cebedc9863762 - languageName: node - linkType: hard - -"ansi-colors@npm:3.2.3": - version: 3.2.3 - resolution: "ansi-colors@npm:3.2.3" - checksum: 018a92fbf8b143feb9e00559655072598902ff2cdfa07dbe24b933c70ae04845e3dda2c091ab128920fc50b3db06c3f09947f49fcb287d53beb6c5869b8bb32b - languageName: node - linkType: hard - -"ansi-colors@npm:4.1.1": - version: 4.1.1 - resolution: "ansi-colors@npm:4.1.1" - checksum: 138d04a51076cb085da0a7e2d000c5c0bb09f6e772ed5c65c53cb118d37f6c5f1637506d7155fb5f330f0abcf6f12fa2e489ac3f8cdab9da393bf1bb4f9a32b0 - languageName: node - linkType: hard - -"ansi-colors@npm:^4.1.1": - version: 4.1.3 - resolution: "ansi-colors@npm:4.1.3" - checksum: a9c2ec842038a1fabc7db9ece7d3177e2fe1c5dc6f0c51ecfbf5f39911427b89c00b5dc6b8bd95f82a26e9b16aaae2e83d45f060e98070ce4d1333038edceb0e - languageName: node - linkType: hard - -"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.0": - version: 4.3.2 - resolution: "ansi-escapes@npm:4.3.2" - dependencies: - type-fest: ^0.21.3 - checksum: 93111c42189c0a6bed9cdb4d7f2829548e943827ee8479c74d6e0b22ee127b2a21d3f8b5ca57723b8ef78ce011fbfc2784350eb2bde3ccfccf2f575fa8489815 - languageName: node - linkType: hard - -"ansi-regex@npm:^3.0.0": - version: 3.0.1 - resolution: "ansi-regex@npm:3.0.1" - checksum: 09daf180c5f59af9850c7ac1bd7fda85ba596cc8cbeb210826e90755f06c818af86d9fa1e6e8322fab2c3b9e9b03f56c537b42241139f824dd75066a1e7257cc - languageName: node - linkType: hard - -"ansi-regex@npm:^4.1.0": - version: 4.1.1 - resolution: "ansi-regex@npm:4.1.1" - checksum: b1a6ee44cb6ecdabaa770b2ed500542714d4395d71c7e5c25baa631f680fb2ad322eb9ba697548d498a6fd366949fc8b5bfcf48d49a32803611f648005b01888 - languageName: node - linkType: hard - -"ansi-regex@npm:^5.0.1": - version: 5.0.1 - resolution: "ansi-regex@npm:5.0.1" - checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b - languageName: node - linkType: hard - -"ansi-regex@npm:^6.0.1": - version: 6.0.1 - resolution: "ansi-regex@npm:6.0.1" - checksum: 1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 - languageName: node - linkType: hard - -"ansi-styles@npm:^3.2.0, ansi-styles@npm:^3.2.1": - version: 3.2.1 - resolution: "ansi-styles@npm:3.2.1" - dependencies: - color-convert: ^1.9.0 - checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 - languageName: node - linkType: hard - -"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": - version: 4.3.0 - resolution: "ansi-styles@npm:4.3.0" - dependencies: - color-convert: ^2.0.1 - checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 - languageName: node - linkType: hard - -"ansi-styles@npm:^6.0.0": - version: 6.2.1 - resolution: "ansi-styles@npm:6.2.1" - checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 - languageName: node - linkType: hard - -"antlr4@npm:^4.11.0": - version: 4.12.0 - resolution: "antlr4@npm:4.12.0" - checksum: f70a7765e1c44d678abd6500f2d9659a9d64c572e433576bf82b09b38179ce1191327cfd04d848036651989ba887c1a53da2a41a516dfe93d8e78b5d63801624 - languageName: node - linkType: hard - -"antlr4ts@npm:^0.5.0-alpha.4": - version: 0.5.0-dev - resolution: "antlr4ts@npm:0.5.0-dev" - dependencies: - source-map-support: ^0.5.16 - checksum: 640dae2229124372b0329315e9614ae983bb80b1af237d8c0b3e90a2d85fb534e851c51d65d1897c92b36d27851d041ad8d95aab44af19cf7355b3ad11a3ddbf - languageName: node - linkType: hard - -"anymatch@npm:~3.1.1, anymatch@npm:~3.1.2": - version: 3.1.3 - resolution: "anymatch@npm:3.1.3" - dependencies: - normalize-path: ^3.0.0 - picomatch: ^2.0.4 - checksum: 3e044fd6d1d26545f235a9fe4d7a534e2029d8e59fa7fd9f2a6eb21230f6b5380ea1eaf55136e60cbf8e613544b3b766e7a6fa2102e2a3a117505466e3025dc2 - languageName: node - linkType: hard - -"aproba@npm:^1.0.3 || ^2.0.0": - version: 2.0.0 - resolution: "aproba@npm:2.0.0" - checksum: 5615cadcfb45289eea63f8afd064ab656006361020e1735112e346593856f87435e02d8dcc7ff0d11928bc7d425f27bc7c2a84f6c0b35ab0ff659c814c138a24 - languageName: node - linkType: hard - -"are-we-there-yet@npm:^3.0.0": - version: 3.0.1 - resolution: "are-we-there-yet@npm:3.0.1" - dependencies: - delegates: ^1.0.0 - readable-stream: ^3.6.0 - checksum: 52590c24860fa7173bedeb69a4c05fb573473e860197f618b9a28432ee4379049336727ae3a1f9c4cb083114601c1140cee578376164d0e651217a9843f9fe83 - languageName: node - linkType: hard - -"arg@npm:^4.1.0": - version: 4.1.3 - resolution: "arg@npm:4.1.3" - checksum: 544af8dd3f60546d3e4aff084d451b96961d2267d668670199692f8d054f0415d86fc5497d0e641e91546f0aa920e7c29e5250e99fc89f5552a34b5d93b77f43 - languageName: node - linkType: hard - -"argparse@npm:^1.0.7": - version: 1.0.10 - resolution: "argparse@npm:1.0.10" - dependencies: - sprintf-js: ~1.0.2 - checksum: 7ca6e45583a28de7258e39e13d81e925cfa25d7d4aacbf806a382d3c02fcb13403a07fb8aeef949f10a7cfe4a62da0e2e807b348a5980554cc28ee573ef95945 - languageName: node - linkType: hard - -"argparse@npm:^2.0.1": - version: 2.0.1 - resolution: "argparse@npm:2.0.1" - checksum: 83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced - languageName: node - linkType: hard - -"array-back@npm:^3.0.1, array-back@npm:^3.1.0": - version: 3.1.0 - resolution: "array-back@npm:3.1.0" - checksum: 7205004fcd0f9edd926db921af901b083094608d5b265738d0290092f9822f73accb468e677db74c7c94ef432d39e5ed75a7b1786701e182efb25bbba9734209 - languageName: node - linkType: hard - -"array-back@npm:^4.0.1, array-back@npm:^4.0.2": - version: 4.0.2 - resolution: "array-back@npm:4.0.2" - checksum: f30603270771eeb54e5aad5f54604c62b3577a18b6db212a7272b2b6c32049121b49431f656654790ed1469411e45f387e7627c0de8fd0515995cc40df9b9294 - languageName: node - linkType: hard - -"array-buffer-byte-length@npm:^1.0.0": - version: 1.0.0 - resolution: "array-buffer-byte-length@npm:1.0.0" - dependencies: - call-bind: ^1.0.2 - is-array-buffer: ^3.0.1 - checksum: 044e101ce150f4804ad19c51d6c4d4cfa505c5b2577bd179256e4aa3f3f6a0a5e9874c78cd428ee566ac574c8a04d7ce21af9fe52e844abfdccb82b33035a7c3 - languageName: node - linkType: hard - -"array-ify@npm:^1.0.0": - version: 1.0.0 - resolution: "array-ify@npm:1.0.0" - checksum: c0502015b319c93dd4484f18036bcc4b654eb76a4aa1f04afbcef11ac918859bb1f5d71ba1f0f1141770db9eef1a4f40f1761753650873068010bbf7bcdae4a4 - languageName: node - linkType: hard - -"array-union@npm:^2.1.0": - version: 2.1.0 - resolution: "array-union@npm:2.1.0" - checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d - languageName: node - linkType: hard - -"array-uniq@npm:1.0.3": - version: 1.0.3 - resolution: "array-uniq@npm:1.0.3" - checksum: 1625f06b093d8bf279b81adfec6e72951c0857d65b5e3f65f053fffe9f9dd61c2fc52cff57e38a4700817e7e3f01a4faa433d505ea9e33cdae4514c334e0bf9e - languageName: node - linkType: hard - -"array.prototype.reduce@npm:^1.0.5": - version: 1.0.5 - resolution: "array.prototype.reduce@npm:1.0.5" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - es-array-method-boxes-properly: ^1.0.0 - is-string: ^1.0.7 - checksum: f44691395f9202aba5ec2446468d4c27209bfa81464f342ae024b7157dbf05b164e47cca01250b8c7c2a8219953fb57651cca16aab3d16f43b85c0d92c26eef3 - languageName: node - linkType: hard - -"arrify@npm:^1.0.1": - version: 1.0.1 - resolution: "arrify@npm:1.0.1" - checksum: 745075dd4a4624ff0225c331dacb99be501a515d39bcb7c84d24660314a6ec28e68131b137e6f7e16318170842ce97538cd298fc4cd6b2cc798e0b957f2747e7 - languageName: node - linkType: hard - -"asap@npm:~2.0.6": - version: 2.0.6 - resolution: "asap@npm:2.0.6" - checksum: b296c92c4b969e973260e47523207cd5769abd27c245a68c26dc7a0fe8053c55bb04360237cb51cab1df52be939da77150ace99ad331fb7fb13b3423ed73ff3d - languageName: node - linkType: hard - -"asn1@npm:~0.2.3": - version: 0.2.6 - resolution: "asn1@npm:0.2.6" - dependencies: - safer-buffer: ~2.1.0 - checksum: 39f2ae343b03c15ad4f238ba561e626602a3de8d94ae536c46a4a93e69578826305366dc09fbb9b56aec39b4982a463682f259c38e59f6fa380cd72cd61e493d - languageName: node - linkType: hard - -"assert-plus@npm:1.0.0, assert-plus@npm:^1.0.0": - version: 1.0.0 - resolution: "assert-plus@npm:1.0.0" - checksum: 19b4340cb8f0e6a981c07225eacac0e9d52c2644c080198765d63398f0075f83bbc0c8e95474d54224e297555ad0d631c1dcd058adb1ddc2437b41a6b424ac64 - languageName: node - linkType: hard - -"assertion-error@npm:^1.1.0": - version: 1.1.0 - resolution: "assertion-error@npm:1.1.0" - checksum: fd9429d3a3d4fd61782eb3962ae76b6d08aa7383123fca0596020013b3ebd6647891a85b05ce821c47d1471ed1271f00b0545cf6a4326cf2fc91efcc3b0fbecf - languageName: node - linkType: hard - -"ast-parents@npm:^0.0.1": - version: 0.0.1 - resolution: "ast-parents@npm:0.0.1" - checksum: 51360afb9f7b939eb0330fdd0d5d855d0242f273f63478d30d9053069120492173719fb3c03ba372bccf1a7c1a9041c3c6bf2ab700de8c0f8c14792b045c3b23 - languageName: node - linkType: hard - -"astral-regex@npm:^2.0.0": - version: 2.0.0 - resolution: "astral-regex@npm:2.0.0" - checksum: 876231688c66400473ba505731df37ea436e574dd524520294cc3bbc54ea40334865e01fa0d074d74d036ee874ee7e62f486ea38bc421ee8e6a871c06f011766 - languageName: node - linkType: hard - -"async@npm:1.x": - version: 1.5.2 - resolution: "async@npm:1.5.2" - checksum: fe5d6214d8f15bd51eee5ae8ec5079b228b86d2d595f47b16369dec2e11b3ff75a567bb5f70d12d79006665fbbb7ee0a7ec0e388524eefd454ecbe651c124ebd - languageName: node - linkType: hard - -"asynckit@npm:^0.4.0": - version: 0.4.0 - resolution: "asynckit@npm:0.4.0" - checksum: 7b78c451df768adba04e2d02e63e2d0bf3b07adcd6e42b4cf665cb7ce899bedd344c69a1dcbce355b5f972d597b25aaa1c1742b52cffd9caccb22f348114f6be - languageName: node - linkType: hard - -"at-least-node@npm:^1.0.0": - version: 1.0.0 - resolution: "at-least-node@npm:1.0.0" - checksum: 463e2f8e43384f1afb54bc68485c436d7622acec08b6fad269b421cb1d29cebb5af751426793d0961ed243146fe4dc983402f6d5a51b720b277818dbf6f2e49e - languageName: node - linkType: hard - -"available-typed-arrays@npm:^1.0.5": - version: 1.0.5 - resolution: "available-typed-arrays@npm:1.0.5" - checksum: 20eb47b3cefd7db027b9bbb993c658abd36d4edd3fe1060e83699a03ee275b0c9b216cc076ff3f2db29073225fb70e7613987af14269ac1fe2a19803ccc97f1a - languageName: node - linkType: hard - -"aws-sign2@npm:~0.7.0": - version: 0.7.0 - resolution: "aws-sign2@npm:0.7.0" - checksum: b148b0bb0778098ad8cf7e5fc619768bcb51236707ca1d3e5b49e41b171166d8be9fdc2ea2ae43d7decf02989d0aaa3a9c4caa6f320af95d684de9b548a71525 - languageName: node - linkType: hard - -"aws4@npm:^1.8.0": - version: 1.12.0 - resolution: "aws4@npm:1.12.0" - checksum: 68f79708ac7c335992730bf638286a3ee0a645cf12575d557860100767c500c08b30e24726b9f03265d74116417f628af78509e1333575e9f8d52a80edfe8cbc - languageName: node - linkType: hard - -"axios@npm:^0.21.1": - version: 0.21.4 - resolution: "axios@npm:0.21.4" - dependencies: - follow-redirects: ^1.14.0 - checksum: 44245f24ac971e7458f3120c92f9d66d1fc695e8b97019139de5b0cc65d9b8104647db01e5f46917728edfc0cfd88eb30fc4c55e6053eef4ace76768ce95ff3c - languageName: node - linkType: hard - -"balanced-match@npm:^1.0.0": - version: 1.0.2 - resolution: "balanced-match@npm:1.0.2" - checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 - languageName: node - linkType: hard - -"base-x@npm:^3.0.2": - version: 3.0.9 - resolution: "base-x@npm:3.0.9" - dependencies: - safe-buffer: ^5.0.1 - checksum: 957101d6fd09e1903e846fd8f69fd7e5e3e50254383e61ab667c725866bec54e5ece5ba49ce385128ae48f9ec93a26567d1d5ebb91f4d56ef4a9cc0d5a5481e8 - languageName: node - linkType: hard - -"base64-js@npm:^1.3.0, base64-js@npm:^1.3.1": - version: 1.5.1 - resolution: "base64-js@npm:1.5.1" - checksum: 669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005 - languageName: node - linkType: hard - -"bcrypt-pbkdf@npm:^1.0.0": - version: 1.0.2 - resolution: "bcrypt-pbkdf@npm:1.0.2" - dependencies: - tweetnacl: ^0.14.3 - checksum: 4edfc9fe7d07019609ccf797a2af28351736e9d012c8402a07120c4453a3b789a15f2ee1530dc49eee8f7eb9379331a8dd4b3766042b9e502f74a68e7f662291 - languageName: node - linkType: hard - -"bech32@npm:1.1.4, bech32@npm:^1.1.4": - version: 1.1.4 - resolution: "bech32@npm:1.1.4" - checksum: 0e98db619191548390d6f09ff68b0253ba7ae6a55db93dfdbb070ba234c1fd3308c0606fbcc95fad50437227b10011e2698b89f0181f6e7f845c499bd14d0f4b - languageName: node - linkType: hard - -"bigint-buffer@npm:^1.1.5": - version: 1.1.5 - resolution: "bigint-buffer@npm:1.1.5" - dependencies: - bindings: ^1.3.0 - node-gyp: latest - checksum: d010c9f57758bcdaccb435d88b483ffcc95fe8bbc6e7fb3a44fb5221f29c894ffaf4a3c5a4a530e0e7d6608203c2cde9b79ee4f2386cd6d4462d1070bc8c9f4e - languageName: node - linkType: hard - -"bigint-crypto-utils@npm:^3.0.23": - version: 3.1.8 - resolution: "bigint-crypto-utils@npm:3.1.8" - dependencies: - bigint-mod-arith: ^3.1.0 - checksum: deb004aacf0ac6150b3cebe472c8166a7a315c411260d6c20e43c8c9b1e48831879e5a2e8e7af1ef1aefc542ad7d842a1de4bef12b98e50c825d9243321efe52 - languageName: node - linkType: hard - -"bigint-mod-arith@npm:^3.1.0": - version: 3.1.2 - resolution: "bigint-mod-arith@npm:3.1.2" - checksum: badddd745f6e6c45674b22335d26a9ea83250e749abde20c5f84b24afbc747e259bc36798530953332349ed898f38ec39125b326cae8b8ee2dddfaea7ddf8448 - languageName: node - linkType: hard - -"bignumber.js@npm:^9.1.1": - version: 9.1.2 - resolution: "bignumber.js@npm:9.1.2" - checksum: 582c03af77ec9cb0ebd682a373ee6c66475db94a4325f92299621d544aa4bd45cb45fd60001610e94aef8ae98a0905fa538241d9638d4422d57abbeeac6fadaf - languageName: node - linkType: hard - -"binary-extensions@npm:^2.0.0": - version: 2.2.0 - resolution: "binary-extensions@npm:2.2.0" - checksum: ccd267956c58d2315f5d3ea6757cf09863c5fc703e50fbeb13a7dc849b812ef76e3cf9ca8f35a0c48498776a7478d7b4a0418e1e2b8cb9cb9731f2922aaad7f8 - languageName: node - linkType: hard - -"bindings@npm:^1.3.0": - version: 1.5.0 - resolution: "bindings@npm:1.5.0" - dependencies: - file-uri-to-path: 1.0.0 - checksum: 65b6b48095717c2e6105a021a7da4ea435aa8d3d3cd085cb9e85bcb6e5773cf318c4745c3f7c504412855940b585bdf9b918236612a1c7a7942491de176f1ae7 - languageName: node - linkType: hard - -"bl@npm:^4.1.0": - version: 4.1.0 - resolution: "bl@npm:4.1.0" - dependencies: - buffer: ^5.5.0 - inherits: ^2.0.4 - readable-stream: ^3.4.0 - checksum: 9e8521fa7e83aa9427c6f8ccdcba6e8167ef30cc9a22df26effcc5ab682ef91d2cbc23a239f945d099289e4bbcfae7a192e9c28c84c6202e710a0dfec3722662 - languageName: node - linkType: hard - -"blakejs@npm:^1.1.0": - version: 1.2.1 - resolution: "blakejs@npm:1.2.1" - checksum: d699ba116cfa21d0b01d12014a03e484dd76d483133e6dc9eb415aa70a119f08beb3bcefb8c71840106a00b542cba77383f8be60cd1f0d4589cb8afb922eefbe - languageName: node - linkType: hard - -"bn.js@npm:4.11.6": - version: 4.11.6 - resolution: "bn.js@npm:4.11.6" - checksum: db23047bf06fdf9cf74401c8e76bca9f55313c81df382247d2c753868b368562e69171716b81b7038ada8860af18346fd4bcd1cf9d4963f923fe8e54e61cb58a - languageName: node - linkType: hard - -"bn.js@npm:^4.11.0, bn.js@npm:^4.11.8, bn.js@npm:^4.11.9": - version: 4.12.0 - resolution: "bn.js@npm:4.12.0" - checksum: 39afb4f15f4ea537b55eaf1446c896af28ac948fdcf47171961475724d1bb65118cca49fa6e3d67706e4790955ec0e74de584e45c8f1ef89f46c812bee5b5a12 - languageName: node - linkType: hard - -"bn.js@npm:^5.1.2, bn.js@npm:^5.2.0, bn.js@npm:^5.2.1": - version: 5.2.1 - resolution: "bn.js@npm:5.2.1" - checksum: 3dd8c8d38055fedfa95c1d5fc3c99f8dd547b36287b37768db0abab3c239711f88ff58d18d155dd8ad902b0b0cee973747b7ae20ea12a09473272b0201c9edd3 - languageName: node - linkType: hard - -"borsh@npm:^0.7.0": - version: 0.7.0 - resolution: "borsh@npm:0.7.0" - dependencies: - bn.js: ^5.2.0 - bs58: ^4.0.0 - text-encoding-utf-8: ^1.0.2 - checksum: e98bfb5f7cfb820819c2870b884dac58dd4b4ce6a86c286c8fbf5c9ca582e73a8c6094df67e81a28c418ff07a309c6b118b2e27fdfea83fd92b8100c741da0b5 - languageName: node - linkType: hard - -"brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" - dependencies: - balanced-match: ^1.0.0 - concat-map: 0.0.1 - checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 - languageName: node - linkType: hard - -"brace-expansion@npm:^2.0.1": - version: 2.0.1 - resolution: "brace-expansion@npm:2.0.1" - dependencies: - balanced-match: ^1.0.0 - checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 - languageName: node - linkType: hard - -"braces@npm:^3.0.2, braces@npm:~3.0.2": - version: 3.0.2 - resolution: "braces@npm:3.0.2" - dependencies: - fill-range: ^7.0.1 - checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 - languageName: node - linkType: hard - -"brorand@npm:^1.1.0": - version: 1.1.0 - resolution: "brorand@npm:1.1.0" - checksum: 8a05c9f3c4b46572dec6ef71012b1946db6cae8c7bb60ccd4b7dd5a84655db49fe043ecc6272e7ef1f69dc53d6730b9e2a3a03a8310509a3d797a618cbee52be - languageName: node - linkType: hard - -"browser-level@npm:^1.0.1": - version: 1.0.1 - resolution: "browser-level@npm:1.0.1" - dependencies: - abstract-level: ^1.0.2 - catering: ^2.1.1 - module-error: ^1.0.2 - run-parallel-limit: ^1.1.0 - checksum: 67fbc77ce832940bfa25073eccff279f512ad56f545deb996a5b23b02316f5e76f4a79d381acc27eda983f5c9a2566aaf9c97e4fdd0748288c4407307537a29b - languageName: node - linkType: hard - -"browser-stdout@npm:1.3.1": - version: 1.3.1 - resolution: "browser-stdout@npm:1.3.1" - checksum: b717b19b25952dd6af483e368f9bcd6b14b87740c3d226c2977a65e84666ffd67000bddea7d911f111a9b6ddc822b234de42d52ab6507bce4119a4cc003ef7b3 - languageName: node - linkType: hard - -"browserify-aes@npm:^1.2.0": - version: 1.2.0 - resolution: "browserify-aes@npm:1.2.0" - 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 - checksum: 4a17c3eb55a2aa61c934c286f34921933086bf6d67f02d4adb09fcc6f2fc93977b47d9d884c25619144fccd47b3b3a399e1ad8b3ff5a346be47270114bcf7104 - languageName: node - linkType: hard - -"bs58@npm:^4.0.0, bs58@npm:^4.0.1": - version: 4.0.1 - resolution: "bs58@npm:4.0.1" - dependencies: - base-x: ^3.0.2 - checksum: b3c5365bb9e0c561e1a82f1a2d809a1a692059fae016be233a6127ad2f50a6b986467c3a50669ce4c18929dcccb297c5909314dd347a25a68c21b68eb3e95ac2 - languageName: node - linkType: hard - -"bs58check@npm:^2.1.2": - version: 2.1.2 - resolution: "bs58check@npm:2.1.2" - dependencies: - bs58: ^4.0.0 - create-hash: ^1.1.0 - safe-buffer: ^5.1.2 - checksum: 43bdf08a5dd04581b78f040bc4169480e17008da482ffe2a6507327bbc4fc5c28de0501f7faf22901cfe57fbca79cbb202ca529003fedb4cb8dccd265b38e54d - languageName: node - linkType: hard - -"buffer-from@npm:^1.0.0": - version: 1.1.2 - resolution: "buffer-from@npm:1.1.2" - checksum: 0448524a562b37d4d7ed9efd91685a5b77a50672c556ea254ac9a6d30e3403a517d8981f10e565db24e8339413b43c97ca2951f10e399c6125a0d8911f5679bb - languageName: node - linkType: hard - -"buffer-xor@npm:^1.0.3": - version: 1.0.3 - resolution: "buffer-xor@npm:1.0.3" - checksum: 10c520df29d62fa6e785e2800e586a20fc4f6dfad84bcdbd12e1e8a83856de1cb75c7ebd7abe6d036bbfab738a6cf18a3ae9c8e5a2e2eb3167ca7399ce65373a - languageName: node - linkType: hard - -"buffer@npm:6.0.3, buffer@npm:^6.0.3, buffer@npm:~6.0.3": - version: 6.0.3 - resolution: "buffer@npm:6.0.3" - dependencies: - base64-js: ^1.3.1 - ieee754: ^1.2.1 - checksum: 5ad23293d9a731e4318e420025800b42bf0d264004c0286c8cc010af7a270c7a0f6522e84f54b9ad65cbd6db20b8badbfd8d2ebf4f80fa03dab093b89e68c3f9 - languageName: node - linkType: hard - -"buffer@npm:^5.5.0": - version: 5.7.1 - resolution: "buffer@npm:5.7.1" - dependencies: - base64-js: ^1.3.1 - ieee754: ^1.1.13 - checksum: e2cf8429e1c4c7b8cbd30834ac09bd61da46ce35f5c22a78e6c2f04497d6d25541b16881e30a019c6fd3154150650ccee27a308eff3e26229d788bbdeb08ab84 - languageName: node - linkType: hard - -"bufferutil@npm:^4.0.1": - version: 4.0.8 - resolution: "bufferutil@npm:4.0.8" - dependencies: - node-gyp: latest - node-gyp-build: ^4.3.0 - checksum: 7e9a46f1867dca72fda350966eb468eca77f4d623407b0650913fadf73d5750d883147d6e5e21c56f9d3b0bdc35d5474e80a600b9f31ec781315b4d2469ef087 - languageName: node - linkType: hard - -"bufio@npm:^1.0.7": - version: 1.2.1 - resolution: "bufio@npm:1.2.1" - checksum: b6e1216f4a5877617a3580b83807d8b96c794c015bc2d5eb9e70e152dc79fe923517472bd96df3d5b8feb59a0e25e2aa3cd8a70b8f90905b92d86f2e5719ed68 - languageName: node - linkType: hard - -"busboy@npm:^1.6.0": - version: 1.6.0 - resolution: "busboy@npm:1.6.0" - dependencies: - streamsearch: ^1.1.0 - checksum: 32801e2c0164e12106bf236291a00795c3c4e4b709ae02132883fe8478ba2ae23743b11c5735a0aae8afe65ac4b6ca4568b91f0d9fed1fdbc32ede824a73746e - languageName: node - linkType: hard - -"bytes@npm:3.1.2": - version: 3.1.2 - resolution: "bytes@npm:3.1.2" - checksum: e4bcd3948d289c5127591fbedf10c0b639ccbf00243504e4e127374a15c3bc8eed0d28d4aaab08ff6f1cf2abc0cce6ba3085ed32f4f90e82a5683ce0014e1b6e - languageName: node - linkType: hard - -"cacache@npm:^16.1.0": - version: 16.1.3 - resolution: "cacache@npm:16.1.3" - dependencies: - "@npmcli/fs": ^2.1.0 - "@npmcli/move-file": ^2.0.0 - chownr: ^2.0.0 - fs-minipass: ^2.1.0 - glob: ^8.0.1 - infer-owner: ^1.0.4 - lru-cache: ^7.7.1 - minipass: ^3.1.6 - minipass-collect: ^1.0.2 - minipass-flush: ^1.0.5 - minipass-pipeline: ^1.2.4 - mkdirp: ^1.0.4 - p-map: ^4.0.0 - promise-inflight: ^1.0.1 - rimraf: ^3.0.2 - ssri: ^9.0.0 - tar: ^6.1.11 - unique-filename: ^2.0.0 - checksum: d91409e6e57d7d9a3a25e5dcc589c84e75b178ae8ea7de05cbf6b783f77a5fae938f6e8fda6f5257ed70000be27a681e1e44829251bfffe4c10216002f8f14e6 - languageName: node - linkType: hard - -"cachedir@npm:2.3.0": - version: 2.3.0 - resolution: "cachedir@npm:2.3.0" - checksum: ec90cb0f2e6336e266aa748dbadf3da9e0b20e843e43f1591acab7a3f1451337dc2f26cb9dd833ae8cfefeffeeb43ef5b5ff62782a685f4e3c2305dd98482fcb - languageName: node - linkType: hard - -"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2": - version: 1.0.2 - resolution: "call-bind@npm:1.0.2" - dependencies: - function-bind: ^1.1.1 - get-intrinsic: ^1.0.2 - checksum: f8e31de9d19988a4b80f3e704788c4a2d6b6f3d17cfec4f57dc29ced450c53a49270dc66bf0fbd693329ee948dd33e6c90a329519aef17474a4d961e8d6426b0 - languageName: node - linkType: hard - -"callsites@npm:^3.0.0": - version: 3.1.0 - resolution: "callsites@npm:3.1.0" - checksum: 072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 - languageName: node - linkType: hard - -"camelcase-keys@npm:^6.2.2": - version: 6.2.2 - resolution: "camelcase-keys@npm:6.2.2" - dependencies: - camelcase: ^5.3.1 - map-obj: ^4.0.0 - quick-lru: ^4.0.1 - checksum: 43c9af1adf840471e54c68ab3e5fe8a62719a6b7dbf4e2e86886b7b0ff96112c945736342b837bd2529ec9d1c7d1934e5653318478d98e0cf22c475c04658e2a - languageName: node - linkType: hard - -"camelcase@npm:^5.0.0, camelcase@npm:^5.3.1": - version: 5.3.1 - resolution: "camelcase@npm:5.3.1" - checksum: e6effce26b9404e3c0f301498184f243811c30dfe6d0b9051863bd8e4034d09c8c2923794f280d6827e5aa055f6c434115ff97864a16a963366fb35fd673024b - languageName: node - linkType: hard - -"camelcase@npm:^6.0.0": - version: 6.3.0 - resolution: "camelcase@npm:6.3.0" - checksum: 8c96818a9076434998511251dcb2761a94817ea17dbdc37f47ac080bd088fc62c7369429a19e2178b993497132c8cbcf5cc1f44ba963e76782ba469c0474938d - languageName: node - linkType: hard - -"case@npm:^1.6.3": - version: 1.6.3 - resolution: "case@npm:1.6.3" - checksum: febe73278f910b0d28aab7efd6f51c235f9aa9e296148edb56dfb83fd58faa88308c30ce9a0122b6e53e0362c44f4407105bd5ef89c46860fc2b184e540fd68d - languageName: node - linkType: hard - -"caseless@npm:^0.12.0, caseless@npm:~0.12.0": - version: 0.12.0 - resolution: "caseless@npm:0.12.0" - checksum: b43bd4c440aa1e8ee6baefee8063b4850fd0d7b378f6aabc796c9ec8cb26d27fb30b46885350777d9bd079c5256c0e1329ad0dc7c2817e0bb466810ebb353751 - languageName: node - linkType: hard - -"catering@npm:^2.1.0, catering@npm:^2.1.1": - version: 2.1.1 - resolution: "catering@npm:2.1.1" - checksum: 205daefa69c935b0c19f3d8f2e0a520dd69aebe9bda55902958003f7c9cff8f967dfb90071b421bd6eb618576f657a89d2bc0986872c9bc04bbd66655e9d4bd6 - languageName: node - linkType: hard - -"cbor@npm:^8.1.0": - version: 8.1.0 - resolution: "cbor@npm:8.1.0" - dependencies: - nofilter: ^3.1.0 - checksum: a90338435dc7b45cc01461af979e3bb6ddd4f2a08584c437586039cd5f2235014c06e49d664295debbfb3514d87b2f06728092ab6aa6175e2e85e9cd7dc0c1fd - languageName: node - linkType: hard - -"chai-as-promised@npm:^7.1.1": - version: 7.1.1 - resolution: "chai-as-promised@npm:7.1.1" - dependencies: - check-error: ^1.0.2 - peerDependencies: - chai: ">= 2.1.2 < 5" - checksum: 7262868a5b51a12af4e432838ddf97a893109266a505808e1868ba63a12de7ee1166e9d43b5c501a190c377c1b11ecb9ff8e093c89f097ad96c397e8ec0f8d6a - languageName: node - linkType: hard - -"chai@npm:^4.3.4": - version: 4.3.10 - resolution: "chai@npm:4.3.10" - 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 - checksum: 536668c60a0d985a0fbd94418028e388d243a925d7c5e858c7443e334753511614a3b6a124bac9ca077dfc4c37acc367d62f8c294960f440749536dc181dfc6d - languageName: node - linkType: hard - -"chai@npm:^4.3.7": - version: 4.3.7 - resolution: "chai@npm:4.3.7" - dependencies: - assertion-error: ^1.1.0 - check-error: ^1.0.2 - deep-eql: ^4.1.2 - get-func-name: ^2.0.0 - loupe: ^2.3.1 - pathval: ^1.1.1 - type-detect: ^4.0.5 - checksum: 0bba7d267848015246a66995f044ce3f0ebc35e530da3cbdf171db744e14cbe301ab913a8d07caf7952b430257ccbb1a4a983c570a7c5748dc537897e5131f7c - languageName: node - linkType: hard - -"chalk@npm:5.2.0": - version: 5.2.0 - resolution: "chalk@npm:5.2.0" - checksum: 03d8060277de6cf2fd567dc25fcf770593eb5bb85f460ce443e49255a30ff1242edd0c90a06a03803b0466ff0687a939b41db1757bec987113e83de89a003caa - languageName: node - linkType: hard - -"chalk@npm:^2.0.0, chalk@npm:^2.4.1, chalk@npm:^2.4.2": - version: 2.4.2 - resolution: "chalk@npm:2.4.2" - dependencies: - ansi-styles: ^3.2.1 - escape-string-regexp: ^1.0.5 - supports-color: ^5.3.0 - checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 - languageName: node - linkType: hard - -"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2": - version: 4.1.2 - resolution: "chalk@npm:4.1.2" - dependencies: - ansi-styles: ^4.1.0 - supports-color: ^7.1.0 - checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc - languageName: node - linkType: hard - -"chardet@npm:^0.7.0": - version: 0.7.0 - resolution: "chardet@npm:0.7.0" - checksum: 6fd5da1f5d18ff5712c1e0aed41da200d7c51c28f11b36ee3c7b483f3696dabc08927fc6b227735eb8f0e1215c9a8abd8154637f3eff8cada5959df7f58b024d - languageName: node - linkType: hard - -"charenc@npm:>= 0.0.1": - version: 0.0.2 - resolution: "charenc@npm:0.0.2" - checksum: 81dcadbe57e861d527faf6dd3855dc857395a1c4d6781f4847288ab23cffb7b3ee80d57c15bba7252ffe3e5e8019db767757ee7975663ad2ca0939bb8fcaf2e5 - languageName: node - linkType: hard - -"check-error@npm:^1.0.2": - version: 1.0.2 - resolution: "check-error@npm:1.0.2" - checksum: d9d106504404b8addd1ee3f63f8c0eaa7cd962a1a28eb9c519b1c4a1dc7098be38007fc0060f045ee00f075fbb7a2a4f42abcf61d68323677e11ab98dc16042e - languageName: node - linkType: hard - -"check-error@npm:^1.0.3": - version: 1.0.3 - resolution: "check-error@npm:1.0.3" - dependencies: - get-func-name: ^2.0.2 - checksum: e2131025cf059b21080f4813e55b3c480419256914601750b0fee3bd9b2b8315b531e551ef12560419b8b6d92a3636511322752b1ce905703239e7cc451b6399 - languageName: node - linkType: hard - -"chokidar@npm:3.3.0": - version: 3.3.0 - resolution: "chokidar@npm:3.3.0" - dependencies: - anymatch: ~3.1.1 - braces: ~3.0.2 - fsevents: ~2.1.1 - glob-parent: ~5.1.0 - is-binary-path: ~2.1.0 - is-glob: ~4.0.1 - normalize-path: ~3.0.0 - readdirp: ~3.2.0 - dependenciesMeta: - fsevents: - optional: true - checksum: e9863256ebb29dbc5e58a7e2637439814beb63b772686cb9e94478312c24dcaf3d0570220c5e75ea29029f43b664f9956d87b716120d38cf755f32124f047e8e - languageName: node - linkType: hard - -"chokidar@npm:3.5.3, chokidar@npm:^3.4.0, chokidar@npm:^3.5.2": - version: 3.5.3 - resolution: "chokidar@npm:3.5.3" - dependencies: - anymatch: ~3.1.2 - braces: ~3.0.2 - fsevents: ~2.3.2 - glob-parent: ~5.1.2 - is-binary-path: ~2.1.0 - is-glob: ~4.0.1 - normalize-path: ~3.0.0 - readdirp: ~3.6.0 - dependenciesMeta: - fsevents: - optional: true - checksum: b49fcde40176ba007ff361b198a2d35df60d9bb2a5aab228279eb810feae9294a6b4649ab15981304447afe1e6ffbf4788ad5db77235dc770ab777c6e771980c - languageName: node - linkType: hard - -"chownr@npm:^2.0.0": - version: 2.0.0 - resolution: "chownr@npm:2.0.0" - checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f - languageName: node - linkType: hard - -"ci-info@npm:^2.0.0": - version: 2.0.0 - resolution: "ci-info@npm:2.0.0" - checksum: 3b374666a85ea3ca43fa49aa3a048d21c9b475c96eb13c133505d2324e7ae5efd6a454f41efe46a152269e9b6a00c9edbe63ec7fa1921957165aae16625acd67 - languageName: node - linkType: hard - -"cipher-base@npm:^1.0.0, cipher-base@npm:^1.0.1, cipher-base@npm:^1.0.3": - version: 1.0.4 - resolution: "cipher-base@npm:1.0.4" - dependencies: - inherits: ^2.0.1 - safe-buffer: ^5.0.1 - checksum: 47d3568dbc17431a339bad1fe7dff83ac0891be8206911ace3d3b818fc695f376df809bea406e759cdea07fff4b454fa25f1013e648851bec790c1d75763032e - languageName: node - linkType: hard - -"classic-level@npm:^1.2.0": - version: 1.2.0 - resolution: "classic-level@npm:1.2.0" - dependencies: - abstract-level: ^1.0.2 - catering: ^2.1.0 - module-error: ^1.0.1 - napi-macros: ~2.0.0 - node-gyp: latest - node-gyp-build: ^4.3.0 - checksum: 88ddd12f2192c2775107d5e462998ac01095cb0222ca01dc2be77d8dcbbf9883c4c0a0248529cceee40a2f1232c68027b1aca731da9f767ad8e9483cbd61dd37 - languageName: node - linkType: hard - -"clean-stack@npm:^2.0.0": - version: 2.2.0 - resolution: "clean-stack@npm:2.2.0" - checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 - languageName: node - linkType: hard - -"cli-cursor@npm:^3.1.0": - version: 3.1.0 - resolution: "cli-cursor@npm:3.1.0" - dependencies: - restore-cursor: ^3.1.0 - checksum: 2692784c6cd2fd85cfdbd11f53aea73a463a6d64a77c3e098b2b4697a20443f430c220629e1ca3b195ea5ac4a97a74c2ee411f3807abf6df2b66211fec0c0a29 - languageName: node - linkType: hard - -"cli-spinners@npm:^2.5.0": - version: 2.8.0 - resolution: "cli-spinners@npm:2.8.0" - checksum: 42bc69127706144b83b25da27e0719bdd8294efe43018e1736928a8f78a26e8d2b4dcd39af4a6401526ca647e99e302ad2b29bf19e67d1db403b977aca6abeb7 - languageName: node - linkType: hard - -"cli-table3@npm:^0.5.0": - version: 0.5.1 - resolution: "cli-table3@npm:0.5.1" - dependencies: - colors: ^1.1.2 - object-assign: ^4.1.0 - string-width: ^2.1.1 - dependenciesMeta: - colors: - optional: true - checksum: 3ff8c821440a2a0e655a01f04e5b54a0365b3814676cd93cec2b2b0b9952a08311797ad242a181733fcff714fa7d776f8bb45ad812f296390bfa5ef584fb231d - languageName: node - linkType: hard - -"cli-truncate@npm:^2.1.0": - version: 2.1.0 - resolution: "cli-truncate@npm:2.1.0" - dependencies: - slice-ansi: ^3.0.0 - string-width: ^4.2.0 - checksum: bf1e4e6195392dc718bf9cd71f317b6300dc4a9191d052f31046b8773230ece4fa09458813bf0e3455a5e68c0690d2ea2c197d14a8b85a7b5e01c97f4b5feb5d - languageName: node - linkType: hard - -"cli-truncate@npm:^3.1.0": - version: 3.1.0 - resolution: "cli-truncate@npm:3.1.0" - dependencies: - slice-ansi: ^5.0.0 - string-width: ^5.0.0 - checksum: c3243e41974445691c63f8b405df1d5a24049dc33d324fe448dc572e561a7b772ae982692900b1a5960901cc4fc7def25a629b9c69a4208ee89d12ab3332617a - languageName: node - linkType: hard - -"cli-width@npm:^3.0.0": - version: 3.0.0 - resolution: "cli-width@npm:3.0.0" - checksum: 4c94af3769367a70e11ed69aa6095f1c600c0ff510f3921ab4045af961820d57c0233acfa8b6396037391f31b4c397e1f614d234294f979ff61430a6c166c3f6 - languageName: node - linkType: hard - -"cliui@npm:^5.0.0": - version: 5.0.0 - resolution: "cliui@npm:5.0.0" - dependencies: - string-width: ^3.1.0 - strip-ansi: ^5.2.0 - wrap-ansi: ^5.1.0 - checksum: 0bb8779efe299b8f3002a73619eaa8add4081eb8d1c17bc4fedc6240557fb4eacdc08fe87c39b002eacb6cfc117ce736b362dbfd8bf28d90da800e010ee97df4 - languageName: node - linkType: hard - -"cliui@npm:^7.0.2": - version: 7.0.4 - resolution: "cliui@npm:7.0.4" - dependencies: - string-width: ^4.2.0 - strip-ansi: ^6.0.0 - wrap-ansi: ^7.0.0 - checksum: ce2e8f578a4813806788ac399b9e866297740eecd4ad1823c27fd344d78b22c5f8597d548adbcc46f0573e43e21e751f39446c5a5e804a12aace402b7a315d7f - languageName: node - linkType: hard - -"cliui@npm:^8.0.1": - version: 8.0.1 - resolution: "cliui@npm:8.0.1" - dependencies: - string-width: ^4.2.0 - strip-ansi: ^6.0.1 - wrap-ansi: ^7.0.0 - checksum: 79648b3b0045f2e285b76fb2e24e207c6db44323581e421c3acbd0e86454cba1b37aea976ab50195a49e7384b871e6dfb2247ad7dec53c02454ac6497394cb56 - languageName: node - linkType: hard - -"clone@npm:^1.0.2": - version: 1.0.4 - resolution: "clone@npm:1.0.4" - checksum: d06418b7335897209e77bdd430d04f882189582e67bd1f75a04565f3f07f5b3f119a9d670c943b6697d0afb100f03b866b3b8a1f91d4d02d72c4ecf2bb64b5dd - languageName: node - linkType: hard - -"color-convert@npm:^1.9.0": - version: 1.9.3 - resolution: "color-convert@npm:1.9.3" - dependencies: - color-name: 1.1.3 - checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 - languageName: node - linkType: hard - -"color-convert@npm:^2.0.1": - version: 2.0.1 - resolution: "color-convert@npm:2.0.1" - dependencies: - color-name: ~1.1.4 - checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 - languageName: node - linkType: hard - -"color-name@npm:1.1.3": - version: 1.1.3 - resolution: "color-name@npm:1.1.3" - checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d - languageName: node - linkType: hard - -"color-name@npm:~1.1.4": - version: 1.1.4 - resolution: "color-name@npm:1.1.4" - checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 - languageName: node - linkType: hard - -"color-support@npm:^1.1.3": - version: 1.1.3 - resolution: "color-support@npm:1.1.3" - bin: - color-support: bin.js - checksum: 9b7356817670b9a13a26ca5af1c21615463b500783b739b7634a0c2047c16cef4b2865d7576875c31c3cddf9dd621fa19285e628f20198b233a5cfdda6d0793b - languageName: node - linkType: hard - -"colorette@npm:^2.0.19": - version: 2.0.19 - resolution: "colorette@npm:2.0.19" - checksum: 888cf5493f781e5fcf54ce4d49e9d7d698f96ea2b2ef67906834bb319a392c667f9ec69f4a10e268d2946d13a9503d2d19b3abaaaf174e3451bfe91fb9d82427 - languageName: node - linkType: hard - -"colors@npm:1.4.0, colors@npm:^1.1.2": - version: 1.4.0 - resolution: "colors@npm:1.4.0" - checksum: 98aa2c2418ad87dedf25d781be69dc5fc5908e279d9d30c34d8b702e586a0474605b3a189511482b9d5ed0d20c867515d22749537f7bc546256c6014f3ebdcec - languageName: node - linkType: hard - -"combined-stream@npm:^1.0.6, combined-stream@npm:^1.0.8, combined-stream@npm:~1.0.6": - version: 1.0.8 - resolution: "combined-stream@npm:1.0.8" - dependencies: - delayed-stream: ~1.0.0 - checksum: 49fa4aeb4916567e33ea81d088f6584749fc90c7abec76fd516bf1c5aa5c79f3584b5ba3de6b86d26ddd64bae5329c4c7479343250cfe71c75bb366eae53bb7c - languageName: node - linkType: hard - -"command-exists@npm:^1.2.8": - version: 1.2.9 - resolution: "command-exists@npm:1.2.9" - checksum: 729ae3d88a2058c93c58840f30341b7f82688a573019535d198b57a4d8cb0135ced0ad7f52b591e5b28a90feb2c675080ce916e56254a0f7c15cb2395277cac3 - languageName: node - linkType: hard - -"command-line-args@npm:^5.1.1": - version: 5.2.1 - resolution: "command-line-args@npm:5.2.1" - dependencies: - array-back: ^3.1.0 - find-replace: ^3.0.0 - lodash.camelcase: ^4.3.0 - typical: ^4.0.0 - checksum: e759519087be3cf2e86af8b9a97d3058b4910cd11ee852495be881a067b72891f6a32718fb685ee6d41531ab76b2b7bfb6602f79f882cd4b7587ff1e827982c7 - languageName: node - linkType: hard - -"command-line-usage@npm:^6.1.0": - version: 6.1.3 - resolution: "command-line-usage@npm:6.1.3" - dependencies: - array-back: ^4.0.2 - chalk: ^2.4.2 - table-layout: ^1.0.2 - typical: ^5.2.0 - checksum: 8261d4e5536eb0bcddee0ec5e89c05bb2abd18e5760785c8078ede5020bc1c612cbe28eb6586f5ed4a3660689748e5aaad4a72f21566f4ef39393694e2fa1a0b - languageName: node - linkType: hard - -"commander@npm:3.0.2": - version: 3.0.2 - resolution: "commander@npm:3.0.2" - checksum: 6d14ad030d1904428139487ed31febcb04c1604db2b8d9fae711f60ee6718828dc0e11602249e91c8a97b0e721e9c6d53edbc166bad3cde1596851d59a8f824d - languageName: node - linkType: hard - -"commander@npm:^10.0.0": - version: 10.0.0 - resolution: "commander@npm:10.0.0" - checksum: 9f6495651f878213005ac744dd87a85fa3d9f2b8b90d1c19d0866d666bda7f735adfd7c2f10dfff345782e2f80ea258f98bb4efcef58e4e502f25f883940acfd - languageName: node - linkType: hard - -"commander@npm:^2.20.3": - version: 2.20.3 - resolution: "commander@npm:2.20.3" - checksum: ab8c07884e42c3a8dbc5dd9592c606176c7eb5c1ca5ff274bcf907039b2c41de3626f684ea75ccf4d361ba004bbaff1f577d5384c155f3871e456bdf27becf9e - languageName: node - linkType: hard - -"commitizen@npm:^4.0.3, commitizen@npm:^4.2.5": - version: 4.3.0 - resolution: "commitizen@npm:4.3.0" - dependencies: - cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0 - dedent: 0.7.0 - detect-indent: 6.1.0 - find-node-modules: ^2.1.2 - find-root: 1.1.0 - fs-extra: 9.1.0 - glob: 7.2.3 - inquirer: 8.2.5 - is-utf8: ^0.2.1 - lodash: 4.17.21 - minimist: 1.2.7 - strip-bom: 4.0.0 - strip-json-comments: 3.1.1 - bin: - commitizen: bin/commitizen - cz: bin/git-cz - git-cz: bin/git-cz - checksum: 5a54f81ab7f24b74dd7791ae408796b0ac9ae6675cbe85db71047cee131e627ed5bfb9365de8b5777bedfbcdee1bccf15e5da5dae8b09b3fce93b551baa2cb63 - languageName: node - linkType: hard - -"compare-func@npm:^2.0.0": - version: 2.0.0 - resolution: "compare-func@npm:2.0.0" - dependencies: - array-ify: ^1.0.0 - dot-prop: ^5.1.0 - checksum: fb71d70632baa1e93283cf9d80f30ac97f003aabee026e0b4426c9716678079ef5fea7519b84d012cbed938c476493866a38a79760564a9e21ae9433e40e6f0d - languageName: node - linkType: hard - -"concat-map@npm:0.0.1": - version: 0.0.1 - resolution: "concat-map@npm:0.0.1" - checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af - languageName: node - linkType: hard - -"concat-stream@npm:^1.6.0, concat-stream@npm:^1.6.2": - version: 1.6.2 - resolution: "concat-stream@npm:1.6.2" - dependencies: - buffer-from: ^1.0.0 - inherits: ^2.0.3 - readable-stream: ^2.2.2 - typedarray: ^0.0.6 - checksum: 1ef77032cb4459dcd5187bd710d6fc962b067b64ec6a505810de3d2b8cc0605638551b42f8ec91edf6fcd26141b32ef19ad749239b58fae3aba99187adc32285 - languageName: node - linkType: hard - -"console-control-strings@npm:^1.1.0": - version: 1.1.0 - resolution: "console-control-strings@npm:1.1.0" - checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed - languageName: node - linkType: hard - -"conventional-changelog-angular@npm:^5.0.11": - version: 5.0.13 - resolution: "conventional-changelog-angular@npm:5.0.13" - dependencies: - compare-func: ^2.0.0 - q: ^1.5.1 - checksum: 6ed4972fce25a50f9f038c749cc9db501363131b0fb2efc1fccecba14e4b1c80651d0d758d4c350a609f32010c66fa343eefd49c02e79e911884be28f53f3f90 - languageName: node - linkType: hard - -"conventional-changelog-conventionalcommits@npm:^5.0.0": - version: 5.0.0 - resolution: "conventional-changelog-conventionalcommits@npm:5.0.0" - dependencies: - compare-func: ^2.0.0 - lodash: ^4.17.15 - q: ^1.5.1 - checksum: b67d12e4e0fdde5baa32c3d77af472de38646a18657b26f5543eecce041a318103092fbfcef247e2319a16957c9ac78c6ea78acc11a5db6acf74be79a28c561f - languageName: node - linkType: hard - -"conventional-commit-types@npm:^3.0.0": - version: 3.0.0 - resolution: "conventional-commit-types@npm:3.0.0" - checksum: b9552de6a310c91a271ee57a890ed70d2d94340e710fc33856aaca5b24928fb2162f04dda5484d155b68c1fbaa042d904014d7fad0b6751a6d68052a0616015d - languageName: node - linkType: hard - -"conventional-commits-parser@npm:^3.2.2": - version: 3.2.4 - resolution: "conventional-commits-parser@npm:3.2.4" - dependencies: - JSONStream: ^1.0.4 - is-text-path: ^1.0.1 - lodash: ^4.17.15 - meow: ^8.0.0 - split2: ^3.0.0 - through2: ^4.0.0 - bin: - conventional-commits-parser: cli.js - checksum: 1627ff203bc9586d89e47a7fe63acecf339aba74903b9114e23d28094f79d4e2d6389bf146ae561461dcba8fc42e7bc228165d2b173f15756c43f1d32bc50bfd - languageName: node - linkType: hard - -"cookie@npm:^0.4.1": - version: 0.4.2 - resolution: "cookie@npm:0.4.2" - checksum: a00833c998bedf8e787b4c342defe5fa419abd96b32f4464f718b91022586b8f1bafbddd499288e75c037642493c83083da426c6a9080d309e3bd90fd11baa9b - languageName: node - linkType: hard - -"core-util-is@npm:1.0.2": - version: 1.0.2 - resolution: "core-util-is@npm:1.0.2" - checksum: 7a4c925b497a2c91421e25bf76d6d8190f0b2359a9200dbeed136e63b2931d6294d3b1893eda378883ed363cd950f44a12a401384c609839ea616befb7927dab - languageName: node - linkType: hard - -"core-util-is@npm:~1.0.0": - version: 1.0.3 - resolution: "core-util-is@npm:1.0.3" - checksum: 9de8597363a8e9b9952491ebe18167e3b36e7707569eed0ebf14f8bba773611376466ae34575bca8cfe3c767890c859c74056084738f09d4e4a6f902b2ad7d99 - languageName: node - linkType: hard - -"cosmiconfig-typescript-loader@npm:^4.0.0": - version: 4.3.0 - resolution: "cosmiconfig-typescript-loader@npm:4.3.0" - peerDependencies: - "@types/node": "*" - cosmiconfig: ">=7" - ts-node: ">=10" - typescript: ">=3" - checksum: ea61dfd8e112cf2bb18df0ef89280bd3ae3dd5b997b4a9fc22bbabdc02513aadfbc6d4e15e922b6a9a5d987e9dad42286fa38caf77a9b8dcdbe7d4ce1c9db4fb - languageName: node - linkType: hard - -"cosmiconfig@npm:^8.0.0": - version: 8.1.3 - resolution: "cosmiconfig@npm:8.1.3" - dependencies: - import-fresh: ^3.2.1 - js-yaml: ^4.1.0 - parse-json: ^5.0.0 - path-type: ^4.0.0 - checksum: b3d277bc3a8a9e649bf4c3fc9740f4c52bf07387481302aa79839f595045368903bf26ea24a8f7f7b8b180bf46037b027c5cb63b1391ab099f3f78814a147b2b - languageName: node - linkType: hard - -"crc-32@npm:^1.2.0": - version: 1.2.2 - resolution: "crc-32@npm:1.2.2" - bin: - crc32: bin/crc32.njs - checksum: ad2d0ad0cbd465b75dcaeeff0600f8195b686816ab5f3ba4c6e052a07f728c3e70df2e3ca9fd3d4484dc4ba70586e161ca5a2334ec8bf5a41bf022a6103ff243 - languageName: node - linkType: hard - -"create-hash@npm:^1.1.0, create-hash@npm:^1.1.2, create-hash@npm:^1.2.0": - version: 1.2.0 - resolution: "create-hash@npm:1.2.0" - dependencies: - cipher-base: ^1.0.1 - inherits: ^2.0.1 - md5.js: ^1.3.4 - ripemd160: ^2.0.1 - sha.js: ^2.4.0 - checksum: 02a6ae3bb9cd4afee3fabd846c1d8426a0e6b495560a977ba46120c473cb283be6aa1cace76b5f927cf4e499c6146fb798253e48e83d522feba807d6b722eaa9 - languageName: node - linkType: hard - -"create-hmac@npm:^1.1.4, create-hmac@npm:^1.1.7": - version: 1.1.7 - resolution: "create-hmac@npm:1.1.7" - 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 - checksum: ba12bb2257b585a0396108c72830e85f882ab659c3320c83584b1037f8ab72415095167ced80dc4ce8e446a8ecc4b2acf36d87befe0707d73b26cf9dc77440ed - languageName: node - linkType: hard - -"create-require@npm:^1.1.0": - version: 1.1.1 - resolution: "create-require@npm:1.1.1" - checksum: a9a1503d4390d8b59ad86f4607de7870b39cad43d929813599a23714831e81c520bddf61bcdd1f8e30f05fd3a2b71ae8538e946eb2786dc65c2bbc520f692eff - languageName: node - linkType: hard - -"cross-env@npm:^7.0.3": - version: 7.0.3 - resolution: "cross-env@npm:7.0.3" - dependencies: - cross-spawn: ^7.0.1 - bin: - cross-env: src/bin/cross-env.js - cross-env-shell: src/bin/cross-env-shell.js - checksum: 26f2f3ea2ab32617f57effb70d329c2070d2f5630adc800985d8b30b56e8bf7f5f439dd3a0358b79cee6f930afc23cf8e23515f17ccfb30092c6b62c6b630a79 - languageName: node - linkType: hard - -"cross-spawn@npm:^7.0.1, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" - dependencies: - path-key: ^3.1.0 - shebang-command: ^2.0.0 - which: ^2.0.1 - checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 - languageName: node - linkType: hard - -"crypt@npm:>= 0.0.1": - version: 0.0.2 - resolution: "crypt@npm:0.0.2" - checksum: baf4c7bbe05df656ec230018af8cf7dbe8c14b36b98726939cef008d473f6fe7a4fad906cfea4062c93af516f1550a3f43ceb4d6615329612c6511378ed9fe34 - languageName: node - linkType: hard - -"cz-conventional-changelog@npm:3.3.0, cz-conventional-changelog@npm:^3.3.0": - version: 3.3.0 - resolution: "cz-conventional-changelog@npm:3.3.0" - dependencies: - "@commitlint/load": ">6.1.1" - chalk: ^2.4.1 - commitizen: ^4.0.3 - conventional-commit-types: ^3.0.0 - lodash.map: ^4.5.1 - longest: ^2.0.1 - word-wrap: ^1.0.3 - dependenciesMeta: - "@commitlint/load": - optional: true - checksum: 8b766712092142ecec86c5c8a2a7206d0b2da46ae16e137303c6d75b42c048acd831c734fd542b9c3cbeb0fd8e7d1f5391494ed629dfba4459fee2d6f5d2c0ca - languageName: node - linkType: hard - -"dargs@npm:^7.0.0": - version: 7.0.0 - resolution: "dargs@npm:7.0.0" - checksum: b8f1e3cba59c42e1f13a114ad4848c3fc1cf7470f633ee9e9f1043762429bc97d91ae31b826fb135eefde203a3fdb20deb0c0a0222ac29d937b8046085d668d1 - languageName: node - linkType: hard - -"dashdash@npm:^1.12.0": - version: 1.14.1 - resolution: "dashdash@npm:1.14.1" - dependencies: - assert-plus: ^1.0.0 - checksum: 3634c249570f7f34e3d34f866c93f866c5b417f0dd616275decae08147dcdf8fccfaa5947380ccfb0473998ea3a8057c0b4cd90c875740ee685d0624b2983598 - languageName: node - linkType: hard - -"death@npm:^1.1.0": - version: 1.1.0 - resolution: "death@npm:1.1.0" - checksum: 8010ba9a320752f9580eb474985ed214572c0595cf83e92859e3c5a014a01fc8e8f2f2908b80b5f8bca9cb3f94adb546cf55810df6b80e282452e355cdce5aaa - languageName: node - linkType: hard - -"debug@npm:3.2.6": - version: 3.2.6 - resolution: "debug@npm:3.2.6" - dependencies: - ms: ^2.1.1 - checksum: 07bc8b3a13ef3cfa6c06baf7871dfb174c291e5f85dbf566f086620c16b9c1a0e93bb8f1935ebbd07a683249e7e30286f2966e2ef461e8fd17b1b60732062d6b - languageName: node - linkType: hard - -"debug@npm:4, debug@npm:4.3.4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": - version: 4.3.4 - resolution: "debug@npm:4.3.4" - dependencies: - ms: 2.1.2 - peerDependenciesMeta: - supports-color: - optional: true - checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 - languageName: node - linkType: hard - -"decamelize-keys@npm:^1.1.0": - version: 1.1.1 - resolution: "decamelize-keys@npm:1.1.1" - dependencies: - decamelize: ^1.1.0 - map-obj: ^1.0.0 - checksum: fc645fe20b7bda2680bbf9481a3477257a7f9304b1691036092b97ab04c0ab53e3bf9fcc2d2ae382536568e402ec41fb11e1d4c3836a9abe2d813dd9ef4311e0 - languageName: node - linkType: hard - -"decamelize@npm:^1.1.0, decamelize@npm:^1.2.0": - version: 1.2.0 - resolution: "decamelize@npm:1.2.0" - checksum: ad8c51a7e7e0720c70ec2eeb1163b66da03e7616d7b98c9ef43cce2416395e84c1e9548dd94f5f6ffecfee9f8b94251fc57121a8b021f2ff2469b2bae247b8aa - languageName: node - linkType: hard - -"decamelize@npm:^4.0.0": - version: 4.0.0 - resolution: "decamelize@npm:4.0.0" - checksum: b7d09b82652c39eead4d6678bb578e3bebd848add894b76d0f6b395bc45b2d692fb88d977e7cfb93c4ed6c119b05a1347cef261174916c2e75c0a8ca57da1809 - languageName: node - linkType: hard - -"dedent@npm:0.7.0": - version: 0.7.0 - resolution: "dedent@npm:0.7.0" - checksum: 87de191050d9a40dd70cad01159a0bcf05ecb59750951242070b6abf9569088684880d00ba92a955b4058804f16eeaf91d604f283929b4f614d181cd7ae633d2 - languageName: node - linkType: hard - -"deep-eql@npm:^4.0.1, deep-eql@npm:^4.1.2, deep-eql@npm:^4.1.3": - version: 4.1.3 - resolution: "deep-eql@npm:4.1.3" - dependencies: - type-detect: ^4.0.0 - checksum: 7f6d30cb41c713973dc07eaadded848b2ab0b835e518a88b91bea72f34e08c4c71d167a722a6f302d3a6108f05afd8e6d7650689a84d5d29ec7fe6220420397f - languageName: node - linkType: hard - -"deep-extend@npm:~0.6.0": - version: 0.6.0 - resolution: "deep-extend@npm:0.6.0" - checksum: 7be7e5a8d468d6b10e6a67c3de828f55001b6eb515d014f7aeb9066ce36bd5717161eb47d6a0f7bed8a9083935b465bc163ee2581c8b128d29bf61092fdf57a7 - languageName: node - linkType: hard - -"deep-is@npm:^0.1.3, deep-is@npm:~0.1.3": - version: 0.1.4 - resolution: "deep-is@npm:0.1.4" - checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 - languageName: node - linkType: hard - -"defaults@npm:^1.0.3": - version: 1.0.4 - resolution: "defaults@npm:1.0.4" - dependencies: - clone: ^1.0.2 - checksum: 3a88b7a587fc076b84e60affad8b85245c01f60f38fc1d259e7ac1d89eb9ce6abb19e27215de46b98568dd5bc48471730b327637e6f20b0f1bc85cf00440c80a - languageName: node - linkType: hard - -"define-properties@npm:^1.1.2, define-properties@npm:^1.1.3, define-properties@npm:^1.1.4": - version: 1.2.0 - resolution: "define-properties@npm:1.2.0" - dependencies: - has-property-descriptors: ^1.0.0 - object-keys: ^1.1.1 - checksum: e60aee6a19b102df4e2b1f301816804e81ab48bb91f00d0d935f269bf4b3f79c88b39e4f89eaa132890d23267335fd1140dfcd8d5ccd61031a0a2c41a54e33a6 - languageName: node - linkType: hard - -"delay@npm:^5.0.0": - version: 5.0.0 - resolution: "delay@npm:5.0.0" - checksum: 62f151151ecfde0d9afbb8a6be37a6d103c4cb24f35a20ef3fe56f920b0d0d0bb02bc9c0a3084d0179ef669ca332b91155f2ee4d9854622cd2cdba5fc95285f9 - languageName: node - linkType: hard - -"delayed-stream@npm:~1.0.0": - version: 1.0.0 - resolution: "delayed-stream@npm:1.0.0" - checksum: 46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020 - languageName: node - linkType: hard - -"delegates@npm:^1.0.0": - version: 1.0.0 - resolution: "delegates@npm:1.0.0" - checksum: a51744d9b53c164ba9c0492471a1a2ffa0b6727451bdc89e31627fdf4adda9d51277cfcbfb20f0a6f08ccb3c436f341df3e92631a3440226d93a8971724771fd - languageName: node - linkType: hard - -"depd@npm:2.0.0, depd@npm:^2.0.0": - version: 2.0.0 - resolution: "depd@npm:2.0.0" - checksum: abbe19c768c97ee2eed6282d8ce3031126662252c58d711f646921c9623f9052e3e1906443066beec1095832f534e57c523b7333f8e7e0d93051ab6baef5ab3a - languageName: node - linkType: hard - -"detect-file@npm:^1.0.0": - version: 1.0.0 - resolution: "detect-file@npm:1.0.0" - checksum: 1861e4146128622e847abe0e1ed80fef01e78532665858a792267adf89032b7a9c698436137707fcc6f02956c2a6a0052d6a0cef5be3d4b76b1ff0da88e2158a - languageName: node - linkType: hard - -"detect-indent@npm:6.1.0": - version: 6.1.0 - resolution: "detect-indent@npm:6.1.0" - checksum: ab953a73c72dbd4e8fc68e4ed4bfd92c97eb6c43734af3900add963fd3a9316f3bc0578b018b24198d4c31a358571eff5f0656e81a1f3b9ad5c547d58b2d093d - languageName: node - linkType: hard - -"detect-port@npm:^1.3.0": - version: 1.5.1 - resolution: "detect-port@npm:1.5.1" - dependencies: - address: ^1.0.1 - debug: 4 - bin: - detect: bin/detect-port.js - detect-port: bin/detect-port.js - checksum: b48da9340481742547263d5d985e65d078592557863402ecf538511735e83575867e94f91fe74405ea19b61351feb99efccae7e55de9a151d5654e3417cea05b - languageName: node - linkType: hard - -"diff@npm:3.5.0": - version: 3.5.0 - resolution: "diff@npm:3.5.0" - checksum: 00842950a6551e26ce495bdbce11047e31667deea546527902661f25cc2e73358967ebc78cf86b1a9736ec3e14286433225f9970678155753a6291c3bca5227b - languageName: node - linkType: hard - -"diff@npm:5.0.0": - version: 5.0.0 - resolution: "diff@npm:5.0.0" - checksum: f19fe29284b633afdb2725c2a8bb7d25761ea54d321d8e67987ac851c5294be4afeab532bd84531e02583a3fe7f4014aa314a3eda84f5590e7a9e6b371ef3b46 - languageName: node - linkType: hard - -"diff@npm:^4.0.1": - version: 4.0.2 - resolution: "diff@npm:4.0.2" - checksum: f2c09b0ce4e6b301c221addd83bf3f454c0bc00caa3dd837cf6c127d6edf7223aa2bbe3b688feea110b7f262adbfc845b757c44c8a9f8c0c5b15d8fa9ce9d20d - languageName: node - linkType: hard - -"difflib@npm:^0.2.4": - version: 0.2.4 - resolution: "difflib@npm:0.2.4" - dependencies: - heap: ">= 0.2.0" - checksum: 4f4237b026263ce7471b77d9019b901c2f358a7da89401a80a84a8c3cdc1643a8e70b7495ccbe686cb4d95492eaf5dac119cd9ecbffe5f06bfc175fbe5c20a27 - languageName: node - linkType: hard - -"dir-glob@npm:^3.0.1": - version: 3.0.1 - resolution: "dir-glob@npm:3.0.1" - dependencies: - path-type: ^4.0.0 - checksum: fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 - languageName: node - linkType: hard - -"doctrine@npm:^3.0.0": - version: 3.0.0 - resolution: "doctrine@npm:3.0.0" - dependencies: - esutils: ^2.0.2 - checksum: fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce - languageName: node - linkType: hard - -"dot-prop@npm:^5.1.0": - version: 5.3.0 - resolution: "dot-prop@npm:5.3.0" - dependencies: - is-obj: ^2.0.0 - checksum: d5775790093c234ef4bfd5fbe40884ff7e6c87573e5339432870616331189f7f5d86575c5b5af2dcf0f61172990f4f734d07844b1f23482fff09e3c4bead05ea - languageName: node - linkType: hard - -"dotenv@npm:^16.0.3": - version: 16.0.3 - resolution: "dotenv@npm:16.0.3" - checksum: afcf03f373d7a6d62c7e9afea6328e62851d627a4e73f2e12d0a8deae1cd375892004f3021883f8aec85932cd2834b091f568ced92b4774625b321db83b827f8 - languageName: node - linkType: hard - -"eastasianwidth@npm:^0.2.0": - version: 0.2.0 - resolution: "eastasianwidth@npm:0.2.0" - checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed - languageName: node - linkType: hard - -"ecc-jsbn@npm:~0.1.1": - version: 0.1.2 - resolution: "ecc-jsbn@npm:0.1.2" - dependencies: - jsbn: ~0.1.0 - safer-buffer: ^2.1.0 - checksum: 22fef4b6203e5f31d425f5b711eb389e4c6c2723402e389af394f8411b76a488fa414d309d866e2b577ce3e8462d344205545c88a8143cc21752a5172818888a - languageName: node - linkType: hard - -"elliptic@npm:6.5.4, elliptic@npm:^6.5.2, elliptic@npm:^6.5.4": - version: 6.5.4 - resolution: "elliptic@npm:6.5.4" - 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 - checksum: d56d21fd04e97869f7ffcc92e18903b9f67f2d4637a23c860492fbbff5a3155fd9ca0184ce0c865dd6eb2487d234ce9551335c021c376cd2d3b7cb749c7d10f4 - languageName: node - linkType: hard - -"emoji-regex@npm:^7.0.1": - version: 7.0.3 - resolution: "emoji-regex@npm:7.0.3" - checksum: 9159b2228b1511f2870ac5920f394c7e041715429a68459ebe531601555f11ea782a8e1718f969df2711d38c66268174407cbca57ce36485544f695c2dfdc96e - languageName: node - linkType: hard - -"emoji-regex@npm:^8.0.0": - version: 8.0.0 - resolution: "emoji-regex@npm:8.0.0" - checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 - languageName: node - linkType: hard - -"emoji-regex@npm:^9.2.2": - version: 9.2.2 - resolution: "emoji-regex@npm:9.2.2" - checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601 - languageName: node - linkType: hard - -"encode-utf8@npm:^1.0.2": - version: 1.0.3 - resolution: "encode-utf8@npm:1.0.3" - checksum: 550224bf2a104b1d355458c8a82e9b4ea07f9fc78387bc3a49c151b940ad26473de8dc9e121eefc4e84561cb0b46de1e4cd2bc766f72ee145e9ea9541482817f - languageName: node - linkType: hard - -"encoding@npm:^0.1.13": - version: 0.1.13 - resolution: "encoding@npm:0.1.13" - dependencies: - iconv-lite: ^0.6.2 - checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f - languageName: node - linkType: hard - -"enquirer@npm:^2.3.0, enquirer@npm:^2.3.6": - version: 2.3.6 - resolution: "enquirer@npm:2.3.6" - dependencies: - ansi-colors: ^4.1.1 - checksum: 1c0911e14a6f8d26721c91e01db06092a5f7675159f0261d69c403396a385afd13dd76825e7678f66daffa930cfaa8d45f506fb35f818a2788463d022af1b884 - languageName: node - linkType: hard - -"env-paths@npm:^2.2.0": - version: 2.2.1 - resolution: "env-paths@npm:2.2.1" - checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e - languageName: node - linkType: hard - -"err-code@npm:^2.0.2": - version: 2.0.3 - resolution: "err-code@npm:2.0.3" - checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54 - languageName: node - linkType: hard - -"error-ex@npm:^1.3.1": - version: 1.3.2 - resolution: "error-ex@npm:1.3.2" - dependencies: - is-arrayish: ^0.2.1 - checksum: c1c2b8b65f9c91b0f9d75f0debaa7ec5b35c266c2cac5de412c1a6de86d4cbae04ae44e510378cb14d032d0645a36925d0186f8bb7367bcc629db256b743a001 - languageName: node - linkType: hard - -"es-abstract@npm:^1.19.0, es-abstract@npm:^1.20.4": - version: 1.21.2 - resolution: "es-abstract@npm:1.21.2" - dependencies: - array-buffer-byte-length: ^1.0.0 - available-typed-arrays: ^1.0.5 - call-bind: ^1.0.2 - es-set-tostringtag: ^2.0.1 - es-to-primitive: ^1.2.1 - function.prototype.name: ^1.1.5 - get-intrinsic: ^1.2.0 - get-symbol-description: ^1.0.0 - globalthis: ^1.0.3 - gopd: ^1.0.1 - has: ^1.0.3 - has-property-descriptors: ^1.0.0 - has-proto: ^1.0.1 - has-symbols: ^1.0.3 - internal-slot: ^1.0.5 - is-array-buffer: ^3.0.2 - is-callable: ^1.2.7 - is-negative-zero: ^2.0.2 - is-regex: ^1.1.4 - is-shared-array-buffer: ^1.0.2 - is-string: ^1.0.7 - is-typed-array: ^1.1.10 - is-weakref: ^1.0.2 - object-inspect: ^1.12.3 - object-keys: ^1.1.1 - object.assign: ^4.1.4 - regexp.prototype.flags: ^1.4.3 - safe-regex-test: ^1.0.0 - string.prototype.trim: ^1.2.7 - string.prototype.trimend: ^1.0.6 - string.prototype.trimstart: ^1.0.6 - typed-array-length: ^1.0.4 - unbox-primitive: ^1.0.2 - which-typed-array: ^1.1.9 - checksum: 037f55ee5e1cdf2e5edbab5524095a4f97144d95b94ea29e3611b77d852fd8c8a40e7ae7101fa6a759a9b9b1405f188c3c70928f2d3cd88d543a07fc0d5ad41a - languageName: node - linkType: hard - -"es-array-method-boxes-properly@npm:^1.0.0": - version: 1.0.0 - resolution: "es-array-method-boxes-properly@npm:1.0.0" - checksum: 2537fcd1cecf187083890bc6f5236d3a26bf39237433587e5bf63392e88faae929dbba78ff0120681a3f6f81c23fe3816122982c160d63b38c95c830b633b826 - languageName: node - linkType: hard - -"es-set-tostringtag@npm:^2.0.1": - version: 2.0.1 - resolution: "es-set-tostringtag@npm:2.0.1" - dependencies: - get-intrinsic: ^1.1.3 - has: ^1.0.3 - has-tostringtag: ^1.0.0 - checksum: ec416a12948cefb4b2a5932e62093a7cf36ddc3efd58d6c58ca7ae7064475ace556434b869b0bbeb0c365f1032a8ccd577211101234b69837ad83ad204fff884 - languageName: node - linkType: hard - -"es-to-primitive@npm:^1.2.1": - version: 1.2.1 - resolution: "es-to-primitive@npm:1.2.1" - dependencies: - is-callable: ^1.1.4 - is-date-object: ^1.0.1 - is-symbol: ^1.0.2 - checksum: 4ead6671a2c1402619bdd77f3503991232ca15e17e46222b0a41a5d81aebc8740a77822f5b3c965008e631153e9ef0580540007744521e72de8e33599fca2eed - languageName: node - linkType: hard - -"es6-promise@npm:^4.0.3": - version: 4.2.8 - resolution: "es6-promise@npm:4.2.8" - checksum: 95614a88873611cb9165a85d36afa7268af5c03a378b35ca7bda9508e1d4f1f6f19a788d4bc755b3fd37c8ebba40782018e02034564ff24c9d6fa37e959ad57d - languageName: node - linkType: hard - -"es6-promisify@npm:^5.0.0": - version: 5.0.0 - resolution: "es6-promisify@npm:5.0.0" - dependencies: - es6-promise: ^4.0.3 - checksum: fbed9d791598831413be84a5374eca8c24800ec71a16c1c528c43a98e2dadfb99331483d83ae6094ddb9b87e6f799a15d1553cebf756047e0865c753bc346b92 - languageName: node - linkType: hard - -"escalade@npm:^3.1.1": - version: 3.1.1 - resolution: "escalade@npm:3.1.1" - checksum: a3e2a99f07acb74b3ad4989c48ca0c3140f69f923e56d0cba0526240ee470b91010f9d39001f2a4a313841d237ede70a729e92125191ba5d21e74b106800b133 - languageName: node - linkType: hard - -"escape-string-regexp@npm:1.0.5, escape-string-regexp@npm:^1.0.5": - version: 1.0.5 - resolution: "escape-string-regexp@npm:1.0.5" - checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 - languageName: node - linkType: hard - -"escape-string-regexp@npm:4.0.0, escape-string-regexp@npm:^4.0.0": - version: 4.0.0 - resolution: "escape-string-regexp@npm:4.0.0" - checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 - languageName: node - linkType: hard - -"escodegen@npm:1.8.x": - version: 1.8.1 - resolution: "escodegen@npm:1.8.1" - dependencies: - esprima: ^2.7.1 - estraverse: ^1.9.1 - esutils: ^2.0.2 - optionator: ^0.8.1 - source-map: ~0.2.0 - dependenciesMeta: - source-map: - optional: true - bin: - escodegen: ./bin/escodegen.js - esgenerate: ./bin/esgenerate.js - checksum: 99f5579dbc309d8f95f8051cce2f85620c073ff1d4f7b58197addee7e81aeb5281dadfbd446a0885b8fb8c0c47ce5c2cdb5f97dbfddccb5126cca5eb9af73992 - languageName: node - linkType: hard - -"eslint-config-prettier@npm:^8.5.0": - version: 8.8.0 - resolution: "eslint-config-prettier@npm:8.8.0" - peerDependencies: - eslint: ">=7.0.0" - bin: - eslint-config-prettier: bin/cli.js - checksum: 1e94c3882c4d5e41e1dcfa2c368dbccbfe3134f6ac7d40101644d3bfbe3eb2f2ffac757f3145910b5eacf20c0e85e02b91293d3126d770cbf3dc390b3564681c - languageName: node - linkType: hard - -"eslint-scope@npm:^5.1.1": - version: 5.1.1 - resolution: "eslint-scope@npm:5.1.1" - dependencies: - esrecurse: ^4.3.0 - estraverse: ^4.1.1 - checksum: 47e4b6a3f0cc29c7feedee6c67b225a2da7e155802c6ea13bbef4ac6b9e10c66cd2dcb987867ef176292bf4e64eccc680a49e35e9e9c669f4a02bac17e86abdb - languageName: node - linkType: hard - -"eslint-scope@npm:^7.1.1": - version: 7.1.1 - resolution: "eslint-scope@npm:7.1.1" - dependencies: - esrecurse: ^4.3.0 - estraverse: ^5.2.0 - checksum: 9f6e974ab2db641ca8ab13508c405b7b859e72afe9f254e8131ff154d2f40c99ad4545ce326fd9fde3212ff29707102562a4834f1c48617b35d98c71a97fbf3e - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.0": - version: 3.4.0 - resolution: "eslint-visitor-keys@npm:3.4.0" - checksum: 33159169462d3989321a1ec1e9aaaf6a24cc403d5d347e9886d1b5bfe18ffa1be73bdc6203143a28a606b142b1af49787f33cff0d6d0813eb5f2e8d2e1a6043c - languageName: node - linkType: hard - -"eslint@npm:^8.28.0": - version: 8.37.0 - resolution: "eslint@npm:8.37.0" - dependencies: - "@eslint-community/eslint-utils": ^4.2.0 - "@eslint-community/regexpp": ^4.4.0 - "@eslint/eslintrc": ^2.0.2 - "@eslint/js": 8.37.0 - "@humanwhocodes/config-array": ^0.11.8 - "@humanwhocodes/module-importer": ^1.0.1 - "@nodelib/fs.walk": ^1.2.8 - ajv: ^6.10.0 - 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.1.1 - eslint-visitor-keys: ^3.4.0 - espree: ^9.5.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 - grapheme-splitter: ^1.0.4 - ignore: ^5.2.0 - import-fresh: ^3.0.0 - imurmurhash: ^0.1.4 - is-glob: ^4.0.0 - is-path-inside: ^3.0.3 - js-sdsl: ^4.1.4 - 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.1 - strip-ansi: ^6.0.1 - strip-json-comments: ^3.1.0 - text-table: ^0.2.0 - bin: - eslint: bin/eslint.js - checksum: 80f3d5cdce2d671f4794e392d234a78d039c347673defb0596268bd481e8f30a53d93c01ff4f66a546c87d97ab4122c0e9cafe1371f87cb03cee6b7d5aa97595 - languageName: node - linkType: hard - -"espree@npm:^9.5.1": - version: 9.5.1 - resolution: "espree@npm:9.5.1" - dependencies: - acorn: ^8.8.0 - acorn-jsx: ^5.3.2 - eslint-visitor-keys: ^3.4.0 - checksum: cdf6e43540433d917c4f2ee087c6e987b2063baa85a1d9cdaf51533d78275ebd5910c42154e7baf8e3e89804b386da0a2f7fad2264d8f04420e7506bf87b3b88 - languageName: node - linkType: hard - -"esprima@npm:2.7.x, esprima@npm:^2.7.1": - version: 2.7.3 - resolution: "esprima@npm:2.7.3" - bin: - esparse: ./bin/esparse.js - esvalidate: ./bin/esvalidate.js - checksum: 55584508dca0551885e62c3369bc4a783bd948b43e2f034f05c2a37f3ca398db99f072ab228234e9cab09af8dc8c65d6ca7de3a975f2a296b34d1a3aba7e89f1 - languageName: node - linkType: hard - -"esprima@npm:^4.0.0": - version: 4.0.1 - resolution: "esprima@npm:4.0.1" - bin: - esparse: ./bin/esparse.js - esvalidate: ./bin/esvalidate.js - checksum: b45bc805a613dbea2835278c306b91aff6173c8d034223fa81498c77dcbce3b2931bf6006db816f62eacd9fd4ea975dfd85a5b7f3c6402cfd050d4ca3c13a628 - languageName: node - linkType: hard - -"esquery@npm:^1.4.2": - version: 1.5.0 - resolution: "esquery@npm:1.5.0" - dependencies: - estraverse: ^5.1.0 - checksum: aefb0d2596c230118656cd4ec7532d447333a410a48834d80ea648b1e7b5c9bc9ed8b5e33a89cb04e487b60d622f44cf5713bf4abed7c97343edefdc84a35900 - languageName: node - linkType: hard - -"esrecurse@npm:^4.3.0": - version: 4.3.0 - resolution: "esrecurse@npm:4.3.0" - dependencies: - estraverse: ^5.2.0 - checksum: ebc17b1a33c51cef46fdc28b958994b1dc43cd2e86237515cbc3b4e5d2be6a811b2315d0a1a4d9d340b6d2308b15322f5c8291059521cc5f4802f65e7ec32837 - languageName: node - linkType: hard - -"estraverse@npm:^1.9.1": - version: 1.9.3 - resolution: "estraverse@npm:1.9.3" - checksum: 78fa96317500e7783d48297dbd4c7f8735ddeb970be2981b485639ffa77578d05b8f781332622e436f2e9e533f32923c62c2e6463291e577ceeaf2776ac5e4b5 - languageName: node - linkType: hard - -"estraverse@npm:^4.1.1": - version: 4.3.0 - resolution: "estraverse@npm:4.3.0" - checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 - languageName: node - linkType: hard - -"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": - version: 5.3.0 - resolution: "estraverse@npm:5.3.0" - checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b - languageName: node - linkType: hard - -"esutils@npm:^2.0.2": - version: 2.0.3 - resolution: "esutils@npm:2.0.3" - checksum: 22b5b08f74737379a840b8ed2036a5fb35826c709ab000683b092d9054e5c2a82c27818f12604bfc2a9a76b90b6834ef081edbc1c7ae30d1627012e067c6ec87 - languageName: node - linkType: hard - -"eth-gas-reporter@npm:^0.2.25": - version: 0.2.25 - resolution: "eth-gas-reporter@npm:0.2.25" - dependencies: - "@ethersproject/abi": ^5.0.0-beta.146 - "@solidity-parser/parser": ^0.14.0 - cli-table3: ^0.5.0 - colors: 1.4.0 - ethereum-cryptography: ^1.0.3 - ethers: ^4.0.40 - fs-readdir-recursive: ^1.1.0 - lodash: ^4.17.14 - markdown-table: ^1.1.3 - mocha: ^7.1.1 - req-cwd: ^2.0.0 - request: ^2.88.0 - request-promise-native: ^1.0.5 - sha1: ^1.1.1 - sync-request: ^6.0.0 - peerDependencies: - "@codechecks/client": ^0.1.0 - peerDependenciesMeta: - "@codechecks/client": - optional: true - checksum: 3bfa81e554b069bb817f2a073a601a0429e6b582c56ad99db0727dc2a102ab00fc27888820b8a042a194a8fb7d40954d10cd7b011ede6b8170285d2d5a88666c - languageName: node - linkType: hard - -"ethereum-bloom-filters@npm:^1.0.6": - version: 1.0.10 - resolution: "ethereum-bloom-filters@npm:1.0.10" - dependencies: - js-sha3: ^0.8.0 - checksum: 4019cc6f9274ae271a52959194a72f6e9b013366f168f922dc3b349319faf7426bf1010125ee0676b4f75714fe4a440edd4e7e62342c121a046409f4cd4c0af9 - languageName: node - linkType: hard - -"ethereum-cryptography@npm:0.1.3, ethereum-cryptography@npm:^0.1.3": - version: 0.1.3 - resolution: "ethereum-cryptography@npm:0.1.3" - dependencies: - "@types/pbkdf2": ^3.0.0 - "@types/secp256k1": ^4.0.1 - blakejs: ^1.1.0 - browserify-aes: ^1.2.0 - bs58check: ^2.1.2 - create-hash: ^1.2.0 - create-hmac: ^1.1.7 - hash.js: ^1.1.7 - keccak: ^3.0.0 - pbkdf2: ^3.0.17 - randombytes: ^2.1.0 - safe-buffer: ^5.1.2 - scrypt-js: ^3.0.0 - secp256k1: ^4.0.1 - setimmediate: ^1.0.5 - checksum: 54bae7a4a96bd81398cdc35c91cfcc74339f71a95ed1b5b694663782e69e8e3afd21357de3b8bac9ff4877fd6f043601e200a7ad9133d94be6fd7d898ee0a449 - languageName: node - linkType: hard - -"ethereum-cryptography@npm:^1.0.3": - version: 1.2.0 - resolution: "ethereum-cryptography@npm:1.2.0" - dependencies: - "@noble/hashes": 1.2.0 - "@noble/secp256k1": 1.7.1 - "@scure/bip32": 1.1.5 - "@scure/bip39": 1.1.1 - checksum: 97e8e8253cb9f5a9271bd0201c37609c451c890eb85883b9c564f14743c3d7c673287406c93bf5604307593ee298ad9a03983388b85c11ca61461b9fc1a4f2c7 - languageName: node - linkType: hard - -"ethereumjs-abi@npm:^0.6.8": - version: 0.6.8 - resolution: "ethereumjs-abi@npm:0.6.8" - dependencies: - bn.js: ^4.11.8 - ethereumjs-util: ^6.0.0 - checksum: cede2a8ae7c7e04eeaec079c2f925601a25b2ef75cf9230e7c5da63b4ea27883b35447365a47e35c1e831af520973a2252af89022c292c18a09a4607821a366b - languageName: node - linkType: hard - -"ethereumjs-util@npm:^6.0.0, ethereumjs-util@npm:^6.2.1": - version: 6.2.1 - resolution: "ethereumjs-util@npm:6.2.1" - dependencies: - "@types/bn.js": ^4.11.3 - bn.js: ^4.11.0 - create-hash: ^1.1.2 - elliptic: ^6.5.2 - ethereum-cryptography: ^0.1.3 - ethjs-util: 0.1.6 - rlp: ^2.2.3 - checksum: e3cb4a2c034a2529281fdfc21a2126fe032fdc3038863f5720352daa65ddcc50fc8c67dbedf381a882dc3802e05d979287126d7ecf781504bde1fd8218693bde - languageName: node - linkType: hard - -"ethereumjs-util@npm:^7.1.0, ethereumjs-util@npm:^7.1.4": - version: 7.1.5 - resolution: "ethereumjs-util@npm:7.1.5" - dependencies: - "@types/bn.js": ^5.1.0 - bn.js: ^5.1.2 - create-hash: ^1.1.2 - ethereum-cryptography: ^0.1.3 - rlp: ^2.2.4 - checksum: 27a3c79d6e06b2df34b80d478ce465b371c8458b58f5afc14d91c8564c13363ad336e6e83f57eb0bd719fde94d10ee5697ceef78b5aa932087150c5287b286d1 - languageName: node - linkType: hard - -"ethers@npm:^4.0.40": - version: 4.0.49 - resolution: "ethers@npm:4.0.49" - dependencies: - aes-js: 3.0.0 - bn.js: ^4.11.9 - elliptic: 6.5.4 - hash.js: 1.1.3 - js-sha3: 0.5.7 - scrypt-js: 2.0.4 - setimmediate: 1.0.4 - uuid: 2.0.1 - xmlhttprequest: 1.8.0 - checksum: 357115348a5f1484c7745fae1d852876788216c7d94c072c80132192f1800c4d388433ea2456750856641d6d4eed8a3b41847eb44f5e1c42139963864e3bcc38 - languageName: node - linkType: hard - -"ethers@npm:^5.5.3, ethers@npm:^5.7.1, ethers@npm:^5.7.2": - version: 5.7.2 - resolution: "ethers@npm:5.7.2" - 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 - checksum: b7c08cf3e257185a7946117dbbf764433b7ba0e77c27298dec6088b3bc871aff711462b0621930c56880ff0a7ceb8b1d3a361ffa259f93377b48e34107f62553 - languageName: node - linkType: hard - -"ethjs-unit@npm:0.1.6": - version: 0.1.6 - resolution: "ethjs-unit@npm:0.1.6" - dependencies: - bn.js: 4.11.6 - number-to-bn: 1.7.0 - checksum: df6b4752ff7461a59a20219f4b1684c631ea601241c39660e3f6c6bd63c950189723841c22b3c6c0ebeb3c9fc99e0e803e3c613101206132603705fcbcf4def5 - languageName: node - linkType: hard - -"ethjs-util@npm:0.1.6, ethjs-util@npm:^0.1.6": - version: 0.1.6 - resolution: "ethjs-util@npm:0.1.6" - dependencies: - is-hex-prefixed: 1.0.0 - strip-hex-prefix: 1.0.0 - checksum: 1f42959e78ec6f49889c49c8a98639e06f52a15966387dd39faf2930db48663d026efb7db2702dcffe7f2a99c4a0144b7ce784efdbf733f4077aae95de76d65f - languageName: node - linkType: hard - -"eventemitter3@npm:^4.0.7": - version: 4.0.7 - resolution: "eventemitter3@npm:4.0.7" - checksum: 1875311c42fcfe9c707b2712c32664a245629b42bb0a5a84439762dd0fd637fc54d078155ea83c2af9e0323c9ac13687e03cfba79b03af9f40c89b4960099374 - languageName: node - linkType: hard - -"evp_bytestokey@npm:^1.0.3": - version: 1.0.3 - resolution: "evp_bytestokey@npm:1.0.3" - dependencies: - md5.js: ^1.3.4 - node-gyp: latest - safe-buffer: ^5.1.1 - checksum: ad4e1577f1a6b721c7800dcc7c733fe01f6c310732bb5bf2240245c2a5b45a38518b91d8be2c610611623160b9d1c0e91f1ce96d639f8b53e8894625cf20fa45 - languageName: node - linkType: hard - -"execa@npm:^5.0.0": - version: 5.1.1 - resolution: "execa@npm:5.1.1" - dependencies: - cross-spawn: ^7.0.3 - get-stream: ^6.0.0 - human-signals: ^2.1.0 - is-stream: ^2.0.0 - merge-stream: ^2.0.0 - npm-run-path: ^4.0.1 - onetime: ^5.1.2 - signal-exit: ^3.0.3 - strip-final-newline: ^2.0.0 - checksum: fba9022c8c8c15ed862847e94c252b3d946036d7547af310e344a527e59021fd8b6bb0723883ea87044dc4f0201f949046993124a42ccb0855cae5bf8c786343 - languageName: node - linkType: hard - -"execa@npm:^7.0.0": - version: 7.1.1 - resolution: "execa@npm:7.1.1" - dependencies: - cross-spawn: ^7.0.3 - get-stream: ^6.0.1 - human-signals: ^4.3.0 - is-stream: ^3.0.0 - merge-stream: ^2.0.0 - npm-run-path: ^5.1.0 - onetime: ^6.0.0 - signal-exit: ^3.0.7 - strip-final-newline: ^3.0.0 - checksum: 21fa46fc69314ace4068cf820142bdde5b643a5d89831c2c9349479c1555bff137a291b8e749e7efca36535e4e0a8c772c11008ca2e84d2cbd6ca141a3c8f937 - languageName: node - linkType: hard - -"expand-tilde@npm:^2.0.0, expand-tilde@npm:^2.0.2": - version: 2.0.2 - resolution: "expand-tilde@npm:2.0.2" - dependencies: - homedir-polyfill: ^1.0.1 - checksum: 2efe6ed407d229981b1b6ceb552438fbc9e5c7d6a6751ad6ced3e0aa5cf12f0b299da695e90d6c2ac79191b5c53c613e508f7149e4573abfbb540698ddb7301a - languageName: node - linkType: hard - -"extend@npm:~3.0.2": - version: 3.0.2 - resolution: "extend@npm:3.0.2" - checksum: a50a8309ca65ea5d426382ff09f33586527882cf532931cb08ca786ea3146c0553310bda688710ff61d7668eba9f96b923fe1420cdf56a2c3eaf30fcab87b515 - languageName: node - linkType: hard - -"external-editor@npm:^3.0.3": - version: 3.1.0 - resolution: "external-editor@npm:3.1.0" - dependencies: - chardet: ^0.7.0 - iconv-lite: ^0.4.24 - tmp: ^0.0.33 - checksum: 1c2a616a73f1b3435ce04030261bed0e22d4737e14b090bb48e58865da92529c9f2b05b893de650738d55e692d071819b45e1669259b2b354bc3154d27a698c7 - languageName: node - linkType: hard - -"extsprintf@npm:1.3.0": - version: 1.3.0 - resolution: "extsprintf@npm:1.3.0" - checksum: cee7a4a1e34cffeeec18559109de92c27517e5641991ec6bab849aa64e3081022903dd53084f2080d0d2530803aa5ee84f1e9de642c365452f9e67be8f958ce2 - languageName: node - linkType: hard - -"extsprintf@npm:^1.2.0": - version: 1.4.1 - resolution: "extsprintf@npm:1.4.1" - checksum: a2f29b241914a8d2bad64363de684821b6b1609d06ae68d5b539e4de6b28659715b5bea94a7265201603713b7027d35399d10b0548f09071c5513e65e8323d33 - languageName: node - linkType: hard - -"eyes@npm:^0.1.8": - version: 0.1.8 - resolution: "eyes@npm:0.1.8" - checksum: c31703a92bf36ba75ee8d379ee7985c24ee6149f3a6175f44cec7a05b178c38bce9836d3ca48c9acb0329a960ac2c4b2ead4e60cdd4fe6e8c92cad7cd6913687 - languageName: node - linkType: hard - -"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": - version: 3.1.3 - resolution: "fast-deep-equal@npm:3.1.3" - checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d - languageName: node - linkType: hard - -"fast-diff@npm:^1.1.2, fast-diff@npm:^1.2.0": - version: 1.2.0 - resolution: "fast-diff@npm:1.2.0" - checksum: 1b5306eaa9e826564d9e5ffcd6ebd881eb5f770b3f977fcbf38f05c824e42172b53c79920e8429c54eb742ce15a0caf268b0fdd5b38f6de52234c4a8368131ae - languageName: node - linkType: hard - -"fast-glob@npm:^3.0.3, fast-glob@npm:^3.2.9": - version: 3.2.12 - resolution: "fast-glob@npm:3.2.12" - 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 - checksum: 0b1990f6ce831c7e28c4d505edcdaad8e27e88ab9fa65eedadb730438cfc7cde4910d6c975d6b7b8dc8a73da4773702ebcfcd6e3518e73938bb1383badfe01c2 - languageName: node - linkType: hard - -"fast-json-stable-stringify@npm:^2.0.0": - version: 2.1.0 - resolution: "fast-json-stable-stringify@npm:2.1.0" - checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb - languageName: node - linkType: hard - -"fast-levenshtein@npm:^2.0.6, fast-levenshtein@npm:~2.0.6": - version: 2.0.6 - resolution: "fast-levenshtein@npm:2.0.6" - checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c - languageName: node - linkType: hard - -"fast-stable-stringify@npm:^1.0.0": - version: 1.0.0 - resolution: "fast-stable-stringify@npm:1.0.0" - checksum: ef1203d246a7e8ac15e2bfbda0a89fa375947bccf9f7910be0ea759856dbe8ea5024a0d8cc2cceabe18a9cb67e95927b78bb6173a3ae37ec55a518cf36e5244b - languageName: node - linkType: hard - -"fastq@npm:^1.6.0": - version: 1.15.0 - resolution: "fastq@npm:1.15.0" - dependencies: - reusify: ^1.0.4 - checksum: 0170e6bfcd5d57a70412440b8ef600da6de3b2a6c5966aeaf0a852d542daff506a0ee92d6de7679d1de82e644bce69d7a574a6c93f0b03964b5337eed75ada1a - languageName: node - linkType: hard - -"figures@npm:^3.0.0": - version: 3.2.0 - resolution: "figures@npm:3.2.0" - dependencies: - escape-string-regexp: ^1.0.5 - checksum: 85a6ad29e9aca80b49b817e7c89ecc4716ff14e3779d9835af554db91bac41c0f289c418923519392a1e582b4d10482ad282021330cd045bb7b80c84152f2a2b - languageName: node - linkType: hard - -"file-entry-cache@npm:^6.0.1": - version: 6.0.1 - resolution: "file-entry-cache@npm:6.0.1" - dependencies: - flat-cache: ^3.0.4 - checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 - languageName: node - linkType: hard - -"file-uri-to-path@npm:1.0.0": - version: 1.0.0 - resolution: "file-uri-to-path@npm:1.0.0" - checksum: b648580bdd893a008c92c7ecc96c3ee57a5e7b6c4c18a9a09b44fb5d36d79146f8e442578bc0e173dc027adf3987e254ba1dfd6e3ec998b7c282873010502144 - languageName: node - linkType: hard - -"fill-range@npm:^7.0.1": - version: 7.0.1 - resolution: "fill-range@npm:7.0.1" - dependencies: - to-regex-range: ^5.0.1 - checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 - languageName: node - linkType: hard - -"find-node-modules@npm:^2.1.2": - version: 2.1.3 - resolution: "find-node-modules@npm:2.1.3" - dependencies: - findup-sync: ^4.0.0 - merge: ^2.1.1 - checksum: 4b8a194ffd56ccf1a1033de35e2ee8209869b05cce68ff7c4ab0dbf04e63fd7196283383eee4c84596c7b311755b2836815209d558234cadc330a87881e5a3f4 - languageName: node - linkType: hard - -"find-replace@npm:^3.0.0": - version: 3.0.0 - resolution: "find-replace@npm:3.0.0" - dependencies: - array-back: ^3.0.1 - checksum: 6b04bcfd79027f5b84aa1dfe100e3295da989bdac4b4de6b277f4d063e78f5c9e92ebc8a1fec6dd3b448c924ba404ee051cc759e14a3ee3e825fa1361025df08 - languageName: node - linkType: hard - -"find-root@npm:1.1.0": - version: 1.1.0 - resolution: "find-root@npm:1.1.0" - checksum: b2a59fe4b6c932eef36c45a048ae8f93c85640212ebe8363164814990ee20f154197505965f3f4f102efc33bfb1cbc26fd17c4a2fc739ebc51b886b137cbefaf - languageName: node - linkType: hard - -"find-up@npm:3.0.0, find-up@npm:^3.0.0": - version: 3.0.0 - resolution: "find-up@npm:3.0.0" - dependencies: - locate-path: ^3.0.0 - checksum: 38eba3fe7a66e4bc7f0f5a1366dc25508b7cfc349f852640e3678d26ad9a6d7e2c43eff0a472287de4a9753ef58f066a0ea892a256fa3636ad51b3fe1e17fae9 - languageName: node - linkType: hard - -"find-up@npm:5.0.0, find-up@npm:^5.0.0": - version: 5.0.0 - resolution: "find-up@npm:5.0.0" - dependencies: - locate-path: ^6.0.0 - path-exists: ^4.0.0 - checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 - languageName: node - linkType: hard - -"find-up@npm:^2.1.0": - version: 2.1.0 - resolution: "find-up@npm:2.1.0" - dependencies: - locate-path: ^2.0.0 - checksum: 43284fe4da09f89011f08e3c32cd38401e786b19226ea440b75386c1b12a4cb738c94969808d53a84f564ede22f732c8409e3cfc3f7fb5b5c32378ad0bbf28bd - languageName: node - linkType: hard - -"find-up@npm:^4.1.0": - version: 4.1.0 - resolution: "find-up@npm:4.1.0" - dependencies: - locate-path: ^5.0.0 - path-exists: ^4.0.0 - checksum: 4c172680e8f8c1f78839486e14a43ef82e9decd0e74145f40707cc42e7420506d5ec92d9a11c22bd2c48fb0c384ea05dd30e10dd152fefeec6f2f75282a8b844 - languageName: node - linkType: hard - -"findup-sync@npm:^4.0.0": - version: 4.0.0 - resolution: "findup-sync@npm:4.0.0" - dependencies: - detect-file: ^1.0.0 - is-glob: ^4.0.0 - micromatch: ^4.0.2 - resolve-dir: ^1.0.1 - checksum: 94131e1107ad63790ed00c4c39ca131a93ea602607bd97afeffd92b69a9a63cf2c6f57d6db88cb753fe748ac7fde79e1e76768ff784247026b7c5ebf23ede3a0 - languageName: node - linkType: hard - -"flat-cache@npm:^3.0.4": - version: 3.0.4 - resolution: "flat-cache@npm:3.0.4" - dependencies: - flatted: ^3.1.0 - rimraf: ^3.0.2 - checksum: 4fdd10ecbcbf7d520f9040dd1340eb5dfe951e6f0ecf2252edeec03ee68d989ec8b9a20f4434270e71bcfd57800dc09b3344fca3966b2eb8f613072c7d9a2365 - languageName: node - linkType: hard - -"flat@npm:^4.1.0": - version: 4.1.1 - resolution: "flat@npm:4.1.1" - dependencies: - is-buffer: ~2.0.3 - bin: - flat: cli.js - checksum: 398be12185eb0f3c59797c3670a8c35d07020b673363175676afbaf53d6b213660e060488554cf82c25504986e1a6059bdbcc5d562e87ca3e972e8a33148e3ae - languageName: node - linkType: hard - -"flat@npm:^5.0.2": - version: 5.0.2 - resolution: "flat@npm:5.0.2" - bin: - flat: cli.js - checksum: 12a1536ac746db74881316a181499a78ef953632ddd28050b7a3a43c62ef5462e3357c8c29d76072bb635f147f7a9a1f0c02efef6b4be28f8db62ceb3d5c7f5d - languageName: node - linkType: hard - -"flatted@npm:^3.1.0": - version: 3.2.7 - resolution: "flatted@npm:3.2.7" - checksum: 427633049d55bdb80201c68f7eb1cbd533e03eac541f97d3aecab8c5526f12a20ccecaeede08b57503e772c769e7f8680b37e8d482d1e5f8d7e2194687f9ea35 - languageName: node - linkType: hard - -"fmix@npm:^0.1.0": - version: 0.1.0 - resolution: "fmix@npm:0.1.0" - dependencies: - imul: ^1.0.0 - checksum: c465344d4f169eaf10d45c33949a1e7a633f09dba2ac7063ce8ae8be743df5979d708f7f24900163589f047f5194ac5fc2476177ce31175e8805adfa7b8fb7a4 - languageName: node - linkType: hard - -"follow-redirects@npm:^1.12.1, follow-redirects@npm:^1.14.0": - version: 1.15.2 - resolution: "follow-redirects@npm:1.15.2" - peerDependenciesMeta: - debug: - optional: true - checksum: faa66059b66358ba65c234c2f2a37fcec029dc22775f35d9ad6abac56003268baf41e55f9ee645957b32c7d9f62baf1f0b906e68267276f54ec4b4c597c2b190 - languageName: node - linkType: hard - -"for-each@npm:^0.3.3": - version: 0.3.3 - resolution: "for-each@npm:0.3.3" - dependencies: - is-callable: ^1.1.3 - checksum: 6c48ff2bc63362319c65e2edca4a8e1e3483a2fabc72fbe7feaf8c73db94fc7861bd53bc02c8a66a0c1dd709da6b04eec42e0abdd6b40ce47305ae92a25e5d28 - languageName: node - linkType: hard - -"forever-agent@npm:~0.6.1": - version: 0.6.1 - resolution: "forever-agent@npm:0.6.1" - checksum: 766ae6e220f5fe23676bb4c6a99387cec5b7b62ceb99e10923376e27bfea72f3c3aeec2ba5f45f3f7ba65d6616965aa7c20b15002b6860833bb6e394dea546a8 - languageName: node - linkType: hard - -"form-data@npm:^2.2.0": - version: 2.5.1 - resolution: "form-data@npm:2.5.1" - dependencies: - asynckit: ^0.4.0 - combined-stream: ^1.0.6 - mime-types: ^2.1.12 - checksum: 5134ada56cc246b293a1ac7678dba6830000603a3979cf83ff7b2f21f2e3725202237cfb89e32bcb38a1d35727efbd3c3a22e65b42321e8ade8eec01ce755d08 - languageName: node - linkType: hard - -"form-data@npm:^4.0.0": - version: 4.0.0 - resolution: "form-data@npm:4.0.0" - dependencies: - asynckit: ^0.4.0 - combined-stream: ^1.0.8 - mime-types: ^2.1.12 - checksum: 01135bf8675f9d5c61ff18e2e2932f719ca4de964e3be90ef4c36aacfc7b9cb2fceb5eca0b7e0190e3383fe51c5b37f4cb80b62ca06a99aaabfcfd6ac7c9328c - languageName: node - linkType: hard - -"form-data@npm:~2.3.2": - version: 2.3.3 - resolution: "form-data@npm:2.3.3" - dependencies: - asynckit: ^0.4.0 - combined-stream: ^1.0.6 - mime-types: ^2.1.12 - checksum: 10c1780fa13dbe1ff3100114c2ce1f9307f8be10b14bf16e103815356ff567b6be39d70fc4a40f8990b9660012dc24b0f5e1dde1b6426166eb23a445ba068ca3 - languageName: node - linkType: hard - -"fp-ts@npm:1.19.3": - version: 1.19.3 - resolution: "fp-ts@npm:1.19.3" - checksum: eb0d4766ad561e9c5c01bfdd3d0ae589af135556921c733d26cf5289aad9f400110defdd93e6ac1d71f626697bb44d9d95ed2879c53dfd868f7cac3cf5c5553c - languageName: node - linkType: hard - -"fp-ts@npm:^1.0.0": - version: 1.19.5 - resolution: "fp-ts@npm:1.19.5" - checksum: 67d2d9c3855d211ca2592b1ef805f98b618157e7681791a776d9d0f7f3e52fcca2122ebf5bc215908c9099fad69756d40e37210cf46cb4075dae1b61efe69e40 - languageName: node - linkType: hard - -"fs-extra@npm:9.1.0, fs-extra@npm:^9.1.0": - version: 9.1.0 - resolution: "fs-extra@npm:9.1.0" - dependencies: - at-least-node: ^1.0.0 - graceful-fs: ^4.2.0 - jsonfile: ^6.0.1 - universalify: ^2.0.0 - checksum: ba71ba32e0faa74ab931b7a0031d1523c66a73e225de7426e275e238e312d07313d2da2d33e34a52aa406c8763ade5712eb3ec9ba4d9edce652bcacdc29e6b20 - languageName: node - linkType: hard - -"fs-extra@npm:^0.30.0": - version: 0.30.0 - resolution: "fs-extra@npm:0.30.0" - dependencies: - graceful-fs: ^4.1.2 - jsonfile: ^2.1.0 - klaw: ^1.0.0 - path-is-absolute: ^1.0.0 - rimraf: ^2.2.8 - checksum: 6edfd65fc813baa27f1603778c0f5ec11f8c5006a20b920437813ee2023eba18aeec8bef1c89b2e6c84f9fc90fdc7c916f4a700466c8c69d22a35d018f2570f0 - languageName: node - linkType: hard - -"fs-extra@npm:^10.0.0, fs-extra@npm:^10.1.0": - version: 10.1.0 - resolution: "fs-extra@npm:10.1.0" - dependencies: - graceful-fs: ^4.2.0 - jsonfile: ^6.0.1 - universalify: ^2.0.0 - checksum: dc94ab37096f813cc3ca12f0f1b5ad6744dfed9ed21e953d72530d103cea193c2f81584a39e9dee1bea36de5ee66805678c0dddc048e8af1427ac19c00fffc50 - languageName: node - linkType: hard - -"fs-extra@npm:^11.0.0": - version: 11.1.1 - resolution: "fs-extra@npm:11.1.1" - dependencies: - graceful-fs: ^4.2.0 - jsonfile: ^6.0.1 - universalify: ^2.0.0 - checksum: fb883c68245b2d777fbc1f2082c9efb084eaa2bbf9fddaa366130d196c03608eebef7fb490541276429ee1ca99f317e2d73e96f5ca0999eefedf5a624ae1edfd - languageName: node - linkType: hard - -"fs-extra@npm:^7.0.0, fs-extra@npm:^7.0.1": - version: 7.0.1 - resolution: "fs-extra@npm:7.0.1" - dependencies: - graceful-fs: ^4.1.2 - jsonfile: ^4.0.0 - universalify: ^0.1.0 - checksum: 141b9dccb23b66a66cefdd81f4cda959ff89282b1d721b98cea19ba08db3dcbe6f862f28841f3cf24bb299e0b7e6c42303908f65093cb7e201708e86ea5a8dcf - languageName: node - linkType: hard - -"fs-extra@npm:^8.1.0": - version: 8.1.0 - resolution: "fs-extra@npm:8.1.0" - dependencies: - graceful-fs: ^4.2.0 - jsonfile: ^4.0.0 - universalify: ^0.1.0 - checksum: bf44f0e6cea59d5ce071bba4c43ca76d216f89e402dc6285c128abc0902e9b8525135aa808adad72c9d5d218e9f4bcc63962815529ff2f684ad532172a284880 - languageName: node - linkType: hard - -"fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0": - version: 2.1.0 - resolution: "fs-minipass@npm:2.1.0" - dependencies: - minipass: ^3.0.0 - checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1 - languageName: node - linkType: hard - -"fs-readdir-recursive@npm:^1.1.0": - version: 1.1.0 - resolution: "fs-readdir-recursive@npm:1.1.0" - checksum: 29d50f3d2128391c7fc9fd051c8b7ea45bcc8aa84daf31ef52b17218e20bfd2bd34d02382742801954cc8d1905832b68227f6b680a666ce525d8b6b75068ad1e - languageName: node - linkType: hard - -"fs.realpath@npm:^1.0.0": - version: 1.0.0 - resolution: "fs.realpath@npm:1.0.0" - checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 - languageName: node - linkType: hard - -"fsevents@npm:~2.1.1": - version: 2.1.3 - resolution: "fsevents@npm:2.1.3" - dependencies: - node-gyp: latest - checksum: b5ec0516b44d75b60af5c01ff80a80cd995d175e4640d2a92fbabd02991dd664d76b241b65feef0775c23d531c3c74742c0fbacd6205af812a9c3cef59f04292 - conditions: os=darwin - languageName: node - linkType: hard - -"fsevents@npm:~2.3.2": - version: 2.3.2 - resolution: "fsevents@npm:2.3.2" - dependencies: - node-gyp: latest - checksum: 97ade64e75091afee5265e6956cb72ba34db7819b4c3e94c431d4be2b19b8bb7a2d4116da417950c3425f17c8fe693d25e20212cac583ac1521ad066b77ae31f - conditions: os=darwin - languageName: node - linkType: hard - -"fsevents@patch:fsevents@~2.1.1#~builtin": - version: 2.1.3 - resolution: "fsevents@patch:fsevents@npm%3A2.1.3#~builtin::version=2.1.3&hash=18f3a7" - dependencies: - node-gyp: latest - conditions: os=darwin - languageName: node - linkType: hard - -"fsevents@patch:fsevents@~2.3.2#~builtin": - version: 2.3.2 - resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=18f3a7" - dependencies: - node-gyp: latest - conditions: os=darwin - languageName: node - linkType: hard - -"function-bind@npm:^1.1.1": - version: 1.1.1 - resolution: "function-bind@npm:1.1.1" - checksum: b32fbaebb3f8ec4969f033073b43f5c8befbb58f1a79e12f1d7490358150359ebd92f49e72ff0144f65f2c48ea2a605bff2d07965f548f6474fd8efd95bf361a - languageName: node - linkType: hard - -"function.prototype.name@npm:^1.1.5": - version: 1.1.5 - resolution: "function.prototype.name@npm:1.1.5" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.19.0 - functions-have-names: ^1.2.2 - checksum: acd21d733a9b649c2c442f067567743214af5fa248dbeee69d8278ce7df3329ea5abac572be9f7470b4ec1cd4d8f1040e3c5caccf98ebf2bf861a0deab735c27 - languageName: node - linkType: hard - -"functional-red-black-tree@npm:^1.0.1": - version: 1.0.1 - resolution: "functional-red-black-tree@npm:1.0.1" - checksum: ca6c170f37640e2d94297da8bb4bf27a1d12bea3e00e6a3e007fd7aa32e37e000f5772acf941b4e4f3cf1c95c3752033d0c509af157ad8f526e7f00723b9eb9f - languageName: node - linkType: hard - -"functions-have-names@npm:^1.2.2": - version: 1.2.3 - resolution: "functions-have-names@npm:1.2.3" - checksum: c3f1f5ba20f4e962efb71344ce0a40722163e85bee2101ce25f88214e78182d2d2476aa85ef37950c579eb6cf6ee811c17b3101bb84004bb75655f3e33f3fdb5 - languageName: node - linkType: hard - -"gauge@npm:^4.0.3": - version: 4.0.4 - resolution: "gauge@npm:4.0.4" - dependencies: - aproba: ^1.0.3 || ^2.0.0 - color-support: ^1.1.3 - console-control-strings: ^1.1.0 - has-unicode: ^2.0.1 - signal-exit: ^3.0.7 - string-width: ^4.2.3 - strip-ansi: ^6.0.1 - wide-align: ^1.1.5 - checksum: 788b6bfe52f1dd8e263cda800c26ac0ca2ff6de0b6eee2fe0d9e3abf15e149b651bd27bf5226be10e6e3edb5c4e5d5985a5a1a98137e7a892f75eff76467ad2d - languageName: node - linkType: hard - -"get-caller-file@npm:^2.0.1, get-caller-file@npm:^2.0.5": - version: 2.0.5 - resolution: "get-caller-file@npm:2.0.5" - checksum: b9769a836d2a98c3ee734a88ba712e62703f1df31b94b784762c433c27a386dd6029ff55c2a920c392e33657d80191edbf18c61487e198844844516f843496b9 - languageName: node - linkType: hard - -"get-func-name@npm:^2.0.0": - version: 2.0.0 - resolution: "get-func-name@npm:2.0.0" - checksum: 8d82e69f3e7fab9e27c547945dfe5cc0c57fc0adf08ce135dddb01081d75684a03e7a0487466f478872b341d52ac763ae49e660d01ab83741f74932085f693c3 - languageName: node - linkType: hard - -"get-func-name@npm:^2.0.1, get-func-name@npm:^2.0.2": - version: 2.0.2 - resolution: "get-func-name@npm:2.0.2" - checksum: 3f62f4c23647de9d46e6f76d2b3eafe58933a9b3830c60669e4180d6c601ce1b4aa310ba8366143f55e52b139f992087a9f0647274e8745621fa2af7e0acf13b - languageName: node - linkType: hard - -"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0": - version: 1.2.0 - resolution: "get-intrinsic@npm:1.2.0" - dependencies: - function-bind: ^1.1.1 - has: ^1.0.3 - has-symbols: ^1.0.3 - checksum: 78fc0487b783f5c58cf2dccafc3ae656ee8d2d8062a8831ce4a95e7057af4587a1d4882246c033aca0a7b4965276f4802b45cc300338d1b77a73d3e3e3f4877d - languageName: node - linkType: hard - -"get-port@npm:^3.1.0": - version: 3.2.0 - resolution: "get-port@npm:3.2.0" - checksum: 31f530326569683ac4b7452eb7573c40e9dbe52aec14d80745c35475261e6389160da153d5b8ae911150b4ce99003472b30c69ba5be0cedeaa7865b95542d168 - languageName: node - linkType: hard - -"get-stream@npm:^6.0.0, get-stream@npm:^6.0.1": - version: 6.0.1 - resolution: "get-stream@npm:6.0.1" - checksum: e04ecece32c92eebf5b8c940f51468cd53554dcbb0ea725b2748be583c9523d00128137966afce410b9b051eb2ef16d657cd2b120ca8edafcf5a65e81af63cad - languageName: node - linkType: hard - -"get-symbol-description@npm:^1.0.0": - version: 1.0.0 - resolution: "get-symbol-description@npm:1.0.0" - dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.1.1 - checksum: 9ceff8fe968f9270a37a1f73bf3f1f7bda69ca80f4f80850670e0e7b9444ff99323f7ac52f96567f8b5f5fbe7ac717a0d81d3407c7313e82810c6199446a5247 - languageName: node - linkType: hard - -"getpass@npm:^0.1.1": - version: 0.1.7 - resolution: "getpass@npm:0.1.7" - dependencies: - assert-plus: ^1.0.0 - checksum: ab18d55661db264e3eac6012c2d3daeafaab7a501c035ae0ccb193c3c23e9849c6e29b6ac762b9c2adae460266f925d55a3a2a3a3c8b94be2f222df94d70c046 - languageName: node - linkType: hard - -"ghost-testrpc@npm:^0.0.2": - version: 0.0.2 - resolution: "ghost-testrpc@npm:0.0.2" - dependencies: - chalk: ^2.4.2 - node-emoji: ^1.10.0 - bin: - testrpc-sc: ./index.js - checksum: 3f86326d32f5e96c9356381837edde7dd0f23dcb7223aa73e02816256b84703cb76ce922987054a05b65963326088e99a4aa142d4b467ddda7c28547ed915d6d - languageName: node - linkType: hard - -"git-raw-commits@npm:^2.0.11": - version: 2.0.11 - resolution: "git-raw-commits@npm:2.0.11" - dependencies: - dargs: ^7.0.0 - lodash: ^4.17.15 - meow: ^8.0.0 - split2: ^3.0.0 - through2: ^4.0.0 - bin: - git-raw-commits: cli.js - checksum: c178af43633684106179793b6e3473e1d2bb50bb41d04e2e285ea4eef342ca4090fee6bc8a737552fde879d22346c90de5c49f18c719a0f38d4c934f258a0f79 - languageName: node - linkType: hard - -"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.0, glob-parent@npm:~5.1.2": - version: 5.1.2 - resolution: "glob-parent@npm:5.1.2" - dependencies: - is-glob: ^4.0.1 - checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e - languageName: node - linkType: hard - -"glob-parent@npm:^6.0.2": - version: 6.0.2 - resolution: "glob-parent@npm:6.0.2" - dependencies: - is-glob: ^4.0.3 - checksum: c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8 - languageName: node - linkType: hard - -"glob@npm:7.1.3": - version: 7.1.3 - resolution: "glob@npm:7.1.3" - 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 - checksum: d72a834a393948d6c4a5cacc6a29fe5fe190e1cd134e55dfba09aee0be6fe15be343e96d8ec43558ab67ff8af28e4420c7f63a4d4db1c779e515015e9c318616 - languageName: node - linkType: hard - -"glob@npm:7.1.7": - version: 7.1.7 - resolution: "glob@npm:7.1.7" - 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 - checksum: b61f48973bbdcf5159997b0874a2165db572b368b931135832599875919c237fc05c12984e38fe828e69aa8a921eb0e8a4997266211c517c9cfaae8a93988bb8 - languageName: node - linkType: hard - -"glob@npm:7.2.0": - version: 7.2.0 - resolution: "glob@npm:7.2.0" - 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 - checksum: 78a8ea942331f08ed2e055cb5b9e40fe6f46f579d7fd3d694f3412fe5db23223d29b7fee1575440202e9a7ff9a72ab106a39fee39934c7bedafe5e5f8ae20134 - languageName: node - linkType: hard - -"glob@npm:7.2.3, glob@npm:^7.0.0, glob@npm:^7.1.2, glob@npm:^7.1.3, glob@npm:^7.1.4": - version: 7.2.3 - resolution: "glob@npm:7.2.3" - 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 - checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 - languageName: node - linkType: hard - -"glob@npm:^5.0.15": - version: 5.0.15 - resolution: "glob@npm:5.0.15" - dependencies: - inflight: ^1.0.4 - inherits: 2 - minimatch: 2 || 3 - once: ^1.3.0 - path-is-absolute: ^1.0.0 - checksum: f9742448303460672607e569457f1b57e486a79a985e269b69465834d2075b243378225f65dc54c09fcd4b75e4fb34442aec88f33f8c65fa4abccc8ee2dc2f5d - languageName: node - linkType: hard - -"glob@npm:^8.0.1, glob@npm:^8.0.3": - version: 8.1.0 - resolution: "glob@npm:8.1.0" - dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^5.0.1 - once: ^1.3.0 - checksum: 92fbea3221a7d12075f26f0227abac435de868dd0736a17170663783296d0dd8d3d532a5672b4488a439bf5d7fb85cdd07c11185d6cd39184f0385cbdfb86a47 - languageName: node - linkType: hard - -"global-dirs@npm:^0.1.1": - version: 0.1.1 - resolution: "global-dirs@npm:0.1.1" - dependencies: - ini: ^1.3.4 - checksum: 10624f5a8ddb8634c22804c6b24f93fb591c3639a6bc78e3584e01a238fc6f7b7965824184e57d63f6df36980b6c191484ad7bc6c35a1599b8f1d64be64c2a4a - languageName: node - linkType: hard - -"global-modules@npm:^1.0.0": - version: 1.0.0 - resolution: "global-modules@npm:1.0.0" - dependencies: - global-prefix: ^1.0.1 - is-windows: ^1.0.1 - resolve-dir: ^1.0.0 - checksum: 10be68796c1e1abc1e2ba87ec4ea507f5629873b119ab0cd29c07284ef2b930f1402d10df01beccb7391dedd9cd479611dd6a24311c71be58937beaf18edf85e - languageName: node - linkType: hard - -"global-modules@npm:^2.0.0": - version: 2.0.0 - resolution: "global-modules@npm:2.0.0" - dependencies: - global-prefix: ^3.0.0 - checksum: d6197f25856c878c2fb5f038899f2dca7cbb2f7b7cf8999660c0104972d5cfa5c68b5a0a77fa8206bb536c3903a4615665acb9709b4d80846e1bb47eaef65430 - languageName: node - linkType: hard - -"global-prefix@npm:^1.0.1": - version: 1.0.2 - resolution: "global-prefix@npm:1.0.2" - dependencies: - expand-tilde: ^2.0.2 - homedir-polyfill: ^1.0.1 - ini: ^1.3.4 - is-windows: ^1.0.1 - which: ^1.2.14 - checksum: 061b43470fe498271bcd514e7746e8a8535032b17ab9570517014ae27d700ff0dca749f76bbde13ba384d185be4310d8ba5712cb0e74f7d54d59390db63dd9a0 - languageName: node - linkType: hard - -"global-prefix@npm:^3.0.0": - version: 3.0.0 - resolution: "global-prefix@npm:3.0.0" - dependencies: - ini: ^1.3.5 - kind-of: ^6.0.2 - which: ^1.3.1 - checksum: 8a82fc1d6f22c45484a4e34656cc91bf021a03e03213b0035098d605bfc612d7141f1e14a21097e8a0413b4884afd5b260df0b6a25605ce9d722e11f1df2881d - languageName: node - linkType: hard - -"globals@npm:^11.1.0": - version: 11.12.0 - resolution: "globals@npm:11.12.0" - checksum: 67051a45eca3db904aee189dfc7cd53c20c7d881679c93f6146ddd4c9f4ab2268e68a919df740d39c71f4445d2b38ee360fc234428baea1dbdfe68bbcb46979e - languageName: node - linkType: hard - -"globals@npm:^13.19.0": - version: 13.20.0 - resolution: "globals@npm:13.20.0" - dependencies: - type-fest: ^0.20.2 - checksum: ad1ecf914bd051325faad281d02ea2c0b1df5d01bd94d368dcc5513340eac41d14b3c61af325768e3c7f8d44576e72780ec0b6f2d366121f8eec6e03c3a3b97a - languageName: node - linkType: hard - -"globalthis@npm:^1.0.3": - version: 1.0.3 - resolution: "globalthis@npm:1.0.3" - dependencies: - define-properties: ^1.1.3 - checksum: fbd7d760dc464c886d0196166d92e5ffb4c84d0730846d6621a39fbbc068aeeb9c8d1421ad330e94b7bca4bb4ea092f5f21f3d36077812af5d098b4dc006c998 - languageName: node - linkType: hard - -"globby@npm:^10.0.1": - version: 10.0.2 - resolution: "globby@npm:10.0.2" - dependencies: - "@types/glob": ^7.1.1 - array-union: ^2.1.0 - dir-glob: ^3.0.1 - fast-glob: ^3.0.3 - glob: ^7.1.3 - ignore: ^5.1.1 - merge2: ^1.2.3 - slash: ^3.0.0 - checksum: 167cd067f2cdc030db2ec43232a1e835fa06217577d545709dbf29fd21631b30ff8258705172069c855dc4d5766c3b2690834e35b936fbff01ad0329fb95a26f - languageName: node - linkType: hard - -"globby@npm:^11.1.0": - version: 11.1.0 - resolution: "globby@npm:11.1.0" - 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 - checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 - languageName: node - linkType: hard - -"gopd@npm:^1.0.1": - version: 1.0.1 - resolution: "gopd@npm:1.0.1" - dependencies: - get-intrinsic: ^1.1.3 - checksum: a5ccfb8806e0917a94e0b3de2af2ea4979c1da920bc381667c260e00e7cafdbe844e2cb9c5bcfef4e5412e8bf73bab837285bc35c7ba73aaaf0134d4583393a6 - languageName: node - linkType: hard - -"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.1.9, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6": - version: 4.2.11 - resolution: "graceful-fs@npm:4.2.11" - checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 - languageName: node - linkType: hard - -"grapheme-splitter@npm:^1.0.4": - version: 1.0.4 - resolution: "grapheme-splitter@npm:1.0.4" - checksum: 0c22ec54dee1b05cd480f78cf14f732cb5b108edc073572c4ec205df4cd63f30f8db8025afc5debc8835a8ddeacf648a1c7992fe3dcd6ad38f9a476d84906620 - languageName: node - linkType: hard - -"growl@npm:1.10.5": - version: 1.10.5 - resolution: "growl@npm:1.10.5" - checksum: 4b86685de6831cebcbb19f93870bea624afee61124b0a20c49017013987cd129e73a8c4baeca295728f41d21265e1f859d25ef36731b142ca59c655fea94bb1a - languageName: node - linkType: hard - -"handlebars@npm:^4.0.1": - version: 4.7.7 - resolution: "handlebars@npm:4.7.7" - dependencies: - minimist: ^1.2.5 - neo-async: ^2.6.0 - source-map: ^0.6.1 - uglify-js: ^3.1.4 - wordwrap: ^1.0.0 - dependenciesMeta: - uglify-js: - optional: true - bin: - handlebars: bin/handlebars - checksum: 1e79a43f5e18d15742977cb987923eab3e2a8f44f2d9d340982bcb69e1735ed049226e534d7c1074eaddaf37e4fb4f471a8adb71cddd5bc8cf3f894241df5cee - languageName: node - linkType: hard - -"har-schema@npm:^2.0.0": - version: 2.0.0 - resolution: "har-schema@npm:2.0.0" - checksum: d8946348f333fb09e2bf24cc4c67eabb47c8e1d1aa1c14184c7ffec1140a49ec8aa78aa93677ae452d71d5fc0fdeec20f0c8c1237291fc2bcb3f502a5d204f9b - languageName: node - linkType: hard - -"har-validator@npm:~5.1.3": - version: 5.1.5 - resolution: "har-validator@npm:5.1.5" - dependencies: - ajv: ^6.12.3 - har-schema: ^2.0.0 - checksum: b998a7269ca560d7f219eedc53e2c664cd87d487e428ae854a6af4573fc94f182fe9d2e3b92ab968249baec7ebaf9ead69cf975c931dc2ab282ec182ee988280 - languageName: node - linkType: hard - -"hard-rejection@npm:^2.1.0": - version: 2.1.0 - resolution: "hard-rejection@npm:2.1.0" - checksum: 7baaf80a0c7fff4ca79687b4060113f1529589852152fa935e6787a2bc96211e784ad4588fb3048136ff8ffc9dfcf3ae385314a5b24db32de20bea0d1597f9dc - languageName: node - linkType: hard - -"hardhat-change-network@npm:^0.0.7": - version: 0.0.7 - resolution: "hardhat-change-network@npm:0.0.7" - peerDependencies: - hardhat: ^2.0.0 - checksum: 3cdda51abd45851be3335faa34ac2a54fe304628492a834fcd36ccf476d78ba8df0b4648ef0d93223ac65c24060998408681b5892e968b825784df62da47f402 - languageName: node - linkType: hard - -"hardhat-deploy@npm:^0.11.31": - version: 0.11.31 - resolution: "hardhat-deploy@npm:0.11.31" - dependencies: - "@ethersproject/abi": ^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/contracts": ^5.7.0 - "@ethersproject/providers": ^5.7.2 - "@ethersproject/solidity": ^5.7.0 - "@ethersproject/transactions": ^5.7.0 - "@ethersproject/wallet": ^5.7.0 - "@types/qs": ^6.9.7 - axios: ^0.21.1 - chalk: ^4.1.2 - chokidar: ^3.5.2 - debug: ^4.3.2 - enquirer: ^2.3.6 - ethers: ^5.5.3 - form-data: ^4.0.0 - fs-extra: ^10.0.0 - match-all: ^1.2.6 - murmur-128: ^0.2.1 - qs: ^6.9.4 - zksync-web3: ^0.14.3 - checksum: 75ea28d6fe745c2b685f7b2d17b280967adb37ff1ea7daf651182ae593aeb133273c9815c089b24b31607ba216baeee0c9fb761245dfa8b4186627349fdd1522 - languageName: node - linkType: hard - -"hardhat-gas-reporter@npm:^1.0.9": - version: 1.0.9 - resolution: "hardhat-gas-reporter@npm:1.0.9" - dependencies: - array-uniq: 1.0.3 - eth-gas-reporter: ^0.2.25 - sha1: ^1.1.1 - peerDependencies: - hardhat: ^2.0.2 - checksum: 77f8f8d085ff3d9d7787f0227e5355e1800f7d6707bc70171e0567bf69706703ae7f6f53dce1be1d409e7e71e3629a434c94b546bdbbc1e4c1af47cd5d0c6776 - languageName: node - linkType: hard - -"hardhat@npm:^2.19.4": - version: 2.19.4 - resolution: "hardhat@npm:2.19.4" - dependencies: - "@ethersproject/abi": ^5.1.2 - "@metamask/eth-sig-util": ^4.0.0 - "@nomicfoundation/ethereumjs-block": 5.0.2 - "@nomicfoundation/ethereumjs-blockchain": 7.0.2 - "@nomicfoundation/ethereumjs-common": 4.0.2 - "@nomicfoundation/ethereumjs-evm": 2.0.2 - "@nomicfoundation/ethereumjs-rlp": 5.0.2 - "@nomicfoundation/ethereumjs-statemanager": 2.0.2 - "@nomicfoundation/ethereumjs-trie": 6.0.2 - "@nomicfoundation/ethereumjs-tx": 5.0.2 - "@nomicfoundation/ethereumjs-util": 9.0.2 - "@nomicfoundation/ethereumjs-vm": 7.0.2 - "@nomicfoundation/solidity-analyzer": ^0.1.0 - "@sentry/node": ^5.18.1 - "@types/bn.js": ^5.1.0 - "@types/lru-cache": ^5.1.0 - adm-zip: ^0.4.16 - aggregate-error: ^3.0.0 - ansi-escapes: ^4.3.0 - chalk: ^2.4.2 - chokidar: ^3.4.0 - ci-info: ^2.0.0 - debug: ^4.1.1 - enquirer: ^2.3.0 - env-paths: ^2.2.0 - ethereum-cryptography: ^1.0.3 - ethereumjs-abi: ^0.6.8 - find-up: ^2.1.0 - fp-ts: 1.19.3 - fs-extra: ^7.0.1 - glob: 7.2.0 - immutable: ^4.0.0-rc.12 - io-ts: 1.10.4 - keccak: ^3.0.2 - lodash: ^4.17.11 - mnemonist: ^0.38.0 - mocha: ^10.0.0 - p-map: ^4.0.0 - raw-body: ^2.4.1 - resolve: 1.17.0 - semver: ^6.3.0 - solc: 0.7.3 - source-map-support: ^0.5.13 - stacktrace-parser: ^0.1.10 - tsort: 0.0.1 - undici: ^5.14.0 - uuid: ^8.3.2 - ws: ^7.4.6 - peerDependencies: - ts-node: "*" - typescript: "*" - peerDependenciesMeta: - ts-node: - optional: true - typescript: - optional: true - bin: - hardhat: internal/cli/bootstrap.js - checksum: 05dcaeab5bb641e74426ad47acfda903dcd3fd229b0d30f45b9de1d3c54fe6364161f3c88517984233d18f5b9294a050500ca7336b6ca069fa259fede6f5acb1 - languageName: node - linkType: hard - -"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": - version: 1.0.2 - resolution: "has-bigints@npm:1.0.2" - checksum: 390e31e7be7e5c6fe68b81babb73dfc35d413604d7ee5f56da101417027a4b4ce6a27e46eff97ad040c835b5d228676eae99a9b5c3bc0e23c8e81a49241ff45b - languageName: node - linkType: hard - -"has-flag@npm:^1.0.0": - version: 1.0.0 - resolution: "has-flag@npm:1.0.0" - checksum: ce3f8ae978e70f16e4bbe17d3f0f6d6c0a3dd3b62a23f97c91d0fda9ed8e305e13baf95cc5bee4463b9f25ac9f5255de113165c5fb285e01b8065b2ac079b301 - languageName: node - linkType: hard - -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b - languageName: node - linkType: hard - -"has-flag@npm:^4.0.0": - version: 4.0.0 - resolution: "has-flag@npm:4.0.0" - checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad - languageName: node - linkType: hard - -"has-property-descriptors@npm:^1.0.0": - version: 1.0.0 - resolution: "has-property-descriptors@npm:1.0.0" - dependencies: - get-intrinsic: ^1.1.1 - checksum: a6d3f0a266d0294d972e354782e872e2fe1b6495b321e6ef678c9b7a06a40408a6891817350c62e752adced73a94ac903c54734fee05bf65b1905ee1368194bb - languageName: node - linkType: hard - -"has-proto@npm:^1.0.1": - version: 1.0.1 - resolution: "has-proto@npm:1.0.1" - checksum: febc5b5b531de8022806ad7407935e2135f1cc9e64636c3916c6842bd7995994ca3b29871ecd7954bd35f9e2986c17b3b227880484d22259e2f8e6ce63fd383e - languageName: node - linkType: hard - -"has-symbols@npm:^1.0.0, has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": - version: 1.0.3 - resolution: "has-symbols@npm:1.0.3" - checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 - languageName: node - linkType: hard - -"has-tostringtag@npm:^1.0.0": - version: 1.0.0 - resolution: "has-tostringtag@npm:1.0.0" - dependencies: - has-symbols: ^1.0.2 - checksum: cc12eb28cb6ae22369ebaad3a8ab0799ed61270991be88f208d508076a1e99abe4198c965935ce85ea90b60c94ddda73693b0920b58e7ead048b4a391b502c1c - languageName: node - linkType: hard - -"has-unicode@npm:^2.0.1": - version: 2.0.1 - resolution: "has-unicode@npm:2.0.1" - checksum: 1eab07a7436512db0be40a710b29b5dc21fa04880b7f63c9980b706683127e3c1b57cb80ea96d47991bdae2dfe479604f6a1ba410106ee1046a41d1bd0814400 - languageName: node - linkType: hard - -"has@npm:^1.0.3": - version: 1.0.3 - resolution: "has@npm:1.0.3" - dependencies: - function-bind: ^1.1.1 - checksum: b9ad53d53be4af90ce5d1c38331e712522417d017d5ef1ebd0507e07c2fbad8686fffb8e12ddecd4c39ca9b9b47431afbb975b8abf7f3c3b82c98e9aad052792 - languageName: node - linkType: hard - -"hash-base@npm:^3.0.0": - version: 3.1.0 - resolution: "hash-base@npm:3.1.0" - dependencies: - inherits: ^2.0.4 - readable-stream: ^3.6.0 - safe-buffer: ^5.2.0 - checksum: 26b7e97ac3de13cb23fc3145e7e3450b0530274a9562144fc2bf5c1e2983afd0e09ed7cc3b20974ba66039fad316db463da80eb452e7373e780cbee9a0d2f2dc - languageName: node - linkType: hard - -"hash.js@npm:1.1.3": - version: 1.1.3 - resolution: "hash.js@npm:1.1.3" - dependencies: - inherits: ^2.0.3 - minimalistic-assert: ^1.0.0 - checksum: 93de6f178bf71feee38f66868a57ecb5602d937c1ccd69951b0bfec1488813b6afdbb4a81ddb2c62488c419b4a35af352298b006f14c9cfbf5b872c4191b657f - languageName: node - linkType: hard - -"hash.js@npm:1.1.7, hash.js@npm:^1.0.0, hash.js@npm:^1.0.3, hash.js@npm:^1.1.7": - version: 1.1.7 - resolution: "hash.js@npm:1.1.7" - dependencies: - inherits: ^2.0.3 - minimalistic-assert: ^1.0.1 - checksum: e350096e659c62422b85fa508e4b3669017311aa4c49b74f19f8e1bc7f3a54a584fdfd45326d4964d6011f2b2d882e38bea775a96046f2a61b7779a979629d8f - languageName: node - linkType: hard - -"he@npm:1.2.0": - version: 1.2.0 - resolution: "he@npm:1.2.0" - bin: - he: bin/he - checksum: 3d4d6babccccd79c5c5a3f929a68af33360d6445587d628087f39a965079d84f18ce9c3d3f917ee1e3978916fc833bb8b29377c3b403f919426f91bc6965e7a7 - languageName: node - linkType: hard - -"heap@npm:>= 0.2.0": - version: 0.2.7 - resolution: "heap@npm:0.2.7" - checksum: b0f3963a799e02173f994c452921a777f2b895b710119df999736bfed7477235c2860c423d9aea18a9f3b3d065cb1114d605c208cfcb8d0ac550f97ec5d28cb0 - languageName: node - linkType: hard - -"hmac-drbg@npm:^1.0.1": - version: 1.0.1 - resolution: "hmac-drbg@npm:1.0.1" - dependencies: - hash.js: ^1.0.3 - minimalistic-assert: ^1.0.0 - minimalistic-crypto-utils: ^1.0.1 - checksum: bd30b6a68d7f22d63f10e1888aee497d7c2c5c0bb469e66bbdac99f143904d1dfe95f8131f95b3e86c86dd239963c9d972fcbe147e7cffa00e55d18585c43fe0 - languageName: node - linkType: hard - -"homedir-polyfill@npm:^1.0.1": - version: 1.0.3 - resolution: "homedir-polyfill@npm:1.0.3" - dependencies: - parse-passwd: ^1.0.0 - checksum: 18dd4db87052c6a2179d1813adea0c4bfcfa4f9996f0e226fefb29eb3d548e564350fa28ec46b0bf1fbc0a1d2d6922ceceb80093115ea45ff8842a4990139250 - languageName: node - linkType: hard - -"hosted-git-info@npm:^2.1.4": - version: 2.8.9 - resolution: "hosted-git-info@npm:2.8.9" - checksum: c955394bdab888a1e9bb10eb33029e0f7ce5a2ac7b3f158099dc8c486c99e73809dca609f5694b223920ca2174db33d32b12f9a2a47141dc59607c29da5a62dd - languageName: node - linkType: hard - -"hosted-git-info@npm:^4.0.1": - version: 4.1.0 - resolution: "hosted-git-info@npm:4.1.0" - dependencies: - lru-cache: ^6.0.0 - checksum: c3f87b3c2f7eb8c2748c8f49c0c2517c9a95f35d26f4bf54b2a8cba05d2e668f3753548b6ea366b18ec8dadb4e12066e19fa382a01496b0ffa0497eb23cbe461 - languageName: node - linkType: hard - -"http-basic@npm:^8.1.1": - version: 8.1.3 - resolution: "http-basic@npm:8.1.3" - dependencies: - caseless: ^0.12.0 - concat-stream: ^1.6.2 - http-response-object: ^3.0.1 - parse-cache-control: ^1.0.1 - checksum: 7df5dc4d4b6eb8cc3beaa77f8e5c3074288ec3835abd83c85e5bb66d8a95a0ef97664d862caf5e225698cb795f78f9a5abd0d39404e5356ccd3e5e10c87936a5 - languageName: node - linkType: hard - -"http-cache-semantics@npm:^4.1.0": - version: 4.1.1 - resolution: "http-cache-semantics@npm:4.1.1" - checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236 - languageName: node - linkType: hard - -"http-errors@npm:2.0.0": - version: 2.0.0 - resolution: "http-errors@npm:2.0.0" - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - checksum: 9b0a3782665c52ce9dc658a0d1560bcb0214ba5699e4ea15aefb2a496e2ca83db03ebc42e1cce4ac1f413e4e0d2d736a3fd755772c556a9a06853ba2a0b7d920 - languageName: node - linkType: hard - -"http-proxy-agent@npm:^5.0.0": - version: 5.0.0 - resolution: "http-proxy-agent@npm:5.0.0" - dependencies: - "@tootallnate/once": 2 - agent-base: 6 - debug: 4 - checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786 - languageName: node - linkType: hard - -"http-response-object@npm:^3.0.1": - version: 3.0.2 - resolution: "http-response-object@npm:3.0.2" - dependencies: - "@types/node": ^10.0.3 - checksum: 6cbdcb4ce7b27c9158a131b772c903ed54add2ba831e29cc165e91c3969fa6f8105ddf924aac5b954b534ad15a1ae697b693331b2be5281ee24d79aae20c3264 - languageName: node - linkType: hard - -"http-signature@npm:~1.2.0": - version: 1.2.0 - resolution: "http-signature@npm:1.2.0" - dependencies: - assert-plus: ^1.0.0 - jsprim: ^1.2.2 - sshpk: ^1.7.0 - checksum: 3324598712266a9683585bb84a75dec4fd550567d5e0dd4a0fff6ff3f74348793404d3eeac4918fa0902c810eeee1a86419e4a2e92a164132dfe6b26743fb47c - languageName: node - linkType: hard - -"https-proxy-agent@npm:^5.0.0": - version: 5.0.1 - resolution: "https-proxy-agent@npm:5.0.1" - dependencies: - agent-base: 6 - debug: 4 - checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 - languageName: node - linkType: hard - -"human-signals@npm:^2.1.0": - version: 2.1.0 - resolution: "human-signals@npm:2.1.0" - checksum: b87fd89fce72391625271454e70f67fe405277415b48bcc0117ca73d31fa23a4241787afdc8d67f5a116cf37258c052f59ea82daffa72364d61351423848e3b8 - languageName: node - linkType: hard - -"human-signals@npm:^4.3.0": - version: 4.3.1 - resolution: "human-signals@npm:4.3.1" - checksum: 6f12958df3f21b6fdaf02d90896c271df00636a31e2bbea05bddf817a35c66b38a6fdac5863e2df85bd52f34958997f1f50350ff97249e1dff8452865d5235d1 - languageName: node - linkType: hard - -"humanize-ms@npm:^1.2.1": - version: 1.2.1 - resolution: "humanize-ms@npm:1.2.1" - dependencies: - ms: ^2.0.0 - checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16 - languageName: node - linkType: hard - -"iconv-lite@npm:0.4.24, iconv-lite@npm:^0.4.24": - version: 0.4.24 - resolution: "iconv-lite@npm:0.4.24" - dependencies: - safer-buffer: ">= 2.1.2 < 3" - checksum: bd9f120f5a5b306f0bc0b9ae1edeb1577161503f5f8252a20f1a9e56ef8775c9959fd01c55f2d3a39d9a8abaf3e30c1abeb1895f367dcbbe0a8fd1c9ca01c4f6 - languageName: node - linkType: hard - -"iconv-lite@npm:^0.6.2": - version: 0.6.3 - resolution: "iconv-lite@npm:0.6.3" - dependencies: - safer-buffer: ">= 2.1.2 < 3.0.0" - checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf - languageName: node - linkType: hard - -"ieee754@npm:^1.1.13, ieee754@npm:^1.2.1": - version: 1.2.1 - resolution: "ieee754@npm:1.2.1" - checksum: 5144c0c9815e54ada181d80a0b810221a253562422e7c6c3a60b1901154184f49326ec239d618c416c1c5945a2e197107aee8d986a3dd836b53dffefd99b5e7e - languageName: node - linkType: hard - -"ignore@npm:^5.1.1, ignore@npm:^5.2.0, ignore@npm:^5.2.4": - version: 5.2.4 - resolution: "ignore@npm:5.2.4" - checksum: 3d4c309c6006e2621659311783eaea7ebcd41fe4ca1d78c91c473157ad6666a57a2df790fe0d07a12300d9aac2888204d7be8d59f9aaf665b1c7fcdb432517ef - languageName: node - linkType: hard - -"immutable@npm:^4.0.0-rc.12": - version: 4.3.0 - resolution: "immutable@npm:4.3.0" - checksum: bbd7ea99e2752e053323543d6ff1cc71a4b4614fa6121f321ca766db2bd2092f3f1e0a90784c5431350b7344a4f792fa002eac227062d59b9377b6c09063b58b - languageName: node - linkType: hard - -"import-fresh@npm:^3.0.0, import-fresh@npm:^3.2.1": - version: 3.3.0 - resolution: "import-fresh@npm:3.3.0" - dependencies: - parent-module: ^1.0.0 - resolve-from: ^4.0.0 - checksum: 2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa - languageName: node - linkType: hard - -"imul@npm:^1.0.0": - version: 1.0.1 - resolution: "imul@npm:1.0.1" - checksum: 6c2af3d5f09e2135e14d565a2c108412b825b221eb2c881f9130467f2adccf7ae201773ae8bcf1be169e2d090567a1fdfa9cf20d3b7da7b9cecb95b920ff3e52 - languageName: node - linkType: hard - -"imurmurhash@npm:^0.1.4": - version: 0.1.4 - resolution: "imurmurhash@npm:0.1.4" - checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 - languageName: node - linkType: hard - -"indent-string@npm:^4.0.0": - version: 4.0.0 - resolution: "indent-string@npm:4.0.0" - checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 - languageName: node - linkType: hard - -"infer-owner@npm:^1.0.4": - version: 1.0.4 - resolution: "infer-owner@npm:1.0.4" - checksum: 181e732764e4a0611576466b4b87dac338972b839920b2a8cde43642e4ed6bd54dc1fb0b40874728f2a2df9a1b097b8ff83b56d5f8f8e3927f837fdcb47d8a89 - languageName: node - linkType: hard - -"inflight@npm:^1.0.4": - version: 1.0.6 - resolution: "inflight@npm:1.0.6" - dependencies: - once: ^1.3.0 - wrappy: 1 - checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd - languageName: node - linkType: hard - -"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3": - version: 2.0.4 - resolution: "inherits@npm:2.0.4" - checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 - languageName: node - linkType: hard - -"ini@npm:^1.3.4, ini@npm:^1.3.5": - version: 1.3.8 - resolution: "ini@npm:1.3.8" - checksum: dfd98b0ca3a4fc1e323e38a6c8eb8936e31a97a918d3b377649ea15bdb15d481207a0dda1021efbd86b464cae29a0d33c1d7dcaf6c5672bee17fa849bc50a1b3 - languageName: node - linkType: hard - -"inquirer@npm:8.2.5": - version: 8.2.5 - resolution: "inquirer@npm:8.2.5" - dependencies: - ansi-escapes: ^4.2.1 - chalk: ^4.1.1 - cli-cursor: ^3.1.0 - cli-width: ^3.0.0 - external-editor: ^3.0.3 - figures: ^3.0.0 - lodash: ^4.17.21 - mute-stream: 0.0.8 - ora: ^5.4.1 - run-async: ^2.4.0 - rxjs: ^7.5.5 - string-width: ^4.1.0 - strip-ansi: ^6.0.0 - through: ^2.3.6 - wrap-ansi: ^7.0.0 - checksum: f13ee4c444187786fb393609dedf6b30870115a57b603f2e6424f29a99abc13446fd45ee22461c33c9c40a92a60a8df62d0d6b25d74fc6676fa4cb211de55b55 - languageName: node - linkType: hard - -"internal-slot@npm:^1.0.5": - version: 1.0.5 - resolution: "internal-slot@npm:1.0.5" - dependencies: - get-intrinsic: ^1.2.0 - has: ^1.0.3 - side-channel: ^1.0.4 - checksum: 97e84046bf9e7574d0956bd98d7162313ce7057883b6db6c5c7b5e5f05688864b0978ba07610c726d15d66544ffe4b1050107d93f8a39ebc59b15d8b429b497a - languageName: node - linkType: hard - -"interpret@npm:^1.0.0": - version: 1.4.0 - resolution: "interpret@npm:1.4.0" - checksum: 2e5f51268b5941e4a17e4ef0575bc91ed0ab5f8515e3cf77486f7c14d13f3010df9c0959f37063dcc96e78d12dc6b0bb1b9e111cdfe69771f4656d2993d36155 - languageName: node - linkType: hard - -"io-ts@npm:1.10.4": - version: 1.10.4 - resolution: "io-ts@npm:1.10.4" - dependencies: - fp-ts: ^1.0.0 - checksum: 619134006778f7ca42693716ade7fc1a383079e7848bbeabc67a0e4ac9139cda6b2a88a052d539ab7d554033ee2ffe4dab5cb96b958c83fee2dff73d23f03e88 - languageName: node - linkType: hard - -"ip@npm:^2.0.0": - version: 2.0.0 - resolution: "ip@npm:2.0.0" - checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349 - languageName: node - linkType: hard - -"is-array-buffer@npm:^3.0.1, is-array-buffer@npm:^3.0.2": - version: 3.0.2 - resolution: "is-array-buffer@npm:3.0.2" - dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.2.0 - is-typed-array: ^1.1.10 - checksum: dcac9dda66ff17df9cabdc58214172bf41082f956eab30bb0d86bc0fab1e44b690fc8e1f855cf2481245caf4e8a5a006a982a71ddccec84032ed41f9d8da8c14 - languageName: node - linkType: hard - -"is-arrayish@npm:^0.2.1": - version: 0.2.1 - resolution: "is-arrayish@npm:0.2.1" - checksum: eef4417e3c10e60e2c810b6084942b3ead455af16c4509959a27e490e7aee87cfb3f38e01bbde92220b528a0ee1a18d52b787e1458ee86174d8c7f0e58cd488f - languageName: node - linkType: hard - -"is-bigint@npm:^1.0.1": - version: 1.0.4 - resolution: "is-bigint@npm:1.0.4" - dependencies: - has-bigints: ^1.0.1 - checksum: c56edfe09b1154f8668e53ebe8252b6f185ee852a50f9b41e8d921cb2bed425652049fbe438723f6cb48a63ca1aa051e948e7e401e093477c99c84eba244f666 - languageName: node - linkType: hard - -"is-binary-path@npm:~2.1.0": - version: 2.1.0 - resolution: "is-binary-path@npm:2.1.0" - dependencies: - binary-extensions: ^2.0.0 - checksum: 84192eb88cff70d320426f35ecd63c3d6d495da9d805b19bc65b518984b7c0760280e57dbf119b7e9be6b161784a5a673ab2c6abe83abb5198a432232ad5b35c - languageName: node - linkType: hard - -"is-boolean-object@npm:^1.1.0": - version: 1.1.2 - resolution: "is-boolean-object@npm:1.1.2" - dependencies: - call-bind: ^1.0.2 - has-tostringtag: ^1.0.0 - checksum: c03b23dbaacadc18940defb12c1c0e3aaece7553ef58b162a0f6bba0c2a7e1551b59f365b91e00d2dbac0522392d576ef322628cb1d036a0fe51eb466db67222 - languageName: node - linkType: hard - -"is-buffer@npm:^2.0.5, is-buffer@npm:~2.0.3": - version: 2.0.5 - resolution: "is-buffer@npm:2.0.5" - checksum: 764c9ad8b523a9f5a32af29bdf772b08eb48c04d2ad0a7240916ac2688c983bf5f8504bf25b35e66240edeb9d9085461f9b5dae1f3d2861c6b06a65fe983de42 - languageName: node - linkType: hard - -"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": - version: 1.2.7 - resolution: "is-callable@npm:1.2.7" - checksum: 61fd57d03b0d984e2ed3720fb1c7a897827ea174bd44402878e059542ea8c4aeedee0ea0985998aa5cc2736b2fa6e271c08587addb5b3959ac52cf665173d1ac - languageName: node - linkType: hard - -"is-core-module@npm:^2.5.0, is-core-module@npm:^2.9.0": - version: 2.11.0 - resolution: "is-core-module@npm:2.11.0" - dependencies: - has: ^1.0.3 - checksum: f96fd490c6b48eb4f6d10ba815c6ef13f410b0ba6f7eb8577af51697de523e5f2cd9de1c441b51d27251bf0e4aebc936545e33a5d26d5d51f28d25698d4a8bab - languageName: node - linkType: hard - -"is-date-object@npm:^1.0.1": - version: 1.0.5 - resolution: "is-date-object@npm:1.0.5" - dependencies: - has-tostringtag: ^1.0.0 - checksum: baa9077cdf15eb7b58c79398604ca57379b2fc4cf9aa7a9b9e295278648f628c9b201400c01c5e0f7afae56507d741185730307cbe7cad3b9f90a77e5ee342fc - languageName: node - linkType: hard - -"is-extglob@npm:^2.1.1": - version: 2.1.1 - resolution: "is-extglob@npm:2.1.1" - checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^2.0.0": - version: 2.0.0 - resolution: "is-fullwidth-code-point@npm:2.0.0" - checksum: eef9c6e15f68085fec19ff6a978a6f1b8f48018fd1265035552078ee945573594933b09bbd6f562553e2a241561439f1ef5339276eba68d272001343084cfab8 - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^3.0.0": - version: 3.0.0 - resolution: "is-fullwidth-code-point@npm:3.0.0" - checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^4.0.0": - version: 4.0.0 - resolution: "is-fullwidth-code-point@npm:4.0.0" - checksum: 8ae89bf5057bdf4f57b346fb6c55e9c3dd2549983d54191d722d5c739397a903012cc41a04ee3403fd872e811243ef91a7c5196da7b5841dc6b6aae31a264a8d - languageName: node - linkType: hard - -"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": - version: 4.0.3 - resolution: "is-glob@npm:4.0.3" - dependencies: - is-extglob: ^2.1.1 - checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 - languageName: node - linkType: hard - -"is-hex-prefixed@npm:1.0.0": - version: 1.0.0 - resolution: "is-hex-prefixed@npm:1.0.0" - checksum: 5ac58e6e528fb029cc43140f6eeb380fad23d0041cc23154b87f7c9a1b728bcf05909974e47248fd0b7fcc11ba33cf7e58d64804883056fabd23e2b898be41de - languageName: node - linkType: hard - -"is-interactive@npm:^1.0.0": - version: 1.0.0 - resolution: "is-interactive@npm:1.0.0" - checksum: 824808776e2d468b2916cdd6c16acacebce060d844c35ca6d82267da692e92c3a16fdba624c50b54a63f38bdc4016055b6f443ce57d7147240de4f8cdabaf6f9 - languageName: node - linkType: hard - -"is-lambda@npm:^1.0.1": - version: 1.0.1 - resolution: "is-lambda@npm:1.0.1" - checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35 - languageName: node - linkType: hard - -"is-negative-zero@npm:^2.0.2": - version: 2.0.2 - resolution: "is-negative-zero@npm:2.0.2" - checksum: f3232194c47a549da60c3d509c9a09be442507616b69454716692e37ae9f37c4dea264fb208ad0c9f3efd15a796a46b79df07c7e53c6227c32170608b809149a - languageName: node - linkType: hard - -"is-number-object@npm:^1.0.4": - version: 1.0.7 - resolution: "is-number-object@npm:1.0.7" - dependencies: - has-tostringtag: ^1.0.0 - checksum: d1e8d01bb0a7134c74649c4e62da0c6118a0bfc6771ea3c560914d52a627873e6920dd0fd0ebc0e12ad2ff4687eac4c308f7e80320b973b2c8a2c8f97a7524f7 - languageName: node - linkType: hard - -"is-number@npm:^7.0.0": - version: 7.0.0 - resolution: "is-number@npm:7.0.0" - checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a - languageName: node - linkType: hard - -"is-obj@npm:^2.0.0": - version: 2.0.0 - resolution: "is-obj@npm:2.0.0" - checksum: c9916ac8f4621962a42f5e80e7ffdb1d79a3fab7456ceaeea394cd9e0858d04f985a9ace45be44433bf605673c8be8810540fe4cc7f4266fc7526ced95af5a08 - languageName: node - linkType: hard - -"is-path-inside@npm:^3.0.3": - version: 3.0.3 - resolution: "is-path-inside@npm:3.0.3" - checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 - languageName: node - linkType: hard - -"is-plain-obj@npm:^1.1.0": - version: 1.1.0 - resolution: "is-plain-obj@npm:1.1.0" - checksum: 0ee04807797aad50859652a7467481816cbb57e5cc97d813a7dcd8915da8195dc68c436010bf39d195226cde6a2d352f4b815f16f26b7bf486a5754290629931 - languageName: node - linkType: hard - -"is-plain-obj@npm:^2.1.0": - version: 2.1.0 - resolution: "is-plain-obj@npm:2.1.0" - checksum: cec9100678b0a9fe0248a81743041ed990c2d4c99f893d935545cfbc42876cbe86d207f3b895700c690ad2fa520e568c44afc1605044b535a7820c1d40e38daa - languageName: node - linkType: hard - -"is-regex@npm:^1.1.4": - version: 1.1.4 - resolution: "is-regex@npm:1.1.4" - dependencies: - call-bind: ^1.0.2 - has-tostringtag: ^1.0.0 - checksum: 362399b33535bc8f386d96c45c9feb04cf7f8b41c182f54174c1a45c9abbbe5e31290bbad09a458583ff6bf3b2048672cdb1881b13289569a7c548370856a652 - languageName: node - linkType: hard - -"is-shared-array-buffer@npm:^1.0.2": - version: 1.0.2 - resolution: "is-shared-array-buffer@npm:1.0.2" - dependencies: - call-bind: ^1.0.2 - checksum: 9508929cf14fdc1afc9d61d723c6e8d34f5e117f0bffda4d97e7a5d88c3a8681f633a74f8e3ad1fe92d5113f9b921dc5ca44356492079612f9a247efbce7032a - languageName: node - linkType: hard - -"is-stream@npm:^2.0.0": - version: 2.0.1 - resolution: "is-stream@npm:2.0.1" - checksum: b8e05ccdf96ac330ea83c12450304d4a591f9958c11fd17bed240af8d5ffe08aedafa4c0f4cfccd4d28dc9d4d129daca1023633d5c11601a6cbc77521f6fae66 - languageName: node - linkType: hard - -"is-stream@npm:^3.0.0": - version: 3.0.0 - resolution: "is-stream@npm:3.0.0" - checksum: 172093fe99119ffd07611ab6d1bcccfe8bc4aa80d864b15f43e63e54b7abc71e779acd69afdb854c4e2a67fdc16ae710e370eda40088d1cfc956a50ed82d8f16 - languageName: node - linkType: hard - -"is-string@npm:^1.0.5, is-string@npm:^1.0.7": - version: 1.0.7 - resolution: "is-string@npm:1.0.7" - dependencies: - has-tostringtag: ^1.0.0 - checksum: 323b3d04622f78d45077cf89aab783b2f49d24dc641aa89b5ad1a72114cfeff2585efc8c12ef42466dff32bde93d839ad321b26884cf75e5a7892a938b089989 - languageName: node - linkType: hard - -"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": - version: 1.0.4 - resolution: "is-symbol@npm:1.0.4" - dependencies: - has-symbols: ^1.0.2 - checksum: 92805812ef590738d9de49d677cd17dfd486794773fb6fa0032d16452af46e9b91bb43ffe82c983570f015b37136f4b53b28b8523bfb10b0ece7a66c31a54510 - languageName: node - linkType: hard - -"is-text-path@npm:^1.0.1": - version: 1.0.1 - resolution: "is-text-path@npm:1.0.1" - dependencies: - text-extensions: ^1.0.0 - checksum: fb5d78752c22b3f73a7c9540768f765ffcfa38c9e421e2b9af869565307fa1ae5e3d3a2ba016a43549742856846566d327da406e94a5846ec838a288b1704fd2 - languageName: node - linkType: hard - -"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.9": - version: 1.1.10 - resolution: "is-typed-array@npm:1.1.10" - dependencies: - available-typed-arrays: ^1.0.5 - call-bind: ^1.0.2 - for-each: ^0.3.3 - gopd: ^1.0.1 - has-tostringtag: ^1.0.0 - checksum: aac6ecb59d4c56a1cdeb69b1f129154ef462bbffe434cb8a8235ca89b42f258b7ae94073c41b3cb7bce37f6a1733ad4499f07882d5d5093a7ba84dfc4ebb8017 - languageName: node - linkType: hard - -"is-typedarray@npm:~1.0.0": - version: 1.0.0 - resolution: "is-typedarray@npm:1.0.0" - checksum: 3508c6cd0a9ee2e0df2fa2e9baabcdc89e911c7bd5cf64604586697212feec525aa21050e48affb5ffc3df20f0f5d2e2cf79b08caa64e1ccc9578e251763aef7 - languageName: node - linkType: hard - -"is-unicode-supported@npm:^0.1.0": - version: 0.1.0 - resolution: "is-unicode-supported@npm:0.1.0" - checksum: a2aab86ee7712f5c2f999180daaba5f361bdad1efadc9610ff5b8ab5495b86e4f627839d085c6530363c6d6d4ecbde340fb8e54bdb83da4ba8e0865ed5513c52 - languageName: node - linkType: hard - -"is-utf8@npm:^0.2.1": - version: 0.2.1 - resolution: "is-utf8@npm:0.2.1" - checksum: 167ccd2be869fc228cc62c1a28df4b78c6b5485d15a29027d3b5dceb09b383e86a3522008b56dcac14b592b22f0a224388718c2505027a994fd8471465de54b3 - languageName: node - linkType: hard - -"is-weakref@npm:^1.0.2": - version: 1.0.2 - resolution: "is-weakref@npm:1.0.2" - dependencies: - call-bind: ^1.0.2 - checksum: 95bd9a57cdcb58c63b1c401c60a474b0f45b94719c30f548c891860f051bc2231575c290a6b420c6bc6e7ed99459d424c652bd5bf9a1d5259505dc35b4bf83de - languageName: node - linkType: hard - -"is-windows@npm:^1.0.1": - version: 1.0.2 - resolution: "is-windows@npm:1.0.2" - checksum: 438b7e52656fe3b9b293b180defb4e448088e7023a523ec21a91a80b9ff8cdb3377ddb5b6e60f7c7de4fa8b63ab56e121b6705fe081b3cf1b828b0a380009ad7 - languageName: node - linkType: hard - -"isarray@npm:~1.0.0": - version: 1.0.0 - resolution: "isarray@npm:1.0.0" - checksum: f032df8e02dce8ec565cf2eb605ea939bdccea528dbcf565cdf92bfa2da9110461159d86a537388ef1acef8815a330642d7885b29010e8f7eac967c9993b65ab - languageName: node - linkType: hard - -"isexe@npm:^2.0.0": - version: 2.0.0 - resolution: "isexe@npm:2.0.0" - checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 - languageName: node - linkType: hard - -"isomorphic-ws@npm:^4.0.1": - version: 4.0.1 - resolution: "isomorphic-ws@npm:4.0.1" - peerDependencies: - ws: "*" - checksum: d7190eadefdc28bdb93d67b5f0c603385aaf87724fa2974abb382ac1ec9756ed2cfb27065cbe76122879c2d452e2982bc4314317f3d6c737ddda6c047328771a - languageName: node - linkType: hard - -"isstream@npm:~0.1.2": - version: 0.1.2 - resolution: "isstream@npm:0.1.2" - checksum: 1eb2fe63a729f7bdd8a559ab552c69055f4f48eb5c2f03724430587c6f450783c8f1cd936c1c952d0a927925180fcc892ebd5b174236cf1065d4bd5bdb37e963 - languageName: node - linkType: hard - -"javascript-natural-sort@npm:0.7.1": - version: 0.7.1 - resolution: "javascript-natural-sort@npm:0.7.1" - checksum: 161e2c512cc7884bc055a582c6645d9032cab88497a76123d73cb23bfb03d97a04cf7772ecdb8bd3366fc07192c2f996366f479f725c23ef073fffe03d6a586a - languageName: node - linkType: hard - -"jayson@npm:^4.1.0": - version: 4.1.0 - resolution: "jayson@npm:4.1.0" - dependencies: - "@types/connect": ^3.4.33 - "@types/node": ^12.12.54 - "@types/ws": ^7.4.4 - JSONStream: ^1.3.5 - commander: ^2.20.3 - delay: ^5.0.0 - es6-promisify: ^5.0.0 - eyes: ^0.1.8 - isomorphic-ws: ^4.0.1 - json-stringify-safe: ^5.0.1 - uuid: ^8.3.2 - ws: ^7.4.5 - bin: - jayson: bin/jayson.js - checksum: 86464322fbdc6db65d2bb4fc278cb6c86fad5c2a506065490d39459f09ba0d30f2b4fb740b33828a1424791419b6c8bd295dc54d361a4ad959bf70cc62b1ca7e - languageName: node - linkType: hard - -"js-sdsl@npm:^4.1.4": - version: 4.4.0 - resolution: "js-sdsl@npm:4.4.0" - checksum: 7bb08a2d746ab7ff742720339aa006c631afe05e77d11eda988c1c35fae8e03e492e4e347e883e786e3ce6170685d4780c125619111f0730c11fdb41b04059c7 - languageName: node - linkType: hard - -"js-sha3@npm:0.5.7": - version: 0.5.7 - resolution: "js-sha3@npm:0.5.7" - checksum: 973a28ea4b26cc7f12d2ab24f796e24ee4a71eef45a6634a052f6eb38cf8b2333db798e896e6e094ea6fa4dfe8e42a2a7942b425cf40da3f866623fd05bb91ea - languageName: node - linkType: hard - -"js-sha3@npm:0.8.0, js-sha3@npm:^0.8.0": - version: 0.8.0 - resolution: "js-sha3@npm:0.8.0" - checksum: 75df77c1fc266973f06cce8309ce010e9e9f07ec35ab12022ed29b7f0d9c8757f5a73e1b35aa24840dced0dea7059085aa143d817aea9e188e2a80d569d9adce - languageName: node - linkType: hard - -"js-tokens@npm:^4.0.0": - version: 4.0.0 - resolution: "js-tokens@npm:4.0.0" - checksum: 8a95213a5a77deb6cbe94d86340e8d9ace2b93bc367790b260101d2f36a2eaf4e4e22d9fa9cf459b38af3a32fb4190e638024cf82ec95ef708680e405ea7cc78 - languageName: node - linkType: hard - -"js-yaml@npm:3.13.1": - version: 3.13.1 - resolution: "js-yaml@npm:3.13.1" - dependencies: - argparse: ^1.0.7 - esprima: ^4.0.0 - bin: - js-yaml: bin/js-yaml.js - checksum: 7511b764abb66d8aa963379f7d2a404f078457d106552d05a7b556d204f7932384e8477513c124749fa2de52eb328961834562bd09924902c6432e40daa408bc - languageName: node - linkType: hard - -"js-yaml@npm:3.x": - version: 3.14.1 - resolution: "js-yaml@npm:3.14.1" - dependencies: - argparse: ^1.0.7 - esprima: ^4.0.0 - bin: - js-yaml: bin/js-yaml.js - checksum: bef146085f472d44dee30ec34e5cf36bf89164f5d585435a3d3da89e52622dff0b188a580e4ad091c3341889e14cb88cac6e4deb16dc5b1e9623bb0601fc255c - languageName: node - linkType: hard - -"js-yaml@npm:4.1.0, js-yaml@npm:^4.1.0": - version: 4.1.0 - resolution: "js-yaml@npm:4.1.0" - dependencies: - argparse: ^2.0.1 - bin: - js-yaml: bin/js-yaml.js - checksum: c7830dfd456c3ef2c6e355cc5a92e6700ceafa1d14bba54497b34a99f0376cecbb3e9ac14d3e5849b426d5a5140709a66237a8c991c675431271c4ce5504151a - languageName: node - linkType: hard - -"jsbn@npm:~0.1.0": - version: 0.1.1 - resolution: "jsbn@npm:0.1.1" - checksum: e5ff29c1b8d965017ef3f9c219dacd6e40ad355c664e277d31246c90545a02e6047018c16c60a00f36d561b3647215c41894f5d869ada6908a2e0ce4200c88f2 - languageName: node - linkType: hard - -"jsesc@npm:^2.5.1": - version: 2.5.2 - resolution: "jsesc@npm:2.5.2" - bin: - jsesc: bin/jsesc - checksum: 4dc190771129e12023f729ce20e1e0bfceac84d73a85bc3119f7f938843fe25a4aeccb54b6494dce26fcf263d815f5f31acdefac7cc9329efb8422a4f4d9fa9d - languageName: node - linkType: hard - -"json-parse-even-better-errors@npm:^2.3.0": - version: 2.3.1 - resolution: "json-parse-even-better-errors@npm:2.3.1" - checksum: 798ed4cf3354a2d9ccd78e86d2169515a0097a5c133337807cdf7f1fc32e1391d207ccfc276518cc1d7d8d4db93288b8a50ba4293d212ad1336e52a8ec0a941f - languageName: node - linkType: hard - -"json-schema-traverse@npm:^0.4.1": - version: 0.4.1 - resolution: "json-schema-traverse@npm:0.4.1" - checksum: 7486074d3ba247769fda17d5181b345c9fb7d12e0da98b22d1d71a5db9698d8b4bd900a3ec1a4ffdd60846fc2556274a5c894d0c48795f14cb03aeae7b55260b - languageName: node - linkType: hard - -"json-schema-traverse@npm:^1.0.0": - version: 1.0.0 - resolution: "json-schema-traverse@npm:1.0.0" - checksum: 02f2f466cdb0362558b2f1fd5e15cce82ef55d60cd7f8fa828cf35ba74330f8d767fcae5c5c2adb7851fa811766c694b9405810879bc4e1ddd78a7c0e03658ad - languageName: node - linkType: hard - -"json-schema@npm:0.4.0": - version: 0.4.0 - resolution: "json-schema@npm:0.4.0" - checksum: 66389434c3469e698da0df2e7ac5a3281bcff75e797a5c127db7c5b56270e01ae13d9afa3c03344f76e32e81678337a8c912bdbb75101c62e487dc3778461d72 - languageName: node - linkType: hard - -"json-stable-stringify-without-jsonify@npm:^1.0.1": - version: 1.0.1 - resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" - checksum: cff44156ddce9c67c44386ad5cddf91925fe06b1d217f2da9c4910d01f358c6e3989c4d5a02683c7a5667f9727ff05831f7aa8ae66c8ff691c556f0884d49215 - languageName: node - linkType: hard - -"json-stringify-safe@npm:^5.0.1, json-stringify-safe@npm:~5.0.1": - version: 5.0.1 - resolution: "json-stringify-safe@npm:5.0.1" - checksum: 48ec0adad5280b8a96bb93f4563aa1667fd7a36334f79149abd42446d0989f2ddc58274b479f4819f1f00617957e6344c886c55d05a4e15ebb4ab931e4a6a8ee - languageName: node - linkType: hard - -"jsonfile@npm:^2.1.0": - version: 2.4.0 - resolution: "jsonfile@npm:2.4.0" - dependencies: - graceful-fs: ^4.1.6 - dependenciesMeta: - graceful-fs: - optional: true - checksum: f5064aabbc9e35530dc471d8b203ae1f40dbe949ddde4391c6f6a6d310619a15f0efdae5587df594d1d70c555193aaeee9d2ed4aec9ffd5767bd5e4e62d49c3d - languageName: node - linkType: hard - -"jsonfile@npm:^4.0.0": - version: 4.0.0 - resolution: "jsonfile@npm:4.0.0" - dependencies: - graceful-fs: ^4.1.6 - dependenciesMeta: - graceful-fs: - optional: true - checksum: 6447d6224f0d31623eef9b51185af03ac328a7553efcee30fa423d98a9e276ca08db87d71e17f2310b0263fd3ffa6c2a90a6308367f661dc21580f9469897c9e - languageName: node - linkType: hard - -"jsonfile@npm:^6.0.1": - version: 6.1.0 - resolution: "jsonfile@npm:6.1.0" - dependencies: - graceful-fs: ^4.1.6 - universalify: ^2.0.0 - dependenciesMeta: - graceful-fs: - optional: true - checksum: 7af3b8e1ac8fe7f1eccc6263c6ca14e1966fcbc74b618d3c78a0a2075579487547b94f72b7a1114e844a1e15bb00d440e5d1720bfc4612d790a6f285d5ea8354 - languageName: node - linkType: hard - -"jsonparse@npm:^1.2.0": - version: 1.3.1 - resolution: "jsonparse@npm:1.3.1" - checksum: 6514a7be4674ebf407afca0eda3ba284b69b07f9958a8d3113ef1005f7ec610860c312be067e450c569aab8b89635e332cee3696789c750692bb60daba627f4d - languageName: node - linkType: hard - -"jsonschema@npm:^1.2.4": - version: 1.4.1 - resolution: "jsonschema@npm:1.4.1" - checksum: 1ef02a6cd9bc32241ec86bbf1300bdbc3b5f2d8df6eb795517cf7d1cd9909e7beba1e54fdf73990fd66be98a182bda9add9607296b0cb00b1348212988e424b2 - languageName: node - linkType: hard - -"jsprim@npm:^1.2.2": - version: 1.4.2 - resolution: "jsprim@npm:1.4.2" - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.4.0 - verror: 1.10.0 - checksum: 2ad1b9fdcccae8b3d580fa6ced25de930eaa1ad154db21bbf8478a4d30bbbec7925b5f5ff29b933fba9412b16a17bd484a8da4fdb3663b5e27af95dd693bab2a - languageName: node - linkType: hard - -"keccak@npm:^3.0.0, keccak@npm:^3.0.2": - version: 3.0.3 - resolution: "keccak@npm:3.0.3" - dependencies: - node-addon-api: ^2.0.0 - node-gyp: latest - node-gyp-build: ^4.2.0 - readable-stream: ^3.6.0 - checksum: f08f04f5cc87013a3fc9e87262f761daff38945c86dd09c01a7f7930a15ae3e14f93b310ef821dcc83675a7b814eb1c983222399a2f263ad980251201d1b9a99 - languageName: node - linkType: hard - -"kind-of@npm:^6.0.2, kind-of@npm:^6.0.3": - version: 6.0.3 - resolution: "kind-of@npm:6.0.3" - checksum: 3ab01e7b1d440b22fe4c31f23d8d38b4d9b91d9f291df683476576493d5dfd2e03848a8b05813dd0c3f0e835bc63f433007ddeceb71f05cb25c45ae1b19c6d3b - languageName: node - linkType: hard - -"klaw@npm:^1.0.0": - version: 1.3.1 - resolution: "klaw@npm:1.3.1" - dependencies: - graceful-fs: ^4.1.9 - dependenciesMeta: - graceful-fs: - optional: true - checksum: 8f69e4797c26e7c3f2426bfa85f38a3da3c2cb1b4c6bd850d2377aed440d41ce9d806f2885c2e2e224372c56af4b1d43b8a499adecf9a05e7373dc6b8b7c52e4 - languageName: node - linkType: hard - -"level-supports@npm:^4.0.0": - version: 4.0.1 - resolution: "level-supports@npm:4.0.1" - checksum: d4552b42bb8cdeada07b0f6356c7a90fefe76279147331f291aceae26e3e56d5f927b09ce921647c0230bfe03ddfbdcef332be921e5c2194421ae2bfa3cf6368 - languageName: node - linkType: hard - -"level-transcoder@npm:^1.0.1": - version: 1.0.1 - resolution: "level-transcoder@npm:1.0.1" - dependencies: - buffer: ^6.0.3 - module-error: ^1.0.1 - checksum: 304f08d802faf3491a533b6d87ad8be3cabfd27f2713bbe9d4c633bf50fcb9460eab5a6776bf015e101ead7ba1c1853e05e7f341112f17a9d0cb37ee5a421a25 - languageName: node - linkType: hard - -"level@npm:^8.0.0": - version: 8.0.0 - resolution: "level@npm:8.0.0" - dependencies: - browser-level: ^1.0.1 - classic-level: ^1.2.0 - checksum: 13eb25bd71bfdca6cd714d1233adf9da97de9a8a4bf9f28d62a390b5c96d0250abaf983eb90eb8c4e89c7a985bb330750683d106f12670e5ea8fba1d7e608a1f - languageName: node - linkType: hard - -"levn@npm:^0.4.1": - version: 0.4.1 - resolution: "levn@npm:0.4.1" - dependencies: - prelude-ls: ^1.2.1 - type-check: ~0.4.0 - checksum: 12c5021c859bd0f5248561bf139121f0358285ec545ebf48bb3d346820d5c61a4309535c7f387ed7d84361cf821e124ce346c6b7cef8ee09a67c1473b46d0fc4 - languageName: node - linkType: hard - -"levn@npm:~0.3.0": - version: 0.3.0 - resolution: "levn@npm:0.3.0" - dependencies: - prelude-ls: ~1.1.2 - type-check: ~0.3.2 - checksum: 0d084a524231a8246bb10fec48cdbb35282099f6954838604f3c7fc66f2e16fa66fd9cc2f3f20a541a113c4dafdf181e822c887c8a319c9195444e6c64ac395e - languageName: node - linkType: hard - -"lilconfig@npm:2.1.0": - version: 2.1.0 - resolution: "lilconfig@npm:2.1.0" - checksum: 8549bb352b8192375fed4a74694cd61ad293904eee33f9d4866c2192865c44c4eb35d10782966242634e0cbc1e91fe62b1247f148dc5514918e3a966da7ea117 - languageName: node - linkType: hard - -"lines-and-columns@npm:^1.1.6": - version: 1.2.4 - resolution: "lines-and-columns@npm:1.2.4" - checksum: 0c37f9f7fa212b38912b7145e1cd16a5f3cd34d782441c3e6ca653485d326f58b3caccda66efce1c5812bde4961bbde3374fae4b0d11bf1226152337f3894aa5 - languageName: node - linkType: hard - -"lint-staged@npm:^13.0.4": - version: 13.2.0 - resolution: "lint-staged@npm:13.2.0" - dependencies: - chalk: 5.2.0 - cli-truncate: ^3.1.0 - commander: ^10.0.0 - debug: ^4.3.4 - execa: ^7.0.0 - lilconfig: 2.1.0 - listr2: ^5.0.7 - micromatch: ^4.0.5 - normalize-path: ^3.0.0 - object-inspect: ^1.12.3 - pidtree: ^0.6.0 - string-argv: ^0.3.1 - yaml: ^2.2.1 - bin: - lint-staged: bin/lint-staged.js - checksum: dcaa8fbbde567eb8ac27230a18b3a22f30c278c524c0e27cf7d4110d662d5d33ed68a585a2e1b05075ef1c262e853f557a5ae046188b723603246d63e6b9f07b - languageName: node - linkType: hard - -"listr2@npm:^5.0.7": - version: 5.0.8 - resolution: "listr2@npm:5.0.8" - dependencies: - cli-truncate: ^2.1.0 - colorette: ^2.0.19 - log-update: ^4.0.0 - p-map: ^4.0.0 - rfdc: ^1.3.0 - rxjs: ^7.8.0 - through: ^2.3.8 - wrap-ansi: ^7.0.0 - peerDependencies: - enquirer: ">= 2.3.0 < 3" - peerDependenciesMeta: - enquirer: - optional: true - checksum: 8be9f5632627c4df0dc33f452c98d415a49e5f1614650d3cab1b103c33e95f2a7a0e9f3e1e5de00d51bf0b4179acd8ff11b25be77dbe097cf3773c05e728d46c - languageName: node - linkType: hard - -"locate-path@npm:^2.0.0": - version: 2.0.0 - resolution: "locate-path@npm:2.0.0" - dependencies: - p-locate: ^2.0.0 - path-exists: ^3.0.0 - checksum: 02d581edbbbb0fa292e28d96b7de36b5b62c2fa8b5a7e82638ebb33afa74284acf022d3b1e9ae10e3ffb7658fbc49163fcd5e76e7d1baaa7801c3e05a81da755 - languageName: node - linkType: hard - -"locate-path@npm:^3.0.0": - version: 3.0.0 - resolution: "locate-path@npm:3.0.0" - dependencies: - p-locate: ^3.0.0 - path-exists: ^3.0.0 - checksum: 53db3996672f21f8b0bf2a2c645ae2c13ffdae1eeecfcd399a583bce8516c0b88dcb4222ca6efbbbeb6949df7e46860895be2c02e8d3219abd373ace3bfb4e11 - languageName: node - linkType: hard - -"locate-path@npm:^5.0.0": - version: 5.0.0 - resolution: "locate-path@npm:5.0.0" - dependencies: - p-locate: ^4.1.0 - checksum: 83e51725e67517287d73e1ded92b28602e3ae5580b301fe54bfb76c0c723e3f285b19252e375712316774cf52006cb236aed5704692c32db0d5d089b69696e30 - languageName: node - linkType: hard - -"locate-path@npm:^6.0.0": - version: 6.0.0 - resolution: "locate-path@npm:6.0.0" - dependencies: - p-locate: ^5.0.0 - checksum: 72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a - languageName: node - linkType: hard - -"lodash.camelcase@npm:^4.3.0": - version: 4.3.0 - resolution: "lodash.camelcase@npm:4.3.0" - checksum: cb9227612f71b83e42de93eccf1232feeb25e705bdb19ba26c04f91e885bfd3dd5c517c4a97137658190581d3493ea3973072ca010aab7e301046d90740393d1 - languageName: node - linkType: hard - -"lodash.isfunction@npm:^3.0.9": - version: 3.0.9 - resolution: "lodash.isfunction@npm:3.0.9" - checksum: 99e54c34b1e8a9ba75c034deb39cedbd2aca7af685815e67a2a8ec4f73ec9748cda6ebee5a07d7de4b938e90d421fd280e9c385cc190f903ac217ac8aff30314 - languageName: node - linkType: hard - -"lodash.isplainobject@npm:^4.0.6": - version: 4.0.6 - resolution: "lodash.isplainobject@npm:4.0.6" - checksum: 29c6351f281e0d9a1d58f1a4c8f4400924b4c79f18dfc4613624d7d54784df07efaff97c1ff2659f3e085ecf4fff493300adc4837553104cef2634110b0d5337 - languageName: node - linkType: hard - -"lodash.kebabcase@npm:^4.1.1": - version: 4.1.1 - resolution: "lodash.kebabcase@npm:4.1.1" - checksum: 5a6c59161914e1bae23438a298c7433e83d935e0f59853fa862e691164696bc07f6dfa4c313d499fbf41ba8d53314e9850416502376705a357d24ee6ca33af78 - languageName: node - linkType: hard - -"lodash.map@npm:^4.5.1": - version: 4.6.0 - resolution: "lodash.map@npm:4.6.0" - checksum: 7369a41d7d24d15ce3bbd02a7faa3a90f6266c38184e64932571b9b21b758bd10c04ffd117d1859be1a44156f29b94df5045eff172bf8a97fddf68bf1002d12f - languageName: node - linkType: hard - -"lodash.merge@npm:^4.6.2": - version: 4.6.2 - resolution: "lodash.merge@npm:4.6.2" - checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005 - languageName: node - linkType: hard - -"lodash.mergewith@npm:^4.6.2": - version: 4.6.2 - resolution: "lodash.mergewith@npm:4.6.2" - checksum: a6db2a9339752411f21b956908c404ec1e088e783a65c8b29e30ae5b3b6384f82517662d6f425cc97c2070b546cc2c7daaa8d33f78db7b6e9be06cd834abdeb8 - languageName: node - linkType: hard - -"lodash.snakecase@npm:^4.1.1": - version: 4.1.1 - resolution: "lodash.snakecase@npm:4.1.1" - checksum: 1685ed3e83dda6eae5a4dcaee161a51cd210aabb3e1c09c57150e7dd8feda19e4ca0d27d0631eabe8d0f4eaa51e376da64e8c018ae5415417c5890d42feb72a8 - languageName: node - linkType: hard - -"lodash.startcase@npm:^4.4.0": - version: 4.4.0 - resolution: "lodash.startcase@npm:4.4.0" - checksum: c03a4a784aca653845fe09d0ef67c902b6e49288dc45f542a4ab345a9c406a6dc194c774423fa313ee7b06283950301c1221dd2a1d8ecb2dac8dfbb9ed5606b5 - languageName: node - linkType: hard - -"lodash.truncate@npm:^4.4.2": - version: 4.4.2 - resolution: "lodash.truncate@npm:4.4.2" - checksum: b463d8a382cfb5f0e71c504dcb6f807a7bd379ff1ea216669aa42c52fc28c54e404bfbd96791aa09e6df0de2c1d7b8f1b7f4b1a61f324d38fe98bc535aeee4f5 - languageName: node - linkType: hard - -"lodash.uniq@npm:^4.5.0": - version: 4.5.0 - resolution: "lodash.uniq@npm:4.5.0" - checksum: a4779b57a8d0f3c441af13d9afe7ecff22dd1b8ce1129849f71d9bbc8e8ee4e46dfb4b7c28f7ad3d67481edd6e51126e4e2a6ee276e25906d10f7140187c392d - languageName: node - linkType: hard - -"lodash.upperfirst@npm:^4.3.1": - version: 4.3.1 - resolution: "lodash.upperfirst@npm:4.3.1" - checksum: cadec6955900afe1928cc60cdc4923a79c2ef991e42665419cc81630ed9b4f952a1093b222e0141ab31cbc4dba549f97ec28ff67929d71e01861c97188a5fa83 - languageName: node - linkType: hard - -"lodash@npm:4.17.21, lodash@npm:^4.17.11, lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.16, lodash@npm:^4.17.19, lodash@npm:^4.17.21": - version: 4.17.21 - resolution: "lodash@npm:4.17.21" - checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 - languageName: node - linkType: hard - -"log-symbols@npm:3.0.0": - version: 3.0.0 - resolution: "log-symbols@npm:3.0.0" - dependencies: - chalk: ^2.4.2 - checksum: f2322e1452d819050b11aad247660e1494f8b2219d40a964af91d5f9af1a90636f1b3d93f2952090e42af07cc5550aecabf6c1d8ec1181207e95cb66ba112361 - languageName: node - linkType: hard - -"log-symbols@npm:4.1.0, log-symbols@npm:^4.1.0": - version: 4.1.0 - resolution: "log-symbols@npm:4.1.0" - dependencies: - chalk: ^4.1.0 - is-unicode-supported: ^0.1.0 - checksum: fce1497b3135a0198803f9f07464165e9eb83ed02ceb2273930a6f8a508951178d8cf4f0378e9d28300a2ed2bc49050995d2bd5f53ab716bb15ac84d58c6ef74 - languageName: node - linkType: hard - -"log-update@npm:^4.0.0": - version: 4.0.0 - resolution: "log-update@npm:4.0.0" - dependencies: - ansi-escapes: ^4.3.0 - cli-cursor: ^3.1.0 - slice-ansi: ^4.0.0 - wrap-ansi: ^6.2.0 - checksum: ae2f85bbabc1906034154fb7d4c4477c79b3e703d22d78adee8b3862fa913942772e7fa11713e3d96fb46de4e3cabefbf5d0a544344f03b58d3c4bff52aa9eb2 - languageName: node - linkType: hard - -"longest@npm:^2.0.1": - version: 2.0.1 - resolution: "longest@npm:2.0.1" - checksum: 9587c153919a883ecbcc33e9439bc2592aa6fdbbd2d343f8ab17d8d3e0373c4e4350e3b428566fd689d704800a23f2b4d145cbdcca4ef3fd35742e5927f919a9 - languageName: node - linkType: hard - -"loupe@npm:^2.3.1": - version: 2.3.6 - resolution: "loupe@npm:2.3.6" - dependencies: - get-func-name: ^2.0.0 - checksum: cc83f1b124a1df7384601d72d8d1f5fe95fd7a8185469fec48bb2e4027e45243949e7a013e8d91051a138451ff0552310c32aa9786e60b6a30d1e801bdc2163f - languageName: node - linkType: hard - -"loupe@npm:^2.3.6": - version: 2.3.7 - resolution: "loupe@npm:2.3.7" - dependencies: - get-func-name: ^2.0.1 - checksum: 96c058ec7167598e238bb7fb9def2f9339215e97d6685d9c1e3e4bdb33d14600e11fe7a812cf0c003dfb73ca2df374f146280b2287cae9e8d989e9d7a69a203b - languageName: node - linkType: hard - -"lru-cache@npm:^5.1.1": - version: 5.1.1 - resolution: "lru-cache@npm:5.1.1" - dependencies: - yallist: ^3.0.2 - checksum: c154ae1cbb0c2206d1501a0e94df349653c92c8cbb25236d7e85190bcaf4567a03ac6eb43166fabfa36fd35623694da7233e88d9601fbf411a9a481d85dbd2cb - languageName: node - linkType: hard - -"lru-cache@npm:^6.0.0": - version: 6.0.0 - resolution: "lru-cache@npm:6.0.0" - dependencies: - yallist: ^4.0.0 - checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 - languageName: node - linkType: hard - -"lru-cache@npm:^7.7.1": - version: 7.18.3 - resolution: "lru-cache@npm:7.18.3" - checksum: e550d772384709deea3f141af34b6d4fa392e2e418c1498c078de0ee63670f1f46f5eee746e8ef7e69e1c895af0d4224e62ee33e66a543a14763b0f2e74c1356 - languageName: node - linkType: hard - -"lru_map@npm:^0.3.3": - version: 0.3.3 - resolution: "lru_map@npm:0.3.3" - checksum: ca9dd43c65ed7a4f117c548028101c5b6855e10923ea9d1f635af53ad20c5868ff428c364d454a7b57fe391b89c704982275410c3c5099cca5aeee00d76e169a - languageName: node - linkType: hard - -"make-error@npm:^1.1.1": - version: 1.3.6 - resolution: "make-error@npm:1.3.6" - checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 - languageName: node - linkType: hard - -"make-fetch-happen@npm:^10.0.3": - version: 10.2.1 - resolution: "make-fetch-happen@npm:10.2.1" - dependencies: - agentkeepalive: ^4.2.1 - cacache: ^16.1.0 - http-cache-semantics: ^4.1.0 - http-proxy-agent: ^5.0.0 - https-proxy-agent: ^5.0.0 - is-lambda: ^1.0.1 - lru-cache: ^7.7.1 - minipass: ^3.1.6 - minipass-collect: ^1.0.2 - minipass-fetch: ^2.0.3 - minipass-flush: ^1.0.5 - minipass-pipeline: ^1.2.4 - negotiator: ^0.6.3 - promise-retry: ^2.0.1 - socks-proxy-agent: ^7.0.0 - ssri: ^9.0.0 - checksum: 2332eb9a8ec96f1ffeeea56ccefabcb4193693597b132cd110734d50f2928842e22b84cfa1508e921b8385cdfd06dda9ad68645fed62b50fff629a580f5fb72c - languageName: node - linkType: hard - -"map-obj@npm:^1.0.0": - version: 1.0.1 - resolution: "map-obj@npm:1.0.1" - checksum: 9949e7baec2a336e63b8d4dc71018c117c3ce6e39d2451ccbfd3b8350c547c4f6af331a4cbe1c83193d7c6b786082b6256bde843db90cb7da2a21e8fcc28afed - languageName: node - linkType: hard - -"map-obj@npm:^4.0.0": - version: 4.3.0 - resolution: "map-obj@npm:4.3.0" - checksum: fbc554934d1a27a1910e842bc87b177b1a556609dd803747c85ece420692380827c6ae94a95cce4407c054fa0964be3bf8226f7f2cb2e9eeee432c7c1985684e - languageName: node - linkType: hard - -"markdown-table@npm:^1.1.3": - version: 1.1.3 - resolution: "markdown-table@npm:1.1.3" - checksum: 292e8c956ae833c2ccb0a55cd8d87980cd657ab11cd9ff63c3fcc4d3a518d3b3882ba07410b8f477ba9e30b3f70658677e4e8acf61816dd6cfdd1f6293130664 - languageName: node - linkType: hard - -"match-all@npm:^1.2.6": - version: 1.2.6 - resolution: "match-all@npm:1.2.6" - checksum: 3d4f16b8fd082f2fd10e362f4a8b71c62f8a767591b3db831ca2bdcf726337e9a64e4abc30e2ef053dc2bcfb875a9ed80bd78e006ad5ef11380a7158d0cb00e1 - languageName: node - linkType: hard - -"mcl-wasm@npm:^0.7.1": - version: 0.7.9 - resolution: "mcl-wasm@npm:0.7.9" - checksum: 6b6ed5084156b98b2db70b223e1ba2c01953970b48a2e0c4ea3eeb9296610e6b3bfb2a2cce9e92e2d7ad61778b5f5a630e705e663835e915ba188c174a0a37fa - languageName: node - linkType: hard - -"md5.js@npm:^1.3.4": - version: 1.3.5 - resolution: "md5.js@npm:1.3.5" - dependencies: - hash-base: ^3.0.0 - inherits: ^2.0.1 - safe-buffer: ^5.1.2 - checksum: 098494d885684bcc4f92294b18ba61b7bd353c23147fbc4688c75b45cb8590f5a95fd4584d742415dcc52487f7a1ef6ea611cfa1543b0dc4492fe026357f3f0c - languageName: node - linkType: hard - -"memory-level@npm:^1.0.0": - version: 1.0.0 - resolution: "memory-level@npm:1.0.0" - dependencies: - abstract-level: ^1.0.0 - functional-red-black-tree: ^1.0.1 - module-error: ^1.0.1 - checksum: 80b1b7aedaf936e754adbcd7b9303018c3684fb32f9992fd967c448f145d177f16c724fbba9ed3c3590a9475fd563151eae664d69b83d2ad48714852e9fc5c72 - languageName: node - linkType: hard - -"memorystream@npm:^0.3.1": - version: 0.3.1 - resolution: "memorystream@npm:0.3.1" - checksum: f18b42440d24d09516d01466c06adf797df7873f0d40aa7db02e5fb9ed83074e5e65412d0720901d7069363465f82dc4f8bcb44f0cde271567a61426ce6ca2e9 - languageName: node - linkType: hard - -"meow@npm:^8.0.0": - version: 8.1.2 - resolution: "meow@npm:8.1.2" - dependencies: - "@types/minimist": ^1.2.0 - camelcase-keys: ^6.2.2 - decamelize-keys: ^1.1.0 - hard-rejection: ^2.1.0 - minimist-options: 4.1.0 - normalize-package-data: ^3.0.0 - read-pkg-up: ^7.0.1 - redent: ^3.0.0 - trim-newlines: ^3.0.0 - type-fest: ^0.18.0 - yargs-parser: ^20.2.3 - checksum: bc23bf1b4423ef6a821dff9734406bce4b91ea257e7f10a8b7f896f45b59649f07adc0926e2917eacd8cf1df9e4cd89c77623cf63dfd0f8bf54de07a32ee5a85 - languageName: node - linkType: hard - -"merge-stream@npm:^2.0.0": - version: 2.0.0 - resolution: "merge-stream@npm:2.0.0" - checksum: 6fa4dcc8d86629705cea944a4b88ef4cb0e07656ebf223fa287443256414283dd25d91c1cd84c77987f2aec5927af1a9db6085757cb43d90eb170ebf4b47f4f4 - languageName: node - linkType: hard - -"merge2@npm:^1.2.3, merge2@npm:^1.3.0, merge2@npm:^1.4.1": - version: 1.4.1 - resolution: "merge2@npm:1.4.1" - checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 - languageName: node - linkType: hard - -"merge@npm:^2.1.1": - version: 2.1.1 - resolution: "merge@npm:2.1.1" - checksum: 9c36b0e25aa53b3f7305d7cf0f330397f1142cf311802b681e5619f12e986a790019b8246c1c0df21701c8652449f9046b0129551030097ef563d1958c823249 - languageName: node - linkType: hard - -"micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": - version: 4.0.5 - resolution: "micromatch@npm:4.0.5" - dependencies: - braces: ^3.0.2 - picomatch: ^2.3.1 - checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc - languageName: node - linkType: hard - -"mime-db@npm:1.52.0": - version: 1.52.0 - resolution: "mime-db@npm:1.52.0" - checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f - languageName: node - linkType: hard - -"mime-types@npm:^2.1.12, mime-types@npm:~2.1.19": - version: 2.1.35 - resolution: "mime-types@npm:2.1.35" - dependencies: - mime-db: 1.52.0 - checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836 - languageName: node - linkType: hard - -"mimic-fn@npm:^2.1.0": - version: 2.1.0 - resolution: "mimic-fn@npm:2.1.0" - checksum: d2421a3444848ce7f84bd49115ddacff29c15745db73f54041edc906c14b131a38d05298dae3081667627a59b2eb1ca4b436ff2e1b80f69679522410418b478a - languageName: node - linkType: hard - -"mimic-fn@npm:^4.0.0": - version: 4.0.0 - resolution: "mimic-fn@npm:4.0.0" - checksum: 995dcece15ee29aa16e188de6633d43a3db4611bcf93620e7e62109ec41c79c0f34277165b8ce5e361205049766e371851264c21ac64ca35499acb5421c2ba56 - languageName: node - linkType: hard - -"min-indent@npm:^1.0.0": - version: 1.0.1 - resolution: "min-indent@npm:1.0.1" - checksum: bfc6dd03c5eaf623a4963ebd94d087f6f4bbbfd8c41329a7f09706b0cb66969c4ddd336abeb587bc44bc6f08e13bf90f0b374f9d71f9f01e04adc2cd6f083ef1 - languageName: node - linkType: hard - -"minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": - version: 1.0.1 - resolution: "minimalistic-assert@npm:1.0.1" - checksum: cc7974a9268fbf130fb055aff76700d7e2d8be5f761fb5c60318d0ed010d839ab3661a533ad29a5d37653133385204c503bfac995aaa4236f4e847461ea32ba7 - languageName: node - linkType: hard - -"minimalistic-crypto-utils@npm:^1.0.1": - version: 1.0.1 - resolution: "minimalistic-crypto-utils@npm:1.0.1" - checksum: 6e8a0422b30039406efd4c440829ea8f988845db02a3299f372fceba56ffa94994a9c0f2fd70c17f9969eedfbd72f34b5070ead9656a34d3f71c0bd72583a0ed - languageName: node - linkType: hard - -"minimatch@npm:2 || 3, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": - version: 3.1.2 - resolution: "minimatch@npm:3.1.2" - dependencies: - brace-expansion: ^1.1.7 - checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a - languageName: node - linkType: hard - -"minimatch@npm:3.0.4": - version: 3.0.4 - resolution: "minimatch@npm:3.0.4" - dependencies: - brace-expansion: ^1.1.7 - checksum: 66ac295f8a7b59788000ea3749938b0970344c841750abd96694f80269b926ebcafad3deeb3f1da2522978b119e6ae3a5869b63b13a7859a456b3408bd18a078 - languageName: node - linkType: hard - -"minimatch@npm:5.0.1": - version: 5.0.1 - resolution: "minimatch@npm:5.0.1" - dependencies: - brace-expansion: ^2.0.1 - checksum: b34b98463da4754bc526b244d680c69d4d6089451ebe512edaf6dd9eeed0279399cfa3edb19233513b8f830bf4bfcad911dddcdf125e75074100d52f724774f0 - languageName: node - linkType: hard - -"minimatch@npm:^5.0.1": - version: 5.1.6 - resolution: "minimatch@npm:5.1.6" - dependencies: - brace-expansion: ^2.0.1 - checksum: 7564208ef81d7065a370f788d337cd80a689e981042cb9a1d0e6580b6c6a8c9279eba80010516e258835a988363f99f54a6f711a315089b8b42694f5da9d0d77 - languageName: node - linkType: hard - -"minimist-options@npm:4.1.0": - version: 4.1.0 - resolution: "minimist-options@npm:4.1.0" - dependencies: - arrify: ^1.0.1 - is-plain-obj: ^1.1.0 - kind-of: ^6.0.3 - checksum: 8c040b3068811e79de1140ca2b708d3e203c8003eb9a414c1ab3cd467fc5f17c9ca02a5aef23bedc51a7f8bfbe77f87e9a7e31ec81fba304cda675b019496f4e - languageName: node - linkType: hard - -"minimist@npm:1.2.7": - version: 1.2.7 - resolution: "minimist@npm:1.2.7" - checksum: 7346574a1038ca23c32e02252f603801f09384dd1d78b69a943a4e8c2c28730b80e96193882d3d3b22a063445f460e48316b29b8a25addca2d7e5e8f75478bec - languageName: node - linkType: hard - -"minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6": - version: 1.2.8 - resolution: "minimist@npm:1.2.8" - checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0 - languageName: node - linkType: hard - -"minipass-collect@npm:^1.0.2": - version: 1.0.2 - resolution: "minipass-collect@npm:1.0.2" - dependencies: - minipass: ^3.0.0 - checksum: 14df761028f3e47293aee72888f2657695ec66bd7d09cae7ad558da30415fdc4752bbfee66287dcc6fd5e6a2fa3466d6c484dc1cbd986525d9393b9523d97f10 - languageName: node - linkType: hard - -"minipass-fetch@npm:^2.0.3": - version: 2.1.2 - resolution: "minipass-fetch@npm:2.1.2" - dependencies: - encoding: ^0.1.13 - minipass: ^3.1.6 - minipass-sized: ^1.0.3 - minizlib: ^2.1.2 - dependenciesMeta: - encoding: - optional: true - checksum: 3f216be79164e915fc91210cea1850e488793c740534985da017a4cbc7a5ff50506956d0f73bb0cb60e4fe91be08b6b61ef35101706d3ef5da2c8709b5f08f91 - languageName: node - linkType: hard - -"minipass-flush@npm:^1.0.5": - version: 1.0.5 - resolution: "minipass-flush@npm:1.0.5" - dependencies: - minipass: ^3.0.0 - checksum: 56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf - languageName: node - linkType: hard - -"minipass-pipeline@npm:^1.2.4": - version: 1.2.4 - resolution: "minipass-pipeline@npm:1.2.4" - dependencies: - minipass: ^3.0.0 - checksum: b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b - languageName: node - linkType: hard - -"minipass-sized@npm:^1.0.3": - version: 1.0.3 - resolution: "minipass-sized@npm:1.0.3" - dependencies: - minipass: ^3.0.0 - checksum: 79076749fcacf21b5d16dd596d32c3b6bf4d6e62abb43868fac21674078505c8b15eaca4e47ed844985a4514854f917d78f588fcd029693709417d8f98b2bd60 - languageName: node - linkType: hard - -"minipass@npm:^3.0.0, minipass@npm:^3.1.1, minipass@npm:^3.1.6": - version: 3.3.6 - resolution: "minipass@npm:3.3.6" - dependencies: - yallist: ^4.0.0 - checksum: a30d083c8054cee83cdcdc97f97e4641a3f58ae743970457b1489ce38ee1167b3aaf7d815cd39ec7a99b9c40397fd4f686e83750e73e652b21cb516f6d845e48 - languageName: node - linkType: hard - -"minipass@npm:^4.0.0": - version: 4.2.5 - resolution: "minipass@npm:4.2.5" - checksum: 4f9c19af23a5d4a9e7156feefc9110634b178a8cff8f8271af16ec5ebf7e221725a97429952c856f5b17b30c2065ebd24c81722d90c93d2122611d75b952b48f - languageName: node - linkType: hard - -"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": - version: 2.1.2 - resolution: "minizlib@npm:2.1.2" - dependencies: - minipass: ^3.0.0 - yallist: ^4.0.0 - checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3 - languageName: node - linkType: hard - -"mkdirp@npm:0.5.5": - version: 0.5.5 - resolution: "mkdirp@npm:0.5.5" - dependencies: - minimist: ^1.2.5 - bin: - mkdirp: bin/cmd.js - checksum: 3bce20ea525f9477befe458ab85284b0b66c8dc3812f94155af07c827175948cdd8114852ac6c6d82009b13c1048c37f6d98743eb019651ee25c39acc8aabe7d - languageName: node - linkType: hard - -"mkdirp@npm:0.5.x, mkdirp@npm:^0.5.1": - version: 0.5.6 - resolution: "mkdirp@npm:0.5.6" - dependencies: - minimist: ^1.2.6 - bin: - mkdirp: bin/cmd.js - checksum: 0c91b721bb12c3f9af4b77ebf73604baf350e64d80df91754dc509491ae93bf238581e59c7188360cec7cb62fc4100959245a42cfe01834efedc5e9d068376c2 - languageName: node - linkType: hard - -"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": - version: 1.0.4 - resolution: "mkdirp@npm:1.0.4" - bin: - mkdirp: bin/cmd.js - checksum: a96865108c6c3b1b8e1d5e9f11843de1e077e57737602de1b82030815f311be11f96f09cce59bd5b903d0b29834733e5313f9301e3ed6d6f6fba2eae0df4298f - languageName: node - linkType: hard - -"mnemonist@npm:^0.38.0": - version: 0.38.5 - resolution: "mnemonist@npm:0.38.5" - dependencies: - obliterator: ^2.0.0 - checksum: 66080afc1616866beb164e230c432964d6eed467cf37ad00e9c10161b8267928124ca8f1d0ecfea86c85568acfa62d54faaf646a86968d1135189a0fdfdd6b78 - languageName: node - linkType: hard - -"mocha@npm:7.1.2": - version: 7.1.2 - resolution: "mocha@npm:7.1.2" - dependencies: - ansi-colors: 3.2.3 - browser-stdout: 1.3.1 - chokidar: 3.3.0 - debug: 3.2.6 - diff: 3.5.0 - escape-string-regexp: 1.0.5 - find-up: 3.0.0 - glob: 7.1.3 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 3.13.1 - log-symbols: 3.0.0 - minimatch: 3.0.4 - mkdirp: 0.5.5 - ms: 2.1.1 - node-environment-flags: 1.0.6 - object.assign: 4.1.0 - strip-json-comments: 2.0.1 - supports-color: 6.0.0 - which: 1.3.1 - wide-align: 1.1.3 - yargs: 13.3.2 - yargs-parser: 13.1.2 - yargs-unparser: 1.6.0 - bin: - _mocha: bin/_mocha - mocha: bin/mocha - checksum: 0fc9ad0dd79e43a34de03441634f58e8a3d211af4cdbcd56de150ec99f7aff3b8678bd5aeb41f82115f7df4199a24f7bb372f65e5bcba133b41a5310dee908bd - languageName: node - linkType: hard - -"mocha@npm:^10.0.0, mocha@npm:^10.1.0": - version: 10.2.0 - resolution: "mocha@npm:10.2.0" - dependencies: - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.4 - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 5.0.1 - ms: 2.1.3 - nanoid: 3.3.3 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - workerpool: 6.2.1 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - bin: - _mocha: bin/_mocha - mocha: bin/mocha.js - checksum: 406c45eab122ffd6ea2003c2f108b2bc35ba036225eee78e0c784b6fa2c7f34e2b13f1dbacef55a4fdf523255d76e4f22d1b5aacda2394bd11666febec17c719 - languageName: node - linkType: hard - -"mocha@npm:^7.1.1": - version: 7.2.0 - resolution: "mocha@npm:7.2.0" - dependencies: - ansi-colors: 3.2.3 - browser-stdout: 1.3.1 - chokidar: 3.3.0 - debug: 3.2.6 - diff: 3.5.0 - escape-string-regexp: 1.0.5 - find-up: 3.0.0 - glob: 7.1.3 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 3.13.1 - log-symbols: 3.0.0 - minimatch: 3.0.4 - mkdirp: 0.5.5 - ms: 2.1.1 - node-environment-flags: 1.0.6 - object.assign: 4.1.0 - strip-json-comments: 2.0.1 - supports-color: 6.0.0 - which: 1.3.1 - wide-align: 1.1.3 - yargs: 13.3.2 - yargs-parser: 13.1.2 - yargs-unparser: 1.6.0 - bin: - _mocha: bin/_mocha - mocha: bin/mocha - checksum: d098484fe1b165bb964fdbf6b88b256c71fead47575ca7c5bcf8ed07db0dcff41905f6d2f0a05111a0441efaef9d09241a8cc1ddf7961056b28984ec63ba2874 - languageName: node - linkType: hard - -"module-error@npm:^1.0.1, module-error@npm:^1.0.2": - version: 1.0.2 - resolution: "module-error@npm:1.0.2" - checksum: 5d653e35bd55b3e95f8aee2cdac108082ea892e71b8f651be92cde43e4ee86abee4fa8bd7fc3fe5e68b63926d42f63c54cd17b87a560c31f18739295575a3962 - languageName: node - linkType: hard - -"ms@npm:2.1.1": - version: 2.1.1 - resolution: "ms@npm:2.1.1" - checksum: 0078a23cd916a9a7435c413caa14c57d4b4f6e2470e0ab554b6964163c8a4436448ac7ae020e883685475da6b6796cc396b670f579cb275db288a21e3e57721e - languageName: node - linkType: hard - -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f - languageName: node - linkType: hard - -"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d - languageName: node - linkType: hard - -"murmur-128@npm:^0.2.1": - version: 0.2.1 - resolution: "murmur-128@npm:0.2.1" - dependencies: - encode-utf8: ^1.0.2 - fmix: ^0.1.0 - imul: ^1.0.0 - checksum: 94ff8b39bf1a1a7bde83b6d13f656bbe591e0a5b5ffe4384c39470120ab70e9eadf0af38557742a30d24421ddc63aea6bba1028a1d6b66553038ee86a660dd92 - languageName: node - linkType: hard - -"mute-stream@npm:0.0.8": - version: 0.0.8 - resolution: "mute-stream@npm:0.0.8" - checksum: ff48d251fc3f827e5b1206cda0ffdaec885e56057ee86a3155e1951bc940fd5f33531774b1cc8414d7668c10a8907f863f6561875ee6e8768931a62121a531a1 - languageName: node - linkType: hard - -"nanoid@npm:3.3.3": - version: 3.3.3 - resolution: "nanoid@npm:3.3.3" - bin: - nanoid: bin/nanoid.cjs - checksum: ada019402a07464a694553c61d2dca8a4353645a7d92f2830f0d487fedff403678a0bee5323a46522752b2eab95a0bc3da98b6cccaa7c0c55cd9975130e6d6f0 - languageName: node - linkType: hard - -"napi-macros@npm:~2.0.0": - version: 2.0.0 - resolution: "napi-macros@npm:2.0.0" - checksum: 30384819386977c1f82034757014163fa60ab3c5a538094f778d38788bebb52534966279956f796a92ea771c7f8ae072b975df65de910d051ffbdc927f62320c - languageName: node - linkType: hard - -"natural-compare-lite@npm:^1.4.0": - version: 1.4.0 - resolution: "natural-compare-lite@npm:1.4.0" - checksum: 5222ac3986a2b78dd6069ac62cbb52a7bf8ffc90d972ab76dfe7b01892485d229530ed20d0c62e79a6b363a663b273db3bde195a1358ce9e5f779d4453887225 - languageName: node - linkType: hard - -"natural-compare@npm:^1.4.0": - version: 1.4.0 - resolution: "natural-compare@npm:1.4.0" - checksum: 23ad088b08f898fc9b53011d7bb78ec48e79de7627e01ab5518e806033861bef68d5b0cd0e2205c2f36690ac9571ff6bcb05eb777ced2eeda8d4ac5b44592c3d - languageName: node - linkType: hard - -"negotiator@npm:^0.6.3": - version: 0.6.3 - resolution: "negotiator@npm:0.6.3" - checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 - languageName: node - linkType: hard - -"neo-async@npm:^2.6.0": - version: 2.6.2 - resolution: "neo-async@npm:2.6.2" - checksum: deac9f8d00eda7b2e5cd1b2549e26e10a0faa70adaa6fdadca701cc55f49ee9018e427f424bac0c790b7c7e2d3068db97f3093f1093975f2acb8f8818b936ed9 - languageName: node - linkType: hard - -"node-addon-api@npm:^2.0.0": - version: 2.0.2 - resolution: "node-addon-api@npm:2.0.2" - dependencies: - node-gyp: latest - checksum: 31fb22d674648204f8dd94167eb5aac896c841b84a9210d614bf5d97c74ef059cc6326389cf0c54d2086e35312938401d4cc82e5fcd679202503eb8ac84814f8 - languageName: node - linkType: hard - -"node-emoji@npm:^1.10.0": - version: 1.11.0 - resolution: "node-emoji@npm:1.11.0" - dependencies: - lodash: ^4.17.21 - checksum: e8c856c04a1645062112a72e59a98b203505ed5111ff84a3a5f40611afa229b578c7d50f1e6a7f17aa62baeea4a640d2e2f61f63afc05423aa267af10977fb2b - languageName: node - linkType: hard - -"node-environment-flags@npm:1.0.6": - version: 1.0.6 - resolution: "node-environment-flags@npm:1.0.6" - dependencies: - object.getownpropertydescriptors: ^2.0.3 - semver: ^5.7.0 - checksum: 268139ed0f7fabdca346dcb26931300ec7a1dc54a58085a849e5c78a82b94967f55df40177a69d4e819da278d98686d5c4fd49ab0d7bcff16fda25b6fffc4ca3 - languageName: node - linkType: hard - -"node-fetch@npm:^2.6.12": - version: 2.7.0 - resolution: "node-fetch@npm:2.7.0" - dependencies: - whatwg-url: ^5.0.0 - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - checksum: d76d2f5edb451a3f05b15115ec89fc6be39de37c6089f1b6368df03b91e1633fd379a7e01b7ab05089a25034b2023d959b47e59759cb38d88341b2459e89d6e5 - languageName: node - linkType: hard - -"node-gyp-build@npm:^4.2.0, node-gyp-build@npm:^4.3.0": - version: 4.6.0 - resolution: "node-gyp-build@npm:4.6.0" - bin: - node-gyp-build: bin.js - node-gyp-build-optional: optional.js - node-gyp-build-test: build-test.js - checksum: 25d78c5ef1f8c24291f4a370c47ba52fcea14f39272041a90a7894cd50d766f7c8cb8fb06c0f42bf6f69b204b49d9be3c8fc344aac09714d5bdb95965499eb15 - languageName: node - linkType: hard - -"node-gyp@npm:latest": - version: 9.3.1 - resolution: "node-gyp@npm:9.3.1" - dependencies: - env-paths: ^2.2.0 - glob: ^7.1.4 - graceful-fs: ^4.2.6 - make-fetch-happen: ^10.0.3 - nopt: ^6.0.0 - npmlog: ^6.0.0 - rimraf: ^3.0.2 - semver: ^7.3.5 - tar: ^6.1.2 - which: ^2.0.2 - bin: - node-gyp: bin/node-gyp.js - checksum: b860e9976fa645ca0789c69e25387401b4396b93c8375489b5151a6c55cf2640a3b6183c212b38625ef7c508994930b72198338e3d09b9d7ade5acc4aaf51ea7 - languageName: node - linkType: hard - -"nofilter@npm:^3.1.0": - version: 3.1.0 - resolution: "nofilter@npm:3.1.0" - checksum: 58aa85a5b4b35cbb6e42de8a8591c5e338061edc9f3e7286f2c335e9e9b9b8fa7c335ae45daa8a1f3433164dc0b9a3d187fa96f9516e04a17a1f9ce722becc4f - languageName: node - linkType: hard - -"nopt@npm:3.x": - version: 3.0.6 - resolution: "nopt@npm:3.0.6" - dependencies: - abbrev: 1 - bin: - nopt: ./bin/nopt.js - checksum: 7f8579029a0d7cb3341c6b1610b31e363f708b7aaaaf3580e3ec5ae8528d1f3a79d350d8bfa331776e6c6703a5a148b72edd9b9b4c1dd55874d8e70e963d1e20 - languageName: node - linkType: hard - -"nopt@npm:^6.0.0": - version: 6.0.0 - resolution: "nopt@npm:6.0.0" - dependencies: - abbrev: ^1.0.0 - bin: - nopt: bin/nopt.js - checksum: 82149371f8be0c4b9ec2f863cc6509a7fd0fa729929c009f3a58e4eb0c9e4cae9920e8f1f8eb46e7d032fec8fb01bede7f0f41a67eb3553b7b8e14fa53de1dac - languageName: node - linkType: hard - -"normalize-package-data@npm:^2.5.0": - version: 2.5.0 - resolution: "normalize-package-data@npm:2.5.0" - dependencies: - hosted-git-info: ^2.1.4 - resolve: ^1.10.0 - semver: 2 || 3 || 4 || 5 - validate-npm-package-license: ^3.0.1 - checksum: 7999112efc35a6259bc22db460540cae06564aa65d0271e3bdfa86876d08b0e578b7b5b0028ee61b23f1cae9fc0e7847e4edc0948d3068a39a2a82853efc8499 - languageName: node - linkType: hard - -"normalize-package-data@npm:^3.0.0": - version: 3.0.3 - resolution: "normalize-package-data@npm:3.0.3" - dependencies: - hosted-git-info: ^4.0.1 - is-core-module: ^2.5.0 - semver: ^7.3.4 - validate-npm-package-license: ^3.0.1 - checksum: bbcee00339e7c26fdbc760f9b66d429258e2ceca41a5df41f5df06cc7652de8d82e8679ff188ca095cad8eff2b6118d7d866af2b68400f74602fbcbce39c160a - languageName: node - linkType: hard - -"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": - version: 3.0.0 - resolution: "normalize-path@npm:3.0.0" - checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 - languageName: node - linkType: hard - -"npm-run-path@npm:^4.0.1": - version: 4.0.1 - resolution: "npm-run-path@npm:4.0.1" - dependencies: - path-key: ^3.0.0 - checksum: 5374c0cea4b0bbfdfae62da7bbdf1e1558d338335f4cacf2515c282ff358ff27b2ecb91ffa5330a8b14390ac66a1e146e10700440c1ab868208430f56b5f4d23 - languageName: node - linkType: hard - -"npm-run-path@npm:^5.1.0": - version: 5.1.0 - resolution: "npm-run-path@npm:5.1.0" - dependencies: - path-key: ^4.0.0 - checksum: dc184eb5ec239d6a2b990b43236845332ef12f4e0beaa9701de724aa797fe40b6bbd0157fb7639d24d3ab13f5d5cf22d223a19c6300846b8126f335f788bee66 - languageName: node - linkType: hard - -"npmlog@npm:^6.0.0": - version: 6.0.2 - resolution: "npmlog@npm:6.0.2" - dependencies: - are-we-there-yet: ^3.0.0 - console-control-strings: ^1.1.0 - gauge: ^4.0.3 - set-blocking: ^2.0.0 - checksum: ae238cd264a1c3f22091cdd9e2b106f684297d3c184f1146984ecbe18aaa86343953f26b9520dedd1b1372bc0316905b736c1932d778dbeb1fcf5a1001390e2a - languageName: node - linkType: hard - -"number-to-bn@npm:1.7.0": - version: 1.7.0 - resolution: "number-to-bn@npm:1.7.0" - dependencies: - bn.js: 4.11.6 - strip-hex-prefix: 1.0.0 - checksum: 5b8c9dbe7b49dc7a069e5f0ba4e197257c89db11463478cb002fee7a34dc8868636952bd9f6310e5fdf22b266e0e6dffb5f9537c741734718107e90ae59b3de4 - languageName: node - linkType: hard - -"oauth-sign@npm:~0.9.0": - version: 0.9.0 - resolution: "oauth-sign@npm:0.9.0" - checksum: 8f5497a127967866a3c67094c21efd295e46013a94e6e828573c62220e9af568cc1d2d04b16865ba583e430510fa168baf821ea78f355146d8ed7e350fc44c64 - languageName: node - linkType: hard - -"object-assign@npm:^4.1.0": - version: 4.1.1 - resolution: "object-assign@npm:4.1.1" - checksum: fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f - languageName: node - linkType: hard - -"object-inspect@npm:^1.12.3, object-inspect@npm:^1.9.0": - version: 1.12.3 - resolution: "object-inspect@npm:1.12.3" - checksum: dabfd824d97a5f407e6d5d24810d888859f6be394d8b733a77442b277e0808860555176719c5905e765e3743a7cada6b8b0a3b85e5331c530fd418cc8ae991db - languageName: node - linkType: hard - -"object-keys@npm:^1.0.11, object-keys@npm:^1.1.1": - version: 1.1.1 - resolution: "object-keys@npm:1.1.1" - checksum: b363c5e7644b1e1b04aa507e88dcb8e3a2f52b6ffd0ea801e4c7a62d5aa559affe21c55a07fd4b1fd55fc03a33c610d73426664b20032405d7b92a1414c34d6a - languageName: node - linkType: hard - -"object.assign@npm:4.1.0": - version: 4.1.0 - resolution: "object.assign@npm:4.1.0" - dependencies: - define-properties: ^1.1.2 - function-bind: ^1.1.1 - has-symbols: ^1.0.0 - object-keys: ^1.0.11 - checksum: 648a9a463580bf48332d9a49a76fede2660ab1ee7104d9459b8a240562246da790b4151c3c073f28fda31c1fdc555d25a1d871e72be403e997e4468c91f4801f - languageName: node - linkType: hard - -"object.assign@npm:^4.1.4": - version: 4.1.4 - resolution: "object.assign@npm:4.1.4" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - has-symbols: ^1.0.3 - object-keys: ^1.1.1 - checksum: 76cab513a5999acbfe0ff355f15a6a125e71805fcf53de4e9d4e082e1989bdb81d1e329291e1e4e0ae7719f0e4ef80e88fb2d367ae60500d79d25a6224ac8864 - languageName: node - linkType: hard - -"object.getownpropertydescriptors@npm:^2.0.3": - version: 2.1.5 - resolution: "object.getownpropertydescriptors@npm:2.1.5" - dependencies: - array.prototype.reduce: ^1.0.5 - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - checksum: 7883e1aac1f9cd4cd85e2bb8c7aab6a60940a7cfe07b788356f301844d4967482fc81058e7bda24e1b3909cbb4879387ea9407329b78704f8937bc0b97dec58b - languageName: node - linkType: hard - -"obliterator@npm:^2.0.0": - version: 2.0.4 - resolution: "obliterator@npm:2.0.4" - checksum: f28ad35b6d812089315f375dc3e6e5f9bebf958ebe4b10ccd471c7115cbcf595e74bdac4783ae758e5b1f47e3096427fdb37cfa7bed566b132df92ff317b9a7c - languageName: node - linkType: hard - -"once@npm:1.x, once@npm:^1.3.0": - version: 1.4.0 - resolution: "once@npm:1.4.0" - dependencies: - wrappy: 1 - checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 - languageName: node - linkType: hard - -"onetime@npm:^5.1.0, onetime@npm:^5.1.2": - version: 5.1.2 - resolution: "onetime@npm:5.1.2" - dependencies: - mimic-fn: ^2.1.0 - checksum: 2478859ef817fc5d4e9c2f9e5728512ddd1dbc9fb7829ad263765bb6d3b91ce699d6e2332eef6b7dff183c2f490bd3349f1666427eaba4469fba0ac38dfd0d34 - languageName: node - linkType: hard - -"onetime@npm:^6.0.0": - version: 6.0.0 - resolution: "onetime@npm:6.0.0" - dependencies: - mimic-fn: ^4.0.0 - checksum: 0846ce78e440841335d4e9182ef69d5762e9f38aa7499b19f42ea1c4cd40f0b4446094c455c713f9adac3f4ae86f613bb5e30c99e52652764d06a89f709b3788 - languageName: node - linkType: hard - -"optionator@npm:^0.8.1": - version: 0.8.3 - resolution: "optionator@npm:0.8.3" - 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 - checksum: b8695ddf3d593203e25ab0900e265d860038486c943ff8b774f596a310f8ceebdb30c6832407a8198ba3ec9debe1abe1f51d4aad94843612db3b76d690c61d34 - languageName: node - linkType: hard - -"optionator@npm:^0.9.1": - version: 0.9.1 - resolution: "optionator@npm:0.9.1" - dependencies: - deep-is: ^0.1.3 - fast-levenshtein: ^2.0.6 - levn: ^0.4.1 - prelude-ls: ^1.2.1 - type-check: ^0.4.0 - word-wrap: ^1.2.3 - checksum: dbc6fa065604b24ea57d734261914e697bd73b69eff7f18e967e8912aa2a40a19a9f599a507fa805be6c13c24c4eae8c71306c239d517d42d4c041c942f508a0 - languageName: node - linkType: hard - -"ora@npm:^5.4.1": - version: 5.4.1 - resolution: "ora@npm:5.4.1" - dependencies: - bl: ^4.1.0 - chalk: ^4.1.0 - cli-cursor: ^3.1.0 - cli-spinners: ^2.5.0 - is-interactive: ^1.0.0 - is-unicode-supported: ^0.1.0 - log-symbols: ^4.1.0 - strip-ansi: ^6.0.0 - wcwidth: ^1.0.1 - checksum: 28d476ee6c1049d68368c0dc922e7225e3b5600c3ede88fade8052837f9ed342625fdaa84a6209302587c8ddd9b664f71f0759833cbdb3a4cf81344057e63c63 - languageName: node - linkType: hard - -"ordinal@npm:^1.0.3": - version: 1.0.3 - resolution: "ordinal@npm:1.0.3" - checksum: 6761c5b7606b6c4b0c22b4097dab4fe7ffcddacc49238eedf9c0ced877f5d4e4ad3f4fd43fefa1cc3f167cc54c7149267441b2ae85b81ccf13f45cf4b7947164 - languageName: node - linkType: hard - -"os-tmpdir@npm:~1.0.2": - version: 1.0.2 - resolution: "os-tmpdir@npm:1.0.2" - checksum: 5666560f7b9f10182548bf7013883265be33620b1c1b4a4d405c25be2636f970c5488ff3e6c48de75b55d02bde037249fe5dbfbb4c0fb7714953d56aed062e6d - languageName: node - linkType: hard - -"p-limit@npm:^1.1.0": - version: 1.3.0 - resolution: "p-limit@npm:1.3.0" - dependencies: - p-try: ^1.0.0 - checksum: 281c1c0b8c82e1ac9f81acd72a2e35d402bf572e09721ce5520164e9de07d8274451378a3470707179ad13240535558f4b277f02405ad752e08c7d5b0d54fbfd - languageName: node - linkType: hard - -"p-limit@npm:^2.0.0, p-limit@npm:^2.2.0": - version: 2.3.0 - resolution: "p-limit@npm:2.3.0" - dependencies: - p-try: ^2.0.0 - checksum: 84ff17f1a38126c3314e91ecfe56aecbf36430940e2873dadaa773ffe072dc23b7af8e46d4b6485d302a11673fe94c6b67ca2cfbb60c989848b02100d0594ac1 - languageName: node - linkType: hard - -"p-limit@npm:^3.0.2": - version: 3.1.0 - resolution: "p-limit@npm:3.1.0" - dependencies: - yocto-queue: ^0.1.0 - checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 - languageName: node - linkType: hard - -"p-locate@npm:^2.0.0": - version: 2.0.0 - resolution: "p-locate@npm:2.0.0" - dependencies: - p-limit: ^1.1.0 - checksum: e2dceb9b49b96d5513d90f715780f6f4972f46987dc32a0e18bc6c3fc74a1a5d73ec5f81b1398af5e58b99ea1ad03fd41e9181c01fa81b4af2833958696e3081 - languageName: node - linkType: hard - -"p-locate@npm:^3.0.0": - version: 3.0.0 - resolution: "p-locate@npm:3.0.0" - dependencies: - p-limit: ^2.0.0 - checksum: 83991734a9854a05fe9dbb29f707ea8a0599391f52daac32b86f08e21415e857ffa60f0e120bfe7ce0cc4faf9274a50239c7895fc0d0579d08411e513b83a4ae - languageName: node - linkType: hard - -"p-locate@npm:^4.1.0": - version: 4.1.0 - resolution: "p-locate@npm:4.1.0" - dependencies: - p-limit: ^2.2.0 - checksum: 513bd14a455f5da4ebfcb819ef706c54adb09097703de6aeaa5d26fe5ea16df92b48d1ac45e01e3944ce1e6aa2a66f7f8894742b8c9d6e276e16cd2049a2b870 - languageName: node - linkType: hard - -"p-locate@npm:^5.0.0": - version: 5.0.0 - resolution: "p-locate@npm:5.0.0" - dependencies: - p-limit: ^3.0.2 - checksum: 1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3 - languageName: node - linkType: hard - -"p-map@npm:^4.0.0": - version: 4.0.0 - resolution: "p-map@npm:4.0.0" - dependencies: - aggregate-error: ^3.0.0 - checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c - languageName: node - linkType: hard - -"p-try@npm:^1.0.0": - version: 1.0.0 - resolution: "p-try@npm:1.0.0" - checksum: 3b5303f77eb7722144154288bfd96f799f8ff3e2b2b39330efe38db5dd359e4fb27012464cd85cb0a76e9b7edd1b443568cb3192c22e7cffc34989df0bafd605 - languageName: node - linkType: hard - -"p-try@npm:^2.0.0": - version: 2.2.0 - resolution: "p-try@npm:2.2.0" - checksum: f8a8e9a7693659383f06aec604ad5ead237c7a261c18048a6e1b5b85a5f8a067e469aa24f5bc009b991ea3b058a87f5065ef4176793a200d4917349881216cae - languageName: node - linkType: hard - -"parent-module@npm:^1.0.0": - version: 1.0.1 - resolution: "parent-module@npm:1.0.1" - dependencies: - callsites: ^3.0.0 - checksum: 6ba8b255145cae9470cf5551eb74be2d22281587af787a2626683a6c20fbb464978784661478dd2a3f1dad74d1e802d403e1b03c1a31fab310259eec8ac560ff - languageName: node - linkType: hard - -"parse-cache-control@npm:^1.0.1": - version: 1.0.1 - resolution: "parse-cache-control@npm:1.0.1" - checksum: 5a70868792124eb07c2dd07a78fcb824102e972e908254e9e59ce59a4796c51705ff28196d2b20d3b7353d14e9f98e65ed0e4eda9be072cc99b5297dc0466fee - languageName: node - linkType: hard - -"parse-json@npm:^5.0.0": - version: 5.2.0 - resolution: "parse-json@npm:5.2.0" - dependencies: - "@babel/code-frame": ^7.0.0 - error-ex: ^1.3.1 - json-parse-even-better-errors: ^2.3.0 - lines-and-columns: ^1.1.6 - checksum: 62085b17d64da57f40f6afc2ac1f4d95def18c4323577e1eced571db75d9ab59b297d1d10582920f84b15985cbfc6b6d450ccbf317644cfa176f3ed982ad87e2 - languageName: node - linkType: hard - -"parse-passwd@npm:^1.0.0": - version: 1.0.0 - resolution: "parse-passwd@npm:1.0.0" - checksum: 4e55e0231d58f828a41d0f1da2bf2ff7bcef8f4cb6146e69d16ce499190de58b06199e6bd9b17fbf0d4d8aef9052099cdf8c4f13a6294b1a522e8e958073066e - languageName: node - linkType: hard - -"path-exists@npm:^3.0.0": - version: 3.0.0 - resolution: "path-exists@npm:3.0.0" - checksum: 96e92643aa34b4b28d0de1cd2eba52a1c5313a90c6542d03f62750d82480e20bfa62bc865d5cfc6165f5fcd5aeb0851043c40a39be5989646f223300021bae0a - languageName: node - linkType: hard - -"path-exists@npm:^4.0.0": - version: 4.0.0 - resolution: "path-exists@npm:4.0.0" - checksum: 505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 - languageName: node - linkType: hard - -"path-is-absolute@npm:^1.0.0": - version: 1.0.1 - resolution: "path-is-absolute@npm:1.0.1" - checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 - languageName: node - linkType: hard - -"path-key@npm:^3.0.0, path-key@npm:^3.1.0": - version: 3.1.1 - resolution: "path-key@npm:3.1.1" - checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 - languageName: node - linkType: hard - -"path-key@npm:^4.0.0": - version: 4.0.0 - resolution: "path-key@npm:4.0.0" - checksum: 8e6c314ae6d16b83e93032c61020129f6f4484590a777eed709c4a01b50e498822b00f76ceaf94bc64dbd90b327df56ceadce27da3d83393790f1219e07721d7 - languageName: node - linkType: hard - -"path-parse@npm:^1.0.6, path-parse@npm:^1.0.7": - version: 1.0.7 - resolution: "path-parse@npm:1.0.7" - checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a - languageName: node - linkType: hard - -"path-type@npm:^4.0.0": - version: 4.0.0 - resolution: "path-type@npm:4.0.0" - checksum: 5b1e2daa247062061325b8fdbfd1fb56dde0a448fb1455453276ea18c60685bdad23a445dc148cf87bc216be1573357509b7d4060494a6fd768c7efad833ee45 - languageName: node - linkType: hard - -"pathval@npm:^1.1.1": - version: 1.1.1 - resolution: "pathval@npm:1.1.1" - checksum: 090e3147716647fb7fb5b4b8c8e5b55e5d0a6086d085b6cd23f3d3c01fcf0ff56fd3cc22f2f4a033bd2e46ed55d61ed8379e123b42afe7d531a2a5fc8bb556d6 - languageName: node - linkType: hard - -"pbkdf2@npm:^3.0.17": - version: 3.1.2 - resolution: "pbkdf2@npm:3.1.2" - 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 - checksum: 2c950a100b1da72123449208e231afc188d980177d021d7121e96a2de7f2abbc96ead2b87d03d8fe5c318face097f203270d7e27908af9f471c165a4e8e69c92 - languageName: node - linkType: hard - -"performance-now@npm:^2.1.0": - version: 2.1.0 - resolution: "performance-now@npm:2.1.0" - checksum: 534e641aa8f7cba160f0afec0599b6cecefbb516a2e837b512be0adbe6c1da5550e89c78059c7fabc5c9ffdf6627edabe23eb7c518c4500067a898fa65c2b550 - languageName: node - linkType: hard - -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1": - version: 2.3.1 - resolution: "picomatch@npm:2.3.1" - checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf - languageName: node - linkType: hard - -"pidtree@npm:^0.6.0": - version: 0.6.0 - resolution: "pidtree@npm:0.6.0" - bin: - pidtree: bin/pidtree.js - checksum: 8fbc073ede9209dd15e80d616e65eb674986c93be49f42d9ddde8dbbd141bb53d628a7ca4e58ab5c370bb00383f67d75df59a9a226dede8fa801267a7030c27a - languageName: node - linkType: hard - -"pify@npm:^4.0.1": - version: 4.0.1 - resolution: "pify@npm:4.0.1" - checksum: 9c4e34278cb09987685fa5ef81499c82546c033713518f6441778fbec623fc708777fe8ac633097c72d88470d5963094076c7305cafc7ad340aae27cfacd856b - languageName: node - linkType: hard - -"pinst@npm:^3.0.0": - version: 3.0.0 - resolution: "pinst@npm:3.0.0" - bin: - pinst: bin.js - checksum: 4ae48a6a60f79c37071233af51b4d91bfc85cfa3c12b66ccda60cdb642b4d14a4ab0cb3587afc55b1f6192cea1772a5e4822026a0d0d3528296edef00cc2d61f - languageName: node - linkType: hard - -"pluralize@npm:^8.0.0": - version: 8.0.0 - resolution: "pluralize@npm:8.0.0" - checksum: 08931d4a6a4a5561a7f94f67a31c17e6632cb21e459ab3ff4f6f629d9a822984cf8afef2311d2005fbea5d7ef26016ebb090db008e2d8bce39d0a9a9d218736e - languageName: node - linkType: hard - -"prelude-ls@npm:^1.2.1": - version: 1.2.1 - resolution: "prelude-ls@npm:1.2.1" - checksum: cd192ec0d0a8e4c6da3bb80e4f62afe336df3f76271ac6deb0e6a36187133b6073a19e9727a1ff108cd8b9982e4768850d413baa71214dd80c7979617dca827a - languageName: node - linkType: hard - -"prelude-ls@npm:~1.1.2": - version: 1.1.2 - resolution: "prelude-ls@npm:1.1.2" - checksum: c4867c87488e4a0c233e158e4d0d5565b609b105d75e4c05dc760840475f06b731332eb93cc8c9cecb840aa8ec323ca3c9a56ad7820ad2e63f0261dadcb154e4 - languageName: node - linkType: hard - -"prettier-linter-helpers@npm:^1.0.0": - version: 1.0.0 - resolution: "prettier-linter-helpers@npm:1.0.0" - dependencies: - fast-diff: ^1.1.2 - checksum: 00ce8011cf6430158d27f9c92cfea0a7699405633f7f1d4a45f07e21bf78e99895911cbcdc3853db3a824201a7c745bd49bfea8abd5fb9883e765a90f74f8392 - languageName: node - linkType: hard - -"prettier-plugin-solidity@npm:^1.0.0": - version: 1.1.3 - resolution: "prettier-plugin-solidity@npm:1.1.3" - dependencies: - "@solidity-parser/parser": ^0.16.0 - semver: ^7.3.8 - solidity-comments-extractor: ^0.0.7 - peerDependencies: - prettier: ">=2.3.0 || >=3.0.0-alpha.0" - checksum: d5aadfa411a4d983a2bd204048726fd91fbcaffbfa26d818ef0d6001fb65f82d0eae082e935e96c79e65e09ed979b186311ddb8c38be2f0ce5dd5f5265df77fe - languageName: node - linkType: hard - -"prettier@npm:^2.1.2, prettier@npm:^2.3.1, prettier@npm:^2.8.3": - version: 2.8.7 - resolution: "prettier@npm:2.8.7" - bin: - prettier: bin-prettier.js - checksum: fdc8f2616f099f5f0d685907f4449a70595a0fc1d081a88919604375989e0d5e9168d6121d8cc6861f21990b31665828e00472544d785d5940ea08a17660c3a6 - languageName: node - linkType: hard - -"prettier@npm:^2.8.7": - version: 2.8.8 - resolution: "prettier@npm:2.8.8" - bin: - prettier: bin-prettier.js - checksum: b49e409431bf129dd89238d64299ba80717b57ff5a6d1c1a8b1a28b590d998a34e083fa13573bc732bb8d2305becb4c9a4407f8486c81fa7d55100eb08263cf8 - languageName: node - linkType: hard - -"process-nextick-args@npm:~2.0.0": - version: 2.0.1 - resolution: "process-nextick-args@npm:2.0.1" - checksum: 1d38588e520dab7cea67cbbe2efdd86a10cc7a074c09657635e34f035277b59fbb57d09d8638346bf7090f8e8ebc070c96fa5fd183b777fff4f5edff5e9466cf - languageName: node - linkType: hard - -"promise-inflight@npm:^1.0.1": - version: 1.0.1 - resolution: "promise-inflight@npm:1.0.1" - checksum: 22749483091d2c594261517f4f80e05226d4d5ecc1fc917e1886929da56e22b5718b7f2a75f3807e7a7d471bc3be2907fe92e6e8f373ddf5c64bae35b5af3981 - languageName: node - linkType: hard - -"promise-retry@npm:^2.0.1": - version: 2.0.1 - resolution: "promise-retry@npm:2.0.1" - dependencies: - err-code: ^2.0.2 - retry: ^0.12.0 - checksum: f96a3f6d90b92b568a26f71e966cbbc0f63ab85ea6ff6c81284dc869b41510e6cdef99b6b65f9030f0db422bf7c96652a3fff9f2e8fb4a0f069d8f4430359429 - languageName: node - linkType: hard - -"promise@npm:^8.0.0": - version: 8.3.0 - resolution: "promise@npm:8.3.0" - dependencies: - asap: ~2.0.6 - checksum: a69f0ddbddf78ffc529cffee7ad950d307347615970564b17988ce43fbe767af5c738a9439660b24a9a8cbea106c0dcbb6c2b20e23b7e96a8e89e5c2679e94d5 - languageName: node - linkType: hard - -"psl@npm:^1.1.28": - version: 1.9.0 - resolution: "psl@npm:1.9.0" - checksum: 20c4277f640c93d393130673f392618e9a8044c6c7bf61c53917a0fddb4952790f5f362c6c730a9c32b124813e173733f9895add8d26f566ed0ea0654b2e711d - languageName: node - linkType: hard - -"punycode@npm:^2.1.0, punycode@npm:^2.1.1": - version: 2.3.0 - resolution: "punycode@npm:2.3.0" - checksum: 39f760e09a2a3bbfe8f5287cf733ecdad69d6af2fe6f97ca95f24b8921858b91e9ea3c9eeec6e08cede96181b3bb33f95c6ffd8c77e63986508aa2e8159fa200 - languageName: node - linkType: hard - -"q@npm:^1.5.1": - version: 1.5.1 - resolution: "q@npm:1.5.1" - checksum: 147baa93c805bc1200ed698bdf9c72e9e42c05f96d007e33a558b5fdfd63e5ea130e99313f28efc1783e90e6bdb4e48b67a36fcc026b7b09202437ae88a1fb12 - languageName: node - linkType: hard - -"qs@npm:^6.4.0": - version: 6.11.1 - resolution: "qs@npm:6.11.1" - dependencies: - side-channel: ^1.0.4 - checksum: 82ee78ef12a16f3372fae5b64f76f8aedecb000feea882bbff1af146c147f6eb66b08f9c3f34d7e076f28563586956318b9b2ca41141846cdd6d5ad6f241d52f - languageName: node - linkType: hard - -"qs@npm:^6.9.4": - version: 6.11.2 - resolution: "qs@npm:6.11.2" - dependencies: - side-channel: ^1.0.4 - checksum: e812f3c590b2262548647d62f1637b6989cc56656dc960b893fe2098d96e1bd633f36576f4cd7564dfbff9db42e17775884db96d846bebe4f37420d073ecdc0b - languageName: node - linkType: hard - -"qs@npm:~6.5.2": - version: 6.5.3 - resolution: "qs@npm:6.5.3" - checksum: 6f20bf08cabd90c458e50855559539a28d00b2f2e7dddcb66082b16a43188418cb3cb77cbd09268bcef6022935650f0534357b8af9eeb29bf0f27ccb17655692 - languageName: node - linkType: hard - -"queue-microtask@npm:^1.2.2, queue-microtask@npm:^1.2.3": - version: 1.2.3 - resolution: "queue-microtask@npm:1.2.3" - checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 - languageName: node - linkType: hard - -"quick-lru@npm:^4.0.1": - version: 4.0.1 - resolution: "quick-lru@npm:4.0.1" - checksum: bea46e1abfaa07023e047d3cf1716a06172c4947886c053ede5c50321893711577cb6119360f810cc3ffcd70c4d7db4069c3cee876b358ceff8596e062bd1154 - languageName: node - linkType: hard - -"randombytes@npm:^2.1.0": - version: 2.1.0 - resolution: "randombytes@npm:2.1.0" - dependencies: - safe-buffer: ^5.1.0 - checksum: d779499376bd4cbb435ef3ab9a957006c8682f343f14089ed5f27764e4645114196e75b7f6abf1cbd84fd247c0cb0651698444df8c9bf30e62120fbbc52269d6 - languageName: node - linkType: hard - -"raw-body@npm:^2.4.1": - version: 2.5.2 - resolution: "raw-body@npm:2.5.2" - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - checksum: ba1583c8d8a48e8fbb7a873fdbb2df66ea4ff83775421bfe21ee120140949ab048200668c47d9ae3880012f6e217052690628cf679ddfbd82c9fc9358d574676 - languageName: node - linkType: hard - -"read-pkg-up@npm:^7.0.1": - version: 7.0.1 - resolution: "read-pkg-up@npm:7.0.1" - dependencies: - find-up: ^4.1.0 - read-pkg: ^5.2.0 - type-fest: ^0.8.1 - checksum: e4e93ce70e5905b490ca8f883eb9e48b5d3cebc6cd4527c25a0d8f3ae2903bd4121c5ab9c5a3e217ada0141098eeb661313c86fa008524b089b8ed0b7f165e44 - languageName: node - linkType: hard - -"read-pkg@npm:^5.2.0": - version: 5.2.0 - resolution: "read-pkg@npm:5.2.0" - dependencies: - "@types/normalize-package-data": ^2.4.0 - normalize-package-data: ^2.5.0 - parse-json: ^5.0.0 - type-fest: ^0.6.0 - checksum: eb696e60528b29aebe10e499ba93f44991908c57d70f2d26f369e46b8b9afc208ef11b4ba64f67630f31df8b6872129e0a8933c8c53b7b4daf0eace536901222 - languageName: node - linkType: hard - -"readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": - version: 3.6.2 - resolution: "readable-stream@npm:3.6.2" - dependencies: - inherits: ^2.0.3 - string_decoder: ^1.1.1 - util-deprecate: ^1.0.1 - checksum: bdcbe6c22e846b6af075e32cf8f4751c2576238c5043169a1c221c92ee2878458a816a4ea33f4c67623c0b6827c8a400409bfb3cf0bf3381392d0b1dfb52ac8d - languageName: node - linkType: hard - -"readable-stream@npm:^2.2.2": - version: 2.3.8 - resolution: "readable-stream@npm:2.3.8" - 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 - checksum: 65645467038704f0c8aaf026a72fbb588a9e2ef7a75cd57a01702ee9db1c4a1e4b03aaad36861a6a0926546a74d174149c8c207527963e0c2d3eee2f37678a42 - languageName: node - linkType: hard - -"readdirp@npm:~3.2.0": - version: 3.2.0 - resolution: "readdirp@npm:3.2.0" - dependencies: - picomatch: ^2.0.4 - checksum: 0456a4465a13eb5eaf40f0e0836b1bc6b9ebe479b48ba6f63a738b127a1990fb7b38f3ec4b4b6052f9230f976bc0558f12812347dc6b42ce4d548cfe82a9b6f3 - languageName: node - linkType: hard - -"readdirp@npm:~3.6.0": - version: 3.6.0 - resolution: "readdirp@npm:3.6.0" - dependencies: - picomatch: ^2.2.1 - checksum: 1ced032e6e45670b6d7352d71d21ce7edf7b9b928494dcaba6f11fba63180d9da6cd7061ebc34175ffda6ff529f481818c962952004d273178acd70f7059b320 - languageName: node - linkType: hard - -"readonly-date@npm:^1.0.0": - version: 1.0.0 - resolution: "readonly-date@npm:1.0.0" - checksum: 78481e2abf3c2f9bc526029458aee3e2b1c476ca1434c4cc9db5c9aba51bf8f1323c1995d764ff01f2055b01f13e05416b2e14b387f644b0a5a56554c3ee9d0a - languageName: node - linkType: hard - -"rechoir@npm:^0.6.2": - version: 0.6.2 - resolution: "rechoir@npm:0.6.2" - dependencies: - resolve: ^1.1.6 - checksum: fe76bf9c21875ac16e235defedd7cbd34f333c02a92546142b7911a0f7c7059d2e16f441fe6fb9ae203f459c05a31b2bcf26202896d89e390eda7514d5d2702b - languageName: node - linkType: hard - -"recursive-readdir@npm:^2.2.2": - version: 2.2.3 - resolution: "recursive-readdir@npm:2.2.3" - dependencies: - minimatch: ^3.0.5 - checksum: 88ec96e276237290607edc0872b4f9842837b95cfde0cdbb1e00ba9623dfdf3514d44cdd14496ab60a0c2dd180a6ef8a3f1c34599e6cf2273afac9b72a6fb2b5 - languageName: node - linkType: hard - -"redent@npm:^3.0.0": - version: 3.0.0 - resolution: "redent@npm:3.0.0" - dependencies: - indent-string: ^4.0.0 - strip-indent: ^3.0.0 - checksum: fa1ef20404a2d399235e83cc80bd55a956642e37dd197b4b612ba7327bf87fa32745aeb4a1634b2bab25467164ab4ed9c15be2c307923dd08b0fe7c52431ae6b - languageName: node - linkType: hard - -"reduce-flatten@npm:^2.0.0": - version: 2.0.0 - resolution: "reduce-flatten@npm:2.0.0" - checksum: 64393ef99a16b20692acfd60982d7fdbd7ff8d9f8f185c6023466444c6dd2abb929d67717a83cec7f7f8fb5f46a25d515b3b2bf2238fdbfcdbfd01d2a9e73cb8 - languageName: node - linkType: hard - -"regenerator-runtime@npm:^0.14.0": - version: 0.14.0 - resolution: "regenerator-runtime@npm:0.14.0" - checksum: 1c977ad82a82a4412e4f639d65d22be376d3ebdd30da2c003eeafdaaacd03fc00c2320f18120007ee700900979284fc78a9f00da7fb593f6e6eeebc673fba9a3 - languageName: node - linkType: hard - -"regexp.prototype.flags@npm:^1.4.3": - version: 1.4.3 - resolution: "regexp.prototype.flags@npm:1.4.3" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - functions-have-names: ^1.2.2 - checksum: 51228bae732592adb3ededd5e15426be25f289e9c4ef15212f4da73f4ec3919b6140806374b8894036a86020d054a8d2657d3fee6bb9b4d35d8939c20030b7a6 - languageName: node - linkType: hard - -"req-cwd@npm:^2.0.0": - version: 2.0.0 - resolution: "req-cwd@npm:2.0.0" - dependencies: - req-from: ^2.0.0 - checksum: c44f9dea0b0f7d3a72be18a04f7769e0eefbadca363e3a346c1c02b79745126c871e1f6970357b3e731c26740aad8344bf80fb3ce055a2bcf8ca85ad2b44f519 - languageName: node - linkType: hard - -"req-from@npm:^2.0.0": - version: 2.0.0 - resolution: "req-from@npm:2.0.0" - dependencies: - resolve-from: ^3.0.0 - checksum: 4c369881a2296e23e71668ed089c5d93b37652fe900ec9f1e1f5c1da65f6bca4ee271e97ba2b806fdea50219e011995d1df3c80a7209015cc1e1fc622507f140 - languageName: node - linkType: hard - -"request-promise-core@npm:1.1.4": - version: 1.1.4 - resolution: "request-promise-core@npm:1.1.4" - dependencies: - lodash: ^4.17.19 - peerDependencies: - request: ^2.34 - checksum: c798bafd552961e36fbf5023b1d081e81c3995ab390f1bc8ef38a711ba3fe4312eb94dbd61887073d7356c3499b9380947d7f62faa805797c0dc50f039425699 - languageName: node - linkType: hard - -"request-promise-native@npm:^1.0.5": - version: 1.0.9 - resolution: "request-promise-native@npm:1.0.9" - dependencies: - request-promise-core: 1.1.4 - stealthy-require: ^1.1.1 - tough-cookie: ^2.3.3 - peerDependencies: - request: ^2.34 - checksum: 3e2c694eefac88cb20beef8911ad57a275ab3ccbae0c4ca6c679fffb09d5fd502458aab08791f0814ca914b157adab2d4e472597c97a73be702918e41725ed69 - languageName: node - linkType: hard - -"request@npm:^2.88.0": - version: 2.88.2 - resolution: "request@npm:2.88.2" - dependencies: - aws-sign2: ~0.7.0 - aws4: ^1.8.0 - caseless: ~0.12.0 - combined-stream: ~1.0.6 - extend: ~3.0.2 - forever-agent: ~0.6.1 - form-data: ~2.3.2 - har-validator: ~5.1.3 - http-signature: ~1.2.0 - is-typedarray: ~1.0.0 - isstream: ~0.1.2 - json-stringify-safe: ~5.0.1 - mime-types: ~2.1.19 - oauth-sign: ~0.9.0 - performance-now: ^2.1.0 - qs: ~6.5.2 - safe-buffer: ^5.1.2 - tough-cookie: ~2.5.0 - tunnel-agent: ^0.6.0 - uuid: ^3.3.2 - checksum: 4e112c087f6eabe7327869da2417e9d28fcd0910419edd2eb17b6acfc4bfa1dad61954525949c228705805882d8a98a86a0ea12d7f739c01ee92af7062996983 - languageName: node - linkType: hard - -"require-directory@npm:^2.1.1": - version: 2.1.1 - resolution: "require-directory@npm:2.1.1" - checksum: fb47e70bf0001fdeabdc0429d431863e9475e7e43ea5f94ad86503d918423c1543361cc5166d713eaa7029dd7a3d34775af04764bebff99ef413111a5af18c80 - languageName: node - linkType: hard - -"require-from-string@npm:^2.0.0, require-from-string@npm:^2.0.2": - version: 2.0.2 - resolution: "require-from-string@npm:2.0.2" - checksum: a03ef6895445f33a4015300c426699bc66b2b044ba7b670aa238610381b56d3f07c686251740d575e22f4c87531ba662d06937508f0f3c0f1ddc04db3130560b - languageName: node - linkType: hard - -"require-main-filename@npm:^2.0.0": - version: 2.0.0 - resolution: "require-main-filename@npm:2.0.0" - checksum: e9e294695fea08b076457e9ddff854e81bffbe248ed34c1eec348b7abbd22a0d02e8d75506559e2265e96978f3c4720bd77a6dad84755de8162b357eb6c778c7 - languageName: node - linkType: hard - -"resolve-dir@npm:^1.0.0, resolve-dir@npm:^1.0.1": - version: 1.0.1 - resolution: "resolve-dir@npm:1.0.1" - dependencies: - expand-tilde: ^2.0.0 - global-modules: ^1.0.0 - checksum: ef736b8ed60d6645c3b573da17d329bfb50ec4e1d6c5ffd6df49e3497acef9226f9810ea6823b8ece1560e01dcb13f77a9f6180d4f242d00cc9a8f4de909c65c - languageName: node - linkType: hard - -"resolve-from@npm:5.0.0, resolve-from@npm:^5.0.0": - version: 5.0.0 - resolution: "resolve-from@npm:5.0.0" - checksum: 4ceeb9113e1b1372d0cd969f3468fa042daa1dd9527b1b6bb88acb6ab55d8b9cd65dbf18819f9f9ddf0db804990901dcdaade80a215e7b2c23daae38e64f5bdf - languageName: node - linkType: hard - -"resolve-from@npm:^3.0.0": - version: 3.0.0 - resolution: "resolve-from@npm:3.0.0" - checksum: fff9819254d2d62b57f74e5c2ca9c0bdd425ca47287c4d801bc15f947533148d858229ded7793b0f59e61e49e782fffd6722048add12996e1bd4333c29669062 - languageName: node - linkType: hard - -"resolve-from@npm:^4.0.0": - version: 4.0.0 - resolution: "resolve-from@npm:4.0.0" - checksum: f4ba0b8494846a5066328ad33ef8ac173801a51739eb4d63408c847da9a2e1c1de1e6cbbf72699211f3d13f8fc1325648b169bd15eb7da35688e30a5fb0e4a7f - languageName: node - linkType: hard - -"resolve-global@npm:1.0.0, resolve-global@npm:^1.0.0": - version: 1.0.0 - resolution: "resolve-global@npm:1.0.0" - dependencies: - global-dirs: ^0.1.1 - checksum: c4e11d33e84bde7516b824503ffbe4b6cce863d5ce485680fd3db997b7c64da1df98321b1fd0703b58be8bc9bc83bc96bd83043f96194386b45eb47229efb6b6 - languageName: node - linkType: hard - -"resolve@npm:1.1.x": - version: 1.1.7 - resolution: "resolve@npm:1.1.7" - checksum: afd20873fbde7641c9125efe3f940c2a99f6b1f90f1b7b743e744bdaac1cb105b2e4e0317bcc052ed7e31d57afa86b394a4dc9a1b33a297977be134fdf0250ab - languageName: node - linkType: hard - -"resolve@npm:1.17.0": - version: 1.17.0 - resolution: "resolve@npm:1.17.0" - dependencies: - path-parse: ^1.0.6 - checksum: 9ceaf83b3429f2d7ff5d0281b8d8f18a1f05b6ca86efea7633e76b8f76547f33800799dfdd24434942dec4fbd9e651ed3aef577d9a6b5ec87ad89c1060e24759 - languageName: node - linkType: hard - -"resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.8.1": - version: 1.22.1 - resolution: "resolve@npm:1.22.1" - dependencies: - is-core-module: ^2.9.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 - bin: - resolve: bin/resolve - checksum: 07af5fc1e81aa1d866cbc9e9460fbb67318a10fa3c4deadc35c3ad8a898ee9a71a86a65e4755ac3195e0ea0cfbe201eb323ebe655ce90526fd61917313a34e4e - languageName: node - linkType: hard - -"resolve@patch:resolve@1.1.x#~builtin": - version: 1.1.7 - resolution: "resolve@patch:resolve@npm%3A1.1.7#~builtin::version=1.1.7&hash=07638b" - checksum: e9dbca78600ae56835c43a09f1276876c883e4b4bbd43e2683fa140671519d2bdebeb1c1576ca87c8c508ae2987b3ec481645ac5d3054b0f23254cfc1ce49942 - languageName: node - linkType: hard - -"resolve@patch:resolve@1.17.0#~builtin": - version: 1.17.0 - resolution: "resolve@patch:resolve@npm%3A1.17.0#~builtin::version=1.17.0&hash=07638b" - dependencies: - path-parse: ^1.0.6 - checksum: 6fd799f282ddf078c4bc20ce863e3af01fa8cb218f0658d9162c57161a2dbafe092b13015b9a4c58d0e1e801cf7aa7a4f13115fea9db98c3f9a0c43e429bad6f - languageName: node - linkType: hard - -"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.8.1#~builtin": - version: 1.22.1 - resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=07638b" - dependencies: - is-core-module: ^2.9.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 - bin: - resolve: bin/resolve - checksum: 5656f4d0bedcf8eb52685c1abdf8fbe73a1603bb1160a24d716e27a57f6cecbe2432ff9c89c2bd57542c3a7b9d14b1882b73bfe2e9d7849c9a4c0b8b39f02b8b - languageName: node - linkType: hard - -"restore-cursor@npm:^3.1.0": - version: 3.1.0 - resolution: "restore-cursor@npm:3.1.0" - dependencies: - onetime: ^5.1.0 - signal-exit: ^3.0.2 - checksum: f877dd8741796b909f2a82454ec111afb84eb45890eb49ac947d87991379406b3b83ff9673a46012fca0d7844bb989f45cc5b788254cf1a39b6b5a9659de0630 - languageName: node - linkType: hard - -"retry@npm:^0.12.0": - version: 0.12.0 - resolution: "retry@npm:0.12.0" - checksum: 623bd7d2e5119467ba66202d733ec3c2e2e26568074923bc0585b6b99db14f357e79bdedb63cab56cec47491c4a0da7e6021a7465ca6dc4f481d3898fdd3158c - languageName: node - linkType: hard - -"reusify@npm:^1.0.4": - version: 1.0.4 - resolution: "reusify@npm:1.0.4" - checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc - languageName: node - linkType: hard - -"rfdc@npm:^1.3.0": - version: 1.3.0 - resolution: "rfdc@npm:1.3.0" - checksum: fb2ba8512e43519983b4c61bd3fa77c0f410eff6bae68b08614437bc3f35f91362215f7b4a73cbda6f67330b5746ce07db5dd9850ad3edc91271ad6deea0df32 - languageName: node - linkType: hard - -"rimraf@npm:^2.2.8": - version: 2.7.1 - resolution: "rimraf@npm:2.7.1" - dependencies: - glob: ^7.1.3 - bin: - rimraf: ./bin.js - checksum: cdc7f6eacb17927f2a075117a823e1c5951792c6498ebcce81ca8203454a811d4cf8900314154d3259bb8f0b42ab17f67396a8694a54cae3283326e57ad250cd - languageName: node - linkType: hard - -"rimraf@npm:^3.0.2": - version: 3.0.2 - resolution: "rimraf@npm:3.0.2" - dependencies: - glob: ^7.1.3 - bin: - rimraf: bin.js - checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 - languageName: node - linkType: hard - -"ripemd160@npm:^2.0.0, ripemd160@npm:^2.0.1": - version: 2.0.2 - resolution: "ripemd160@npm:2.0.2" - dependencies: - hash-base: ^3.0.0 - inherits: ^2.0.1 - checksum: 006accc40578ee2beae382757c4ce2908a826b27e2b079efdcd2959ee544ddf210b7b5d7d5e80467807604244e7388427330f5c6d4cd61e6edaddc5773ccc393 - languageName: node - linkType: hard - -"rlp@npm:^2.2.3, rlp@npm:^2.2.4": - version: 2.2.7 - resolution: "rlp@npm:2.2.7" - dependencies: - bn.js: ^5.2.0 - bin: - rlp: bin/rlp - checksum: 3db4dfe5c793f40ac7e0be689a1f75d05e6f2ca0c66189aeb62adab8c436b857ab4420a419251ee60370d41d957a55698fc5e23ab1e1b41715f33217bc4bb558 - languageName: node - linkType: hard - -"rpc-websockets@npm:^7.5.1": - version: 7.6.2 - resolution: "rpc-websockets@npm:7.6.2" - dependencies: - "@babel/runtime": ^7.17.2 - bufferutil: ^4.0.1 - eventemitter3: ^4.0.7 - utf-8-validate: ^5.0.2 - uuid: ^8.3.2 - ws: ^8.5.0 - dependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: fa82613df99fd0a19a02f87c002808bc39fc0c040a17decf9ea6710bd22e21db507ac98edc335739ca0636cdf84459eaed69576e2c0c08fc12c65233c981318f - languageName: node - linkType: hard - -"run-async@npm:^2.4.0": - version: 2.4.1 - resolution: "run-async@npm:2.4.1" - checksum: a2c88aa15df176f091a2878eb840e68d0bdee319d8d97bbb89112223259cebecb94bc0defd735662b83c2f7a30bed8cddb7d1674eb48ae7322dc602b22d03797 - languageName: node - linkType: hard - -"run-parallel-limit@npm:^1.1.0": - version: 1.1.0 - resolution: "run-parallel-limit@npm:1.1.0" - dependencies: - queue-microtask: ^1.2.2 - checksum: 672c3b87e7f939c684b9965222b361421db0930223ed1e43ebf0e7e48ccc1a022ea4de080bef4d5468434e2577c33b7681e3f03b7593fdc49ad250a55381123c - languageName: node - linkType: hard - -"run-parallel@npm:^1.1.9": - version: 1.2.0 - resolution: "run-parallel@npm:1.2.0" - dependencies: - queue-microtask: ^1.2.2 - checksum: cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d - languageName: node - linkType: hard - -"rustbn.js@npm:~0.2.0": - version: 0.2.0 - resolution: "rustbn.js@npm:0.2.0" - checksum: 2148e7ba34e70682907ee29df4784639e6eb025481b2c91249403b7ec57181980161868d9aa24822a5075dd1bb5a180dfedc77309e5f0d27b6301f9b563af99a - languageName: node - linkType: hard - -"rxjs@npm:^7.5.5, rxjs@npm:^7.8.0": - version: 7.8.0 - resolution: "rxjs@npm:7.8.0" - dependencies: - tslib: ^2.1.0 - checksum: 61b4d4fd323c1043d8d6ceb91f24183b28bcf5def4f01ca111511d5c6b66755bc5578587fe714ef5d67cf4c9f2e26f4490d4e1d8cabf9bd5967687835e9866a2 - languageName: node - linkType: hard - -"safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.0, safe-buffer@npm:~5.2.0": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 - languageName: node - linkType: hard - -"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": - version: 5.1.2 - resolution: "safe-buffer@npm:5.1.2" - checksum: f2f1f7943ca44a594893a852894055cf619c1fbcb611237fc39e461ae751187e7baf4dc391a72125e0ac4fb2d8c5c0b3c71529622e6a58f46b960211e704903c - languageName: node - linkType: hard - -"safe-regex-test@npm:^1.0.0": - version: 1.0.0 - resolution: "safe-regex-test@npm:1.0.0" - dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.1.3 - is-regex: ^1.1.4 - checksum: bc566d8beb8b43c01b94e67de3f070fd2781685e835959bbbaaec91cc53381145ca91f69bd837ce6ec244817afa0a5e974fc4e40a2957f0aca68ac3add1ddd34 - languageName: node - linkType: hard - -"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0, safer-buffer@npm:^2.0.2, safer-buffer@npm:^2.1.0, safer-buffer@npm:~2.1.0": - version: 2.1.2 - resolution: "safer-buffer@npm:2.1.2" - checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 - languageName: node - linkType: hard - -"sc-istanbul@npm:^0.4.5": - version: 0.4.6 - resolution: "sc-istanbul@npm:0.4.6" - dependencies: - abbrev: 1.0.x - async: 1.x - escodegen: 1.8.x - esprima: 2.7.x - glob: ^5.0.15 - handlebars: ^4.0.1 - js-yaml: 3.x - mkdirp: 0.5.x - nopt: 3.x - once: 1.x - resolve: 1.1.x - supports-color: ^3.1.0 - which: ^1.1.1 - wordwrap: ^1.0.0 - bin: - istanbul: lib/cli.js - checksum: 256472ebd35787985be7fc924f817f3e0fcf0ed17655250555bf24f76d44af18fd1b25a91c33458e17a4c57b80375bea22d46e2a982880ffbde1b1a94dfeed19 - languageName: node - linkType: hard - -"scrypt-js@npm:2.0.4": - version: 2.0.4 - resolution: "scrypt-js@npm:2.0.4" - checksum: 679e8940953ebbef40863bfcc58f1d3058d4b7af0ca9bd8062d8213c30e14db59c6ebfc82a85fbd3b90b6d46b708be4c53b9c4bb200b6f50767dc08a846315a9 - languageName: node - linkType: hard - -"scrypt-js@npm:3.0.1, scrypt-js@npm:^3.0.0": - version: 3.0.1 - resolution: "scrypt-js@npm:3.0.1" - checksum: b7c7d1a68d6ca946f2fbb0778e0c4ec63c65501b54023b2af7d7e9f48fdb6c6580d6f7675cd53bda5944c5ebc057560d5a6365079752546865defb3b79dea454 - languageName: node - linkType: hard - -"secp256k1@npm:^4.0.1": - version: 4.0.3 - resolution: "secp256k1@npm:4.0.3" - dependencies: - elliptic: ^6.5.4 - node-addon-api: ^2.0.0 - node-gyp: latest - node-gyp-build: ^4.2.0 - checksum: 21e219adc0024fbd75021001358780a3cc6ac21273c3fcaef46943af73969729709b03f1df7c012a0baab0830fb9a06ccc6b42f8d50050c665cb98078eab477b - languageName: node - linkType: hard - -"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.5.0, semver@npm:^5.7.0": - version: 5.7.1 - resolution: "semver@npm:5.7.1" - bin: - semver: ./bin/semver - checksum: 57fd0acfd0bac382ee87cd52cd0aaa5af086a7dc8d60379dfe65fea491fb2489b6016400813930ecd61fd0952dae75c115287a1b16c234b1550887117744dfaf - languageName: node - linkType: hard - -"semver@npm:7.3.8, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7": - version: 7.3.8 - resolution: "semver@npm:7.3.8" - dependencies: - lru-cache: ^6.0.0 - bin: - semver: bin/semver.js - checksum: ba9c7cbbf2b7884696523450a61fee1a09930d888b7a8d7579025ad93d459b2d1949ee5bbfeb188b2be5f4ac163544c5e98491ad6152df34154feebc2cc337c1 - languageName: node - linkType: hard - -"semver@npm:^6.3.0": - version: 6.3.0 - resolution: "semver@npm:6.3.0" - bin: - semver: ./bin/semver.js - checksum: 1b26ecf6db9e8292dd90df4e781d91875c0dcc1b1909e70f5d12959a23c7eebb8f01ea581c00783bbee72ceeaad9505797c381756326073850dc36ed284b21b9 - languageName: node - linkType: hard - -"semver@npm:^7.3.8": - version: 7.5.0 - resolution: "semver@npm:7.5.0" - dependencies: - lru-cache: ^6.0.0 - bin: - semver: bin/semver.js - checksum: 2d266937756689a76f124ffb4c1ea3e1bbb2b263219f90ada8a11aebebe1280b13bb76cca2ca96bdee3dbc554cbc0b24752eb895b2a51577aa644427e9229f2b - languageName: node - linkType: hard - -"serialize-javascript@npm:6.0.0": - version: 6.0.0 - resolution: "serialize-javascript@npm:6.0.0" - dependencies: - randombytes: ^2.1.0 - checksum: 56f90b562a1bdc92e55afb3e657c6397c01a902c588c0fe3d4c490efdcc97dcd2a3074ba12df9e94630f33a5ce5b76a74784a7041294628a6f4306e0ec84bf93 - languageName: node - linkType: hard - -"set-blocking@npm:^2.0.0": - version: 2.0.0 - resolution: "set-blocking@npm:2.0.0" - checksum: 6e65a05f7cf7ebdf8b7c75b101e18c0b7e3dff4940d480efed8aad3a36a4005140b660fa1d804cb8bce911cac290441dc728084a30504d3516ac2ff7ad607b02 - languageName: node - linkType: hard - -"setimmediate@npm:1.0.4": - version: 1.0.4 - resolution: "setimmediate@npm:1.0.4" - checksum: 1d3726183ade73fa1c83bd562b05ae34e97802229d5b9292cde7ed03846524f04eb0fdd2131cc159103e3a7afb7c4e958b35bf960e3c4846fa50d94a3278be6f - languageName: node - linkType: hard - -"setimmediate@npm:^1.0.5": - version: 1.0.5 - resolution: "setimmediate@npm:1.0.5" - checksum: c9a6f2c5b51a2dabdc0247db9c46460152ffc62ee139f3157440bd48e7c59425093f42719ac1d7931f054f153e2d26cf37dfeb8da17a794a58198a2705e527fd - languageName: node - linkType: hard - -"setprototypeof@npm:1.2.0": - version: 1.2.0 - resolution: "setprototypeof@npm:1.2.0" - checksum: be18cbbf70e7d8097c97f713a2e76edf84e87299b40d085c6bf8b65314e994cc15e2e317727342fa6996e38e1f52c59720b53fe621e2eb593a6847bf0356db89 - languageName: node - linkType: hard - -"sha.js@npm:^2.4.0, sha.js@npm:^2.4.8": - version: 2.4.11 - resolution: "sha.js@npm:2.4.11" - dependencies: - inherits: ^2.0.1 - safe-buffer: ^5.0.1 - bin: - sha.js: ./bin.js - checksum: ebd3f59d4b799000699097dadb831c8e3da3eb579144fd7eb7a19484cbcbb7aca3c68ba2bb362242eb09e33217de3b4ea56e4678184c334323eca24a58e3ad07 - languageName: node - linkType: hard - -"sha1@npm:^1.1.1": - version: 1.1.1 - resolution: "sha1@npm:1.1.1" - dependencies: - charenc: ">= 0.0.1" - crypt: ">= 0.0.1" - checksum: da9f47e949988e2f595ef19733fd1dc736866ef6de4e421a55c13b444c03ae532e528b7350ae6ea55d9fb053be61d4648ec2cd5250d46cfdbdf4f6b4e763713d - languageName: node - linkType: hard - -"shebang-command@npm:^2.0.0": - version: 2.0.0 - resolution: "shebang-command@npm:2.0.0" - dependencies: - shebang-regex: ^3.0.0 - checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa - languageName: node - linkType: hard - -"shebang-regex@npm:^3.0.0": - version: 3.0.0 - resolution: "shebang-regex@npm:3.0.0" - checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 - languageName: node - linkType: hard - -"shelljs@npm:^0.8.3, shelljs@npm:^0.8.5": - version: 0.8.5 - resolution: "shelljs@npm:0.8.5" - dependencies: - glob: ^7.0.0 - interpret: ^1.0.0 - rechoir: ^0.6.2 - bin: - shjs: bin/shjs - checksum: 7babc46f732a98f4c054ec1f048b55b9149b98aa2da32f6cf9844c434b43c6251efebd6eec120937bd0999e13811ebd45efe17410edb3ca938f82f9381302748 - languageName: node - linkType: hard - -"shx@npm:^0.3.4": - version: 0.3.4 - resolution: "shx@npm:0.3.4" - dependencies: - minimist: ^1.2.3 - shelljs: ^0.8.5 - bin: - shx: lib/cli.js - checksum: 0aa168bfddc11e3fe8943cce2e0d2d8514a560bd58cf2b835b4351ba03f46068f7d88286c2627f4b85604e81952154c43746369fb3f0d60df0e3b511f465e5b8 - languageName: node - linkType: hard - -"side-channel@npm:^1.0.4": - version: 1.0.4 - resolution: "side-channel@npm:1.0.4" - dependencies: - call-bind: ^1.0.0 - get-intrinsic: ^1.0.2 - object-inspect: ^1.9.0 - checksum: 351e41b947079c10bd0858364f32bb3a7379514c399edb64ab3dce683933483fc63fb5e4efe0a15a2e8a7e3c436b6a91736ddb8d8c6591b0460a24bb4a1ee245 - languageName: node - linkType: hard - -"signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": - version: 3.0.7 - resolution: "signal-exit@npm:3.0.7" - checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 - languageName: node - linkType: hard - -"slash@npm:^3.0.0": - version: 3.0.0 - resolution: "slash@npm:3.0.0" - checksum: 94a93fff615f25a999ad4b83c9d5e257a7280c90a32a7cb8b4a87996e4babf322e469c42b7f649fd5796edd8687652f3fb452a86dc97a816f01113183393f11c - languageName: node - linkType: hard - -"slice-ansi@npm:^3.0.0": - version: 3.0.0 - resolution: "slice-ansi@npm:3.0.0" - dependencies: - ansi-styles: ^4.0.0 - astral-regex: ^2.0.0 - is-fullwidth-code-point: ^3.0.0 - checksum: 5ec6d022d12e016347e9e3e98a7eb2a592213a43a65f1b61b74d2c78288da0aded781f665807a9f3876b9daa9ad94f64f77d7633a0458876c3a4fdc4eb223f24 - languageName: node - linkType: hard - -"slice-ansi@npm:^4.0.0": - version: 4.0.0 - resolution: "slice-ansi@npm:4.0.0" - dependencies: - ansi-styles: ^4.0.0 - astral-regex: ^2.0.0 - is-fullwidth-code-point: ^3.0.0 - checksum: 4a82d7f085b0e1b070e004941ada3c40d3818563ac44766cca4ceadd2080427d337554f9f99a13aaeb3b4a94d9964d9466c807b3d7b7541d1ec37ee32d308756 - languageName: node - linkType: hard - -"slice-ansi@npm:^5.0.0": - version: 5.0.0 - resolution: "slice-ansi@npm:5.0.0" - dependencies: - ansi-styles: ^6.0.0 - is-fullwidth-code-point: ^4.0.0 - checksum: 7e600a2a55e333a21ef5214b987c8358fe28bfb03c2867ff2cbf919d62143d1812ac27b4297a077fdaf27a03da3678e49551c93e35f9498a3d90221908a1180e - languageName: node - linkType: hard - -"smart-buffer@npm:^4.2.0": - version: 4.2.0 - resolution: "smart-buffer@npm:4.2.0" - checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b - languageName: node - linkType: hard - -"socks-proxy-agent@npm:^7.0.0": - version: 7.0.0 - resolution: "socks-proxy-agent@npm:7.0.0" - dependencies: - agent-base: ^6.0.2 - debug: ^4.3.3 - socks: ^2.6.2 - checksum: 720554370154cbc979e2e9ce6a6ec6ced205d02757d8f5d93fe95adae454fc187a5cbfc6b022afab850a5ce9b4c7d73e0f98e381879cf45f66317a4895953846 - languageName: node - linkType: hard - -"socks@npm:^2.6.2": - version: 2.7.1 - resolution: "socks@npm:2.7.1" - dependencies: - ip: ^2.0.0 - smart-buffer: ^4.2.0 - checksum: 259d9e3e8e1c9809a7f5c32238c3d4d2a36b39b83851d0f573bfde5f21c4b1288417ce1af06af1452569cd1eb0841169afd4998f0e04ba04656f6b7f0e46d748 - languageName: node - linkType: hard - -"solc@npm:0.7.3": - version: 0.7.3 - resolution: "solc@npm:0.7.3" - dependencies: - command-exists: ^1.2.8 - commander: 3.0.2 - follow-redirects: ^1.12.1 - fs-extra: ^0.30.0 - js-sha3: 0.8.0 - memorystream: ^0.3.1 - require-from-string: ^2.0.0 - semver: ^5.5.0 - tmp: 0.0.33 - bin: - solcjs: solcjs - checksum: 2d8eb16c6d8f648213c94dc8d977cffe5099cba7d41c82d92d769ef71ae8320a985065ce3d6c306440a85f8e8d2b27fb30bdd3ac38f69e5c1fa0ab8a3fb2f217 - languageName: node - linkType: hard - -"solhint-plugin-prettier@npm:^0.0.5": - version: 0.0.5 - resolution: "solhint-plugin-prettier@npm:0.0.5" - dependencies: - prettier-linter-helpers: ^1.0.0 - peerDependencies: - prettier: ^1.15.0 || ^2.0.0 - prettier-plugin-solidity: ^1.0.0-alpha.14 - checksum: ca721e327daf49a4d9ef0ee5c9622482a8c5563d600eedfd3856c69ce67e416dd77da5166a033e2e641c9cdd7a0f2cbc7913b0eb1712081b3c7e8c633eef82a5 - languageName: node - linkType: hard - -"solhint@npm:^3.3.7": - version: 3.4.1 - resolution: "solhint@npm:3.4.1" - dependencies: - "@solidity-parser/parser": ^0.16.0 - ajv: ^6.12.6 - antlr4: ^4.11.0 - ast-parents: ^0.0.1 - chalk: ^4.1.2 - commander: ^10.0.0 - cosmiconfig: ^8.0.0 - fast-diff: ^1.2.0 - glob: ^8.0.3 - ignore: ^5.2.4 - js-yaml: ^4.1.0 - lodash: ^4.17.21 - pluralize: ^8.0.0 - prettier: ^2.8.3 - semver: ^6.3.0 - strip-ansi: ^6.0.1 - table: ^6.8.1 - text-table: ^0.2.0 - dependenciesMeta: - prettier: - optional: true - bin: - solhint: solhint.js - checksum: 4f81b5bac126c6b07ac36be887c0b120263b5628671d8433c5a20ed9f8168ec6224a706456f1b625c0b9e15143427d229eff497dfea94eca398b63b727c8f7bc - languageName: node - linkType: hard - -"solidity-comments-extractor@npm:^0.0.7": - version: 0.0.7 - resolution: "solidity-comments-extractor@npm:0.0.7" - checksum: a5cedf2310709969bc1783a6c336171478536f2f0ea96ad88437e0ef1e8844c0b37dd75591b0a824ec9c30640ea7e31b5f03128e871e6235bef3426617ce96c4 - languageName: node - linkType: hard - -"solidity-coverage@npm:^0.8.2": - version: 0.8.2 - resolution: "solidity-coverage@npm:0.8.2" - dependencies: - "@ethersproject/abi": ^5.0.9 - "@solidity-parser/parser": ^0.14.1 - chalk: ^2.4.2 - death: ^1.1.0 - detect-port: ^1.3.0 - difflib: ^0.2.4 - fs-extra: ^8.1.0 - ghost-testrpc: ^0.0.2 - global-modules: ^2.0.0 - globby: ^10.0.1 - jsonschema: ^1.2.4 - lodash: ^4.17.15 - mocha: 7.1.2 - node-emoji: ^1.10.0 - pify: ^4.0.1 - recursive-readdir: ^2.2.2 - sc-istanbul: ^0.4.5 - semver: ^7.3.4 - shelljs: ^0.8.3 - web3-utils: ^1.3.6 - peerDependencies: - hardhat: ^2.11.0 - bin: - solidity-coverage: plugins/bin.js - checksum: 489f73d56a1279f2394b7a14db315532884895baa00a4016e68a4e5be0eddca90a95cb3322e6a0b15e67f2d9003b9413ee24c1c61d78f558f5a2e1e233840825 - languageName: node - linkType: hard - -"solidity-rlp@npm:^2.0.8": - version: 2.0.8 - resolution: "solidity-rlp@npm:2.0.8" - checksum: e182087ffa1ee61447a04cae1b2ac3d814a65f52c1e6c81084ed181216f63fdc44df5197b5a35a627809db392fddd65f6e8dde4b8e49decdfc6fdfc7ed7ba3e8 - languageName: node - linkType: hard - -"source-map-support@npm:^0.5.13, source-map-support@npm:^0.5.16": - version: 0.5.21 - resolution: "source-map-support@npm:0.5.21" - dependencies: - buffer-from: ^1.0.0 - source-map: ^0.6.0 - checksum: 43e98d700d79af1d36f859bdb7318e601dfc918c7ba2e98456118ebc4c4872b327773e5a1df09b0524e9e5063bb18f0934538eace60cca2710d1fa687645d137 - languageName: node - linkType: hard - -"source-map@npm:^0.5.0": - version: 0.5.7 - resolution: "source-map@npm:0.5.7" - checksum: 5dc2043b93d2f194142c7f38f74a24670cd7a0063acdaf4bf01d2964b402257ae843c2a8fa822ad5b71013b5fcafa55af7421383da919752f22ff488bc553f4d - languageName: node - linkType: hard - -"source-map@npm:^0.6.0, source-map@npm:^0.6.1": - version: 0.6.1 - resolution: "source-map@npm:0.6.1" - checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 - languageName: node - linkType: hard - -"source-map@npm:~0.2.0": - version: 0.2.0 - resolution: "source-map@npm:0.2.0" - dependencies: - amdefine: ">=0.0.4" - checksum: 95fe800c3a93f8c0b9516c033bfc75f2678e27d2e6c0b23ae222f5ddc4afa0a39bd0be15d1c0a1e766d388f3761cc854a053a4330f49242e6045e1a4f9dc0e26 - languageName: node - linkType: hard - -"spdx-correct@npm:^3.0.0": - version: 3.2.0 - resolution: "spdx-correct@npm:3.2.0" - dependencies: - spdx-expression-parse: ^3.0.0 - spdx-license-ids: ^3.0.0 - checksum: e9ae98d22f69c88e7aff5b8778dc01c361ef635580e82d29e5c60a6533cc8f4d820803e67d7432581af0cc4fb49973125076ee3b90df191d153e223c004193b2 - languageName: node - linkType: hard - -"spdx-exceptions@npm:^2.1.0": - version: 2.3.0 - resolution: "spdx-exceptions@npm:2.3.0" - checksum: cb69a26fa3b46305637123cd37c85f75610e8c477b6476fa7354eb67c08128d159f1d36715f19be6f9daf4b680337deb8c65acdcae7f2608ba51931540687ac0 - languageName: node - linkType: hard - -"spdx-expression-parse@npm:^3.0.0": - version: 3.0.1 - resolution: "spdx-expression-parse@npm:3.0.1" - dependencies: - spdx-exceptions: ^2.1.0 - spdx-license-ids: ^3.0.0 - checksum: a1c6e104a2cbada7a593eaa9f430bd5e148ef5290d4c0409899855ce8b1c39652bcc88a725259491a82601159d6dc790bedefc9016c7472f7de8de7361f8ccde - languageName: node - linkType: hard - -"spdx-license-ids@npm:^3.0.0": - version: 3.0.13 - resolution: "spdx-license-ids@npm:3.0.13" - checksum: 3469d85c65f3245a279fa11afc250c3dca96e9e847f2f79d57f466940c5bb8495da08a542646086d499b7f24a74b8d0b42f3fc0f95d50ff99af1f599f6360ad7 - languageName: node - linkType: hard - -"split2@npm:^3.0.0": - version: 3.2.2 - resolution: "split2@npm:3.2.2" - dependencies: - readable-stream: ^3.0.0 - checksum: 8127ddbedd0faf31f232c0e9192fede469913aa8982aa380752e0463b2e31c2359ef6962eb2d24c125bac59eeec76873678d723b1c7ff696216a1cd071e3994a - languageName: node - linkType: hard - -"sprintf-js@npm:~1.0.2": - version: 1.0.3 - resolution: "sprintf-js@npm:1.0.3" - checksum: 19d79aec211f09b99ec3099b5b2ae2f6e9cdefe50bc91ac4c69144b6d3928a640bb6ae5b3def70c2e85a2c3d9f5ec2719921e3a59d3ca3ef4b2fd1a4656a0df3 - languageName: node - linkType: hard - -"sshpk@npm:^1.7.0": - version: 1.17.0 - resolution: "sshpk@npm:1.17.0" - dependencies: - asn1: ~0.2.3 - assert-plus: ^1.0.0 - bcrypt-pbkdf: ^1.0.0 - dashdash: ^1.12.0 - ecc-jsbn: ~0.1.1 - getpass: ^0.1.1 - jsbn: ~0.1.0 - safer-buffer: ^2.0.2 - tweetnacl: ~0.14.0 - bin: - sshpk-conv: bin/sshpk-conv - sshpk-sign: bin/sshpk-sign - sshpk-verify: bin/sshpk-verify - checksum: ba109f65c8e6c35133b8e6ed5576abeff8aa8d614824b7275ec3ca308f081fef483607c28d97780c1e235818b0f93ed8c8b56d0a5968d5a23fd6af57718c7597 - languageName: node - linkType: hard - -"ssri@npm:^9.0.0": - version: 9.0.1 - resolution: "ssri@npm:9.0.1" - dependencies: - minipass: ^3.1.1 - checksum: fb58f5e46b6923ae67b87ad5ef1c5ab6d427a17db0bead84570c2df3cd50b4ceb880ebdba2d60726588272890bae842a744e1ecce5bd2a2a582fccd5068309eb - languageName: node - linkType: hard - -"stacktrace-parser@npm:^0.1.10": - version: 0.1.10 - resolution: "stacktrace-parser@npm:0.1.10" - dependencies: - type-fest: ^0.7.1 - checksum: f4fbddfc09121d91e587b60de4beb4941108e967d71ad3a171812dc839b010ca374d064ad0a296295fed13acd103609d99a4224a25b4e67de13cae131f1901ee - languageName: node - linkType: hard - -"statuses@npm:2.0.1": - version: 2.0.1 - resolution: "statuses@npm:2.0.1" - checksum: 18c7623fdb8f646fb213ca4051be4df7efb3484d4ab662937ca6fbef7ced9b9e12842709872eb3020cc3504b93bde88935c9f6417489627a7786f24f8031cbcb - languageName: node - linkType: hard - -"stealthy-require@npm:^1.1.1": - version: 1.1.1 - resolution: "stealthy-require@npm:1.1.1" - checksum: 6805b857a9f3a6a1079fc6652278038b81011f2a5b22cbd559f71a6c02087e6f1df941eb10163e3fdc5391ab5807aa46758d4258547c1f5ede31e6d9bfda8dd3 - languageName: node - linkType: hard - -"streamsearch@npm:^1.1.0": - version: 1.1.0 - resolution: "streamsearch@npm:1.1.0" - checksum: 1cce16cea8405d7a233d32ca5e00a00169cc0e19fbc02aa839959985f267335d435c07f96e5e0edd0eadc6d39c98d5435fb5bbbdefc62c41834eadc5622ad942 - languageName: node - linkType: hard - -"string-argv@npm:^0.3.1": - version: 0.3.1 - resolution: "string-argv@npm:0.3.1" - checksum: efbd0289b599bee808ce80820dfe49c9635610715429c6b7cc50750f0437e3c2f697c81e5c390208c13b5d5d12d904a1546172a88579f6ee5cbaaaa4dc9ec5cf - languageName: node - linkType: hard - -"string-format@npm:^2.0.0": - version: 2.0.0 - resolution: "string-format@npm:2.0.0" - checksum: dada2ef95f6d36c66562c673d95315f80457fa7dce2f3609a2e75d1190b98c88319028cf0a5b6c043d01c18d581b2641579f79480584ba030d6ac6fceb30bc55 - languageName: node - linkType: hard - -"string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": - version: 4.2.3 - resolution: "string-width@npm:4.2.3" - dependencies: - emoji-regex: ^8.0.0 - is-fullwidth-code-point: ^3.0.0 - strip-ansi: ^6.0.1 - checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb - languageName: node - linkType: hard - -"string-width@npm:^1.0.2 || 2, string-width@npm:^2.1.1": - version: 2.1.1 - resolution: "string-width@npm:2.1.1" - dependencies: - is-fullwidth-code-point: ^2.0.0 - strip-ansi: ^4.0.0 - checksum: d6173abe088c615c8dffaf3861dc5d5906ed3dc2d6fd67ff2bd2e2b5dce7fd683c5240699cf0b1b8aa679a3b3bd6b28b5053c824cb89b813d7f6541d8f89064a - languageName: node - linkType: hard - -"string-width@npm:^3.0.0, string-width@npm:^3.1.0": - version: 3.1.0 - resolution: "string-width@npm:3.1.0" - dependencies: - emoji-regex: ^7.0.1 - is-fullwidth-code-point: ^2.0.0 - strip-ansi: ^5.1.0 - checksum: 57f7ca73d201682816d573dc68bd4bb8e1dff8dc9fcf10470fdfc3474135c97175fec12ea6a159e67339b41e86963112355b64529489af6e7e70f94a7caf08b2 - languageName: node - linkType: hard - -"string-width@npm:^5.0.0": - version: 5.1.2 - resolution: "string-width@npm:5.1.2" - dependencies: - eastasianwidth: ^0.2.0 - emoji-regex: ^9.2.2 - strip-ansi: ^7.0.1 - checksum: 7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 - languageName: node - linkType: hard - -"string.prototype.trim@npm:^1.2.7": - version: 1.2.7 - resolution: "string.prototype.trim@npm:1.2.7" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - checksum: 05b7b2d6af63648e70e44c4a8d10d8cc457536df78b55b9d6230918bde75c5987f6b8604438c4c8652eb55e4fc9725d2912789eb4ec457d6995f3495af190c09 - languageName: node - linkType: hard - -"string.prototype.trimend@npm:^1.0.6": - version: 1.0.6 - resolution: "string.prototype.trimend@npm:1.0.6" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - checksum: 0fdc34645a639bd35179b5a08227a353b88dc089adf438f46be8a7c197fc3f22f8514c1c9be4629b3cd29c281582730a8cbbad6466c60f76b5f99cf2addb132e - languageName: node - linkType: hard - -"string.prototype.trimstart@npm:^1.0.6": - version: 1.0.6 - resolution: "string.prototype.trimstart@npm:1.0.6" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - checksum: 89080feef416621e6ef1279588994305477a7a91648d9436490d56010a1f7adc39167cddac7ce0b9884b8cdbef086987c4dcb2960209f2af8bac0d23ceff4f41 - languageName: node - linkType: hard - -"string_decoder@npm:^1.1.1": - version: 1.3.0 - resolution: "string_decoder@npm:1.3.0" - dependencies: - safe-buffer: ~5.2.0 - checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 - languageName: node - linkType: hard - -"string_decoder@npm:~1.1.1": - version: 1.1.1 - resolution: "string_decoder@npm:1.1.1" - dependencies: - safe-buffer: ~5.1.0 - checksum: 9ab7e56f9d60a28f2be697419917c50cac19f3e8e6c28ef26ed5f4852289fe0de5d6997d29becf59028556f2c62983790c1d9ba1e2a3cc401768ca12d5183a5b - languageName: node - linkType: hard - -"strip-ansi@npm:^4.0.0": - version: 4.0.0 - resolution: "strip-ansi@npm:4.0.0" - dependencies: - ansi-regex: ^3.0.0 - checksum: d9186e6c0cf78f25274f6750ee5e4a5725fb91b70fdd79aa5fe648eab092a0ec5b9621b22d69d4534a56319f75d8944efbd84e3afa8d4ad1b9a9491f12c84eca - languageName: node - linkType: hard - -"strip-ansi@npm:^5.0.0, strip-ansi@npm:^5.1.0, strip-ansi@npm:^5.2.0": - version: 5.2.0 - resolution: "strip-ansi@npm:5.2.0" - dependencies: - ansi-regex: ^4.1.0 - checksum: bdb5f76ade97062bd88e7723aa019adbfacdcba42223b19ccb528ffb9fb0b89a5be442c663c4a3fb25268eaa3f6ea19c7c3fbae830bd1562d55adccae1fcec46 - languageName: node - linkType: hard - -"strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": - version: 6.0.1 - resolution: "strip-ansi@npm:6.0.1" - dependencies: - ansi-regex: ^5.0.1 - checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c - languageName: node - linkType: hard - -"strip-ansi@npm:^7.0.1": - version: 7.0.1 - resolution: "strip-ansi@npm:7.0.1" - dependencies: - ansi-regex: ^6.0.1 - checksum: 257f78fa433520e7f9897722731d78599cb3fce29ff26a20a5e12ba4957463b50a01136f37c43707f4951817a75e90820174853d6ccc240997adc5df8f966039 - languageName: node - linkType: hard - -"strip-bom@npm:4.0.0": - version: 4.0.0 - resolution: "strip-bom@npm:4.0.0" - checksum: 9dbcfbaf503c57c06af15fe2c8176fb1bf3af5ff65003851a102749f875a6dbe0ab3b30115eccf6e805e9d756830d3e40ec508b62b3f1ddf3761a20ebe29d3f3 - languageName: node - linkType: hard - -"strip-final-newline@npm:^2.0.0": - version: 2.0.0 - resolution: "strip-final-newline@npm:2.0.0" - checksum: 69412b5e25731e1938184b5d489c32e340605bb611d6140344abc3421b7f3c6f9984b21dff296dfcf056681b82caa3bb4cc996a965ce37bcfad663e92eae9c64 - languageName: node - linkType: hard - -"strip-final-newline@npm:^3.0.0": - version: 3.0.0 - resolution: "strip-final-newline@npm:3.0.0" - checksum: 23ee263adfa2070cd0f23d1ac14e2ed2f000c9b44229aec9c799f1367ec001478469560abefd00c5c99ee6f0b31c137d53ec6029c53e9f32a93804e18c201050 - languageName: node - linkType: hard - -"strip-hex-prefix@npm:1.0.0": - version: 1.0.0 - resolution: "strip-hex-prefix@npm:1.0.0" - dependencies: - is-hex-prefixed: 1.0.0 - checksum: 4cafe7caee1d281d3694d14920fd5d3c11adf09371cef7e2ccedd5b83efd9e9bd2219b5d6ce6e809df6e0f437dc9d30db1192116580875698aad164a6d6b285b - languageName: node - linkType: hard - -"strip-indent@npm:^3.0.0": - version: 3.0.0 - resolution: "strip-indent@npm:3.0.0" - dependencies: - min-indent: ^1.0.0 - checksum: 18f045d57d9d0d90cd16f72b2313d6364fd2cb4bf85b9f593523ad431c8720011a4d5f08b6591c9d580f446e78855c5334a30fb91aa1560f5d9f95ed1b4a0530 - languageName: node - linkType: hard - -"strip-json-comments@npm:2.0.1": - version: 2.0.1 - resolution: "strip-json-comments@npm:2.0.1" - checksum: 1074ccb63270d32ca28edfb0a281c96b94dc679077828135141f27d52a5a398ef5e78bcf22809d23cadc2b81dfbe345eb5fd8699b385c8b1128907dec4a7d1e1 - languageName: node - linkType: hard - -"strip-json-comments@npm:3.1.1, strip-json-comments@npm:^3.1.0, strip-json-comments@npm:^3.1.1": - version: 3.1.1 - resolution: "strip-json-comments@npm:3.1.1" - checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 - languageName: node - linkType: hard - -"superstruct@npm:^0.14.2": - version: 0.14.2 - resolution: "superstruct@npm:0.14.2" - checksum: c5c4840f432da82125b923ec45faca5113217e83ae416e314d80eae012b8bb603d2e745025d173450758d116348820bc7028157f8c9a72b6beae879f94b837c0 - languageName: node - linkType: hard - -"supports-color@npm:6.0.0": - version: 6.0.0 - resolution: "supports-color@npm:6.0.0" - dependencies: - has-flag: ^3.0.0 - checksum: 005b4a7e5d78a9a703454f5b7da34336b82825747724d1f3eefea6c3956afcb33b79b31854a93cef0fc1f2449919ae952f79abbfd09a5b5b43ecd26407d3a3a1 - languageName: node - linkType: hard - -"supports-color@npm:8.1.1": - version: 8.1.1 - resolution: "supports-color@npm:8.1.1" - dependencies: - has-flag: ^4.0.0 - checksum: c052193a7e43c6cdc741eb7f378df605636e01ad434badf7324f17fb60c69a880d8d8fcdcb562cf94c2350e57b937d7425ab5b8326c67c2adc48f7c87c1db406 - languageName: node - linkType: hard - -"supports-color@npm:^3.1.0": - version: 3.2.3 - resolution: "supports-color@npm:3.2.3" - dependencies: - has-flag: ^1.0.0 - checksum: 56afc05fa87d00100d90148c4d0a6e20a0af0d56dca5c54d4d40b2553ee737dab0ca4e8b53c4471afc035227b5b44dfa4824747a7f01ad733173536f7da6fbbb - languageName: node - linkType: hard - -"supports-color@npm:^5.3.0": - version: 5.5.0 - resolution: "supports-color@npm:5.5.0" - dependencies: - has-flag: ^3.0.0 - checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac - languageName: node - linkType: hard - -"supports-color@npm:^7.1.0": - version: 7.2.0 - resolution: "supports-color@npm:7.2.0" - dependencies: - has-flag: ^4.0.0 - checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a - languageName: node - linkType: hard - -"supports-preserve-symlinks-flag@npm:^1.0.0": - version: 1.0.0 - resolution: "supports-preserve-symlinks-flag@npm:1.0.0" - checksum: 53b1e247e68e05db7b3808b99b892bd36fb096e6fba213a06da7fab22045e97597db425c724f2bbd6c99a3c295e1e73f3e4de78592289f38431049e1277ca0ae - languageName: node - linkType: hard - -"sync-request@npm:^6.0.0": - version: 6.1.0 - resolution: "sync-request@npm:6.1.0" - dependencies: - http-response-object: ^3.0.1 - sync-rpc: ^1.2.1 - then-request: ^6.0.0 - checksum: cc8438a6749f62fb501d022fae0e3af3ac4a9983f889f929c8721b328a1c3408b98ca218aad886785a02be2c34bd75eb1a5a2608bd1fcee3c8c099391ff53a11 - languageName: node - linkType: hard - -"sync-rpc@npm:^1.2.1": - version: 1.3.6 - resolution: "sync-rpc@npm:1.3.6" - dependencies: - get-port: ^3.1.0 - checksum: 4340974fb5641c2cadb9df18d6b791ed2327f28cf6d8a00c99ebc2278e37391e3f5e237596da2ff83d14d2147594c6f5b3b98a93b9327644db425d239dea172f - languageName: node - linkType: hard - -"table-layout@npm:^1.0.2": - version: 1.0.2 - resolution: "table-layout@npm:1.0.2" - dependencies: - array-back: ^4.0.1 - deep-extend: ~0.6.0 - typical: ^5.2.0 - wordwrapjs: ^4.0.0 - checksum: 8f41b5671f101a5195747ec1727b1d35ea2cd5bf85addda11cc2f4b36892db9696ce3c2c7334b5b8a122505b34d19135fede50e25678df71b0439e0704fd953f - languageName: node - linkType: hard - -"table@npm:^6.8.0, table@npm:^6.8.1": - version: 6.8.1 - resolution: "table@npm:6.8.1" - dependencies: - ajv: ^8.0.1 - lodash.truncate: ^4.4.2 - slice-ansi: ^4.0.0 - string-width: ^4.2.3 - strip-ansi: ^6.0.1 - checksum: 08249c7046125d9d0a944a6e96cfe9ec66908d6b8a9db125531be6eb05fa0de047fd5542e9d43b4f987057f00a093b276b8d3e19af162a9c40db2681058fd306 - languageName: node - linkType: hard - -"tar@npm:^6.1.11, tar@npm:^6.1.2": - version: 6.1.13 - resolution: "tar@npm:6.1.13" - dependencies: - chownr: ^2.0.0 - fs-minipass: ^2.0.0 - minipass: ^4.0.0 - minizlib: ^2.1.1 - mkdirp: ^1.0.3 - yallist: ^4.0.0 - checksum: 8a278bed123aa9f53549b256a36b719e317c8b96fe86a63406f3c62887f78267cea9b22dc6f7007009738509800d4a4dccc444abd71d762287c90f35b002eb1c - languageName: node - linkType: hard - -"text-encoding-utf-8@npm:^1.0.2": - version: 1.0.2 - resolution: "text-encoding-utf-8@npm:1.0.2" - checksum: ec4c15d50e738c5dba7327ad432ebf0725ec75d4d69c0bd55609254c5a3bc5341272d7003691084a0a73d60d981c8eb0e87603676fdb6f3fed60f4c9192309f9 - languageName: node - linkType: hard - -"text-extensions@npm:^1.0.0": - version: 1.9.0 - resolution: "text-extensions@npm:1.9.0" - checksum: 56a9962c1b62d39b2bcb369b7558ca85c1b55e554b38dfd725edcc0a1babe5815782a60c17ff6b839093b163dfebb92b804208aaaea616ec7571c8059ae0cf44 - languageName: node - linkType: hard - -"text-table@npm:^0.2.0": - version: 0.2.0 - resolution: "text-table@npm:0.2.0" - checksum: b6937a38c80c7f84d9c11dd75e49d5c44f71d95e810a3250bd1f1797fc7117c57698204adf676b71497acc205d769d65c16ae8fa10afad832ae1322630aef10a - languageName: node - linkType: hard - -"then-request@npm:^6.0.0": - version: 6.0.2 - resolution: "then-request@npm:6.0.2" - dependencies: - "@types/concat-stream": ^1.6.0 - "@types/form-data": 0.0.33 - "@types/node": ^8.0.0 - "@types/qs": ^6.2.31 - caseless: ~0.12.0 - concat-stream: ^1.6.0 - form-data: ^2.2.0 - http-basic: ^8.1.1 - http-response-object: ^3.0.1 - promise: ^8.0.0 - qs: ^6.4.0 - checksum: a24a4fc95dd8591966bf3752f024f5cd4d53c2b2c29b23b4e40c3322df6a432d939bc17b589d8e9d760b90e92ab860f6f361a4dfcfe3542019e1615fb51afccc - languageName: node - linkType: hard - -"through2@npm:^4.0.0": - version: 4.0.2 - resolution: "through2@npm:4.0.2" - dependencies: - readable-stream: 3 - checksum: ac7430bd54ccb7920fd094b1c7ff3e1ad6edd94202e5528331253e5fde0cc56ceaa690e8df9895de2e073148c52dfbe6c4db74cacae812477a35660090960cc0 - languageName: node - linkType: hard - -"through@npm:>=2.2.7 <3, through@npm:^2.3.6, through@npm:^2.3.8": - version: 2.3.8 - resolution: "through@npm:2.3.8" - checksum: a38c3e059853c494af95d50c072b83f8b676a9ba2818dcc5b108ef252230735c54e0185437618596c790bbba8fcdaef5b290405981ffa09dce67b1f1bf190cbd - languageName: node - linkType: hard - -"tmp@npm:0.0.33, tmp@npm:^0.0.33": - version: 0.0.33 - resolution: "tmp@npm:0.0.33" - dependencies: - os-tmpdir: ~1.0.2 - checksum: 902d7aceb74453ea02abbf58c203f4a8fc1cead89b60b31e354f74ed5b3fb09ea817f94fb310f884a5d16987dd9fa5a735412a7c2dd088dd3d415aa819ae3a28 - languageName: node - linkType: hard - -"to-fast-properties@npm:^2.0.0": - version: 2.0.0 - resolution: "to-fast-properties@npm:2.0.0" - checksum: be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168 - languageName: node - linkType: hard - -"to-regex-range@npm:^5.0.1": - version: 5.0.1 - resolution: "to-regex-range@npm:5.0.1" - dependencies: - is-number: ^7.0.0 - checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed - languageName: node - linkType: hard - -"toidentifier@npm:1.0.1": - version: 1.0.1 - resolution: "toidentifier@npm:1.0.1" - checksum: 952c29e2a85d7123239b5cfdd889a0dde47ab0497f0913d70588f19c53f7e0b5327c95f4651e413c74b785147f9637b17410ac8c846d5d4a20a5a33eb6dc3a45 - languageName: node - linkType: hard - -"tough-cookie@npm:^2.3.3, tough-cookie@npm:~2.5.0": - version: 2.5.0 - resolution: "tough-cookie@npm:2.5.0" - dependencies: - psl: ^1.1.28 - punycode: ^2.1.1 - checksum: 16a8cd090224dd176eee23837cbe7573ca0fa297d7e468ab5e1c02d49a4e9a97bb05fef11320605eac516f91d54c57838a25864e8680e27b069a5231d8264977 - languageName: node - linkType: hard - -"tr46@npm:~0.0.3": - version: 0.0.3 - resolution: "tr46@npm:0.0.3" - checksum: 726321c5eaf41b5002e17ffbd1fb7245999a073e8979085dacd47c4b4e8068ff5777142fc6726d6ca1fd2ff16921b48788b87225cbc57c72636f6efa8efbffe3 - languageName: node - linkType: hard - -"trim-newlines@npm:^3.0.0": - version: 3.0.1 - resolution: "trim-newlines@npm:3.0.1" - checksum: b530f3fadf78e570cf3c761fb74fef655beff6b0f84b29209bac6c9622db75ad1417f4a7b5d54c96605dcd72734ad44526fef9f396807b90839449eb543c6206 - languageName: node - linkType: hard - -"ts-command-line-args@npm:^2.2.0": - version: 2.4.2 - resolution: "ts-command-line-args@npm:2.4.2" - dependencies: - "@morgan-stanley/ts-mocking-bird": ^0.6.2 - chalk: ^4.1.0 - command-line-args: ^5.1.1 - command-line-usage: ^6.1.0 - string-format: ^2.0.0 - bin: - write-markdown: dist/write-markdown.js - checksum: 87670c554eb23477c777be010ec9cd280187275717d4db002e0d7d1f2a660f9483315a36dc3ea4af714d41b1fc1a3bd242fd538dd76310d9f1a3741502e49fd4 - languageName: node - linkType: hard - -"ts-essentials@npm:^1.0.0": - version: 1.0.4 - resolution: "ts-essentials@npm:1.0.4" - checksum: 2e19bbe51203707ca732dcc6c3f238b2cf22bb9213d26ae0246c02325fb3e5f17c32505ac79c1bd538b7951a798155b07422e263a95cb295070a48233e45a1b5 - languageName: node - linkType: hard - -"ts-essentials@npm:^7.0.1": - version: 7.0.3 - resolution: "ts-essentials@npm:7.0.3" - peerDependencies: - typescript: ">=3.7.0" - checksum: 74d75868acf7f8b95e447d8b3b7442ca21738c6894e576df9917a352423fde5eb43c5651da5f78997da6061458160ae1f6b279150b42f47ccc58b73e55acaa2f - languageName: node - linkType: hard - -"ts-generator@npm:^0.1.1": - version: 0.1.1 - resolution: "ts-generator@npm:0.1.1" - dependencies: - "@types/mkdirp": ^0.5.2 - "@types/prettier": ^2.1.1 - "@types/resolve": ^0.0.8 - chalk: ^2.4.1 - glob: ^7.1.2 - mkdirp: ^0.5.1 - prettier: ^2.1.2 - resolve: ^1.8.1 - ts-essentials: ^1.0.0 - bin: - ts-generator: dist/cli/run.js - checksum: 3add2e76afd7a4d9d9aee1ff26477ee4e8b4cc740b35787f9ea780c11aefc88e6c7833837eacc12b944c1883680639dc9cc47fe173eff95c62112f3a41132146 - languageName: node - linkType: hard - -"ts-node@npm:^10.8.1, ts-node@npm:^10.9.1": - version: 10.9.1 - resolution: "ts-node@npm:10.9.1" - dependencies: - "@cspotcode/source-map-support": ^0.8.0 - "@tsconfig/node10": ^1.0.7 - "@tsconfig/node12": ^1.0.7 - "@tsconfig/node14": ^1.0.0 - "@tsconfig/node16": ^1.0.2 - acorn: ^8.4.1 - acorn-walk: ^8.1.1 - arg: ^4.1.0 - create-require: ^1.1.0 - diff: ^4.0.1 - make-error: ^1.1.1 - v8-compile-cache-lib: ^3.0.1 - yn: 3.1.1 - peerDependencies: - "@swc/core": ">=1.2.50" - "@swc/wasm": ">=1.2.50" - "@types/node": "*" - typescript: ">=2.7" - peerDependenciesMeta: - "@swc/core": - optional: true - "@swc/wasm": - optional: true - bin: - ts-node: dist/bin.js - ts-node-cwd: dist/bin-cwd.js - ts-node-esm: dist/bin-esm.js - ts-node-script: dist/bin-script.js - ts-node-transpile-only: dist/bin-transpile.js - ts-script: dist/bin-script-deprecated.js - checksum: 090adff1302ab20bd3486e6b4799e90f97726ed39e02b39e566f8ab674fd5bd5f727f43615debbfc580d33c6d9d1c6b1b3ce7d8e3cca3e20530a145ffa232c35 - languageName: node - linkType: hard - -"tslib@npm:^1.8.1, tslib@npm:^1.9.3": - version: 1.14.1 - resolution: "tslib@npm:1.14.1" - checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd - languageName: node - linkType: hard - -"tslib@npm:^2.1.0": - version: 2.5.0 - resolution: "tslib@npm:2.5.0" - checksum: ae3ed5f9ce29932d049908ebfdf21b3a003a85653a9a140d614da6b767a93ef94f460e52c3d787f0e4f383546981713f165037dc2274df212ea9f8a4541004e1 - languageName: node - linkType: hard - -"tsort@npm:0.0.1": - version: 0.0.1 - resolution: "tsort@npm:0.0.1" - checksum: 581566c248690b9ea7e431e1545affb3d2cab0f5dcd0e45ddef815dfaec4864cb5f0cfd8072924dedbc0de9585ff07e3e65db60f14fab4123737b9bb6e72eacc - languageName: node - linkType: hard - -"tsutils@npm:^3.21.0": - version: 3.21.0 - resolution: "tsutils@npm:3.21.0" - dependencies: - tslib: ^1.8.1 - peerDependencies: - typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - checksum: 1843f4c1b2e0f975e08c4c21caa4af4f7f65a12ac1b81b3b8489366826259323feb3fc7a243123453d2d1a02314205a7634e048d4a8009921da19f99755cdc48 - languageName: node - linkType: hard - -"tunnel-agent@npm:^0.6.0": - version: 0.6.0 - resolution: "tunnel-agent@npm:0.6.0" - dependencies: - safe-buffer: ^5.0.1 - checksum: 05f6510358f8afc62a057b8b692f05d70c1782b70db86d6a1e0d5e28a32389e52fa6e7707b6c5ecccacc031462e4bc35af85ecfe4bbc341767917b7cf6965711 - languageName: node - linkType: hard - -"tweetnacl-util@npm:^0.15.1": - version: 0.15.1 - resolution: "tweetnacl-util@npm:0.15.1" - checksum: ae6aa8a52cdd21a95103a4cc10657d6a2040b36c7a6da7b9d3ab811c6750a2d5db77e8c36969e75fdee11f511aa2b91c552496c6e8e989b6e490e54aca2864fc - languageName: node - linkType: hard - -"tweetnacl@npm:^0.14.3, tweetnacl@npm:~0.14.0": - version: 0.14.5 - resolution: "tweetnacl@npm:0.14.5" - checksum: 6061daba1724f59473d99a7bb82e13f211cdf6e31315510ae9656fefd4779851cb927adad90f3b488c8ed77c106adc0421ea8055f6f976ff21b27c5c4e918487 - languageName: node - linkType: hard - -"tweetnacl@npm:^1.0.3": - version: 1.0.3 - resolution: "tweetnacl@npm:1.0.3" - checksum: e4a57cac188f0c53f24c7a33279e223618a2bfb5fea426231991652a13247bea06b081fd745d71291fcae0f4428d29beba1b984b1f1ce6f66b06a6d1ab90645c - languageName: node - linkType: hard - -"type-check@npm:^0.4.0, type-check@npm:~0.4.0": - version: 0.4.0 - resolution: "type-check@npm:0.4.0" - dependencies: - prelude-ls: ^1.2.1 - checksum: ec688ebfc9c45d0c30412e41ca9c0cdbd704580eb3a9ccf07b9b576094d7b86a012baebc95681999dd38f4f444afd28504cb3a89f2ef16b31d4ab61a0739025a - languageName: node - linkType: hard - -"type-check@npm:~0.3.2": - version: 0.3.2 - resolution: "type-check@npm:0.3.2" - dependencies: - prelude-ls: ~1.1.2 - checksum: dd3b1495642731bc0e1fc40abe5e977e0263005551ac83342ecb6f4f89551d106b368ec32ad3fb2da19b3bd7b2d1f64330da2ea9176d8ddbfe389fb286eb5124 - languageName: node - linkType: hard - -"type-detect@npm:^4.0.0, type-detect@npm:^4.0.5, type-detect@npm:^4.0.8": - version: 4.0.8 - resolution: "type-detect@npm:4.0.8" - checksum: 62b5628bff67c0eb0b66afa371bd73e230399a8d2ad30d852716efcc4656a7516904570cd8631a49a3ce57c10225adf5d0cbdcb47f6b0255fe6557c453925a15 - languageName: node - linkType: hard - -"type-fest@npm:^0.18.0": - version: 0.18.1 - resolution: "type-fest@npm:0.18.1" - checksum: e96dcee18abe50ec82dab6cbc4751b3a82046da54c52e3b2d035b3c519732c0b3dd7a2fa9df24efd1a38d953d8d4813c50985f215f1957ee5e4f26b0fe0da395 - languageName: node - linkType: hard - -"type-fest@npm:^0.20.2": - version: 0.20.2 - resolution: "type-fest@npm:0.20.2" - checksum: 4fb3272df21ad1c552486f8a2f8e115c09a521ad7a8db3d56d53718d0c907b62c6e9141ba5f584af3f6830d0872c521357e512381f24f7c44acae583ad517d73 - languageName: node - linkType: hard - -"type-fest@npm:^0.21.3": - version: 0.21.3 - resolution: "type-fest@npm:0.21.3" - checksum: e6b32a3b3877f04339bae01c193b273c62ba7bfc9e325b8703c4ee1b32dc8fe4ef5dfa54bf78265e069f7667d058e360ae0f37be5af9f153b22382cd55a9afe0 - languageName: node - linkType: hard - -"type-fest@npm:^0.6.0": - version: 0.6.0 - resolution: "type-fest@npm:0.6.0" - checksum: b2188e6e4b21557f6e92960ec496d28a51d68658018cba8b597bd3ef757721d1db309f120ae987abeeda874511d14b776157ff809f23c6d1ce8f83b9b2b7d60f - languageName: node - linkType: hard - -"type-fest@npm:^0.7.1": - version: 0.7.1 - resolution: "type-fest@npm:0.7.1" - checksum: 5b1b113529d59949d97b76977d545989ddc11b81bb0c766b6d2ccc65473cb4b4a5c7d24f5be2c2bb2de302a5d7a13c1732ea1d34c8c59b7e0ec1f890cf7fc424 - languageName: node - linkType: hard - -"type-fest@npm:^0.8.1": - version: 0.8.1 - resolution: "type-fest@npm:0.8.1" - checksum: d61c4b2eba24009033ae4500d7d818a94fd6d1b481a8111612ee141400d5f1db46f199c014766b9fa9b31a6a7374d96fc748c6d688a78a3ce5a33123839becb7 - languageName: node - linkType: hard - -"typechain@npm:^8.1.1": - version: 8.1.1 - resolution: "typechain@npm:8.1.1" - 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 - peerDependencies: - typescript: ">=4.3.0" - bin: - typechain: dist/cli/cli.js - checksum: 77984239d9728befe5a484c4e1b55c8f194696fc8a78c44754f8e25ca8fd6d0208ddfcd9e71c90c1c35ac0689f5c3053107b54fdc2aab691c980614f6daf209b - languageName: node - linkType: hard - -"typed-array-length@npm:^1.0.4": - version: 1.0.4 - resolution: "typed-array-length@npm:1.0.4" - dependencies: - call-bind: ^1.0.2 - for-each: ^0.3.3 - is-typed-array: ^1.1.9 - checksum: 2228febc93c7feff142b8c96a58d4a0d7623ecde6c7a24b2b98eb3170e99f7c7eff8c114f9b283085cd59dcd2bd43aadf20e25bba4b034a53c5bb292f71f8956 - languageName: node - linkType: hard - -"typedarray@npm:^0.0.6": - version: 0.0.6 - resolution: "typedarray@npm:0.0.6" - checksum: 33b39f3d0e8463985eeaeeacc3cb2e28bc3dfaf2a5ed219628c0b629d5d7b810b0eb2165f9f607c34871d5daa92ba1dc69f49051cf7d578b4cbd26c340b9d1b1 - languageName: node - linkType: hard - -"typescript@npm:^4.6.4 || ^5.0.0": - version: 5.0.3 - resolution: "typescript@npm:5.0.3" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 3cce0576d218cb4277ff8b6adfef1a706e9114a98b4261a38ad658a7642f1b274a8396394f6cbff8c0ba852996d7ed2e233e9b8431d5d55ac7c2f6fea645af02 - languageName: node - linkType: hard - -"typescript@npm:^4.9.3": - version: 4.9.5 - resolution: "typescript@npm:4.9.5" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: ee000bc26848147ad423b581bd250075662a354d84f0e06eb76d3b892328d8d4440b7487b5a83e851b12b255f55d71835b008a66cbf8f255a11e4400159237db - languageName: node - linkType: hard - -"typescript@patch:typescript@^4.6.4 || ^5.0.0#~builtin": - version: 5.0.3 - resolution: "typescript@patch:typescript@npm%3A5.0.3#~builtin::version=5.0.3&hash=7ad353" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 9ec0a8eed38d46cc2c8794555b7674e413604c56c159f71b8ff21ce7f17334a44127a68724cb2ef8221ff3b19369f8f05654e8a5266621d7d962aeed889bd630 - languageName: node - linkType: hard - -"typescript@patch:typescript@^4.9.3#~builtin": - version: 4.9.5 - resolution: "typescript@patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=7ad353" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 2eee5c37cad4390385db5db5a8e81470e42e8f1401b0358d7390095d6f681b410f2c4a0c496c6ff9ebd775423c7785cdace7bcdad76c7bee283df3d9718c0f20 - languageName: node - linkType: hard - -"typical@npm:^4.0.0": - version: 4.0.0 - resolution: "typical@npm:4.0.0" - checksum: a242081956825328f535e6195a924240b34daf6e7fdb573a1809a42b9f37fb8114fa99c7ab89a695e0cdb419d4149d067f6723e4b95855ffd39c6c4ca378efb3 - languageName: node - linkType: hard - -"typical@npm:^5.2.0": - version: 5.2.0 - resolution: "typical@npm:5.2.0" - checksum: ccaeb151a9a556291b495571ca44c4660f736fb49c29314bbf773c90fad92e9485d3cc2b074c933866c1595abbbc962f2b8bfc6e0f52a8c6b0cdd205442036ac - languageName: node - linkType: hard - -"uglify-js@npm:^3.1.4": - version: 3.17.4 - resolution: "uglify-js@npm:3.17.4" - bin: - uglifyjs: bin/uglifyjs - checksum: 7b3897df38b6fc7d7d9f4dcd658599d81aa2b1fb0d074829dd4e5290f7318dbca1f4af2f45acb833b95b1fe0ed4698662ab61b87e94328eb4c0a0d3435baf924 - languageName: node - linkType: hard - -"unbox-primitive@npm:^1.0.2": - version: 1.0.2 - resolution: "unbox-primitive@npm:1.0.2" - dependencies: - call-bind: ^1.0.2 - has-bigints: ^1.0.2 - has-symbols: ^1.0.3 - which-boxed-primitive: ^1.0.2 - checksum: b7a1cf5862b5e4b5deb091672ffa579aa274f648410009c81cca63fed3b62b610c4f3b773f912ce545bb4e31edc3138975b5bc777fc6e4817dca51affb6380e9 - languageName: node - linkType: hard - -"undici@npm:^5.14.0": - version: 5.21.0 - resolution: "undici@npm:5.21.0" - dependencies: - busboy: ^1.6.0 - checksum: 013d5fd503b631d607942c511c2ab3f3fa78ebcab302acab998b43176b4815503ec15ed9752c5a47918b3bff8a0137768001d3eb57625b2bb6f6d30d8a794d6c - languageName: node - linkType: hard - -"unique-filename@npm:^2.0.0": - version: 2.0.1 - resolution: "unique-filename@npm:2.0.1" - dependencies: - unique-slug: ^3.0.0 - checksum: 807acf3381aff319086b64dc7125a9a37c09c44af7620bd4f7f3247fcd5565660ac12d8b80534dcbfd067e6fe88a67e621386dd796a8af828d1337a8420a255f - languageName: node - linkType: hard - -"unique-slug@npm:^3.0.0": - version: 3.0.0 - resolution: "unique-slug@npm:3.0.0" - dependencies: - imurmurhash: ^0.1.4 - checksum: 49f8d915ba7f0101801b922062ee46b7953256c93ceca74303bd8e6413ae10aa7e8216556b54dc5382895e8221d04f1efaf75f945c2e4a515b4139f77aa6640c - languageName: node - linkType: hard - -"universalify@npm:^0.1.0": - version: 0.1.2 - resolution: "universalify@npm:0.1.2" - checksum: 40cdc60f6e61070fe658ca36016a8f4ec216b29bf04a55dce14e3710cc84c7448538ef4dad3728d0bfe29975ccd7bfb5f414c45e7b78883567fb31b246f02dff - languageName: node - linkType: hard - -"universalify@npm:^2.0.0": - version: 2.0.0 - resolution: "universalify@npm:2.0.0" - checksum: 2406a4edf4a8830aa6813278bab1f953a8e40f2f63a37873ffa9a3bc8f9745d06cc8e88f3572cb899b7e509013f7f6fcc3e37e8a6d914167a5381d8440518c44 - languageName: node - linkType: hard - -"unpipe@npm:1.0.0": - version: 1.0.0 - resolution: "unpipe@npm:1.0.0" - checksum: 4fa18d8d8d977c55cb09715385c203197105e10a6d220087ec819f50cb68870f02942244f1017565484237f1f8c5d3cd413631b1ae104d3096f24fdfde1b4aa2 - languageName: node - linkType: hard - -"uri-js@npm:^4.2.2": - version: 4.4.1 - resolution: "uri-js@npm:4.4.1" - dependencies: - punycode: ^2.1.0 - checksum: 7167432de6817fe8e9e0c9684f1d2de2bb688c94388f7569f7dbdb1587c9f4ca2a77962f134ec90be0cc4d004c939ff0d05acc9f34a0db39a3c797dada262633 - languageName: node - linkType: hard - -"utf-8-validate@npm:^5.0.2": - version: 5.0.10 - resolution: "utf-8-validate@npm:5.0.10" - dependencies: - node-gyp: latest - node-gyp-build: ^4.3.0 - checksum: 5579350a023c66a2326752b6c8804cc7b39dcd251bb088241da38db994b8d78352e388dcc24ad398ab98385ba3c5ffcadb6b5b14b2637e43f767869055e46ba6 - languageName: node - linkType: hard - -"utf8@npm:3.0.0": - version: 3.0.0 - resolution: "utf8@npm:3.0.0" - checksum: cb89a69ad9ab393e3eae9b25305b3ff08bebca9adc839191a34f90777eb2942f86a96369d2839925fea58f8f722f7e27031d697f10f5f39690f8c5047303e62d - languageName: node - linkType: hard - -"util-deprecate@npm:^1.0.1, util-deprecate@npm:~1.0.1": - version: 1.0.2 - resolution: "util-deprecate@npm:1.0.2" - checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 - languageName: node - linkType: hard - -"uuid@npm:2.0.1": - version: 2.0.1 - resolution: "uuid@npm:2.0.1" - checksum: e129e494e33cededdfc2cefbd63da966344b873bbfd3373a311b0acc2e7ab53d68b2515879444898867d84b863e44939e852484b9f3a54c4fd86d985a7dadb8d - languageName: node - linkType: hard - -"uuid@npm:^3.3.2": - version: 3.4.0 - resolution: "uuid@npm:3.4.0" - bin: - uuid: ./bin/uuid - checksum: 58de2feed61c59060b40f8203c0e4ed7fd6f99d42534a499f1741218a1dd0c129f4aa1de797bcf822c8ea5da7e4137aa3673431a96dae729047f7aca7b27866f - languageName: node - linkType: hard - -"uuid@npm:^7.0.3": - version: 7.0.3 - resolution: "uuid@npm:7.0.3" - bin: - uuid: dist/bin/uuid - checksum: f5b7b5cc28accac68d5c083fd51cca64896639ebd4cca88c6cfb363801aaa83aa439c86dfc8446ea250a7a98d17afd2ad9e88d9d4958c79a412eccb93bae29de - languageName: node - linkType: hard - -"uuid@npm:^8.3.2": - version: 8.3.2 - resolution: "uuid@npm:8.3.2" - bin: - uuid: dist/bin/uuid - checksum: 5575a8a75c13120e2f10e6ddc801b2c7ed7d8f3c8ac22c7ed0c7b2ba6383ec0abda88c905085d630e251719e0777045ae3236f04c812184b7c765f63a70e58df - languageName: node - linkType: hard - -"v8-compile-cache-lib@npm:^3.0.1": - version: 3.0.1 - resolution: "v8-compile-cache-lib@npm:3.0.1" - checksum: 78089ad549e21bcdbfca10c08850022b22024cdcc2da9b168bcf5a73a6ed7bf01a9cebb9eac28e03cd23a684d81e0502797e88f3ccd27a32aeab1cfc44c39da0 - languageName: node - linkType: hard - -"validate-npm-package-license@npm:^3.0.1": - version: 3.0.4 - resolution: "validate-npm-package-license@npm:3.0.4" - dependencies: - spdx-correct: ^3.0.0 - spdx-expression-parse: ^3.0.0 - checksum: 35703ac889d419cf2aceef63daeadbe4e77227c39ab6287eeb6c1b36a746b364f50ba22e88591f5d017bc54685d8137bc2d328d0a896e4d3fd22093c0f32a9ad - languageName: node - linkType: hard - -"verror@npm:1.10.0": - version: 1.10.0 - resolution: "verror@npm:1.10.0" - dependencies: - assert-plus: ^1.0.0 - core-util-is: 1.0.2 - extsprintf: ^1.2.0 - checksum: c431df0bedf2088b227a4e051e0ff4ca54df2c114096b0c01e1cbaadb021c30a04d7dd5b41ab277bcd51246ca135bf931d4c4c796ecae7a4fef6d744ecef36ea - languageName: node - linkType: hard - -"wcwidth@npm:^1.0.1": - version: 1.0.1 - resolution: "wcwidth@npm:1.0.1" - dependencies: - defaults: ^1.0.3 - checksum: 814e9d1ddcc9798f7377ffa448a5a3892232b9275ebb30a41b529607691c0491de47cba426e917a4d08ded3ee7e9ba2f3fe32e62ee3cd9c7d3bafb7754bd553c - languageName: node - linkType: hard - -"web3-utils@npm:^1.3.6": - version: 1.9.0 - resolution: "web3-utils@npm:1.9.0" - dependencies: - bn.js: ^5.2.1 - ethereum-bloom-filters: ^1.0.6 - ethereumjs-util: ^7.1.0 - ethjs-unit: 0.1.6 - number-to-bn: 1.7.0 - randombytes: ^2.1.0 - utf8: 3.0.0 - checksum: 3c794a7fcef9387b96e8fcd847fbf286862f0540ab6656063cdb69830ddd7141d955f5e52c049e3d5f28373311934d19f75199f42604741400af72e2348a26f6 - languageName: node - linkType: hard - -"webidl-conversions@npm:^3.0.0": - version: 3.0.1 - resolution: "webidl-conversions@npm:3.0.1" - checksum: c92a0a6ab95314bde9c32e1d0a6dfac83b578f8fa5f21e675bc2706ed6981bc26b7eb7e6a1fab158e5ce4adf9caa4a0aee49a52505d4d13c7be545f15021b17c - languageName: node - linkType: hard - -"whatwg-url@npm:^5.0.0": - version: 5.0.0 - resolution: "whatwg-url@npm:5.0.0" - dependencies: - tr46: ~0.0.3 - webidl-conversions: ^3.0.0 - checksum: b8daed4ad3356cc4899048a15b2c143a9aed0dfae1f611ebd55073310c7b910f522ad75d727346ad64203d7e6c79ef25eafd465f4d12775ca44b90fa82ed9e2c - languageName: node - linkType: hard - -"which-boxed-primitive@npm:^1.0.2": - version: 1.0.2 - resolution: "which-boxed-primitive@npm:1.0.2" - 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 - checksum: 53ce774c7379071729533922adcca47220228405e1895f26673bbd71bdf7fb09bee38c1d6399395927c6289476b5ae0629863427fd151491b71c4b6cb04f3a5e - languageName: node - linkType: hard - -"which-module@npm:^2.0.0": - version: 2.0.0 - resolution: "which-module@npm:2.0.0" - checksum: 809f7fd3dfcb2cdbe0180b60d68100c88785084f8f9492b0998c051d7a8efe56784492609d3f09ac161635b78ea29219eb1418a98c15ce87d085bce905705c9c - languageName: node - linkType: hard - -"which-typed-array@npm:^1.1.9": - version: 1.1.9 - resolution: "which-typed-array@npm:1.1.9" - dependencies: - available-typed-arrays: ^1.0.5 - call-bind: ^1.0.2 - for-each: ^0.3.3 - gopd: ^1.0.1 - has-tostringtag: ^1.0.0 - is-typed-array: ^1.1.10 - checksum: fe0178ca44c57699ca2c0e657b64eaa8d2db2372a4e2851184f568f98c478ae3dc3fdb5f7e46c384487046b0cf9e23241423242b277e03e8ba3dabc7c84c98ef - languageName: node - linkType: hard - -"which@npm:1.3.1, which@npm:^1.1.1, which@npm:^1.2.14, which@npm:^1.3.1": - version: 1.3.1 - resolution: "which@npm:1.3.1" - dependencies: - isexe: ^2.0.0 - bin: - which: ./bin/which - checksum: f2e185c6242244b8426c9df1510e86629192d93c1a986a7d2a591f2c24869e7ffd03d6dac07ca863b2e4c06f59a4cc9916c585b72ee9fa1aa609d0124df15e04 - languageName: node - linkType: hard - -"which@npm:^2.0.1, which@npm:^2.0.2": - version: 2.0.2 - resolution: "which@npm:2.0.2" - dependencies: - isexe: ^2.0.0 - bin: - node-which: ./bin/node-which - checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 - languageName: node - linkType: hard - -"wide-align@npm:1.1.3": - version: 1.1.3 - resolution: "wide-align@npm:1.1.3" - dependencies: - string-width: ^1.0.2 || 2 - checksum: d09c8012652a9e6cab3e82338d1874a4d7db2ad1bd19ab43eb744acf0b9b5632ec406bdbbbb970a8f4771a7d5ef49824d038ba70aa884e7723f5b090ab87134d - languageName: node - linkType: hard - -"wide-align@npm:^1.1.5": - version: 1.1.5 - resolution: "wide-align@npm:1.1.5" - dependencies: - string-width: ^1.0.2 || 2 || 3 || 4 - checksum: d5fc37cd561f9daee3c80e03b92ed3e84d80dde3365a8767263d03dacfc8fa06b065ffe1df00d8c2a09f731482fcacae745abfbb478d4af36d0a891fad4834d3 - languageName: node - linkType: hard - -"word-wrap@npm:^1.0.3, word-wrap@npm:^1.2.3, word-wrap@npm:~1.2.3": - version: 1.2.3 - resolution: "word-wrap@npm:1.2.3" - checksum: 30b48f91fcf12106ed3186ae4fa86a6a1842416df425be7b60485de14bec665a54a68e4b5156647dec3a70f25e84d270ca8bc8cd23182ed095f5c7206a938c1f - languageName: node - linkType: hard - -"wordwrap@npm:^1.0.0": - version: 1.0.0 - resolution: "wordwrap@npm:1.0.0" - checksum: 2a44b2788165d0a3de71fd517d4880a8e20ea3a82c080ce46e294f0b68b69a2e49cff5f99c600e275c698a90d12c5ea32aff06c311f0db2eb3f1201f3e7b2a04 - languageName: node - linkType: hard - -"wordwrapjs@npm:^4.0.0": - version: 4.0.1 - resolution: "wordwrapjs@npm:4.0.1" - dependencies: - reduce-flatten: ^2.0.0 - typical: ^5.2.0 - checksum: 3d927f3c95d0ad990968da54c0ad8cde2801d8e91006cd7474c26e6b742cc8557250ce495c9732b2f9db1f903601cb74ec282e0f122ee0d02d7abe81e150eea8 - languageName: node - linkType: hard - -"workerpool@npm:6.2.1": - version: 6.2.1 - resolution: "workerpool@npm:6.2.1" - checksum: c2c6eebbc5225f10f758d599a5c016fa04798bcc44e4c1dffb34050cd361d7be2e97891aa44419e7afe647b1f767b1dc0b85a5e046c409d890163f655028b09d - languageName: node - linkType: hard - -"wrap-ansi@npm:^5.1.0": - version: 5.1.0 - resolution: "wrap-ansi@npm:5.1.0" - dependencies: - ansi-styles: ^3.2.0 - string-width: ^3.0.0 - strip-ansi: ^5.0.0 - checksum: 9b48c862220e541eb0daa22661b38b947973fc57054e91be5b0f2dcc77741a6875ccab4ebe970a394b4682c8dfc17e888266a105fb8b0a9b23c19245e781ceae - languageName: node - linkType: hard - -"wrap-ansi@npm:^6.2.0": - version: 6.2.0 - resolution: "wrap-ansi@npm:6.2.0" - dependencies: - ansi-styles: ^4.0.0 - string-width: ^4.1.0 - strip-ansi: ^6.0.0 - checksum: 6cd96a410161ff617b63581a08376f0cb9162375adeb7956e10c8cd397821f7eb2a6de24eb22a0b28401300bf228c86e50617cd568209b5f6775b93c97d2fe3a - languageName: node - linkType: hard - -"wrap-ansi@npm:^7.0.0": - version: 7.0.0 - resolution: "wrap-ansi@npm:7.0.0" - dependencies: - ansi-styles: ^4.0.0 - string-width: ^4.1.0 - strip-ansi: ^6.0.0 - checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b - languageName: node - linkType: hard - -"wrappy@npm:1": - version: 1.0.2 - resolution: "wrappy@npm:1.0.2" - checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 - languageName: node - linkType: hard - -"ws@npm:7.4.6": - version: 7.4.6 - resolution: "ws@npm:7.4.6" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 3a990b32ed08c72070d5e8913e14dfcd831919205be52a3ff0b4cdd998c8d554f167c9df3841605cde8b11d607768cacab3e823c58c96a5c08c987e093eb767a - languageName: node - linkType: hard - -"ws@npm:^7.4.5, ws@npm:^7.4.6": - version: 7.5.9 - resolution: "ws@npm:7.5.9" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: c3c100a181b731f40b7f2fddf004aa023f79d64f489706a28bc23ff88e87f6a64b3c6651fbec3a84a53960b75159574d7a7385709847a62ddb7ad6af76f49138 - languageName: node - linkType: hard - -"ws@npm:^8.5.0": - version: 8.14.2 - resolution: "ws@npm:8.14.2" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 3ca0dad26e8cc6515ff392b622a1467430814c463b3368b0258e33696b1d4bed7510bc7030f7b72838b9fdeb8dbd8839cbf808367d6aae2e1d668ce741d4308b - languageName: node - linkType: hard - -"xmlhttprequest@npm:1.8.0": - version: 1.8.0 - resolution: "xmlhttprequest@npm:1.8.0" - checksum: c891cf0d7884b4f5cce835aa01f1965727cd352cbd2d7a2e0605bf11ec99ae2198364cca54656ec8b2581a5704dee6c2bf9911922a0ff2a71b613455d32e81b7 - languageName: node - linkType: hard - -"y18n@npm:^4.0.0": - version: 4.0.3 - resolution: "y18n@npm:4.0.3" - checksum: 014dfcd9b5f4105c3bb397c1c8c6429a9df004aa560964fb36732bfb999bfe83d45ae40aeda5b55d21b1ee53d8291580a32a756a443e064317953f08025b1aa4 - languageName: node - linkType: hard - -"y18n@npm:^5.0.5": - version: 5.0.8 - resolution: "y18n@npm:5.0.8" - checksum: 54f0fb95621ee60898a38c572c515659e51cc9d9f787fb109cef6fde4befbe1c4602dc999d30110feee37456ad0f1660fa2edcfde6a9a740f86a290999550d30 - languageName: node - linkType: hard - -"yallist@npm:^3.0.2": - version: 3.1.1 - resolution: "yallist@npm:3.1.1" - checksum: 48f7bb00dc19fc635a13a39fe547f527b10c9290e7b3e836b9a8f1ca04d4d342e85714416b3c2ab74949c9c66f9cebb0473e6bc353b79035356103b47641285d - languageName: node - linkType: hard - -"yallist@npm:^4.0.0": - version: 4.0.0 - resolution: "yallist@npm:4.0.0" - checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 - languageName: node - linkType: hard - -"yaml@npm:^2.2.1": - version: 2.2.1 - resolution: "yaml@npm:2.2.1" - checksum: 84f68cbe462d5da4e7ded4a8bded949ffa912bc264472e5a684c3d45b22d8f73a3019963a32164023bdf3d83cfb6f5b58ff7b2b10ef5b717c630f40bd6369a23 - languageName: node - linkType: hard - -"yargs-parser@npm:13.1.2, yargs-parser@npm:^13.1.2": - version: 13.1.2 - resolution: "yargs-parser@npm:13.1.2" - dependencies: - camelcase: ^5.0.0 - decamelize: ^1.2.0 - checksum: c8bb6f44d39a4acd94462e96d4e85469df865de6f4326e0ab1ac23ae4a835e5dd2ddfe588317ebf80c3a7e37e741bd5cb0dc8d92bcc5812baefb7df7c885e86b - languageName: node - linkType: hard - -"yargs-parser@npm:20.2.4": - version: 20.2.4 - resolution: "yargs-parser@npm:20.2.4" - checksum: d251998a374b2743a20271c2fd752b9fbef24eb881d53a3b99a7caa5e8227fcafd9abf1f345ac5de46435821be25ec12189a11030c12ee6481fef6863ed8b924 - languageName: node - linkType: hard - -"yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3": - version: 20.2.9 - resolution: "yargs-parser@npm:20.2.9" - checksum: 8bb69015f2b0ff9e17b2c8e6bfe224ab463dd00ca211eece72a4cd8a906224d2703fb8a326d36fdd0e68701e201b2a60ed7cf81ce0fd9b3799f9fe7745977ae3 - languageName: node - linkType: hard - -"yargs-parser@npm:^21.1.1": - version: 21.1.1 - resolution: "yargs-parser@npm:21.1.1" - checksum: ed2d96a616a9e3e1cc7d204c62ecc61f7aaab633dcbfab2c6df50f7f87b393993fe6640d017759fe112d0cb1e0119f2b4150a87305cc873fd90831c6a58ccf1c - languageName: node - linkType: hard - -"yargs-unparser@npm:1.6.0": - version: 1.6.0 - resolution: "yargs-unparser@npm:1.6.0" - dependencies: - flat: ^4.1.0 - lodash: ^4.17.15 - yargs: ^13.3.0 - checksum: ca662bb94af53d816d47f2162f0a1d135783f09de9fd47645a5cb18dd25532b0b710432b680d2c065ff45de122ba4a96433c41595fa7bfcc08eb12e889db95c1 - languageName: node - linkType: hard - -"yargs-unparser@npm:2.0.0": - version: 2.0.0 - resolution: "yargs-unparser@npm:2.0.0" - dependencies: - camelcase: ^6.0.0 - decamelize: ^4.0.0 - flat: ^5.0.2 - is-plain-obj: ^2.1.0 - checksum: 68f9a542c6927c3768c2f16c28f71b19008710abd6b8f8efbac6dcce26bbb68ab6503bed1d5994bdbc2df9a5c87c161110c1dfe04c6a3fe5c6ad1b0e15d9a8a3 - languageName: node - linkType: hard - -"yargs@npm:13.3.2, yargs@npm:^13.3.0": - version: 13.3.2 - resolution: "yargs@npm:13.3.2" - dependencies: - cliui: ^5.0.0 - find-up: ^3.0.0 - get-caller-file: ^2.0.1 - require-directory: ^2.1.1 - require-main-filename: ^2.0.0 - set-blocking: ^2.0.0 - string-width: ^3.0.0 - which-module: ^2.0.0 - y18n: ^4.0.0 - yargs-parser: ^13.1.2 - checksum: 75c13e837eb2bb25717957ba58d277e864efc0cca7f945c98bdf6477e6ec2f9be6afa9ed8a876b251a21423500c148d7b91e88dee7adea6029bdec97af1ef3e8 - languageName: node - linkType: hard - -"yargs@npm:16.2.0": - version: 16.2.0 - resolution: "yargs@npm:16.2.0" - dependencies: - cliui: ^7.0.2 - escalade: ^3.1.1 - get-caller-file: ^2.0.5 - require-directory: ^2.1.1 - string-width: ^4.2.0 - y18n: ^5.0.5 - yargs-parser: ^20.2.2 - checksum: b14afbb51e3251a204d81937c86a7e9d4bdbf9a2bcee38226c900d00f522969ab675703bee2a6f99f8e20103f608382936034e64d921b74df82b63c07c5e8f59 - languageName: node - linkType: hard - -"yargs@npm:^17.0.0": - version: 17.7.1 - resolution: "yargs@npm:17.7.1" - dependencies: - cliui: ^8.0.1 - escalade: ^3.1.1 - get-caller-file: ^2.0.5 - require-directory: ^2.1.1 - string-width: ^4.2.3 - y18n: ^5.0.5 - yargs-parser: ^21.1.1 - checksum: 3d8a43c336a4942bc68080768664aca85c7bd406f018bad362fd255c41c8f4e650277f42fd65d543fce99e084124ddafee7bbfc1a5c6a8fda4cec78609dcf8d4 - languageName: node - linkType: hard - -"yn@npm:3.1.1": - version: 3.1.1 - resolution: "yn@npm:3.1.1" - checksum: 2c487b0e149e746ef48cda9f8bad10fc83693cd69d7f9dcd8be4214e985de33a29c9e24f3c0d6bcf2288427040a8947406ab27f7af67ee9456e6b84854f02dd6 - languageName: node - linkType: hard - -"yocto-queue@npm:^0.1.0": - version: 0.1.0 - resolution: "yocto-queue@npm:0.1.0" - checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 - languageName: node - linkType: hard - -"zksync-web3@npm:^0.14.3": - version: 0.14.4 - resolution: "zksync-web3@npm:0.14.4" - peerDependencies: - ethers: ^5.7.0 - checksum: f702a3437f48a8d42c4bb35b8dd13671a168aadfc4e23ce723d62959220ccb6bf9c529c60331fe5b91afaa622147c6a37490551474fe3e35c06ac476524b5160 - languageName: node - linkType: hard diff --git a/patches/@polytope-labs+solidity-merkle-trees+0.2.1.patch b/patches/@polytope-labs+solidity-merkle-trees+0.2.1.patch new file mode 100644 index 00000000..43ca06f4 --- /dev/null +++ b/patches/@polytope-labs+solidity-merkle-trees+0.2.1.patch @@ -0,0 +1,13 @@ +diff --git a/node_modules/@polytope-labs/solidity-merkle-trees/src/trie/substrate/SubstrateTrieDB.sol b/node_modules/@polytope-labs/solidity-merkle-trees/src/trie/substrate/SubstrateTrieDB.sol +index 40b7397..6eb68b1 100644 +--- a/node_modules/@polytope-labs/solidity-merkle-trees/src/trie/substrate/SubstrateTrieDB.sol ++++ b/node_modules/@polytope-labs/solidity-merkle-trees/src/trie/substrate/SubstrateTrieDB.sol +@@ -5,7 +5,7 @@ import "../Bytes.sol"; + import {NibbleSliceOps} from "../NibbleSlice.sol"; + + import {ScaleCodec} from "./ScaleCodec.sol"; +-import "openzeppelin/utils/Strings.sol"; ++import "@openzeppelin/contracts/utils/Strings.sol"; + + // SPDX-License-Identifier: Apache2 + diff --git a/yarn.lock b/yarn.lock index e0311ba7..c088cd2d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,1909 +1,7320 @@ -# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! - -__metadata: - version: 6 - cacheKey: 8 - -"@babel/code-frame@npm:^7.0.0": - version: 7.21.4 - resolution: "@babel/code-frame@npm:7.21.4" - dependencies: - "@babel/highlight": ^7.18.6 - checksum: e5390e6ec1ac58dcef01d4f18eaf1fd2f1325528661ff6d4a5de8979588b9f5a8e852a54a91b923846f7a5c681b217f0a45c2524eb9560553160cd963b7d592c - languageName: node - linkType: hard - -"@babel/helper-validator-identifier@npm:^7.18.6": - version: 7.19.1 - resolution: "@babel/helper-validator-identifier@npm:7.19.1" - checksum: 0eca5e86a729162af569b46c6c41a63e18b43dbe09fda1d2a3c8924f7d617116af39cac5e4cd5d431bb760b4dca3c0970e0c444789b1db42bcf1fa41fbad0a3a - languageName: node - linkType: hard - -"@babel/highlight@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/highlight@npm:7.18.6" - dependencies: - "@babel/helper-validator-identifier": ^7.18.6 - chalk: ^2.0.0 - js-tokens: ^4.0.0 - checksum: 92d8ee61549de5ff5120e945e774728e5ccd57fd3b2ed6eace020ec744823d4a98e242be1453d21764a30a14769ecd62170fba28539b211799bbaf232bbb2789 - languageName: node - linkType: hard - -"@commitlint/cli@npm:^17.5.1": - version: 17.5.1 - resolution: "@commitlint/cli@npm:17.5.1" - dependencies: - "@commitlint/format": ^17.4.4 - "@commitlint/lint": ^17.4.4 - "@commitlint/load": ^17.5.0 - "@commitlint/read": ^17.5.1 - "@commitlint/types": ^17.4.4 - execa: ^5.0.0 - lodash.isfunction: ^3.0.9 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - yargs: ^17.0.0 - bin: - commitlint: cli.js - checksum: 2bdd26b3215796dccb16b0d7459d3b0db7f6324800aa73b97a8cdf79b77f3691d85ee88f37fa6cf20c97ac664f31dcb6ad7aef1da3c3b32d7bb12f18d49a37f2 - languageName: node - linkType: hard - -"@commitlint/config-conventional@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/config-conventional@npm:17.4.4" - dependencies: - conventional-changelog-conventionalcommits: ^5.0.0 - checksum: 679d92509fe6e53ee0cc4202f8069d88360c4f9dbd7ab74114bb28278a196da517ef711dfe69893033a66e54ffc29e8df2ccf63cfd746a89c82a053949473c4b - languageName: node - linkType: hard - -"@commitlint/config-validator@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/config-validator@npm:17.4.4" - dependencies: - "@commitlint/types": ^17.4.4 - ajv: ^8.11.0 - checksum: 71ee818608ed5c74832cdd63531c0f61b21758fba9f8b876205485ece4f047c9582bc3f323a20a5de700e3451296614d15448437270a82194eff7d71317b47ff - languageName: node - linkType: hard - -"@commitlint/ensure@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/ensure@npm:17.4.4" - dependencies: - "@commitlint/types": ^17.4.4 - lodash.camelcase: ^4.3.0 - lodash.kebabcase: ^4.1.1 - lodash.snakecase: ^4.1.1 - lodash.startcase: ^4.4.0 - lodash.upperfirst: ^4.3.1 - checksum: c21c189f22d8d3265e93256d101b72ef7cbdf8660438081799b9a4a8bd47d33133f250bbed858ab9bcc0d249d1c95ac58eddd9e5b46314d64ff049d0479d0d71 - languageName: node - linkType: hard - -"@commitlint/execute-rule@npm:^17.4.0": - version: 17.4.0 - resolution: "@commitlint/execute-rule@npm:17.4.0" - checksum: 17d8e56ab00bd45fdecb0ed33186d2020ce261250d6a516204b6509610b75af8c930e7226b1111af3de298db32a7e4d0ba2c9cc7ed67db5ba5159eeed634f067 - languageName: node - linkType: hard - -"@commitlint/format@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/format@npm:17.4.4" - dependencies: - "@commitlint/types": ^17.4.4 - chalk: ^4.1.0 - checksum: 832d9641129f2da8d32389b4a47db59d41eb1adfab742723972cad64b833c4af9e253f96757b27664fedae61644dd4c01d21f775773b45b604bd7f93b23a27d2 - languageName: node - linkType: hard - -"@commitlint/is-ignored@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/is-ignored@npm:17.4.4" - dependencies: - "@commitlint/types": ^17.4.4 - semver: 7.3.8 - checksum: 716631ecd6aece8642d76c1a99e1cdc24bad79f22199d1d4bad73d9b12edb3578ed7d6f23947ca28d4bb637e08a1738e55dd693c165a2d395c10560a988ffc05 - languageName: node - linkType: hard - -"@commitlint/lint@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/lint@npm:17.4.4" - dependencies: - "@commitlint/is-ignored": ^17.4.4 - "@commitlint/parse": ^17.4.4 - "@commitlint/rules": ^17.4.4 - "@commitlint/types": ^17.4.4 - checksum: bf04a9f9a1435e0d3cd03c58b6bf924613d0278b66b0a5d0e18eb96c7af9eeb02871e739a4d7d9312b2b4178f6f8ae9a49ba74382b4e28f623e1bf0af7067946 - languageName: node - linkType: hard - -"@commitlint/load@npm:^17.5.0": - version: 17.5.0 - resolution: "@commitlint/load@npm:17.5.0" - dependencies: - "@commitlint/config-validator": ^17.4.4 - "@commitlint/execute-rule": ^17.4.0 - "@commitlint/resolve-extends": ^17.4.4 - "@commitlint/types": ^17.4.4 - "@types/node": "*" - chalk: ^4.1.0 - cosmiconfig: ^8.0.0 - cosmiconfig-typescript-loader: ^4.0.0 - lodash.isplainobject: ^4.0.6 - lodash.merge: ^4.6.2 - lodash.uniq: ^4.5.0 - resolve-from: ^5.0.0 - ts-node: ^10.8.1 - typescript: ^4.6.4 || ^5.0.0 - checksum: c039114b0ad67bb9d8b05ec635d847bd5ab760528f0fb203411f433585bdab5472f4f5c7856dfc417cf64c05576f54c1afc4997a813f529304e0156bfc1d6cc8 - languageName: node - linkType: hard - -"@commitlint/message@npm:^17.4.2": - version: 17.4.2 - resolution: "@commitlint/message@npm:17.4.2" - checksum: 55b6cfeb57f7c9f913e18821aa4d972a6b6faa78c62741390996151f99554396f6df68ccfee86c163d24d8c27a4dbbcb50ef03c2972ab0a7a21d89daa2f9a519 - languageName: node - linkType: hard - -"@commitlint/parse@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/parse@npm:17.4.4" - dependencies: - "@commitlint/types": ^17.4.4 - conventional-changelog-angular: ^5.0.11 - conventional-commits-parser: ^3.2.2 - checksum: 2a6e5b0a5cdea21c879a3919a0227c0d7f3fa1f343808bcb09e3e7f25b0dc494dcca8af32982e7a65640b53c3e6cf138ebf685b657dd55173160bc0fa4e58916 - languageName: node - linkType: hard - -"@commitlint/read@npm:^17.5.1": - version: 17.5.1 - resolution: "@commitlint/read@npm:17.5.1" - dependencies: - "@commitlint/top-level": ^17.4.0 - "@commitlint/types": ^17.4.4 - fs-extra: ^11.0.0 - git-raw-commits: ^2.0.11 - minimist: ^1.2.6 - checksum: 62ee4f7a47b22a8571ae313bca36b418805a248f4986557f38f06317c44b6d18072889f95e7bc22bbb33a2f2b08236f74596ff28e3dbd0894249477a9df367c3 - languageName: node - linkType: hard - -"@commitlint/resolve-extends@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/resolve-extends@npm:17.4.4" - dependencies: - "@commitlint/config-validator": ^17.4.4 - "@commitlint/types": ^17.4.4 - import-fresh: ^3.0.0 - lodash.mergewith: ^4.6.2 - resolve-from: ^5.0.0 - resolve-global: ^1.0.0 - checksum: d7bf1ff1ad3db8750421b252d79cf7b96cf07d72cad8cc3f73c1363a8e68c0afde611d38ae6f213bbb54e3248160c6b9425578f3d0f8f790e84aea811d748b3e - languageName: node - linkType: hard - -"@commitlint/rules@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/rules@npm:17.4.4" - dependencies: - "@commitlint/ensure": ^17.4.4 - "@commitlint/message": ^17.4.2 - "@commitlint/to-lines": ^17.4.0 - "@commitlint/types": ^17.4.4 - execa: ^5.0.0 - checksum: f36525f6e234df6a17d47457b733a1fc10e3e01db1aa6fb45b18cbaf74b7915f634ab65f73d2412787137c366046f8264126c2f21ad9023ac6b68ec8b1cee8f4 - languageName: node - linkType: hard - -"@commitlint/to-lines@npm:^17.4.0": - version: 17.4.0 - resolution: "@commitlint/to-lines@npm:17.4.0" - checksum: 841f90f606238e145ab4ba02940662d511fc04fe553619900152a8542170fe664031b95d820ffaeb8864d4851344278e662ef29637d763fc19fd828e0f8d139b - languageName: node - linkType: hard - -"@commitlint/top-level@npm:^17.4.0": - version: 17.4.0 - resolution: "@commitlint/top-level@npm:17.4.0" - dependencies: - find-up: ^5.0.0 - checksum: 14cd77e982d2dd7989718dafdbf7a2168a5fb387005e0686c2dfa9ffc36bb9a749e5d80a151884459e4d8c88564339688dca26e9c711abe043beeb3f30c3dfd6 - languageName: node - linkType: hard - -"@commitlint/types@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/types@npm:17.4.4" - dependencies: - chalk: ^4.1.0 - checksum: 03c52429052d161710896d198000196bd2e60be0fd71459b22133dd83dee43e8d05ea8ee703c8369823bc40f77a54881b80d8aa4368ac52aea7f30fb234b73d2 - languageName: node - linkType: hard - -"@cspotcode/source-map-support@npm:^0.8.0": - version: 0.8.1 - resolution: "@cspotcode/source-map-support@npm:0.8.1" - dependencies: - "@jridgewell/trace-mapping": 0.3.9 - checksum: 5718f267085ed8edb3e7ef210137241775e607ee18b77d95aa5bd7514f47f5019aa2d82d96b3bf342ef7aa890a346fa1044532ff7cc3009e7d24fce3ce6200fa - languageName: node - linkType: hard - -"@jridgewell/resolve-uri@npm:^3.0.3": - version: 3.1.0 - resolution: "@jridgewell/resolve-uri@npm:3.1.0" - checksum: b5ceaaf9a110fcb2780d1d8f8d4a0bfd216702f31c988d8042e5f8fbe353c55d9b0f55a1733afdc64806f8e79c485d2464680ac48a0d9fcadb9548ee6b81d267 - languageName: node - linkType: hard - -"@jridgewell/sourcemap-codec@npm:^1.4.10": - version: 1.4.14 - resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" - checksum: 61100637b6d173d3ba786a5dff019e1a74b1f394f323c1fee337ff390239f053b87266c7a948777f4b1ee68c01a8ad0ab61e5ff4abb5a012a0b091bec391ab97 - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:0.3.9": - version: 0.3.9 - resolution: "@jridgewell/trace-mapping@npm:0.3.9" - dependencies: - "@jridgewell/resolve-uri": ^3.0.3 - "@jridgewell/sourcemap-codec": ^1.4.10 - checksum: d89597752fd88d3f3480845691a05a44bd21faac18e2185b6f436c3b0fd0c5a859fbbd9aaa92050c4052caf325ad3e10e2e1d1b64327517471b7d51babc0ddef - languageName: node - linkType: hard - -"@solidity-parser/parser@npm:^0.16.0": - version: 0.16.0 - resolution: "@solidity-parser/parser@npm:0.16.0" - dependencies: - antlr4ts: ^0.5.0-alpha.4 - checksum: 6ccbdab334331a58fde2a739cff76d5a99d836186b7899e8e027266f2af2a4bddc77c9c2abd01307cea6c470345d48edc470049e9672143b73f4aff3c8976183 - languageName: node - linkType: hard - -"@tsconfig/node10@npm:^1.0.7": - version: 1.0.9 - resolution: "@tsconfig/node10@npm:1.0.9" - checksum: a33ae4dc2a621c0678ac8ac4bceb8e512ae75dac65417a2ad9b022d9b5411e863c4c198b6ba9ef659e14b9fb609bbec680841a2e84c1172df7a5ffcf076539df - languageName: node - linkType: hard - -"@tsconfig/node12@npm:^1.0.7": - version: 1.0.11 - resolution: "@tsconfig/node12@npm:1.0.11" - checksum: 5ce29a41b13e7897a58b8e2df11269c5395999e588b9a467386f99d1d26f6c77d1af2719e407621412520ea30517d718d5192a32403b8dfcc163bf33e40a338a - languageName: node - linkType: hard - -"@tsconfig/node14@npm:^1.0.0": - version: 1.0.3 - resolution: "@tsconfig/node14@npm:1.0.3" - checksum: 19275fe80c4c8d0ad0abed6a96dbf00642e88b220b090418609c4376e1cef81bf16237bf170ad1b341452feddb8115d8dd2e5acdfdea1b27422071163dc9ba9d - languageName: node - linkType: hard - -"@tsconfig/node16@npm:^1.0.2": - version: 1.0.3 - resolution: "@tsconfig/node16@npm:1.0.3" - checksum: 3a8b657dd047495b7ad23437d6afd20297ce90380ff0bdee93fc7d39a900dbd8d9e26e53ff6b465e7967ce2adf0b218782590ce9013285121e6a5928fbd6819f - languageName: node - linkType: hard - -"@types/minimist@npm:^1.2.0": - version: 1.2.2 - resolution: "@types/minimist@npm:1.2.2" - checksum: b8da83c66eb4aac0440e64674b19564d9d86c80ae273144db9681e5eeff66f238ade9515f5006ffbfa955ceff8b89ad2bd8ec577d7caee74ba101431fb07045d - languageName: node - linkType: hard - -"@types/node@npm:*": - version: 18.15.11 - resolution: "@types/node@npm:18.15.11" - checksum: 977b4ad04708897ff0eb049ecf82246d210939c82461922d20f7d2dcfd81bbc661582ba3af28869210f7e8b1934529dcd46bff7d448551400f9d48b9d3bddec3 - languageName: node - linkType: hard - -"@types/normalize-package-data@npm:^2.4.0": - version: 2.4.1 - resolution: "@types/normalize-package-data@npm:2.4.1" - checksum: e87bccbf11f95035c89a132b52b79ce69a1e3652fe55962363063c9c0dae0fe2477ebc585e03a9652adc6f381d24ba5589cc5e51849df4ced3d3e004a7d40ed5 - languageName: node - linkType: hard - -"JSONStream@npm:^1.0.4": - version: 1.3.5 - resolution: "JSONStream@npm:1.3.5" - dependencies: - jsonparse: ^1.2.0 - through: ">=2.2.7 <3" - bin: - JSONStream: ./bin.js - checksum: 2605fa124260c61bad38bb65eba30d2f72216a78e94d0ab19b11b4e0327d572b8d530c0c9cc3b0764f727ad26d39e00bf7ebad57781ca6368394d73169c59e46 - languageName: node - linkType: hard - -"acorn-walk@npm:^8.1.1": - version: 8.2.0 - resolution: "acorn-walk@npm:8.2.0" - checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1 - languageName: node - linkType: hard - -"acorn@npm:^8.4.1": - version: 8.8.2 - resolution: "acorn@npm:8.8.2" - bin: - acorn: bin/acorn - checksum: f790b99a1bf63ef160c967e23c46feea7787e531292bb827126334612c234ed489a0dc2c7ba33156416f0ffa8d25bf2b0fdb7f35c2ba60eb3e960572bece4001 - languageName: node - linkType: hard - -"ajv@npm:^8.11.0": - version: 8.12.0 - resolution: "ajv@npm:8.12.0" - dependencies: - fast-deep-equal: ^3.1.1 - json-schema-traverse: ^1.0.0 - require-from-string: ^2.0.2 - uri-js: ^4.2.2 - checksum: 4dc13714e316e67537c8b31bc063f99a1d9d9a497eb4bbd55191ac0dcd5e4985bbb71570352ad6f1e76684fb6d790928f96ba3b2d4fd6e10024be9612fe3f001 - languageName: node - linkType: hard - -"ansi-regex@npm:^5.0.1": - version: 5.0.1 - resolution: "ansi-regex@npm:5.0.1" - checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b - languageName: node - linkType: hard - -"ansi-styles@npm:^3.2.1": - version: 3.2.1 - resolution: "ansi-styles@npm:3.2.1" - dependencies: - color-convert: ^1.9.0 - checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 - languageName: node - linkType: hard - -"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": - version: 4.3.0 - resolution: "ansi-styles@npm:4.3.0" - dependencies: - color-convert: ^2.0.1 - checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 - languageName: node - linkType: hard - -"antlr4ts@npm:^0.5.0-alpha.4": - version: 0.5.0-dev - resolution: "antlr4ts@npm:0.5.0-dev" - dependencies: - source-map-support: ^0.5.16 - checksum: 640dae2229124372b0329315e9614ae983bb80b1af237d8c0b3e90a2d85fb534e851c51d65d1897c92b36d27851d041ad8d95aab44af19cf7355b3ad11a3ddbf - languageName: node - linkType: hard - -"arg@npm:^4.1.0": - version: 4.1.3 - resolution: "arg@npm:4.1.3" - checksum: 544af8dd3f60546d3e4aff084d451b96961d2267d668670199692f8d054f0415d86fc5497d0e641e91546f0aa920e7c29e5250e99fc89f5552a34b5d93b77f43 - languageName: node - linkType: hard - -"argparse@npm:^2.0.1": - version: 2.0.1 - resolution: "argparse@npm:2.0.1" - checksum: 83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced - languageName: node - linkType: hard - -"array-ify@npm:^1.0.0": - version: 1.0.0 - resolution: "array-ify@npm:1.0.0" - checksum: c0502015b319c93dd4484f18036bcc4b654eb76a4aa1f04afbcef11ac918859bb1f5d71ba1f0f1141770db9eef1a4f40f1761753650873068010bbf7bcdae4a4 - languageName: node - linkType: hard - -"arrify@npm:^1.0.1": - version: 1.0.1 - resolution: "arrify@npm:1.0.1" - checksum: 745075dd4a4624ff0225c331dacb99be501a515d39bcb7c84d24660314a6ec28e68131b137e6f7e16318170842ce97538cd298fc4cd6b2cc798e0b957f2747e7 - languageName: node - linkType: hard - -"buffer-from@npm:^1.0.0": - version: 1.1.2 - resolution: "buffer-from@npm:1.1.2" - checksum: 0448524a562b37d4d7ed9efd91685a5b77a50672c556ea254ac9a6d30e3403a517d8981f10e565db24e8339413b43c97ca2951f10e399c6125a0d8911f5679bb - languageName: node - linkType: hard - -"callsites@npm:^3.0.0": - version: 3.1.0 - resolution: "callsites@npm:3.1.0" - checksum: 072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 - languageName: node - linkType: hard - -"camelcase-keys@npm:^6.2.2": - version: 6.2.2 - resolution: "camelcase-keys@npm:6.2.2" - dependencies: - camelcase: ^5.3.1 - map-obj: ^4.0.0 - quick-lru: ^4.0.1 - checksum: 43c9af1adf840471e54c68ab3e5fe8a62719a6b7dbf4e2e86886b7b0ff96112c945736342b837bd2529ec9d1c7d1934e5653318478d98e0cf22c475c04658e2a - languageName: node - linkType: hard - -"camelcase@npm:^5.3.1": - version: 5.3.1 - resolution: "camelcase@npm:5.3.1" - checksum: e6effce26b9404e3c0f301498184f243811c30dfe6d0b9051863bd8e4034d09c8c2923794f280d6827e5aa055f6c434115ff97864a16a963366fb35fd673024b - languageName: node - linkType: hard - -"chalk@npm:^2.0.0": - version: 2.4.2 - resolution: "chalk@npm:2.4.2" - dependencies: - ansi-styles: ^3.2.1 - escape-string-regexp: ^1.0.5 - supports-color: ^5.3.0 - checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 - languageName: node - linkType: hard - -"chalk@npm:^4.1.0": - version: 4.1.2 - resolution: "chalk@npm:4.1.2" - dependencies: - ansi-styles: ^4.1.0 - supports-color: ^7.1.0 - checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc - languageName: node - linkType: hard - -"cliui@npm:^8.0.1": - version: 8.0.1 - resolution: "cliui@npm:8.0.1" - dependencies: - string-width: ^4.2.0 - strip-ansi: ^6.0.1 - wrap-ansi: ^7.0.0 - checksum: 79648b3b0045f2e285b76fb2e24e207c6db44323581e421c3acbd0e86454cba1b37aea976ab50195a49e7384b871e6dfb2247ad7dec53c02454ac6497394cb56 - languageName: node - linkType: hard - -"color-convert@npm:^1.9.0": - version: 1.9.3 - resolution: "color-convert@npm:1.9.3" - dependencies: - color-name: 1.1.3 - checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 - languageName: node - linkType: hard - -"color-convert@npm:^2.0.1": - version: 2.0.1 - resolution: "color-convert@npm:2.0.1" - dependencies: - color-name: ~1.1.4 - checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 - languageName: node - linkType: hard - -"color-name@npm:1.1.3": - version: 1.1.3 - resolution: "color-name@npm:1.1.3" - checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d - languageName: node - linkType: hard - -"color-name@npm:~1.1.4": - version: 1.1.4 - resolution: "color-name@npm:1.1.4" - checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 - languageName: node - linkType: hard - -"compare-func@npm:^2.0.0": - version: 2.0.0 - resolution: "compare-func@npm:2.0.0" - dependencies: - array-ify: ^1.0.0 - dot-prop: ^5.1.0 - checksum: fb71d70632baa1e93283cf9d80f30ac97f003aabee026e0b4426c9716678079ef5fea7519b84d012cbed938c476493866a38a79760564a9e21ae9433e40e6f0d - languageName: node - linkType: hard - -"conventional-changelog-angular@npm:^5.0.11": - version: 5.0.13 - resolution: "conventional-changelog-angular@npm:5.0.13" - dependencies: - compare-func: ^2.0.0 - q: ^1.5.1 - checksum: 6ed4972fce25a50f9f038c749cc9db501363131b0fb2efc1fccecba14e4b1c80651d0d758d4c350a609f32010c66fa343eefd49c02e79e911884be28f53f3f90 - languageName: node - linkType: hard - -"conventional-changelog-conventionalcommits@npm:^5.0.0": - version: 5.0.0 - resolution: "conventional-changelog-conventionalcommits@npm:5.0.0" - dependencies: - compare-func: ^2.0.0 - lodash: ^4.17.15 - q: ^1.5.1 - checksum: b67d12e4e0fdde5baa32c3d77af472de38646a18657b26f5543eecce041a318103092fbfcef247e2319a16957c9ac78c6ea78acc11a5db6acf74be79a28c561f - languageName: node - linkType: hard - -"conventional-commits-parser@npm:^3.2.2": - version: 3.2.4 - resolution: "conventional-commits-parser@npm:3.2.4" - dependencies: - JSONStream: ^1.0.4 - is-text-path: ^1.0.1 - lodash: ^4.17.15 - meow: ^8.0.0 - split2: ^3.0.0 - through2: ^4.0.0 - bin: - conventional-commits-parser: cli.js - checksum: 1627ff203bc9586d89e47a7fe63acecf339aba74903b9114e23d28094f79d4e2d6389bf146ae561461dcba8fc42e7bc228165d2b173f15756c43f1d32bc50bfd - languageName: node - linkType: hard - -"cosmiconfig-typescript-loader@npm:^4.0.0": - version: 4.3.0 - resolution: "cosmiconfig-typescript-loader@npm:4.3.0" - peerDependencies: - "@types/node": "*" - cosmiconfig: ">=7" - ts-node: ">=10" - typescript: ">=3" - checksum: ea61dfd8e112cf2bb18df0ef89280bd3ae3dd5b997b4a9fc22bbabdc02513aadfbc6d4e15e922b6a9a5d987e9dad42286fa38caf77a9b8dcdbe7d4ce1c9db4fb - languageName: node - linkType: hard - -"cosmiconfig@npm:^8.0.0": - version: 8.1.3 - resolution: "cosmiconfig@npm:8.1.3" - dependencies: - import-fresh: ^3.2.1 - js-yaml: ^4.1.0 - parse-json: ^5.0.0 - path-type: ^4.0.0 - checksum: b3d277bc3a8a9e649bf4c3fc9740f4c52bf07387481302aa79839f595045368903bf26ea24a8f7f7b8b180bf46037b027c5cb63b1391ab099f3f78814a147b2b - languageName: node - linkType: hard - -"create-require@npm:^1.1.0": - version: 1.1.1 - resolution: "create-require@npm:1.1.1" - checksum: a9a1503d4390d8b59ad86f4607de7870b39cad43d929813599a23714831e81c520bddf61bcdd1f8e30f05fd3a2b71ae8538e946eb2786dc65c2bbc520f692eff - languageName: node - linkType: hard - -"cross-spawn@npm:^7.0.3": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" - dependencies: - path-key: ^3.1.0 - shebang-command: ^2.0.0 - which: ^2.0.1 - checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 - languageName: node - linkType: hard - -"dargs@npm:^7.0.0": - version: 7.0.0 - resolution: "dargs@npm:7.0.0" - checksum: b8f1e3cba59c42e1f13a114ad4848c3fc1cf7470f633ee9e9f1043762429bc97d91ae31b826fb135eefde203a3fdb20deb0c0a0222ac29d937b8046085d668d1 - languageName: node - linkType: hard - -"decamelize-keys@npm:^1.1.0": - version: 1.1.1 - resolution: "decamelize-keys@npm:1.1.1" - dependencies: - decamelize: ^1.1.0 - map-obj: ^1.0.0 - checksum: fc645fe20b7bda2680bbf9481a3477257a7f9304b1691036092b97ab04c0ab53e3bf9fcc2d2ae382536568e402ec41fb11e1d4c3836a9abe2d813dd9ef4311e0 - languageName: node - linkType: hard - -"decamelize@npm:^1.1.0": - version: 1.2.0 - resolution: "decamelize@npm:1.2.0" - checksum: ad8c51a7e7e0720c70ec2eeb1163b66da03e7616d7b98c9ef43cce2416395e84c1e9548dd94f5f6ffecfee9f8b94251fc57121a8b021f2ff2469b2bae247b8aa - languageName: node - linkType: hard - -"diff@npm:^4.0.1": - version: 4.0.2 - resolution: "diff@npm:4.0.2" - checksum: f2c09b0ce4e6b301c221addd83bf3f454c0bc00caa3dd837cf6c127d6edf7223aa2bbe3b688feea110b7f262adbfc845b757c44c8a9f8c0c5b15d8fa9ce9d20d - languageName: node - linkType: hard - -"dot-prop@npm:^5.1.0": - version: 5.3.0 - resolution: "dot-prop@npm:5.3.0" - dependencies: - is-obj: ^2.0.0 - checksum: d5775790093c234ef4bfd5fbe40884ff7e6c87573e5339432870616331189f7f5d86575c5b5af2dcf0f61172990f4f734d07844b1f23482fff09e3c4bead05ea - languageName: node - linkType: hard - -"emoji-regex@npm:^8.0.0": - version: 8.0.0 - resolution: "emoji-regex@npm:8.0.0" - checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 - languageName: node - linkType: hard - -"error-ex@npm:^1.3.1": - version: 1.3.2 - resolution: "error-ex@npm:1.3.2" - dependencies: - is-arrayish: ^0.2.1 - checksum: c1c2b8b65f9c91b0f9d75f0debaa7ec5b35c266c2cac5de412c1a6de86d4cbae04ae44e510378cb14d032d0645a36925d0186f8bb7367bcc629db256b743a001 - languageName: node - linkType: hard - -"escalade@npm:^3.1.1": - version: 3.1.1 - resolution: "escalade@npm:3.1.1" - checksum: a3e2a99f07acb74b3ad4989c48ca0c3140f69f923e56d0cba0526240ee470b91010f9d39001f2a4a313841d237ede70a729e92125191ba5d21e74b106800b133 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^1.0.5": - version: 1.0.5 - resolution: "escape-string-regexp@npm:1.0.5" - checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 - languageName: node - linkType: hard - -"execa@npm:^5.0.0": - version: 5.1.1 - resolution: "execa@npm:5.1.1" - dependencies: - cross-spawn: ^7.0.3 - get-stream: ^6.0.0 - human-signals: ^2.1.0 - is-stream: ^2.0.0 - merge-stream: ^2.0.0 - npm-run-path: ^4.0.1 - onetime: ^5.1.2 - signal-exit: ^3.0.3 - strip-final-newline: ^2.0.0 - checksum: fba9022c8c8c15ed862847e94c252b3d946036d7547af310e344a527e59021fd8b6bb0723883ea87044dc4f0201f949046993124a42ccb0855cae5bf8c786343 - languageName: node - linkType: hard - -"fast-deep-equal@npm:^3.1.1": - version: 3.1.3 - resolution: "fast-deep-equal@npm:3.1.3" - checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d - languageName: node - linkType: hard - -"find-up@npm:^4.1.0": - version: 4.1.0 - resolution: "find-up@npm:4.1.0" - dependencies: - locate-path: ^5.0.0 - path-exists: ^4.0.0 - checksum: 4c172680e8f8c1f78839486e14a43ef82e9decd0e74145f40707cc42e7420506d5ec92d9a11c22bd2c48fb0c384ea05dd30e10dd152fefeec6f2f75282a8b844 - languageName: node - linkType: hard - -"find-up@npm:^5.0.0": - version: 5.0.0 - resolution: "find-up@npm:5.0.0" - dependencies: - locate-path: ^6.0.0 - path-exists: ^4.0.0 - checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 - languageName: node - linkType: hard - -"fs-extra@npm:^11.0.0": - version: 11.1.1 - resolution: "fs-extra@npm:11.1.1" - dependencies: - graceful-fs: ^4.2.0 - jsonfile: ^6.0.1 - universalify: ^2.0.0 - checksum: fb883c68245b2d777fbc1f2082c9efb084eaa2bbf9fddaa366130d196c03608eebef7fb490541276429ee1ca99f317e2d73e96f5ca0999eefedf5a624ae1edfd - languageName: node - linkType: hard - -"function-bind@npm:^1.1.1": - version: 1.1.1 - resolution: "function-bind@npm:1.1.1" - checksum: b32fbaebb3f8ec4969f033073b43f5c8befbb58f1a79e12f1d7490358150359ebd92f49e72ff0144f65f2c48ea2a605bff2d07965f548f6474fd8efd95bf361a - languageName: node - linkType: hard - -"get-caller-file@npm:^2.0.5": - version: 2.0.5 - resolution: "get-caller-file@npm:2.0.5" - checksum: b9769a836d2a98c3ee734a88ba712e62703f1df31b94b784762c433c27a386dd6029ff55c2a920c392e33657d80191edbf18c61487e198844844516f843496b9 - languageName: node - linkType: hard - -"get-stream@npm:^6.0.0": - version: 6.0.1 - resolution: "get-stream@npm:6.0.1" - checksum: e04ecece32c92eebf5b8c940f51468cd53554dcbb0ea725b2748be583c9523d00128137966afce410b9b051eb2ef16d657cd2b120ca8edafcf5a65e81af63cad - languageName: node - linkType: hard - -"git-raw-commits@npm:^2.0.11": - version: 2.0.11 - resolution: "git-raw-commits@npm:2.0.11" - dependencies: - dargs: ^7.0.0 - lodash: ^4.17.15 - meow: ^8.0.0 - split2: ^3.0.0 - through2: ^4.0.0 - bin: - git-raw-commits: cli.js - checksum: c178af43633684106179793b6e3473e1d2bb50bb41d04e2e285ea4eef342ca4090fee6bc8a737552fde879d22346c90de5c49f18c719a0f38d4c934f258a0f79 - languageName: node - linkType: hard - -"global-dirs@npm:^0.1.1": - version: 0.1.1 - resolution: "global-dirs@npm:0.1.1" - dependencies: - ini: ^1.3.4 - checksum: 10624f5a8ddb8634c22804c6b24f93fb591c3639a6bc78e3584e01a238fc6f7b7965824184e57d63f6df36980b6c191484ad7bc6c35a1599b8f1d64be64c2a4a - languageName: node - linkType: hard - -"graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0": - version: 4.2.11 - resolution: "graceful-fs@npm:4.2.11" - checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 - languageName: node - linkType: hard - -"hard-rejection@npm:^2.1.0": - version: 2.1.0 - resolution: "hard-rejection@npm:2.1.0" - checksum: 7baaf80a0c7fff4ca79687b4060113f1529589852152fa935e6787a2bc96211e784ad4588fb3048136ff8ffc9dfcf3ae385314a5b24db32de20bea0d1597f9dc - languageName: node - linkType: hard - -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b - languageName: node - linkType: hard - -"has-flag@npm:^4.0.0": - version: 4.0.0 - resolution: "has-flag@npm:4.0.0" - checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad - languageName: node - linkType: hard - -"has@npm:^1.0.3": - version: 1.0.3 - resolution: "has@npm:1.0.3" - dependencies: - function-bind: ^1.1.1 - checksum: b9ad53d53be4af90ce5d1c38331e712522417d017d5ef1ebd0507e07c2fbad8686fffb8e12ddecd4c39ca9b9b47431afbb975b8abf7f3c3b82c98e9aad052792 - languageName: node - linkType: hard - -"hashi@workspace:.": - version: 0.0.0-use.local - resolution: "hashi@workspace:." - dependencies: - "@commitlint/cli": ^17.5.1 - "@commitlint/config-conventional": ^17.4.4 - husky: ^8.0.3 - prettier: ^2.8.7 - prettier-plugin-solidity: ^1.0.0 - languageName: unknown - linkType: soft - -"hosted-git-info@npm:^2.1.4": - version: 2.8.9 - resolution: "hosted-git-info@npm:2.8.9" - checksum: c955394bdab888a1e9bb10eb33029e0f7ce5a2ac7b3f158099dc8c486c99e73809dca609f5694b223920ca2174db33d32b12f9a2a47141dc59607c29da5a62dd - languageName: node - linkType: hard - -"hosted-git-info@npm:^4.0.1": - version: 4.1.0 - resolution: "hosted-git-info@npm:4.1.0" - dependencies: - lru-cache: ^6.0.0 - checksum: c3f87b3c2f7eb8c2748c8f49c0c2517c9a95f35d26f4bf54b2a8cba05d2e668f3753548b6ea366b18ec8dadb4e12066e19fa382a01496b0ffa0497eb23cbe461 - languageName: node - linkType: hard - -"human-signals@npm:^2.1.0": - version: 2.1.0 - resolution: "human-signals@npm:2.1.0" - checksum: b87fd89fce72391625271454e70f67fe405277415b48bcc0117ca73d31fa23a4241787afdc8d67f5a116cf37258c052f59ea82daffa72364d61351423848e3b8 - languageName: node - linkType: hard - -"husky@npm:^8.0.3": - version: 8.0.3 - resolution: "husky@npm:8.0.3" - bin: - husky: lib/bin.js - checksum: 837bc7e4413e58c1f2946d38fb050f5d7324c6f16b0fd66411ffce5703b294bd21429e8ba58711cd331951ee86ed529c5be4f76805959ff668a337dbfa82a1b0 - languageName: node - linkType: hard - -"import-fresh@npm:^3.0.0, import-fresh@npm:^3.2.1": - version: 3.3.0 - resolution: "import-fresh@npm:3.3.0" - dependencies: - parent-module: ^1.0.0 - resolve-from: ^4.0.0 - checksum: 2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa - languageName: node - linkType: hard - -"indent-string@npm:^4.0.0": - version: 4.0.0 - resolution: "indent-string@npm:4.0.0" - checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 - languageName: node - linkType: hard - -"inherits@npm:^2.0.3": - version: 2.0.4 - resolution: "inherits@npm:2.0.4" - checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 - languageName: node - linkType: hard - -"ini@npm:^1.3.4": - version: 1.3.8 - resolution: "ini@npm:1.3.8" - checksum: dfd98b0ca3a4fc1e323e38a6c8eb8936e31a97a918d3b377649ea15bdb15d481207a0dda1021efbd86b464cae29a0d33c1d7dcaf6c5672bee17fa849bc50a1b3 - languageName: node - linkType: hard - -"is-arrayish@npm:^0.2.1": - version: 0.2.1 - resolution: "is-arrayish@npm:0.2.1" - checksum: eef4417e3c10e60e2c810b6084942b3ead455af16c4509959a27e490e7aee87cfb3f38e01bbde92220b528a0ee1a18d52b787e1458ee86174d8c7f0e58cd488f - languageName: node - linkType: hard - -"is-core-module@npm:^2.5.0, is-core-module@npm:^2.9.0": - version: 2.11.0 - resolution: "is-core-module@npm:2.11.0" - dependencies: - has: ^1.0.3 - checksum: f96fd490c6b48eb4f6d10ba815c6ef13f410b0ba6f7eb8577af51697de523e5f2cd9de1c441b51d27251bf0e4aebc936545e33a5d26d5d51f28d25698d4a8bab - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^3.0.0": - version: 3.0.0 - resolution: "is-fullwidth-code-point@npm:3.0.0" - checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 - languageName: node - linkType: hard - -"is-obj@npm:^2.0.0": - version: 2.0.0 - resolution: "is-obj@npm:2.0.0" - checksum: c9916ac8f4621962a42f5e80e7ffdb1d79a3fab7456ceaeea394cd9e0858d04f985a9ace45be44433bf605673c8be8810540fe4cc7f4266fc7526ced95af5a08 - languageName: node - linkType: hard - -"is-plain-obj@npm:^1.1.0": - version: 1.1.0 - resolution: "is-plain-obj@npm:1.1.0" - checksum: 0ee04807797aad50859652a7467481816cbb57e5cc97d813a7dcd8915da8195dc68c436010bf39d195226cde6a2d352f4b815f16f26b7bf486a5754290629931 - languageName: node - linkType: hard - -"is-stream@npm:^2.0.0": - version: 2.0.1 - resolution: "is-stream@npm:2.0.1" - checksum: b8e05ccdf96ac330ea83c12450304d4a591f9958c11fd17bed240af8d5ffe08aedafa4c0f4cfccd4d28dc9d4d129daca1023633d5c11601a6cbc77521f6fae66 - languageName: node - linkType: hard - -"is-text-path@npm:^1.0.1": - version: 1.0.1 - resolution: "is-text-path@npm:1.0.1" - dependencies: - text-extensions: ^1.0.0 - checksum: fb5d78752c22b3f73a7c9540768f765ffcfa38c9e421e2b9af869565307fa1ae5e3d3a2ba016a43549742856846566d327da406e94a5846ec838a288b1704fd2 - languageName: node - linkType: hard - -"isexe@npm:^2.0.0": - version: 2.0.0 - resolution: "isexe@npm:2.0.0" - checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 - languageName: node - linkType: hard - -"js-tokens@npm:^4.0.0": - version: 4.0.0 - resolution: "js-tokens@npm:4.0.0" - checksum: 8a95213a5a77deb6cbe94d86340e8d9ace2b93bc367790b260101d2f36a2eaf4e4e22d9fa9cf459b38af3a32fb4190e638024cf82ec95ef708680e405ea7cc78 - languageName: node - linkType: hard - -"js-yaml@npm:^4.1.0": - version: 4.1.0 - resolution: "js-yaml@npm:4.1.0" - dependencies: - argparse: ^2.0.1 - bin: - js-yaml: bin/js-yaml.js - checksum: c7830dfd456c3ef2c6e355cc5a92e6700ceafa1d14bba54497b34a99f0376cecbb3e9ac14d3e5849b426d5a5140709a66237a8c991c675431271c4ce5504151a - languageName: node - linkType: hard - -"json-parse-even-better-errors@npm:^2.3.0": - version: 2.3.1 - resolution: "json-parse-even-better-errors@npm:2.3.1" - checksum: 798ed4cf3354a2d9ccd78e86d2169515a0097a5c133337807cdf7f1fc32e1391d207ccfc276518cc1d7d8d4db93288b8a50ba4293d212ad1336e52a8ec0a941f - languageName: node - linkType: hard - -"json-schema-traverse@npm:^1.0.0": - version: 1.0.0 - resolution: "json-schema-traverse@npm:1.0.0" - checksum: 02f2f466cdb0362558b2f1fd5e15cce82ef55d60cd7f8fa828cf35ba74330f8d767fcae5c5c2adb7851fa811766c694b9405810879bc4e1ddd78a7c0e03658ad - languageName: node - linkType: hard - -"jsonfile@npm:^6.0.1": - version: 6.1.0 - resolution: "jsonfile@npm:6.1.0" - dependencies: - graceful-fs: ^4.1.6 - universalify: ^2.0.0 - dependenciesMeta: - graceful-fs: - optional: true - checksum: 7af3b8e1ac8fe7f1eccc6263c6ca14e1966fcbc74b618d3c78a0a2075579487547b94f72b7a1114e844a1e15bb00d440e5d1720bfc4612d790a6f285d5ea8354 - languageName: node - linkType: hard - -"jsonparse@npm:^1.2.0": - version: 1.3.1 - resolution: "jsonparse@npm:1.3.1" - checksum: 6514a7be4674ebf407afca0eda3ba284b69b07f9958a8d3113ef1005f7ec610860c312be067e450c569aab8b89635e332cee3696789c750692bb60daba627f4d - languageName: node - linkType: hard - -"kind-of@npm:^6.0.3": - version: 6.0.3 - resolution: "kind-of@npm:6.0.3" - checksum: 3ab01e7b1d440b22fe4c31f23d8d38b4d9b91d9f291df683476576493d5dfd2e03848a8b05813dd0c3f0e835bc63f433007ddeceb71f05cb25c45ae1b19c6d3b - languageName: node - linkType: hard - -"lines-and-columns@npm:^1.1.6": - version: 1.2.4 - resolution: "lines-and-columns@npm:1.2.4" - checksum: 0c37f9f7fa212b38912b7145e1cd16a5f3cd34d782441c3e6ca653485d326f58b3caccda66efce1c5812bde4961bbde3374fae4b0d11bf1226152337f3894aa5 - languageName: node - linkType: hard - -"locate-path@npm:^5.0.0": - version: 5.0.0 - resolution: "locate-path@npm:5.0.0" - dependencies: - p-locate: ^4.1.0 - checksum: 83e51725e67517287d73e1ded92b28602e3ae5580b301fe54bfb76c0c723e3f285b19252e375712316774cf52006cb236aed5704692c32db0d5d089b69696e30 - languageName: node - linkType: hard - -"locate-path@npm:^6.0.0": - version: 6.0.0 - resolution: "locate-path@npm:6.0.0" - dependencies: - p-locate: ^5.0.0 - checksum: 72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a - languageName: node - linkType: hard - -"lodash.camelcase@npm:^4.3.0": - version: 4.3.0 - resolution: "lodash.camelcase@npm:4.3.0" - checksum: cb9227612f71b83e42de93eccf1232feeb25e705bdb19ba26c04f91e885bfd3dd5c517c4a97137658190581d3493ea3973072ca010aab7e301046d90740393d1 - languageName: node - linkType: hard - -"lodash.isfunction@npm:^3.0.9": - version: 3.0.9 - resolution: "lodash.isfunction@npm:3.0.9" - checksum: 99e54c34b1e8a9ba75c034deb39cedbd2aca7af685815e67a2a8ec4f73ec9748cda6ebee5a07d7de4b938e90d421fd280e9c385cc190f903ac217ac8aff30314 - languageName: node - linkType: hard - -"lodash.isplainobject@npm:^4.0.6": - version: 4.0.6 - resolution: "lodash.isplainobject@npm:4.0.6" - checksum: 29c6351f281e0d9a1d58f1a4c8f4400924b4c79f18dfc4613624d7d54784df07efaff97c1ff2659f3e085ecf4fff493300adc4837553104cef2634110b0d5337 - languageName: node - linkType: hard - -"lodash.kebabcase@npm:^4.1.1": - version: 4.1.1 - resolution: "lodash.kebabcase@npm:4.1.1" - checksum: 5a6c59161914e1bae23438a298c7433e83d935e0f59853fa862e691164696bc07f6dfa4c313d499fbf41ba8d53314e9850416502376705a357d24ee6ca33af78 - languageName: node - linkType: hard - -"lodash.merge@npm:^4.6.2": - version: 4.6.2 - resolution: "lodash.merge@npm:4.6.2" - checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005 - languageName: node - linkType: hard - -"lodash.mergewith@npm:^4.6.2": - version: 4.6.2 - resolution: "lodash.mergewith@npm:4.6.2" - checksum: a6db2a9339752411f21b956908c404ec1e088e783a65c8b29e30ae5b3b6384f82517662d6f425cc97c2070b546cc2c7daaa8d33f78db7b6e9be06cd834abdeb8 - languageName: node - linkType: hard - -"lodash.snakecase@npm:^4.1.1": - version: 4.1.1 - resolution: "lodash.snakecase@npm:4.1.1" - checksum: 1685ed3e83dda6eae5a4dcaee161a51cd210aabb3e1c09c57150e7dd8feda19e4ca0d27d0631eabe8d0f4eaa51e376da64e8c018ae5415417c5890d42feb72a8 - languageName: node - linkType: hard - -"lodash.startcase@npm:^4.4.0": - version: 4.4.0 - resolution: "lodash.startcase@npm:4.4.0" - checksum: c03a4a784aca653845fe09d0ef67c902b6e49288dc45f542a4ab345a9c406a6dc194c774423fa313ee7b06283950301c1221dd2a1d8ecb2dac8dfbb9ed5606b5 - languageName: node - linkType: hard - -"lodash.uniq@npm:^4.5.0": - version: 4.5.0 - resolution: "lodash.uniq@npm:4.5.0" - checksum: a4779b57a8d0f3c441af13d9afe7ecff22dd1b8ce1129849f71d9bbc8e8ee4e46dfb4b7c28f7ad3d67481edd6e51126e4e2a6ee276e25906d10f7140187c392d - languageName: node - linkType: hard - -"lodash.upperfirst@npm:^4.3.1": - version: 4.3.1 - resolution: "lodash.upperfirst@npm:4.3.1" - checksum: cadec6955900afe1928cc60cdc4923a79c2ef991e42665419cc81630ed9b4f952a1093b222e0141ab31cbc4dba549f97ec28ff67929d71e01861c97188a5fa83 - languageName: node - linkType: hard - -"lodash@npm:^4.17.15": - version: 4.17.21 - resolution: "lodash@npm:4.17.21" - checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 - languageName: node - linkType: hard - -"lru-cache@npm:^6.0.0": - version: 6.0.0 - resolution: "lru-cache@npm:6.0.0" - dependencies: - yallist: ^4.0.0 - checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 - languageName: node - linkType: hard - -"make-error@npm:^1.1.1": - version: 1.3.6 - resolution: "make-error@npm:1.3.6" - checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 - languageName: node - linkType: hard - -"map-obj@npm:^1.0.0": - version: 1.0.1 - resolution: "map-obj@npm:1.0.1" - checksum: 9949e7baec2a336e63b8d4dc71018c117c3ce6e39d2451ccbfd3b8350c547c4f6af331a4cbe1c83193d7c6b786082b6256bde843db90cb7da2a21e8fcc28afed - languageName: node - linkType: hard - -"map-obj@npm:^4.0.0": - version: 4.3.0 - resolution: "map-obj@npm:4.3.0" - checksum: fbc554934d1a27a1910e842bc87b177b1a556609dd803747c85ece420692380827c6ae94a95cce4407c054fa0964be3bf8226f7f2cb2e9eeee432c7c1985684e - languageName: node - linkType: hard - -"meow@npm:^8.0.0": - version: 8.1.2 - resolution: "meow@npm:8.1.2" - dependencies: - "@types/minimist": ^1.2.0 - camelcase-keys: ^6.2.2 - decamelize-keys: ^1.1.0 - hard-rejection: ^2.1.0 - minimist-options: 4.1.0 - normalize-package-data: ^3.0.0 - read-pkg-up: ^7.0.1 - redent: ^3.0.0 - trim-newlines: ^3.0.0 - type-fest: ^0.18.0 - yargs-parser: ^20.2.3 - checksum: bc23bf1b4423ef6a821dff9734406bce4b91ea257e7f10a8b7f896f45b59649f07adc0926e2917eacd8cf1df9e4cd89c77623cf63dfd0f8bf54de07a32ee5a85 - languageName: node - linkType: hard - -"merge-stream@npm:^2.0.0": - version: 2.0.0 - resolution: "merge-stream@npm:2.0.0" - checksum: 6fa4dcc8d86629705cea944a4b88ef4cb0e07656ebf223fa287443256414283dd25d91c1cd84c77987f2aec5927af1a9db6085757cb43d90eb170ebf4b47f4f4 - languageName: node - linkType: hard - -"mimic-fn@npm:^2.1.0": - version: 2.1.0 - resolution: "mimic-fn@npm:2.1.0" - checksum: d2421a3444848ce7f84bd49115ddacff29c15745db73f54041edc906c14b131a38d05298dae3081667627a59b2eb1ca4b436ff2e1b80f69679522410418b478a - languageName: node - linkType: hard - -"min-indent@npm:^1.0.0": - version: 1.0.1 - resolution: "min-indent@npm:1.0.1" - checksum: bfc6dd03c5eaf623a4963ebd94d087f6f4bbbfd8c41329a7f09706b0cb66969c4ddd336abeb587bc44bc6f08e13bf90f0b374f9d71f9f01e04adc2cd6f083ef1 - languageName: node - linkType: hard - -"minimist-options@npm:4.1.0": - version: 4.1.0 - resolution: "minimist-options@npm:4.1.0" - dependencies: - arrify: ^1.0.1 - is-plain-obj: ^1.1.0 - kind-of: ^6.0.3 - checksum: 8c040b3068811e79de1140ca2b708d3e203c8003eb9a414c1ab3cd467fc5f17c9ca02a5aef23bedc51a7f8bfbe77f87e9a7e31ec81fba304cda675b019496f4e - languageName: node - linkType: hard - -"minimist@npm:^1.2.6": - version: 1.2.8 - resolution: "minimist@npm:1.2.8" - checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0 - languageName: node - linkType: hard - -"normalize-package-data@npm:^2.5.0": - version: 2.5.0 - resolution: "normalize-package-data@npm:2.5.0" - dependencies: - hosted-git-info: ^2.1.4 - resolve: ^1.10.0 - semver: 2 || 3 || 4 || 5 - validate-npm-package-license: ^3.0.1 - checksum: 7999112efc35a6259bc22db460540cae06564aa65d0271e3bdfa86876d08b0e578b7b5b0028ee61b23f1cae9fc0e7847e4edc0948d3068a39a2a82853efc8499 - languageName: node - linkType: hard - -"normalize-package-data@npm:^3.0.0": - version: 3.0.3 - resolution: "normalize-package-data@npm:3.0.3" - dependencies: - hosted-git-info: ^4.0.1 - is-core-module: ^2.5.0 - semver: ^7.3.4 - validate-npm-package-license: ^3.0.1 - checksum: bbcee00339e7c26fdbc760f9b66d429258e2ceca41a5df41f5df06cc7652de8d82e8679ff188ca095cad8eff2b6118d7d866af2b68400f74602fbcbce39c160a - languageName: node - linkType: hard - -"npm-run-path@npm:^4.0.1": - version: 4.0.1 - resolution: "npm-run-path@npm:4.0.1" - dependencies: - path-key: ^3.0.0 - checksum: 5374c0cea4b0bbfdfae62da7bbdf1e1558d338335f4cacf2515c282ff358ff27b2ecb91ffa5330a8b14390ac66a1e146e10700440c1ab868208430f56b5f4d23 - languageName: node - linkType: hard - -"onetime@npm:^5.1.2": - version: 5.1.2 - resolution: "onetime@npm:5.1.2" - dependencies: - mimic-fn: ^2.1.0 - checksum: 2478859ef817fc5d4e9c2f9e5728512ddd1dbc9fb7829ad263765bb6d3b91ce699d6e2332eef6b7dff183c2f490bd3349f1666427eaba4469fba0ac38dfd0d34 - languageName: node - linkType: hard - -"p-limit@npm:^2.2.0": - version: 2.3.0 - resolution: "p-limit@npm:2.3.0" - dependencies: - p-try: ^2.0.0 - checksum: 84ff17f1a38126c3314e91ecfe56aecbf36430940e2873dadaa773ffe072dc23b7af8e46d4b6485d302a11673fe94c6b67ca2cfbb60c989848b02100d0594ac1 - languageName: node - linkType: hard - -"p-limit@npm:^3.0.2": - version: 3.1.0 - resolution: "p-limit@npm:3.1.0" - dependencies: - yocto-queue: ^0.1.0 - checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 - languageName: node - linkType: hard - -"p-locate@npm:^4.1.0": - version: 4.1.0 - resolution: "p-locate@npm:4.1.0" - dependencies: - p-limit: ^2.2.0 - checksum: 513bd14a455f5da4ebfcb819ef706c54adb09097703de6aeaa5d26fe5ea16df92b48d1ac45e01e3944ce1e6aa2a66f7f8894742b8c9d6e276e16cd2049a2b870 - languageName: node - linkType: hard - -"p-locate@npm:^5.0.0": - version: 5.0.0 - resolution: "p-locate@npm:5.0.0" - dependencies: - p-limit: ^3.0.2 - checksum: 1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3 - languageName: node - linkType: hard - -"p-try@npm:^2.0.0": - version: 2.2.0 - resolution: "p-try@npm:2.2.0" - checksum: f8a8e9a7693659383f06aec604ad5ead237c7a261c18048a6e1b5b85a5f8a067e469aa24f5bc009b991ea3b058a87f5065ef4176793a200d4917349881216cae - languageName: node - linkType: hard - -"parent-module@npm:^1.0.0": - version: 1.0.1 - resolution: "parent-module@npm:1.0.1" - dependencies: - callsites: ^3.0.0 - checksum: 6ba8b255145cae9470cf5551eb74be2d22281587af787a2626683a6c20fbb464978784661478dd2a3f1dad74d1e802d403e1b03c1a31fab310259eec8ac560ff - languageName: node - linkType: hard - -"parse-json@npm:^5.0.0": - version: 5.2.0 - resolution: "parse-json@npm:5.2.0" - dependencies: - "@babel/code-frame": ^7.0.0 - error-ex: ^1.3.1 - json-parse-even-better-errors: ^2.3.0 - lines-and-columns: ^1.1.6 - checksum: 62085b17d64da57f40f6afc2ac1f4d95def18c4323577e1eced571db75d9ab59b297d1d10582920f84b15985cbfc6b6d450ccbf317644cfa176f3ed982ad87e2 - languageName: node - linkType: hard - -"path-exists@npm:^4.0.0": - version: 4.0.0 - resolution: "path-exists@npm:4.0.0" - checksum: 505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 - languageName: node - linkType: hard - -"path-key@npm:^3.0.0, path-key@npm:^3.1.0": - version: 3.1.1 - resolution: "path-key@npm:3.1.1" - checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 - languageName: node - linkType: hard - -"path-parse@npm:^1.0.7": - version: 1.0.7 - resolution: "path-parse@npm:1.0.7" - checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a - languageName: node - linkType: hard - -"path-type@npm:^4.0.0": - version: 4.0.0 - resolution: "path-type@npm:4.0.0" - checksum: 5b1e2daa247062061325b8fdbfd1fb56dde0a448fb1455453276ea18c60685bdad23a445dc148cf87bc216be1573357509b7d4060494a6fd768c7efad833ee45 - languageName: node - linkType: hard - -"prettier-plugin-solidity@npm:^1.0.0": - version: 1.1.3 - resolution: "prettier-plugin-solidity@npm:1.1.3" - dependencies: - "@solidity-parser/parser": ^0.16.0 - semver: ^7.3.8 - solidity-comments-extractor: ^0.0.7 - peerDependencies: - prettier: ">=2.3.0 || >=3.0.0-alpha.0" - checksum: d5aadfa411a4d983a2bd204048726fd91fbcaffbfa26d818ef0d6001fb65f82d0eae082e935e96c79e65e09ed979b186311ddb8c38be2f0ce5dd5f5265df77fe - languageName: node - linkType: hard - -"prettier@npm:^2.8.7": - version: 2.8.7 - resolution: "prettier@npm:2.8.7" - bin: - prettier: bin-prettier.js - checksum: fdc8f2616f099f5f0d685907f4449a70595a0fc1d081a88919604375989e0d5e9168d6121d8cc6861f21990b31665828e00472544d785d5940ea08a17660c3a6 - languageName: node - linkType: hard - -"punycode@npm:^2.1.0": - version: 2.3.0 - resolution: "punycode@npm:2.3.0" - checksum: 39f760e09a2a3bbfe8f5287cf733ecdad69d6af2fe6f97ca95f24b8921858b91e9ea3c9eeec6e08cede96181b3bb33f95c6ffd8c77e63986508aa2e8159fa200 - languageName: node - linkType: hard - -"q@npm:^1.5.1": - version: 1.5.1 - resolution: "q@npm:1.5.1" - checksum: 147baa93c805bc1200ed698bdf9c72e9e42c05f96d007e33a558b5fdfd63e5ea130e99313f28efc1783e90e6bdb4e48b67a36fcc026b7b09202437ae88a1fb12 - languageName: node - linkType: hard - -"quick-lru@npm:^4.0.1": - version: 4.0.1 - resolution: "quick-lru@npm:4.0.1" - checksum: bea46e1abfaa07023e047d3cf1716a06172c4947886c053ede5c50321893711577cb6119360f810cc3ffcd70c4d7db4069c3cee876b358ceff8596e062bd1154 - languageName: node - linkType: hard - -"read-pkg-up@npm:^7.0.1": - version: 7.0.1 - resolution: "read-pkg-up@npm:7.0.1" - dependencies: - find-up: ^4.1.0 - read-pkg: ^5.2.0 - type-fest: ^0.8.1 - checksum: e4e93ce70e5905b490ca8f883eb9e48b5d3cebc6cd4527c25a0d8f3ae2903bd4121c5ab9c5a3e217ada0141098eeb661313c86fa008524b089b8ed0b7f165e44 - languageName: node - linkType: hard - -"read-pkg@npm:^5.2.0": - version: 5.2.0 - resolution: "read-pkg@npm:5.2.0" - dependencies: - "@types/normalize-package-data": ^2.4.0 - normalize-package-data: ^2.5.0 - parse-json: ^5.0.0 - type-fest: ^0.6.0 - checksum: eb696e60528b29aebe10e499ba93f44991908c57d70f2d26f369e46b8b9afc208ef11b4ba64f67630f31df8b6872129e0a8933c8c53b7b4daf0eace536901222 - languageName: node - linkType: hard - -"readable-stream@npm:3, readable-stream@npm:^3.0.0": - version: 3.6.2 - resolution: "readable-stream@npm:3.6.2" - dependencies: - inherits: ^2.0.3 - string_decoder: ^1.1.1 - util-deprecate: ^1.0.1 - checksum: bdcbe6c22e846b6af075e32cf8f4751c2576238c5043169a1c221c92ee2878458a816a4ea33f4c67623c0b6827c8a400409bfb3cf0bf3381392d0b1dfb52ac8d - languageName: node - linkType: hard - -"redent@npm:^3.0.0": - version: 3.0.0 - resolution: "redent@npm:3.0.0" - dependencies: - indent-string: ^4.0.0 - strip-indent: ^3.0.0 - checksum: fa1ef20404a2d399235e83cc80bd55a956642e37dd197b4b612ba7327bf87fa32745aeb4a1634b2bab25467164ab4ed9c15be2c307923dd08b0fe7c52431ae6b - languageName: node - linkType: hard - -"require-directory@npm:^2.1.1": - version: 2.1.1 - resolution: "require-directory@npm:2.1.1" - checksum: fb47e70bf0001fdeabdc0429d431863e9475e7e43ea5f94ad86503d918423c1543361cc5166d713eaa7029dd7a3d34775af04764bebff99ef413111a5af18c80 - languageName: node - linkType: hard - -"require-from-string@npm:^2.0.2": - version: 2.0.2 - resolution: "require-from-string@npm:2.0.2" - checksum: a03ef6895445f33a4015300c426699bc66b2b044ba7b670aa238610381b56d3f07c686251740d575e22f4c87531ba662d06937508f0f3c0f1ddc04db3130560b - languageName: node - linkType: hard - -"resolve-from@npm:5.0.0, resolve-from@npm:^5.0.0": - version: 5.0.0 - resolution: "resolve-from@npm:5.0.0" - checksum: 4ceeb9113e1b1372d0cd969f3468fa042daa1dd9527b1b6bb88acb6ab55d8b9cd65dbf18819f9f9ddf0db804990901dcdaade80a215e7b2c23daae38e64f5bdf - languageName: node - linkType: hard - -"resolve-from@npm:^4.0.0": - version: 4.0.0 - resolution: "resolve-from@npm:4.0.0" - checksum: f4ba0b8494846a5066328ad33ef8ac173801a51739eb4d63408c847da9a2e1c1de1e6cbbf72699211f3d13f8fc1325648b169bd15eb7da35688e30a5fb0e4a7f - languageName: node - linkType: hard - -"resolve-global@npm:1.0.0, resolve-global@npm:^1.0.0": - version: 1.0.0 - resolution: "resolve-global@npm:1.0.0" - dependencies: - global-dirs: ^0.1.1 - checksum: c4e11d33e84bde7516b824503ffbe4b6cce863d5ce485680fd3db997b7c64da1df98321b1fd0703b58be8bc9bc83bc96bd83043f96194386b45eb47229efb6b6 - languageName: node - linkType: hard - -"resolve@npm:^1.10.0": - version: 1.22.1 - resolution: "resolve@npm:1.22.1" - dependencies: - is-core-module: ^2.9.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 - bin: - resolve: bin/resolve - checksum: 07af5fc1e81aa1d866cbc9e9460fbb67318a10fa3c4deadc35c3ad8a898ee9a71a86a65e4755ac3195e0ea0cfbe201eb323ebe655ce90526fd61917313a34e4e - languageName: node - linkType: hard - -"resolve@patch:resolve@^1.10.0#~builtin": - version: 1.22.1 - resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=07638b" - dependencies: - is-core-module: ^2.9.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 - bin: - resolve: bin/resolve - checksum: 5656f4d0bedcf8eb52685c1abdf8fbe73a1603bb1160a24d716e27a57f6cecbe2432ff9c89c2bd57542c3a7b9d14b1882b73bfe2e9d7849c9a4c0b8b39f02b8b - languageName: node - linkType: hard - -"safe-buffer@npm:~5.2.0": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 - languageName: node - linkType: hard - -"semver@npm:2 || 3 || 4 || 5": - version: 5.7.1 - resolution: "semver@npm:5.7.1" - bin: - semver: ./bin/semver - checksum: 57fd0acfd0bac382ee87cd52cd0aaa5af086a7dc8d60379dfe65fea491fb2489b6016400813930ecd61fd0952dae75c115287a1b16c234b1550887117744dfaf - languageName: node - linkType: hard - -"semver@npm:7.3.8, semver@npm:^7.3.4": - version: 7.3.8 - resolution: "semver@npm:7.3.8" - dependencies: - lru-cache: ^6.0.0 - bin: - semver: bin/semver.js - checksum: ba9c7cbbf2b7884696523450a61fee1a09930d888b7a8d7579025ad93d459b2d1949ee5bbfeb188b2be5f4ac163544c5e98491ad6152df34154feebc2cc337c1 - languageName: node - linkType: hard - -"semver@npm:^7.3.8": - version: 7.5.0 - resolution: "semver@npm:7.5.0" - dependencies: - lru-cache: ^6.0.0 - bin: - semver: bin/semver.js - checksum: 2d266937756689a76f124ffb4c1ea3e1bbb2b263219f90ada8a11aebebe1280b13bb76cca2ca96bdee3dbc554cbc0b24752eb895b2a51577aa644427e9229f2b - languageName: node - linkType: hard - -"shebang-command@npm:^2.0.0": - version: 2.0.0 - resolution: "shebang-command@npm:2.0.0" - dependencies: - shebang-regex: ^3.0.0 - checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa - languageName: node - linkType: hard - -"shebang-regex@npm:^3.0.0": - version: 3.0.0 - resolution: "shebang-regex@npm:3.0.0" - checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 - languageName: node - linkType: hard - -"signal-exit@npm:^3.0.3": - version: 3.0.7 - resolution: "signal-exit@npm:3.0.7" - checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 - languageName: node - linkType: hard - -"solidity-comments-extractor@npm:^0.0.7": - version: 0.0.7 - resolution: "solidity-comments-extractor@npm:0.0.7" - checksum: a5cedf2310709969bc1783a6c336171478536f2f0ea96ad88437e0ef1e8844c0b37dd75591b0a824ec9c30640ea7e31b5f03128e871e6235bef3426617ce96c4 - languageName: node - linkType: hard - -"source-map-support@npm:^0.5.16": - version: 0.5.21 - resolution: "source-map-support@npm:0.5.21" - dependencies: - buffer-from: ^1.0.0 - source-map: ^0.6.0 - checksum: 43e98d700d79af1d36f859bdb7318e601dfc918c7ba2e98456118ebc4c4872b327773e5a1df09b0524e9e5063bb18f0934538eace60cca2710d1fa687645d137 - languageName: node - linkType: hard - -"source-map@npm:^0.6.0": - version: 0.6.1 - resolution: "source-map@npm:0.6.1" - checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 - languageName: node - linkType: hard - -"spdx-correct@npm:^3.0.0": - version: 3.2.0 - resolution: "spdx-correct@npm:3.2.0" - dependencies: - spdx-expression-parse: ^3.0.0 - spdx-license-ids: ^3.0.0 - checksum: e9ae98d22f69c88e7aff5b8778dc01c361ef635580e82d29e5c60a6533cc8f4d820803e67d7432581af0cc4fb49973125076ee3b90df191d153e223c004193b2 - languageName: node - linkType: hard - -"spdx-exceptions@npm:^2.1.0": - version: 2.3.0 - resolution: "spdx-exceptions@npm:2.3.0" - checksum: cb69a26fa3b46305637123cd37c85f75610e8c477b6476fa7354eb67c08128d159f1d36715f19be6f9daf4b680337deb8c65acdcae7f2608ba51931540687ac0 - languageName: node - linkType: hard - -"spdx-expression-parse@npm:^3.0.0": - version: 3.0.1 - resolution: "spdx-expression-parse@npm:3.0.1" - dependencies: - spdx-exceptions: ^2.1.0 - spdx-license-ids: ^3.0.0 - checksum: a1c6e104a2cbada7a593eaa9f430bd5e148ef5290d4c0409899855ce8b1c39652bcc88a725259491a82601159d6dc790bedefc9016c7472f7de8de7361f8ccde - languageName: node - linkType: hard - -"spdx-license-ids@npm:^3.0.0": - version: 3.0.13 - resolution: "spdx-license-ids@npm:3.0.13" - checksum: 3469d85c65f3245a279fa11afc250c3dca96e9e847f2f79d57f466940c5bb8495da08a542646086d499b7f24a74b8d0b42f3fc0f95d50ff99af1f599f6360ad7 - languageName: node - linkType: hard - -"split2@npm:^3.0.0": - version: 3.2.2 - resolution: "split2@npm:3.2.2" - dependencies: - readable-stream: ^3.0.0 - checksum: 8127ddbedd0faf31f232c0e9192fede469913aa8982aa380752e0463b2e31c2359ef6962eb2d24c125bac59eeec76873678d723b1c7ff696216a1cd071e3994a - languageName: node - linkType: hard - -"string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": - version: 4.2.3 - resolution: "string-width@npm:4.2.3" - dependencies: - emoji-regex: ^8.0.0 - is-fullwidth-code-point: ^3.0.0 - strip-ansi: ^6.0.1 - checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb - languageName: node - linkType: hard - -"string_decoder@npm:^1.1.1": - version: 1.3.0 - resolution: "string_decoder@npm:1.3.0" - dependencies: - safe-buffer: ~5.2.0 - checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 - languageName: node - linkType: hard - -"strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": - version: 6.0.1 - resolution: "strip-ansi@npm:6.0.1" - dependencies: - ansi-regex: ^5.0.1 - checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c - languageName: node - linkType: hard - -"strip-final-newline@npm:^2.0.0": - version: 2.0.0 - resolution: "strip-final-newline@npm:2.0.0" - checksum: 69412b5e25731e1938184b5d489c32e340605bb611d6140344abc3421b7f3c6f9984b21dff296dfcf056681b82caa3bb4cc996a965ce37bcfad663e92eae9c64 - languageName: node - linkType: hard - -"strip-indent@npm:^3.0.0": - version: 3.0.0 - resolution: "strip-indent@npm:3.0.0" - dependencies: - min-indent: ^1.0.0 - checksum: 18f045d57d9d0d90cd16f72b2313d6364fd2cb4bf85b9f593523ad431c8720011a4d5f08b6591c9d580f446e78855c5334a30fb91aa1560f5d9f95ed1b4a0530 - languageName: node - linkType: hard - -"supports-color@npm:^5.3.0": - version: 5.5.0 - resolution: "supports-color@npm:5.5.0" - dependencies: - has-flag: ^3.0.0 - checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac - languageName: node - linkType: hard - -"supports-color@npm:^7.1.0": - version: 7.2.0 - resolution: "supports-color@npm:7.2.0" - dependencies: - has-flag: ^4.0.0 - checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a - languageName: node - linkType: hard - -"supports-preserve-symlinks-flag@npm:^1.0.0": - version: 1.0.0 - resolution: "supports-preserve-symlinks-flag@npm:1.0.0" - checksum: 53b1e247e68e05db7b3808b99b892bd36fb096e6fba213a06da7fab22045e97597db425c724f2bbd6c99a3c295e1e73f3e4de78592289f38431049e1277ca0ae - languageName: node - linkType: hard - -"text-extensions@npm:^1.0.0": - version: 1.9.0 - resolution: "text-extensions@npm:1.9.0" - checksum: 56a9962c1b62d39b2bcb369b7558ca85c1b55e554b38dfd725edcc0a1babe5815782a60c17ff6b839093b163dfebb92b804208aaaea616ec7571c8059ae0cf44 - languageName: node - linkType: hard - -"through2@npm:^4.0.0": - version: 4.0.2 - resolution: "through2@npm:4.0.2" - dependencies: - readable-stream: 3 - checksum: ac7430bd54ccb7920fd094b1c7ff3e1ad6edd94202e5528331253e5fde0cc56ceaa690e8df9895de2e073148c52dfbe6c4db74cacae812477a35660090960cc0 - languageName: node - linkType: hard - -"through@npm:>=2.2.7 <3": - version: 2.3.8 - resolution: "through@npm:2.3.8" - checksum: a38c3e059853c494af95d50c072b83f8b676a9ba2818dcc5b108ef252230735c54e0185437618596c790bbba8fcdaef5b290405981ffa09dce67b1f1bf190cbd - languageName: node - linkType: hard - -"trim-newlines@npm:^3.0.0": - version: 3.0.1 - resolution: "trim-newlines@npm:3.0.1" - checksum: b530f3fadf78e570cf3c761fb74fef655beff6b0f84b29209bac6c9622db75ad1417f4a7b5d54c96605dcd72734ad44526fef9f396807b90839449eb543c6206 - languageName: node - linkType: hard - -"ts-node@npm:^10.8.1": - version: 10.9.1 - resolution: "ts-node@npm:10.9.1" - dependencies: - "@cspotcode/source-map-support": ^0.8.0 - "@tsconfig/node10": ^1.0.7 - "@tsconfig/node12": ^1.0.7 - "@tsconfig/node14": ^1.0.0 - "@tsconfig/node16": ^1.0.2 - acorn: ^8.4.1 - acorn-walk: ^8.1.1 - arg: ^4.1.0 - create-require: ^1.1.0 - diff: ^4.0.1 - make-error: ^1.1.1 - v8-compile-cache-lib: ^3.0.1 - yn: 3.1.1 - peerDependencies: - "@swc/core": ">=1.2.50" - "@swc/wasm": ">=1.2.50" - "@types/node": "*" - typescript: ">=2.7" - peerDependenciesMeta: - "@swc/core": - optional: true - "@swc/wasm": - optional: true - bin: - ts-node: dist/bin.js - ts-node-cwd: dist/bin-cwd.js - ts-node-esm: dist/bin-esm.js - ts-node-script: dist/bin-script.js - ts-node-transpile-only: dist/bin-transpile.js - ts-script: dist/bin-script-deprecated.js - checksum: 090adff1302ab20bd3486e6b4799e90f97726ed39e02b39e566f8ab674fd5bd5f727f43615debbfc580d33c6d9d1c6b1b3ce7d8e3cca3e20530a145ffa232c35 - languageName: node - linkType: hard - -"type-fest@npm:^0.18.0": - version: 0.18.1 - resolution: "type-fest@npm:0.18.1" - checksum: e96dcee18abe50ec82dab6cbc4751b3a82046da54c52e3b2d035b3c519732c0b3dd7a2fa9df24efd1a38d953d8d4813c50985f215f1957ee5e4f26b0fe0da395 - languageName: node - linkType: hard - -"type-fest@npm:^0.6.0": - version: 0.6.0 - resolution: "type-fest@npm:0.6.0" - checksum: b2188e6e4b21557f6e92960ec496d28a51d68658018cba8b597bd3ef757721d1db309f120ae987abeeda874511d14b776157ff809f23c6d1ce8f83b9b2b7d60f - languageName: node - linkType: hard - -"type-fest@npm:^0.8.1": - version: 0.8.1 - resolution: "type-fest@npm:0.8.1" - checksum: d61c4b2eba24009033ae4500d7d818a94fd6d1b481a8111612ee141400d5f1db46f199c014766b9fa9b31a6a7374d96fc748c6d688a78a3ce5a33123839becb7 - languageName: node - linkType: hard - -"typescript@npm:^4.6.4 || ^5.0.0": - version: 5.0.3 - resolution: "typescript@npm:5.0.3" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 3cce0576d218cb4277ff8b6adfef1a706e9114a98b4261a38ad658a7642f1b274a8396394f6cbff8c0ba852996d7ed2e233e9b8431d5d55ac7c2f6fea645af02 - languageName: node - linkType: hard - -"typescript@patch:typescript@^4.6.4 || ^5.0.0#~builtin": - version: 5.0.3 - resolution: "typescript@patch:typescript@npm%3A5.0.3#~builtin::version=5.0.3&hash=7ad353" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 9ec0a8eed38d46cc2c8794555b7674e413604c56c159f71b8ff21ce7f17334a44127a68724cb2ef8221ff3b19369f8f05654e8a5266621d7d962aeed889bd630 - languageName: node - linkType: hard - -"universalify@npm:^2.0.0": - version: 2.0.0 - resolution: "universalify@npm:2.0.0" - checksum: 2406a4edf4a8830aa6813278bab1f953a8e40f2f63a37873ffa9a3bc8f9745d06cc8e88f3572cb899b7e509013f7f6fcc3e37e8a6d914167a5381d8440518c44 - languageName: node - linkType: hard - -"uri-js@npm:^4.2.2": - version: 4.4.1 - resolution: "uri-js@npm:4.4.1" - dependencies: - punycode: ^2.1.0 - checksum: 7167432de6817fe8e9e0c9684f1d2de2bb688c94388f7569f7dbdb1587c9f4ca2a77962f134ec90be0cc4d004c939ff0d05acc9f34a0db39a3c797dada262633 - languageName: node - linkType: hard - -"util-deprecate@npm:^1.0.1": - version: 1.0.2 - resolution: "util-deprecate@npm:1.0.2" - checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 - languageName: node - linkType: hard - -"v8-compile-cache-lib@npm:^3.0.1": - version: 3.0.1 - resolution: "v8-compile-cache-lib@npm:3.0.1" - checksum: 78089ad549e21bcdbfca10c08850022b22024cdcc2da9b168bcf5a73a6ed7bf01a9cebb9eac28e03cd23a684d81e0502797e88f3ccd27a32aeab1cfc44c39da0 - languageName: node - linkType: hard - -"validate-npm-package-license@npm:^3.0.1": - version: 3.0.4 - resolution: "validate-npm-package-license@npm:3.0.4" - dependencies: - spdx-correct: ^3.0.0 - spdx-expression-parse: ^3.0.0 - checksum: 35703ac889d419cf2aceef63daeadbe4e77227c39ab6287eeb6c1b36a746b364f50ba22e88591f5d017bc54685d8137bc2d328d0a896e4d3fd22093c0f32a9ad - languageName: node - linkType: hard - -"which@npm:^2.0.1": - version: 2.0.2 - resolution: "which@npm:2.0.2" - dependencies: - isexe: ^2.0.0 - bin: - node-which: ./bin/node-which - checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 - languageName: node - linkType: hard - -"wrap-ansi@npm:^7.0.0": - version: 7.0.0 - resolution: "wrap-ansi@npm:7.0.0" - dependencies: - ansi-styles: ^4.0.0 - string-width: ^4.1.0 - strip-ansi: ^6.0.0 - checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b - languageName: node - linkType: hard - -"y18n@npm:^5.0.5": - version: 5.0.8 - resolution: "y18n@npm:5.0.8" - checksum: 54f0fb95621ee60898a38c572c515659e51cc9d9f787fb109cef6fde4befbe1c4602dc999d30110feee37456ad0f1660fa2edcfde6a9a740f86a290999550d30 - languageName: node - linkType: hard - -"yallist@npm:^4.0.0": - version: 4.0.0 - resolution: "yallist@npm:4.0.0" - checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 - languageName: node - linkType: hard - -"yargs-parser@npm:^20.2.3": - version: 20.2.9 - resolution: "yargs-parser@npm:20.2.9" - checksum: 8bb69015f2b0ff9e17b2c8e6bfe224ab463dd00ca211eece72a4cd8a906224d2703fb8a326d36fdd0e68701e201b2a60ed7cf81ce0fd9b3799f9fe7745977ae3 - languageName: node - linkType: hard - -"yargs-parser@npm:^21.1.1": - version: 21.1.1 - resolution: "yargs-parser@npm:21.1.1" - checksum: ed2d96a616a9e3e1cc7d204c62ecc61f7aaab633dcbfab2c6df50f7f87b393993fe6640d017759fe112d0cb1e0119f2b4150a87305cc873fd90831c6a58ccf1c - languageName: node - linkType: hard - -"yargs@npm:^17.0.0": - version: 17.7.1 - resolution: "yargs@npm:17.7.1" - dependencies: - cliui: ^8.0.1 - escalade: ^3.1.1 - get-caller-file: ^2.0.5 - require-directory: ^2.1.1 - string-width: ^4.2.3 - y18n: ^5.0.5 - yargs-parser: ^21.1.1 - checksum: 3d8a43c336a4942bc68080768664aca85c7bd406f018bad362fd255c41c8f4e650277f42fd65d543fce99e084124ddafee7bbfc1a5c6a8fda4cec78609dcf8d4 - languageName: node - linkType: hard - -"yn@npm:3.1.1": - version: 3.1.1 - resolution: "yn@npm:3.1.1" - checksum: 2c487b0e149e746ef48cda9f8bad10fc83693cd69d7f9dcd8be4214e985de33a29c9e24f3c0d6bcf2288427040a8947406ab27f7af67ee9456e6b84854f02dd6 - languageName: node - linkType: hard - -"yocto-queue@npm:^0.1.0": - version: 0.1.0 - resolution: "yocto-queue@npm:0.1.0" - checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 - languageName: node - linkType: hard +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@adraffy/ens-normalize@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz#d2a39395c587e092d77cbbc80acf956a54f38bf7" + integrity sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q== + +"@axelar-network/axelar-gmp-sdk-solidity@^5.6.2": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@axelar-network/axelar-gmp-sdk-solidity/-/axelar-gmp-sdk-solidity-5.8.0.tgz#449c6246b9f403af97a030b0a90b4f321c3a8a66" + integrity sha512-ThiCWK7lhwmsipgjKkw8c0z0ubB9toRMV9X0tRVOXHHSknKp5DCFfatbCwjpSC5GZRa+61ciTSqJNtCc7j9YoQ== + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5": + 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/generator@7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.7.tgz#8da2599beb4a86194a3b24df6c085931d9ee45ad" + integrity sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w== + dependencies: + "@babel/types" "^7.17.0" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/generator@^7.23.0": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.4.tgz#1fc55532b88adf952025d5d2d1e71f946cb1c498" + integrity sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw== + dependencies: + "@babel/types" "^7.24.0" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.23.4": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" + integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== + +"@babel/helper-validator-identifier@^7.16.7", "@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" + +"@babel/parser@^7.20.5", "@babel/parser@^7.23.0", "@babel/parser@^7.24.0": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.4.tgz#234487a110d89ad5a3ed4a8a566c36b9453e8c88" + integrity sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg== + +"@babel/runtime@^7.17.2", "@babel/runtime@^7.23.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" + integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.22.15": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" + integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/parser" "^7.24.0" + "@babel/types" "^7.24.0" + +"@babel/traverse@7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" + integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@7.17.0": + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" + integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + +"@babel/types@^7.17.0", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" + integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== + dependencies: + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + +"@chainlink/contracts-ccip@^0.7.6": + version "0.7.6" + resolved "https://registry.yarnpkg.com/@chainlink/contracts-ccip/-/contracts-ccip-0.7.6.tgz#5bf4568a0bbf4e29d2e8c32348e5ecc6ced006d2" + integrity sha512-yNbCBFpLs3R+ALymto9dQYKz3vatnjqYGu1pnMD0i2fHEMthiXe0+otaNCGNht6n8k7ruNaA0DNpz3F+2jHQXw== + dependencies: + "@eth-optimism/contracts" "^0.5.21" + "@openzeppelin/contracts" "~4.3.3" + "@openzeppelin/contracts-upgradeable-4.7.3" "npm:@openzeppelin/contracts-upgradeable@v4.7.3" + "@openzeppelin/contracts-v0.7" "npm:@openzeppelin/contracts@v3.4.2" + +"@chainsafe/as-sha256@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz#3639df0e1435cab03f4d9870cc3ac079e57a6fc9" + integrity sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg== + +"@chainsafe/persistent-merkle-tree@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz#4c9ee80cc57cd3be7208d98c40014ad38f36f7ff" + integrity sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + +"@chainsafe/persistent-merkle-tree@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz#2b4a62c9489a5739dedd197250d8d2f5427e9f63" + integrity sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + +"@chainsafe/ssz@^0.10.0": + version "0.10.2" + resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.10.2.tgz#c782929e1bb25fec66ba72e75934b31fd087579e" + integrity sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + "@chainsafe/persistent-merkle-tree" "^0.5.0" + +"@chainsafe/ssz@^0.9.2": + version "0.9.4" + resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.9.4.tgz#696a8db46d6975b600f8309ad3a12f7c0e310497" + integrity sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + "@chainsafe/persistent-merkle-tree" "^0.4.2" + case "^1.6.3" + +"@colors/colors@1.6.0", "@colors/colors@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" + integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== + +"@commitlint/cli@^17.3.0", "@commitlint/cli@^17.5.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-17.8.1.tgz#10492114a022c91dcfb1d84dac773abb3db76d33" + integrity sha512-ay+WbzQesE0Rv4EQKfNbSMiJJ12KdKTDzIt0tcK4k11FdsWmtwP0Kp1NWMOUswfIWo6Eb7p7Ln721Nx9FLNBjg== + dependencies: + "@commitlint/format" "^17.8.1" + "@commitlint/lint" "^17.8.1" + "@commitlint/load" "^17.8.1" + "@commitlint/read" "^17.8.1" + "@commitlint/types" "^17.8.1" + execa "^5.0.0" + lodash.isfunction "^3.0.9" + resolve-from "5.0.0" + resolve-global "1.0.0" + yargs "^17.0.0" + +"@commitlint/config-conventional@^17.3.0", "@commitlint/config-conventional@^17.4.4": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-17.8.1.tgz#e5bcf0cfec8da7ac50bc04dc92e0a4ea74964ce0" + integrity sha512-NxCOHx1kgneig3VLauWJcDWS40DVjg7nKOpBEEK9E5fjJpQqLCilcnKkIIjdBH98kEO1q3NpE5NSrZ2kl/QGJg== + dependencies: + conventional-changelog-conventionalcommits "^6.1.0" + +"@commitlint/config-validator@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-17.8.1.tgz#5cc93b6b49d5524c9cc345a60e5bf74bcca2b7f9" + integrity sha512-UUgUC+sNiiMwkyiuIFR7JG2cfd9t/7MV8VB4TZ+q02ZFkHoduUS4tJGsCBWvBOGD9Btev6IecPMvlWUfJorkEA== + dependencies: + "@commitlint/types" "^17.8.1" + ajv "^8.11.0" + +"@commitlint/config-validator@^19.0.3": + version "19.0.3" + resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-19.0.3.tgz#052b181a30da6b4fc16dc5230f4589ac95e0bc81" + integrity sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q== + dependencies: + "@commitlint/types" "^19.0.3" + ajv "^8.11.0" + +"@commitlint/ensure@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-17.8.1.tgz#59183557844999dbb6aab6d03629a3d104d01a8d" + integrity sha512-xjafwKxid8s1K23NFpL8JNo6JnY/ysetKo8kegVM7c8vs+kWLP8VrQq+NbhgVlmCojhEDbzQKp4eRXSjVOGsow== + dependencies: + "@commitlint/types" "^17.8.1" + lodash.camelcase "^4.3.0" + lodash.kebabcase "^4.1.1" + lodash.snakecase "^4.1.1" + lodash.startcase "^4.4.0" + lodash.upperfirst "^4.3.1" + +"@commitlint/execute-rule@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-17.8.1.tgz#504ed69eb61044eeb84fdfd10cc18f0dab14f34c" + integrity sha512-JHVupQeSdNI6xzA9SqMF+p/JjrHTcrJdI02PwesQIDCIGUrv04hicJgCcws5nzaoZbROapPs0s6zeVHoxpMwFQ== + +"@commitlint/execute-rule@^19.0.0": + version "19.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-19.0.0.tgz#928fb239ae8deec82a6e3b05ec9cfe20afa83856" + integrity sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw== + +"@commitlint/format@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-17.8.1.tgz#6108bb6b4408e711006680649927e1b559bdc5f8" + integrity sha512-f3oMTyZ84M9ht7fb93wbCKmWxO5/kKSbwuYvS867duVomoOsgrgljkGGIztmT/srZnaiGbaK8+Wf8Ik2tSr5eg== + dependencies: + "@commitlint/types" "^17.8.1" + chalk "^4.1.0" + +"@commitlint/is-ignored@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-17.8.1.tgz#cf25bcd8409c79684b63f8bdeb35df48edda244e" + integrity sha512-UshMi4Ltb4ZlNn4F7WtSEugFDZmctzFpmbqvpyxD3la510J+PLcnyhf9chs7EryaRFJMdAKwsEKfNK0jL/QM4g== + dependencies: + "@commitlint/types" "^17.8.1" + semver "7.5.4" + +"@commitlint/lint@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-17.8.1.tgz#bfc21215f6b18d41d4d43e2aa3cb79a5d7726cd8" + integrity sha512-aQUlwIR1/VMv2D4GXSk7PfL5hIaFSfy6hSHV94O8Y27T5q+DlDEgd/cZ4KmVI+MWKzFfCTiTuWqjfRSfdRllCA== + dependencies: + "@commitlint/is-ignored" "^17.8.1" + "@commitlint/parse" "^17.8.1" + "@commitlint/rules" "^17.8.1" + "@commitlint/types" "^17.8.1" + +"@commitlint/load@>6.1.1": + version "19.2.0" + resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-19.2.0.tgz#3ca51fdead4f1e1e09c9c7df343306412b1ef295" + integrity sha512-XvxxLJTKqZojCxaBQ7u92qQLFMMZc4+p9qrIq/9kJDy8DOrEa7P1yx7Tjdc2u2JxIalqT4KOGraVgCE7eCYJyQ== + dependencies: + "@commitlint/config-validator" "^19.0.3" + "@commitlint/execute-rule" "^19.0.0" + "@commitlint/resolve-extends" "^19.1.0" + "@commitlint/types" "^19.0.3" + chalk "^5.3.0" + cosmiconfig "^9.0.0" + cosmiconfig-typescript-loader "^5.0.0" + lodash.isplainobject "^4.0.6" + lodash.merge "^4.6.2" + lodash.uniq "^4.5.0" + +"@commitlint/load@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-17.8.1.tgz#fa061e7bfa53281eb03ca8517ca26d66a189030c" + integrity sha512-iF4CL7KDFstP1kpVUkT8K2Wl17h2yx9VaR1ztTc8vzByWWcbO/WaKwxsnCOqow9tVAlzPfo1ywk9m2oJ9ucMqA== + dependencies: + "@commitlint/config-validator" "^17.8.1" + "@commitlint/execute-rule" "^17.8.1" + "@commitlint/resolve-extends" "^17.8.1" + "@commitlint/types" "^17.8.1" + "@types/node" "20.5.1" + chalk "^4.1.0" + cosmiconfig "^8.0.0" + cosmiconfig-typescript-loader "^4.0.0" + lodash.isplainobject "^4.0.6" + lodash.merge "^4.6.2" + lodash.uniq "^4.5.0" + resolve-from "^5.0.0" + ts-node "^10.8.1" + typescript "^4.6.4 || ^5.2.2" + +"@commitlint/message@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-17.8.1.tgz#a5cd226c419be20ee03c3d237db6ac37b95958b3" + integrity sha512-6bYL1GUQsD6bLhTH3QQty8pVFoETfFQlMn2Nzmz3AOLqRVfNNtXBaSY0dhZ0dM6A2MEq4+2d7L/2LP8TjqGRkA== + +"@commitlint/parse@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-17.8.1.tgz#6e00b8f50ebd63562d25dcf4230da2c9f984e626" + integrity sha512-/wLUickTo0rNpQgWwLPavTm7WbwkZoBy3X8PpkUmlSmQJyWQTj0m6bDjiykMaDt41qcUbfeFfaCvXfiR4EGnfw== + dependencies: + "@commitlint/types" "^17.8.1" + conventional-changelog-angular "^6.0.0" + conventional-commits-parser "^4.0.0" + +"@commitlint/read@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-17.8.1.tgz#b3f28777607c756078356cc133368b0e8c08092f" + integrity sha512-Fd55Oaz9irzBESPCdMd8vWWgxsW3OWR99wOntBDHgf9h7Y6OOHjWEdS9Xzen1GFndqgyoaFplQS5y7KZe0kO2w== + dependencies: + "@commitlint/top-level" "^17.8.1" + "@commitlint/types" "^17.8.1" + fs-extra "^11.0.0" + git-raw-commits "^2.0.11" + minimist "^1.2.6" + +"@commitlint/resolve-extends@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-17.8.1.tgz#9af01432bf2fd9ce3dd5a00d266cce14e4c977e7" + integrity sha512-W/ryRoQ0TSVXqJrx5SGkaYuAaE/BUontL1j1HsKckvM6e5ZaG0M9126zcwL6peKSuIetJi7E87PRQF8O86EW0Q== + dependencies: + "@commitlint/config-validator" "^17.8.1" + "@commitlint/types" "^17.8.1" + import-fresh "^3.0.0" + lodash.mergewith "^4.6.2" + resolve-from "^5.0.0" + resolve-global "^1.0.0" + +"@commitlint/resolve-extends@^19.1.0": + version "19.1.0" + resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-19.1.0.tgz#fa5b8f921e9c8d76f53624c35bf25b9676bd73fa" + integrity sha512-z2riI+8G3CET5CPgXJPlzftH+RiWYLMYv4C9tSLdLXdr6pBNimSKukYP9MS27ejmscqCTVA4almdLh0ODD2KYg== + dependencies: + "@commitlint/config-validator" "^19.0.3" + "@commitlint/types" "^19.0.3" + global-directory "^4.0.1" + import-meta-resolve "^4.0.0" + lodash.mergewith "^4.6.2" + resolve-from "^5.0.0" + +"@commitlint/rules@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-17.8.1.tgz#da49cab1b7ebaf90d108de9f58f684dc4ccb65a0" + integrity sha512-2b7OdVbN7MTAt9U0vKOYKCDsOvESVXxQmrvuVUZ0rGFMCrCPJWWP1GJ7f0lAypbDAhaGb8zqtdOr47192LBrIA== + dependencies: + "@commitlint/ensure" "^17.8.1" + "@commitlint/message" "^17.8.1" + "@commitlint/to-lines" "^17.8.1" + "@commitlint/types" "^17.8.1" + execa "^5.0.0" + +"@commitlint/to-lines@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-17.8.1.tgz#a5c4a7cf7dff3dbdd69289fc0eb19b66f3cfe017" + integrity sha512-LE0jb8CuR/mj6xJyrIk8VLz03OEzXFgLdivBytoooKO5xLt5yalc8Ma5guTWobw998sbR3ogDd+2jed03CFmJA== + +"@commitlint/top-level@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-17.8.1.tgz#206d37d6782f33c9572e44fbe3758392fdeea7bc" + integrity sha512-l6+Z6rrNf5p333SHfEte6r+WkOxGlWK4bLuZKbtf/2TXRN+qhrvn1XE63VhD8Oe9oIHQ7F7W1nG2k/TJFhx2yA== + dependencies: + find-up "^5.0.0" + +"@commitlint/types@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-17.8.1.tgz#883a0ad35c5206d5fef7bc6ce1bbe648118af44e" + integrity sha512-PXDQXkAmiMEG162Bqdh9ChML/GJZo6vU+7F03ALKDK8zYc6SuAr47LjG7hGYRqUOz+WK0dU7bQ0xzuqFMdxzeQ== + dependencies: + chalk "^4.1.0" + +"@commitlint/types@^19.0.3": + version "19.0.3" + resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-19.0.3.tgz#feff4ecac2b5c359f2a57f9ab094b2ac80ef0266" + integrity sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA== + dependencies: + "@types/conventional-commits-parser" "^5.0.0" + chalk "^5.3.0" + +"@connext/interfaces@^2.0.0": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@connext/interfaces/-/interfaces-2.0.5.tgz#c9a5072a12ce7b6ce4e2f6eddfc8157aa0cb788f" + integrity sha512-b657mNb6z/kLGZMNhqDHJmYmPWa3QZYdtZ4TEjtrYe3289aO0dbRrMIEYd0fQVEtqNjPVl7YnwberfOmz1QehA== + +"@cosmjs/encoding@^0.31.3": + version "0.31.3" + resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.31.3.tgz#2519d9c9ae48368424971f253775c4580b54c5aa" + integrity sha512-6IRtG0fiVYwyP7n+8e54uTx2pLYijO48V3t9TLiROERm5aUAIzIlz6Wp0NYaI5he9nh1lcEGJ1lkquVKFw3sUg== + dependencies: + base64-js "^1.3.0" + bech32 "^1.1.4" + readonly-date "^1.0.0" + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@dabh/diagnostics@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" + integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== + dependencies: + colorspace "1.1.x" + enabled "2.0.x" + kuler "^2.0.0" + +"@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.4.0", "@eslint-community/regexpp@^4.5.1", "@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== + +"@eth-optimism/contracts@^0.5.21": + version "0.5.40" + resolved "https://registry.yarnpkg.com/@eth-optimism/contracts/-/contracts-0.5.40.tgz#d13a04a15ea947a69055e6fc74d87e215d4c936a" + integrity sha512-MrzV0nvsymfO/fursTB7m/KunkPsCndltVgfdHaT1Aj5Vi6R/doKIGGkOofHX+8B6VMZpuZosKCMQ5lQuqjt8w== + dependencies: + "@eth-optimism/core-utils" "0.12.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + +"@eth-optimism/contracts@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@eth-optimism/contracts/-/contracts-0.6.0.tgz#15ae76222a9b4d958a550cafb1960923af613a31" + integrity sha512-vQ04wfG9kMf1Fwy3FEMqH2QZbgS0gldKhcBeBUPfO8zu68L61VI97UDXmsMQXzTsEAxK8HnokW3/gosl4/NW3w== + dependencies: + "@eth-optimism/core-utils" "0.12.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + +"@eth-optimism/core-utils@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@eth-optimism/core-utils/-/core-utils-0.12.0.tgz#6337e4599a34de23f8eceb20378de2a2de82b0ea" + integrity sha512-qW+7LZYCz7i8dRa7SRlUKIo1VBU8lvN0HeXCxJR+z+xtMzMQpPds20XJNCMclszxYQHkXY00fOT6GvFw9ZL6nw== + dependencies: + "@ethersproject/abi" "^5.7.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/address" "^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/keccak256" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/providers" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + bufio "^1.0.7" + chai "^4.3.4" + +"@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/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.0.9", "@ethersproject/abi@^5.1.2", "@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.0.2", "@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", "@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", "@ethersproject/providers@^5.7.0", "@ethersproject/providers@^5.7.1", "@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", "@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", "@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" + +"@fastify/busboy@^2.0.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" + integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== + +"@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== + +"@hyperlane-xyz/core@^3.1.10": + version "3.10.0" + resolved "https://registry.yarnpkg.com/@hyperlane-xyz/core/-/core-3.10.0.tgz#94e98d92bbe301bb1bb9d6f22337a0b959720174" + integrity sha512-XgWojqkeXbF2iPomDJnnTwCjnDwUobFkKDiefgSRV6ZfM7geIDAZK9ezjsj4LBd0q1DxOtH/O4DMoncqXE4IGQ== + dependencies: + "@eth-optimism/contracts" "^0.6.0" + "@hyperlane-xyz/utils" "3.10.0" + "@layerzerolabs/lz-evm-oapp-v2" "2.0.2" + "@openzeppelin/contracts" "^4.9.3" + "@openzeppelin/contracts-upgradeable" "^v4.9.3" + +"@hyperlane-xyz/utils@3.10.0": + version "3.10.0" + resolved "https://registry.yarnpkg.com/@hyperlane-xyz/utils/-/utils-3.10.0.tgz#db41d6b1eb2a66c44149cb94c81a984c546b35c5" + integrity sha512-Rs53EnZjiEHv5vcY9z2I0ewjOWAt4UDixoqN2DcYRt6yFw4dXvqEA3JfR8yis7fAU2kzH+WJPdLr2hcUPZKHaw== + dependencies: + "@cosmjs/encoding" "^0.31.3" + "@solana/web3.js" "^1.78.0" + bignumber.js "^9.1.1" + ethers "^5.7.2" + pino "^8.19.0" + +"@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.0.3", "@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/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@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" + +"@layerzerolabs/lz-evm-messagelib-v2@^2.0.2": + version "2.3.3" + resolved "https://registry.yarnpkg.com/@layerzerolabs/lz-evm-messagelib-v2/-/lz-evm-messagelib-v2-2.3.3.tgz#e4af0233dce94c76f064793dff364e32f0ba6f86" + integrity sha512-lDiYLpryEJOKBbmibIx1GRLqUjYBZ0yfzD2g7e2FMaDxbv0sEiINu22VMF3LoER10SDefYS43DSNRI6ns4QKvQ== + +"@layerzerolabs/lz-evm-oapp-v2@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@layerzerolabs/lz-evm-oapp-v2/-/lz-evm-oapp-v2-2.0.2.tgz#89030de4dea0827a298fce60df65ecbc3544db0e" + integrity sha512-50hG8BKa1ywobIt2UVjI3ePQO9XBy6uT9YCN9i5IBfX6WrSZevPyDtL8OayzKtRQgkKTvprC82bdGzAoqh2RUw== + dependencies: + "@layerzerolabs/lz-evm-messagelib-v2" "^2.0.2" + "@layerzerolabs/lz-evm-protocol-v2" "^2.0.2" + "@layerzerolabs/lz-evm-v1-0.7" "^2.0.2" + +"@layerzerolabs/lz-evm-protocol-v2@^2.0.2": + version "2.3.3" + resolved "https://registry.yarnpkg.com/@layerzerolabs/lz-evm-protocol-v2/-/lz-evm-protocol-v2-2.3.3.tgz#4ec9eacc5e59124f784c2b77a4e023ff262fb4eb" + integrity sha512-u8RmXvC0AfmYgeNCGcfHLkOB9am5VQTQ+4YrX7AuRUuF6CpUNvJd8aaL30+NIGwZzgfE6+np83hj5rXmwlmlzA== + +"@layerzerolabs/lz-evm-v1-0.7@^2.0.2": + version "2.3.3" + resolved "https://registry.yarnpkg.com/@layerzerolabs/lz-evm-v1-0.7/-/lz-evm-v1-0.7-2.3.3.tgz#7fda83f6847a2c99ec3462d405d83cea642d56be" + integrity sha512-TltdE4+WaOPzZD2x4Y3LPWmJJKQd6j1cnqfPUo2fCLiP+t7nzh6AS+U/0LM02UI/ro/mtYENb3SEVdz+fwUw9A== + +"@metamask/eth-sig-util@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" + integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ== + dependencies: + ethereumjs-abi "^0.6.8" + ethereumjs-util "^6.2.1" + ethjs-util "^0.1.6" + tweetnacl "^1.0.3" + tweetnacl-util "^0.15.1" + +"@noble/curves@1.2.0", "@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/curves@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.0.tgz#f05771ef64da724997f69ee1261b2417a49522d6" + integrity sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg== + dependencies: + "@noble/hashes" "1.4.0" + +"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" + integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== + +"@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.0", "@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.4.0", "@noble/hashes@^1.3.3", "@noble/hashes@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" + integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== + +"@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" + integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + 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" + +"@nomicfoundation/ethereumjs-block@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.2.tgz#13a7968f5964f1697da941281b7f7943b0465d04" + integrity sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q== + dependencies: + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + ethereum-cryptography "0.1.3" + ethers "^5.7.1" + +"@nomicfoundation/ethereumjs-blockchain@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.2.tgz#45323b673b3d2fab6b5008535340d1b8fea7d446" + integrity sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-ethash" "3.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + abstract-level "^1.0.3" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + level "^8.0.0" + lru-cache "^5.1.1" + memory-level "^1.0.0" + +"@nomicfoundation/ethereumjs-common@4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.2.tgz#a15d1651ca36757588fdaf2a7d381a150662a3c3" + integrity sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg== + dependencies: + "@nomicfoundation/ethereumjs-util" "9.0.2" + crc-32 "^1.2.0" + +"@nomicfoundation/ethereumjs-ethash@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.2.tgz#da77147f806401ee996bfddfa6487500118addca" + integrity sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + abstract-level "^1.0.3" + bigint-crypto-utils "^3.0.23" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-evm@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.2.tgz#4c2f4b84c056047102a4fa41c127454e3f0cfcf6" + integrity sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ== + dependencies: + "@ethersproject/providers" "^5.7.1" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + mcl-wasm "^0.7.1" + rustbn.js "~0.2.0" + +"@nomicfoundation/ethereumjs-rlp@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.2.tgz#4fee8dc58a53ac6ae87fb1fca7c15dc06c6b5dea" + integrity sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA== + +"@nomicfoundation/ethereumjs-statemanager@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.2.tgz#3ba4253b29b1211cafe4f9265fee5a0d780976e0" + integrity sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA== + dependencies: + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + ethers "^5.7.1" + js-sdsl "^4.1.4" + +"@nomicfoundation/ethereumjs-trie@6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.2.tgz#9a6dbd28482dca1bc162d12b3733acab8cd12835" + integrity sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ== + dependencies: + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + "@types/readable-stream" "^2.3.13" + ethereum-cryptography "0.1.3" + readable-stream "^3.6.0" + +"@nomicfoundation/ethereumjs-tx@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.2.tgz#117813b69c0fdc14dd0446698a64be6df71d7e56" + integrity sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g== + dependencies: + "@chainsafe/ssz" "^0.9.2" + "@ethersproject/providers" "^5.7.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-util@9.0.2": + version "9.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.2.tgz#16bdc1bb36f333b8a3559bbb4b17dac805ce904d" + integrity sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ== + dependencies: + "@chainsafe/ssz" "^0.10.0" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-vm@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.2.tgz#3b0852cb3584df0e18c182d0672a3596c9ca95e6" + integrity sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-blockchain" "7.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-evm" "2.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-statemanager" "2.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + mcl-wasm "^0.7.1" + rustbn.js "~0.2.0" + +"@nomicfoundation/hardhat-chai-matchers@^1.0.4": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.6.tgz#72a2e312e1504ee5dd73fe302932736432ba96bc" + integrity sha512-f5ZMNmabZeZegEfuxn/0kW+mm7+yV7VNDxLpMOMGXWFJ2l/Ct3QShujzDRF9cOkK9Ui/hbDeOWGZqyQALDXVCQ== + dependencies: + "@ethersproject/abi" "^5.1.2" + "@types/chai-as-promised" "^7.1.3" + chai-as-promised "^7.1.1" + deep-eql "^4.0.1" + ordinal "^1.0.3" + +"@nomicfoundation/hardhat-network-helpers@^1.0.8": + version "1.0.10" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.10.tgz#c61042ceb104fdd6c10017859fdef6529c1d6585" + integrity sha512-R35/BMBlx7tWN5V6d/8/19QCwEmIdbnA4ZrsuXgvs8i2qFx5i7h6mH5pBS4Pwi4WigLH+upl6faYusrNPuzMrQ== + dependencies: + ethereumjs-util "^7.1.4" + +"@nomicfoundation/hardhat-toolbox@^2.0.0": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-2.0.2.tgz#ec95f23b53cb4e71a1a7091380fa223aad18f156" + integrity sha512-vnN1AzxbvpSx9pfdRHbUzTRIXpMLPXnUlkW855VaDk6N1pwRaQ2gNzEmFAABk4lWf11E00PKwFd/q27HuwYrYg== + +"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz#4c858096b1c17fe58a474fe81b46815f93645c15" + integrity sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w== + +"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz#6e25ccdf6e2d22389c35553b64fe6f3fdaec432c" + integrity sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA== + +"@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz#0a224ea50317139caeebcdedd435c28a039d169c" + integrity sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA== + +"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz#dfa085d9ffab9efb2e7b383aed3f557f7687ac2b" + integrity sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg== + +"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz#c9e06b5d513dd3ab02a7ac069c160051675889a4" + integrity sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w== + +"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz#8d328d16839e52571f72f2998c81e46bf320f893" + integrity sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA== + +"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz#9b49d0634b5976bb5ed1604a1e1b736f390959bb" + integrity sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w== + +"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz#e2867af7264ebbcc3131ef837878955dd6a3676f" + integrity sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg== + +"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz#0685f78608dd516c8cdfb4896ed451317e559585" + integrity sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ== + +"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz#c9a44f7108646f083b82e851486e0f6aeb785836" + integrity sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw== + +"@nomicfoundation/solidity-analyzer@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz#f5f4d36d3f66752f59a57e7208cd856f3ddf6f2d" + integrity sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg== + optionalDependencies: + "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.1" + "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.1" + "@nomicfoundation/solidity-analyzer-freebsd-x64" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.1" + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc" "0.1.1" + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.1" + "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.1" + +"@nomiclabs/hardhat-ethers@^2.2.1": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz#b41053e360c31a32c2640c9a45ee981a7e603fe0" + integrity sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg== + +"@nomiclabs/hardhat-etherscan@^3.1.2": + version "3.1.8" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.8.tgz#3c12ee90b3733e0775e05111146ef9418d4f5a38" + integrity sha512-v5F6IzQhrsjHh6kQz4uNrym49brK9K5bYCq2zQZ729RYRaifI9hHbtmK+KkIVevfhut7huQFEQ77JLRMAzWYjQ== + dependencies: + "@ethersproject/abi" "^5.1.2" + "@ethersproject/address" "^5.0.2" + cbor "^8.1.0" + chalk "^2.4.2" + debug "^4.1.1" + fs-extra "^7.0.1" + lodash "^4.17.11" + semver "^6.3.0" + table "^6.8.0" + undici "^5.14.0" + +"@openzeppelin/contracts-upgradeable-4.7.3@npm:@openzeppelin/contracts-upgradeable@v4.7.3": + version "4.7.3" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.7.3.tgz#f1d606e2827d409053f3e908ba4eb8adb1dd6995" + integrity sha512-+wuegAMaLcZnLCJIvrVUDzA9z/Wp93f0Dla/4jJvIhijRrPabjQbZe6fWiECLaJyfn5ci9fqf9vTw3xpQOad2A== + +"@openzeppelin/contracts-upgradeable@^4.7.3", "@openzeppelin/contracts-upgradeable@^4.8.1", "@openzeppelin/contracts-upgradeable@^v4.9.3": + version "4.9.6" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.6.tgz#38b21708a719da647de4bb0e4802ee235a0d24df" + integrity sha512-m4iHazOsOCv1DgM7eD7GupTJ+NFVujRZt1wzddDPSVGpWdKq1SKkla5htKG7+IS4d2XOCtzkUNwRZ7Vq5aEUMA== + +"@openzeppelin/contracts-v0.7@npm:@openzeppelin/contracts@v3.4.2": + version "3.4.2" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.4.2.tgz#d81f786fda2871d1eb8a8c5a73e455753ba53527" + integrity sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA== + +"@openzeppelin/contracts@^4.4.1", "@openzeppelin/contracts@^4.9.3": + version "4.9.6" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.9.6.tgz#2a880a24eb19b4f8b25adc2a5095f2aa27f39677" + integrity sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA== + +"@openzeppelin/contracts@~4.3.3": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.3.3.tgz#ff6ee919fc2a1abaf72b22814bfb72ed129ec137" + integrity sha512-tDBopO1c98Yk7Cv/PZlHqrvtVjlgK5R4J6jxLwoO7qxK4xqOiZG+zSkIvGFpPZ0ikc3QOED3plgdqjgNTnBc7g== + +"@polytope-labs/solidity-merkle-trees@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@polytope-labs/solidity-merkle-trees/-/solidity-merkle-trees-0.2.1.tgz#7c3399c071ee246df92f37b8cebc9f545a915917" + integrity sha512-aoJbZXWgIDgvwWEXQL3cEqFAXdTzaOxo3r373LMOtm8W/v9RnRNVW/gplWQGVZs+tvdwGP9Sp6ToKknIIPwQ5g== + +"@routerprotocol/evm-gateway-contracts@^1.1.13": + version "1.1.13" + resolved "https://registry.yarnpkg.com/@routerprotocol/evm-gateway-contracts/-/evm-gateway-contracts-1.1.13.tgz#609cd2a0cbcdb92e9a55fcdcb5cba0cc62fc11a7" + integrity sha512-XCjODM/AKx/WLc8pa9UzlatBBS73xkGBXDbSsFxq4XQUqO8ao7Gcnp61n9CoW8QN7wDKev+6tiHagia+piDzMg== + dependencies: + "@openzeppelin/contracts" "^4.4.1" + "@openzeppelin/contracts-upgradeable" "^4.7.3" + +"@scure/base@~1.1.0", "@scure/base@~1.1.2", "@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.1.5": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" + integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw== + dependencies: + "@noble/hashes" "~1.2.0" + "@noble/secp256k1" "~1.7.0" + "@scure/base" "~1.1.0" + +"@scure/bip32@1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.2.tgz#90e78c027d5e30f0b22c1f8d50ff12f3fb7559f8" + integrity sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA== + dependencies: + "@noble/curves" "~1.2.0" + "@noble/hashes" "~1.3.2" + "@scure/base" "~1.1.2" + +"@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.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" + integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg== + dependencies: + "@noble/hashes" "~1.2.0" + "@scure/base" "~1.1.0" + +"@scure/bip39@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.1.tgz#5cee8978656b272a917b7871c981e0541ad6ac2a" + integrity sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg== + dependencies: + "@noble/hashes" "~1.3.0" + "@scure/base" "~1.1.0" + +"@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" + +"@sentry/core@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" + integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/hub@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" + integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== + dependencies: + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/minimal@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" + integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/types" "5.30.0" + tslib "^1.9.3" + +"@sentry/node@^5.18.1": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" + integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== + dependencies: + "@sentry/core" "5.30.0" + "@sentry/hub" "5.30.0" + "@sentry/tracing" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + cookie "^0.4.1" + https-proxy-agent "^5.0.0" + lru_map "^0.3.3" + tslib "^1.9.3" + +"@sentry/tracing@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" + integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/types@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" + integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== + +"@sentry/utils@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" + integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== + dependencies: + "@sentry/types" "5.30.0" + tslib "^1.9.3" + +"@solana/buffer-layout@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz#b996235eaec15b1e0b5092a8ed6028df77fa6c15" + integrity sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA== + dependencies: + buffer "~6.0.3" + +"@solana/web3.js@^1.78.0": + version "1.91.7" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.91.7.tgz#1d639f8f3cc772fd6d88b982e8fdb17dc192b9e1" + integrity sha512-HqljZKDwk6Z4TajKRGhGLlRsbGK4S8EY27DA7v1z6yakewiUY3J7ZKDZRxcqz2MYV/ZXRrJ6wnnpiHFkPdv0WA== + dependencies: + "@babel/runtime" "^7.23.4" + "@noble/curves" "^1.4.0" + "@noble/hashes" "^1.3.3" + "@solana/buffer-layout" "^4.0.1" + agentkeepalive "^4.5.0" + bigint-buffer "^1.1.5" + bn.js "^5.2.1" + borsh "^0.7.0" + bs58 "^4.0.1" + buffer "6.0.3" + fast-stable-stringify "^1.0.0" + jayson "^4.1.0" + node-fetch "^2.7.0" + rpc-websockets "^7.5.1" + superstruct "^0.14.2" + +"@solidity-parser/parser@^0.14.0": + version "0.14.5" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.5.tgz#87bc3cc7b068e08195c219c91cd8ddff5ef1a804" + integrity sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg== + dependencies: + antlr4ts "^0.5.0-alpha.4" + +"@solidity-parser/parser@^0.16.0": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.16.2.tgz#42cb1e3d88b3e8029b0c9befff00b634cd92d2fa" + integrity sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg== + dependencies: + antlr4ts "^0.5.0-alpha.4" + +"@solidity-parser/parser@^0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.17.0.tgz#52a2fcc97ff609f72011014e4c5b485ec52243ef" + integrity sha512-Nko8R0/kUo391jsEHHxrGM07QFdnPGvlmox4rmH0kNiNAashItAilhy4Mv4pK5gQmW5f4sXAF58fwJbmlkGcVw== + +"@solidity-parser/parser@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.18.0.tgz#8e77a02a09ecce957255a2f48c9a7178ec191908" + integrity sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA== + +"@trivago/prettier-plugin-sort-imports@^4.0.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.3.0.tgz#725f411646b3942193a37041c84e0b2116339789" + integrity sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ== + dependencies: + "@babel/generator" "7.17.7" + "@babel/parser" "^7.20.5" + "@babel/traverse" "7.23.2" + "@babel/types" "7.17.0" + javascript-natural-sort "0.7.1" + lodash "^4.17.21" + +"@tsconfig/node10@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" + integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@typechain/ethers-v5@^10.1.1": + version "10.2.1" + resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz#50241e6957683281ecfa03fb5a6724d8a3ce2391" + integrity sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A== + dependencies: + lodash "^4.17.15" + ts-essentials "^7.0.1" + +"@typechain/hardhat@^6.1.4": + version "6.1.6" + resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-6.1.6.tgz#1a749eb35e5054c80df531cf440819cb347c62ea" + integrity sha512-BiVnegSs+ZHVymyidtK472syodx1sXYlYJJixZfRstHVGYTi8V1O7QG4nsjyb0PC/LORcq7sfBUcHto1y6UgJA== + dependencies: + fs-extra "^9.1.0" + +"@types/bn.js@^4.11.3": + version "4.11.6" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" + integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== + dependencies: + "@types/node" "*" + +"@types/bn.js@^5.1.0": + 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/chai-as-promised@^7.1.3": + version "7.1.8" + resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz#f2b3d82d53c59626b5d6bbc087667ccb4b677fe9" + integrity sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw== + dependencies: + "@types/chai" "*" + +"@types/chai@*", "@types/chai@^4.3.4": + version "4.3.14" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.14.tgz#ae3055ea2be43c91c9fd700a36d67820026d96e6" + integrity sha512-Wj71sXE4Q4AkGdG9Tvq1u/fquNz9EdG4LIJMwVVII7ashjD/8cf8fyIfJAjRr6YcsXnSE8cOGQPq1gqeR8z+3w== + +"@types/concat-stream@^1.6.0": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@types/concat-stream/-/concat-stream-1.6.1.tgz#24bcfc101ecf68e886aaedce60dfd74b632a1b74" + integrity sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA== + dependencies: + "@types/node" "*" + +"@types/connect@^3.4.33": + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== + dependencies: + "@types/node" "*" + +"@types/conventional-commits-parser@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz#8c9d23e0b415b24b91626d07017303755d542dc8" + integrity sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ== + dependencies: + "@types/node" "*" + +"@types/form-data@0.0.33": + version "0.0.33" + resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-0.0.33.tgz#c9ac85b2a5fd18435b8c85d9ecb50e6d6c893ff8" + integrity sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw== + dependencies: + "@types/node" "*" + +"@types/fs-extra@^9.0.13": + version "9.0.13" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" + integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== + dependencies: + "@types/node" "*" + +"@types/glob@^7.1.1": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/json-schema@^7.0.12", "@types/json-schema@^7.0.9": + 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/lru-cache@^5.1.0": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" + integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== + +"@types/minimatch@*": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" + integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== + +"@types/minimist@^1.2.0": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" + integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== + +"@types/mkdirp@^0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f" + integrity sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg== + dependencies: + "@types/node" "*" + +"@types/mocha@^10.0.0": + version "10.0.6" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.6.tgz#818551d39113081048bdddbef96701b4e8bb9d1b" + integrity sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg== + +"@types/node@*", "@types/node@^20.8.9": + version "20.12.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.7.tgz#04080362fa3dd6c5822061aa3124f5c152cff384" + integrity sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg== + dependencies: + undici-types "~5.26.4" + +"@types/node@20.5.1": + version "20.5.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.1.tgz#178d58ee7e4834152b0e8b4d30cbfab578b9bb30" + integrity sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg== + +"@types/node@^10.0.3": + version "10.17.60" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" + integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== + +"@types/node@^12.12.54": + version "12.20.55" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" + integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== + +"@types/node@^18.11.9": + version "18.19.31" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.31.tgz#b7d4a00f7cb826b60a543cebdbda5d189aaecdcd" + integrity sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA== + dependencies: + undici-types "~5.26.4" + +"@types/node@^8.0.0": + version "8.10.66" + resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.66.tgz#dd035d409df322acc83dff62a602f12a5783bbb3" + integrity sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw== + +"@types/normalize-package-data@^2.4.0": + version "2.4.4" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" + integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== + +"@types/pbkdf2@^3.0.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.2.tgz#2dc43808e9985a2c69ff02e2d2027bd4fe33e8dc" + integrity sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew== + dependencies: + "@types/node" "*" + +"@types/prettier@^2.1.1": + version "2.7.3" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" + integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== + +"@types/qs@^6.2.31", "@types/qs@^6.9.7": + version "6.9.15" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.15.tgz#adde8a060ec9c305a82de1babc1056e73bd64dce" + integrity sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg== + +"@types/readable-stream@^2.3.13": + version "2.3.15" + resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-2.3.15.tgz#3d79c9ceb1b6a57d5f6e6976f489b9b5384321ae" + integrity sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ== + dependencies: + "@types/node" "*" + safe-buffer "~5.1.1" + +"@types/resolve@^0.0.8": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" + integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== + dependencies: + "@types/node" "*" + +"@types/secp256k1@^4.0.1": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.6.tgz#d60ba2349a51c2cbc5e816dcd831a42029d376bf" + integrity sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ== + dependencies: + "@types/node" "*" + +"@types/semver@^7.3.12", "@types/semver@^7.5.0": + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + +"@types/triple-beam@^1.3.2": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" + integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== + +"@types/ws@^7.4.4": + version "7.4.7" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" + integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== + dependencies: + "@types/node" "*" + +"@typescript-eslint/eslint-plugin@^5.44.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" + integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== + dependencies: + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/type-utils" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/eslint-plugin@^6.7.5": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz#30830c1ca81fd5f3c2714e524c4303e0194f9cd3" + integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA== + dependencies: + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/type-utils" "6.21.0" + "@typescript-eslint/utils" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/parser@^5.44.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" + integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== + dependencies: + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + debug "^4.3.4" + +"@typescript-eslint/parser@^6.7.5": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" + integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== + dependencies: + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + +"@typescript-eslint/scope-manager@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" + integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== + dependencies: + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + +"@typescript-eslint/type-utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" + integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== + dependencies: + "@typescript-eslint/typescript-estree" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/type-utils@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz#6473281cfed4dacabe8004e8521cee0bd9d4c01e" + integrity sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag== + dependencies: + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/utils" "6.21.0" + debug "^4.3.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== + +"@typescript-eslint/types@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" + integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== + +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/typescript-estree@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" + integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== + dependencies: + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/utils@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.21.0.tgz#4714e7a6b39e773c1c8e97ec587f520840cd8134" + integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + semver "^7.5.4" + +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== + dependencies: + "@typescript-eslint/types" "5.62.0" + eslint-visitor-keys "^3.3.0" + +"@typescript-eslint/visitor-keys@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" + integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== + dependencies: + "@typescript-eslint/types" "6.21.0" + eslint-visitor-keys "^3.4.1" + +"@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== + +"@yarnpkg/lockfile@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + +JSONStream@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +abbrev@1.0.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + integrity sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q== + +abitype@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.0.tgz#237176dace81d90d018bebf3a45cb42f2a2d9e97" + integrity sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ== + +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" + +abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3, abstract-level@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.4.tgz#3ad8d684c51cc9cbc9cf9612a7100b716c414b57" + integrity sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg== + dependencies: + buffer "^6.0.3" + catering "^2.1.0" + is-buffer "^2.0.5" + level-supports "^4.0.0" + level-transcoder "^1.0.1" + module-error "^1.0.1" + queue-microtask "^1.2.3" + +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-walk@^8.1.1: + version "8.3.2" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" + integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== + +acorn@^8.4.1, 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== + +adm-zip@^0.4.16: + version "0.4.16" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" + integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== + +aes-js@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +agentkeepalive@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" + integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== + dependencies: + humanize-ms "^1.2.1" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv@^6.12.4, ajv@^6.12.6: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.1, ajv@^8.11.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" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-escapes@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-5.0.0.tgz#b6a0caf0eef0c41af190e9a749e0c00ec04bb2a6" + integrity sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA== + dependencies: + type-fest "^1.0.2" + +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@^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-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +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.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.0.0, ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +antlr4@^4.11.0: + version "4.13.1" + resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.13.1.tgz#1e0a1830a08faeb86217cb2e6c34716004e4253d" + integrity sha512-kiXTspaRYvnIArgE97z5YVVf/cDVQABr3abFRR6mE7yesLMkgu4ujuyV/sgxafQ8wgve0DJQUJ38Z8tkgA2izA== + +antlr4ts@^0.5.0-alpha.4: + version "0.5.0-alpha.4" + resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" + integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +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-ify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" + integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== + +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-uniq@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== + +asap@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +ast-parents@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/ast-parents/-/ast-parents-0.0.1.tgz#508fd0f05d0c48775d9eccda2e174423261e8dd3" + integrity sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async@1.x: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== + +async@^3.2.3: + version "3.2.5" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" + integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== + +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== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +atomic-sleep@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" + integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== + +axios@^0.21.1: + version "0.21.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== + dependencies: + follow-redirects "^1.14.0" + +axios@^1.5.1: + version "1.6.8" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66" + integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +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== + +base-x@^3.0.2: + version "3.0.9" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== + dependencies: + safe-buffer "^5.0.1" + +base64-js@^1.3.0, base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bech32@1.1.4, 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== + +bigint-buffer@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/bigint-buffer/-/bigint-buffer-1.1.5.tgz#d038f31c8e4534c1f8d0015209bf34b4fa6dd442" + integrity sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA== + dependencies: + bindings "^1.3.0" + +bigint-crypto-utils@^3.0.23: + version "3.3.0" + resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz#72ad00ae91062cf07f2b1def9594006c279c1d77" + integrity sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg== + +bignumber.js@^9.1.1: + version "9.1.2" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" + integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +bindings@^1.3.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" + +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.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== + +bn.js@4.11.6: + version "4.11.6" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" + integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== + +bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + +borsh@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.7.0.tgz#6e9560d719d86d90dc589bca60ffc8a6c51fec2a" + integrity sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA== + dependencies: + bn.js "^5.2.0" + bs58 "^4.0.0" + text-encoding-utf-8 "^1.0.2" + +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, 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.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browser-level@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browser-level/-/browser-level-1.0.1.tgz#36e8c3183d0fe1c405239792faaab5f315871011" + integrity sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ== + dependencies: + abstract-level "^1.0.2" + catering "^2.1.1" + module-error "^1.0.2" + run-parallel-limit "^1.1.0" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +browserify-aes@^1.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" + +bs58@^4.0.0, bs58@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== + dependencies: + base-x "^3.0.2" + +bs58check@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + +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, buffer@^6.0.3, 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" + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +bufferutil@^4.0.1: + version "4.0.8" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.8.tgz#1de6a71092d65d7766c4d8a522b261a6e787e8ea" + integrity sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw== + dependencies: + node-gyp-build "^4.3.0" + +bufio@^1.0.7: + version "1.2.1" + resolved "https://registry.yarnpkg.com/bufio/-/bufio-1.2.1.tgz#8d4ab3ddfcd5faa90f996f922f9397d41cbaf2de" + integrity sha512-9oR3zNdupcg/Ge2sSHQF3GX+kmvL/fTPvD0nd5AGLq8SjUYnTz+SlFjK/GXidndbZtIj+pVKXiWeR9w6e9wKCA== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cachedir@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" + integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== + +call-bind@^1.0.5, 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-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +case@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/case/-/case-1.6.3.tgz#0a4386e3e9825351ca2e6216c60467ff5f1ea1c9" + integrity sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ== + +caseless@^0.12.0, caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + +catering@^2.1.0, catering@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" + integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== + +cbor@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5" + integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg== + dependencies: + nofilter "^3.1.0" + +chai-as-promised@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" + integrity sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA== + dependencies: + check-error "^1.0.2" + +chai@^4.3.4, chai@^4.3.7: + 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@5.3.0, chalk@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + +chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + 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, chalk@^4.1.1, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +"charenc@>= 0.0.1": + version "0.0.2" + resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== + +check-error@^1.0.2, 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" + +chokidar@3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chokidar@^3.4.0, chokidar@^3.5.2: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-info@^3.7.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +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" + +classic-level@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.4.1.tgz#169ecf9f9c6200ad42a98c8576af449c1badbaee" + integrity sha512-qGx/KJl3bvtOHrGau2WklEZuXhS3zme+jf+fsu6Ej7W7IP/C49v7KNlWIsT1jZu0YnfzSIYDGcEWpCa1wKGWXQ== + dependencies: + abstract-level "^1.0.2" + catering "^2.1.0" + module-error "^1.0.1" + napi-macros "^2.2.2" + node-gyp-build "^4.3.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-cursor@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea" + integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== + dependencies: + restore-cursor "^4.0.0" + +cli-spinners@^2.5.0: + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== + +cli-table3@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" + integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== + dependencies: + object-assign "^4.1.0" + string-width "^2.1.1" + optionalDependencies: + colors "^1.1.2" + +cli-truncate@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" + integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== + dependencies: + slice-ansi "^5.0.0" + string-width "^5.0.0" + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +color-convert@^1.9.0, color-convert@^1.9.3: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + 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.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.6.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.1.3: + version "3.2.1" + resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + +colorette@^2.0.20: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +colors@1.4.0, colors@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +colorspace@1.1.x: + version "1.1.4" + resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" + integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== + dependencies: + color "^3.1.3" + text-hex "1.0.x" + +combined-stream@^1.0.6, 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-exists@^1.2.8: + version "1.2.9" + resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" + integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== + +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@11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-11.0.0.tgz#43e19c25dbedc8256203538e8d7e9346877a6f67" + integrity sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ== + +commander@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" + integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== + +commander@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + +commander@^2.20.3: + 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== + +commitizen@^4.0.3, commitizen@^4.2.5: + version "4.3.0" + resolved "https://registry.yarnpkg.com/commitizen/-/commitizen-4.3.0.tgz#0d056c542a2d2b1f9b9aba981aa32575b2849924" + integrity sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw== + dependencies: + cachedir "2.3.0" + cz-conventional-changelog "3.3.0" + dedent "0.7.0" + detect-indent "6.1.0" + find-node-modules "^2.1.2" + find-root "1.1.0" + fs-extra "9.1.0" + glob "7.2.3" + inquirer "8.2.5" + is-utf8 "^0.2.1" + lodash "4.17.21" + minimist "1.2.7" + strip-bom "4.0.0" + strip-json-comments "3.1.1" + +compare-func@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" + integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== + dependencies: + array-ify "^1.0.0" + dot-prop "^5.1.0" + +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== + +concat-stream@^1.6.0, concat-stream@^1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +conventional-changelog-angular@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-6.0.0.tgz#a9a9494c28b7165889144fd5b91573c4aa9ca541" + integrity sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg== + dependencies: + compare-func "^2.0.0" + +conventional-changelog-conventionalcommits@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-6.1.0.tgz#3bad05f4eea64e423d3d90fc50c17d2c8cf17652" + integrity sha512-3cS3GEtR78zTfMzk0AizXKKIdN4OvSh7ibNz6/DPbhWWQu7LqE/8+/GqSodV+sywUR2gpJAdP/1JFf4XtN7Zpw== + dependencies: + compare-func "^2.0.0" + +conventional-commit-types@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz#7c9214e58eae93e85dd66dbfbafe7e4fffa2365b" + integrity sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg== + +conventional-commits-parser@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-4.0.0.tgz#02ae1178a381304839bce7cea9da5f1b549ae505" + integrity sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg== + dependencies: + JSONStream "^1.3.5" + is-text-path "^1.0.1" + meow "^8.1.2" + split2 "^3.2.2" + +cookie@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + +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== + +cosmiconfig-typescript-loader@^4.0.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.4.0.tgz#f3feae459ea090f131df5474ce4b1222912319f9" + integrity sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw== + +cosmiconfig-typescript-loader@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.0.0.tgz#0d3becfe022a871f7275ceb2397d692e06045dc8" + integrity sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA== + dependencies: + jiti "^1.19.1" + +cosmiconfig@^8.0.0: + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== + dependencies: + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + path-type "^4.0.0" + +cosmiconfig@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" + integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== + dependencies: + env-paths "^2.2.1" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + +crc-32@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" + integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== + +create-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.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" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-env@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== + dependencies: + cross-spawn "^7.0.1" + +cross-spawn@^7.0.1, 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" + +"crypt@>= 0.0.1": + version "0.0.2" + resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== + +cz-conventional-changelog@3.3.0, cz-conventional-changelog@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz#9246947c90404149b3fe2cf7ee91acad3b7d22d2" + integrity sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw== + dependencies: + chalk "^2.4.1" + commitizen "^4.0.3" + conventional-commit-types "^3.0.0" + lodash.map "^4.5.1" + longest "^2.0.1" + word-wrap "^1.0.3" + optionalDependencies: + "@commitlint/load" ">6.1.1" + +dargs@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" + integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== + +death@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" + integrity sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w== + +debug@4, debug@4.3.4, debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, 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" + +decamelize-keys@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" + integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +dedent@0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== + +deep-eql@^4.0.1, 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== + +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + +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" + +delay@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" + integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== + +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== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q== + +detect-indent@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" + integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +difflib@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/difflib/-/difflib-0.2.4.tgz#b5e30361a6db023176d562892db85940a718f47e" + integrity sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w== + dependencies: + heap ">= 0.2.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@^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" + +dot-prop@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +dotenv@^16.0.3, dotenv@^16.3.1: + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +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.2, elliptic@^6.5.4: + 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@^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== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +enabled@2.0.x: + version "2.0.0" + resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" + integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== + +encode-utf8@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" + integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw== + +enquirer@^2.3.0, enquirer@^2.3.6: + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== + dependencies: + ansi-colors "^4.1.1" + strip-ansi "^6.0.1" + +env-paths@^2.2.0, env-paths@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-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.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== + +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ== + dependencies: + es6-promise "^4.0.3" + +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@4.0.0, escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escodegen@1.8.x: + version "1.8.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + integrity sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A== + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" + +eslint-config-prettier@^8.5.0: + version "8.10.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" + integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== + +eslint-config-prettier@^9.0.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-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@^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-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@^8.28.0, eslint@^8.51.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@^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@2.7.x, esprima@^2.7.1: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + integrity sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A== + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.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.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@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + integrity sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA== + +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== + +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== + +eth-gas-reporter@^0.2.25: + version "0.2.27" + resolved "https://registry.yarnpkg.com/eth-gas-reporter/-/eth-gas-reporter-0.2.27.tgz#928de8548a674ed64c7ba0bf5795e63079150d4e" + integrity sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw== + dependencies: + "@solidity-parser/parser" "^0.14.0" + axios "^1.5.1" + cli-table3 "^0.5.0" + colors "1.4.0" + ethereum-cryptography "^1.0.3" + ethers "^5.7.2" + fs-readdir-recursive "^1.1.0" + lodash "^4.17.14" + markdown-table "^1.1.3" + mocha "^10.2.0" + req-cwd "^2.0.0" + sha1 "^1.1.1" + sync-request "^6.0.0" + +ethereum-bloom-filters@^1.0.6: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.1.0.tgz#b3fc1eb789509ee30db0bf99a2988ccacb8d0397" + integrity sha512-J1gDRkLpuGNvWYzWslBQR9cDV4nd4kfvVTE/Wy4Kkm4yb3EYRSlyi0eB/inTsSTTVyA0+HyzHgbr95Fn/Z1fSw== + dependencies: + "@noble/hashes" "^1.4.0" + +ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" + integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== + dependencies: + "@types/pbkdf2" "^3.0.0" + "@types/secp256k1" "^4.0.1" + blakejs "^1.1.0" + browserify-aes "^1.2.0" + bs58check "^2.1.2" + create-hash "^1.2.0" + create-hmac "^1.1.7" + hash.js "^1.1.7" + keccak "^3.0.0" + pbkdf2 "^3.0.17" + randombytes "^2.1.0" + safe-buffer "^5.1.2" + scrypt-js "^3.0.0" + secp256k1 "^4.0.1" + setimmediate "^1.0.5" + +ethereum-cryptography@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz#5ccfa183e85fdaf9f9b299a79430c044268c9b3a" + integrity sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw== + dependencies: + "@noble/hashes" "1.2.0" + "@noble/secp256k1" "1.7.1" + "@scure/bip32" "1.1.5" + "@scure/bip39" "1.1.1" + +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" + +ethereumjs-abi@^0.6.8: + version "0.6.8" + resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" + integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== + dependencies: + bn.js "^4.11.8" + ethereumjs-util "^6.0.0" + +ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" + integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== + dependencies: + "@types/bn.js" "^4.11.3" + bn.js "^4.11.0" + create-hash "^1.1.2" + elliptic "^6.5.2" + ethereum-cryptography "^0.1.3" + ethjs-util "0.1.6" + rlp "^2.2.3" + +ethereumjs-util@^7.1.4: + version "7.1.5" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" + integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== + dependencies: + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" + +ethers@^5.7.0, ethers@^5.7.1, ethers@^5.7.2: + 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" + +ethjs-unit@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" + integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw== + dependencies: + bn.js "4.11.6" + number-to-bn "1.7.0" + +ethjs-util@0.1.6, ethjs-util@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" + integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== + dependencies: + is-hex-prefixed "1.0.0" + strip-hex-prefix "1.0.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== + +eventemitter3@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + +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.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@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-7.2.0.tgz#657e75ba984f42a70f38928cedc87d6f2d4fe4e9" + integrity sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.1" + human-signals "^4.3.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^3.0.7" + strip-final-newline "^3.0.0" + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw== + dependencies: + homedir-polyfill "^1.0.1" + +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" + +eyes@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ== + +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, fast-diff@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== + +fast-glob@^3.0.3, fast-glob@^3.2.9: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + 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== + +fast-redact@^3.1.1: + version "3.5.0" + resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.5.0.tgz#e9ea02f7e57d0cd8438180083e93077e496285e4" + integrity sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A== + +fast-stable-stringify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz#5c5543462b22aeeefd36d05b34e51c78cb86d313" + integrity sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag== + +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" + +fecha@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" + integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + 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-node-modules@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/find-node-modules/-/find-node-modules-2.1.3.tgz#3c976cff2ca29ee94b4f9eafc613987fc4c0ee44" + integrity sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg== + dependencies: + findup-sync "^4.0.0" + merge "^2.1.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-root@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + +find-up@5.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" + +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== + dependencies: + locate-path "^2.0.0" + +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-yarn-workspace-root@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" + integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== + dependencies: + micromatch "^4.0.2" + +findup-sync@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-4.0.0.tgz#956c9cdde804052b881b428512905c4a5f2cdef0" + integrity sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^4.0.2" + resolve-dir "^1.0.1" + +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@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + +fmix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/fmix/-/fmix-0.1.0.tgz#c7bbf124dec42c9d191cfb947d0a9778dd986c0c" + integrity sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w== + dependencies: + imul "^1.0.0" + +fn.name@1.x.x: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" + integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== + +follow-redirects@^1.12.1, follow-redirects@^1.14.0, follow-redirects@^1.15.6: + version "1.15.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== + +form-data@^2.2.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" + integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +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" + +fp-ts@1.19.3: + version "1.19.3" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" + integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== + +fp-ts@^1.0.0: + version "1.19.5" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" + integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== + +fs-extra@9.1.0, fs-extra@^9.0.0, fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" + integrity sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + +fs-extra@^10.0.0, fs-extra@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^11.0.0: + version "11.2.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" + integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^7.0.0, fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-readdir-recursive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== + +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== + +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== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +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.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-port@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" + integrity sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg== + +get-stream@^6.0.0, get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +ghost-testrpc@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz#c4de9557b1d1ae7b2d20bbe474a91378ca90ce92" + integrity sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ== + dependencies: + chalk "^2.4.2" + node-emoji "^1.10.0" + +git-raw-commits@^2.0.11: + version "2.0.11" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" + integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== + dependencies: + dargs "^7.0.0" + lodash "^4.17.15" + meow "^8.0.0" + split2 "^3.0.0" + through2 "^4.0.0" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + 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@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.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + 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.2.3, glob@^7.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.1.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" + +glob@^5.0.15: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-directory@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/global-directory/-/global-directory-4.0.1.tgz#4d7ac7cfd2cb73f304c53b8810891748df5e361e" + integrity sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q== + dependencies: + ini "4.1.1" + +global-dirs@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + integrity sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg== + dependencies: + ini "^1.3.4" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg== + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globals@^11.1.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" + +globby@^10.0.1: + version "10.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" + integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== + dependencies: + "@types/glob" "^7.1.1" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.0.3" + glob "^7.1.3" + ignore "^5.1.1" + merge2 "^1.2.3" + slash "^3.0.0" + +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.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +handlebars@^4.0.1: + version "4.7.8" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" + integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.2" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + +hardhat-change-network@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/hardhat-change-network/-/hardhat-change-network-0.0.7.tgz#9f9b7943ff966515658b70bf5e44bc2f073af402" + integrity sha512-Usp9fJan9SOJnOlVcv/jMJDchseE7bIDA5ZsBnracgVk4MiBwkvMqpmLWn5G1aDBvnUCthvS2gO3odfahgkV0Q== + +hardhat-deploy@^0.11.31: + version "0.11.45" + resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.11.45.tgz#bed86118175a38a03bb58aba2ce1ed5e80a20bc8" + integrity sha512-aC8UNaq3JcORnEUIwV945iJuvBwi65tjHVDU3v6mOcqik7WAzHVCJ7cwmkkipsHrWysrB5YvGF1q9S1vIph83w== + dependencies: + "@ethersproject/abi" "^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/contracts" "^5.7.0" + "@ethersproject/providers" "^5.7.2" + "@ethersproject/solidity" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wallet" "^5.7.0" + "@types/qs" "^6.9.7" + axios "^0.21.1" + chalk "^4.1.2" + chokidar "^3.5.2" + debug "^4.3.2" + enquirer "^2.3.6" + ethers "^5.7.0" + form-data "^4.0.0" + fs-extra "^10.0.0" + match-all "^1.2.6" + murmur-128 "^0.2.1" + qs "^6.9.4" + zksync-web3 "^0.14.3" + +hardhat-gas-reporter@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.10.tgz#ebe5bda5334b5def312747580cd923c2b09aef1b" + integrity sha512-02N4+So/fZrzJ88ci54GqwVA3Zrf0C9duuTyGt0CFRIh/CdNwbnTgkXkRfojOMLBQ+6t+lBIkgbsOtqMvNwikA== + dependencies: + array-uniq "1.0.3" + eth-gas-reporter "^0.2.25" + sha1 "^1.1.1" + +hardhat@2.19.4: + version "2.19.4" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.19.4.tgz#5112c30295d8be2e18e55d847373c50483ed1902" + integrity sha512-fTQJpqSt3Xo9Mn/WrdblNGAfcANM6XC3tAEi6YogB4s02DmTf93A8QsGb8uR0KR8TFcpcS8lgiW4ugAIYpnbrQ== + dependencies: + "@ethersproject/abi" "^5.1.2" + "@metamask/eth-sig-util" "^4.0.0" + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-blockchain" "7.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-evm" "2.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-statemanager" "2.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + "@nomicfoundation/ethereumjs-vm" "7.0.2" + "@nomicfoundation/solidity-analyzer" "^0.1.0" + "@sentry/node" "^5.18.1" + "@types/bn.js" "^5.1.0" + "@types/lru-cache" "^5.1.0" + adm-zip "^0.4.16" + aggregate-error "^3.0.0" + ansi-escapes "^4.3.0" + chalk "^2.4.2" + chokidar "^3.4.0" + ci-info "^2.0.0" + debug "^4.1.1" + enquirer "^2.3.0" + env-paths "^2.2.0" + ethereum-cryptography "^1.0.3" + ethereumjs-abi "^0.6.8" + find-up "^2.1.0" + fp-ts "1.19.3" + fs-extra "^7.0.1" + glob "7.2.0" + immutable "^4.0.0-rc.12" + io-ts "1.10.4" + keccak "^3.0.2" + lodash "^4.17.11" + mnemonist "^0.38.0" + mocha "^10.0.0" + p-map "^4.0.0" + raw-body "^2.4.1" + resolve "1.17.0" + semver "^6.3.0" + solc "0.7.3" + source-map-support "^0.5.13" + stacktrace-parser "^0.1.10" + tsort "0.0.1" + undici "^5.14.0" + uuid "^8.3.2" + ws "^7.4.6" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity 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.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: + 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.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +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.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hasown@^2.0.0: + 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" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +"heap@>= 0.2.0": + version "0.2.7" + resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" + integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== + +hmac-drbg@^1.0.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" + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +hosted-git-info@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== + dependencies: + lru-cache "^6.0.0" + +http-basic@^8.1.1: + version "8.1.3" + resolved "https://registry.yarnpkg.com/http-basic/-/http-basic-8.1.3.tgz#a7cabee7526869b9b710136970805b1004261bbf" + integrity sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw== + dependencies: + caseless "^0.12.0" + concat-stream "^1.6.2" + http-response-object "^3.0.1" + parse-cache-control "^1.0.1" + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-response-object@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/http-response-object/-/http-response-object-3.0.2.tgz#7f435bb210454e4360d074ef1f989d5ea8aa9810" + integrity sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA== + dependencies: + "@types/node" "^10.0.3" + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +human-signals@^4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" + integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + dependencies: + ms "^2.0.0" + +husky@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" + integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== + +iconv-lite@0.4.24, 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.1.13, 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-by-default@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== + +ignore@^5.1.1, ignore@^5.2.0, ignore@^5.2.4: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + +immutable@^4.0.0-rc.12: + version "4.3.5" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.5.tgz#f8b436e66d59f99760dc577f5c99a4fd2a5cc5a0" + integrity sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw== + +import-fresh@^3.0.0, import-fresh@^3.2.1, import-fresh@^3.3.0: + 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-meta-resolve@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz#f9db8bead9fafa61adb811db77a2bf22c5399706" + integrity sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw== + +imul@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/imul/-/imul-1.0.1.tgz#9d5867161e8b3de96c2c38d5dc7cb102f35e2ac9" + integrity sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA== + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +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.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" + integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== + +ini@^1.3.4, ini@^1.3.5: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inquirer@8.2.5: + version "8.2.5" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.5.tgz#d8654a7542c35a9b9e069d27e2df4858784d54f8" + integrity sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + wrap-ansi "^7.0.0" + +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +io-ts@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" + integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g== + dependencies: + fp-ts "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-core-module@^2.13.0, is-core-module@^2.5.0: + 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-docker@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-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@^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-fullwidth-code-point@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hex-prefixed@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" + integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +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-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-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-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + +is-text-path@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" + integrity sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w== + dependencies: + text-extensions "^1.0.0" + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-utf8@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== + +is-windows@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@^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== + +isomorphic-ws@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" + integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== + +isows@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.3.tgz#93c1cf0575daf56e7120bab5c8c448b0809d0d74" + integrity sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg== + +javascript-natural-sort@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59" + integrity sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw== + +jayson@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/jayson/-/jayson-4.1.0.tgz#60dc946a85197317f2b1439d672a8b0a99cea2f9" + integrity sha512-R6JlbyLN53Mjku329XoRT2zJAE6ZgOQ8f91ucYdMCD4nkGCF9kZSrcGXpHIU4jeKj58zUZke2p+cdQchU7Ly7A== + dependencies: + "@types/connect" "^3.4.33" + "@types/node" "^12.12.54" + "@types/ws" "^7.4.4" + JSONStream "^1.3.5" + commander "^2.20.3" + delay "^5.0.0" + es6-promisify "^5.0.0" + eyes "^0.1.8" + isomorphic-ws "^4.0.1" + json-stringify-safe "^5.0.1" + uuid "^8.3.2" + ws "^7.4.5" + +jiti@^1.19.1: + version "1.21.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== + +js-sdsl@^4.1.4: + version "4.4.2" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.2.tgz#2e3c031b1f47d3aca8b775532e3ebb0818e7f847" + integrity sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w== + +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.x: + 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, 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" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +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.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-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== + +json-stable-stringify@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz#52d4361b47d49168bcc4e564189a42e5a7439454" + integrity sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg== + dependencies: + call-bind "^1.0.5" + isarray "^2.0.5" + jsonify "^0.0.1" + object-keys "^1.1.1" + +json-stringify-safe@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" + integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== + +jsonschema@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" + integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== + +keccak@^3.0.0, keccak@^3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d" + integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.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, kind-of@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== + dependencies: + graceful-fs "^4.1.11" + +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== + optionalDependencies: + graceful-fs "^4.1.9" + +kuler@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" + integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== + +level-supports@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a" + integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA== + +level-transcoder@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c" + integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w== + dependencies: + buffer "^6.0.3" + module-error "^1.0.1" + +level@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/level/-/level-8.0.1.tgz#737161db1bc317193aca4e7b6f436e7e1df64379" + integrity sha512-oPBGkheysuw7DmzFQYyFe8NAia5jFLAgEnkgWnK3OXAuJr8qFT+xBQIwokAZPME2bhPFzS8hlYcL16m8UZrtwQ== + dependencies: + abstract-level "^1.0.4" + browser-level "^1.0.1" + classic-level "^1.2.0" + +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" + +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" + +lilconfig@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +lint-staged@^13.0.4: + version "13.3.0" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-13.3.0.tgz#7965d72a8d6a6c932f85e9c13ccf3596782d28a5" + integrity sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ== + dependencies: + chalk "5.3.0" + commander "11.0.0" + debug "4.3.4" + execa "7.2.0" + lilconfig "2.1.0" + listr2 "6.6.1" + micromatch "4.0.5" + pidtree "0.6.0" + string-argv "0.3.2" + yaml "2.3.1" + +listr2@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-6.6.1.tgz#08b2329e7e8ba6298481464937099f4a2cd7f95d" + integrity sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg== + dependencies: + cli-truncate "^3.1.0" + colorette "^2.0.20" + eventemitter3 "^5.0.1" + log-update "^5.0.1" + rfdc "^1.3.0" + wrap-ansi "^8.1.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + 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.isfunction@^3.0.9: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" + integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw== + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== + +lodash.kebabcase@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" + integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== + +lodash.map@^4.5.1: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" + integrity sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q== + +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.mergewith@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" + integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== + +lodash.snakecase@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" + integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== + +lodash.startcase@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" + integrity sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + +lodash.upperfirst@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" + integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== + +lodash@4.17.21, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@4.1.0, log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log-update@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-5.0.1.tgz#9e928bf70cb183c1f0c9e91d9e6b7115d597ce09" + integrity sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw== + dependencies: + ansi-escapes "^5.0.0" + cli-cursor "^4.0.0" + slice-ansi "^5.0.0" + strip-ansi "^7.0.1" + wrap-ansi "^8.0.1" + +logform@^2.3.2, logform@^2.4.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.6.0.tgz#8c82a983f05d6eaeb2d75e3decae7a768b2bf9b5" + integrity sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ== + dependencies: + "@colors/colors" "1.6.0" + "@types/triple-beam" "^1.3.2" + fecha "^4.2.0" + ms "^2.1.1" + safe-stable-stringify "^2.3.1" + triple-beam "^1.3.0" + +longest@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-2.0.1.tgz#781e183296aa94f6d4d916dc335d0d17aefa23f8" + integrity sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q== + +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@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lru_map@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" + integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +map-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== + +map-obj@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" + integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== + +markdown-table@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" + integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== + +match-all@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/match-all/-/match-all-1.2.6.tgz#66d276ad6b49655551e63d3a6ee53e8be0566f8d" + integrity sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ== + +mcl-wasm@^0.7.1: + version "0.7.9" + resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.9.tgz#c1588ce90042a8700c3b60e40efb339fc07ab87f" + integrity sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ== + +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" + +memory-level@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692" + integrity sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og== + dependencies: + abstract-level "^1.0.0" + functional-red-black-tree "^1.0.1" + module-error "^1.0.1" + +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== + +meow@^8.0.0, meow@^8.1.2: + version "8.1.2" + resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" + integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^3.0.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.18.0" + yargs-parser "^20.2.3" + +merge-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.2.3, 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== + +merge@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/merge/-/merge-2.1.1.tgz#59ef4bf7e0b3e879186436e8481c06a6c162ca98" + integrity sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w== + +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.5, micromatch@^4.0.2, 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" + +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: + 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@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + 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@2 || 3", minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimist-options@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + +minimist@1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" + integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== + +minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mkdirp@0.5.x, 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== + +mnemonist@^0.38.0: + version "0.38.5" + resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" + integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg== + dependencies: + obliterator "^2.0.0" + +mocha@^10.0.0, mocha@^10.1.0, mocha@^10.2.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.4.0.tgz#ed03db96ee9cfc6d20c56f8e2af07b961dbae261" + integrity sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA== + dependencies: + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.4" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "8.1.0" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "5.0.1" + ms "2.1.3" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + workerpool "6.2.1" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +module-error@^1.0.1, module-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" + integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.0.0, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +murmur-128@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/murmur-128/-/murmur-128-0.2.1.tgz#a9f6568781d2350ecb1bf80c14968cadbeaa4b4d" + integrity sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg== + dependencies: + encode-utf8 "^1.0.2" + fmix "^0.1.0" + imul "^1.0.0" + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +napi-macros@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.2.2.tgz#817fef20c3e0e40a963fbf7b37d1600bd0201044" + integrity sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g== + +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + +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== + +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-emoji@^1.10.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" + integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== + dependencies: + lodash "^4.17.21" + +node-fetch@^2.7.0: + 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.0, node-gyp-build@^4.3.0: + 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== + +nodemon@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.1.0.tgz#ff7394f2450eb6a5e96fe4180acd5176b29799c9" + integrity sha512-xqlktYlDMCepBJd43ZQhjWwMw2obW/JRvkrLxq5RCNcuDDX1DbcPT+qT1IlIIdf+DhnWs90JpTMe+Y5KxOchvA== + dependencies: + chokidar "^3.5.2" + debug "^4" + ignore-by-default "^1.0.1" + minimatch "^3.1.2" + pstree.remy "^1.1.8" + semver "^7.5.3" + simple-update-notifier "^2.0.0" + supports-color "^5.5.0" + touch "^3.1.0" + undefsafe "^2.0.5" + +nofilter@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" + integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== + +nopt@3.x: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg== + dependencies: + abbrev "1" + +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== + dependencies: + abbrev "1" + +normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-package-data@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" + integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== + dependencies: + hosted-git-info "^4.0.1" + is-core-module "^2.5.0" + semver "^7.3.4" + validate-npm-package-license "^3.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +npm-run-path@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" + integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== + dependencies: + path-key "^4.0.0" + +number-to-bn@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" + integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig== + dependencies: + bn.js "4.11.6" + strip-hex-prefix "1.0.0" + +object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +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-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== + +obliterator@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" + integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== + +on-exit-leak-free@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz#fed195c9ebddb7d9e4c3842f93f281ac8dadd3b8" + integrity sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA== + +once@1.x, once@^1.3.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" + +one-time@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" + integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== + dependencies: + fn.name "1.x.x" + +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + +open@^7.4.2: + version "7.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + +optionator@^0.8.1: + 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.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.5" + +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +ordinal@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ordinal/-/ordinal-1.0.3.tgz#1a3c7726a61728112f50944ad7c35c06ae3a0d4d" + integrity sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ== + +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-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.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@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== + dependencies: + p-limit "^1.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + 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-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +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-cache-control@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e" + integrity sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg== + +parse-json@^5.0.0, parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== + +patch-package@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-8.0.0.tgz#d191e2f1b6e06a4624a0116bcb88edd6714ede61" + integrity sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + chalk "^4.1.2" + ci-info "^3.7.0" + cross-spawn "^7.0.3" + find-yarn-workspace-root "^2.0.0" + fs-extra "^9.0.0" + json-stable-stringify "^1.0.2" + klaw-sync "^6.0.0" + minimist "^1.2.6" + open "^7.4.2" + rimraf "^2.6.3" + semver "^7.5.3" + slash "^2.0.0" + tmp "^0.0.33" + yaml "^2.2.2" + +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-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + +path-parse@^1.0.6, 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.17: + 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.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pidtree@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" + integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pino-abstract-transport@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz#97f9f2631931e242da531b5c66d3079c12c9d1b5" + integrity sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q== + dependencies: + readable-stream "^4.0.0" + split2 "^4.0.0" + +pino-std-serializers@^6.0.0: + version "6.2.2" + resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz#d9a9b5f2b9a402486a5fc4db0a737570a860aab3" + integrity sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA== + +pino@^8.19.0: + version "8.21.0" + resolved "https://registry.yarnpkg.com/pino/-/pino-8.21.0.tgz#e1207f3675a2722940d62da79a7a55a98409f00d" + integrity sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q== + dependencies: + atomic-sleep "^1.0.0" + fast-redact "^3.1.1" + on-exit-leak-free "^2.1.0" + pino-abstract-transport "^1.2.0" + pino-std-serializers "^6.0.0" + process-warning "^3.0.0" + quick-format-unescaped "^4.0.3" + real-require "^0.2.0" + safe-stable-stringify "^2.3.1" + sonic-boom "^3.7.0" + thread-stream "^2.6.0" + +pinst@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pinst/-/pinst-3.0.0.tgz#80dec0a85f1f993c6084172020f3dbf512897eec" + integrity sha512-cengSmBxtCyaJqtRSvJorIIZXMXg+lJ3sIljGmtBGUVonMnMsVJbnzl6jGN1HkOWwxNuJynCJ2hXxxqCQrFDdw== + +pluralize@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== + +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-plugin-solidity@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.3.1.tgz#59944d3155b249f7f234dee29f433524b9a4abcf" + integrity sha512-MN4OP5I2gHAzHZG1wcuJl0FsLS3c4Cc5494bbg+6oQWBPuEamjwDvmGfFMZ6NFzsh3Efd9UUxeT7ImgjNH4ozA== + dependencies: + "@solidity-parser/parser" "^0.17.0" + semver "^7.5.4" + solidity-comments-extractor "^0.0.8" + +prettier@^2.1.2, prettier@^2.3.1, prettier@^2.8.3, prettier@^2.8.7: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + +prettier@^3.0.3: + 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-warning@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-3.0.0.tgz#96e5b88884187a1dce6f5c3166d611132058710b" + integrity sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ== + +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== + +promise@^8.0.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" + integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== + dependencies: + asap "~2.0.6" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +pstree.remy@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" + integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== + +punycode@^2.1.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.4.0, qs@^6.9.4: + 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" + +queue-microtask@^1.2.2, queue-microtask@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-format-unescaped@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" + integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== + +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== + +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" + +raw-body@^2.4.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@^2.2.2: + 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@^4.0.0: + 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" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +readonly-date@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/readonly-date/-/readonly-date-1.0.0.tgz#5af785464d8c7d7c40b9d738cbde8c646f97dcd9" + integrity sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ== + +real-require@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.2.0.tgz#209632dea1810be2ae063a6ac084fee7e33fba78" + integrity sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg== + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== + dependencies: + resolve "^1.1.6" + +recursive-readdir@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" + integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== + dependencies: + minimatch "^3.0.5" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +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== + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +req-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/req-cwd/-/req-cwd-2.0.0.tgz#d4082b4d44598036640fb73ddea01ed53db49ebc" + integrity sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ== + dependencies: + req-from "^2.0.0" + +req-from@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/req-from/-/req-from-2.0.0.tgz#d74188e47f93796f4aa71df6ee35ae689f3e0e70" + integrity sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA== + dependencies: + resolve-from "^3.0.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.0, require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg== + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-from@5.0.0, resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== + +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-global@1.0.0, resolve-global@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-global/-/resolve-global-1.0.0.tgz#a2a79df4af2ca3f49bf77ef9ddacd322dad19255" + integrity sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw== + dependencies: + global-dirs "^0.1.1" + +resolve@1.1.x: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== + +resolve@1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + +resolve@^1.1.6, resolve@^1.10.0, resolve@^1.8.1: + 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@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +restore-cursor@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-4.0.0.tgz#519560a4318975096def6e609d44100edaa4ccb9" + integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== + dependencies: + onetime "^5.1.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== + +rfdc@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f" + integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg== + +rimraf@^2.2.8, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + 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" + +rlp@^2.2.3, rlp@^2.2.4: + version "2.2.7" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== + dependencies: + bn.js "^5.2.0" + +rpc-websockets@^7.5.1: + version "7.10.0" + resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.10.0.tgz#8ffaf6aaab3eb18e603c7549988cf49feeddcd29" + integrity sha512-cemZ6RiDtYZpPiBzYijdOrkQQzmBCmug0E9SdRH2gIUNT15ql4mwCYWIp0VnSZq6Qrw/JkGUygp4PrK1y9KfwQ== + dependencies: + "@babel/runtime" "^7.17.2" + eventemitter3 "^4.0.7" + uuid "^8.3.2" + ws "^8.5.0" + optionalDependencies: + bufferutil "^4.0.1" + utf-8-validate "^5.0.2" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel-limit@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz#be80e936f5768623a38a963262d6bef8ff11e7ba" + integrity sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw== + dependencies: + queue-microtask "^1.2.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rustbn.js@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" + integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== + +rxjs@^7.5.5: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-stable-stringify@^2.3.1: + version "2.4.3" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" + integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sc-istanbul@^0.4.5: + version "0.4.6" + resolved "https://registry.yarnpkg.com/sc-istanbul/-/sc-istanbul-0.4.6.tgz#cf6784355ff2076f92d70d59047d71c13703e839" + integrity sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g== + dependencies: + abbrev "1.0.x" + async "1.x" + escodegen "1.8.x" + esprima "2.7.x" + glob "^5.0.15" + handlebars "^4.0.1" + js-yaml "3.x" + mkdirp "0.5.x" + nopt "3.x" + once "1.x" + resolve "1.1.x" + supports-color "^3.1.0" + which "^1.1.1" + wordwrap "^1.0.0" + +scrypt-js@3.0.1, scrypt-js@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +secp256k1@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== + dependencies: + elliptic "^6.5.4" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + +"semver@2 || 3 || 4 || 5", semver@^5.5.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +semver@^6.3.0: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.4, semver@^7.3.7, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4: + 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.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +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" + +setimmediate@^1.0.5: + 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== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + 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" + +sha1@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/sha1/-/sha1-1.1.1.tgz#addaa7a93168f393f19eb2b15091618e2700f848" + integrity sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA== + dependencies: + charenc ">= 0.0.1" + crypt ">= 0.0.1" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shelljs@^0.8.3, shelljs@^0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" + integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +shx@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/shx/-/shx-0.3.4.tgz#74289230b4b663979167f94e1935901406e40f02" + integrity sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g== + dependencies: + minimist "^1.2.3" + shelljs "^0.8.5" + +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.2, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + +simple-update-notifier@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" + integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== + dependencies: + semver "^7.5.3" + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +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@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== + dependencies: + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" + +solc@0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" + integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== + dependencies: + command-exists "^1.2.8" + commander "3.0.2" + follow-redirects "^1.12.1" + fs-extra "^0.30.0" + js-sha3 "0.8.0" + memorystream "^0.3.1" + require-from-string "^2.0.0" + semver "^5.5.0" + tmp "0.0.33" + +solhint-plugin-prettier@^0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/solhint-plugin-prettier/-/solhint-plugin-prettier-0.0.5.tgz#e3b22800ba435cd640a9eca805a7f8bc3e3e6a6b" + integrity sha512-7jmWcnVshIrO2FFinIvDQmhQpfpS2rRRn3RejiYgnjIE68xO2bvrYvjqVNfrio4xH9ghOqn83tKuTzLjEbmGIA== + dependencies: + prettier-linter-helpers "^1.0.0" + +solhint@^3.3.7: + version "3.6.2" + resolved "https://registry.yarnpkg.com/solhint/-/solhint-3.6.2.tgz#2b2acbec8fdc37b2c68206a71ba89c7f519943fe" + integrity sha512-85EeLbmkcPwD+3JR7aEMKsVC9YrRSxd4qkXuMzrlf7+z2Eqdfm1wHWq1ffTuo5aDhoZxp2I9yF3QkxZOxOL7aQ== + dependencies: + "@solidity-parser/parser" "^0.16.0" + ajv "^6.12.6" + antlr4 "^4.11.0" + ast-parents "^0.0.1" + chalk "^4.1.2" + commander "^10.0.0" + cosmiconfig "^8.0.0" + fast-diff "^1.2.0" + glob "^8.0.3" + ignore "^5.2.4" + js-yaml "^4.1.0" + lodash "^4.17.21" + pluralize "^8.0.0" + semver "^7.5.2" + strip-ansi "^6.0.1" + table "^6.8.1" + text-table "^0.2.0" + optionalDependencies: + prettier "^2.8.3" + +solidity-comments-extractor@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/solidity-comments-extractor/-/solidity-comments-extractor-0.0.8.tgz#f6e148ab0c49f30c1abcbecb8b8df01ed8e879f8" + integrity sha512-htM7Vn6LhHreR+EglVMd2s+sZhcXAirB1Zlyrv5zBuTxieCvjfnRpd7iZk75m/u6NOlEyQ94C6TWbBn2cY7w8g== + +solidity-coverage@^0.8.2: + version "0.8.12" + resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.8.12.tgz#c4fa2f64eff8ada7a1387b235d6b5b0e6c6985ed" + integrity sha512-8cOB1PtjnjFRqOgwFiD8DaUsYJtVJ6+YdXQtSZDrLGf8cdhhh8xzTtGzVTGeBf15kTv0v7lYPJlV/az7zLEPJw== + dependencies: + "@ethersproject/abi" "^5.0.9" + "@solidity-parser/parser" "^0.18.0" + chalk "^2.4.2" + death "^1.1.0" + difflib "^0.2.4" + fs-extra "^8.1.0" + ghost-testrpc "^0.0.2" + global-modules "^2.0.0" + globby "^10.0.1" + jsonschema "^1.2.4" + lodash "^4.17.21" + mocha "^10.2.0" + node-emoji "^1.10.0" + pify "^4.0.1" + recursive-readdir "^2.2.2" + sc-istanbul "^0.4.5" + semver "^7.3.4" + shelljs "^0.8.3" + web3-utils "^1.3.6" + +solidity-rlp@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/solidity-rlp/-/solidity-rlp-2.0.8.tgz#1548370b690ef06dbb62af06b7675bc86b19bbe3" + integrity sha512-gzYzHoFKRH1ydJeCfzm3z/BvKrZGK/V9+qbOlNbBcRAYeizjCdDNhLTTE8iIJrHqsRrZRSOo+7mhbnxoBoZvJQ== + +sonic-boom@^3.7.0: + version "3.8.1" + resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-3.8.1.tgz#d5ba8c4e26d6176c9a1d14d549d9ff579a163422" + integrity sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg== + dependencies: + atomic-sleep "^1.0.0" + +source-map-support@^0.5.13: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.5.0: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +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== + +source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + integrity sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA== + dependencies: + amdefine ">=0.0.4" + +spdx-correct@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.17" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz#887da8aa73218e51a1d917502d79863161a93f9c" + integrity sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg== + +split2@^3.0.0, split2@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" + integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== + dependencies: + readable-stream "^3.0.0" + +split2@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== + +stacktrace-parser@^0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" + integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== + dependencies: + type-fest "^0.7.1" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +string-argv@0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" + integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== + +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@^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@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.0, string-width@^5.0.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +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@^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@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-bom@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + +strip-hex-prefix@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" + integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== + dependencies: + is-hex-prefixed "1.0.0" + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@3.1.1, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +superstruct@^0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.14.2.tgz#0dbcdf3d83676588828f1cf5ed35cda02f59025b" + integrity sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ== + +supports-color@8.1.1: + 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-color@^3.1.0: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A== + dependencies: + has-flag "^1.0.0" + +supports-color@^5.3.0, supports-color@^5.5.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-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== + +sync-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/sync-request/-/sync-request-6.1.0.tgz#e96217565b5e50bbffe179868ba75532fb597e68" + integrity sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw== + dependencies: + http-response-object "^3.0.1" + sync-rpc "^1.2.1" + then-request "^6.0.0" + +sync-rpc@^1.2.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/sync-rpc/-/sync-rpc-1.3.6.tgz#b2e8b2550a12ccbc71df8644810529deb68665a7" + integrity sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw== + dependencies: + get-port "^3.1.0" + +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@^6.8.0, table@^6.8.1: + version "6.8.2" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.2.tgz#c5504ccf201213fa227248bdc8c5569716ac6c58" + integrity sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA== + dependencies: + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + +text-encoding-utf-8@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" + integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== + +text-extensions@^1.0.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" + integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== + +text-hex@1.0.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" + integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +then-request@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/then-request/-/then-request-6.0.2.tgz#ec18dd8b5ca43aaee5cb92f7e4c1630e950d4f0c" + integrity sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA== + dependencies: + "@types/concat-stream" "^1.6.0" + "@types/form-data" "0.0.33" + "@types/node" "^8.0.0" + "@types/qs" "^6.2.31" + caseless "~0.12.0" + concat-stream "^1.6.0" + form-data "^2.2.0" + http-basic "^8.1.1" + http-response-object "^3.0.1" + promise "^8.0.0" + qs "^6.4.0" + +thread-stream@^2.6.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-2.7.0.tgz#d8a8e1b3fd538a6cca8ce69dbe5d3d097b601e11" + integrity sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw== + dependencies: + real-require "^0.2.0" + +through2@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" + integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== + dependencies: + readable-stream "3" + +"through@>=2.2.7 <3", 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== + +tmp@0.0.33, tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +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" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +touch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" + integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== + dependencies: + nopt "~1.0.10" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +trim-newlines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" + integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== + +triple-beam@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" + integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== + +ts-api-utils@^1.0.1: + 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@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-1.0.4.tgz#ce3b5dade5f5d97cf69889c11bf7d2da8555b15a" + integrity sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ== + +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== + +ts-generator@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ts-generator/-/ts-generator-0.1.1.tgz#af46f2fb88a6db1f9785977e9590e7bcd79220ab" + integrity sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ== + dependencies: + "@types/mkdirp" "^0.5.2" + "@types/prettier" "^2.1.1" + "@types/resolve" "^0.0.8" + chalk "^2.4.1" + glob "^7.1.2" + mkdirp "^0.5.1" + prettier "^2.1.2" + resolve "^1.8.1" + ts-essentials "^1.0.0" + +ts-node@^10.8.1, ts-node@^10.9.1: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tslib@^1.8.1, tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.1.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +tsort@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" + integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +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.18.0: + version "0.18.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" + integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +type-fest@^1.0.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" + integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== + +typechain@^8.1.1: + 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" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== + +"typescript@^4.6.4 || ^5.2.2", typescript@^5.2.2: + version "5.4.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" + integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== + +typescript@^4.9.3: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +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== + +uglify-js@^3.1.4: + version "3.17.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" + integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== + +undefsafe@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" + integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== + +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== + +undici@^5.14.0: + version "5.28.4" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068" + integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g== + dependencies: + "@fastify/busboy" "^2.0.0" + +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== + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +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" + +utf-8-validate@^5.0.2: + version "5.0.10" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" + integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== + dependencies: + node-gyp-build "^4.3.0" + +utf8@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" + integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== + +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== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +viem@^2.9.28: + version "2.9.28" + resolved "https://registry.yarnpkg.com/viem/-/viem-2.9.28.tgz#75b6bd110801a4340fee2daa3eb0bffbe9cc990e" + integrity sha512-/1iTg8yQlCNJ+7wSmdsBNB/vhjWqFJtTH6XZXHjGXrZnlBxAtHR5ZAr5TvTJc/2nhVIVE4BkCe5JCrIiSuZodg== + dependencies: + "@adraffy/ens-normalize" "1.10.0" + "@noble/curves" "1.2.0" + "@noble/hashes" "1.3.2" + "@scure/bip32" "1.3.2" + "@scure/bip39" "1.2.1" + abitype "1.0.0" + isows "1.0.3" + ws "8.13.0" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +web3-utils@^1.3.6: + version "1.10.4" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.4.tgz#0daee7d6841641655d8b3726baf33b08eda1cbec" + integrity sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A== + dependencies: + "@ethereumjs/util" "^8.1.0" + bn.js "^5.2.1" + ethereum-bloom-filters "^1.0.6" + ethereum-cryptography "^2.1.2" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + utf8 "3.0.0" + +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== + +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@^1.1.1, which@^1.2.14, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.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" + +winston-transport@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.7.0.tgz#e302e6889e6ccb7f383b926df6936a5b781bd1f0" + integrity sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg== + dependencies: + logform "^2.3.2" + readable-stream "^3.6.0" + triple-beam "^1.3.0" + +winston@^3.11.0: + version "3.13.0" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.13.0.tgz#e76c0d722f78e04838158c61adc1287201de7ce3" + integrity sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ== + dependencies: + "@colors/colors" "^1.6.0" + "@dabh/diagnostics" "^2.0.2" + async "^3.2.3" + is-stream "^2.0.0" + logform "^2.4.0" + one-time "^1.0.0" + readable-stream "^3.4.0" + safe-stable-stringify "^2.3.1" + stack-trace "0.0.x" + triple-beam "^1.3.0" + winston-transport "^4.7.0" + +word-wrap@^1.0.3, word-wrap@^1.2.5, 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== + +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + +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" + +workerpool@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" + integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.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== + +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.13.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + +ws@^7.4.5, ws@^7.4.6: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +ws@^8.5.0: + version "8.17.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.0.tgz#d145d18eca2ed25aaf791a183903f7be5e295fea" + integrity sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +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== + +yaml@2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b" + integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== + +yaml@^2.2.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.2.tgz#7a2b30f2243a5fc299e1f14ca58d475ed4bc5362" + integrity sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA== + +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@^20.2.2, yargs-parser@^20.2.3: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.0.0: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zksync-web3@^0.14.3: + version "0.14.4" + resolved "https://registry.yarnpkg.com/zksync-web3/-/zksync-web3-0.14.4.tgz#0b70a7e1a9d45cc57c0971736079185746d46b1f" + integrity sha512-kYehMD/S6Uhe1g434UnaMN+sBr9nQm23Ywn0EUP5BfQCsbjcr3ORuS68PosZw8xUTu3pac7G6YMSnNHk+fwzvg== From 66708abc76ea2a1d3ced94e8664fa8b09a00154c Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 30 Apr 2024 06:47:00 +0200 Subject: [PATCH 166/297] feat(common): <- starts adding these --- packages/common/.eslintignore | 2 ++ packages/common/.eslintrc.yml | 21 +++++++++++++++++++++ packages/common/.gitignore | 1 + packages/common/.prettierignore | 2 ++ packages/common/.prettierrc.yml | 7 +++++++ packages/common/README.md | 1 + packages/common/package.json | 31 +++++++++++++++++++++++++++++++ packages/common/src/index.ts | 3 +++ packages/common/src/logger.ts | 28 ++++++++++++++++++++++++++++ packages/common/tsconfig.json | 22 ++++++++++++++++++++++ 10 files changed, 118 insertions(+) create mode 100644 packages/common/.eslintignore create mode 100644 packages/common/.eslintrc.yml create mode 100644 packages/common/.gitignore create mode 100644 packages/common/.prettierignore create mode 100644 packages/common/.prettierrc.yml create mode 100644 packages/common/README.md create mode 100644 packages/common/package.json create mode 100644 packages/common/src/index.ts create mode 100644 packages/common/src/logger.ts create mode 100644 packages/common/tsconfig.json diff --git a/packages/common/.eslintignore b/packages/common/.eslintignore new file mode 100644 index 00000000..b68087da --- /dev/null +++ b/packages/common/.eslintignore @@ -0,0 +1,2 @@ +**/dist +**/node_modules \ No newline at end of file diff --git a/packages/common/.eslintrc.yml b/packages/common/.eslintrc.yml new file mode 100644 index 00000000..27672a35 --- /dev/null +++ b/packages/common/.eslintrc.yml @@ -0,0 +1,21 @@ +extends: + - "eslint:recommended" + - "plugin:@typescript-eslint/eslint-recommended" + - "plugin:@typescript-eslint/recommended" + - "prettier" +parser: "@typescript-eslint/parser" +parserOptions: + project: "tsconfig.json" +plugins: + - "@typescript-eslint" +root: true +rules: + "@typescript-eslint/no-floating-promises": + - error + - ignoreIIFE: true + ignoreVoid: true + "@typescript-eslint/no-inferrable-types": "off" + "@typescript-eslint/no-unused-vars": + - error + - argsIgnorePattern: "_" + varsIgnorePattern: "_" diff --git a/packages/common/.gitignore b/packages/common/.gitignore new file mode 100644 index 00000000..5292519a --- /dev/null +++ b/packages/common/.gitignore @@ -0,0 +1 @@ +logs/ \ No newline at end of file diff --git a/packages/common/.prettierignore b/packages/common/.prettierignore new file mode 100644 index 00000000..b68087da --- /dev/null +++ b/packages/common/.prettierignore @@ -0,0 +1,2 @@ +**/dist +**/node_modules \ No newline at end of file diff --git a/packages/common/.prettierrc.yml b/packages/common/.prettierrc.yml new file mode 100644 index 00000000..e9bada2e --- /dev/null +++ b/packages/common/.prettierrc.yml @@ -0,0 +1,7 @@ +bracketSpacing: true +printWidth: 120 +proseWrap: "always" +singleQuote: false +tabWidth: 2 +trailingComma: "all" +semi: false diff --git a/packages/common/README.md b/packages/common/README.md new file mode 100644 index 00000000..d0553e6e --- /dev/null +++ b/packages/common/README.md @@ -0,0 +1 @@ +# common diff --git a/packages/common/package.json b/packages/common/package.json new file mode 100644 index 00000000..d847e954 --- /dev/null +++ b/packages/common/package.json @@ -0,0 +1,31 @@ +{ + "name": "@gnosis/hashi-common", + "version": "0.1.0", + "private": true, + "author": { + "name": "gnosis", + "url": "https://github.com/gnosis" + }, + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "postinstall": "yarn compile", + "compile": "tsc", + "lint": "eslint --ignore-path ./.eslintignore --ext .js,.ts .", + "prettier:check": "prettier --check \"**/*.{js,json,md,sol,ts,yml}\"", + "prettier:write": "prettier --write \"**/*.{js,json,md,sol,ts,yml}\"" + }, + "dependencies": { + "winston": "^3.11.0" + }, + "devDependencies": { + "@types/node": "^20.8.9", + "@typescript-eslint/eslint-plugin": "^6.7.5", + "@typescript-eslint/parser": "^6.7.5", + "eslint": "^8.51.0", + "eslint-config-prettier": "^9.0.0", + "prettier": "^3.0.3", + "ts-node": "^10.9.1", + "typescript": "^5.2.2" + } +} diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts new file mode 100644 index 00000000..1c73f107 --- /dev/null +++ b/packages/common/src/index.ts @@ -0,0 +1,3 @@ +import logger from "./logger" + +export { logger } diff --git a/packages/common/src/logger.ts b/packages/common/src/logger.ts new file mode 100644 index 00000000..54055ed2 --- /dev/null +++ b/packages/common/src/logger.ts @@ -0,0 +1,28 @@ +import winston from "winston" + +const colors = { + error: "red", + warn: "yellow", + info: "cyan", + debug: "blue", + service: "magenta", +} + +const logger = winston.createLogger({ + level: "info", + format: winston.format.combine( + winston.format.colorize({ + colors, + }), + winston.format.timestamp(), + winston.format.printf(({ timestamp, level, message, service }) => { + const colorize = winston.format.colorize() + return `${timestamp} [${level}] ${colorize.colorize("service", `${service}`)}: ${message}` + }), + ), + transports: [new winston.transports.Console(), new winston.transports.File({ filename: "./logs/application.log" })], +}) + +winston.addColors(colors) + +export default logger diff --git a/packages/common/tsconfig.json b/packages/common/tsconfig.json new file mode 100644 index 00000000..c5ce31cd --- /dev/null +++ b/packages/common/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "emitDecoratorMetadata": true, + "esModuleInterop": true, + "experimentalDecorators": true, + "forceConsistentCasingInFileNames": true, + "lib": ["es6", "ESNext", "DOM"], + "module": "commonjs", + "moduleResolution": "node", + "noImplicitAny": true, + "outDir": "./dist", + "removeComments": true, + "resolveJsonModule": true, + "sourceMap": true, + "strict": true, + "target": "ESNext" + }, + "exclude": ["node_modules"], + "include": ["./src/**/*"] +} From e771a375a2ea6ea52f25d08c563c8e4c205e754a Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 30 Apr 2024 06:47:39 +0200 Subject: [PATCH 167/297] chore(global): adds .nvmrc --- .nvmrc | 1 + 1 file changed, 1 insertion(+) create mode 100644 .nvmrc diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..0828ab79 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v18 \ No newline at end of file From b71bec45b91e4a564707079f60a9d16da5c20838 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 30 Apr 2024 13:26:04 +0200 Subject: [PATCH 168/297] feat(relayer): <- starts adding this --- packages/relayer/.dockerignore | 7 +++++ packages/relayer/.eslintignore | 2 ++ packages/relayer/.eslintrc.yml | 21 +++++++++++++ packages/relayer/.gitignore | 1 + packages/relayer/.prettierignore | 2 ++ packages/relayer/.prettierrc.yml | 7 +++++ packages/relayer/Dockerfile | 13 ++++++++ packages/relayer/README.md | 51 ++++++++++++++++++++++++++++++++ packages/relayer/nodemon.json | 5 ++++ packages/relayer/package.json | 34 +++++++++++++++++++++ packages/relayer/tsconfig.json | 34 +++++++++++++++++++++ 11 files changed, 177 insertions(+) create mode 100644 packages/relayer/.dockerignore create mode 100644 packages/relayer/.eslintignore create mode 100644 packages/relayer/.eslintrc.yml create mode 100644 packages/relayer/.gitignore create mode 100644 packages/relayer/.prettierignore create mode 100644 packages/relayer/.prettierrc.yml create mode 100644 packages/relayer/Dockerfile create mode 100644 packages/relayer/README.md create mode 100644 packages/relayer/nodemon.json create mode 100644 packages/relayer/package.json create mode 100644 packages/relayer/tsconfig.json diff --git a/packages/relayer/.dockerignore b/packages/relayer/.dockerignore new file mode 100644 index 00000000..5f7b077a --- /dev/null +++ b/packages/relayer/.dockerignore @@ -0,0 +1,7 @@ +node_modules +npm - debug.log +Dockerfile + .git + .gitignore + .yarn +logs diff --git a/packages/relayer/.eslintignore b/packages/relayer/.eslintignore new file mode 100644 index 00000000..b68087da --- /dev/null +++ b/packages/relayer/.eslintignore @@ -0,0 +1,2 @@ +**/dist +**/node_modules \ No newline at end of file diff --git a/packages/relayer/.eslintrc.yml b/packages/relayer/.eslintrc.yml new file mode 100644 index 00000000..27672a35 --- /dev/null +++ b/packages/relayer/.eslintrc.yml @@ -0,0 +1,21 @@ +extends: + - "eslint:recommended" + - "plugin:@typescript-eslint/eslint-recommended" + - "plugin:@typescript-eslint/recommended" + - "prettier" +parser: "@typescript-eslint/parser" +parserOptions: + project: "tsconfig.json" +plugins: + - "@typescript-eslint" +root: true +rules: + "@typescript-eslint/no-floating-promises": + - error + - ignoreIIFE: true + ignoreVoid: true + "@typescript-eslint/no-inferrable-types": "off" + "@typescript-eslint/no-unused-vars": + - error + - argsIgnorePattern: "_" + varsIgnorePattern: "_" diff --git a/packages/relayer/.gitignore b/packages/relayer/.gitignore new file mode 100644 index 00000000..5292519a --- /dev/null +++ b/packages/relayer/.gitignore @@ -0,0 +1 @@ +logs/ \ No newline at end of file diff --git a/packages/relayer/.prettierignore b/packages/relayer/.prettierignore new file mode 100644 index 00000000..b68087da --- /dev/null +++ b/packages/relayer/.prettierignore @@ -0,0 +1,2 @@ +**/dist +**/node_modules \ No newline at end of file diff --git a/packages/relayer/.prettierrc.yml b/packages/relayer/.prettierrc.yml new file mode 100644 index 00000000..e9bada2e --- /dev/null +++ b/packages/relayer/.prettierrc.yml @@ -0,0 +1,7 @@ +bracketSpacing: true +printWidth: 120 +proseWrap: "always" +singleQuote: false +tabWidth: 2 +trailingComma: "all" +semi: false diff --git a/packages/relayer/Dockerfile b/packages/relayer/Dockerfile new file mode 100644 index 00000000..58daafc7 --- /dev/null +++ b/packages/relayer/Dockerfile @@ -0,0 +1,13 @@ +FROM node:alpine + +WORKDIR /usr/src/app + +COPY package.json yarn.lock .env ./ + +RUN yarn install + +ADD . /usr/src/app + +RUN yarn compile + +CMD ["node", "dist/index.js"] \ No newline at end of file diff --git a/packages/relayer/README.md b/packages/relayer/README.md new file mode 100644 index 00000000..5ac46d3e --- /dev/null +++ b/packages/relayer/README.md @@ -0,0 +1,51 @@ +# relayer + +Script to relay batches of Hashi Messages to the underlying adapters. + +  + +--- + +  + +## Getting Started + +These instructions will cover the usage information and how to run the code using Docker. + +### Create the .env file + +Configure the mode you want to run by editing the variable in `.env` by checking `.env.example` + +### Building the Docker Image + +To build the Docker image, run the following command from the root of the project: + +```sh +docker build -t relayer . +``` + +### Running the relayer + +After building the image, you can run it using the following command: + +```sh +docker run -d -p relayer +``` + +### Viewing Logs + +To view the logs from the running container, use: + +```sh +docker logs -f [CONTAINER_ID or CONTAINER_NAME] +``` + +You can find the `CONTAINER_ID` or `CONTAINER_NAME` using `docker ps`. + +### Stopping the relayer + +To stop the running container: + +```sh +docker stop [CONTAINER_ID or CONTAINER_NAME] +``` \ No newline at end of file diff --git a/packages/relayer/nodemon.json b/packages/relayer/nodemon.json new file mode 100644 index 00000000..b5fabeb4 --- /dev/null +++ b/packages/relayer/nodemon.json @@ -0,0 +1,5 @@ +{ + "watch": ["src"], + "ext": "ts,json", + "exec": "ts-node --esm ./src/index.ts" +} diff --git a/packages/relayer/package.json b/packages/relayer/package.json new file mode 100644 index 00000000..463e01a3 --- /dev/null +++ b/packages/relayer/package.json @@ -0,0 +1,34 @@ +{ + "name": "@gnosis/hashi-relayer", + "private": true, + "version": "0.1.0", + "type": "module", + "author": { + "name": "gnosis", + "url": "https://github.com/gnosis" + }, + "scripts": { + "compile": "tsc", + "lint": "eslint --ignore-path ./.eslintignore --ext .js,.ts .", + "prettier:check": "prettier --check \"**/*.{js,json,md,sol,ts,yml}\"", + "prettier:write": "prettier --write \"**/*.{js,json,md,sol,ts,yml}\"", + "start:dev": "nodemon" + }, + "dependencies": { + "@gnosis/hashi-common": "0.1.0", + "dotenv": "^16.3.1", + "viem": "^2.9.28", + "winston": "^3.11.0" + }, + "devDependencies": { + "@types/node": "^20.8.9", + "@typescript-eslint/eslint-plugin": "^6.7.5", + "@typescript-eslint/parser": "^6.7.5", + "eslint": "^8.51.0", + "eslint-config-prettier": "^9.0.0", + "nodemon": "^3.0.1", + "prettier": "^3.0.3", + "ts-node": "^10.9.1", + "typescript": "^5.2.2" + } +} diff --git a/packages/relayer/tsconfig.json b/packages/relayer/tsconfig.json new file mode 100644 index 00000000..d167b40a --- /dev/null +++ b/packages/relayer/tsconfig.json @@ -0,0 +1,34 @@ +{ + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "emitDecoratorMetadata": true, + "esModuleInterop": true, + "experimentalDecorators": true, + "forceConsistentCasingInFileNames": true, + "lib": [ + "es6", + "ESNext", + "DOM" + ], + "module": "ESNext", + "moduleResolution": "node", + "noImplicitAny": true, + "outDir": "./dist", + "removeComments": true, + "resolveJsonModule": true, + "sourceMap": true, + "strict": true, + "target": "ESNext" + }, + "exclude": [ + "node_modules" + ], + "include": [ + "./src/**/*" + ], + "ts-node": { + "esm": true, + "experimentalSpecifierResolution": "node" + } +} \ No newline at end of file From b68f306e1f2166285bc2f9d950cba4364ea3acc0 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 30 Apr 2024 18:16:21 +0200 Subject: [PATCH 169/297] feat(common): changes tsconfig.json conf and adds Message --- packages/common/.gitignore | 3 +- packages/common/package.json | 4 +- packages/common/src/Message.ts | 116 +++++++++++++++++++++++++++++++++ packages/common/src/index.ts | 3 +- packages/common/tsconfig.json | 29 +++++---- 5 files changed, 141 insertions(+), 14 deletions(-) create mode 100644 packages/common/src/Message.ts diff --git a/packages/common/.gitignore b/packages/common/.gitignore index 5292519a..0bf3bb37 100644 --- a/packages/common/.gitignore +++ b/packages/common/.gitignore @@ -1 +1,2 @@ -logs/ \ No newline at end of file +logs/ +tsconfig.tsbuildinfo \ No newline at end of file diff --git a/packages/common/package.json b/packages/common/package.json index d847e954..8ce9e361 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -6,6 +6,7 @@ "name": "gnosis", "url": "https://github.com/gnosis" }, + "type": "module", "main": "dist/index.js", "types": "dist/index.d.ts", "scripts": { @@ -16,7 +17,8 @@ "prettier:write": "prettier --write \"**/*.{js,json,md,sol,ts,yml}\"" }, "dependencies": { - "winston": "^3.11.0" + "winston": "^3.11.0", + "viem": "^2.9.28" }, "devDependencies": { "@types/node": "^20.8.9", diff --git a/packages/common/src/Message.ts b/packages/common/src/Message.ts new file mode 100644 index 00000000..90f4470d --- /dev/null +++ b/packages/common/src/Message.ts @@ -0,0 +1,116 @@ +import { decodeAbiParameters, Log } from "viem" + +type Configs = { + data: `0x${string}` + sender: `0x${string}` + threshold: bigint + id: `0x${string}` + receiver: `0x${string}` + targetChainId: bigint + nonce: bigint + reporters: `0x${string}`[] + adapters: `0x${string}`[] +} + +class Message { + public data: `0x${string}` + public sender: `0x${string}` + public threshold: bigint + public id: `0x${string}` + public receiver: `0x${string}` + public targetChainId: bigint + public nonce: bigint + public reporters: `0x${string}`[] + public adapters: `0x${string}`[] + + constructor({ data, sender, threshold, id, receiver, targetChainId, nonce, reporters, adapters }: Configs) { + this.id = id + this.sender = sender + this.targetChainId = targetChainId + this.receiver = receiver + this.data = data + this.nonce = nonce + this.reporters = reporters + this.adapters = adapters + this.threshold = threshold + } + + static fromLog(_log: Log) { + const [values] = decodeAbiParameters( + [ + { + components: [ + { + name: "nonce", + type: "uint256", + }, + { + name: "targetChainId", + type: "uint256", + }, + { + name: "threshold", + type: "uint256", + }, + { + name: "sender", + type: "address", + }, + { + name: "receiver", + type: "address", + }, + { + name: "data", + type: "bytes", + }, + { + name: "reporters", + type: "address[]", + }, + { + name: "adapters", + type: "address[]", + }, + ], + name: "message", + type: "tuple", + }, + ], + _log.data, + ) + + return new Message({ + id: _log.topics[1] as `0x${string}`, + ...values, + } as Configs) + } + + serialize() { + return [ + this.nonce.toString(), + this.targetChainId.toString(), + this.threshold.toString(), + this.sender, + this.receiver, + this.data, + this.reporters, + this.adapters, + ] + } + + toJSON() { + return { + adapters: this.adapters, + data: this.data, + nonce: this.nonce.toString(), + receiver: this.receiver, + reporters: this.reporters, + sender: this.sender, + targetChainId: this.targetChainId.toString(), + threshold: this.threshold.toString() + } + } +} + +export default Message diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts index 1c73f107..bdd66112 100644 --- a/packages/common/src/index.ts +++ b/packages/common/src/index.ts @@ -1,3 +1,4 @@ import logger from "./logger" +import Message from "./Message" -export { logger } +export { logger, Message } diff --git a/packages/common/tsconfig.json b/packages/common/tsconfig.json index c5ce31cd..058a857b 100644 --- a/packages/common/tsconfig.json +++ b/packages/common/tsconfig.json @@ -1,22 +1,29 @@ { "compilerOptions": { + "allowJs": false, + "allowSyntheticDefaultImports": true, + "checkJs": false, "declaration": true, "declarationMap": true, - "emitDecoratorMetadata": true, - "esModuleInterop": true, - "experimentalDecorators": true, + "esModuleInterop": false, + "exactOptionalPropertyTypes": true, "forceConsistentCasingInFileNames": true, - "lib": ["es6", "ESNext", "DOM"], - "module": "commonjs", - "moduleResolution": "node", - "noImplicitAny": true, + "importHelpers": true, + "incremental": true, + "lib": ["ES2022"], + "module": "ES2022", + "moduleResolution": "Bundler", + "noFallthroughCasesInSwitch": true, + "noImplicitOverride": true, + "noImplicitReturns": true, + "noUnusedLocals": true, + "noUnusedParameters": true, "outDir": "./dist", - "removeComments": true, - "resolveJsonModule": true, + "rootDir": "./src", + "skipLibCheck": true, "sourceMap": true, "strict": true, - "target": "ESNext" + "target": "ES2022" }, - "exclude": ["node_modules"], "include": ["./src/**/*"] } From 36469bbe01da559ed4cf8c7a6c2555c53d5a17ed Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 30 Apr 2024 18:18:02 +0200 Subject: [PATCH 170/297] feat(relayer): adds Watcher --- packages/relayer/.env.example | 6 + packages/relayer/README.md | 2 +- packages/relayer/package.json | 1 + packages/relayer/src/Watcher.ts | 78 +++++ packages/relayer/src/abi/Yaho.json | 504 +++++++++++++++++++++++++++++ packages/relayer/src/index.ts | 54 ++++ packages/relayer/tsconfig.json | 16 +- yarn.lock | 75 ++++- 8 files changed, 722 insertions(+), 14 deletions(-) create mode 100644 packages/relayer/.env.example create mode 100644 packages/relayer/src/Watcher.ts create mode 100644 packages/relayer/src/abi/Yaho.json create mode 100644 packages/relayer/src/index.ts diff --git a/packages/relayer/.env.example b/packages/relayer/.env.example new file mode 100644 index 00000000..b2029efc --- /dev/null +++ b/packages/relayer/.env.example @@ -0,0 +1,6 @@ +YAHO_ADDRESS= +CHAIN_ID= +RPC= +PK= +LISTEN_INTERVAL_TIME_MS= +MONGO_DB_URI= \ No newline at end of file diff --git a/packages/relayer/README.md b/packages/relayer/README.md index 5ac46d3e..98ae1f41 100644 --- a/packages/relayer/README.md +++ b/packages/relayer/README.md @@ -48,4 +48,4 @@ To stop the running container: ```sh docker stop [CONTAINER_ID or CONTAINER_NAME] -``` \ No newline at end of file +``` diff --git a/packages/relayer/package.json b/packages/relayer/package.json index 463e01a3..b0694861 100644 --- a/packages/relayer/package.json +++ b/packages/relayer/package.json @@ -17,6 +17,7 @@ "dependencies": { "@gnosis/hashi-common": "0.1.0", "dotenv": "^16.3.1", + "mongodb": "6.5.0", "viem": "^2.9.28", "winston": "^3.11.0" }, diff --git a/packages/relayer/src/Watcher.ts b/packages/relayer/src/Watcher.ts new file mode 100644 index 00000000..37491a09 --- /dev/null +++ b/packages/relayer/src/Watcher.ts @@ -0,0 +1,78 @@ +import winston from "winston" +import { Log } from "viem" + +interface ListenerConfigs { + logger: winston.Logger + client: any + contractAddress: `0x${string}` + abi: any + eventName: string + listenIntervalTimeMs: number + onLogs: (logs: Log[]) => Promise +} + +class Watcher { + logger: winston.Logger + onLogs: (logs: Log[]) => Promise + client: any + contractAddress: `0x${string}` + abi: any + eventName: string + private _lastBlock: bigint + private _listenIntervalTimeMs: number + + constructor(_configs: ListenerConfigs) { + this.logger = _configs.logger.child({ service: "Watcher" }) + this.client = _configs.client + this.contractAddress = _configs.contractAddress + this.abi = _configs.abi + this.eventName = _configs.eventName + this.onLogs = _configs.onLogs + this._listenIntervalTimeMs = _configs.listenIntervalTimeMs + + this._lastBlock = 0n + } + + async startWatching() { + try { + this._watch() + setInterval(() => { + this._watch() + }, this._listenIntervalTimeMs) + } catch (_err) {} + } + + private async _watch() { + try { + const currentBlock = await this.client.getBlockNumber() + if (!this._lastBlock) { + this._lastBlock = currentBlock - 1n + } + + const fromBlock = this._lastBlock + 1n + const toBlock = currentBlock + this.logger.info(`looking for ${this.eventName} events from block ${fromBlock} to block ${toBlock} ...`) + + const filter = await this.client.createContractEventFilter({ + address: this.contractAddress, + abi: this.abi, + eventName: this.eventName, + fromBlock, + toBlock, + }) + + const logs = (await this.client.getFilterLogs({ filter })) as Log[] + + if (logs.length) { + this.logger.info(`Detected ${logs.length} new logs. Processing them ...`) + await this.onLogs(logs) + } + + this._lastBlock = currentBlock + } catch (_err) { + this.logger.error(`${_err}`) + } + } +} + +export default Watcher diff --git a/packages/relayer/src/abi/Yaho.json b/packages/relayer/src/abi/Yaho.json new file mode 100644 index 00000000..80767b1a --- /dev/null +++ b/packages/relayer/src/abi/Yaho.json @@ -0,0 +1,504 @@ +[ + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "contract IReporter[]", + "name": "reporters", + "type": "address[]" + }, + { + "internalType": "contract IAdapter[]", + "name": "adapters", + "type": "address[]" + } + ], + "internalType": "struct Message", + "name": "message", + "type": "tuple" + } + ], + "name": "InvalidMessage", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxThreshold", + "type": "uint256" + } + ], + "name": "InvalidThreshold", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "messageId", + "type": "uint256" + } + ], + "name": "MessageHashNotFound", + "type": "error" + }, + { + "inputs": [], + "name": "NoAdaptersGiven", + "type": "error" + }, + { + "inputs": [], + "name": "NoMessageIdsGiven", + "type": "error" + }, + { + "inputs": [], + "name": "NoMessagesGiven", + "type": "error" + }, + { + "inputs": [], + "name": "NoReportersGiven", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "arrayOne", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "arrayTwo", + "type": "uint256" + } + ], + "name": "UnequalArrayLengths", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "messageId", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "contract IReporter[]", + "name": "reporters", + "type": "address[]" + }, + { + "internalType": "contract IAdapter[]", + "name": "adapters", + "type": "address[]" + } + ], + "indexed": false, + "internalType": "struct Message", + "name": "message", + "type": "tuple" + } + ], + "name": "MessageDispatched", + "type": "event" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "contract IReporter[]", + "name": "reporters", + "type": "address[]" + }, + { + "internalType": "contract IAdapter[]", + "name": "adapters", + "type": "address[]" + } + ], + "internalType": "struct Message", + "name": "message", + "type": "tuple" + } + ], + "name": "calculateMessageHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "sourceChainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "dispatcherAddress", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "messageHash", + "type": "bytes32" + } + ], + "name": "calculateMessageId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "currentNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "contract IReporter[]", + "name": "reporters", + "type": "address[]" + }, + { + "internalType": "contract IAdapter[]", + "name": "adapters", + "type": "address[]" + } + ], + "name": "dispatchMessage", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "contract IReporter[]", + "name": "reporters", + "type": "address[]" + }, + { + "internalType": "contract IAdapter[]", + "name": "adapters", + "type": "address[]" + } + ], + "name": "dispatchMessageToAdapters", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "", + "type": "bytes32[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "thresholds", + "type": "uint256[]" + }, + { + "internalType": "address[]", + "name": "receivers", + "type": "address[]" + }, + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + }, + { + "internalType": "contract IReporter[]", + "name": "reporters", + "type": "address[]" + }, + { + "internalType": "contract IAdapter[]", + "name": "adapters", + "type": "address[]" + } + ], + "name": "dispatchMessagesToAdapters", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "bytes32[]", + "name": "", + "type": "bytes32[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "messageId", + "type": "uint256" + } + ], + "name": "getPendingMessageHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "contract IReporter[]", + "name": "reporters", + "type": "address[]" + }, + { + "internalType": "contract IAdapter[]", + "name": "adapters", + "type": "address[]" + } + ], + "internalType": "struct Message[]", + "name": "messages", + "type": "tuple[]" + } + ], + "name": "relayMessagesToAdapters", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "", + "type": "bytes32[]" + } + ], + "stateMutability": "payable", + "type": "function" + } +] diff --git a/packages/relayer/src/index.ts b/packages/relayer/src/index.ts new file mode 100644 index 00000000..6a8b4b5e --- /dev/null +++ b/packages/relayer/src/index.ts @@ -0,0 +1,54 @@ +import { configDotenv } from "dotenv" +import { createWalletClient, http, Chain, publicActions, Log } from "viem" +import { privateKeyToAccount } from "viem/accounts" +import * as chains from "viem/chains" +import { MongoClient } from "mongodb" + +import { logger, Message } from "@gnosis/hashi-common" + +import Watcher from "./Watcher" +import yahoAbi from "./abi/Yaho.json" assert { type: "json" } + +configDotenv() + +const chain = Object.values(chains).find(({ id }) => id.toString() === (process.env.CHAIN_ID as string)) +if (!chain) throw new Error("Invalid CHAIN_ID") + +const client = createWalletClient({ + account: privateKeyToAccount(process.env.PK as `0x${string}`), + chain: chain as Chain | undefined, + transport: http(process.env.RPC as string), +}).extend(publicActions) + +const mongoClient = new MongoClient(process.env.MONGO_DB_URI as string) +await mongoClient.connect() +const db = mongoClient.db("hashi") + +const watcher = new Watcher({ + logger, + client, + contractAddress: process.env.YAHO_ADDRESS as `0x${string}`, + abi: yahoAbi, + eventName: "MessageDispatched", + listenIntervalTimeMs: Number(process.env.LISTEN_INTERVAL_TIME_MS as string), + onLogs: async (_logs: Log[]) => { + const messages = _logs.map((_log: Log) => Message.fromLog(_log)) + await messages.map((_message: Message) => + db.collection("messages").updateOne( + { id: _message.id }, + { + $set: { + data: _message.toJSON(), + status: "seen", + chainId: client?.chain?.id as number, + address: process.env.YAHO_ADDRESS as `0x${string}`, + }, + }, + { + upsert: true, + }, + ), + ) + }, +}) +watcher.startWatching() diff --git a/packages/relayer/tsconfig.json b/packages/relayer/tsconfig.json index d167b40a..d69a137b 100644 --- a/packages/relayer/tsconfig.json +++ b/packages/relayer/tsconfig.json @@ -6,11 +6,7 @@ "esModuleInterop": true, "experimentalDecorators": true, "forceConsistentCasingInFileNames": true, - "lib": [ - "es6", - "ESNext", - "DOM" - ], + "lib": ["es6", "ESNext", "DOM"], "module": "ESNext", "moduleResolution": "node", "noImplicitAny": true, @@ -21,14 +17,10 @@ "strict": true, "target": "ESNext" }, - "exclude": [ - "node_modules" - ], - "include": [ - "./src/**/*" - ], + "exclude": ["node_modules"], + "include": ["./src/**/*"], "ts-node": { "esm": true, "experimentalSpecifierResolution": "node" } -} \ No newline at end of file +} diff --git a/yarn.lock b/yarn.lock index c088cd2d..e8e3d0bf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -980,6 +980,13 @@ tweetnacl "^1.0.3" tweetnacl-util "^0.15.1" +"@mongodb-js/saslprep@^1.1.5": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.1.5.tgz#0c48a96c8d799e81fae311b7251aa5c1dc7c6e95" + integrity sha512-XLNOMH66KhJzUJNwT/qlMnS4WsNDWD5ASdyaSH3EtK+F4r/CFGa3jT4GNi4mfOitGvWXtdLgQJkQjxSVrio+jA== + dependencies: + sparse-bitfield "^3.0.3" + "@noble/curves@1.2.0", "@noble/curves@~1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" @@ -1741,6 +1748,18 @@ resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== +"@types/webidl-conversions@*": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz#1306dbfa53768bcbcfc95a1c8cde367975581859" + integrity sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA== + +"@types/whatwg-url@^11.0.2": + version "11.0.4" + resolved "https://registry.yarnpkg.com/@types/whatwg-url/-/whatwg-url-11.0.4.tgz#ffed0dc8d89d91f62e3f368fcbda222a487c4f63" + integrity sha512-lXCmTWSHJvf0TRSO58nm978b8HJ/EdsSsEKLd3ODHFjo+3VGAyyTp4v50nWvwtzBxSMQrVOK7tcuN0zGPLICMw== + dependencies: + "@types/webidl-conversions" "*" + "@types/ws@^7.4.4": version "7.4.7" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" @@ -2386,6 +2405,11 @@ bs58check@^2.1.2: create-hash "^1.1.0" safe-buffer "^5.1.2" +bson@^6.4.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/bson/-/bson-6.6.0.tgz#f225137eb49fe19bee4d87949a0515c05176e2ad" + integrity sha512-BVINv2SgcMjL4oYbBuCQTpE3/VKOSxrOA8Cj/wQP7izSzlBGVomdm+TcUd0Pzy0ytLSSDweCKQ6X3f5veM5LQA== + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -5096,6 +5120,11 @@ memory-level@^1.0.0: functional-red-black-tree "^1.0.1" module-error "^1.0.1" +memory-pager@^1.0.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" + integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== + memorystream@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" @@ -5280,6 +5309,23 @@ module-error@^1.0.1, module-error@^1.0.2: resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== +mongodb-connection-string-url@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.0.tgz#b4f87f92fd8593f3b9365f592515a06d304a1e9c" + integrity sha512-t1Vf+m1I5hC2M5RJx/7AtxgABy1cZmIPQRMXw+gEIPn/cZNF3Oiy+l0UIypUwVB5trcWHq3crg2g3uAR9aAwsQ== + dependencies: + "@types/whatwg-url" "^11.0.2" + whatwg-url "^13.0.0" + +mongodb@6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-6.5.0.tgz#3735b4fba085b26ca06f7744e9639bc538e93d87" + integrity sha512-Fozq68InT+JKABGLqctgtb8P56pRrJFkbhW0ux+x1mdHeyinor8oNzJqwLjV/t5X5nJGfTlluxfyMnOXNggIUA== + dependencies: + "@mongodb-js/saslprep" "^1.1.5" + bson "^6.4.0" + mongodb-connection-string-url "^3.0.0" + ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" @@ -5826,7 +5872,7 @@ pstree.remy@^1.1.8: resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== -punycode@^2.1.0: +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== @@ -6467,6 +6513,13 @@ source-map@~0.2.0: dependencies: amdefine ">=0.0.4" +sparse-bitfield@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11" + integrity sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ== + dependencies: + memory-pager "^1.0.2" + spdx-correct@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" @@ -6794,6 +6847,13 @@ touch@^3.1.0: dependencies: nopt "~1.0.10" +tr46@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-4.1.1.tgz#281a758dcc82aeb4fe38c7dfe4d11a395aac8469" + integrity sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw== + dependencies: + punycode "^2.3.0" + tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -7114,6 +7174,19 @@ webidl-conversions@^3.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +whatwg-url@^13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-13.0.0.tgz#b7b536aca48306394a34e44bda8e99f332410f8f" + integrity sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig== + dependencies: + tr46 "^4.1.1" + webidl-conversions "^7.0.0" + whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" From b6d92eb06673d21d912a7d3802616a924ec06568 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 30 Apr 2024 18:49:15 +0200 Subject: [PATCH 171/297] refactor(relayer): rn ListenerConfigs into WatcherConfigs --- packages/relayer/src/Watcher.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/relayer/src/Watcher.ts b/packages/relayer/src/Watcher.ts index 37491a09..995a38a9 100644 --- a/packages/relayer/src/Watcher.ts +++ b/packages/relayer/src/Watcher.ts @@ -1,7 +1,7 @@ import winston from "winston" import { Log } from "viem" -interface ListenerConfigs { +interface WatcherConfigs { logger: winston.Logger client: any contractAddress: `0x${string}` @@ -21,7 +21,7 @@ class Watcher { private _lastBlock: bigint private _listenIntervalTimeMs: number - constructor(_configs: ListenerConfigs) { + constructor(_configs: WatcherConfigs) { this.logger = _configs.logger.child({ service: "Watcher" }) this.client = _configs.client this.contractAddress = _configs.contractAddress From 15d51365c0224bd3356b3f8a49e0885f8a603508 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 30 Apr 2024 19:00:02 +0200 Subject: [PATCH 172/297] refactor(relayer): rn listen into watch and rn startWatching into start --- packages/relayer/.env.example | 2 +- packages/relayer/src/Watcher.ts | 10 +++++----- packages/relayer/src/index.ts | 9 ++++++--- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/packages/relayer/.env.example b/packages/relayer/.env.example index b2029efc..31b087b3 100644 --- a/packages/relayer/.env.example +++ b/packages/relayer/.env.example @@ -2,5 +2,5 @@ YAHO_ADDRESS= CHAIN_ID= RPC= PK= -LISTEN_INTERVAL_TIME_MS= +WATCH_INTERVAL_TIME_MS= MONGO_DB_URI= \ No newline at end of file diff --git a/packages/relayer/src/Watcher.ts b/packages/relayer/src/Watcher.ts index 995a38a9..56270b1c 100644 --- a/packages/relayer/src/Watcher.ts +++ b/packages/relayer/src/Watcher.ts @@ -7,7 +7,7 @@ interface WatcherConfigs { contractAddress: `0x${string}` abi: any eventName: string - listenIntervalTimeMs: number + watchIntervalTimeMs: number onLogs: (logs: Log[]) => Promise } @@ -19,7 +19,7 @@ class Watcher { abi: any eventName: string private _lastBlock: bigint - private _listenIntervalTimeMs: number + private _watchIntervalTimeMs: number constructor(_configs: WatcherConfigs) { this.logger = _configs.logger.child({ service: "Watcher" }) @@ -28,17 +28,17 @@ class Watcher { this.abi = _configs.abi this.eventName = _configs.eventName this.onLogs = _configs.onLogs - this._listenIntervalTimeMs = _configs.listenIntervalTimeMs + this._watchIntervalTimeMs = _configs.watchIntervalTimeMs this._lastBlock = 0n } - async startWatching() { + async start() { try { this._watch() setInterval(() => { this._watch() - }, this._listenIntervalTimeMs) + }, this._watchIntervalTimeMs) } catch (_err) {} } diff --git a/packages/relayer/src/index.ts b/packages/relayer/src/index.ts index 6a8b4b5e..95b839d1 100644 --- a/packages/relayer/src/index.ts +++ b/packages/relayer/src/index.ts @@ -30,8 +30,10 @@ const watcher = new Watcher({ contractAddress: process.env.YAHO_ADDRESS as `0x${string}`, abi: yahoAbi, eventName: "MessageDispatched", - listenIntervalTimeMs: Number(process.env.LISTEN_INTERVAL_TIME_MS as string), + watchIntervalTimeMs: Number(process.env.WATCH_INTERVAL_TIME_MS as string), onLogs: async (_logs: Log[]) => { + // TODO: filter messages that you don't want to relay. For example it could be possible + // to relayMessagesToAdapters only those coming from specific message.sender const messages = _logs.map((_log: Log) => Message.fromLog(_log)) await messages.map((_message: Message) => db.collection("messages").updateOne( @@ -39,7 +41,7 @@ const watcher = new Watcher({ { $set: { data: _message.toJSON(), - status: "seen", + status: "dispatched", chainId: client?.chain?.id as number, address: process.env.YAHO_ADDRESS as `0x${string}`, }, @@ -51,4 +53,5 @@ const watcher = new Watcher({ ) }, }) -watcher.startWatching() +watcher.start() + From 648b1f56cc81842f871c3b31a194b575304a3286 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 30 Apr 2024 19:29:28 +0200 Subject: [PATCH 173/297] refactor(common): makes threshold and targetChainId integers within Message --- packages/common/src/Message.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/common/src/Message.ts b/packages/common/src/Message.ts index 90f4470d..ba87a30f 100644 --- a/packages/common/src/Message.ts +++ b/packages/common/src/Message.ts @@ -89,8 +89,8 @@ class Message { serialize() { return [ this.nonce.toString(), - this.targetChainId.toString(), - this.threshold.toString(), + parseInt(this.targetChainId.toString()), + parseInt(this.threshold.toString()), this.sender, this.receiver, this.data, @@ -107,8 +107,8 @@ class Message { receiver: this.receiver, reporters: this.reporters, sender: this.sender, - targetChainId: this.targetChainId.toString(), - threshold: this.threshold.toString() + targetChainId: parseInt(this.targetChainId.toString()), + threshold: parseInt(this.threshold.toString()) } } } From b7fc364abb81c097b6493b89108d3395c54e4d9a Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 30 Apr 2024 19:41:39 +0200 Subject: [PATCH 174/297] feat(relayer): adds timestamp within messages --- packages/relayer/src/index.ts | 37 +++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/packages/relayer/src/index.ts b/packages/relayer/src/index.ts index 95b839d1..861b1e97 100644 --- a/packages/relayer/src/index.ts +++ b/packages/relayer/src/index.ts @@ -1,5 +1,5 @@ import { configDotenv } from "dotenv" -import { createWalletClient, http, Chain, publicActions, Log } from "viem" +import { createWalletClient, http, Chain, publicActions, Log, Block } from "viem" import { privateKeyToAccount } from "viem/accounts" import * as chains from "viem/chains" import { MongoClient } from "mongodb" @@ -34,24 +34,31 @@ const watcher = new Watcher({ onLogs: async (_logs: Log[]) => { // TODO: filter messages that you don't want to relay. For example it could be possible // to relayMessagesToAdapters only those coming from specific message.sender + + const blocks = (await Promise.all( + _logs.map((_log: Log) => client.getBlock({ blockHash: _log.blockHash as `0x${string}` })), + )) as Block[] const messages = _logs.map((_log: Log) => Message.fromLog(_log)) - await messages.map((_message: Message) => - db.collection("messages").updateOne( - { id: _message.id }, - { - $set: { - data: _message.toJSON(), - status: "dispatched", - chainId: client?.chain?.id as number, - address: process.env.YAHO_ADDRESS as `0x${string}`, + + await Promise.all( + messages.map((_message: Message, _index: number) => + db.collection("messages").updateOne( + { id: _message.id }, + { + $set: { + data: _message.toJSON(), + status: "dispatched", + chainId: client?.chain?.id as number, + address: process.env.YAHO_ADDRESS as `0x${string}`, + timestamp: parseInt(blocks[_index].timestamp.toString()), + }, }, - }, - { - upsert: true, - }, + { + upsert: true, + }, + ), ), ) }, }) watcher.start() - From c0cc29978806e964c703d25b51604577843df6fd Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 30 Apr 2024 20:31:24 +0200 Subject: [PATCH 175/297] feat(relayer): add Batcher --- packages/common/src/Message.ts | 2 +- packages/relayer/.env.example | 3 +- packages/relayer/src/Batcher.ts | 67 +++++++++++++++++++++++++++++++++ packages/relayer/src/index.ts | 38 ++++++++++++++++++- 4 files changed, 107 insertions(+), 3 deletions(-) create mode 100644 packages/relayer/src/Batcher.ts diff --git a/packages/common/src/Message.ts b/packages/common/src/Message.ts index ba87a30f..c304df25 100644 --- a/packages/common/src/Message.ts +++ b/packages/common/src/Message.ts @@ -108,7 +108,7 @@ class Message { reporters: this.reporters, sender: this.sender, targetChainId: parseInt(this.targetChainId.toString()), - threshold: parseInt(this.threshold.toString()) + threshold: parseInt(this.threshold.toString()), } } } diff --git a/packages/relayer/.env.example b/packages/relayer/.env.example index 31b087b3..ca604070 100644 --- a/packages/relayer/.env.example +++ b/packages/relayer/.env.example @@ -3,4 +3,5 @@ CHAIN_ID= RPC= PK= WATCH_INTERVAL_TIME_MS= -MONGO_DB_URI= \ No newline at end of file +MONGO_DB_URI= +MIN_BATCH_SIZE= \ No newline at end of file diff --git a/packages/relayer/src/Batcher.ts b/packages/relayer/src/Batcher.ts new file mode 100644 index 00000000..d318da89 --- /dev/null +++ b/packages/relayer/src/Batcher.ts @@ -0,0 +1,67 @@ +import winston from "winston" +import { Collection, Document } from "mongodb" + +interface BatcherConfigs { + logger: winston.Logger + collection: Collection + minBatchSize: number + findCondition: any + createBatchIntervalTimeMs: number + finalStatus: string + onBatch: (logs: Document[]) => Promise +} + +class Batcher { + logger: winston.Logger + collection: Collection + minBatchSize: number + finalStatus: string + onBatch: (logs: Document[]) => Promise + private _createBatchIntervalTimeMs: number + private _findCondition: any + + constructor(_configs: BatcherConfigs) { + this.logger = _configs.logger.child({ service: "Batcher" }) + this.collection = _configs.collection + this.minBatchSize = _configs.minBatchSize + this._findCondition = _configs.findCondition + this.finalStatus = _configs.finalStatus + this._createBatchIntervalTimeMs = _configs.createBatchIntervalTimeMs + this.onBatch = _configs.onBatch + } + + async start() { + try { + this._createBatch() + setInterval(() => { + this._createBatch() + }, this._createBatchIntervalTimeMs) + } catch (_err) {} + } + + private async _createBatch() { + try { + this.logger.info(`looking for creating a batch ...`) + const values = await this.collection.find(this._findCondition).toArray() + if (values.length >= this.minBatchSize) { + this.logger.info(`Batch found. Processing it ...`) + const result = await this.onBatch(values) + + await Promise.all( + values.map(({ _id }) => + this.collection.updateOne( + { _id }, + { + $set: { ...result, status: this.finalStatus }, + }, + ), + ), + ) + } + } catch (_err) { + this.logger.error(`${_err}`) + } + } +} + +export default Batcher diff --git a/packages/relayer/src/index.ts b/packages/relayer/src/index.ts index 861b1e97..42a41d3c 100644 --- a/packages/relayer/src/index.ts +++ b/packages/relayer/src/index.ts @@ -2,10 +2,11 @@ import { configDotenv } from "dotenv" import { createWalletClient, http, Chain, publicActions, Log, Block } from "viem" import { privateKeyToAccount } from "viem/accounts" import * as chains from "viem/chains" -import { MongoClient } from "mongodb" +import { MongoClient, Document } from "mongodb" import { logger, Message } from "@gnosis/hashi-common" +import Batcher from "./Batcher" import Watcher from "./Watcher" import yahoAbi from "./abi/Yaho.json" assert { type: "json" } @@ -62,3 +63,38 @@ const watcher = new Watcher({ }, }) watcher.start() + +const batcher = new Batcher({ + collection: db.collection("messages"), + createBatchIntervalTimeMs: Number(process.env.CREATE_BATCH_INTERVAL_TIME_MS as string), + finalStatus: "relayed", + findCondition: { + status: "dispatched", + address: process.env.YAHO_ADDRESS as `0x${string}`, + }, + logger, + minBatchSize: Number(process.env.MIN_BATCH_SIZE as string), + onBatch: async (_batch: Document[]) => { + const serializedMessages = _batch.map((_val: any) => + new Message({ + id: _val.id, + ..._val.data, + }).serialize(), + ) + + logger.child({ service: "Relayer" }).info("Sending messages ...") + const { request } = await client.simulateContract({ + address: process.env.YAHO_ADDRESS as `0x${string}`, + abi: yahoAbi, + functionName: "relayMessagesToAdapters", + args: [serializedMessages], + }) + const transactionHash = await client.writeContract(request) + logger.child({ service: "Relayer" }).info(`Messages sent: ${transactionHash}`) + + return { + transactionHash, + } + }, +}) +batcher.start() From ec16d1c9a1358fe38e7803099ba61bd1aa4cc6a3 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 1 May 2024 06:29:53 +0200 Subject: [PATCH 176/297] refactor(relayer): improves logs --- packages/relayer/src/Batcher.ts | 3 +-- packages/relayer/src/Watcher.ts | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/relayer/src/Batcher.ts b/packages/relayer/src/Batcher.ts index d318da89..ccf4390f 100644 --- a/packages/relayer/src/Batcher.ts +++ b/packages/relayer/src/Batcher.ts @@ -41,12 +41,11 @@ class Batcher { private async _createBatch() { try { - this.logger.info(`looking for creating a batch ...`) const values = await this.collection.find(this._findCondition).toArray() + this.logger.info(`Current batch size: ${values.length} missing: ${this.minBatchSize - values.length}`) if (values.length >= this.minBatchSize) { this.logger.info(`Batch found. Processing it ...`) const result = await this.onBatch(values) - await Promise.all( values.map(({ _id }) => this.collection.updateOne( diff --git a/packages/relayer/src/Watcher.ts b/packages/relayer/src/Watcher.ts index 56270b1c..2e20ad22 100644 --- a/packages/relayer/src/Watcher.ts +++ b/packages/relayer/src/Watcher.ts @@ -64,7 +64,7 @@ class Watcher { const logs = (await this.client.getFilterLogs({ filter })) as Log[] if (logs.length) { - this.logger.info(`Detected ${logs.length} new logs. Processing them ...`) + this.logger.info(`Detected ${logs.length} new ${this.eventName} events. Processing them ...`) await this.onLogs(logs) } From 8698e35fb2bacc85d5b8a0f7f5f8d812e0a304d7 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 1 May 2024 07:27:23 +0200 Subject: [PATCH 177/297] chore(relayer): rm docker stuff --- packages/relayer/.dockerignore | 7 ----- packages/relayer/Dockerfile | 13 --------- packages/relayer/README.md | 52 +--------------------------------- packages/relayer/package.json | 1 + 4 files changed, 2 insertions(+), 71 deletions(-) delete mode 100644 packages/relayer/.dockerignore delete mode 100644 packages/relayer/Dockerfile diff --git a/packages/relayer/.dockerignore b/packages/relayer/.dockerignore deleted file mode 100644 index 5f7b077a..00000000 --- a/packages/relayer/.dockerignore +++ /dev/null @@ -1,7 +0,0 @@ -node_modules -npm - debug.log -Dockerfile - .git - .gitignore - .yarn -logs diff --git a/packages/relayer/Dockerfile b/packages/relayer/Dockerfile deleted file mode 100644 index 58daafc7..00000000 --- a/packages/relayer/Dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM node:alpine - -WORKDIR /usr/src/app - -COPY package.json yarn.lock .env ./ - -RUN yarn install - -ADD . /usr/src/app - -RUN yarn compile - -CMD ["node", "dist/index.js"] \ No newline at end of file diff --git a/packages/relayer/README.md b/packages/relayer/README.md index 98ae1f41..759b2833 100644 --- a/packages/relayer/README.md +++ b/packages/relayer/README.md @@ -1,51 +1 @@ -# relayer - -Script to relay batches of Hashi Messages to the underlying adapters. - -  - ---- - -  - -## Getting Started - -These instructions will cover the usage information and how to run the code using Docker. - -### Create the .env file - -Configure the mode you want to run by editing the variable in `.env` by checking `.env.example` - -### Building the Docker Image - -To build the Docker image, run the following command from the root of the project: - -```sh -docker build -t relayer . -``` - -### Running the relayer - -After building the image, you can run it using the following command: - -```sh -docker run -d -p relayer -``` - -### Viewing Logs - -To view the logs from the running container, use: - -```sh -docker logs -f [CONTAINER_ID or CONTAINER_NAME] -``` - -You can find the `CONTAINER_ID` or `CONTAINER_NAME` using `docker ps`. - -### Stopping the relayer - -To stop the running container: - -```sh -docker stop [CONTAINER_ID or CONTAINER_NAME] -``` +# relayer \ No newline at end of file diff --git a/packages/relayer/package.json b/packages/relayer/package.json index b0694861..33ab6a51 100644 --- a/packages/relayer/package.json +++ b/packages/relayer/package.json @@ -12,6 +12,7 @@ "lint": "eslint --ignore-path ./.eslintignore --ext .js,.ts .", "prettier:check": "prettier --check \"**/*.{js,json,md,sol,ts,yml}\"", "prettier:write": "prettier --write \"**/*.{js,json,md,sol,ts,yml}\"", + "start": "ts-node --esm ./src/index.ts", "start:dev": "nodemon" }, "dependencies": { From 9837c69826d18361584b911edddca6d82e3b3974 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 1 May 2024 14:31:19 +0200 Subject: [PATCH 178/297] refactor(common & relayer): mv Watcher and yahoAbi within common --- packages/{relayer => common}/src/Watcher.ts | 9 +- packages/common/src/abi/Adapter.ts | 82 ++++ packages/common/src/abi/Yaho.ts | 504 ++++++++++++++++++++ packages/common/src/index.ts | 5 +- packages/relayer/src/abi/Yaho.json | 504 -------------------- packages/relayer/tsconfig.json | 16 +- 6 files changed, 609 insertions(+), 511 deletions(-) rename packages/{relayer => common}/src/Watcher.ts (82%) create mode 100644 packages/common/src/abi/Adapter.ts create mode 100644 packages/common/src/abi/Yaho.ts delete mode 100644 packages/relayer/src/abi/Yaho.json diff --git a/packages/relayer/src/Watcher.ts b/packages/common/src/Watcher.ts similarity index 82% rename from packages/relayer/src/Watcher.ts rename to packages/common/src/Watcher.ts index 2e20ad22..e7d07d40 100644 --- a/packages/relayer/src/Watcher.ts +++ b/packages/common/src/Watcher.ts @@ -51,7 +51,9 @@ class Watcher { const fromBlock = this._lastBlock + 1n const toBlock = currentBlock - this.logger.info(`looking for ${this.eventName} events from block ${fromBlock} to block ${toBlock} ...`) + this.logger.info( + `looking for ${this.eventName} events from block ${fromBlock} to block ${toBlock} on ${this.client.chain.name} ...`, + ) const filter = await this.client.createContractEventFilter({ address: this.contractAddress, @@ -64,8 +66,11 @@ class Watcher { const logs = (await this.client.getFilterLogs({ filter })) as Log[] if (logs.length) { - this.logger.info(`Detected ${logs.length} new ${this.eventName} events. Processing them ...`) + this.logger.info( + `Detected ${logs.length} new ${this.eventName} events on ${this.client.chain.name}. Processing them ...`, + ) await this.onLogs(logs) + this.logger.info("Events succesfully processed.") } this._lastBlock = currentBlock diff --git a/packages/common/src/abi/Adapter.ts b/packages/common/src/abi/Adapter.ts new file mode 100644 index 00000000..d3328cf0 --- /dev/null +++ b/packages/common/src/abi/Adapter.ts @@ -0,0 +1,82 @@ +export default [ + { + inputs: [ + { + internalType: "uint256", + name: "blockNumber", + type: "uint256", + }, + { + internalType: "bytes32", + name: "blockHash", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "storedBlockHash", + type: "bytes32", + }, + ], + name: "ConflictingBlockHeader", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "length", + type: "uint256", + }, + ], + name: "InvalidBlockHeaderLength", + type: "error", + }, + { + inputs: [], + name: "InvalidBlockHeaderRLP", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "id", + type: "uint256", + }, + { + indexed: true, + internalType: "bytes32", + name: "hash", + type: "bytes32", + }, + ], + name: "HashStored", + type: "event", + }, + { + inputs: [ + { + internalType: "uint256", + name: "domain", + type: "uint256", + }, + { + internalType: "uint256", + name: "id", + type: "uint256", + }, + ], + name: "getHash", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, +] diff --git a/packages/common/src/abi/Yaho.ts b/packages/common/src/abi/Yaho.ts new file mode 100644 index 00000000..1107fad5 --- /dev/null +++ b/packages/common/src/abi/Yaho.ts @@ -0,0 +1,504 @@ +export default [ + { + inputs: [ + { + components: [ + { + internalType: "uint256", + name: "nonce", + type: "uint256", + }, + { + internalType: "uint256", + name: "targetChainId", + type: "uint256", + }, + { + internalType: "uint256", + name: "threshold", + type: "uint256", + }, + { + internalType: "address", + name: "sender", + type: "address", + }, + { + internalType: "address", + name: "receiver", + type: "address", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "contract IReporter[]", + name: "reporters", + type: "address[]", + }, + { + internalType: "contract IAdapter[]", + name: "adapters", + type: "address[]", + }, + ], + internalType: "struct Message", + name: "message", + type: "tuple", + }, + ], + name: "InvalidMessage", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "threshold", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxThreshold", + type: "uint256", + }, + ], + name: "InvalidThreshold", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "messageId", + type: "uint256", + }, + ], + name: "MessageHashNotFound", + type: "error", + }, + { + inputs: [], + name: "NoAdaptersGiven", + type: "error", + }, + { + inputs: [], + name: "NoMessageIdsGiven", + type: "error", + }, + { + inputs: [], + name: "NoMessagesGiven", + type: "error", + }, + { + inputs: [], + name: "NoReportersGiven", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "arrayOne", + type: "uint256", + }, + { + internalType: "uint256", + name: "arrayTwo", + type: "uint256", + }, + ], + name: "UnequalArrayLengths", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "messageId", + type: "uint256", + }, + { + components: [ + { + internalType: "uint256", + name: "nonce", + type: "uint256", + }, + { + internalType: "uint256", + name: "targetChainId", + type: "uint256", + }, + { + internalType: "uint256", + name: "threshold", + type: "uint256", + }, + { + internalType: "address", + name: "sender", + type: "address", + }, + { + internalType: "address", + name: "receiver", + type: "address", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "contract IReporter[]", + name: "reporters", + type: "address[]", + }, + { + internalType: "contract IAdapter[]", + name: "adapters", + type: "address[]", + }, + ], + indexed: false, + internalType: "struct Message", + name: "message", + type: "tuple", + }, + ], + name: "MessageDispatched", + type: "event", + }, + { + inputs: [ + { + components: [ + { + internalType: "uint256", + name: "nonce", + type: "uint256", + }, + { + internalType: "uint256", + name: "targetChainId", + type: "uint256", + }, + { + internalType: "uint256", + name: "threshold", + type: "uint256", + }, + { + internalType: "address", + name: "sender", + type: "address", + }, + { + internalType: "address", + name: "receiver", + type: "address", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "contract IReporter[]", + name: "reporters", + type: "address[]", + }, + { + internalType: "contract IAdapter[]", + name: "adapters", + type: "address[]", + }, + ], + internalType: "struct Message", + name: "message", + type: "tuple", + }, + ], + name: "calculateMessageHash", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "sourceChainId", + type: "uint256", + }, + { + internalType: "address", + name: "dispatcherAddress", + type: "address", + }, + { + internalType: "bytes32", + name: "messageHash", + type: "bytes32", + }, + ], + name: "calculateMessageId", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [], + name: "currentNonce", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "targetChainId", + type: "uint256", + }, + { + internalType: "uint256", + name: "threshold", + type: "uint256", + }, + { + internalType: "address", + name: "receiver", + type: "address", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "contract IReporter[]", + name: "reporters", + type: "address[]", + }, + { + internalType: "contract IAdapter[]", + name: "adapters", + type: "address[]", + }, + ], + name: "dispatchMessage", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "targetChainId", + type: "uint256", + }, + { + internalType: "uint256", + name: "threshold", + type: "uint256", + }, + { + internalType: "address", + name: "receiver", + type: "address", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "contract IReporter[]", + name: "reporters", + type: "address[]", + }, + { + internalType: "contract IAdapter[]", + name: "adapters", + type: "address[]", + }, + ], + name: "dispatchMessageToAdapters", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + { + internalType: "bytes32[]", + name: "", + type: "bytes32[]", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "targetChainId", + type: "uint256", + }, + { + internalType: "uint256[]", + name: "thresholds", + type: "uint256[]", + }, + { + internalType: "address[]", + name: "receivers", + type: "address[]", + }, + { + internalType: "bytes[]", + name: "data", + type: "bytes[]", + }, + { + internalType: "contract IReporter[]", + name: "reporters", + type: "address[]", + }, + { + internalType: "contract IAdapter[]", + name: "adapters", + type: "address[]", + }, + ], + name: "dispatchMessagesToAdapters", + outputs: [ + { + internalType: "uint256[]", + name: "", + type: "uint256[]", + }, + { + internalType: "bytes32[]", + name: "", + type: "bytes32[]", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "messageId", + type: "uint256", + }, + ], + name: "getPendingMessageHash", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "uint256", + name: "nonce", + type: "uint256", + }, + { + internalType: "uint256", + name: "targetChainId", + type: "uint256", + }, + { + internalType: "uint256", + name: "threshold", + type: "uint256", + }, + { + internalType: "address", + name: "sender", + type: "address", + }, + { + internalType: "address", + name: "receiver", + type: "address", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "contract IReporter[]", + name: "reporters", + type: "address[]", + }, + { + internalType: "contract IAdapter[]", + name: "adapters", + type: "address[]", + }, + ], + internalType: "struct Message[]", + name: "messages", + type: "tuple[]", + }, + ], + name: "relayMessagesToAdapters", + outputs: [ + { + internalType: "bytes32[]", + name: "", + type: "bytes32[]", + }, + ], + stateMutability: "payable", + type: "function", + }, +] diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts index bdd66112..db8a395e 100644 --- a/packages/common/src/index.ts +++ b/packages/common/src/index.ts @@ -1,4 +1,7 @@ import logger from "./logger" import Message from "./Message" +import Watcher from "./Watcher" +import yahoAbi from "./abi/Yaho" +import adapterAbi from "./abi/Adapter" -export { logger, Message } +export { adapterAbi, logger, Message, Watcher, yahoAbi } diff --git a/packages/relayer/src/abi/Yaho.json b/packages/relayer/src/abi/Yaho.json deleted file mode 100644 index 80767b1a..00000000 --- a/packages/relayer/src/abi/Yaho.json +++ /dev/null @@ -1,504 +0,0 @@ -[ - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "threshold", - "type": "uint256" - }, - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "contract IReporter[]", - "name": "reporters", - "type": "address[]" - }, - { - "internalType": "contract IAdapter[]", - "name": "adapters", - "type": "address[]" - } - ], - "internalType": "struct Message", - "name": "message", - "type": "tuple" - } - ], - "name": "InvalidMessage", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "threshold", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxThreshold", - "type": "uint256" - } - ], - "name": "InvalidThreshold", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "messageId", - "type": "uint256" - } - ], - "name": "MessageHashNotFound", - "type": "error" - }, - { - "inputs": [], - "name": "NoAdaptersGiven", - "type": "error" - }, - { - "inputs": [], - "name": "NoMessageIdsGiven", - "type": "error" - }, - { - "inputs": [], - "name": "NoMessagesGiven", - "type": "error" - }, - { - "inputs": [], - "name": "NoReportersGiven", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "arrayOne", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "arrayTwo", - "type": "uint256" - } - ], - "name": "UnequalArrayLengths", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "messageId", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "threshold", - "type": "uint256" - }, - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "contract IReporter[]", - "name": "reporters", - "type": "address[]" - }, - { - "internalType": "contract IAdapter[]", - "name": "adapters", - "type": "address[]" - } - ], - "indexed": false, - "internalType": "struct Message", - "name": "message", - "type": "tuple" - } - ], - "name": "MessageDispatched", - "type": "event" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "threshold", - "type": "uint256" - }, - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "contract IReporter[]", - "name": "reporters", - "type": "address[]" - }, - { - "internalType": "contract IAdapter[]", - "name": "adapters", - "type": "address[]" - } - ], - "internalType": "struct Message", - "name": "message", - "type": "tuple" - } - ], - "name": "calculateMessageHash", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "sourceChainId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "dispatcherAddress", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "messageHash", - "type": "bytes32" - } - ], - "name": "calculateMessageId", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "currentNonce", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "threshold", - "type": "uint256" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "contract IReporter[]", - "name": "reporters", - "type": "address[]" - }, - { - "internalType": "contract IAdapter[]", - "name": "adapters", - "type": "address[]" - } - ], - "name": "dispatchMessage", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "threshold", - "type": "uint256" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "contract IReporter[]", - "name": "reporters", - "type": "address[]" - }, - { - "internalType": "contract IAdapter[]", - "name": "adapters", - "type": "address[]" - } - ], - "name": "dispatchMessageToAdapters", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "", - "type": "bytes32[]" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "internalType": "uint256[]", - "name": "thresholds", - "type": "uint256[]" - }, - { - "internalType": "address[]", - "name": "receivers", - "type": "address[]" - }, - { - "internalType": "bytes[]", - "name": "data", - "type": "bytes[]" - }, - { - "internalType": "contract IReporter[]", - "name": "reporters", - "type": "address[]" - }, - { - "internalType": "contract IAdapter[]", - "name": "adapters", - "type": "address[]" - } - ], - "name": "dispatchMessagesToAdapters", - "outputs": [ - { - "internalType": "uint256[]", - "name": "", - "type": "uint256[]" - }, - { - "internalType": "bytes32[]", - "name": "", - "type": "bytes32[]" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "messageId", - "type": "uint256" - } - ], - "name": "getPendingMessageHash", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "threshold", - "type": "uint256" - }, - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "contract IReporter[]", - "name": "reporters", - "type": "address[]" - }, - { - "internalType": "contract IAdapter[]", - "name": "adapters", - "type": "address[]" - } - ], - "internalType": "struct Message[]", - "name": "messages", - "type": "tuple[]" - } - ], - "name": "relayMessagesToAdapters", - "outputs": [ - { - "internalType": "bytes32[]", - "name": "", - "type": "bytes32[]" - } - ], - "stateMutability": "payable", - "type": "function" - } -] diff --git a/packages/relayer/tsconfig.json b/packages/relayer/tsconfig.json index d69a137b..d167b40a 100644 --- a/packages/relayer/tsconfig.json +++ b/packages/relayer/tsconfig.json @@ -6,7 +6,11 @@ "esModuleInterop": true, "experimentalDecorators": true, "forceConsistentCasingInFileNames": true, - "lib": ["es6", "ESNext", "DOM"], + "lib": [ + "es6", + "ESNext", + "DOM" + ], "module": "ESNext", "moduleResolution": "node", "noImplicitAny": true, @@ -17,10 +21,14 @@ "strict": true, "target": "ESNext" }, - "exclude": ["node_modules"], - "include": ["./src/**/*"], + "exclude": [ + "node_modules" + ], + "include": [ + "./src/**/*" + ], "ts-node": { "esm": true, "experimentalSpecifierResolution": "node" } -} +} \ No newline at end of file From abd36bec6df016fd87d11d79e944c71de645276d Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 1 May 2024 14:32:49 +0200 Subject: [PATCH 179/297] refactor(relayer): adds dispatch tx hash, rm timestamp and rn messages into relayedMessages --- packages/relayer/README.md | 2 +- packages/relayer/src/index.ts | 22 ++++++++++------------ 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/packages/relayer/README.md b/packages/relayer/README.md index 759b2833..6c83d9ff 100644 --- a/packages/relayer/README.md +++ b/packages/relayer/README.md @@ -1 +1 @@ -# relayer \ No newline at end of file +# relayer diff --git a/packages/relayer/src/index.ts b/packages/relayer/src/index.ts index 42a41d3c..79b6f949 100644 --- a/packages/relayer/src/index.ts +++ b/packages/relayer/src/index.ts @@ -1,14 +1,12 @@ import { configDotenv } from "dotenv" -import { createWalletClient, http, Chain, publicActions, Log, Block } from "viem" +import { createWalletClient, http, Chain, publicActions, Log } from "viem" import { privateKeyToAccount } from "viem/accounts" import * as chains from "viem/chains" import { MongoClient, Document } from "mongodb" -import { logger, Message } from "@gnosis/hashi-common" +import { logger, Message, Watcher, yahoAbi } from "@gnosis/hashi-common" import Batcher from "./Batcher" -import Watcher from "./Watcher" -import yahoAbi from "./abi/Yaho.json" assert { type: "json" } configDotenv() @@ -36,22 +34,22 @@ const watcher = new Watcher({ // TODO: filter messages that you don't want to relay. For example it could be possible // to relayMessagesToAdapters only those coming from specific message.sender - const blocks = (await Promise.all( + /*const blocks = (await Promise.all( _logs.map((_log: Log) => client.getBlock({ blockHash: _log.blockHash as `0x${string}` })), - )) as Block[] + )) as Block[]*/ const messages = _logs.map((_log: Log) => Message.fromLog(_log)) await Promise.all( messages.map((_message: Message, _index: number) => - db.collection("messages").updateOne( + db.collection("relayedMessages").updateOne( { id: _message.id }, { $set: { + address: process.env.YAHO_ADDRESS as `0x${string}`, + chainId: client?.chain?.id as number, data: _message.toJSON(), + dispatchTransactionHash: _logs[_index].transactionHash, status: "dispatched", - chainId: client?.chain?.id as number, - address: process.env.YAHO_ADDRESS as `0x${string}`, - timestamp: parseInt(blocks[_index].timestamp.toString()), }, }, { @@ -65,7 +63,7 @@ const watcher = new Watcher({ watcher.start() const batcher = new Batcher({ - collection: db.collection("messages"), + collection: db.collection("relayedMessages"), createBatchIntervalTimeMs: Number(process.env.CREATE_BATCH_INTERVAL_TIME_MS as string), finalStatus: "relayed", findCondition: { @@ -93,7 +91,7 @@ const batcher = new Batcher({ logger.child({ service: "Relayer" }).info(`Messages sent: ${transactionHash}`) return { - transactionHash, + relayTransactionHash: transactionHash, } }, }) From 57dd60b7c91c9dc4173ab6c528731ffb59a7407d Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 1 May 2024 15:58:59 +0200 Subject: [PATCH 180/297] refactor(common): mv Batcher within common, adds Yaru and makes service name configurable --- packages/{relayer => common}/src/Batcher.ts | 38 +-- packages/common/src/Watcher.ts | 3 +- packages/common/src/abi/Yaru.ts | 330 ++++++++++++++++++++ packages/common/src/index.ts | 4 +- 4 files changed, 349 insertions(+), 26 deletions(-) rename packages/{relayer => common}/src/Batcher.ts (56%) create mode 100644 packages/common/src/abi/Yaru.ts diff --git a/packages/relayer/src/Batcher.ts b/packages/common/src/Batcher.ts similarity index 56% rename from packages/relayer/src/Batcher.ts rename to packages/common/src/Batcher.ts index ccf4390f..89d2f063 100644 --- a/packages/relayer/src/Batcher.ts +++ b/packages/common/src/Batcher.ts @@ -1,33 +1,30 @@ import winston from "winston" -import { Collection, Document } from "mongodb" interface BatcherConfigs { + service: string logger: winston.Logger - collection: Collection minBatchSize: number - findCondition: any createBatchIntervalTimeMs: number - finalStatus: string - onBatch: (logs: Document[]) => Promise + onBatch: (batch: any[]) => Promise + onGetValues: () => Promise + onResult?: (result: any, values: any) => Promise } class Batcher { logger: winston.Logger - collection: Collection minBatchSize: number - finalStatus: string - onBatch: (logs: Document[]) => Promise + onBatch: (batch: any[]) => Promise + onGetValues: () => Promise + onResult: ((result: any, values: any) => Promise) | undefined private _createBatchIntervalTimeMs: number - private _findCondition: any constructor(_configs: BatcherConfigs) { - this.logger = _configs.logger.child({ service: "Batcher" }) - this.collection = _configs.collection + this.logger = _configs.logger.child({ service: _configs.service }) this.minBatchSize = _configs.minBatchSize - this._findCondition = _configs.findCondition - this.finalStatus = _configs.finalStatus this._createBatchIntervalTimeMs = _configs.createBatchIntervalTimeMs this.onBatch = _configs.onBatch + this.onGetValues = _configs.onGetValues + this.onResult = _configs.onResult } async start() { @@ -41,21 +38,14 @@ class Batcher { private async _createBatch() { try { - const values = await this.collection.find(this._findCondition).toArray() + const values = await this.onGetValues() this.logger.info(`Current batch size: ${values.length} missing: ${this.minBatchSize - values.length}`) if (values.length >= this.minBatchSize) { this.logger.info(`Batch found. Processing it ...`) const result = await this.onBatch(values) - await Promise.all( - values.map(({ _id }) => - this.collection.updateOne( - { _id }, - { - $set: { ...result, status: this.finalStatus }, - }, - ), - ), - ) + if (result && this.onResult) { + await this.onResult(result, values) + } } } catch (_err) { this.logger.error(`${_err}`) diff --git a/packages/common/src/Watcher.ts b/packages/common/src/Watcher.ts index e7d07d40..467d1bec 100644 --- a/packages/common/src/Watcher.ts +++ b/packages/common/src/Watcher.ts @@ -2,6 +2,7 @@ import winston from "winston" import { Log } from "viem" interface WatcherConfigs { + service: string logger: winston.Logger client: any contractAddress: `0x${string}` @@ -22,7 +23,7 @@ class Watcher { private _watchIntervalTimeMs: number constructor(_configs: WatcherConfigs) { - this.logger = _configs.logger.child({ service: "Watcher" }) + this.logger = _configs.logger.child({ service: _configs.service }) this.client = _configs.client this.contractAddress = _configs.contractAddress this.abi = _configs.abi diff --git a/packages/common/src/abi/Yaru.ts b/packages/common/src/abi/Yaru.ts new file mode 100644 index 00000000..bc0ce114 --- /dev/null +++ b/packages/common/src/abi/Yaru.ts @@ -0,0 +1,330 @@ +export default [ + { + inputs: [ + { + internalType: "address", + name: "hashi", + type: "address", + }, + { + internalType: "address", + name: "yaho_", + type: "address", + }, + { + internalType: "uint256", + name: "sourceChainId", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [], + name: "CallFailed", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "chainId", + type: "uint256", + }, + { + internalType: "uint256", + name: "expectedChainId", + type: "uint256", + }, + ], + name: "InvalidToChainId", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "messageId", + type: "uint256", + }, + ], + name: "MessageIdAlreadyExecuted", + type: "error", + }, + { + inputs: [], + name: "ThresholdNotMet", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "messageId", + type: "uint256", + }, + { + components: [ + { + internalType: "uint256", + name: "nonce", + type: "uint256", + }, + { + internalType: "uint256", + name: "targetChainId", + type: "uint256", + }, + { + internalType: "uint256", + name: "threshold", + type: "uint256", + }, + { + internalType: "address", + name: "sender", + type: "address", + }, + { + internalType: "address", + name: "receiver", + type: "address", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "contract IReporter[]", + name: "reporters", + type: "address[]", + }, + { + internalType: "contract IAdapter[]", + name: "adapters", + type: "address[]", + }, + ], + indexed: false, + internalType: "struct Message", + name: "message", + type: "tuple", + }, + ], + name: "MessageExecuted", + type: "event", + }, + { + inputs: [], + name: "HASHI", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "SOURCE_CHAIN_ID", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "YAHO", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "uint256", + name: "nonce", + type: "uint256", + }, + { + internalType: "uint256", + name: "targetChainId", + type: "uint256", + }, + { + internalType: "uint256", + name: "threshold", + type: "uint256", + }, + { + internalType: "address", + name: "sender", + type: "address", + }, + { + internalType: "address", + name: "receiver", + type: "address", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "contract IReporter[]", + name: "reporters", + type: "address[]", + }, + { + internalType: "contract IAdapter[]", + name: "adapters", + type: "address[]", + }, + ], + internalType: "struct Message", + name: "message", + type: "tuple", + }, + ], + name: "calculateMessageHash", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "sourceChainId", + type: "uint256", + }, + { + internalType: "address", + name: "dispatcherAddress", + type: "address", + }, + { + internalType: "bytes32", + name: "messageHash", + type: "bytes32", + }, + ], + name: "calculateMessageId", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "uint256", + name: "nonce", + type: "uint256", + }, + { + internalType: "uint256", + name: "targetChainId", + type: "uint256", + }, + { + internalType: "uint256", + name: "threshold", + type: "uint256", + }, + { + internalType: "address", + name: "sender", + type: "address", + }, + { + internalType: "address", + name: "receiver", + type: "address", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "contract IReporter[]", + name: "reporters", + type: "address[]", + }, + { + internalType: "contract IAdapter[]", + name: "adapters", + type: "address[]", + }, + ], + internalType: "struct Message[]", + name: "messages", + type: "tuple[]", + }, + ], + name: "executeMessages", + outputs: [ + { + internalType: "bytes[]", + name: "", + type: "bytes[]", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "executed", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, +] diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts index db8a395e..9602aed5 100644 --- a/packages/common/src/index.ts +++ b/packages/common/src/index.ts @@ -1,7 +1,9 @@ import logger from "./logger" +import Batcher from "./Batcher" import Message from "./Message" import Watcher from "./Watcher" import yahoAbi from "./abi/Yaho" +import yaruAbi from "./abi/Yaru" import adapterAbi from "./abi/Adapter" -export { adapterAbi, logger, Message, Watcher, yahoAbi } +export { adapterAbi, Batcher, logger, Message, Watcher, yahoAbi, yaruAbi } From 3003a77d7f4d18f52772f10f82497609306ac275 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 1 May 2024 16:03:54 +0200 Subject: [PATCH 181/297] refactor(relayer): changes it based on new Batcher design --- packages/relayer/src/index.ts | 40 +++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/packages/relayer/src/index.ts b/packages/relayer/src/index.ts index 79b6f949..042d2688 100644 --- a/packages/relayer/src/index.ts +++ b/packages/relayer/src/index.ts @@ -3,10 +3,7 @@ import { createWalletClient, http, Chain, publicActions, Log } from "viem" import { privateKeyToAccount } from "viem/accounts" import * as chains from "viem/chains" import { MongoClient, Document } from "mongodb" - -import { logger, Message, Watcher, yahoAbi } from "@gnosis/hashi-common" - -import Batcher from "./Batcher" +import { Batcher, logger, Message, Watcher, yahoAbi } from "@gnosis/hashi-common" configDotenv() @@ -24,6 +21,7 @@ await mongoClient.connect() const db = mongoClient.db("hashi") const watcher = new Watcher({ + service: "RelayerWatcher", logger, client, contractAddress: process.env.YAHO_ADDRESS as `0x${string}`, @@ -63,15 +61,16 @@ const watcher = new Watcher({ watcher.start() const batcher = new Batcher({ - collection: db.collection("relayedMessages"), + service: "RelayerBatcher", createBatchIntervalTimeMs: Number(process.env.CREATE_BATCH_INTERVAL_TIME_MS as string), - finalStatus: "relayed", - findCondition: { - status: "dispatched", - address: process.env.YAHO_ADDRESS as `0x${string}`, - }, logger, minBatchSize: Number(process.env.MIN_BATCH_SIZE as string), + onGetValues: () => { + return db.collection("relayedMessages").find({ + status: "dispatched", + address: process.env.YAHO_ADDRESS as `0x${string}`, + }).toArray() + }, onBatch: async (_batch: Document[]) => { const serializedMessages = _batch.map((_val: any) => new Message({ @@ -80,7 +79,7 @@ const batcher = new Batcher({ }).serialize(), ) - logger.child({ service: "Relayer" }).info("Sending messages ...") + logger.child({ service: "Relayer" }).info(`Relaying ${serializedMessages.length} messages ...`) const { request } = await client.simulateContract({ address: process.env.YAHO_ADDRESS as `0x${string}`, abi: yahoAbi, @@ -88,11 +87,20 @@ const batcher = new Batcher({ args: [serializedMessages], }) const transactionHash = await client.writeContract(request) - logger.child({ service: "Relayer" }).info(`Messages sent: ${transactionHash}`) - - return { - relayTransactionHash: transactionHash, - } + logger.child({ service: "Relayer" }).info(`Messages relayed: ${transactionHash}`) + return transactionHash + }, + onResult: (_result: any, _values: Document[]) => { + return Promise.all( + _values.map(({ _id }) => + db.collection("relayedMessages").updateOne( + { _id }, + { + $set: { relayTransactionHash: _result, status: "relayed" }, + }, + ), + ), + ) }, }) batcher.start() From acc3cb5a5c65df5b0b2ca3bcbebf5b7d2b8f6493 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 1 May 2024 16:21:09 +0200 Subject: [PATCH 182/297] refactor(relayer): formats and changes comment --- packages/relayer/src/index.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/relayer/src/index.ts b/packages/relayer/src/index.ts index 042d2688..f4925ec2 100644 --- a/packages/relayer/src/index.ts +++ b/packages/relayer/src/index.ts @@ -66,10 +66,13 @@ const batcher = new Batcher({ logger, minBatchSize: Number(process.env.MIN_BATCH_SIZE as string), onGetValues: () => { - return db.collection("relayedMessages").find({ - status: "dispatched", - address: process.env.YAHO_ADDRESS as `0x${string}`, - }).toArray() + return db + .collection("relayedMessages") + .find({ + status: "dispatched", + address: process.env.YAHO_ADDRESS as `0x${string}`, + }) + .toArray() }, onBatch: async (_batch: Document[]) => { const serializedMessages = _batch.map((_val: any) => @@ -87,7 +90,7 @@ const batcher = new Batcher({ args: [serializedMessages], }) const transactionHash = await client.writeContract(request) - logger.child({ service: "Relayer" }).info(`Messages relayed: ${transactionHash}`) + logger.child({ service: "Relayer" }).info(`${serializedMessages.length} messages relayed: ${transactionHash}`) return transactionHash }, onResult: (_result: any, _values: Document[]) => { From b83e0842f914b69e5dae0d13b4453af83fe2f827 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 1 May 2024 16:44:34 +0200 Subject: [PATCH 183/297] feat(executor): <- adds first implementation of this --- packages/executor/.env.example | 12 +++ packages/executor/.eslintignore | 2 + packages/executor/.eslintrc.yml | 21 ++++ packages/executor/.gitignore | 1 + packages/executor/.prettierignore | 2 + packages/executor/.prettierrc.yml | 7 ++ packages/executor/README.md | 1 + packages/executor/nodemon.json | 5 + packages/executor/package.json | 36 +++++++ packages/executor/src/index.ts | 154 ++++++++++++++++++++++++++++++ packages/executor/tsconfig.json | 26 +++++ 11 files changed, 267 insertions(+) create mode 100644 packages/executor/.env.example create mode 100644 packages/executor/.eslintignore create mode 100644 packages/executor/.eslintrc.yml create mode 100644 packages/executor/.gitignore create mode 100644 packages/executor/.prettierignore create mode 100644 packages/executor/.prettierrc.yml create mode 100644 packages/executor/README.md create mode 100644 packages/executor/nodemon.json create mode 100644 packages/executor/package.json create mode 100644 packages/executor/src/index.ts create mode 100644 packages/executor/tsconfig.json diff --git a/packages/executor/.env.example b/packages/executor/.env.example new file mode 100644 index 00000000..d975a428 --- /dev/null +++ b/packages/executor/.env.example @@ -0,0 +1,12 @@ +SOURCE_YAHO_ADDRESS= +TARGET_YARU_ADDRESS= +SOURCE_CHAIN_ID= +TARGET_CHAIN_ID= +SOURCE_RPC= +TARGET_RPC= +PK= +WATCH_INTERVAL_TIME_MS= +MONGO_DB_URI= +MIN_BATCH_SIZE= +CREATE_BATCH_INTERVAL_TIME_MS= +ADAPTERS= \ No newline at end of file diff --git a/packages/executor/.eslintignore b/packages/executor/.eslintignore new file mode 100644 index 00000000..b68087da --- /dev/null +++ b/packages/executor/.eslintignore @@ -0,0 +1,2 @@ +**/dist +**/node_modules \ No newline at end of file diff --git a/packages/executor/.eslintrc.yml b/packages/executor/.eslintrc.yml new file mode 100644 index 00000000..27672a35 --- /dev/null +++ b/packages/executor/.eslintrc.yml @@ -0,0 +1,21 @@ +extends: + - "eslint:recommended" + - "plugin:@typescript-eslint/eslint-recommended" + - "plugin:@typescript-eslint/recommended" + - "prettier" +parser: "@typescript-eslint/parser" +parserOptions: + project: "tsconfig.json" +plugins: + - "@typescript-eslint" +root: true +rules: + "@typescript-eslint/no-floating-promises": + - error + - ignoreIIFE: true + ignoreVoid: true + "@typescript-eslint/no-inferrable-types": "off" + "@typescript-eslint/no-unused-vars": + - error + - argsIgnorePattern: "_" + varsIgnorePattern: "_" diff --git a/packages/executor/.gitignore b/packages/executor/.gitignore new file mode 100644 index 00000000..5292519a --- /dev/null +++ b/packages/executor/.gitignore @@ -0,0 +1 @@ +logs/ \ No newline at end of file diff --git a/packages/executor/.prettierignore b/packages/executor/.prettierignore new file mode 100644 index 00000000..b68087da --- /dev/null +++ b/packages/executor/.prettierignore @@ -0,0 +1,2 @@ +**/dist +**/node_modules \ No newline at end of file diff --git a/packages/executor/.prettierrc.yml b/packages/executor/.prettierrc.yml new file mode 100644 index 00000000..e9bada2e --- /dev/null +++ b/packages/executor/.prettierrc.yml @@ -0,0 +1,7 @@ +bracketSpacing: true +printWidth: 120 +proseWrap: "always" +singleQuote: false +tabWidth: 2 +trailingComma: "all" +semi: false diff --git a/packages/executor/README.md b/packages/executor/README.md new file mode 100644 index 00000000..cef2a56d --- /dev/null +++ b/packages/executor/README.md @@ -0,0 +1 @@ +# executor diff --git a/packages/executor/nodemon.json b/packages/executor/nodemon.json new file mode 100644 index 00000000..b5fabeb4 --- /dev/null +++ b/packages/executor/nodemon.json @@ -0,0 +1,5 @@ +{ + "watch": ["src"], + "ext": "ts,json", + "exec": "ts-node --esm ./src/index.ts" +} diff --git a/packages/executor/package.json b/packages/executor/package.json new file mode 100644 index 00000000..8af52a07 --- /dev/null +++ b/packages/executor/package.json @@ -0,0 +1,36 @@ +{ + "name": "@gnosis/hashi-executor", + "private": true, + "version": "0.1.0", + "type": "module", + "author": { + "name": "gnosis", + "url": "https://github.com/gnosis" + }, + "scripts": { + "compile": "tsc", + "lint": "eslint --ignore-path ./.eslintignore --ext .js,.ts .", + "prettier:check": "prettier --check \"**/*.{js,json,md,sol,ts,yml}\"", + "prettier:write": "prettier --write \"**/*.{js,json,md,sol,ts,yml}\"", + "start": "ts-node --esm ./src/index.ts", + "start:dev": "nodemon" + }, + "dependencies": { + "@gnosis/hashi-common": "0.1.0", + "dotenv": "^16.3.1", + "mongodb": "6.5.0", + "viem": "^2.9.28", + "winston": "^3.11.0" + }, + "devDependencies": { + "@types/node": "^20.8.9", + "@typescript-eslint/eslint-plugin": "^6.7.5", + "@typescript-eslint/parser": "^6.7.5", + "eslint": "^8.51.0", + "eslint-config-prettier": "^9.0.0", + "nodemon": "^3.0.1", + "prettier": "^3.0.3", + "ts-node": "^10.9.1", + "typescript": "^5.2.2" + } +} diff --git a/packages/executor/src/index.ts b/packages/executor/src/index.ts new file mode 100644 index 00000000..d234852f --- /dev/null +++ b/packages/executor/src/index.ts @@ -0,0 +1,154 @@ +import { configDotenv } from "dotenv" +import { createWalletClient, http, Chain, publicActions, Log, Block } from "viem" +import { privateKeyToAccount } from "viem/accounts" +import * as chains from "viem/chains" +import { MongoClient, Document } from "mongodb" +import { adapterAbi, Batcher, logger, Message, Watcher, yahoAbi, yaruAbi } from "@gnosis/hashi-common" + +configDotenv() + +const mongoClient = new MongoClient(process.env.MONGO_DB_URI as string) +await mongoClient.connect() +const db = mongoClient.db("hashi") + +const sourceChain = Object.values(chains).find(({ id }) => id.toString() === (process.env.SOURCE_CHAIN_ID as string)) +if (!sourceChain) throw new Error("Invalid SOURCE_CHAIN_ID") +const targetChain = Object.values(chains).find(({ id }) => id.toString() === (process.env.TARGET_CHAIN_ID as string)) +if (!sourceChain) throw new Error("Invalid TARGET_CHAIN_ID") + +const sourceClient = createWalletClient({ + account: privateKeyToAccount(process.env.PK as `0x${string}`), + chain: sourceChain as Chain | undefined, + transport: http(process.env.SOURCE_RPC as string), +}).extend(publicActions) +const targetClient = createWalletClient({ + account: privateKeyToAccount(process.env.PK as `0x${string}`), + chain: targetChain as Chain | undefined, + transport: http(process.env.TARGET_RPC as string), +}).extend(publicActions) + +const adapters = (process.env.ADAPTERS as string).split(",") as `0x${string}`[] +const watchers = adapters.map( + (_adapter) => + new Watcher({ + abi: adapterAbi, + client: targetClient, + contractAddress: _adapter as `0x${string}`, + eventName: "HashStored", + logger, + service: `ExecutorWatcher:${_adapter.slice(0, 6)}${_adapter.slice(_adapter.length - 4, _adapter.length)}`, + watchIntervalTimeMs: Number(process.env.WATCH_INTERVAL_TIME_MS as string), + onLogs: async (_logs: Log[]) => { + const messageIds = _logs.map((_log) => _log.topics[1]) + // NOTE: without setting fromBlock and toBlock, it's not possible to getContractEvents + const blockNumber = await sourceClient.getBlockNumber() + const messageDispatchedLogs = await sourceClient.getContractEvents({ + abi: yahoAbi, + address: process.env.SOURCE_YAHO_ADDRESS as `0x${string}`, + eventName: "MessageDispatched", + args: { + messageId: messageIds, + }, + fromBlock: blockNumber - 99999n, + toBlock: blockNumber, + }) + + const messages = messageDispatchedLogs.map((_log) => Message.fromLog(_log)) + for (const message of messages) { + const hashStoredLog = _logs.find((_log) => _log.topics[1] === message.id) as Log + + await db.collection("executedMessages").findOneAndUpdate( + { id: message.id }, + { + $addToSet: { + confirmedBy: hashStoredLog.address, + }, + $setOnInsert: { + chainId: targetClient?.chain?.id as number, + storeHashTransactionHash: hashStoredLog.transactionHash, + status: "waitingForConfirmations", + data: { + ...message.toJSON(), + }, + }, + }, + { upsert: true, returnDocument: "after" }, + ) + } + }, + }), +) +watchers.map((_watcher) => _watcher.start()) + +const batcher = new Batcher({ + createBatchIntervalTimeMs: Number(process.env.CREATE_BATCH_INTERVAL_TIME_MS as string), + logger, + minBatchSize: Number(process.env.MIN_BATCH_SIZE as string), + service: "ExecutorBatcher", + onGetValues: () => { + return db + .collection("executedMessages") + .find({ $where: "this.confirmedBy.length >= this.data.threshold && this.status == 'waitingForConfirmations'" }) + .toArray() + }, + onBatch: async (_batch: Document[]) => { + const messages = [_batch[0]].map( + (_val: any) => + new Message({ + id: _val.id, + ..._val.data, + }), + ) + + const executed = await Promise.all( + messages.map((_message: Message) => + targetClient.readContract({ + address: process.env.TARGET_YARU_ADDRESS as `0x${string}`, + abi: yaruAbi, + functionName: "executed", + args: [_message.id], + }), + ), + ) + const messagesAlreadyExecuted = messages.filter((_, _index) => executed[_index]) + if (messagesAlreadyExecuted.length) { + logger + .child({ service: "Executor" }) + .info(`Found ${messagesAlreadyExecuted.length} messages already executed. Processing them ...`) + // NOTE: find the transactionHash + await db + .collection("messagesAlreadyExecuted") + .updateMany( + { id: { $in: messages.map((_message: Message) => _message.id) } }, + { $set: { status: "alreadyExecuted" } }, + ) + } + + const messagesToExecute = messages.filter((_, _index) => !executed[_index]) + if (messagesToExecute.length) { + logger.child({ service: "Executor" }).info(`Executing ${messagesToExecute.length} messages ...`) + const { request } = await targetClient.simulateContract({ + address: process.env.TARGET_YARU_ADDRESS as `0x${string}`, + abi: yaruAbi, + functionName: "executeMessages", + args: [messagesToExecute.map((_message: Message) => _message.serialize())], + }) + const transactionHash = await targetClient.writeContract(request) + logger.child({ service: "Executor" }).info(`${messagesToExecute.length} messages executed: ${transactionHash}`) + return transactionHash + } + }, + onResult: (_result: any, _values: Document[]) => { + return Promise.all( + _values.map(({ _id }) => + db.collection("executedMessages").updateOne( + { _id }, + { + $set: { executeTransactionHash: _result, status: "executed" }, + }, + ), + ), + ) + }, +}) +batcher.start() diff --git a/packages/executor/tsconfig.json b/packages/executor/tsconfig.json new file mode 100644 index 00000000..d69a137b --- /dev/null +++ b/packages/executor/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "emitDecoratorMetadata": true, + "esModuleInterop": true, + "experimentalDecorators": true, + "forceConsistentCasingInFileNames": true, + "lib": ["es6", "ESNext", "DOM"], + "module": "ESNext", + "moduleResolution": "node", + "noImplicitAny": true, + "outDir": "./dist", + "removeComments": true, + "resolveJsonModule": true, + "sourceMap": true, + "strict": true, + "target": "ESNext" + }, + "exclude": ["node_modules"], + "include": ["./src/**/*"], + "ts-node": { + "esm": true, + "experimentalSpecifierResolution": "node" + } +} From 3ebce364bc3a110b3b98330f5bc0bbd0db897a59 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 1 May 2024 16:51:58 +0200 Subject: [PATCH 184/297] refactor(executor): changes comment --- packages/executor/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/executor/src/index.ts b/packages/executor/src/index.ts index d234852f..c408d419 100644 --- a/packages/executor/src/index.ts +++ b/packages/executor/src/index.ts @@ -115,7 +115,7 @@ const batcher = new Batcher({ logger .child({ service: "Executor" }) .info(`Found ${messagesAlreadyExecuted.length} messages already executed. Processing them ...`) - // NOTE: find the transactionHash + // TODO: find the transactionHash await db .collection("messagesAlreadyExecuted") .updateMany( From f4ac4d4d5d73eb7d585ee5f520aebc7a18365c02 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 2 May 2024 08:46:22 +0200 Subject: [PATCH 185/297] feat(common & relayer): rm values from Batcher.onResult --- packages/common/src/Batcher.ts | 8 ++++---- packages/relayer/src/index.ts | 28 ++++++++++++++++++---------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/packages/common/src/Batcher.ts b/packages/common/src/Batcher.ts index 89d2f063..e2317b5d 100644 --- a/packages/common/src/Batcher.ts +++ b/packages/common/src/Batcher.ts @@ -7,7 +7,7 @@ interface BatcherConfigs { createBatchIntervalTimeMs: number onBatch: (batch: any[]) => Promise onGetValues: () => Promise - onResult?: (result: any, values: any) => Promise + onResult?: (result: any) => Promise } class Batcher { @@ -15,7 +15,7 @@ class Batcher { minBatchSize: number onBatch: (batch: any[]) => Promise onGetValues: () => Promise - onResult: ((result: any, values: any) => Promise) | undefined + onResult: ((result: any) => Promise) | undefined private _createBatchIntervalTimeMs: number constructor(_configs: BatcherConfigs) { @@ -39,12 +39,12 @@ class Batcher { private async _createBatch() { try { const values = await this.onGetValues() - this.logger.info(`Current batch size: ${values.length} missing: ${this.minBatchSize - values.length}`) + this.logger.info(`Current batch size: ${values.length} missing: ${values.length > this.minBatchSize ? 0 : this.minBatchSize - values.length}`) if (values.length >= this.minBatchSize) { this.logger.info(`Batch found. Processing it ...`) const result = await this.onBatch(values) if (result && this.onResult) { - await this.onResult(result, values) + await this.onResult(result) } } } catch (_err) { diff --git a/packages/relayer/src/index.ts b/packages/relayer/src/index.ts index f4925ec2..1c81eb6f 100644 --- a/packages/relayer/src/index.ts +++ b/packages/relayer/src/index.ts @@ -75,12 +75,14 @@ const batcher = new Batcher({ .toArray() }, onBatch: async (_batch: Document[]) => { - const serializedMessages = _batch.map((_val: any) => - new Message({ - id: _val.id, - ..._val.data, - }).serialize(), + const messages = _batch.map( + (_val: any) => + new Message({ + id: _val.id, + ..._val.data, + }), ) + const serializedMessages = messages.map((_message: Message) => _message.serialize()) logger.child({ service: "Relayer" }).info(`Relaying ${serializedMessages.length} messages ...`) const { request } = await client.simulateContract({ @@ -91,15 +93,21 @@ const batcher = new Batcher({ }) const transactionHash = await client.writeContract(request) logger.child({ service: "Relayer" }).info(`${serializedMessages.length} messages relayed: ${transactionHash}`) - return transactionHash + + return { + messages, + transactionHash, + } }, - onResult: (_result: any, _values: Document[]) => { + onResult: (_result: any) => { + const { messages, transactionHash } = _result as { messages: Message[]; transactionHash: string } + return Promise.all( - _values.map(({ _id }) => + messages.map(({ id }) => db.collection("relayedMessages").updateOne( - { _id }, + { id }, { - $set: { relayTransactionHash: _result, status: "relayed" }, + $set: { relayTransactionHash: transactionHash, status: "relayed" }, }, ), ), From f91388a8ec5b4292c45671245d87c21e7e82d902 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 2 May 2024 08:46:59 +0200 Subject: [PATCH 186/297] feat(executor): adds check to prevent to send messages that revert --- packages/executor/src/index.ts | 66 +++++++++++++++++++++++++--------- 1 file changed, 49 insertions(+), 17 deletions(-) diff --git a/packages/executor/src/index.ts b/packages/executor/src/index.ts index c408d419..3249e851 100644 --- a/packages/executor/src/index.ts +++ b/packages/executor/src/index.ts @@ -88,11 +88,14 @@ const batcher = new Batcher({ onGetValues: () => { return db .collection("executedMessages") - .find({ $where: "this.confirmedBy.length >= this.data.threshold && this.status == 'waitingForConfirmations'" }) + .find({ + status: "waitingForConfirmations", + $expr: { $gte: [{ $size: "$confirmedBy" }, "$threshold"] }, + }) .toArray() }, onBatch: async (_batch: Document[]) => { - const messages = [_batch[0]].map( + const messages = _batch.map( (_val: any) => new Message({ id: _val.id, @@ -117,7 +120,7 @@ const batcher = new Batcher({ .info(`Found ${messagesAlreadyExecuted.length} messages already executed. Processing them ...`) // TODO: find the transactionHash await db - .collection("messagesAlreadyExecuted") + .collection("executedMessages") .updateMany( { id: { $in: messages.map((_message: Message) => _message.id) } }, { $set: { status: "alreadyExecuted" } }, @@ -126,25 +129,54 @@ const batcher = new Batcher({ const messagesToExecute = messages.filter((_, _index) => !executed[_index]) if (messagesToExecute.length) { - logger.child({ service: "Executor" }).info(`Executing ${messagesToExecute.length} messages ...`) - const { request } = await targetClient.simulateContract({ - address: process.env.TARGET_YARU_ADDRESS as `0x${string}`, - abi: yaruAbi, - functionName: "executeMessages", - args: [messagesToExecute.map((_message: Message) => _message.serialize())], - }) - const transactionHash = await targetClient.writeContract(request) - logger.child({ service: "Executor" }).info(`${messagesToExecute.length} messages executed: ${transactionHash}`) - return transactionHash + // NOTE: need to try one by one all messages in order to filter those that cannot be executed because the receiver contract reverts + const messagesToBeExecuteWithoutRevert = [] + for (const message of messagesToExecute) { + try { + await targetClient.simulateContract({ + address: process.env.TARGET_YARU_ADDRESS as `0x${string}`, + abi: yaruAbi, + functionName: "executeMessages", + args: [[message.serialize()]], + }) + messagesToBeExecuteWithoutRevert.push(message) + } catch (_err) { + logger + .child({ service: "Executor" }) + .info(`Message ${message.id} cannot be executed because it reverts. Skipping it ...`) + } + } + + if (messagesToBeExecuteWithoutRevert.length) { + logger.child({ service: "Executor" }).info(`Executing ${messagesToBeExecuteWithoutRevert.length} messages ...`) + const { request } = await targetClient.simulateContract({ + address: process.env.TARGET_YARU_ADDRESS as `0x${string}`, + abi: yaruAbi, + functionName: "executeMessages", + args: [messagesToBeExecuteWithoutRevert.map((_message: Message) => _message.serialize())], + }) + + const transactionHash = await targetClient.writeContract({ ...request, gas: 1000000n }) + logger + .child({ service: "Executor" }) + .info(`${messagesToBeExecuteWithoutRevert.length} messages executed: ${transactionHash}`) + + return { + transactionHash, + messages: messagesToBeExecuteWithoutRevert, + } + } } }, - onResult: (_result: any, _values: Document[]) => { + onResult: (_result: any) => { + const { messages, transactionHash } = _result as { messages: Message[]; transactionHash: string } + return Promise.all( - _values.map(({ _id }) => + messages.map(({ id }) => db.collection("executedMessages").updateOne( - { _id }, + { id }, { - $set: { executeTransactionHash: _result, status: "executed" }, + $set: { executeTransactionHash: transactionHash, status: "executed" }, }, ), ), From 1efb436acfb57522ec776644493adce22079e146 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 2 May 2024 13:55:32 +0200 Subject: [PATCH 187/297] fix(executor): mv message filtering within onGetValues to not send batches with size < minBatchSize --- packages/executor/src/index.ts | 68 ++++++++++++++++------------------ 1 file changed, 32 insertions(+), 36 deletions(-) diff --git a/packages/executor/src/index.ts b/packages/executor/src/index.ts index 3249e851..55b6155d 100644 --- a/packages/executor/src/index.ts +++ b/packages/executor/src/index.ts @@ -85,17 +85,16 @@ const batcher = new Batcher({ logger, minBatchSize: Number(process.env.MIN_BATCH_SIZE as string), service: "ExecutorBatcher", - onGetValues: () => { - return db + onGetValues: async () => { + const values = await db .collection("executedMessages") .find({ status: "waitingForConfirmations", $expr: { $gte: [{ $size: "$confirmedBy" }, "$threshold"] }, }) .toArray() - }, - onBatch: async (_batch: Document[]) => { - const messages = _batch.map( + + const messages = values.map( (_val: any) => new Message({ id: _val.id, @@ -127,46 +126,43 @@ const batcher = new Batcher({ ) } - const messagesToExecute = messages.filter((_, _index) => !executed[_index]) - if (messagesToExecute.length) { - // NOTE: need to try one by one all messages in order to filter those that cannot be executed because the receiver contract reverts - const messagesToBeExecuteWithoutRevert = [] - for (const message of messagesToExecute) { - try { - await targetClient.simulateContract({ - address: process.env.TARGET_YARU_ADDRESS as `0x${string}`, - abi: yaruAbi, - functionName: "executeMessages", - args: [[message.serialize()]], - }) - messagesToBeExecuteWithoutRevert.push(message) - } catch (_err) { - logger - .child({ service: "Executor" }) - .info(`Message ${message.id} cannot be executed because it reverts. Skipping it ...`) - } - } + const messageToBeExecuted = messages.filter((_, _index) => !executed[_index]) - if (messagesToBeExecuteWithoutRevert.length) { - logger.child({ service: "Executor" }).info(`Executing ${messagesToBeExecuteWithoutRevert.length} messages ...`) - const { request } = await targetClient.simulateContract({ + // NOTE: need to try one by one all messages in order to filter those that cannot be executed because the receiver contract reverts + const messagesToBeExecuteWithoutRevert = [] + for (const message of messageToBeExecuted) { + try { + await targetClient.simulateContract({ address: process.env.TARGET_YARU_ADDRESS as `0x${string}`, abi: yaruAbi, functionName: "executeMessages", - args: [messagesToBeExecuteWithoutRevert.map((_message: Message) => _message.serialize())], + args: [[message.serialize()]], }) - - const transactionHash = await targetClient.writeContract({ ...request, gas: 1000000n }) + messagesToBeExecuteWithoutRevert.push(message) + } catch (_err) { logger .child({ service: "Executor" }) - .info(`${messagesToBeExecuteWithoutRevert.length} messages executed: ${transactionHash}`) - - return { - transactionHash, - messages: messagesToBeExecuteWithoutRevert, - } + .info(`Message ${message.id} cannot be executed because it reverts. Skipping it ...`) } } + return messagesToBeExecuteWithoutRevert + }, + onBatch: async (_messages: Message[]) => { + logger.child({ service: "Executor" }).info(`Executing ${_messages.length} messages ...`) + const { request } = await targetClient.simulateContract({ + address: process.env.TARGET_YARU_ADDRESS as `0x${string}`, + abi: yaruAbi, + functionName: "executeMessages", + args: [_messages.map((_message: Message) => _message.serialize())], + }) + + const transactionHash = await targetClient.writeContract({ ...request, gas: 1000000n }) + logger.child({ service: "Executor" }).info(`${_messages.length} messages executed: ${transactionHash}`) + + return { + transactionHash, + messages: _messages, + } }, onResult: (_result: any) => { const { messages, transactionHash } = _result as { messages: Message[]; transactionHash: string } From 5a5699e2e95f1a7faaa1b3b92f16a669dc8f48ca Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 2 May 2024 14:28:14 +0200 Subject: [PATCH 188/297] feat(executor): adds BLOCKS_WINDOW --- packages/executor/.env.example | 3 ++- packages/executor/src/index.ts | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/executor/.env.example b/packages/executor/.env.example index d975a428..e986cd9b 100644 --- a/packages/executor/.env.example +++ b/packages/executor/.env.example @@ -9,4 +9,5 @@ WATCH_INTERVAL_TIME_MS= MONGO_DB_URI= MIN_BATCH_SIZE= CREATE_BATCH_INTERVAL_TIME_MS= -ADAPTERS= \ No newline at end of file +ADAPTERS= +BLOCKS_RANGE= \ No newline at end of file diff --git a/packages/executor/src/index.ts b/packages/executor/src/index.ts index 55b6155d..398e714a 100644 --- a/packages/executor/src/index.ts +++ b/packages/executor/src/index.ts @@ -1,5 +1,5 @@ import { configDotenv } from "dotenv" -import { createWalletClient, http, Chain, publicActions, Log, Block } from "viem" +import { createWalletClient, http, Chain, publicActions, Log } from "viem" import { privateKeyToAccount } from "viem/accounts" import * as chains from "viem/chains" import { MongoClient, Document } from "mongodb" @@ -49,7 +49,7 @@ const watchers = adapters.map( args: { messageId: messageIds, }, - fromBlock: blockNumber - 99999n, + fromBlock: blockNumber - BigInt(process.env.BLOCKS_RANGE as string), toBlock: blockNumber, }) From def3b332d1b65b322d7fa097af30fd54780276ab Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 2 May 2024 14:29:58 +0200 Subject: [PATCH 189/297] refactor(relayer): rn BLOCKS_RANGE into BLOCKS_WINDOW --- packages/executor/.env.example | 2 +- packages/executor/src/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/executor/.env.example b/packages/executor/.env.example index e986cd9b..957a7188 100644 --- a/packages/executor/.env.example +++ b/packages/executor/.env.example @@ -10,4 +10,4 @@ MONGO_DB_URI= MIN_BATCH_SIZE= CREATE_BATCH_INTERVAL_TIME_MS= ADAPTERS= -BLOCKS_RANGE= \ No newline at end of file +BLOCKS_WINDOW= \ No newline at end of file diff --git a/packages/executor/src/index.ts b/packages/executor/src/index.ts index 398e714a..b5d26361 100644 --- a/packages/executor/src/index.ts +++ b/packages/executor/src/index.ts @@ -49,7 +49,7 @@ const watchers = adapters.map( args: { messageId: messageIds, }, - fromBlock: blockNumber - BigInt(process.env.BLOCKS_RANGE as string), + fromBlock: blockNumber - BigInt(process.env.BLOCKS_WINDOW as string), toBlock: blockNumber, }) From f83ea5eb151b0fe8576b86eb8ac985ef406ef169 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 2 May 2024 15:38:36 +0200 Subject: [PATCH 190/297] refactor(executor & relayer): changes how dotenv is used to support .env file loading from cmd line --- .gitignore | 1 + packages/executor/src/index.ts | 6 ++---- packages/relayer/src/index.ts | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 5e533b47..cd4390f8 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ # files *.env +*.env-* *.log .pnp.* coverage.json diff --git a/packages/executor/src/index.ts b/packages/executor/src/index.ts index b5d26361..4cafbe57 100644 --- a/packages/executor/src/index.ts +++ b/packages/executor/src/index.ts @@ -1,12 +1,10 @@ -import { configDotenv } from "dotenv" +import 'dotenv/config' import { createWalletClient, http, Chain, publicActions, Log } from "viem" import { privateKeyToAccount } from "viem/accounts" import * as chains from "viem/chains" -import { MongoClient, Document } from "mongodb" +import { MongoClient} from "mongodb" import { adapterAbi, Batcher, logger, Message, Watcher, yahoAbi, yaruAbi } from "@gnosis/hashi-common" -configDotenv() - const mongoClient = new MongoClient(process.env.MONGO_DB_URI as string) await mongoClient.connect() const db = mongoClient.db("hashi") diff --git a/packages/relayer/src/index.ts b/packages/relayer/src/index.ts index 1c81eb6f..beeb9104 100644 --- a/packages/relayer/src/index.ts +++ b/packages/relayer/src/index.ts @@ -1,4 +1,4 @@ -import { configDotenv } from "dotenv" +import 'dotenv/config' import { createWalletClient, http, Chain, publicActions, Log } from "viem" import { privateKeyToAccount } from "viem/accounts" import * as chains from "viem/chains" From 5895106438a368643c6b9fe583e2c8582ec7473c Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 2 May 2024 15:50:28 +0200 Subject: [PATCH 191/297] chore(executor & relayer): updates README files --- packages/executor/README.md | 43 +++++++++++++++++++++++++++++++++++++ packages/relayer/README.md | 43 +++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) diff --git a/packages/executor/README.md b/packages/executor/README.md index cef2a56d..977a00da 100644 --- a/packages/executor/README.md +++ b/packages/executor/README.md @@ -1 +1,44 @@ # executor + +The Executor is a service utilized to execute messages once they have achieved consensus, meaning when adapters have reached consensus on the message. + +  + +--- + +  + +## Installation +To install the Executor, follow these steps: + +```bash +git clone https://github.com/gnosis/hashi +cd hashi +nvm use +yarn install +``` + +  + +--- + +  + +## Configuration + +Before running the Executor, you need to create an `.env` file. All parameters can be found within `.env.example`. + +  + +--- + +  + +## Usage + +To start Executor, run the following command: + +``` +yarn start dotenv_config_path="your env file" +``` + diff --git a/packages/relayer/README.md b/packages/relayer/README.md index 6c83d9ff..c2f443c4 100644 --- a/packages/relayer/README.md +++ b/packages/relayer/README.md @@ -1 +1,44 @@ # relayer + +The Relayer is a service used to relay batches of dispatched messages through Yaho to the adapters. + +  + +--- + +  + +## Installation +To install the Relayer, follow these steps: + +```bash +git clone https://github.com/gnosis/hashi +cd hashi +nvm use +yarn install +``` + +  + +--- + +  + +## Configuration + +Before running the Relayer, you need to create an `.env` file. All parameters can be found within `.env.example`. + +  + +--- + +  + +## Usage + +To start Relayer, run the following command: + +``` +yarn start dotenv_config_path="your env file" +``` + From 15afa62e12d1a3fb0eb60e1f386c0d3634b676f5 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Fri, 3 May 2024 06:59:58 +0200 Subject: [PATCH 192/297] chore(executor & relayer): adds missing instruction within README --- packages/executor/README.md | 4 ++++ packages/relayer/README.md | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/packages/executor/README.md b/packages/executor/README.md index 977a00da..c9829440 100644 --- a/packages/executor/README.md +++ b/packages/executor/README.md @@ -38,7 +38,11 @@ Before running the Executor, you need to create an `.env` file. All parameters c To start Executor, run the following command: +```bash +cd packages/executor ``` + +```bash yarn start dotenv_config_path="your env file" ``` diff --git a/packages/relayer/README.md b/packages/relayer/README.md index c2f443c4..8da6e55f 100644 --- a/packages/relayer/README.md +++ b/packages/relayer/README.md @@ -38,7 +38,11 @@ Before running the Relayer, you need to create an `.env` file. All parameters ca To start Relayer, run the following command: +```bash +cd packages/relayer ``` + +```bash yarn start dotenv_config_path="your env file" ``` From d08cd0295797ba7ba5394d79f787f9cb2579255d Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 6 May 2024 06:55:41 +0200 Subject: [PATCH 193/297] refactor(hardhat.config.js): <- refactor this --- packages/evm/hardhat.config.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/evm/hardhat.config.ts b/packages/evm/hardhat.config.ts index 18fe6036..2397917f 100644 --- a/packages/evm/hardhat.config.ts +++ b/packages/evm/hardhat.config.ts @@ -76,7 +76,7 @@ const config: HardhatUserConfig = { arbitrumOne: process.env.ARBISCAN_API_KEY || "", avalanche: process.env.SNOWTRACE_API_KEY || "", bsc: process.env.BSCSCAN_API_KEY || "", - chiado: process.env.CHIADO_BLOCKSCOUT_API_KEY || "", + chiado: process.env.CHIADO_BLOCKSCOUT_API_KEY || "", gnosis: process.env.GNOSISSCAN_API_KEY || "", goerli: process.env.ETHERSCAN_API_KEY || "", mainnet: process.env.ETHERSCAN_API_KEY || "", @@ -91,10 +91,10 @@ const config: HardhatUserConfig = { chainId: 10200, urls: { apiURL: "https://gnosis-chiado.blockscout.com/api", - browserURL: "https://gnosis-chiado.blockscout.com/" - } - } - ] + browserURL: "https://gnosis-chiado.blockscout.com/", + }, + }, + ], }, gasReporter: { currency: "USD", From ead754164654a1797920bd352d50caa3ffc2d12f Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 6 May 2024 07:10:42 +0200 Subject: [PATCH 194/297] refactor(tasks): refactors l0 adpter/reporter deployment tasks --- .../evm/tasks/deploy/adapters/layerzero.ts | 79 ++++--------------- 1 file changed, 14 insertions(+), 65 deletions(-) diff --git a/packages/evm/tasks/deploy/adapters/layerzero.ts b/packages/evm/tasks/deploy/adapters/layerzero.ts index 313049b0..aed9a324 100644 --- a/packages/evm/tasks/deploy/adapters/layerzero.ts +++ b/packages/evm/tasks/deploy/adapters/layerzero.ts @@ -3,20 +3,12 @@ import { task } from "hardhat/config" import type { TaskArguments } from "hardhat/types" import type { LayerZeroAdapter } from "../../../types/contracts/adapters/LayerZero/LayerZeroAdapter" -import type { LayerZeroHeaderReporter } from "../../../types/contracts/adapters/LayerZero/LayerZeroHeaderReporter" -import type { LayerZeroMessageRelay } from "../../../types/contracts/adapters/LayerZero/LayerZeroMessageRelay" +import type { LayerZeroReporter } from "../../../types/contracts/adapters/LayerZero/LayerZeroReporter" import type { LayerZeroAdapter__factory } from "../../../types/factories/contracts/adapters/LayerZero/LayerZeroAdapter__factory" -import type { LayerZeroHeaderReporter__factory } from "../../../types/factories/contracts/adapters/LayerZero/LayerZeroHeaderReporter__factory" -import type { LayerZeroMessageRelay__factory } from "../../../types/factories/contracts/adapters/LayerZero/LayerZeroMessageRelay__factory" +import type { LayerZeroReporter__factory } from "../../../types/factories/contracts/adapters/LayerZero/LayerZeroReporter__factory" import { verify } from "../index" -task("deploy:adapter:LayerZeroAdapter") - .addParam("chainId", "chain id of the reporter contract") - .addParam( - "lzChainId", - "layerzero chain id (according to https://layerzero.gitbook.io/docs/technical-reference/mainnet/supported-chain-ids)", - ) - .addParam("reporter", "address of the reporter contract") +task("deploy:LayerZeroAdapter") .addParam("lzEndpoint", "address of the LayerZero endpoint contract") .addFlag("verify", "whether to verify the contract on Etherscan") .setAction(async function (taskArguments: TaskArguments, hre) { @@ -25,12 +17,7 @@ task("deploy:adapter:LayerZeroAdapter") const layerZeroAdapterFactory: LayerZeroAdapter__factory = ( await hre.ethers.getContractFactory("LayerZeroAdapter") ) - const constructorArguments = [ - taskArguments.chainId, - taskArguments.reporter, - taskArguments.lzEndpoint, - taskArguments.lzChainId, - ] as const + const constructorArguments = [taskArguments.lzEndpoint] as const const layerZeroAdapter: LayerZeroAdapter = ( await layerZeroAdapterFactory.connect(signers[0]).deploy(...constructorArguments) ) @@ -39,60 +26,22 @@ task("deploy:adapter:LayerZeroAdapter") if (taskArguments.verify) await verify(hre, layerZeroAdapter, constructorArguments) }) -task("deploy:adapter:LayerZeroHeaderReporter") - .addParam("chainId", "chain id of the adapter contract") - .addParam( - "lzChainId", - "layerzero chain id (according to https://layerzero.gitbook.io/docs/technical-reference/mainnet/supported-chain-ids)", - ) +task("deploy:LayerZeroReporter") .addParam("headerStorage", "address of the header storage contract") - .addParam("lzEndpoint", "address of the LayerZero endpoint contract") - .addFlag("verify", "whether to verify the contract on Etherscan") - .setAction(async function (taskArguments: TaskArguments, hre) { - console.log("Deploying LayerZeroHeaderReporter...") - const signers: SignerWithAddress[] = await hre.ethers.getSigners() - const layerZeroHeaderReporterFactory: LayerZeroHeaderReporter__factory = ( - await hre.ethers.getContractFactory("LayerZeroHeaderReporter") - ) - const constructorArguments = [ - taskArguments.headerStorage, - taskArguments.chainId, - taskArguments.lzEndpoint, - taskArguments.lzChainId, - ] as const - const layerZeroHeaderReporter: LayerZeroHeaderReporter = ( - await layerZeroHeaderReporterFactory.connect(signers[0]).deploy(...constructorArguments) - ) - await layerZeroHeaderReporter.deployed() - console.log("LayerZeroHeaderReporter deployed to:", layerZeroHeaderReporter.address) - if (taskArguments.verify) await verify(hre, layerZeroHeaderReporter, constructorArguments) - }) - -task("deploy:adapter:LayerZeroMessageRelay") - .addParam("chainId", "chain id of the adapter contract") - .addParam( - "lzChainId", - "layerzero chain id (according to https://layerzero.gitbook.io/docs/technical-reference/mainnet/supported-chain-ids)", - ) .addParam("yaho", "address of the Yaho contract") .addParam("lzEndpoint", "address of the LayerZero endpoint contract") .addFlag("verify", "whether to verify the contract on Etherscan") .setAction(async function (taskArguments: TaskArguments, hre) { - console.log("Deploying LayerZeroMessageRelay...") + console.log("Deploying LayerZeroReporter...") const signers: SignerWithAddress[] = await hre.ethers.getSigners() - const layerZeroMessageRelayFactory: LayerZeroMessageRelay__factory = ( - await hre.ethers.getContractFactory("LayerZeroMessageRelay") + const layerZeroReporterFactory: LayerZeroReporter__factory = ( + await hre.ethers.getContractFactory("LayerZeroReporter") ) - const constructorArguments = [ - taskArguments.yaho, - taskArguments.chainId, - taskArguments.lzEndpoint, - taskArguments.lzChainId, - ] as const - const layerZeroMessageRelay: LayerZeroMessageRelay = ( - await layerZeroMessageRelayFactory.connect(signers[0]).deploy(...constructorArguments) + const constructorArguments = [taskArguments.headerStorage, taskArguments.yaho, taskArguments.lzEndpoint] as const + const layerZeroReporter: LayerZeroReporter = ( + await layerZeroReporterFactory.connect(signers[0]).deploy(...constructorArguments) ) - await layerZeroMessageRelay.deployed() - console.log("LayerZeroMessageRelay deployed to:", layerZeroMessageRelay.address) - if (taskArguments.verify) await verify(hre, layerZeroMessageRelay, constructorArguments) + await layerZeroReporter.deployed() + console.log("LayerZeroReporter deployed to:", layerZeroReporter.address) + if (taskArguments.verify) await verify(hre, layerZeroReporter, constructorArguments) }) From 001adf797e71beedbf918c4999d69679795802df Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 6 May 2024 08:15:39 +0200 Subject: [PATCH 195/297] refactor(tasks): refactors sygma adpter/reporter deployment tasks --- packages/evm/tasks/deploy/adapters/sygma.ts | 71 +++++---------------- 1 file changed, 15 insertions(+), 56 deletions(-) diff --git a/packages/evm/tasks/deploy/adapters/sygma.ts b/packages/evm/tasks/deploy/adapters/sygma.ts index befe0911..c26d5f48 100644 --- a/packages/evm/tasks/deploy/adapters/sygma.ts +++ b/packages/evm/tasks/deploy/adapters/sygma.ts @@ -4,72 +4,31 @@ import type { TaskArguments } from "hardhat/types" import { verify } from ".." import type { SygmaAdapter } from "../../../types/contracts/adapters/Sygma/SygmaAdapter" -import type { SygmaHeaderReporter } from "../../../types/contracts/adapters/Sygma/SygmaHeaderReporter" -import type { SygmaMessageRelay } from "../../../types/contracts/adapters/Sygma/SygmaMessageRelay" +import type { SygmaReporter } from "../../../types/contracts/adapters/Sygma/SygmaReporter" import type { SygmaAdapter__factory } from "../../../types/factories/contracts/adapters/Sygma/SygmaAdapter__factory" -import type { SygmaHeaderReporter__factory } from "../../../types/factories/contracts/adapters/Sygma/SygmaHeaderReporter__factory" -import type { SygmaMessageRelay__factory } from "../../../types/factories/contracts/adapters/Sygma/SygmaMessageRelay__factory" +import type { SygmaReporter__factory } from "../../../types/factories/contracts/adapters/Sygma/SygmaReporter__factory" -// Deploy source chain -task("deploy:Sygma:MessageRelay") - .addParam("bridge", "address of the Sygma contract", undefined, types.string) - .addParam("yaho", "address of the yaho contract", undefined, types.string) - .addParam("resourceId", "sygma resource id", undefined, types.string) - .addParam("defaultDestinationDomainId", "sygma default destination domain id", undefined, types.string) - .addParam("defaultSygmaAdapter", "adapter", undefined, types.string) - .addFlag("verify", "whether to verify the contract on Etherscan") - .setAction(async function (taskArguments: TaskArguments, hre) { - console.log("Deploying SygmaMessageRelay...") - const signers: SignerWithAddress[] = await hre.ethers.getSigners() - const sygmaMessageRelayFactory: SygmaMessageRelay__factory = ( - await hre.ethers.getContractFactory("SygmaMessageRelay") - ) - const constructorArguments = [ - taskArguments.bridge, - taskArguments.yaho, - taskArguments.resourceId, - taskArguments.defaultDestinationDomainId, - taskArguments.defaultSygmaAdapter, - ] as const - const sygmaMessageRelay: SygmaMessageRelay = ( - await sygmaMessageRelayFactory.connect(signers[0]).deploy(...constructorArguments) - ) - await sygmaMessageRelay.deployed() - console.log("SygmaMessageRelay deployed to:", sygmaMessageRelay.address) - if (taskArguments.verify) await verify(hre, sygmaMessageRelay, constructorArguments) - }) - -// Deploy source chain -task("deploy:Sygma:HeaderReporter") - .addParam("bridge", "address of the Sygma contract", undefined, types.string) +task("deploy:SygmaReporter") .addParam("headerStorage", "address of the HeaderStorage contract", undefined, types.string) - .addParam("resourceId", "sygma resource id", undefined, types.string) - .addParam("defaultDestinationDomainId", "sygma default destination domain id", undefined, types.string) - .addParam("defaultSygmaAdapter", "adapter", undefined, types.string) + .addParam("yaho", "address of the Yaho contract", undefined, types.string) + .addParam("bridge", "address of the Sygma contract", undefined, types.string) .addFlag("verify", "whether to verify the contract on Etherscan") .setAction(async function (taskArguments: TaskArguments, hre) { - console.log("Deploying SygmaHeaderReporter...") + console.log("Deploying SygmaReporter...") const signers: SignerWithAddress[] = await hre.ethers.getSigners() - const sygmaHeaderReporterFactory: SygmaHeaderReporter__factory = ( - await hre.ethers.getContractFactory("SygmaHeaderReporter") + const sygmaReporterFactory: SygmaReporter__factory = ( + await hre.ethers.getContractFactory("SygmaReporter") ) - const constructorArguments = [ - taskArguments.bridge, - taskArguments.headerStorage, - taskArguments.resourceId, - taskArguments.defaultDestinationDomainId, - taskArguments.defaultSygmaAdapter, - ] as const - const sygmaHeaderReporter: SygmaHeaderReporter = ( - await sygmaHeaderReporterFactory.connect(signers[0]).deploy(...constructorArguments) + const constructorArguments = [taskArguments.headerStorage, taskArguments.yaho, taskArguments.bridge] as const + const sygmaReporter: SygmaReporter = ( + await sygmaReporterFactory.connect(signers[0]).deploy(...constructorArguments) ) - await sygmaHeaderReporter.deployed() - console.log("SygmaHeaderReporter deployed to:", sygmaHeaderReporter.address) - if (taskArguments.verify) await verify(hre, sygmaHeaderReporter, constructorArguments) + await sygmaReporter.deployed() + console.log("SygmaReporter deployed to:", sygmaReporter.address) + if (taskArguments.verify) await verify(hre, sygmaReporter, constructorArguments) }) -// Deploy on destination chain -task("deploy:Sygma:Adapter") +task("deploy:SygmaAdapter") .addParam("handler", "address of the Sygma handler contract", undefined, types.string) .addFlag("verify", "whether to verify the contract on Etherscan") .setAction(async function (taskArguments: TaskArguments, hre) { From 5078066761cc33e5ac84f2046a67cf4555e844b9 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 6 May 2024 08:35:06 +0200 Subject: [PATCH 196/297] fix(relayer): rm configDotenv --- packages/relayer/src/index.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/relayer/src/index.ts b/packages/relayer/src/index.ts index beeb9104..91384f3d 100644 --- a/packages/relayer/src/index.ts +++ b/packages/relayer/src/index.ts @@ -5,8 +5,6 @@ import * as chains from "viem/chains" import { MongoClient, Document } from "mongodb" import { Batcher, logger, Message, Watcher, yahoAbi } from "@gnosis/hashi-common" -configDotenv() - const chain = Object.values(chains).find(({ id }) => id.toString() === (process.env.CHAIN_ID as string)) if (!chain) throw new Error("Invalid CHAIN_ID") From 1e146b09908b7b678fabc46f12622ce94067eeba Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 6 May 2024 08:53:05 +0200 Subject: [PATCH 197/297] feat(contracts): adds fee within LayerZeroReporter --- .../contracts/adapters/LayerZero/LayerZeroReporter.sol | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/evm/contracts/adapters/LayerZero/LayerZeroReporter.sol b/packages/evm/contracts/adapters/LayerZero/LayerZeroReporter.sol index 7ce99098..fc87b8af 100644 --- a/packages/evm/contracts/adapters/LayerZero/LayerZeroReporter.sol +++ b/packages/evm/contracts/adapters/LayerZero/LayerZeroReporter.sol @@ -10,10 +10,12 @@ contract LayerZeroReporter is Reporter, Ownable { ILayerZeroEndpoint public immutable LAYER_ZERO_ENDPOINT; mapping(uint256 => uint16) public endpointIds; + uint256 public fee; error EndpointIdNotAvailable(); event EndpointIdSet(uint256 indexed chainId, uint16 indexed endpointId); + event FeeSet(uint256 fee); constructor(address headerStorage, address yaho, address lzEndpoint) Reporter(headerStorage, yaho) { LAYER_ZERO_ENDPOINT = ILayerZeroEndpoint(lzEndpoint); @@ -24,6 +26,11 @@ contract LayerZeroReporter is Reporter, Ownable { emit EndpointIdSet(chainId, endpointId); } + function setFee(uint256 fee_) external onlyOwner { + fee = fee_; + emit FeeSet(fee); + } + function _dispatch( uint256 targetChainId, address adapter, @@ -35,7 +42,7 @@ contract LayerZeroReporter is Reporter, Ownable { bytes memory payload = abi.encode(ids, hashes); bytes memory path = abi.encodePacked(adapter, address(this)); // solhint-disable-next-line check-send-result - LAYER_ZERO_ENDPOINT.send{ value: msg.value }( + LAYER_ZERO_ENDPOINT.send{ value: fee }( targetEndpointId, path, payload, From 633a44e60b6c90a1599f6c21a847b4ca88f7f7d6 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 7 May 2024 09:58:28 +0200 Subject: [PATCH 198/297] feat(relayer): adds possibility to filter messages based on msg.sender --- packages/relayer/.env.example | 3 ++- packages/relayer/README.md | 2 +- packages/relayer/src/index.ts | 18 ++++++++++-------- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/packages/relayer/.env.example b/packages/relayer/.env.example index ca604070..5f80c130 100644 --- a/packages/relayer/.env.example +++ b/packages/relayer/.env.example @@ -4,4 +4,5 @@ RPC= PK= WATCH_INTERVAL_TIME_MS= MONGO_DB_URI= -MIN_BATCH_SIZE= \ No newline at end of file +MIN_BATCH_SIZE= +WHITELISTED_SENDER_ADDRESSES= \ No newline at end of file diff --git a/packages/relayer/README.md b/packages/relayer/README.md index 8da6e55f..da4019d1 100644 --- a/packages/relayer/README.md +++ b/packages/relayer/README.md @@ -9,6 +9,7 @@ The Relayer is a service used to relay batches of dispatched messages through Ya   ## Installation + To install the Relayer, follow these steps: ```bash @@ -45,4 +46,3 @@ cd packages/relayer ```bash yarn start dotenv_config_path="your env file" ``` - diff --git a/packages/relayer/src/index.ts b/packages/relayer/src/index.ts index 91384f3d..e3fa920d 100644 --- a/packages/relayer/src/index.ts +++ b/packages/relayer/src/index.ts @@ -1,4 +1,4 @@ -import 'dotenv/config' +import "dotenv/config" import { createWalletClient, http, Chain, publicActions, Log } from "viem" import { privateKeyToAccount } from "viem/accounts" import * as chains from "viem/chains" @@ -18,6 +18,10 @@ const mongoClient = new MongoClient(process.env.MONGO_DB_URI as string) await mongoClient.connect() const db = mongoClient.db("hashi") +const whitelistedSenderAddresses = process.env.WHITELISTED_SENDER_ADDRESSES?.split(",").map((_address: string) => + _address.toLowerCase(), +) as string[] + const watcher = new Watcher({ service: "RelayerWatcher", logger, @@ -27,13 +31,11 @@ const watcher = new Watcher({ eventName: "MessageDispatched", watchIntervalTimeMs: Number(process.env.WATCH_INTERVAL_TIME_MS as string), onLogs: async (_logs: Log[]) => { - // TODO: filter messages that you don't want to relay. For example it could be possible - // to relayMessagesToAdapters only those coming from specific message.sender - - /*const blocks = (await Promise.all( - _logs.map((_log: Log) => client.getBlock({ blockHash: _log.blockHash as `0x${string}` })), - )) as Block[]*/ - const messages = _logs.map((_log: Log) => Message.fromLog(_log)) + let messages = _logs.map((_log: Log) => Message.fromLog(_log)) + if (whitelistedSenderAddresses.length) { + logger.child({ service: "Relayer" }).info(`Filtering messages ...`) + messages = messages.filter((_message) => whitelistedSenderAddresses.includes(_message.sender.toLowerCase())) + } await Promise.all( messages.map((_message: Message, _index: number) => From f6cf9ea070939ad99a1178dcc6af328434324284 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 7 May 2024 10:36:55 +0200 Subject: [PATCH 199/297] fix(executor): adds chainId within executedMessage selection --- packages/executor/src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/executor/src/index.ts b/packages/executor/src/index.ts index 4cafbe57..d5217b3a 100644 --- a/packages/executor/src/index.ts +++ b/packages/executor/src/index.ts @@ -87,6 +87,7 @@ const batcher = new Batcher({ const values = await db .collection("executedMessages") .find({ + chainId: targetClient?.chain?.id as number, status: "waitingForConfirmations", $expr: { $gte: [{ $size: "$confirmedBy" }, "$threshold"] }, }) From d3070ec5e2cb2d80dfab0a6654b781de892c0081 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 7 May 2024 10:37:31 +0200 Subject: [PATCH 200/297] fix(relayer): adds ? to prevent crashing when whitelistedSenderAddresses is undefined --- packages/relayer/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/relayer/src/index.ts b/packages/relayer/src/index.ts index e3fa920d..e293375b 100644 --- a/packages/relayer/src/index.ts +++ b/packages/relayer/src/index.ts @@ -32,7 +32,7 @@ const watcher = new Watcher({ watchIntervalTimeMs: Number(process.env.WATCH_INTERVAL_TIME_MS as string), onLogs: async (_logs: Log[]) => { let messages = _logs.map((_log: Log) => Message.fromLog(_log)) - if (whitelistedSenderAddresses.length) { + if (whitelistedSenderAddresses?.length) { logger.child({ service: "Relayer" }).info(`Filtering messages ...`) messages = messages.filter((_message) => whitelistedSenderAddresses.includes(_message.sender.toLowerCase())) } From 4df20f54b3ca14462bec2e36f64ff2c5b5a6a1aa Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 9 May 2024 14:41:55 +0200 Subject: [PATCH 201/297] feat(evm): creates debridge reporter & adapter --- .../adapters/DeBridge/DeBridgeAdapter.sol | 40 +++ .../adapters/DeBridge/DeBridgeReporter.sol | 38 +++ .../DeBridge/interfaces/ICallProxy.sol | 44 ++++ .../DeBridge/interfaces/IDeBridgeGate.sol | 242 ++++++++++++++++++ 4 files changed, 364 insertions(+) create mode 100644 packages/evm/contracts/adapters/DeBridge/DeBridgeAdapter.sol create mode 100644 packages/evm/contracts/adapters/DeBridge/DeBridgeReporter.sol create mode 100644 packages/evm/contracts/adapters/DeBridge/interfaces/ICallProxy.sol create mode 100644 packages/evm/contracts/adapters/DeBridge/interfaces/IDeBridgeGate.sol diff --git a/packages/evm/contracts/adapters/DeBridge/DeBridgeAdapter.sol b/packages/evm/contracts/adapters/DeBridge/DeBridgeAdapter.sol new file mode 100644 index 00000000..bf298ed5 --- /dev/null +++ b/packages/evm/contracts/adapters/DeBridge/DeBridgeAdapter.sol @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity ^0.8.20; + +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; +import { BlockHashAdapter } from "../BlockHashAdapter.sol"; +import { IDeBridgeGate } from "./interfaces/IDeBridgeGate.sol"; +import { ICallProxy } from "./interfaces/ICallProxy.sol"; + +contract DeBridgeAdapter is BlockHashAdapter, Ownable { + string public constant PROVIDER = "debridge"; + + IDeBridgeGate public immutable deBridgeGate; + + mapping(uint256 => address) public enabledReporters; + + error NotProxy(); + error UnauthorizedSender(address sender, uint256 chainId); + + event ReporterSet(uint256 indexed chainId, address indexed reporter); + + constructor(address _deBridgeGate) { + deBridgeGate = IDeBridgeGate(_deBridgeGate); + } + + function setReporterByChainId(uint256 chainId, address reporter) external onlyOwner { + enabledReporters[chainId] = reporter; + emit ReporterSet(chainId, reporter); + } + + function storeHashes(uint256[] calldata ids, bytes32[] calldata hashes) external { + ICallProxy callProxy = ICallProxy(deBridgeGate.callProxy()); + if (address(callProxy) != msg.sender) revert NotProxy(); + + address sender = address(uint160(bytes20(callProxy.submissionNativeSender()))); + uint256 chainId = callProxy.submissionChainIdFrom(); + if (enabledReporters[chainId] != sender) revert UnauthorizedSender(sender, chainId); + + _storeHashes(chainId, ids, hashes); + } +} diff --git a/packages/evm/contracts/adapters/DeBridge/DeBridgeReporter.sol b/packages/evm/contracts/adapters/DeBridge/DeBridgeReporter.sol new file mode 100644 index 00000000..fa25dca7 --- /dev/null +++ b/packages/evm/contracts/adapters/DeBridge/DeBridgeReporter.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity ^0.8.20; + +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; +import { Reporter } from "../Reporter.sol"; +import { IDeBridgeGate } from "./interfaces/IDeBridgeGate.sol"; + +contract DeBridgeReporter is Reporter, Ownable { + string public constant PROVIDER = "debridge"; + + IDeBridgeGate public immutable deBridgeGate; + uint256 fee; + + event FeeSet(uint256 fee); + + constructor(address headerStorage, address yaho, address _deBridgeGate) Reporter(headerStorage, yaho) { + deBridgeGate = IDeBridgeGate(_deBridgeGate); + } + + function setFee(uint256 fee_) external onlyOwner { + fee = fee_; + emit FeeSet(fee); + } + + function _dispatch( + uint256 targetChainId, + address adapter, + uint256[] memory ids, + bytes32[] memory hashes + ) internal override returns (bytes32) { + bytes32 submissionId = deBridgeGate.sendMessage{ value: fee }( + targetChainId, + abi.encodePacked(adapter), + abi.encodeWithSignature("storeHashes(uint256[],bytes32[])", ids, hashes) + ); + return submissionId; + } +} diff --git a/packages/evm/contracts/adapters/DeBridge/interfaces/ICallProxy.sol b/packages/evm/contracts/adapters/DeBridge/interfaces/ICallProxy.sol new file mode 100644 index 00000000..5ada62d0 --- /dev/null +++ b/packages/evm/contracts/adapters/DeBridge/interfaces/ICallProxy.sol @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.7; + +interface ICallProxy { + /// @dev Chain from which the current submission is received + function submissionChainIdFrom() external view returns (uint256); + + /// @dev Native sender of the current submission + function submissionNativeSender() external view returns (bytes memory); + + /// @dev Used for calls where native asset transfer is involved. + /// @param _reserveAddress Receiver of the tokens if the call to _receiver fails + /// @param _receiver Contract to be called + /// @param _data Call data + /// @param _flags Flags to change certain behavior of this function, see Flags library for more details + /// @param _nativeSender Native sender + /// @param _chainIdFrom Id of a chain that originated the request + function call( + address _reserveAddress, + address _receiver, + bytes memory _data, + uint256 _flags, + bytes memory _nativeSender, + uint256 _chainIdFrom + ) external payable returns (bool); + + /// @dev Used for calls where ERC20 transfer is involved. + /// @param _token Asset address + /// @param _reserveAddress Receiver of the tokens if the call to _receiver fails + /// @param _receiver Contract to be called + /// @param _data Call data + /// @param _flags Flags to change certain behavior of this function, see Flags library for more details + /// @param _nativeSender Native sender + /// @param _chainIdFrom Id of a chain that originated the request + function callERC20( + address _token, + address _reserveAddress, + address _receiver, + bytes memory _data, + uint256 _flags, + bytes memory _nativeSender, + uint256 _chainIdFrom + ) external returns (bool); +} diff --git a/packages/evm/contracts/adapters/DeBridge/interfaces/IDeBridgeGate.sol b/packages/evm/contracts/adapters/DeBridge/interfaces/IDeBridgeGate.sol new file mode 100644 index 00000000..8cc2883f --- /dev/null +++ b/packages/evm/contracts/adapters/DeBridge/interfaces/IDeBridgeGate.sol @@ -0,0 +1,242 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.7; + +interface IDeBridgeGate { + /* ========== STRUCTS ========== */ + + struct TokenInfo { + uint256 nativeChainId; + bytes nativeAddress; + } + + struct DebridgeInfo { + uint256 chainId; // native chain id + uint256 maxAmount; // maximum amount to transfer + uint256 balance; // total locked assets + uint256 lockedInStrategies; // total locked assets in strategy (AAVE, Compound, etc) + address tokenAddress; // asset address on the current chain + uint16 minReservesBps; // minimal hot reserves in basis points (1/10000) + bool exist; + } + + struct DebridgeFeeInfo { + uint256 collectedFees; // total collected fees + uint256 withdrawnFees; // fees that already withdrawn + mapping(uint256 => uint256) getChainFee; // whether the chain for the asset is supported + } + + struct ChainSupportInfo { + uint256 fixedNativeFee; // transfer fixed fee + bool isSupported; // whether the chain for the asset is supported + uint16 transferFeeBps; // transfer fee rate nominated in basis points (1/10000) of transferred amount + } + + struct DiscountInfo { + uint16 discountFixBps; // fix discount in BPS + uint16 discountTransferBps; // transfer % discount in BPS + } + + /// @param executionFee Fee paid to the transaction executor. + /// @param fallbackAddress Receiver of the tokens if the call fails. + struct SubmissionAutoParamsTo { + uint256 executionFee; + uint256 flags; + bytes fallbackAddress; + bytes data; + } + + /// @param executionFee Fee paid to the transaction executor. + /// @param fallbackAddress Receiver of the tokens if the call fails. + struct SubmissionAutoParamsFrom { + uint256 executionFee; + uint256 flags; + address fallbackAddress; + bytes data; + bytes nativeSender; + } + + struct FeeParams { + uint256 receivedAmount; + uint256 fixFee; + uint256 transferFee; + bool useAssetFee; + bool isNativeToken; + } + + /* ========== PUBLIC VARS GETTERS ========== */ + + /// @dev Returns whether the transfer with the submissionId was claimed. + /// submissionId is generated in getSubmissionIdFrom + function isSubmissionUsed(bytes32 submissionId) external view returns (bool); + + /// @dev Returns native token info by wrapped token address + function getNativeInfo(address token) external view returns (uint256 nativeChainId, bytes memory nativeAddress); + + /// @dev Returns address of the proxy to execute user's calls. + function callProxy() external view returns (address); + + /// @dev Fallback fixed fee in native asset, used if a chain fixed fee is set to 0 + function globalFixedNativeFee() external view returns (uint256); + + /// @dev Fallback transfer fee in BPS, used if a chain transfer fee is set to 0 + function globalTransferFeeBps() external view returns (uint16); + + /* ========== FUNCTIONS ========== */ + + /// @dev Submits the message to the deBridge infrastructure to be broadcasted to another supported blockchain (identified by _dstChainId) + /// with the instructions to call the _targetContractAddress contract using the given _targetContractCalldata + /// @notice NO ASSETS ARE BROADCASTED ALONG WITH THIS MESSAGE + /// @notice DeBridgeGate only accepts submissions with msg.value (native ether) covering a small protocol fee + /// (defined in the globalFixedNativeFee property). Any excess amount of ether passed to this function is + /// included in the message as the execution fee - the amount deBridgeGate would give as an incentive to + /// a third party in return for successful claim transaction execution on the destination chain. + /// @notice DeBridgeGate accepts a set of flags that control the behaviour of the execution. This simple method + /// sets the default set of flags: REVERT_IF_EXTERNAL_FAIL, PROXY_WITH_SENDER + /// @param _dstChainId ID of the destination chain. + /// @param _targetContractAddress A contract address to be called on the destination chain + /// @param _targetContractCalldata Calldata to execute against the target contract on the destination chain + function sendMessage( + uint256 _dstChainId, + bytes memory _targetContractAddress, + bytes memory _targetContractCalldata + ) external payable returns (bytes32 submissionId); + + /// @dev Submits the message to the deBridge infrastructure to be broadcasted to another supported blockchain (identified by _dstChainId) + /// with the instructions to call the _targetContractAddress contract using the given _targetContractCalldata + /// @notice NO ASSETS ARE BROADCASTED ALONG WITH THIS MESSAGE + /// @notice DeBridgeGate only accepts submissions with msg.value (native ether) covering a small protocol fee + /// (defined in the globalFixedNativeFee property). Any excess amount of ether passed to this function is + /// included in the message as the execution fee - the amount deBridgeGate would give as an incentive to + /// a third party in return for successful claim transaction execution on the destination chain. + /// @notice DeBridgeGate accepts a set of flags that control the behaviour of the execution. This simple method + /// sets the default set of flags: REVERT_IF_EXTERNAL_FAIL, PROXY_WITH_SENDER + /// @param _dstChainId ID of the destination chain. + /// @param _targetContractAddress A contract address to be called on the destination chain + /// @param _targetContractCalldata Calldata to execute against the target contract on the destination chain + /// @param _flags A bitmask of toggles listed in the Flags library + /// @param _referralCode Referral code to identify this submission + function sendMessage( + uint256 _dstChainId, + bytes memory _targetContractAddress, + bytes memory _targetContractCalldata, + uint256 _flags, + uint32 _referralCode + ) external payable returns (bytes32 submissionId); + + /// @dev This method is used for the transfer of assets [from the native chain](https://docs.debridge.finance/the-core-protocol/transfers#transfer-from-native-chain). + /// It locks an asset in the smart contract in the native chain and enables minting of deAsset on the secondary chain. + /// @param _tokenAddress Asset identifier. + /// @param _amount Amount to be transferred (note: the fee can be applied). + /// @param _chainIdTo Chain id of the target chain. + /// @param _receiver Receiver address. + /// @param _permitEnvelope Permit for approving the spender by signature. bytes (amount + deadline + signature) + /// @param _useAssetFee use assets fee for pay protocol fix (work only for specials token) + /// @param _referralCode Referral code + /// @param _autoParams Auto params for external call in target network + function send( + address _tokenAddress, + uint256 _amount, + uint256 _chainIdTo, + bytes memory _receiver, + bytes memory _permitEnvelope, + bool _useAssetFee, + uint32 _referralCode, + bytes calldata _autoParams + ) external payable returns (bytes32 submissionId); + + /// @dev Is used for transfers [into the native chain](https://docs.debridge.finance/the-core-protocol/transfers#transfer-from-secondary-chain-to-native-chain) + /// to unlock the designated amount of asset from collateral and transfer it to the receiver. + /// @param _debridgeId Asset identifier. + /// @param _amount Amount of the transferred asset (note: the fee can be applied). + /// @param _chainIdFrom Chain where submission was sent + /// @param _receiver Receiver address. + /// @param _nonce Submission id. + /// @param _signatures Validators signatures to confirm + /// @param _autoParams Auto params for external call + function claim( + bytes32 _debridgeId, + uint256 _amount, + uint256 _chainIdFrom, + address _receiver, + uint256 _nonce, + bytes calldata _signatures, + bytes calldata _autoParams + ) external; + + /// @dev Withdraw collected fees to feeProxy + /// @param _debridgeId Asset identifier. + function withdrawFee(bytes32 _debridgeId) external; + + /// @dev Returns asset fixed fee value for specified debridge and chainId. + /// @param _debridgeId Asset identifier. + /// @param _chainId Chain id. + function getDebridgeChainAssetFixedFee(bytes32 _debridgeId, uint256 _chainId) external view returns (uint256); + + /* ========== EVENTS ========== */ + + /// @dev Emitted once the tokens are sent from the original(native) chain to the other chain; the transfer tokens + /// are expected to be claimed by the users. + event Sent( + bytes32 submissionId, + bytes32 indexed debridgeId, + uint256 amount, + bytes receiver, + uint256 nonce, + uint256 indexed chainIdTo, + uint32 referralCode, + FeeParams feeParams, + bytes autoParams, + address nativeSender + // bool isNativeToken //added to feeParams + ); + + /// @dev Emitted once the tokens are transferred and withdrawn on a target chain + event Claimed( + bytes32 submissionId, + bytes32 indexed debridgeId, + uint256 amount, + address indexed receiver, + uint256 nonce, + uint256 indexed chainIdFrom, + bytes autoParams, + bool isNativeToken + ); + + /// @dev Emitted when new asset support is added. + event PairAdded( + bytes32 debridgeId, + address tokenAddress, + bytes nativeAddress, + uint256 indexed nativeChainId, + uint256 maxAmount, + uint16 minReservesBps + ); + + event MonitoringSendEvent(bytes32 submissionId, uint256 nonce, uint256 lockedOrMintedAmount, uint256 totalSupply); + + event MonitoringClaimEvent(bytes32 submissionId, uint256 lockedOrMintedAmount, uint256 totalSupply); + + /// @dev Emitted when the asset is allowed/disallowed to be transferred to the chain. + event ChainSupportUpdated(uint256 chainId, bool isSupported, bool isChainFrom); + /// @dev Emitted when the supported chains are updated. + event ChainsSupportUpdated(uint256 chainIds, ChainSupportInfo chainSupportInfo, bool isChainFrom); + + /// @dev Emitted when the new call proxy is set. + event CallProxyUpdated(address callProxy); + /// @dev Emitted when the transfer request is executed. + event AutoRequestExecuted(bytes32 submissionId, bool indexed success, address callProxy); + + /// @dev Emitted when a submission is blocked. + event Blocked(bytes32 submissionId); + /// @dev Emitted when a submission is unblocked. + event Unblocked(bytes32 submissionId); + + /// @dev Emitted when fee is withdrawn. + event WithdrawnFee(bytes32 debridgeId, uint256 fee); + + /// @dev Emitted when globalFixedNativeFee and globalTransferFeeBps are updated. + event FixedNativeFeeUpdated(uint256 globalFixedNativeFee, uint256 globalTransferFeeBps); + + /// @dev Emitted when globalFixedNativeFee is updated by feeContractUpdater + event FixedNativeFeeAutoUpdated(uint256 globalFixedNativeFee); +} From ccc83d1be1ae5250e0c1d2d269f235fcbca8a266 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 9 May 2024 14:46:20 +0200 Subject: [PATCH 202/297] refactor(evm): rn _deBridgeGate into deBridgeGate_ --- packages/evm/contracts/adapters/DeBridge/DeBridgeReporter.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/evm/contracts/adapters/DeBridge/DeBridgeReporter.sol b/packages/evm/contracts/adapters/DeBridge/DeBridgeReporter.sol index fa25dca7..42c383de 100644 --- a/packages/evm/contracts/adapters/DeBridge/DeBridgeReporter.sol +++ b/packages/evm/contracts/adapters/DeBridge/DeBridgeReporter.sol @@ -13,8 +13,8 @@ contract DeBridgeReporter is Reporter, Ownable { event FeeSet(uint256 fee); - constructor(address headerStorage, address yaho, address _deBridgeGate) Reporter(headerStorage, yaho) { - deBridgeGate = IDeBridgeGate(_deBridgeGate); + constructor(address headerStorage, address yaho, address deBridgeGate_) Reporter(headerStorage, yaho) { + deBridgeGate = IDeBridgeGate(deBridgeGate_); } function setFee(uint256 fee_) external onlyOwner { From 2380b6bc44bac7d245c22fc1663a4959a64b0b23 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 9 May 2024 14:47:10 +0200 Subject: [PATCH 203/297] feat(evm): adds debridge reporter & adapter deployment tasks --- .../evm/tasks/deploy/adapters/debridge.ts | 47 +++++++++++++++++++ packages/evm/tasks/deploy/adapters/index.ts | 1 + 2 files changed, 48 insertions(+) create mode 100644 packages/evm/tasks/deploy/adapters/debridge.ts diff --git a/packages/evm/tasks/deploy/adapters/debridge.ts b/packages/evm/tasks/deploy/adapters/debridge.ts new file mode 100644 index 00000000..20122a66 --- /dev/null +++ b/packages/evm/tasks/deploy/adapters/debridge.ts @@ -0,0 +1,47 @@ +import type { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers" +import { task } from "hardhat/config" +import type { TaskArguments } from "hardhat/types" + +import type { DeBridgeAdapter } from "../../../types/contracts/adapters/DeBridge/DeBridgeAdapter" +import type { DeBridgeReporter } from "../../../types/contracts/adapters/DeBridge/DeBridgeReporter" +import type { DeBridgeAdapter__factory } from "../../../types/factories/contracts/adapters/DeBridge/DeBridgeAdapter__factory" +import type { DeBridgeReporter__factory } from "../../../types/factories/contracts/adapters/DeBridge/DeBridgeReporter__factory" +import { verify } from "../index" + +task("deploy:DeBridgeAdapter") + .addParam("deBridgeGate", "address of the DeBridge gate contract") + .addFlag("verify", "whether to verify the contract on Etherscan") + .setAction(async function (taskArguments: TaskArguments, hre) { + console.log("Deploying DeBridgeAdapter...") + const signers: SignerWithAddress[] = await hre.ethers.getSigners() + const deBridgeAdapterFactory: DeBridgeAdapter__factory = ( + await hre.ethers.getContractFactory("DeBridgeAdapter") + ) + const constructorArguments = [taskArguments.deBridgeGate] as const + const deBridgeAdapter: DeBridgeAdapter = ( + await deBridgeAdapterFactory.connect(signers[0]).deploy(...constructorArguments) + ) + await deBridgeAdapter.deployed() + console.log("DeBridgeAdapter deployed to:", deBridgeAdapter.address) + if (taskArguments.verify) await verify(hre, deBridgeAdapter, constructorArguments) + }) + +task("deploy:DeBridgeReporter") + .addParam("headerStorage", "address of the header storage contract") + .addParam("yaho", "address of the Yaho contract") + .addParam("deBridgeGate", "address of the DeBridge gate contract") + .addFlag("verify", "whether to verify the contract on Etherscan") + .setAction(async function (taskArguments: TaskArguments, hre) { + console.log("Deploying DeBridgeReporter...") + const signers: SignerWithAddress[] = await hre.ethers.getSigners() + const deBridgeReporterFactory: DeBridgeReporter__factory = ( + await hre.ethers.getContractFactory("DeBridgeReporter") + ) + const constructorArguments = [taskArguments.headerStorage, taskArguments.yaho, taskArguments.deBridgeGate] as const + const deBridgeReporter: DeBridgeReporter = ( + await deBridgeReporterFactory.connect(signers[0]).deploy(...constructorArguments) + ) + await deBridgeReporter.deployed() + console.log("DeBridgeReporter deployed to:", deBridgeReporter.address) + if (taskArguments.verify) await verify(hre, deBridgeReporter, constructorArguments) + }) diff --git a/packages/evm/tasks/deploy/adapters/index.ts b/packages/evm/tasks/deploy/adapters/index.ts index c6130790..fd14dcb2 100644 --- a/packages/evm/tasks/deploy/adapters/index.ts +++ b/packages/evm/tasks/deploy/adapters/index.ts @@ -4,6 +4,7 @@ import "./axiom" import "./ccip" import "./celer" import "./connext" +import "./debridge" import "./dendreth" import "./electron" import "./hyperlane" From e2f46eb2b8133add47badee9bdcffa380ab5e392 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 14 May 2024 12:15:23 +0200 Subject: [PATCH 204/297] feat(evm): adds fee within CCIPReporter --- .../evm/contracts/adapters/Chainlink/CCIPReporter.sol | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/evm/contracts/adapters/Chainlink/CCIPReporter.sol b/packages/evm/contracts/adapters/Chainlink/CCIPReporter.sol index 685913f5..e56b9b01 100644 --- a/packages/evm/contracts/adapters/Chainlink/CCIPReporter.sol +++ b/packages/evm/contracts/adapters/Chainlink/CCIPReporter.sol @@ -11,11 +11,13 @@ contract CCIPReporter is Reporter, Ownable { IRouterClient public immutable CCIP_ROUTER; + uint256 public fee; mapping(uint256 => uint64) public chainSelectors; error ChainSelectorNotAvailable(); event ChainSelectorSet(uint256 indexed chainId, uint64 indexed chainSelector); + event FeeSet(uint256 fee); constructor(address headerStorage, address yaho, address ccipRouter) Reporter(headerStorage, yaho) { CCIP_ROUTER = IRouterClient(ccipRouter); @@ -26,6 +28,11 @@ contract CCIPReporter is Reporter, Ownable { emit ChainSelectorSet(chainId, chainSelector); } + function setFee(uint256 fee_) external onlyOwner { + fee = fee_; + emit FeeSet(fee_); + } + function _dispatch( uint256 targetChainId, address adapter, @@ -42,7 +49,7 @@ contract CCIPReporter is Reporter, Ownable { extraArgs: Client._argsToBytes(Client.EVMExtraArgsV1({ gasLimit: 200_000, strict: false })), feeToken: address(0) // Pay fees with native }); - CCIP_ROUTER.ccipSend{ value: msg.value }(targetChainSelector, message); + CCIP_ROUTER.ccipSend{ value: fee }(targetChainSelector, message); return bytes32(0); } } From 6f5bf9e15e37901965c169e40a7ef907f9019eca Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 16 May 2024 18:15:04 +0200 Subject: [PATCH 205/297] feat(common & relayer): adds check to prevent relaying messages already relayed --- packages/common/src/Batcher.ts | 8 ++++-- packages/relayer/src/index.ts | 50 ++++++++++++++++++++++++++-------- 2 files changed, 43 insertions(+), 15 deletions(-) diff --git a/packages/common/src/Batcher.ts b/packages/common/src/Batcher.ts index e2317b5d..df766033 100644 --- a/packages/common/src/Batcher.ts +++ b/packages/common/src/Batcher.ts @@ -6,8 +6,8 @@ interface BatcherConfigs { minBatchSize: number createBatchIntervalTimeMs: number onBatch: (batch: any[]) => Promise - onGetValues: () => Promise - onResult?: (result: any) => Promise + onGetValues: () => Promise + onResult?: (result: any) => Promise } class Batcher { @@ -39,7 +39,9 @@ class Batcher { private async _createBatch() { try { const values = await this.onGetValues() - this.logger.info(`Current batch size: ${values.length} missing: ${values.length > this.minBatchSize ? 0 : this.minBatchSize - values.length}`) + this.logger.info( + `Current batch size: ${values.length} missing: ${values.length > this.minBatchSize ? 0 : this.minBatchSize - values.length}`, + ) if (values.length >= this.minBatchSize) { this.logger.info(`Batch found. Processing it ...`) const result = await this.onBatch(values) diff --git a/packages/relayer/src/index.ts b/packages/relayer/src/index.ts index e293375b..e9cf5938 100644 --- a/packages/relayer/src/index.ts +++ b/packages/relayer/src/index.ts @@ -82,25 +82,51 @@ const batcher = new Batcher({ ..._val.data, }), ) - const serializedMessages = messages.map((_message: Message) => _message.serialize()) - logger.child({ service: "Relayer" }).info(`Relaying ${serializedMessages.length} messages ...`) - const { request } = await client.simulateContract({ - address: process.env.YAHO_ADDRESS as `0x${string}`, - abi: yahoAbi, - functionName: "relayMessagesToAdapters", - args: [serializedMessages], - }) - const transactionHash = await client.writeContract(request) - logger.child({ service: "Relayer" }).info(`${serializedMessages.length} messages relayed: ${transactionHash}`) + const executableMessages = [] + for (const message of messages) { + const hash = await client.readContract({ + address: process.env.YAHO_ADDRESS as `0x${string}`, + abi: yahoAbi, + functionName: "getPendingMessageHash", + args: [message.id], + }) + if (hash != "0x0000000000000000000000000000000000000000000000000000000000000000") { + executableMessages.push(message) + } else { + logger.child({ service: "Relayer" }).info(`${message.id} already relayed. Filtering it ...`) + await db.collection("relayedMessages").updateOne( + { id: message.id }, + { + $set: { status: "alreadyRelayed" }, + }, + ) + } + } + + let transactionHash = null + if (executableMessages.length) { + const serializedMessages = executableMessages.map((_message: Message) => _message.serialize()) + + logger.child({ service: "Relayer" }).info(`Relaying ${serializedMessages.length} messages ...`) + const { request } = await client.simulateContract({ + address: process.env.YAHO_ADDRESS as `0x${string}`, + abi: yahoAbi, + functionName: "relayMessagesToAdapters", + args: [serializedMessages], + }) + transactionHash = await client.writeContract(request) + logger.child({ service: "Relayer" }).info(`${serializedMessages.length} messages relayed: ${transactionHash}`) + } return { - messages, + messages: executableMessages, transactionHash, } }, - onResult: (_result: any) => { + onResult: async (_result: any) => { const { messages, transactionHash } = _result as { messages: Message[]; transactionHash: string } + if (!messages.length) return null return Promise.all( messages.map(({ id }) => From 6c36609d0946057eb5b7823dfc1d389b1f0d681b Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Sat, 8 Jun 2024 08:37:34 +0400 Subject: [PATCH 206/297] refactor(evm): adds SOURCE_CHAIN_ID and rn vars within DendrETHAdapter --- .../adapters/DendrETH/DendrETHAdapter.sol | 56 +++++++++---------- .../evm/tasks/deploy/adapters/dendreth.ts | 3 +- 2 files changed, 30 insertions(+), 29 deletions(-) diff --git a/packages/evm/contracts/adapters/DendrETH/DendrETHAdapter.sol b/packages/evm/contracts/adapters/DendrETH/DendrETHAdapter.sol index f4975477..87f6d7ca 100644 --- a/packages/evm/contracts/adapters/DendrETH/DendrETHAdapter.sol +++ b/packages/evm/contracts/adapters/DendrETH/DendrETHAdapter.sol @@ -6,35 +6,36 @@ import { SSZ } from "../Telepathy/libraries/SimpleSerialize.sol"; import { BlockHashAdapter } from "../BlockHashAdapter.sol"; contract DendrETHAdapter is BlockHashAdapter { + uint256 public immutable SOURCE_CHAIN_ID; + address public immutable DENDRETH; + error InvalidUpdate(); error BlockHeaderNotAvailable(uint256 slot); error InvalidBlockNumberProof(); error InvalidBlockHashProof(); - address public immutable dendrETHAddress; - - constructor(address _dendrETHAddress) { - dendrETHAddress = _dendrETHAddress; + constructor(uint256 sourceChainId, address dendreth) { + SOURCE_CHAIN_ID = sourceChainId; + DENDRETH = dendreth; } /// @notice Stores the block header for a given block only if it exists - // in the DendrETH Light Client for the chainId. + // in the DendrETH Light Client for the SOURCE_CHAIN_ID. function storeBlockHeader( - uint32 _chainId, - uint64 _slot, - uint256 _blockNumber, - bytes32[] calldata _blockNumberProof, - bytes32 _blockHash, - bytes32[] calldata _blockHashProof + uint64 slot, + uint256 blockNumber, + bytes32[] calldata blockNumberProof, + bytes32 blockHash, + bytes32[] calldata blockHashProof ) external { - ILightClient lightClient = ILightClient(dendrETHAddress); + ILightClient lightClient = ILightClient(DENDRETH); uint256 currentIndex = lightClient.currentIndex(); uint256 i = currentIndex; bool found = false; do { - if (_slot == lightClient.optimisticSlots(i)) { + if (slot == lightClient.optimisticSlots(i)) { found = true; break; } @@ -45,51 +46,50 @@ contract DendrETHAdapter is BlockHashAdapter { } while (i != currentIndex); if (!found) { - revert BlockHeaderNotAvailable(_slot); + revert BlockHeaderNotAvailable(slot); } bytes32 blockHeaderRoot = lightClient.optimisticHeaders(i); - if (!SSZ.verifyBlockNumber(_blockNumber, _blockNumberProof, blockHeaderRoot)) { + if (!SSZ.verifyBlockNumber(blockNumber, blockNumberProof, blockHeaderRoot)) { revert InvalidBlockNumberProof(); } - if (!SSZ.verifyBlockHash(_blockHash, _blockHashProof, blockHeaderRoot)) { + if (!SSZ.verifyBlockHash(blockHash, blockHashProof, blockHeaderRoot)) { revert InvalidBlockHashProof(); } - _storeHash(uint256(_chainId), _blockNumber, _blockHash); + _storeHash(SOURCE_CHAIN_ID, blockNumber, blockHash); } /// @notice Updates DendrETH Light client and stores the given block // for the update function storeBlockHeader( - uint32 _chainId, - uint64 _slot, - uint256 _blockNumber, - bytes32[] calldata _blockNumberProof, - bytes32 _blockHash, - bytes32[] calldata _blockHashProof, + uint64 slot, + uint256 blockNumber, + bytes32[] calldata blockNumberProof, + bytes32 blockHash, + bytes32[] calldata blockHashProof, LightClientUpdate calldata update ) external { - ILightClient lightClient = ILightClient(dendrETHAddress); + ILightClient lightClient = ILightClient(DENDRETH); lightClient.light_client_update(update); - if (lightClient.optimisticHeaderSlot() != _slot) { + if (lightClient.optimisticHeaderSlot() != slot) { revert InvalidUpdate(); } bytes32 blockHeaderRoot = lightClient.optimisticHeaderRoot(); - if (!SSZ.verifyBlockNumber(_blockNumber, _blockNumberProof, blockHeaderRoot)) { + if (!SSZ.verifyBlockNumber(blockNumber, blockNumberProof, blockHeaderRoot)) { revert InvalidBlockNumberProof(); } - if (!SSZ.verifyBlockHash(_blockHash, _blockHashProof, blockHeaderRoot)) { + if (!SSZ.verifyBlockHash(blockHash, blockHashProof, blockHeaderRoot)) { revert InvalidBlockHashProof(); } - _storeHash(uint256(_chainId), _blockNumber, _blockHash); + _storeHash(SOURCE_CHAIN_ID, blockNumber, blockHash); } } diff --git a/packages/evm/tasks/deploy/adapters/dendreth.ts b/packages/evm/tasks/deploy/adapters/dendreth.ts index ca652380..48b4ffe0 100644 --- a/packages/evm/tasks/deploy/adapters/dendreth.ts +++ b/packages/evm/tasks/deploy/adapters/dendreth.ts @@ -7,6 +7,7 @@ import type { DendrETHAdapter__factory } from "../../../types/factories/contract import { verify } from "../index" task("deploy:adapter:DendrETHAdapter") + .addParam("sourceChainId", "Source chain id") .addParam("dendreth", "address of the DendrETH contract") .setAction(async function (taskArguments: TaskArguments, hre) { console.log("Deploying DendrETHAdapter...") @@ -14,7 +15,7 @@ task("deploy:adapter:DendrETHAdapter") const dendrETHAdapterFactory: DendrETHAdapter__factory = ( await hre.ethers.getContractFactory("DendrETHAdapter") ) - const constructorArguments = [taskArguments.dendreth] as const + const constructorArguments = [taskArguments.sourceChainId, taskArguments.dendreth] as const const dendrETHAdapter: DendrETHAdapter = ( await dendrETHAdapterFactory.connect(signers[0]).deploy(...constructorArguments) ) From 788341425f9fc2b883e4446604ef5bf22119c581 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Sat, 8 Jun 2024 09:48:30 +0400 Subject: [PATCH 207/297] fix(evm): rn DuplicateThreashold into DuplicateThreshold --- packages/evm/contracts/interfaces/IShuSho.sol | 2 +- packages/evm/contracts/ownable/ShuSo.sol | 2 +- packages/evm/test/02_ShoyuBashi.spec.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/evm/contracts/interfaces/IShuSho.sol b/packages/evm/contracts/interfaces/IShuSho.sol index 76f436aa..40a5476d 100644 --- a/packages/evm/contracts/interfaces/IShuSho.sol +++ b/packages/evm/contracts/interfaces/IShuSho.sol @@ -23,7 +23,7 @@ interface IShuSho { error CountCannotBeZero(); error DuplicateHashiAddress(IHashi hashi); error DuplicateOrOutOfOrderAdapters(IAdapter adapterOne, IAdapter adapterTwo); - error DuplicateThreashold(uint256 threshold); + error DuplicateThreshold(uint256 threshold); error InvalidAdapter(IAdapter adapter); error InvalidThreshold(uint256 threshold); error NoAdaptersEnabled(uint256 domain); diff --git a/packages/evm/contracts/ownable/ShuSo.sol b/packages/evm/contracts/ownable/ShuSo.sol index a8d42c05..d4522bda 100644 --- a/packages/evm/contracts/ownable/ShuSo.sol +++ b/packages/evm/contracts/ownable/ShuSo.sol @@ -217,7 +217,7 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { uint256 count = _domains[domain].count; if (count == 0) revert CountCannotBeZero(); if (threshold < (count / 2) + 1) revert InvalidThreshold(threshold); - if (_domains[domain].threshold == threshold) revert DuplicateThreashold(threshold); + if (_domains[domain].threshold == threshold) revert DuplicateThreshold(threshold); _domains[domain].threshold = threshold; emit ThresholdSet(domain, threshold); } diff --git a/packages/evm/test/02_ShoyuBashi.spec.ts b/packages/evm/test/02_ShoyuBashi.spec.ts index 747fb034..7cc0faa3 100644 --- a/packages/evm/test/02_ShoyuBashi.spec.ts +++ b/packages/evm/test/02_ShoyuBashi.spec.ts @@ -84,7 +84,7 @@ describe("ShoyuBashi", function () { await shoyuBashi.setThreshold(DOMAIN_ID, 2) await expect(shoyuBashi.setThreshold(DOMAIN_ID, 2)).to.be.revertedWithCustomError( shoyuBashi, - "DuplicateThreashold", + "DuplicateThreshold", ) }) it("Sets threshold for the given ChainID", async function () { From 3b66a14cb85faf2cd9cab5a80f33a2d29f72430e Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Sat, 8 Jun 2024 10:00:05 +0400 Subject: [PATCH 208/297] refactor(evm): rm duplicated code within Hashi --- packages/evm/contracts/Hashi.sol | 14 +++----------- packages/evm/test/01_Hashi.spec.ts | 10 +--------- 2 files changed, 4 insertions(+), 20 deletions(-) diff --git a/packages/evm/contracts/Hashi.sol b/packages/evm/contracts/Hashi.sol index bf315da2..49d9f2fc 100644 --- a/packages/evm/contracts/Hashi.sol +++ b/packages/evm/contracts/Hashi.sol @@ -44,16 +44,8 @@ contract Hashi is IHashi { uint256 threshold, IAdapter[] calldata adapters ) external view returns (bool) { - if (adapters.length == 0) revert NoAdaptersGiven(); if (threshold > adapters.length || threshold == 0) revert InvalidThreshold(threshold, adapters.length); - - bytes32[] memory hashes = new bytes32[](adapters.length); - for (uint256 i = 0; i < adapters.length; ) { - hashes[i] = adapters[i].getHash(domain, id); - unchecked { - ++i; - } - } + bytes32[] memory hashes = getHashesFromAdapters(domain, id, adapters); for (uint256 i = 0; i < hashes.length; ) { if (i > hashes.length - threshold) break; @@ -87,7 +79,7 @@ contract Hashi is IHashi { } /// @inheritdoc IHashi - function getHashFromAdapter(uint256 domain, uint256 id, IAdapter adapter) public view returns (bytes32) { + function getHashFromAdapter(uint256 domain, uint256 id, IAdapter adapter) external view returns (bytes32) { return adapter.getHash(domain, id); } @@ -100,7 +92,7 @@ contract Hashi is IHashi { if (adapters.length == 0) revert NoAdaptersGiven(); bytes32[] memory hashes = new bytes32[](adapters.length); for (uint256 i = 0; i < adapters.length; ) { - hashes[i] = getHashFromAdapter(domain, id, adapters[i]); + hashes[i] = adapters[i].getHash(domain, id); unchecked { ++i; } diff --git a/packages/evm/test/01_Hashi.spec.ts b/packages/evm/test/01_Hashi.spec.ts index 2f2101eb..5541fecd 100644 --- a/packages/evm/test/01_Hashi.spec.ts +++ b/packages/evm/test/01_Hashi.spec.ts @@ -126,7 +126,7 @@ describe("Hashi", function () { .to.be.revertedWithCustomError(hashi, "InvalidThreshold") .withArgs(threshold, adapters.length) }) - it("should revert false if the threshold is 0", async () => { + it("should revert if the threshold is 0", async () => { const { hashi, mockAdapter, badMockAdapter, nonReportingMockAdapter } = await setup() const id = 3 const threshold = 0 @@ -135,13 +135,5 @@ describe("Hashi", function () { .to.be.revertedWithCustomError(hashi, "InvalidThreshold") .withArgs(threshold, adapters.length) }) - it("should revert false if we don't provide any adapter", async () => { - const { hashi } = await setup() - const id = 3 - const threshold = 3 - await expect( - hashi.checkHashWithThresholdFromAdapters(DOMAIN_ID, id, threshold, []), - ).to.be.revertedWithCustomError(hashi, "NoAdaptersGiven") - }) }) }) From cb80a56d2effb4a51afcdef1049317d6afcdaa21 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Sat, 8 Jun 2024 10:07:46 +0400 Subject: [PATCH 209/297] refactor(evm): rm _resetPendingMessageHashesByMessageIds within Yaho --- packages/evm/contracts/Yaho.sol | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/packages/evm/contracts/Yaho.sol b/packages/evm/contracts/Yaho.sol index 2eeb005f..777ea5a1 100644 --- a/packages/evm/contracts/Yaho.sol +++ b/packages/evm/contracts/Yaho.sol @@ -22,7 +22,15 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { IAdapter[] calldata adapters ) external returns (uint256) { _checkReportersAndAdapters(threshold, reporters, adapters); - (uint256 messageId, ) = _dispatchMessage(targetChainId, threshold, receiver, data, reporters, adapters); + (uint256 messageId, bytes32 messageHash) = _dispatchMessage( + targetChainId, + threshold, + receiver, + data, + reporters, + adapters + ); + _pendingMessageHashes[messageId] = messageHash; return messageId; } @@ -84,7 +92,6 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { } bytes32[] memory reportersReceipts = new bytes32[](reporters.length); - _resetPendingMessageHashesByMessageIds(messageIds); reportersReceipts = _dispatchMessagesToAdapters(targetChainId, messageIds, messageHashes, reporters, adapters); return (messageIds, reportersReceipts); } @@ -160,7 +167,6 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { ); bytes32 messageHash = calculateMessageHash(message); uint256 messageId = calculateMessageId(block.chainid, address(this), messageHash); - _pendingMessageHashes[messageId] = messageHash; unchecked { ++currentNonce; } @@ -179,7 +185,6 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { bytes32[] memory messageHashes = new bytes32[](1); messageIds[0] = messageId; messageHashes[0] = messageHash; - _resetPendingMessageHashesByMessageIds(messageIds); return _dispatchMessagesToAdapters(targetChainId, messageIds, messageHashes, reporters, adapters); } @@ -204,13 +209,4 @@ contract Yaho is IYaho, MessageIdCalculator, MessageHashCalculator { return reportersReceipts; } - - function _resetPendingMessageHashesByMessageIds(uint256[] memory messageIds) internal { - for (uint256 i = 0; i < messageIds.length; ) { - delete _pendingMessageHashes[messageIds[i]]; - unchecked { - ++i; - } - } - } } From 48329745d0b0d60709184d5c4e6988cc98748222 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 10 Jun 2024 18:58:18 +0200 Subject: [PATCH 210/297] chore(evm): rm GiriGiriBashi --- .../evm/contracts/ownable/GiriGiriBashi.sol | 269 ------ packages/evm/tasks/deploy/hashi.ts | 22 - packages/evm/test/03_GiriGiriBashi.spec.ts | 846 ------------------ 3 files changed, 1137 deletions(-) delete mode 100644 packages/evm/contracts/ownable/GiriGiriBashi.sol delete mode 100644 packages/evm/test/03_GiriGiriBashi.spec.ts diff --git a/packages/evm/contracts/ownable/GiriGiriBashi.sol b/packages/evm/contracts/ownable/GiriGiriBashi.sol deleted file mode 100644 index 260c89a8..00000000 --- a/packages/evm/contracts/ownable/GiriGiriBashi.sol +++ /dev/null @@ -1,269 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.20; - -import { ShuSo } from "./ShuSo.sol"; -import { IAdapter } from "../interfaces/IAdapter.sol"; -import { IHashi } from "../interfaces/IHashi.sol"; -import { IGiriGiriBashi } from "../interfaces/IGiriGiriBashi.sol"; - -contract GiriGiriBashi is IGiriGiriBashi, ShuSo { - address payable public bondRecipient; - - mapping(uint256 => uint256) private _heads; - mapping(uint256 => uint256) private _challengeRanges; - mapping(uint256 => mapping(IAdapter => Settings)) private _settings; - mapping(bytes32 => Challenge) private _challenges; - - constructor(address _owner, address _hashi, address payable _bondRecipient) ShuSo(_owner, _hashi) { - bondRecipient = _bondRecipient; - } - - modifier noConfidence(uint256 domain) { - if (getDomain(domain).threshold != type(uint256).max) revert NoConfidenceRequired(); - _; - } - - modifier zeroCount(uint256 domain) { - Domain memory domainConfigs = getDomain(domain); - if (domainConfigs.count != 0 && domainConfigs.threshold > 0) revert CountMustBeZero(domain); - _; - } - - /// @inheritdoc IGiriGiriBashi - function challengeAdapter(uint256 domain, uint256 id, IAdapter adapter) public payable { - if (getAdapterLink(domain, adapter).previous == IAdapter(address(0))) revert AdapterNotEnabled(adapter); - if (msg.value < _settings[domain][adapter].minimumBond) revert NotEnoughValue(adapter, msg.value); - if (_settings[domain][adapter].quarantined) revert AlreadyQuarantined(adapter); - - bytes32 challengeId = getChallengeId(domain, id, adapter); - if (_challenges[challengeId].challenger != address(0)) - revert DuplicateChallenge(challengeId, domain, id, adapter); - - // check if id is lower than startId, revert if true. - // check if id is less than highestId + challengeRange, revert if false - // check if id is lower than highestId - idDepth, revert if true - uint256 challengeRange = _challengeRanges[domain]; - uint256 idDepth = _settings[domain][adapter].idDepth; - uint256 head = _heads[domain]; - if ( - id < _settings[domain][adapter].startId || // before start id - (challengeRange != 0 && id >= head && id - head > challengeRange) || // over domain challenge range - (idDepth != 0 && head > idDepth && id <= head - idDepth) // outside of adapter idDepth - ) revert OutOfRange(adapter, id); - - Challenge storage challenge = _challenges[challengeId]; - challenge.challenger = payable(msg.sender); - challenge.timestamp = block.timestamp; - challenge.bond = msg.value; - - emit ChallengeCreated(challengeId, domain, id, adapter, msg.sender, block.timestamp, msg.value); - } - - /// @inheritdoc IGiriGiriBashi - function enableAdapters( - uint256 domain, - IAdapter[] memory adapters, - Settings[] memory settings - ) public zeroCount(domain) { - _enableAdapters(domain, adapters); - initSettings(domain, adapters, settings); - } - - /// @inheritdoc IGiriGiriBashi - function declareNoConfidence(uint256 domain, uint256 id, IAdapter[] memory adapters) public { - checkAdapterOrderAndValidity(domain, adapters); - (uint256 threshold, uint256 count) = getThresholdAndCount(domain); - - if (adapters.length != count) revert CannotProveNoConfidence(domain, id, adapters); - - bytes32[] memory hashes = new bytes32[](adapters.length); - uint256 zeroHashes = 0; - for (uint256 i = 0; i < adapters.length; i++) { - hashes[i] = adapters[i].getHash(domain, id); - if (hashes[i] == bytes32(0)) zeroHashes++; - if (zeroHashes == threshold) revert CannotProveNoConfidence(domain, id, adapters); - } - - for (uint256 i = 0; i < hashes.length; i++) { - uint256 equalHashes = 1; - for (uint256 j = 0; j < hashes.length; j++) { - if (hashes[i] == hashes[j] && i != j) { - equalHashes++; - } - } - - if (equalHashes + zeroHashes >= threshold) revert CannotProveNoConfidence(domain, id, adapters); - } - - _setDomainThreshold(domain, type(uint256).max); - delete _challengeRanges[domain]; - - emit NoConfidenceDeclared(domain); - } - - /// @inheritdoc IGiriGiriBashi - function disableAdapters(uint256 domain, IAdapter[] memory adapters) public noConfidence(domain) { - _disableAdapters(domain, adapters); - if (getDomain(domain).count == 0) _setDomainThreshold(domain, 0); - } - - /// @inheritdoc IGiriGiriBashi - function getSettings(uint256 domain, IAdapter adapter) external view returns (Settings memory) { - return _settings[domain][adapter]; - } - - /// @inheritdoc IGiriGiriBashi - function getChallenge(bytes32 challengeId) external view returns (Challenge memory) { - return _challenges[challengeId]; - } - - /// @inheritdoc IGiriGiriBashi - function getChallengeId(uint256 domain, uint256 id, IAdapter adapter) public pure returns (bytes32 challengeId) { - challengeId = keccak256(abi.encodePacked(domain, id, adapter)); - } - - /// @inheritdoc IGiriGiriBashi - function getChallengeRange(uint256 domain) external view returns (uint256) { - return _challengeRanges[domain]; - } - - /// @inheritdoc IGiriGiriBashi - function getHead(uint256 domain) external view returns (uint256) { - return _heads[domain]; - } - - /// @inheritdoc IGiriGiriBashi - function getThresholdHash(uint256 domain, uint256 id) public returns (bytes32 hash) { - hash = _getThresholdHash(domain, id); - updateHead(domain, id); - } - - /// @inheritdoc IGiriGiriBashi - function getUnanimousHash(uint256 domain, uint256 id) public returns (bytes32 hash) { - hash = _getUnanimousHash(domain, id); - updateHead(domain, id); - } - - /// @inheritdoc IGiriGiriBashi - function getHash(uint256 domain, uint256 id, IAdapter[] memory adapters) public returns (bytes32 hash) { - hash = _getHash(domain, id, adapters); - updateHead(domain, id); - } - - /// @inheritdoc IGiriGiriBashi - function replaceQuarantinedAdapters( - uint256 domain, - IAdapter[] memory currentAdapters, - IAdapter[] memory newAdapters, - Settings[] memory settings - ) public onlyOwner { - if (currentAdapters.length != newAdapters.length || currentAdapters.length != settings.length) - revert UnequalArrayLengths(); - for (uint256 i = 0; i < currentAdapters.length; i++) { - if (!_settings[domain][currentAdapters[i]].quarantined) revert AdapterNotQuarantined(currentAdapters[i]); - } - _disableAdapters(domain, currentAdapters); - _enableAdapters(domain, newAdapters); - initSettings(domain, newAdapters, settings); - } - - /// @inheritdoc IGiriGiriBashi - function resolveChallenge( - uint256 domain, - uint256 id, - IAdapter adapter, - IAdapter[] memory adapters - ) public returns (bool success) { - // check if challenge exists, revert if false - bytes32 challengeId = getChallengeId(domain, id, adapter); - if (_challenges[challengeId].challenger == address(0)) - revert ChallengeNotFound(challengeId, domain, id, adapter); - - for (uint256 i = 0; i < adapters.length; ) { - if (adapters[i] == adapter) revert AdaptersCannotContainChallengedAdapter(adapters, adapter); - unchecked { - ++i; - } - } - - Challenge storage challenge = _challenges[challengeId]; - Settings storage adapterSettings = _settings[domain][adapter]; - bytes32 storedHash = adapter.getHash(domain, id); - - if (storedHash == bytes32(0)) { - if (block.timestamp < challenge.timestamp + adapterSettings.timeout) - revert AdapterHasNotYetTimedOut(adapter); - adapterSettings.quarantined = true; - challenge.challenger.transfer(challenge.bond); - success = true; - } else { - // if adapters + 1 equals threshold && adapters + adapter report the same header - if (adapters.length == getDomain(domain).threshold - 1) { - checkAdapterOrderAndValidity(domain, adapters); - bytes32 canonicalHash = hashi.getHash(domain, id, adapters); - if (canonicalHash == storedHash) { - bondRecipient.transfer(challenge.bond); - success = false; - } else { - revert IHashi.AdaptersDisagree(adapter, adapters[0]); - } - } else { - // check if adapters report the same header as adapter - bytes32 canonicalHash = getHash(domain, id, adapters); - if (canonicalHash == storedHash) { - bondRecipient.transfer(challenge.bond); - success = false; - } else { - adapterSettings.quarantined = true; - challenge.challenger.transfer(challenge.bond); - success = true; - } - } - } - emit ChallengeResolved(challengeId, domain, id, adapter, challenge.challenger, challenge.bond, success); - - delete challenge.challenger; - delete challenge.timestamp; - delete challenge.bond; - } - - /// @inheritdoc IGiriGiriBashi - function setBondRecipient(address payable _bondRecipient) public onlyOwner { - bondRecipient = _bondRecipient; - emit BondRecipientSet(_bondRecipient); - } - - /// @inheritdoc IGiriGiriBashi - function setChallengeRange(uint256 domain, uint256 range) public onlyOwner { - if (_challengeRanges[domain] != 0) revert ChallengeRangeAlreadySet(domain); - _challengeRanges[domain] = range; - emit ChallengeRangeUpdated(domain, range); - } - - function setHashi(IHashi _hashi) public override onlyInitializing { - _setHashi(_hashi); - } - - /// @inheritdoc IGiriGiriBashi - function setThreshold(uint256 domain, uint256 threshold) public zeroCount(domain) { - _setThreshold(domain, threshold); - } - - function initSettings(uint256 domain, IAdapter[] memory _adapters, Settings[] memory adapters) private { - if (_adapters.length != adapters.length) revert UnequalArrayLengths(); - for (uint256 i = 0; i < _adapters.length; i++) { - IAdapter adapter = _adapters[i]; - _settings[domain][adapter].quarantined = false; - _settings[domain][adapter].minimumBond = adapters[i].minimumBond; - _settings[domain][adapter].startId = adapters[i].startId; - _settings[domain][adapter].idDepth = adapters[i].idDepth; - _settings[domain][adapter].timeout = adapters[i].timeout; - emit SettingsInitialized(domain, adapter, adapters[i]); - } - } - - function updateHead(uint256 domain, uint256 id) private { - if (id > _heads[domain]) _heads[domain] = id; - emit NewHead(domain, id); - } -} diff --git a/packages/evm/tasks/deploy/hashi.ts b/packages/evm/tasks/deploy/hashi.ts index 4a9c01cb..10e96dc3 100644 --- a/packages/evm/tasks/deploy/hashi.ts +++ b/packages/evm/tasks/deploy/hashi.ts @@ -6,13 +6,11 @@ import { verify } from "." import type { Hashi } from "../../types/contracts/Hashi" import type { Yaho } from "../../types/contracts/Yaho" import type { Yaru } from "../../types/contracts/Yaru" -import type { GiriGiriBashi } from "../../types/contracts/ownable/GiriGiriBashi" import type { ShoyuBashi } from "../../types/contracts/ownable/ShoyuBashi" import type { HeaderStorage } from "../../types/contracts/utils/HeaderStorage" import type { Hashi__factory } from "../../types/factories/contracts/Hashi__factory" import type { Yaho__factory } from "../../types/factories/contracts/Yaho__factory" import type { Yaru__factory } from "../../types/factories/contracts/Yaru__factory" -import type { GiriGiriBashi__factory } from "../../types/factories/contracts/ownable/GiriGiriBashi__factory" import type { ShoyuBashi__factory } from "../../types/factories/contracts/ownable/ShoyuBashi__factory" import type { HeaderStorage__factory } from "../../types/factories/contracts/utils/HeaderStorage__factory" @@ -47,26 +45,6 @@ task("deploy:ShoyuBashi") if (taskArguments.verify) await verify(hre, shoyuBashi, constructorArguments) }) -task("deploy:GiriGiriBashi") - .addParam("owner", "address to set as the owner of this contract") - .addParam("hashi", "address of the hashi contract") - .addParam("recipient", "address that will receive bonds for unsuccessful challenges") - .addFlag("verify", "whether to verify the contract on Etherscan") - .setAction(async function (taskArguments: TaskArguments, hre) { - console.log("Deploying GiriGiriBashi...") - const signers: SignerWithAddress[] = await hre.ethers.getSigners() - const giriGiriBashiFactory: GiriGiriBashi__factory = ( - await hre.ethers.getContractFactory("GiriGiriBashi") - ) - const constructorArguments = [taskArguments.owner, taskArguments.hashi, taskArguments.recipient] as const - const giriGiriBashi: GiriGiriBashi = ( - await giriGiriBashiFactory.connect(signers[0]).deploy(...constructorArguments) - ) - await giriGiriBashi.deployed() - console.log("GiriGiriBashi deployed to:", giriGiriBashi.address) - if (taskArguments.verify) await verify(hre, giriGiriBashi, constructorArguments) - }) - task("deploy:HeaderStorage") .addFlag("verify", "whether to verify the contract on Etherscan") .setAction(async function (taskArguments: TaskArguments, hre) { diff --git a/packages/evm/test/03_GiriGiriBashi.spec.ts b/packages/evm/test/03_GiriGiriBashi.spec.ts deleted file mode 100644 index 4da60ad9..00000000 --- a/packages/evm/test/03_GiriGiriBashi.spec.ts +++ /dev/null @@ -1,846 +0,0 @@ -import { expect } from "chai" -import { ethers, network } from "hardhat" - -const DOMAIN_ID = 1 -const HASH_ZERO = "0x0000000000000000000000000000000000000000000000000000000000000000" -const HASH_GOOD = "0x0000000000000000000000000000000000000000000000000000000000000001" -const HASH_BAD = "0x0000000000000000000000000000000000000000000000000000000000000bad" -const HASH_DEAD = "0x000000000000000000000000000000000000000000000000000000000000dead" -const ADDRESS_ZERO = "0x0000000000000000000000000000000000000000" -const LIST_END = "0x0000000000000000000000000000000000000001" -const ADDRESS_TWO = "0x0000000000000000000000000000000000000002" -const ADDRESS_THREE = "0x0000000000000000000000000000000000000003" -const CHALLENGE_RANGE = 20 -const BOND = ethers.utils.parseEther("1") - -function compareAddresses(a: string, b: string): number { - // Remove the "0x" prefix and convert to lowercase for comparison - const addressA = a.toLowerCase().replace("0x", "") - const addressB = b.toLowerCase().replace("0x", "") - - if (addressA < addressB) { - return -1 - } else if (addressA > addressB) { - return 1 - } else { - return 0 - } -} - -const setup = async (_configs?: any) => { - const [wallet] = await ethers.getSigners() - const Hashi = await ethers.getContractFactory("Hashi") - const hashi = await Hashi.deploy() - const GiriGiriBashi = await ethers.getContractFactory("GiriGiriBashi") - const giriGiriBashi = await GiriGiriBashi.deploy(wallet.address, hashi.address, ADDRESS_TWO) - const MockAdapter = await ethers.getContractFactory("MockAdapter") - const mockAdapter = await MockAdapter.deploy() - const secondMockAdapter = await MockAdapter.deploy() - const thirdMockAdapter = await MockAdapter.deploy() - - await mockAdapter.setHashes( - DOMAIN_ID, - [0, 1, 20, 21, 22, 23], - [HASH_ZERO, HASH_GOOD, HASH_BAD, HASH_GOOD, HASH_BAD, HASH_ZERO], - ) - await secondMockAdapter.setHashes( - DOMAIN_ID, - [0, 1, 20, 21, 22, 23], - [HASH_ZERO, HASH_GOOD, HASH_GOOD, HASH_GOOD, HASH_GOOD, HASH_ZERO], - ) - await thirdMockAdapter.setHashes( - DOMAIN_ID, - [0, 1, 20, 21, 22, 23], - [HASH_ZERO, HASH_GOOD, HASH_DEAD, HASH_GOOD, HASH_GOOD, HASH_GOOD], - ) - - await giriGiriBashi.setChallengeRange(DOMAIN_ID, CHALLENGE_RANGE) - - const settings = { - quarantined: false, - minimumBond: BOND, - startId: 1, - idDepth: 20, - timeout: 500, - } - - return { - giriGiriBashi, - GiriGiriBashi, - hashi, - mockAdapter, - secondMockAdapter, - settings, - thirdMockAdapter, - wallet, - } -} - -describe("GiriGiriBashi", function () { - describe("Deploy", function () { - it("Successfully deploys contract", async function () { - const { hashi, giriGiriBashi, wallet } = await setup() - expect(await giriGiriBashi.deployed()) - expect(await giriGiriBashi.owner()).to.equal(wallet.address) - expect(await giriGiriBashi.hashi()).to.equal(hashi.address) - expect(await giriGiriBashi.bondRecipient()).to.equal(ADDRESS_TWO) - }) - it("Emits Initialized event", async function () { - const { giriGiriBashi } = await setup() - const event = await giriGiriBashi.filters.Init(null, null) - await expect(event.address).to.equal(giriGiriBashi.address) - }) - }) - - describe("setHashi()", function () { - it("Reverts if called after initializing", async function () { - const { giriGiriBashi, wallet } = await setup() - await giriGiriBashi.transferOwnership(giriGiriBashi.address) - await expect(giriGiriBashi.setHashi(wallet.address)).to.be.revertedWith( - "Initializable: contract is not initializing", - ) - }) - it("Sets Hashi address", async function () { - const { giriGiriBashi, hashi } = await setup() - expect(await giriGiriBashi.hashi()).to.equal(hashi.address) - }) - it("Emits HashiSet() event", async function () { - const { giriGiriBashi, hashi } = await setup() - const tx = await giriGiriBashi.deployTransaction - await expect(tx).to.emit(giriGiriBashi, "HashiSet").withArgs(hashi.address) - }) - }) - - describe("setThreshold()", function () { - it("Reverts if count is greater than zero", async function () { - const { giriGiriBashi, mockAdapter, settings } = await setup() - await giriGiriBashi.enableAdapters(DOMAIN_ID, [mockAdapter.address], [settings]) - await giriGiriBashi.setThreshold(DOMAIN_ID, 2) - await expect(giriGiriBashi.setThreshold(DOMAIN_ID, 2)).to.be.revertedWithCustomError( - giriGiriBashi, - "CountMustBeZero", - ) - }) - it("Reverts if adapters are not enabled", async function () { - const { giriGiriBashi } = await setup() - await expect(giriGiriBashi.setThreshold(DOMAIN_ID, 2)).to.be.revertedWithCustomError( - giriGiriBashi, - "CountCannotBeZero", - ) - }) - it("Reverts if the threshold is less than them majority of adapters", async function () { - const { giriGiriBashi, settings, mockAdapter, secondMockAdapter, thirdMockAdapter } = await setup() - await giriGiriBashi.enableAdapters( - DOMAIN_ID, - [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address], - [settings, settings, settings], - ) - await expect(giriGiriBashi.setThreshold(DOMAIN_ID, 1)) - .to.be.revertedWithCustomError(giriGiriBashi, "InvalidThreshold") - .withArgs(1) - }) - it("Sets threshold for the given ChainID", async function () { - const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() - await giriGiriBashi.enableAdapters( - DOMAIN_ID, - [mockAdapter.address, secondMockAdapter.address], - [settings, settings], - ) - await giriGiriBashi.setThreshold(DOMAIN_ID, 2) - expect((await giriGiriBashi.getDomain(DOMAIN_ID)).threshold).to.equal(2) - }) - it("Emits HashiSet() event", async function () { - const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() - await giriGiriBashi.enableAdapters( - DOMAIN_ID, - [mockAdapter.address, secondMockAdapter.address], - [settings, settings], - ) - await expect(giriGiriBashi.setThreshold(DOMAIN_ID, 2)) - .to.emit(giriGiriBashi, "ThresholdSet") - .withArgs(DOMAIN_ID, 2) - }) - }) - - describe("enableAdapters()", function () { - it("Reverts if called by non-owner account", async function () { - const { giriGiriBashi, settings } = await setup() - await giriGiriBashi.transferOwnership(giriGiriBashi.address) - await expect(giriGiriBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO], [settings])).to.be.revertedWith( - "Ownable: caller is not the owner", - ) - }) - it("Reverts if any adapters are already enabled", async function () { - const { giriGiriBashi, settings } = await setup() - await giriGiriBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO], [settings]) - await giriGiriBashi.setThreshold(DOMAIN_ID, 1) - await expect(giriGiriBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO], [settings])).to.be.revertedWithCustomError( - giriGiriBashi, - "CountMustBeZero", - ) - }) - it("Reverts if arrays are unequal lengths", async function () { - const { giriGiriBashi, settings } = await setup() - await expect( - giriGiriBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO], [settings, settings]), - ).to.be.revertedWithCustomError(giriGiriBashi, "UnequalArrayLengths") - }) - it("Enables the given adapters", async function () { - const { giriGiriBashi, settings } = await setup() - await giriGiriBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE], [settings, settings]) - await giriGiriBashi.setThreshold(DOMAIN_ID, 2) - const adapters = await giriGiriBashi.getAdapters(DOMAIN_ID) - await expect(adapters[0]).to.equal(ADDRESS_TWO) - await expect(adapters[1]).to.equal(ADDRESS_THREE) - expect((await giriGiriBashi.getAdapterLink(DOMAIN_ID, LIST_END)).next).to.equal(ADDRESS_TWO) - expect((await giriGiriBashi.getAdapterLink(DOMAIN_ID, LIST_END)).previous).to.equal(ADDRESS_THREE) - expect((await giriGiriBashi.getAdapterLink(DOMAIN_ID, ADDRESS_TWO)).next).to.equal(ADDRESS_THREE) - expect((await giriGiriBashi.getAdapterLink(DOMAIN_ID, ADDRESS_TWO)).previous).to.equal(LIST_END) - expect((await giriGiriBashi.getAdapterLink(DOMAIN_ID, ADDRESS_THREE)).next).to.equal(LIST_END) - expect((await giriGiriBashi.getAdapterLink(DOMAIN_ID, ADDRESS_THREE)).previous).to.equal(ADDRESS_TWO) - let adapterSettings = await giriGiriBashi.getSettings(DOMAIN_ID, ADDRESS_TWO) - expect(adapterSettings.quarantined).to.deep.equal(settings.quarantined) - expect(adapterSettings.minimumBond).to.deep.equal(settings.minimumBond) - expect(adapterSettings.startId).to.deep.equal(settings.startId) - expect(adapterSettings.idDepth).to.deep.equal(settings.idDepth) - expect(adapterSettings.timeout).to.deep.equal(settings.timeout) - adapterSettings = await giriGiriBashi.getSettings(DOMAIN_ID, ADDRESS_THREE) - expect(adapterSettings.quarantined).to.deep.equal(settings.quarantined) - expect(adapterSettings.minimumBond).to.deep.equal(settings.minimumBond) - expect(adapterSettings.startId).to.deep.equal(settings.startId) - expect(adapterSettings.idDepth).to.deep.equal(settings.idDepth) - expect(adapterSettings.timeout).to.deep.equal(settings.timeout) - }) - it("Emits AdaptersEnabled() event", async function () { - const { giriGiriBashi, settings } = await setup() - await expect(giriGiriBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE], [settings, settings])) - .to.emit(giriGiriBashi, "AdaptersEnabled") - .withArgs(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) - }) - }) - - describe("disableAdapters()", function () { - it("Reverts if a state of no confidence has not been established", async function () { - const { giriGiriBashi } = await setup() - await expect(giriGiriBashi.disableAdapters(DOMAIN_ID, [ADDRESS_TWO])).to.be.revertedWithCustomError( - giriGiriBashi, - "NoConfidenceRequired", - ) - }) - it("Disables the given adapters", async function () { - const { giriGiriBashi, settings } = await setup() - await giriGiriBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE], [settings, settings]) - await giriGiriBashi.setThreshold(DOMAIN_ID, ethers.constants.MaxUint256) - await giriGiriBashi.disableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) - const adapters = await giriGiriBashi.getAdapters(DOMAIN_ID) - await expect(adapters[0]).to.equal(undefined) - }) - }) - - describe("getUnanimousHash()", function () { - it("Updates head for given domain", async function () { - const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() - await giriGiriBashi.enableAdapters( - DOMAIN_ID, - [mockAdapter.address, secondMockAdapter.address], - [settings, settings], - ) - const oldHead = await giriGiriBashi.getHead(DOMAIN_ID) - await giriGiriBashi.getUnanimousHash(DOMAIN_ID, 1) - const newHead = await giriGiriBashi.getHead(DOMAIN_ID) - expect(newHead).not.to.equal(oldHead) - }) - }) - - describe("getThresholdHash()", function () { - for (let threshold = 2; threshold <= 3; threshold++) { - it(`Updates head for given domain with ${threshold}/3`, async function () { - const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() - await giriGiriBashi.enableAdapters( - DOMAIN_ID, - [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address], - [settings, settings, settings], - ) - const oldHead = await giriGiriBashi.getHead(DOMAIN_ID) - expect(await giriGiriBashi.callStatic.getThresholdHash(DOMAIN_ID, 1)).to.equal(HASH_GOOD) - await giriGiriBashi.getThresholdHash(DOMAIN_ID, 1) - const newHead = await giriGiriBashi.getHead(DOMAIN_ID) - expect(newHead).not.to.equal(oldHead) - }) - } - }) - - describe("getHash()", function () { - it("Updates head for given domain", async function () { - const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() - await giriGiriBashi.enableAdapters( - DOMAIN_ID, - [mockAdapter.address, secondMockAdapter.address], - [settings, settings], - ) - await giriGiriBashi.setThreshold(DOMAIN_ID, 2) - let adapters - if (secondMockAdapter.address > mockAdapter.address) { - adapters = [mockAdapter.address, secondMockAdapter.address] - } else { - adapters = [secondMockAdapter.address, mockAdapter.address] - } - const oldHead = await giriGiriBashi.getHead(DOMAIN_ID) - await giriGiriBashi.getHash(DOMAIN_ID, 1, adapters) - const newHead = await giriGiriBashi.getHead(DOMAIN_ID) - expect(newHead).not.to.equal(oldHead) - }) - }) - - describe("challengeAdapter()", function () { - it("Reverts if given adapter is not enabled", async function () { - const { giriGiriBashi, mockAdapter } = await setup() - await expect(giriGiriBashi.challengeAdapter(DOMAIN_ID, 1, mockAdapter.address)) - .to.be.revertedWithCustomError(giriGiriBashi, "AdapterNotEnabled") - .withArgs(mockAdapter.address) - }) - it("Reverts if value is less than minimum bond", async function () { - const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() - await giriGiriBashi.enableAdapters( - DOMAIN_ID, - [mockAdapter.address, secondMockAdapter.address], - [settings, settings], - ) - await giriGiriBashi.setThreshold(DOMAIN_ID, 2) - await expect(giriGiriBashi.challengeAdapter(DOMAIN_ID, 1, mockAdapter.address)) - .to.be.revertedWithCustomError(giriGiriBashi, "NotEnoughValue") - .withArgs(mockAdapter.address, 0) - }) - it("Reverts if adapter is already quarantined", async function () { - const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() - const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) - await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) - await giriGiriBashi.setThreshold(DOMAIN_ID, 2) - - await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) - const head = await giriGiriBashi.getHead(DOMAIN_ID) - const challengeBlock = head - CHALLENGE_RANGE + 2 - await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { - value: BOND, - }) - const challengeId = await giriGiriBashi.getChallengeId(DOMAIN_ID, challengeBlock, mockAdapter.address) - const challenge = await giriGiriBashi.getChallenge(challengeId) - const increaseAmount = challenge.timestamp.add(settings.timeout).add(1) - - await network.provider.send("evm_setNextBlockTimestamp", [increaseAmount.toHexString()]) - - await giriGiriBashi.resolveChallenge(DOMAIN_ID, challengeBlock, mockAdapter.address, [secondMockAdapter.address]) - await expect( - giriGiriBashi.callStatic.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { - value: BOND, - }), - ) - .to.be.revertedWithCustomError(giriGiriBashi, "AlreadyQuarantined") - .withArgs(mockAdapter.address) - }) - it("Reverts if adapters array contains duplicates", async function () { - const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() - const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) - await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) - await giriGiriBashi.setThreshold(DOMAIN_ID, 2) - - await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) - const head = await giriGiriBashi.getHead(DOMAIN_ID) - const challengeBlock = head - CHALLENGE_RANGE + 2 - await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { - value: BOND, - }) - const challengeId = await giriGiriBashi.getChallengeId(DOMAIN_ID, challengeBlock, mockAdapter.address) - const challenge = await giriGiriBashi.getChallenge(challengeId) - const increaseAmount = challenge.timestamp.add(settings.timeout).add(1) - - await network.provider.send("evm_setNextBlockTimestamp", [increaseAmount.toHexString()]) - await mockAdapter.setHashes(DOMAIN_ID, [challengeBlock], [HASH_GOOD]) - await secondMockAdapter.setHashes(DOMAIN_ID, [challengeBlock], [HASH_GOOD]) - - await expect( - giriGiriBashi.resolveChallenge(DOMAIN_ID, challengeBlock, mockAdapter.address, [ - secondMockAdapter.address, - secondMockAdapter.address, - ]), - ).to.be.revertedWithCustomError(giriGiriBashi, "DuplicateOrOutOfOrderAdapters") - }) - it("Reverts if adapters array contains the challenged adapter", async function () { - const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() - const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) - await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) - - await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) - const head = await giriGiriBashi.getHead(DOMAIN_ID) - const challengeBlock = head - CHALLENGE_RANGE + 2 - await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { - value: BOND, - }) - - const wrongAdapters = [secondMockAdapter.address, mockAdapter.address] - await expect(giriGiriBashi.resolveChallenge(DOMAIN_ID, challengeBlock, mockAdapter.address, wrongAdapters)) - .to.revertedWithCustomError(giriGiriBashi, "AdaptersCannotContainChallengedAdapter") - .withArgs(wrongAdapters, mockAdapter.address) - }) - it("Reverts if duplicate challenge exists", async function () { - const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() - const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) - await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) - await giriGiriBashi.setThreshold(DOMAIN_ID, 2) - await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) - const head = await giriGiriBashi.getHead(DOMAIN_ID) - expect( - await giriGiriBashi.challengeAdapter(DOMAIN_ID, head - CHALLENGE_RANGE + 1, mockAdapter.address, { - value: BOND, - }), - ) - await expect( - giriGiriBashi.callStatic.challengeAdapter(DOMAIN_ID, head - CHALLENGE_RANGE + 1, mockAdapter.address, { - value: BOND, - }), - ).to.be.revertedWithCustomError(giriGiriBashi, "DuplicateChallenge") - }) - it("Reverts if challenge is out of range", async function () { - const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() - const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) - await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) - await giriGiriBashi.setThreshold(DOMAIN_ID, 2) - await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) - const head = await giriGiriBashi.getHead(DOMAIN_ID) - - // revert on block before start ID - await expect(giriGiriBashi.callStatic.challengeAdapter(DOMAIN_ID, 0, mockAdapter.address, { value: BOND })) - .to.be.revertedWithCustomError(giriGiriBashi, "OutOfRange") - .withArgs(mockAdapter.address, 0) - - // revert on block too far in the future - const outOfRangeBlock = head + CHALLENGE_RANGE + 1 - await expect( - giriGiriBashi.callStatic.challengeAdapter(DOMAIN_ID, outOfRangeBlock, mockAdapter.address, { - value: BOND, - }), - ) - .to.be.revertedWithCustomError(giriGiriBashi, "OutOfRange") - .withArgs(mockAdapter.address, outOfRangeBlock) - - // revert on block too deep for adapter - const tooDeepBlock = 1 - await expect( - giriGiriBashi.callStatic.challengeAdapter(DOMAIN_ID, tooDeepBlock, mockAdapter.address, { - value: BOND, - }), - ) - .to.be.revertedWithCustomError(giriGiriBashi, "OutOfRange") - .withArgs(mockAdapter.address, tooDeepBlock) - - // make sure it can actually be successful / doesn't always revert - expect( - await giriGiriBashi.challengeAdapter(DOMAIN_ID, head - CHALLENGE_RANGE + 1, mockAdapter.address, { - value: BOND, - }), - ) - }) - it("Creates a challenge for the given adapter", async function () { - const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() - const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) - await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) - await giriGiriBashi.setThreshold(DOMAIN_ID, 2) - - await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) - const head = await giriGiriBashi.getHead(DOMAIN_ID) - expect( - await giriGiriBashi.challengeAdapter(DOMAIN_ID, head - CHALLENGE_RANGE + 1, mockAdapter.address, { - value: BOND, - }), - ) - }) - it("Emits the ChallengeCreated event", async function () { - const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() - const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) - await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) - await giriGiriBashi.setThreshold(DOMAIN_ID, 2) - await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) - const head = await giriGiriBashi.getHead(DOMAIN_ID) - - await expect( - giriGiriBashi.challengeAdapter(DOMAIN_ID, head - CHALLENGE_RANGE + 1, mockAdapter.address, { - value: BOND, - }), - ).to.emit(giriGiriBashi, "ChallengeCreated") - }) - }) - - describe("resolveChallenge()", function () { - it("Reverts if challenge is not found", async function () { - const { giriGiriBashi, mockAdapter, secondMockAdapter } = await setup() - await expect( - giriGiriBashi.callStatic.resolveChallenge(DOMAIN_ID, 5, mockAdapter.address, [secondMockAdapter.address]), - ).to.be.revertedWithCustomError(giriGiriBashi, "ChallengeNotFound") - }) - it("Reverts if adapter has not yet timed out", async function () { - const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() - const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) - await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) - await giriGiriBashi.setThreshold(DOMAIN_ID, 2) - - await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) - const head = await giriGiriBashi.getHead(DOMAIN_ID) - const challengeBlock = head - CHALLENGE_RANGE + 1 - await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { - value: BOND, - }) - const challengeId = await giriGiriBashi.getChallengeId(DOMAIN_ID, challengeBlock, mockAdapter.address) - const challenge = await giriGiriBashi.getChallenge(challengeId) - const increaseAmount = challenge.timestamp.add(settings.timeout).sub(1) - - await network.provider.send("evm_setNextBlockTimestamp", [increaseAmount.toHexString()]) - - await expect( - giriGiriBashi.resolveChallenge(DOMAIN_ID, challengeBlock, mockAdapter.address, [secondMockAdapter.address]), - ).to.be.revertedWithCustomError(giriGiriBashi, "AdapterHasNotYetTimedOut") - }) - it("Quarantines adapter and returns bond if adapter times out", async function () { - const { giriGiriBashi, mockAdapter, secondMockAdapter, settings, wallet } = await setup() - const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) - await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) - await giriGiriBashi.setThreshold(DOMAIN_ID, 2) - await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) - const head = await giriGiriBashi.getHead(DOMAIN_ID) - const challengeBlock = head - CHALLENGE_RANGE + 1 - - await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { - value: BOND, - }) - const challengeId = await giriGiriBashi.getChallengeId(DOMAIN_ID, challengeBlock, mockAdapter.address) - const challenge = await giriGiriBashi.getChallenge(challengeId) - const increaseAmount = challenge.timestamp.add(settings.timeout).add(1) - - await network.provider.send("evm_setNextBlockTimestamp", [increaseAmount.toHexString()]) - - const previousBalance = await ethers.provider.getBalance(wallet.address) - - await giriGiriBashi.resolveChallenge(DOMAIN_ID, challengeBlock, mockAdapter.address, [secondMockAdapter.address]) - - const newBalance = await ethers.provider.getBalance(wallet.address) - await expect(newBalance).to.be.greaterThan(previousBalance) - - const quarantined = (await giriGiriBashi.getSettings(DOMAIN_ID, mockAdapter.address)).quarantined - await expect(quarantined).to.equal(true) - }) - it("Keeps bond if _adapters + adapter equals threshold and agree", async function () { - const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() - const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) - await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) - await giriGiriBashi.setThreshold(DOMAIN_ID, 2) - - await giriGiriBashi.getHash(DOMAIN_ID, 1, adapters) - const head = await giriGiriBashi.getHead(DOMAIN_ID) - const challengeBlock = head.add(20) - await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { - value: BOND, - }) - - const balanceBefore = await ethers.provider.getBalance(ADDRESS_TWO) - await giriGiriBashi.resolveChallenge(DOMAIN_ID, challengeBlock, mockAdapter.address, [secondMockAdapter.address]) - expect(await ethers.provider.getBalance(ADDRESS_TWO)).to.equal(balanceBefore.add(BOND)) - const quarantined = (await giriGiriBashi.getSettings(DOMAIN_ID, mockAdapter.address)).quarantined - expect(quarantined).to.equal(false) - }) - it("Reverts if _adapters + adapter equals threshold and disagree", async function () { - const { giriGiriBashi, mockAdapter, secondMockAdapter, settings, hashi } = await setup() - const adapters = [mockAdapter.address, secondMockAdapter.address].sort(compareAddresses) - await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings]) - await giriGiriBashi.setThreshold(DOMAIN_ID, 2) - - await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) - const head = await giriGiriBashi.getHead(DOMAIN_ID) - const challengeBlock = head.add(1) - await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { - value: BOND, - }) - - await expect( - giriGiriBashi.resolveChallenge(DOMAIN_ID, challengeBlock, mockAdapter.address, [secondMockAdapter.address]), - ) - .to.be.revertedWithCustomError(hashi, "AdaptersDisagree") - .withArgs(mockAdapter.address, secondMockAdapter.address) - }) - it("Keeps bond if canonical hash matches hash reported by challenged adapter", async function () { - const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() - let adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address] - await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) - await giriGiriBashi.setThreshold(DOMAIN_ID, 2) - adapters = adapters.sort(compareAddresses) - - await giriGiriBashi.getHash(DOMAIN_ID, 1, adapters) - const head = await giriGiriBashi.getHead(DOMAIN_ID) - const challengeBlock = head.add(20) - await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { - value: BOND, - }) - - const previousBalance = await ethers.provider.getBalance(ADDRESS_TWO) - - await giriGiriBashi.resolveChallenge( - DOMAIN_ID, - challengeBlock, - mockAdapter.address, - [secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses), - ) - expect(await ethers.provider.getBalance(ADDRESS_TWO)).to.equal(previousBalance.add(BOND)) - const quarantined = (await giriGiriBashi.getSettings(DOMAIN_ID, mockAdapter.address)).quarantined - expect(quarantined).to.equal(false) - }) - it("Quarantines adapter and returns bond if challenged adapter disagrees with canonical hash", async function () { - const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() - let adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address] - await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) - await giriGiriBashi.setThreshold(DOMAIN_ID, 2) - adapters = adapters.sort(compareAddresses) - - await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) - const head = await giriGiriBashi.getHead(DOMAIN_ID) - const challengeBlock = head.add(1) - await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { - value: BOND, - }) - - await giriGiriBashi.resolveChallenge( - DOMAIN_ID, - challengeBlock, - mockAdapter.address, - [secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses), - ) - const quarantined = (await giriGiriBashi.getSettings(DOMAIN_ID, mockAdapter.address)).quarantined - await expect(quarantined).to.equal(true) - }) - it("Clears state after challenge is resolved", async function () { - const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() - let adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address] - await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) - await giriGiriBashi.setThreshold(DOMAIN_ID, 2) - adapters = adapters.sort(compareAddresses) - - await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) - const head = await giriGiriBashi.getHead(DOMAIN_ID) - const challengeBlock = head.add(1) - await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { - value: BOND, - }) - - await giriGiriBashi.resolveChallenge( - DOMAIN_ID, - challengeBlock, - mockAdapter.address, - [secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses), - ) - const quarantined = (await giriGiriBashi.getSettings(DOMAIN_ID, mockAdapter.address)).quarantined - expect(quarantined).to.equal(true) - const challengeId = await giriGiriBashi.getChallengeId(DOMAIN_ID, challengeBlock, mockAdapter.address) - const challenge = await giriGiriBashi.getChallenge(challengeId) - expect(challenge.challenger).to.equal(ADDRESS_ZERO) - expect(challenge.timestamp).to.equal(0) - expect(challenge.bond).to.equal(0) - }) - it("Emits ChallengeResolved() event", async function () { - const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings, wallet } = await setup() - const adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses) - await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) - await giriGiriBashi.setThreshold(DOMAIN_ID, 2) - - await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) - const head = await giriGiriBashi.getHead(DOMAIN_ID) - const challengeBlock = head.add(1) - await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { - value: BOND, - }) - - const challengeId = await giriGiriBashi.getChallengeId(DOMAIN_ID, challengeBlock, mockAdapter.address) - await expect( - giriGiriBashi.resolveChallenge( - DOMAIN_ID, - challengeBlock, - mockAdapter.address, - [secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses), - ), - ) - .to.emit(giriGiriBashi, "ChallengeResolved") - .withArgs(challengeId, DOMAIN_ID, challengeBlock, mockAdapter.address, wallet.address, BOND, true) - }) - }) - - describe("declareNoConfidence()", function () { - it("Reverts if too few adapters were provided to prove no confidence", async function () { - const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() - const adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses) - await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) - await giriGiriBashi.setThreshold(DOMAIN_ID, 2) - await expect(giriGiriBashi.callStatic.declareNoConfidence(DOMAIN_ID, 20, [mockAdapter.address])) - .to.be.revertedWithCustomError(giriGiriBashi, "CannotProveNoConfidence") - .withArgs(DOMAIN_ID, 20, [mockAdapter.address]) - }) - it("Reverts if the majority of adapters report the hash = 0", async function () { - const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() - const adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses) - await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) - await giriGiriBashi.setThreshold(DOMAIN_ID, 2) - await expect(giriGiriBashi.callStatic.declareNoConfidence(DOMAIN_ID, 25, adapters)) - .to.be.revertedWithCustomError(giriGiriBashi, "CannotProveNoConfidence") - .withArgs(DOMAIN_ID, 25, adapters) - }) - it("Reverts if any of the provided adapters agree", async function () { - const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() - const adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses) - await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) - await giriGiriBashi.setThreshold(DOMAIN_ID, 2) - await expect(giriGiriBashi.callStatic.declareNoConfidence(DOMAIN_ID, 22, adapters)).to.be.revertedWithCustomError( - giriGiriBashi, - "CannotProveNoConfidence", - ) - }) - it("Reverts if number of equal hashes + number of zero hashes are greater than the threshold", async function () { - const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() - const adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses) - await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) - await giriGiriBashi.setThreshold(DOMAIN_ID, 2) - await expect(giriGiriBashi.callStatic.declareNoConfidence(DOMAIN_ID, 23, adapters)) - .to.be.revertedWithCustomError(giriGiriBashi, "CannotProveNoConfidence") - .withArgs(DOMAIN_ID, 23, adapters) - }) - it("Clears state for domain", async function () { - const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() - const adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses) - await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) - await giriGiriBashi.setThreshold(DOMAIN_ID, 2) - expect(await giriGiriBashi.declareNoConfidence(DOMAIN_ID, 20, adapters)) - const domain = await giriGiriBashi.getDomain(DOMAIN_ID) - const challengeRange = await giriGiriBashi.getChallengeRange(DOMAIN_ID) - expect(domain.threshold).to.equal(ethers.constants.MaxUint256) - expect(challengeRange).to.equal(0) - }) - it("Emits NoConfidenceDeclared() event", async function () { - const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() - const adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses) - await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) - await expect(giriGiriBashi.declareNoConfidence(DOMAIN_ID, 20, adapters)) - .to.emit(giriGiriBashi, "NoConfidenceDeclared") - .withArgs(DOMAIN_ID) - }) - }) - - describe("getChallengeId()", function () { - it("Returns the correct challangeId", async function () { - const { giriGiriBashi } = await setup() - const expectedChallengeId = ethers.utils.solidityKeccak256( - ["uint256", "uint256", "address"], - [DOMAIN_ID, 1, ADDRESS_TWO], - ) - const reportedChallengeId = await giriGiriBashi.getChallengeId(DOMAIN_ID, 1, ADDRESS_TWO) - expect(expectedChallengeId).to.equal(reportedChallengeId) - }) - }) - - describe("setChallengeRange()", function () { - it("Reverts if challengeRange has already been set for given domain", async function () { - const { giriGiriBashi } = await setup() - await expect(giriGiriBashi.callStatic.setChallengeRange(DOMAIN_ID, CHALLENGE_RANGE)) - .to.be.revertedWithCustomError(giriGiriBashi, "ChallengeRangeAlreadySet") - .withArgs(DOMAIN_ID) - }) - it("Sets challenge range for given domain", async function () { - const { giriGiriBashi } = await setup() - expect(await giriGiriBashi.setChallengeRange(2, CHALLENGE_RANGE)) - const challengeRange = await giriGiriBashi.getChallengeRange(2) - expect(challengeRange).to.equal(CHALLENGE_RANGE) - }) - it("Emits the ChallengeRangeUpdated event", async function () { - const { giriGiriBashi } = await setup() - await expect(giriGiriBashi.setChallengeRange(2, CHALLENGE_RANGE)) - .to.emit(giriGiriBashi, "ChallengeRangeUpdated") - .withArgs(2, CHALLENGE_RANGE) - }) - }) - - describe("replaceQuarantinedAdapters()", function () { - it("Reverts if given arrays are unequal length", async function () { - const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() - await giriGiriBashi.enableAdapters( - DOMAIN_ID, - [mockAdapter.address, secondMockAdapter.address], - [settings, settings], - ) - await giriGiriBashi.setThreshold(DOMAIN_ID, 2) - await expect( - giriGiriBashi.replaceQuarantinedAdapters( - DOMAIN_ID, - [mockAdapter.address, secondMockAdapter.address], - [ADDRESS_ZERO], - [settings, settings], - ), - ).to.be.revertedWithCustomError(giriGiriBashi, "UnequalArrayLengths") - await expect( - giriGiriBashi.replaceQuarantinedAdapters( - DOMAIN_ID, - [mockAdapter.address], - [ADDRESS_ZERO, ADDRESS_ZERO], - [settings, settings], - ), - ).to.be.revertedWithCustomError(giriGiriBashi, "UnequalArrayLengths") - await expect( - giriGiriBashi.replaceQuarantinedAdapters( - DOMAIN_ID, - [mockAdapter.address, secondMockAdapter.address], - [ADDRESS_ZERO, ADDRESS_ZERO], - [settings], - ), - ).to.be.revertedWithCustomError(giriGiriBashi, "UnequalArrayLengths") - }) - it("Reverts if given adapter is not quarantined", async function () { - const { giriGiriBashi, mockAdapter, secondMockAdapter, settings } = await setup() - await giriGiriBashi.enableAdapters( - DOMAIN_ID, - [mockAdapter.address, secondMockAdapter.address], - [settings, settings], - ) - await giriGiriBashi.setThreshold(DOMAIN_ID, 2) - await expect( - giriGiriBashi.replaceQuarantinedAdapters( - DOMAIN_ID, - [mockAdapter.address, secondMockAdapter.address], - [ADDRESS_ZERO, ADDRESS_ZERO], - [settings, settings], - ), - ).to.be.revertedWithCustomError(giriGiriBashi, "AdapterNotQuarantined") - }) - it("Replaces adapters and initializes settings", async function () { - const { giriGiriBashi, mockAdapter, secondMockAdapter, thirdMockAdapter, settings } = await setup() - let adapters = [mockAdapter.address, secondMockAdapter.address, thirdMockAdapter.address] - await giriGiriBashi.enableAdapters(DOMAIN_ID, adapters, [settings, settings, settings]) - await giriGiriBashi.setThreshold(DOMAIN_ID, 2) - adapters = adapters.sort(compareAddresses) - - await giriGiriBashi.getHash(DOMAIN_ID, 21, adapters) - const head = await giriGiriBashi.getHead(DOMAIN_ID) - const challengeBlock = head.add(1) - await giriGiriBashi.challengeAdapter(DOMAIN_ID, challengeBlock, mockAdapter.address, { - value: BOND, - }) - - await giriGiriBashi.resolveChallenge( - DOMAIN_ID, - challengeBlock, - mockAdapter.address, - [secondMockAdapter.address, thirdMockAdapter.address].sort(compareAddresses), - ) - expect( - await giriGiriBashi.replaceQuarantinedAdapters(DOMAIN_ID, [mockAdapter.address], [ADDRESS_TWO], [settings]), - ) - const adapterSettings = await giriGiriBashi.getSettings(DOMAIN_ID, ADDRESS_TWO) - expect(adapterSettings.quarantined).to.deep.equal(settings.quarantined) - expect(adapterSettings.minimumBond).to.deep.equal(settings.minimumBond) - expect(adapterSettings.startId).to.deep.equal(settings.startId) - expect(adapterSettings.idDepth).to.deep.equal(settings.idDepth) - expect(adapterSettings.timeout).to.deep.equal(settings.timeout) - }) - }) -}) From b944a0708d5bfd519021f6d1ea0199cde769fc9a Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 10 Jun 2024 18:58:56 +0200 Subject: [PATCH 211/297] chore(evm): rn tests --- packages/evm/test/{04_Yaho.spec.ts => 03_Yaho.spec.ts} | 0 packages/evm/test/{05_Yaru.spec.ts => 04_Yaru.spec.ts} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename packages/evm/test/{04_Yaho.spec.ts => 03_Yaho.spec.ts} (100%) rename packages/evm/test/{05_Yaru.spec.ts => 04_Yaru.spec.ts} (100%) diff --git a/packages/evm/test/04_Yaho.spec.ts b/packages/evm/test/03_Yaho.spec.ts similarity index 100% rename from packages/evm/test/04_Yaho.spec.ts rename to packages/evm/test/03_Yaho.spec.ts diff --git a/packages/evm/test/05_Yaru.spec.ts b/packages/evm/test/04_Yaru.spec.ts similarity index 100% rename from packages/evm/test/05_Yaru.spec.ts rename to packages/evm/test/04_Yaru.spec.ts From ab67976279334d3501f81a9d470b69df2c94f944 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 10 Jun 2024 19:00:53 +0200 Subject: [PATCH 212/297] refactor(evm): rm _setDomainThreshold from ShuSho --- packages/evm/contracts/ownable/ShuSo.sol | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/evm/contracts/ownable/ShuSo.sol b/packages/evm/contracts/ownable/ShuSo.sol index d4522bda..4ff5bf0f 100644 --- a/packages/evm/contracts/ownable/ShuSo.sol +++ b/packages/evm/contracts/ownable/ShuSo.sol @@ -221,8 +221,4 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { _domains[domain].threshold = threshold; emit ThresholdSet(domain, threshold); } - - function _setDomainThreshold(uint256 domainId, uint256 threshold) internal { - _domains[domainId].threshold = threshold; - } } From 1074307d9c4ba85d3df0c0705db51a7b70b2c75f Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 13 Jun 2024 13:44:27 +0200 Subject: [PATCH 213/297] feat(evm): adds threshold and adapters to onMessage --- packages/evm/contracts/Yaru.sol | 13 ++++++++++--- packages/evm/contracts/interfaces/IJushin.sol | 10 ++++++++-- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/packages/evm/contracts/Yaru.sol b/packages/evm/contracts/Yaru.sol index 514cdc71..f3194c47 100644 --- a/packages/evm/contracts/Yaru.sol +++ b/packages/evm/contracts/Yaru.sol @@ -45,9 +45,16 @@ contract Yaru is IYaru, MessageIdCalculator, MessageHashCalculator, ReentrancyGu ) ) revert ThresholdNotMet(); - try IJushin(message.receiver).onMessage(SOURCE_CHAIN_ID, messageId, message.sender, message.data) returns ( - bytes memory returnData - ) { + try + IJushin(message.receiver).onMessage( + messageId, + SOURCE_CHAIN_ID, + message.sender, + message.threshold, + message.adapters, + message.data + ) + returns (bytes memory returnData) { returnDatas[i] = returnData; } catch { revert CallFailed(); diff --git a/packages/evm/contracts/interfaces/IJushin.sol b/packages/evm/contracts/interfaces/IJushin.sol index a8df2c76..c133fe1a 100644 --- a/packages/evm/contracts/interfaces/IJushin.sol +++ b/packages/evm/contracts/interfaces/IJushin.sol @@ -1,22 +1,28 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.0; +import { IAdapter } from "./IAdapter.sol"; + /** * @title IJushin */ interface IJushin { /** * @dev Handles the incoming message from a specified chain. - * @param sourceChainId - The ID of the origin chain from which the message originates. * @param messageId - The unique identifier of the message. + * @param sourceChainId - The ID of the origin chain from which the message originates. * @param sender - The address of the sender of the message on the origin chain. + * @param threshold - The minimum number of adapters required to have stored the same message. * @param data - The data contained in the message, in bytes. + * @param adapters - An array of `IAdapter` contracts. * @return result bytes at the user's choice */ function onMessage( - uint256 sourceChainId, uint256 messageId, + uint256 sourceChainId, address sender, + uint256 threshold, + IAdapter[] calldata adapters, bytes calldata data ) external returns (bytes memory); } From b35e7bbf2757929b24e93c1628c0fb1de1f66283 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 13 Jun 2024 13:44:57 +0200 Subject: [PATCH 214/297] refactor(evm): updates PingPong.onMessage --- packages/evm/contracts/test/PingPong.sol | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/evm/contracts/test/PingPong.sol b/packages/evm/contracts/test/PingPong.sol index 672b41f7..9c6f5dfa 100644 --- a/packages/evm/contracts/test/PingPong.sol +++ b/packages/evm/contracts/test/PingPong.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.20; import { IJushin } from "../interfaces/IJushin.sol"; +import { IAdapter } from "../interfaces/IAdapter.sol"; contract PingPong is IJushin { uint256 public count; @@ -13,7 +14,14 @@ contract PingPong is IJushin { emit Pong(count); } - function onMessage(uint256, uint256, address, bytes calldata) external returns (bytes memory) { + function onMessage( + uint256, + uint256, + address, + uint256, + IAdapter[] calldata, + bytes calldata + ) external returns (bytes memory) { count++; emit Pong(count); return abi.encode(0); From 08f762eedfed1eb33afaf6feb4f22ba8802c19c6 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 18 Jun 2024 18:20:19 +0200 Subject: [PATCH 215/297] chore(evm): reorgs dependencies and devDependencies --- packages/evm/package.json | 20 ++-- yarn.lock | 189 ++++++-------------------------------- 2 files changed, 38 insertions(+), 171 deletions(-) diff --git a/packages/evm/package.json b/packages/evm/package.json index 3f9de61f..5a7ec34b 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -20,7 +20,6 @@ "@nomicfoundation/hardhat-toolbox": "^2.0.0", "@nomiclabs/hardhat-ethers": "^2.2.1", "@nomiclabs/hardhat-etherscan": "^3.1.2", - "@openzeppelin/contracts-upgradeable": "^4.8.1", "@trivago/prettier-plugin-sort-imports": "^4.0.0", "@typechain/ethers-v5": "^10.1.1", "@typechain/hardhat": "^6.1.4", @@ -40,6 +39,8 @@ "ethers": "^5.7.2", "fs-extra": "^10.1.0", "hardhat": "2.19.4", + "hardhat-change-network": "^0.0.7", + "hardhat-deploy": "^0.11.31", "hardhat-gas-reporter": "^1.0.9", "lint-staged": "^13.0.4", "lodash": "^4.17.21", @@ -89,14 +90,13 @@ "typechain": "cross-env TS_NODE_TRANSPILE_ONLY=true hardhat typechain" }, "dependencies": { - "@axelar-network/axelar-gmp-sdk-solidity": "^5.6.2", - "@chainlink/contracts-ccip": "^0.7.6", - "@connext/interfaces": "^2.0.0", - "@hyperlane-xyz/core": "^3.1.10", - "@polytope-labs/solidity-merkle-trees": "^0.2.1", - "@routerprotocol/evm-gateway-contracts": "^1.1.13", - "hardhat-change-network": "^0.0.7", - "hardhat-deploy": "^0.11.31", - "solidity-rlp": "^2.0.8" + "@axelar-network/axelar-gmp-sdk-solidity": "5.6.2", + "@chainlink/contracts-ccip": "0.7.6", + "@connext/interfaces": "2.0.0", + "@hyperlane-xyz/core": "3.1.10", + "@openzeppelin/contracts-upgradeable": "4.8.1", + "@polytope-labs/solidity-merkle-trees": "0.2.1", + "@routerprotocol/evm-gateway-contracts": "1.1.13", + "solidity-rlp": "2.0.8" } } diff --git a/yarn.lock b/yarn.lock index e8e3d0bf..5f63e9d4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,10 +7,10 @@ resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz#d2a39395c587e092d77cbbc80acf956a54f38bf7" integrity sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q== -"@axelar-network/axelar-gmp-sdk-solidity@^5.6.2": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@axelar-network/axelar-gmp-sdk-solidity/-/axelar-gmp-sdk-solidity-5.8.0.tgz#449c6246b9f403af97a030b0a90b4f321c3a8a66" - integrity sha512-ThiCWK7lhwmsipgjKkw8c0z0ubB9toRMV9X0tRVOXHHSknKp5DCFfatbCwjpSC5GZRa+61ciTSqJNtCc7j9YoQ== +"@axelar-network/axelar-gmp-sdk-solidity@5.6.2": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@axelar-network/axelar-gmp-sdk-solidity/-/axelar-gmp-sdk-solidity-5.6.2.tgz#9a48a5ef7f00490898d8d33e0756b35416069fd2" + integrity sha512-lJT1Sily/to5jZHkE3rGtkb8qnurNTFnlz4HwbQec+MtqVgPkY3/SsiPTw7967hmZavAw02eiE1jFSW7XKksZQ== "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5": version "7.24.2" @@ -140,7 +140,7 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" -"@chainlink/contracts-ccip@^0.7.6": +"@chainlink/contracts-ccip@0.7.6": version "0.7.6" resolved "https://registry.yarnpkg.com/@chainlink/contracts-ccip/-/contracts-ccip-0.7.6.tgz#5bf4568a0bbf4e29d2e8c32348e5ecc6ced006d2" integrity sha512-yNbCBFpLs3R+ALymto9dQYKz3vatnjqYGu1pnMD0i2fHEMthiXe0+otaNCGNht6n8k7ruNaA0DNpz3F+2jHQXw== @@ -401,10 +401,10 @@ "@types/conventional-commits-parser" "^5.0.0" chalk "^5.3.0" -"@connext/interfaces@^2.0.0": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@connext/interfaces/-/interfaces-2.0.5.tgz#c9a5072a12ce7b6ce4e2f6eddfc8157aa0cb788f" - integrity sha512-b657mNb6z/kLGZMNhqDHJmYmPWa3QZYdtZ4TEjtrYe3289aO0dbRrMIEYd0fQVEtqNjPVl7YnwberfOmz1QehA== +"@connext/interfaces@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@connext/interfaces/-/interfaces-2.0.0.tgz#17f27a516315e40a440c3ef34db83834ad51917f" + integrity sha512-1dYh5T0Zx6zVvLWDHRRUuXZxTGLXeqefDK/zUQyNYQMmPWRBzA967wK0mtrU6drJq4VkO2gZ5QFE63mMDEz8TQ== "@cosmjs/encoding@^0.31.3": version "0.31.3" @@ -883,27 +883,25 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== -"@hyperlane-xyz/core@^3.1.10": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@hyperlane-xyz/core/-/core-3.10.0.tgz#94e98d92bbe301bb1bb9d6f22337a0b959720174" - integrity sha512-XgWojqkeXbF2iPomDJnnTwCjnDwUobFkKDiefgSRV6ZfM7geIDAZK9ezjsj4LBd0q1DxOtH/O4DMoncqXE4IGQ== +"@hyperlane-xyz/core@3.1.10": + version "3.1.10" + resolved "https://registry.yarnpkg.com/@hyperlane-xyz/core/-/core-3.1.10.tgz#7baab71079268bb8016b512b23d18a6b011086c4" + integrity sha512-kc7pypB9BPzIarHJCPVzbW52lUI5j8LluCp3zDmZICICXSfc6rTYVU93LosceBKoQTNGc7Ur/UgTHiOaHC4sYA== dependencies: "@eth-optimism/contracts" "^0.6.0" - "@hyperlane-xyz/utils" "3.10.0" - "@layerzerolabs/lz-evm-oapp-v2" "2.0.2" + "@hyperlane-xyz/utils" "3.1.10" "@openzeppelin/contracts" "^4.9.3" "@openzeppelin/contracts-upgradeable" "^v4.9.3" -"@hyperlane-xyz/utils@3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@hyperlane-xyz/utils/-/utils-3.10.0.tgz#db41d6b1eb2a66c44149cb94c81a984c546b35c5" - integrity sha512-Rs53EnZjiEHv5vcY9z2I0ewjOWAt4UDixoqN2DcYRt6yFw4dXvqEA3JfR8yis7fAU2kzH+WJPdLr2hcUPZKHaw== +"@hyperlane-xyz/utils@3.1.10": + version "3.1.10" + resolved "https://registry.yarnpkg.com/@hyperlane-xyz/utils/-/utils-3.1.10.tgz#0c4369499b8fa96504ace95d2d2ce8d6064cb934" + integrity sha512-6CvtPxuQpg7qpdbRQccPjavcbPXMTFIXG3Pc1ZfO2JI6eftLCpMFYOfLpwYhtXPCjjVqk2kgdwOUiN4NTfLp1Q== dependencies: "@cosmjs/encoding" "^0.31.3" "@solana/web3.js" "^1.78.0" bignumber.js "^9.1.1" ethers "^5.7.2" - pino "^8.19.0" "@jridgewell/gen-mapping@^0.3.5": version "0.3.5" @@ -945,30 +943,6 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@layerzerolabs/lz-evm-messagelib-v2@^2.0.2": - version "2.3.3" - resolved "https://registry.yarnpkg.com/@layerzerolabs/lz-evm-messagelib-v2/-/lz-evm-messagelib-v2-2.3.3.tgz#e4af0233dce94c76f064793dff364e32f0ba6f86" - integrity sha512-lDiYLpryEJOKBbmibIx1GRLqUjYBZ0yfzD2g7e2FMaDxbv0sEiINu22VMF3LoER10SDefYS43DSNRI6ns4QKvQ== - -"@layerzerolabs/lz-evm-oapp-v2@2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@layerzerolabs/lz-evm-oapp-v2/-/lz-evm-oapp-v2-2.0.2.tgz#89030de4dea0827a298fce60df65ecbc3544db0e" - integrity sha512-50hG8BKa1ywobIt2UVjI3ePQO9XBy6uT9YCN9i5IBfX6WrSZevPyDtL8OayzKtRQgkKTvprC82bdGzAoqh2RUw== - dependencies: - "@layerzerolabs/lz-evm-messagelib-v2" "^2.0.2" - "@layerzerolabs/lz-evm-protocol-v2" "^2.0.2" - "@layerzerolabs/lz-evm-v1-0.7" "^2.0.2" - -"@layerzerolabs/lz-evm-protocol-v2@^2.0.2": - version "2.3.3" - resolved "https://registry.yarnpkg.com/@layerzerolabs/lz-evm-protocol-v2/-/lz-evm-protocol-v2-2.3.3.tgz#4ec9eacc5e59124f784c2b77a4e023ff262fb4eb" - integrity sha512-u8RmXvC0AfmYgeNCGcfHLkOB9am5VQTQ+4YrX7AuRUuF6CpUNvJd8aaL30+NIGwZzgfE6+np83hj5rXmwlmlzA== - -"@layerzerolabs/lz-evm-v1-0.7@^2.0.2": - version "2.3.3" - resolved "https://registry.yarnpkg.com/@layerzerolabs/lz-evm-v1-0.7/-/lz-evm-v1-0.7-2.3.3.tgz#7fda83f6847a2c99ec3462d405d83cea642d56be" - integrity sha512-TltdE4+WaOPzZD2x4Y3LPWmJJKQd6j1cnqfPUo2fCLiP+t7nzh6AS+U/0LM02UI/ro/mtYENb3SEVdz+fwUw9A== - "@metamask/eth-sig-util@^4.0.0": version "4.0.1" resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" @@ -1303,7 +1277,12 @@ resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.7.3.tgz#f1d606e2827d409053f3e908ba4eb8adb1dd6995" integrity sha512-+wuegAMaLcZnLCJIvrVUDzA9z/Wp93f0Dla/4jJvIhijRrPabjQbZe6fWiECLaJyfn5ci9fqf9vTw3xpQOad2A== -"@openzeppelin/contracts-upgradeable@^4.7.3", "@openzeppelin/contracts-upgradeable@^4.8.1", "@openzeppelin/contracts-upgradeable@^v4.9.3": +"@openzeppelin/contracts-upgradeable@4.8.1": + version "4.8.1" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.8.1.tgz#363f7dd08f25f8f77e16d374350c3d6b43340a7a" + integrity sha512-1wTv+20lNiC0R07jyIAbHU7TNHKRwGiTGRfiNnA8jOWjKT98g5OgLpYWOi40Vgpk8SPLA9EvfJAbAeIyVn+7Bw== + +"@openzeppelin/contracts-upgradeable@^4.7.3", "@openzeppelin/contracts-upgradeable@^v4.9.3": version "4.9.6" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.6.tgz#38b21708a719da647de4bb0e4802ee235a0d24df" integrity sha512-m4iHazOsOCv1DgM7eD7GupTJ+NFVujRZt1wzddDPSVGpWdKq1SKkla5htKG7+IS4d2XOCtzkUNwRZ7Vq5aEUMA== @@ -1323,12 +1302,12 @@ resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.3.3.tgz#ff6ee919fc2a1abaf72b22814bfb72ed129ec137" integrity sha512-tDBopO1c98Yk7Cv/PZlHqrvtVjlgK5R4J6jxLwoO7qxK4xqOiZG+zSkIvGFpPZ0ikc3QOED3plgdqjgNTnBc7g== -"@polytope-labs/solidity-merkle-trees@^0.2.1": +"@polytope-labs/solidity-merkle-trees@0.2.1": version "0.2.1" resolved "https://registry.yarnpkg.com/@polytope-labs/solidity-merkle-trees/-/solidity-merkle-trees-0.2.1.tgz#7c3399c071ee246df92f37b8cebc9f545a915917" integrity sha512-aoJbZXWgIDgvwWEXQL3cEqFAXdTzaOxo3r373LMOtm8W/v9RnRNVW/gplWQGVZs+tvdwGP9Sp6ToKknIIPwQ5g== -"@routerprotocol/evm-gateway-contracts@^1.1.13": +"@routerprotocol/evm-gateway-contracts@1.1.13": version "1.1.13" resolved "https://registry.yarnpkg.com/@routerprotocol/evm-gateway-contracts/-/evm-gateway-contracts-1.1.13.tgz#609cd2a0cbcdb92e9a55fcdcb5cba0cc62fc11a7" integrity sha512-XCjODM/AKx/WLc8pa9UzlatBBS73xkGBXDbSsFxq4XQUqO8ao7Gcnp61n9CoW8QN7wDKev+6tiHagia+piDzMg== @@ -1970,13 +1949,6 @@ abitype@1.0.0: resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.0.tgz#237176dace81d90d018bebf3a45cb42f2a2d9e97" integrity sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ== -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" - abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3, abstract-level@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.4.tgz#3ad8d684c51cc9cbc9cf9612a7100b716c414b57" @@ -2225,11 +2197,6 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -atomic-sleep@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" - integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== - axios@^0.21.1: version "0.21.4" resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" @@ -3537,11 +3504,6 @@ ethjs-util@0.1.6, ethjs-util@^0.1.6: is-hex-prefixed "1.0.0" strip-hex-prefix "1.0.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== - eventemitter3@^4.0.7: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" @@ -3552,11 +3514,6 @@ eventemitter3@^5.0.1: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== -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.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" @@ -3647,11 +3604,6 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== -fast-redact@^3.1.1: - version "3.5.0" - resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.5.0.tgz#e9ea02f7e57d0cd8438180083e93077e496285e4" - integrity sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A== - fast-stable-stringify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz#5c5543462b22aeeefd36d05b34e51c78cb86d313" @@ -5496,11 +5448,6 @@ obliterator@^2.0.0: resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== -on-exit-leak-free@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz#fed195c9ebddb7d9e4c3842f93f281ac8dadd3b8" - integrity sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA== - once@1.x, once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -5764,36 +5711,6 @@ pify@^4.0.1: resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -pino-abstract-transport@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz#97f9f2631931e242da531b5c66d3079c12c9d1b5" - integrity sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q== - dependencies: - readable-stream "^4.0.0" - split2 "^4.0.0" - -pino-std-serializers@^6.0.0: - version "6.2.2" - resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz#d9a9b5f2b9a402486a5fc4db0a737570a860aab3" - integrity sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA== - -pino@^8.19.0: - version "8.21.0" - resolved "https://registry.yarnpkg.com/pino/-/pino-8.21.0.tgz#e1207f3675a2722940d62da79a7a55a98409f00d" - integrity sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q== - dependencies: - atomic-sleep "^1.0.0" - fast-redact "^3.1.1" - on-exit-leak-free "^2.1.0" - pino-abstract-transport "^1.2.0" - pino-std-serializers "^6.0.0" - process-warning "^3.0.0" - quick-format-unescaped "^4.0.3" - real-require "^0.2.0" - safe-stable-stringify "^2.3.1" - sonic-boom "^3.7.0" - thread-stream "^2.6.0" - pinst@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pinst/-/pinst-3.0.0.tgz#80dec0a85f1f993c6084172020f3dbf512897eec" @@ -5845,16 +5762,6 @@ process-nextick-args@~2.0.0: 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-warning@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-3.0.0.tgz#96e5b88884187a1dce6f5c3166d611132058710b" - integrity sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ== - -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== - promise@^8.0.0: version "8.3.0" resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" @@ -5889,11 +5796,6 @@ queue-microtask@^1.2.2, queue-microtask@^1.2.3: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -quick-format-unescaped@^4.0.3: - version "4.0.4" - resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" - integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== - quick-lru@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" @@ -5957,17 +5859,6 @@ readable-stream@^2.2.2: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^4.0.0: - 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" - readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -5980,11 +5871,6 @@ readonly-date@^1.0.0: resolved "https://registry.yarnpkg.com/readonly-date/-/readonly-date-1.0.0.tgz#5af785464d8c7d7c40b9d738cbde8c646f97dcd9" integrity sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ== -real-require@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.2.0.tgz#209632dea1810be2ae063a6ac084fee7e33fba78" - integrity sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg== - rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" @@ -6476,18 +6362,11 @@ solidity-coverage@^0.8.2: shelljs "^0.8.3" web3-utils "^1.3.6" -solidity-rlp@^2.0.8: +solidity-rlp@2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/solidity-rlp/-/solidity-rlp-2.0.8.tgz#1548370b690ef06dbb62af06b7675bc86b19bbe3" integrity sha512-gzYzHoFKRH1ydJeCfzm3z/BvKrZGK/V9+qbOlNbBcRAYeizjCdDNhLTTE8iIJrHqsRrZRSOo+7mhbnxoBoZvJQ== -sonic-boom@^3.7.0: - version "3.8.1" - resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-3.8.1.tgz#d5ba8c4e26d6176c9a1d14d549d9ff579a163422" - integrity sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg== - dependencies: - atomic-sleep "^1.0.0" - source-map-support@^0.5.13: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" @@ -6553,11 +6432,6 @@ split2@^3.0.0, split2@^3.2.2: dependencies: readable-stream "^3.0.0" -split2@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" - integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== - sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -6616,7 +6490,7 @@ string-width@^5.0.0, string-width@^5.0.1: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string_decoder@^1.1.1, string_decoder@^1.3.0: +string_decoder@^1.1.1: 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== @@ -6797,13 +6671,6 @@ then-request@^6.0.0: promise "^8.0.0" qs "^6.4.0" -thread-stream@^2.6.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-2.7.0.tgz#d8a8e1b3fd538a6cca8ce69dbe5d3d097b601e11" - integrity sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw== - dependencies: - real-require "^0.2.0" - through2@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" From 382ea41a7c5b2f08ae4e89727b3785dda100fff4 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 18 Jun 2024 18:27:43 +0200 Subject: [PATCH 216/297] refactor(evm): marks getAdapterLink and getDomain as external --- packages/evm/contracts/ownable/ShuSo.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/evm/contracts/ownable/ShuSo.sol b/packages/evm/contracts/ownable/ShuSo.sol index 4ff5bf0f..05321dc4 100644 --- a/packages/evm/contracts/ownable/ShuSo.sol +++ b/packages/evm/contracts/ownable/ShuSo.sol @@ -36,7 +36,7 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { } /// @inheritdoc IShuSho - function getAdapterLink(uint256 domain, IAdapter adapter) public view returns (Link memory) { + function getAdapterLink(uint256 domain, IAdapter adapter) external view returns (Link memory) { return _adapters[domain][adapter]; } @@ -52,7 +52,7 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { } /// @inheritdoc IShuSho - function getDomain(uint256 domain) public view returns (Domain memory) { + function getDomain(uint256 domain) external view returns (Domain memory) { return _domains[domain]; } From 921ac41a6ee787db7108d9377fb51fce3762b6ca Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 19 Jun 2024 07:32:23 +0200 Subject: [PATCH 217/297] feat(evm): adds threshold to enableAdapters to avoid multiple hashes when threshold < half count --- .../evm/contracts/interfaces/IShoyuBashi.sol | 5 +- packages/evm/contracts/ownable/ShoyuBashi.sol | 4 +- packages/evm/contracts/ownable/ShuSo.sol | 7 +- packages/evm/test/02_ShoyuBashi.spec.ts | 80 ++++++++++--------- 4 files changed, 52 insertions(+), 44 deletions(-) diff --git a/packages/evm/contracts/interfaces/IShoyuBashi.sol b/packages/evm/contracts/interfaces/IShoyuBashi.sol index 96a0ea9e..63071064 100644 --- a/packages/evm/contracts/interfaces/IShoyuBashi.sol +++ b/packages/evm/contracts/interfaces/IShoyuBashi.sol @@ -22,10 +22,11 @@ interface IShoyuBashi is IShuSho { * @dev Enables the given adapters for a given domain. * @param domain - Uint256 identifier for the domain for which to set adapters. * @param adapters - Array of adapter addresses. + * @param threshold - Uint256 threshold to set for the given domain. * @notice Only callable by the owner of this contract. - * @notice Reverts if adapters are out of order or contain duplicates. + * @notice Reverts if adapters are out of order, contain duplicates or if the threshold is not higher than half the count of the adapters */ - function enableAdapters(uint256 domain, IAdapter[] memory adapters) external; + function enableAdapters(uint256 domain, IAdapter[] memory adapters, uint256 threshold) external; /** * @dev Returns the hash unanimously agreed upon by ALL of the enabled adapters. diff --git a/packages/evm/contracts/ownable/ShoyuBashi.sol b/packages/evm/contracts/ownable/ShoyuBashi.sol index 7a6c5ae0..ca6a5b83 100644 --- a/packages/evm/contracts/ownable/ShoyuBashi.sol +++ b/packages/evm/contracts/ownable/ShoyuBashi.sol @@ -19,8 +19,8 @@ contract ShoyuBashi is IShoyuBashi, ShuSo { } /// @inheritdoc IShoyuBashi - function enableAdapters(uint256 domain, IAdapter[] memory adapters) public { - _enableAdapters(domain, adapters); + function enableAdapters(uint256 domain, IAdapter[] memory adapters, uint256 threshold) public { + _enableAdapters(domain, adapters, threshold); } /// @inheritdoc IShoyuBashi diff --git a/packages/evm/contracts/ownable/ShuSo.sol b/packages/evm/contracts/ownable/ShuSo.sol index 05321dc4..5933c70f 100644 --- a/packages/evm/contracts/ownable/ShuSo.sol +++ b/packages/evm/contracts/ownable/ShuSo.sol @@ -97,10 +97,11 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { * @dev Enables the given adapters for a given domain. * @param domain - Uint256 identifier for the domain for which to set adapters. * @param adapters - Array of adapter addresses. - * @notice Reverts if adapters are out of order or contain duplicates. + * @param threshold - Uint256 threshold to set for the given domain. + * @notice Reverts if adapters are out of order, contain duplicates or if the threshold is not higher than half the count of the adapters * @notice Only callable by the owner of this contract. */ - function _enableAdapters(uint256 domain, IAdapter[] memory adapters) internal onlyOwner { + function _enableAdapters(uint256 domain, IAdapter[] memory adapters, uint256 threshold) internal onlyOwner { if (_adapters[domain][LIST_END].next == IAdapter(address(0))) { _adapters[domain][LIST_END].next = LIST_END; _adapters[domain][LIST_END].previous = LIST_END; @@ -117,6 +118,8 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { _adapters[domain][adapter].next = LIST_END; _domains[domain].count++; } + if (threshold < (_domains[domain].count / 2) + 1) revert InvalidThreshold(threshold); + _domains[domain].threshold = threshold; emit AdaptersEnabled(domain, adapters); } diff --git a/packages/evm/test/02_ShoyuBashi.spec.ts b/packages/evm/test/02_ShoyuBashi.spec.ts index 7cc0faa3..ce833788 100644 --- a/packages/evm/test/02_ShoyuBashi.spec.ts +++ b/packages/evm/test/02_ShoyuBashi.spec.ts @@ -80,8 +80,7 @@ describe("ShoyuBashi", function () { }) it("Reverts if threshold is already set", async function () { const { shoyuBashi } = await setup() - await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) - await shoyuBashi.setThreshold(DOMAIN_ID, 2) + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE], 2) await expect(shoyuBashi.setThreshold(DOMAIN_ID, 2)).to.be.revertedWithCustomError( shoyuBashi, "DuplicateThreshold", @@ -89,14 +88,13 @@ describe("ShoyuBashi", function () { }) it("Sets threshold for the given ChainID", async function () { const { shoyuBashi } = await setup() - await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) - expect(await shoyuBashi.setThreshold(DOMAIN_ID, 2)) + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE], 2) expect((await shoyuBashi.getDomain(DOMAIN_ID)).threshold).to.equal(2) }) it("Emits HashiSet() event", async function () { const { shoyuBashi } = await setup() - await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) - await expect(shoyuBashi.setThreshold(DOMAIN_ID, 2)).to.emit(shoyuBashi, "ThresholdSet").withArgs(DOMAIN_ID, 2) + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE], 2) + await expect(shoyuBashi.setThreshold(DOMAIN_ID, 3)).to.emit(shoyuBashi, "ThresholdSet").withArgs(DOMAIN_ID, 3) }) }) @@ -104,42 +102,42 @@ describe("ShoyuBashi", function () { it("Reverts if called by non-owner account", async function () { const { shoyuBashi } = await setup() await shoyuBashi.transferOwnership(shoyuBashi.address) - await expect(shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO])).to.be.revertedWith( + await expect(shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO], 1)).to.be.revertedWith( "Ownable: caller is not the owner", ) }) it("Reverts if given an empty array", async function () { const { shoyuBashi } = await setup() - await expect(shoyuBashi.enableAdapters(DOMAIN_ID, [])).to.be.revertedWithCustomError( + await expect(shoyuBashi.enableAdapters(DOMAIN_ID, [], 1)).to.be.revertedWithCustomError( shoyuBashi, "NoAdaptersGiven", ) }) it("Reverts if given adapter is Address(0)", async function () { const { shoyuBashi } = await setup() - await expect(shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_ZERO])).to.be.revertedWithCustomError( + await expect(shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_ZERO], 1)).to.be.revertedWithCustomError( shoyuBashi, "InvalidAdapter", ) }) it("Reverts if given adapter is Address(1) / LIST_END", async function () { const { shoyuBashi } = await setup() - await expect(shoyuBashi.enableAdapters(DOMAIN_ID, [LIST_END])).to.be.revertedWithCustomError( + await expect(shoyuBashi.enableAdapters(DOMAIN_ID, [LIST_END], 1)).to.be.revertedWithCustomError( shoyuBashi, "InvalidAdapter", ) }) it("Reverts if adapter is already enabled", async function () { const { shoyuBashi } = await setup() - await expect(shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO])) - await expect(shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO])).to.be.revertedWithCustomError( + await expect(shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO], 1)) + await expect(shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO], 1)).to.be.revertedWithCustomError( shoyuBashi, "AdapterAlreadyEnabled", ) }) it("Enables the given adapters", async function () { const { shoyuBashi } = await setup() - await expect(shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE])) + await expect(shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE], 2)) const adapters = await shoyuBashi.getAdapters(DOMAIN_ID) await expect(adapters[0]).to.equal(ADDRESS_TWO) await expect(adapters[1]).to.equal(ADDRESS_THREE) @@ -152,7 +150,7 @@ describe("ShoyuBashi", function () { }) it("Emits AdaptersEnabled() event", async function () { const { shoyuBashi } = await setup() - await expect(shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE])) + await expect(shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE], 2)) .to.emit(shoyuBashi, "AdaptersEnabled") .withArgs(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) }) @@ -175,7 +173,7 @@ describe("ShoyuBashi", function () { }) it("Reverts if given an empty array", async function () { const { shoyuBashi } = await setup() - await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO]) + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO], 1) await expect(shoyuBashi.disableAdapters(DOMAIN_ID, [])).to.be.revertedWithCustomError( shoyuBashi, "NoAdaptersGiven", @@ -183,7 +181,7 @@ describe("ShoyuBashi", function () { }) it("Reverts if given adapter is Address(0)", async function () { const { shoyuBashi } = await setup() - await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO]) + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO], 1) await expect(shoyuBashi.disableAdapters(DOMAIN_ID, [ADDRESS_ZERO])).to.be.revertedWithCustomError( shoyuBashi, "InvalidAdapter", @@ -191,7 +189,7 @@ describe("ShoyuBashi", function () { }) it("Reverts if given adapter is Address(1) / LIST_END", async function () { const { shoyuBashi } = await setup() - await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO]) + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO], 1) await expect(shoyuBashi.disableAdapters(DOMAIN_ID, [LIST_END])).to.be.revertedWithCustomError( shoyuBashi, "InvalidAdapter", @@ -199,7 +197,7 @@ describe("ShoyuBashi", function () { }) it("Reverts if adapter is not enabled", async function () { const { shoyuBashi } = await setup() - await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO]) + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO], 1) await expect(shoyuBashi.disableAdapters(DOMAIN_ID, [ADDRESS_THREE, ADDRESS_TWO])).to.be.revertedWithCustomError( shoyuBashi, "AdapterNotEnabled", @@ -207,18 +205,27 @@ describe("ShoyuBashi", function () { }) it("Disables the given adapters", async function () { const { shoyuBashi } = await setup() - await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE], 2) await shoyuBashi.disableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) const adapters = await shoyuBashi.getAdapters(DOMAIN_ID) await expect(adapters[0]).to.equal(undefined) }) it("Emits AdaptersDisabled() event", async function () { const { shoyuBashi } = await setup() - await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE], 2) await expect(shoyuBashi.disableAdapters(DOMAIN_ID, [ADDRESS_THREE, ADDRESS_TWO])) .to.emit(shoyuBashi, "AdaptersDisabled") .withArgs(DOMAIN_ID, [ADDRESS_THREE, ADDRESS_TWO]) }) + it("Disables an adapter, sets the new thresholds and gets an agreed hash", async function () { + const { shoyuBashi, mockAdapter, anotherAdapter } = await setup() + await shoyuBashi.enableAdapters(DOMAIN_ID, [mockAdapter.address, anotherAdapter.address, ADDRESS_THREE], 3) + await expect(shoyuBashi.disableAdapters(DOMAIN_ID, [ADDRESS_THREE])) + .to.emit(shoyuBashi, "AdaptersDisabled") + .withArgs(DOMAIN_ID, [ADDRESS_THREE]) + await shoyuBashi.setThreshold(DOMAIN_ID, 2) + expect(await shoyuBashi.getHash(DOMAIN_ID, 1, [mockAdapter.address, anotherAdapter.address])).to.equal(HASH_GOOD) + }) }) describe("getAdapters()", function () { @@ -226,13 +233,13 @@ describe("ShoyuBashi", function () { const { shoyuBashi } = await setup() const adapters = await shoyuBashi.getAdapters(DOMAIN_ID) expect(adapters[0]).to.equal(undefined) - await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE], 2) await expect(shoyuBashi.disableAdapters(DOMAIN_ID, [ADDRESS_THREE, ADDRESS_TWO])) expect(adapters[0]).to.equal(undefined) }) it("Returns array of enabled adapters", async function () { const { shoyuBashi } = await setup() - await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE], 2) const adapters = await shoyuBashi.getAdapters(DOMAIN_ID) expect(adapters[0]).to.equal(ADDRESS_TWO) expect(adapters[1]).to.equal(ADDRESS_THREE) @@ -242,14 +249,13 @@ describe("ShoyuBashi", function () { describe("getThresholdAndCount()", function () { it("Returns threshold equal to count if threshold not explicitly set", async function () { const { shoyuBashi } = await setup() - await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE], 2) const [threshold, count] = await shoyuBashi.getThresholdAndCount(DOMAIN_ID) await expect(threshold).to.equal(count) }) it("Returns threshold and count", async function () { const { shoyuBashi } = await setup() - await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) - await shoyuBashi.setThreshold(DOMAIN_ID, 2) + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE], 2) const [threshold] = await shoyuBashi.getThresholdAndCount(DOMAIN_ID) await expect(threshold).to.equal(2) }) @@ -265,8 +271,7 @@ describe("ShoyuBashi", function () { }) it("Reverts if threshold is not met", async function () { const { shoyuBashi, mockAdapter } = await setup() - await shoyuBashi.enableAdapters(DOMAIN_ID, [mockAdapter.address]) - await shoyuBashi.setThreshold(DOMAIN_ID, 2) + await shoyuBashi.enableAdapters(DOMAIN_ID, [mockAdapter.address], 2) await expect(shoyuBashi.getUnanimousHash(DOMAIN_ID, 1)).to.be.revertedWithCustomError( shoyuBashi, "ThresholdNotMet", @@ -274,7 +279,7 @@ describe("ShoyuBashi", function () { }) it("Returns unanimous agreed on hash", async function () { const { shoyuBashi, mockAdapter, anotherAdapter } = await setup() - await shoyuBashi.enableAdapters(DOMAIN_ID, [mockAdapter.address, anotherAdapter.address]) + await shoyuBashi.enableAdapters(DOMAIN_ID, [mockAdapter.address, anotherAdapter.address], 2) expect(await shoyuBashi.getUnanimousHash(DOMAIN_ID, 1)).to.equal(HASH_GOOD) }) }) @@ -289,7 +294,7 @@ describe("ShoyuBashi", function () { }) it("Reverts if threshold is not met", async function () { const { shoyuBashi, mockAdapter, anotherAdapter } = await setup() - await shoyuBashi.enableAdapters(DOMAIN_ID, [mockAdapter.address, anotherAdapter.address]) + await shoyuBashi.enableAdapters(DOMAIN_ID, [mockAdapter.address, anotherAdapter.address], 2) await shoyuBashi.setThreshold(DOMAIN_ID, 3) await expect(shoyuBashi.getThresholdHash(DOMAIN_ID, 2)).to.be.revertedWithCustomError( shoyuBashi, @@ -298,7 +303,7 @@ describe("ShoyuBashi", function () { }) it("Reverts if threshold returns bytes(0)", async function () { const { shoyuBashi, mockAdapter, anotherAdapter } = await setup() - await shoyuBashi.enableAdapters(DOMAIN_ID, [mockAdapter.address, anotherAdapter.address]) + await shoyuBashi.enableAdapters(DOMAIN_ID, [mockAdapter.address, anotherAdapter.address], 2) await expect(shoyuBashi.getThresholdHash(DOMAIN_ID, 0)).to.be.revertedWithCustomError( shoyuBashi, "ThresholdNotMet", @@ -306,7 +311,7 @@ describe("ShoyuBashi", function () { }) it("Returns unanimous agreed on hash", async function () { const { shoyuBashi, mockAdapter, anotherAdapter } = await setup() - await shoyuBashi.enableAdapters(DOMAIN_ID, [mockAdapter.address, anotherAdapter.address]) + await shoyuBashi.enableAdapters(DOMAIN_ID, [mockAdapter.address, anotherAdapter.address], 2) expect(await shoyuBashi.getThresholdHash(DOMAIN_ID, 1)).to.equal(HASH_GOOD) }) }) @@ -314,8 +319,7 @@ describe("ShoyuBashi", function () { describe("getHash()", function () { it("Reverts if threshold is not met", async function () { const { shoyuBashi, mockAdapter } = await setup() - await shoyuBashi.enableAdapters(DOMAIN_ID, [mockAdapter.address]) - await shoyuBashi.setThreshold(DOMAIN_ID, 2) + await shoyuBashi.enableAdapters(DOMAIN_ID, [mockAdapter.address], 2) await expect(shoyuBashi.getHash(DOMAIN_ID, 1, [mockAdapter.address])).to.be.revertedWithCustomError( shoyuBashi, "ThresholdNotMet", @@ -323,7 +327,7 @@ describe("ShoyuBashi", function () { }) it("Reverts if given adapters are duplicate", async function () { const { shoyuBashi } = await setup() - await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE], 2) await expect(shoyuBashi.getHash(DOMAIN_ID, 1, [ADDRESS_TWO, ADDRESS_TWO])).to.be.revertedWithCustomError( shoyuBashi, "DuplicateOrOutOfOrderAdapters", @@ -331,7 +335,7 @@ describe("ShoyuBashi", function () { }) it("Reverts if given adapters are out of order", async function () { const { shoyuBashi } = await setup() - await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE]) + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO, ADDRESS_THREE], 2) await expect(shoyuBashi.getHash(DOMAIN_ID, 1, [ADDRESS_THREE, ADDRESS_TWO])).to.be.revertedWithCustomError( shoyuBashi, "DuplicateOrOutOfOrderAdapters", @@ -339,7 +343,7 @@ describe("ShoyuBashi", function () { }) it("Reverts if given adapter is not enabled", async function () { const { shoyuBashi } = await setup() - await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO]) + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO], 2) await expect(shoyuBashi.getHash(DOMAIN_ID, 1, [ADDRESS_TWO, ADDRESS_THREE])).to.be.revertedWithCustomError( shoyuBashi, "InvalidAdapter", @@ -354,12 +358,12 @@ describe("ShoyuBashi", function () { }) it("Reverts if no adapters are given", async function () { const { shoyuBashi } = await setup() - await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO]) + await shoyuBashi.enableAdapters(DOMAIN_ID, [ADDRESS_TWO], 2) await expect(shoyuBashi.getHash(DOMAIN_ID, 1, [])).to.be.revertedWithCustomError(shoyuBashi, "NoAdaptersGiven") }) it("Returns unanimous agreed on hash", async function () { const { shoyuBashi, mockAdapter, anotherAdapter } = await setup() - await shoyuBashi.enableAdapters(DOMAIN_ID, [mockAdapter.address, anotherAdapter.address]) + await shoyuBashi.enableAdapters(DOMAIN_ID, [mockAdapter.address, anotherAdapter.address], 2) let adapters if (anotherAdapter.address > mockAdapter.address) { adapters = [mockAdapter.address, anotherAdapter.address] From f64d173d33f0ba4937c0297c963a7e7ffb60aac7 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 19 Jun 2024 07:43:04 +0200 Subject: [PATCH 218/297] refactor(evm): rm setHashi from ShuSo --- .../evm/contracts/interfaces/IShoyuBashi.sol | 7 ++++++ packages/evm/contracts/ownable/ShoyuBashi.sol | 23 ++++++++++--------- packages/evm/contracts/ownable/ShuSo.sol | 4 +--- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/packages/evm/contracts/interfaces/IShoyuBashi.sol b/packages/evm/contracts/interfaces/IShoyuBashi.sol index 63071064..9ab32094 100644 --- a/packages/evm/contracts/interfaces/IShoyuBashi.sol +++ b/packages/evm/contracts/interfaces/IShoyuBashi.sol @@ -71,4 +71,11 @@ interface IShoyuBashi is IShuSho { * @notice Reverts if the threshold is already set to the given value. */ function setThreshold(uint256 domain, uint256 threshold) external; + + /** + * @dev Sets the address of the IHashi contract. + * @param hashi - Address of the hashi contract. + * @notice Only callable by the owner of this contract. + */ + function setHashi(IHashi hashi) external; } diff --git a/packages/evm/contracts/ownable/ShoyuBashi.sol b/packages/evm/contracts/ownable/ShoyuBashi.sol index ca6a5b83..9581db9f 100644 --- a/packages/evm/contracts/ownable/ShoyuBashi.sol +++ b/packages/evm/contracts/ownable/ShoyuBashi.sol @@ -3,43 +3,44 @@ pragma solidity ^0.8.20; import { ShuSo } from "./ShuSo.sol"; import { IAdapter } from "../interfaces/IAdapter.sol"; -import { IHashi } from "../interfaces/IHashi.sol"; import { IShoyuBashi } from "../interfaces/IShoyuBashi.sol"; +import { IHashi } from "../interfaces/IHashi.sol"; contract ShoyuBashi is IShoyuBashi, ShuSo { constructor(address _owner, address _hashi) ShuSo(_owner, _hashi) {} // solhint-disable no-empty-blocks - function setHashi(IHashi _hashi) public override { - _setHashi(_hashi); - } - /// @inheritdoc IShoyuBashi - function setThreshold(uint256 domain, uint256 threshold) public { + function setThreshold(uint256 domain, uint256 threshold) external { _setThreshold(domain, threshold); } /// @inheritdoc IShoyuBashi - function enableAdapters(uint256 domain, IAdapter[] memory adapters, uint256 threshold) public { + function enableAdapters(uint256 domain, IAdapter[] memory adapters, uint256 threshold) external { _enableAdapters(domain, adapters, threshold); } /// @inheritdoc IShoyuBashi - function disableAdapters(uint256 domain, IAdapter[] memory adapters) public { + function disableAdapters(uint256 domain, IAdapter[] memory adapters) external { _disableAdapters(domain, adapters); } /// @inheritdoc IShoyuBashi - function getUnanimousHash(uint256 domain, uint256 id) public view returns (bytes32) { + function getUnanimousHash(uint256 domain, uint256 id) external view returns (bytes32) { return _getUnanimousHash(domain, id); } /// @inheritdoc IShoyuBashi - function getThresholdHash(uint256 domain, uint256 id) public view returns (bytes32) { + function getThresholdHash(uint256 domain, uint256 id) external view returns (bytes32) { return _getThresholdHash(domain, id); } /// @inheritdoc IShoyuBashi - function getHash(uint256 domain, uint256 id, IAdapter[] memory adapters) public view returns (bytes32) { + function getHash(uint256 domain, uint256 id, IAdapter[] memory adapters) external view returns (bytes32) { return _getHash(domain, id, adapters); } + + /// @inheritdoc IShoyuBashi + function setHashi(IHashi _hashi) external { + _setHashi(_hashi); + } } diff --git a/packages/evm/contracts/ownable/ShuSo.sol b/packages/evm/contracts/ownable/ShuSo.sol index 5933c70f..fa1488e0 100644 --- a/packages/evm/contracts/ownable/ShuSo.sol +++ b/packages/evm/contracts/ownable/ShuSo.sol @@ -21,7 +21,7 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { function init(bytes memory initParams) public initializer { (address _owner, IHashi _hashi) = abi.decode(initParams, (address, IHashi)); __Ownable_init(); - setHashi(_hashi); + _setHashi(_hashi); transferOwnership(_owner); emit Init(_owner, _hashi); } @@ -65,8 +65,6 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { return (threshold, count); } - function setHashi(IHashi _hashi) public virtual; - /** * @dev Disables the given adapters for a given domain. * @param domain - Uint256 identifier for the domain for which to set adapters. From efd21e80bbc0f8e40eed3aae3ca5154e4a77b801 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 19 Jun 2024 13:47:52 +0200 Subject: [PATCH 219/297] refactor(evm): rn a couple of comments and tests --- packages/evm/contracts/interfaces/IYaho.sol | 6 +++--- packages/evm/test/03_Yaho.spec.ts | 2 +- packages/evm/test/04_Yaru.spec.ts | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/evm/contracts/interfaces/IYaho.sol b/packages/evm/contracts/interfaces/IYaho.sol index e765f436..08d1b0b5 100644 --- a/packages/evm/contracts/interfaces/IYaho.sol +++ b/packages/evm/contracts/interfaces/IYaho.sol @@ -36,7 +36,7 @@ interface IYaho is IMessageHashCalculator, IMessageIdCalculator { * @param reporters - An array of `IReporter` contracts (not actively used in this step). * @param adapters - An array of `IAdapter` contracts (for later validation use). * @return messageId A unique identifier for the dispatched message, used for tracking and subsequent validation. - * @notice If you plan to use an Adapter that does not have a corresponding Reporter (such as a zk adapter), you need to specify only the adapter and use address(0) as the reporter, since the adapter will verify the MessageDispatched event emitted by Yaho. + * @notice If you plan to use an Adapter that does not have a corresponding Reporter (such as an adapter that uses a light client), you need to specify only the adapter and use address(0) as the reporter, since the adapter will verify the MessageDispatched event emitted by Yaho. * */ function dispatchMessage( @@ -57,7 +57,7 @@ interface IYaho is IMessageHashCalculator, IMessageIdCalculator { * @param reporters - An array of `IReporter` contracts (not actively used in this step). * @param adapters - An array of `IAdapter` contracts (for later validation use). * @return (messageId, result) A unique identifier for the dispatched message and an array of byte arrays, where each element is the result of dispatching a respective message to the corresponding Reporter. - * @notice If you plan to use an Adapter that does not have a corresponding Reporter (such as a zk adapter), you need to specify only the adapter and use address(0) as the reporter, since the adapter will verify the MessageDispatched event emitted by Yaho. + * @notice If you plan to use an Adapter that does not have a corresponding Reporter (such as an adapter that uses a light client), you need to specify only the adapter and use address(0) as the reporter, since the adapter will verify the MessageDispatched event emitted by Yaho. */ function dispatchMessageToAdapters( uint256 targetChainId, @@ -77,7 +77,7 @@ interface IYaho is IMessageHashCalculator, IMessageIdCalculator { * @param reporters - An array of `IReporter` contracts for reporting the status of each message. * @param adapters - An array of `IAdapter` contracts used for the validation of each message. * @return (messageIds, result) An array of unique identifiers for the dispatched messages and an array of bytes32 arrays, where each element is the result of dispatching a respective message to the corresponding Reporter. - * @notice If you plan to use an Adapter that does not have a corresponding Reporter (such as a zk adapter), you need to specify only the adapter and use address(0) as the reporter, since the adapter will verify the MessageDispatched event emitted by Yaho. + * @notice If you plan to use an Adapter that does not have a corresponding Reporter (such as an adapter that uses a light client), you need to specify only the adapter and use address(0) as the reporter, since the adapter will verify the MessageDispatched event emitted by Yaho. */ function dispatchMessagesToAdapters( uint256 targetChainId, diff --git a/packages/evm/test/03_Yaho.spec.ts b/packages/evm/test/03_Yaho.spec.ts index 97cfc68c..428631b0 100644 --- a/packages/evm/test/03_Yaho.spec.ts +++ b/packages/evm/test/03_Yaho.spec.ts @@ -129,7 +129,7 @@ describe("Yaho", () => { .withArgs(3, 2) }) - it("should dispatch a single message without calling the reporter because a zk adapter is used", async () => { + it("should dispatch a single message without calling the reporter because an adapter that doesn't need a reporter is used", async () => { const threshold = 2 const tx = await yaho.dispatchMessage( Chains.Gnosis, diff --git a/packages/evm/test/04_Yaru.spec.ts b/packages/evm/test/04_Yaru.spec.ts index 066fb0f0..6b4b8c45 100644 --- a/packages/evm/test/04_Yaru.spec.ts +++ b/packages/evm/test/04_Yaru.spec.ts @@ -191,7 +191,7 @@ describe("Yaru", () => { }) } - it(`should be able to execute a message using 2 zk adapters`, async () => { + it(`should be able to execute a message using 2 adapters that don't need the corresponding reporters`, async () => { const threshold = 4 const tx = await yaho.dispatchMessagesToAdapters( Chains.Hardhat, From e3fe9cfaa89ef0607d7bce0ef16b787870162d6a Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 24 Jun 2024 07:19:00 +0200 Subject: [PATCH 220/297] refactor(evm): adds ccia within Made with comment --- packages/evm/contracts/Hashi.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/evm/contracts/Hashi.sol b/packages/evm/contracts/Hashi.sol index 49d9f2fc..ab9ab016 100644 --- a/packages/evm/contracts/Hashi.sol +++ b/packages/evm/contracts/Hashi.sol @@ -28,7 +28,7 @@ ███▌ ▐███⌐ ▀▀_ ▀▀▀███████ ███^ ▐███_ ▐██▀▀  - Made with ❤️ by Gnosis Guild + Made with ❤️ by Gnosis Guild & the Cross-chain Alliance */ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.20; From 0976475c04dd75c74b1a05e23aad1eafe2aa1258 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 24 Jun 2024 10:54:12 +0200 Subject: [PATCH 221/297] chore(README): <- rm GiriGiriBashi --- README.md | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/README.md b/README.md index 622f8d67..7bc62e23 100644 --- a/README.md +++ b/README.md @@ -51,20 +51,6 @@ We call this setup a **RAIHO** (Redundant Array of Independent Hash Oracles). - Query for a unanimously agreed on hash from that full set of oracles. - Query for a hash agreed upon by a threshold of oracles for a given block on a given chain; the provided oracles must all agree on the hash for the ID, must all be enabled as oracles for the given domain, and must exceed the threshold for the domain. -**GiriGiriBashi** (ギリギリ橋) allows: - -- An `owner` account to: - - Initialize the set of oracles for each domain. - - Initialize the threshold of oracles that must agree on a hash for each domain. - - Replace quarantined oracle adapters. - - Set a challenge `bond` `recipient`. -- Anyone to: - - Query for a unanimously agreed on hash from that full set of oracles. - - Query for a hash agreed upon by a threshold of oracles for a given block on a given chain; the provided oracles must all agree on the hash for the ID, must all be enabled as oracles for the given domain, and must exceed the threshold for the domain. - - Challenge an oracle to report on a hash. - - Resolve a challenge, either returning the `bond` to the challenger and quarantining the given oracle, in the case that the oracle does not report in time or reports a conflicting hash, or forwarding the challenge `bond` to the `recipient`. - - Declare a state of no confidence for a given domain, forcing the domain to be re-initialized by `owner`. - **Yaho** (ヤッホー) allows users to: - dispatch arbitrary messages via Hashi, which: From 6f140ec0b4b8b17a4170fcd6e2dbc9da2f096990 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 8 Jul 2024 10:24:54 +0200 Subject: [PATCH 222/297] feat(ownable): adds the emission of event ThresholdSet within _enableAdapters --- packages/evm/contracts/ownable/ShuSo.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/evm/contracts/ownable/ShuSo.sol b/packages/evm/contracts/ownable/ShuSo.sol index fa1488e0..5d4cf151 100644 --- a/packages/evm/contracts/ownable/ShuSo.sol +++ b/packages/evm/contracts/ownable/ShuSo.sol @@ -118,6 +118,7 @@ abstract contract ShuSo is IShuSho, OwnableUpgradeable { } if (threshold < (_domains[domain].count / 2) + 1) revert InvalidThreshold(threshold); _domains[domain].threshold = threshold; + emit ThresholdSet(domain, threshold); emit AdaptersEnabled(domain, adapters); } From b1a36392a9b3ade2be6bd60d8cd19cdbd74dbef9 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Wed, 10 Jul 2024 17:26:11 +0200 Subject: [PATCH 223/297] WIP: fix controllers to comply with hashi v0.2.0 --- packages/reporter/package.json | 2 +- .../src/ABIs/AMBReporterContractABI.json | 210 ++++++++++-- .../reporter/src/ABIs/ElectronAdapterABI.json | 30 +- .../src/ABIs/ElectronLightClientABI.json | 14 +- .../reporter/src/ABIs/HeaderStorageABI.json | 45 ++- ...CrossDomainMessengerHeaderReporterABI.json | 236 ++++++++++++- .../src/ABIs/StandardReporterContractABI.json | 155 ++++++++- .../src/ABIs/SygmaReporterContractABI.json | 318 +++++++++++++++--- .../src/ABIs/TelepathyAdapterABI.json | 208 +++++------- .../reporter/src/ABIs/WormholeAdapterABI.json | 210 +++++++----- .../src/ABIs/WormhomeHeaderReporterABI.json | 63 ---- .../src/ABIs/WormhomeReporterABI.json | 216 ++++++++++++ packages/reporter/src/MultiClient.ts | 2 +- .../src/controllers/AMBReporterController.ts | 13 +- .../controllers/SygmaReporterController.ts | 18 +- .../TelepathyReporterController.ts | 1 + .../controllers/WormholeReporterController.ts | 9 +- packages/reporter/src/index.ts | 2 - packages/reporter/src/settings/index.ts | 6 - packages/reporter/yarn.lock | 27 +- 20 files changed, 1336 insertions(+), 449 deletions(-) delete mode 100644 packages/reporter/src/ABIs/WormhomeHeaderReporterABI.json create mode 100644 packages/reporter/src/ABIs/WormhomeReporterABI.json diff --git a/packages/reporter/package.json b/packages/reporter/package.json index 02b1c133..61519dc8 100644 --- a/packages/reporter/package.json +++ b/packages/reporter/package.json @@ -36,7 +36,7 @@ "eslint-config-prettier": "^9.0.0", "nodemon": "^3.0.1", "prettier": "^3.0.3", - "ts-node": "^10.9.1", + "ts-node": "^10.9.2", "typescript": "^5.2.2" } } diff --git a/packages/reporter/src/ABIs/AMBReporterContractABI.json b/packages/reporter/src/ABIs/AMBReporterContractABI.json index 2601c7eb..b9c1b8e4 100644 --- a/packages/reporter/src/ABIs/AMBReporterContractABI.json +++ b/packages/reporter/src/ABIs/AMBReporterContractABI.json @@ -2,26 +2,79 @@ { "inputs": [ { - "internalType": "contract IAMB", - "name": "_amb", + "internalType": "address", + "name": "headerStorage", + "type": "address" + }, + { + "internalType": "address", + "name": "yaho", "type": "address" }, { - "internalType": "contract HeaderStorage", - "name": "_headerStorage", + "internalType": "address", + "name": "amb", "type": "address" + }, + { + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "gas", + "type": "uint256" } ], "stateMutability": "nonpayable", "type": "constructor" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expectedChainId", + "type": "uint256" + } + ], + "name": "InvalidToChainId", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "expectedYaho", + "type": "address" + } + ], + "name": "NotYaho", + "type": "error" + }, { "anonymous": false, "inputs": [ { "indexed": true, - "internalType": "address", - "name": "emitter", + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "contract IAdapter", + "name": "adapter", "type": "address" }, { @@ -31,21 +84,52 @@ "type": "uint256" }, { - "indexed": true, + "indexed": false, "internalType": "bytes32", "name": "blockHeader", "type": "bytes32" } ], - "name": "HeaderReported", + "name": "BlockDispatched", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "contract IAdapter", + "name": "adapter", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "messageId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "messageHash", + "type": "bytes32" + } + ], + "name": "MessageDispatched", "type": "event" }, { "inputs": [], - "name": "amb", + "name": "AMB", "outputs": [ { - "internalType": "contract IAMB", + "internalType": "address", "name": "", "type": "address" } @@ -55,10 +139,62 @@ }, { "inputs": [], - "name": "headerStorage", + "name": "GAS", "outputs": [ { - "internalType": "contract HeaderStorage", + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "HEADER_STORAGE", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PROVIDER", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TARGET_CHAIN_ID", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "YAHO", + "outputs": [ + { + "internalType": "address", "name": "", "type": "address" } @@ -68,31 +204,65 @@ }, { "inputs": [ + { + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "internalType": "contract IAdapter", + "name": "adapter", + "type": "address" + }, { "internalType": "uint256[]", "name": "blockNumbers", "type": "uint256[]" + } + ], + "name": "dispatchBlocks", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" }, { - "internalType": "address", - "name": "ambAdapter", + "internalType": "contract IAdapter", + "name": "adapter", "type": "address" }, { - "internalType": "uint256", - "name": "gas", - "type": "uint256" + "internalType": "uint256[]", + "name": "messageIds", + "type": "uint256[]" + }, + { + "internalType": "bytes32[]", + "name": "messageHashes", + "type": "bytes32[]" } ], - "name": "reportHeaders", + "name": "dispatchMessages", "outputs": [ { "internalType": "bytes32", - "name": "receipt", + "name": "", "type": "bytes32" } ], - "stateMutability": "nonpayable", + "stateMutability": "payable", "type": "function" } ] diff --git a/packages/reporter/src/ABIs/ElectronAdapterABI.json b/packages/reporter/src/ABIs/ElectronAdapterABI.json index f42cd269..159d376a 100644 --- a/packages/reporter/src/ABIs/ElectronAdapterABI.json +++ b/packages/reporter/src/ABIs/ElectronAdapterABI.json @@ -29,7 +29,7 @@ }, { "internalType": "bytes32", - "name": "reportedBlockHash", + "name": "blockHash", "type": "bytes32" }, { @@ -105,7 +105,7 @@ { "indexed": true, "internalType": "bytes32", - "name": "hashes", + "name": "hash", "type": "bytes32" } ], @@ -183,31 +183,7 @@ "type": "uint256" } ], - "name": "getHashFromOracle", - "outputs": [ - { - "internalType": "bytes32", - "name": "hash", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "hashes", + "name": "getHash", "outputs": [ { "internalType": "bytes32", diff --git a/packages/reporter/src/ABIs/ElectronLightClientABI.json b/packages/reporter/src/ABIs/ElectronLightClientABI.json index 24ee582b..95ec605f 100644 --- a/packages/reporter/src/ABIs/ElectronLightClientABI.json +++ b/packages/reporter/src/ABIs/ElectronLightClientABI.json @@ -1,14 +1,20 @@ [ { - "inputs": [], - "name": "head", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "slot", "type": "uint256" } ], + "name": "headers", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], "stateMutability": "view", "type": "function" } diff --git a/packages/reporter/src/ABIs/HeaderStorageABI.json b/packages/reporter/src/ABIs/HeaderStorageABI.json index 94234d20..7810c996 100644 --- a/packages/reporter/src/ABIs/HeaderStorageABI.json +++ b/packages/reporter/src/ABIs/HeaderStorageABI.json @@ -1,11 +1,6 @@ [ { "inputs": [ - { - "internalType": "address", - "name": "emitter", - "type": "address" - }, { "internalType": "uint256", "name": "blockNumber", @@ -34,6 +29,25 @@ "name": "HeaderStored", "type": "event" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "headers", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -46,11 +60,30 @@ "outputs": [ { "internalType": "bytes32", - "name": "blockHeader", + "name": "", "type": "bytes32" } ], "stateMutability": "nonpayable", "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "blockNumbers", + "type": "uint256[]" + } + ], + "name": "storeBlockHeaders", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "", + "type": "bytes32[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" } ] diff --git a/packages/reporter/src/ABIs/L1CrossDomainMessengerHeaderReporterABI.json b/packages/reporter/src/ABIs/L1CrossDomainMessengerHeaderReporterABI.json index f3e794f6..6553392d 100644 --- a/packages/reporter/src/ABIs/L1CrossDomainMessengerHeaderReporterABI.json +++ b/packages/reporter/src/ABIs/L1CrossDomainMessengerHeaderReporterABI.json @@ -1,19 +1,249 @@ [ { "inputs": [ + { + "internalType": "address", + "name": "headerStorage", + "type": "address" + }, + { + "internalType": "address", + "name": "yaho", + "type": "address" + }, + { + "internalType": "address", + "name": "l1CrossDomainMessenger", + "type": "address" + }, + { + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expectedChainId", + "type": "uint256" + } + ], + "name": "InvalidToChainId", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "expectedYaho", + "type": "address" + } + ], + "name": "NotYaho", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "contract IAdapter", + "name": "adapter", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "blockHeader", + "type": "bytes32" + } + ], + "name": "BlockDispatched", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "contract IAdapter", + "name": "adapter", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "messageId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "messageHash", + "type": "bytes32" + } + ], + "name": "MessageDispatched", + "type": "event" + }, + { + "inputs": [], + "name": "HEADER_STORAGE", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "L1_CROSS_DOMAIN_MESSENGER", + "outputs": [ + { + "internalType": "contract ICrossDomainMessenger", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PROVIDER", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TARGET_CHAIN_ID", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "YAHO", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "internalType": "contract IAdapter", + "name": "adapter", + "type": "address" + }, { "internalType": "uint256[]", "name": "blockNumbers", "type": "uint256[]" + } + ], + "name": "dispatchBlocks", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" }, { - "internalType": "address", + "internalType": "contract IAdapter", "name": "adapter", "type": "address" + }, + { + "internalType": "uint256[]", + "name": "messageIds", + "type": "uint256[]" + }, + { + "internalType": "bytes32[]", + "name": "messageHashes", + "type": "bytes32[]" + } + ], + "name": "dispatchMessages", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" } ], - "name": "reportHeaders", - "outputs": [], "stateMutability": "payable", "type": "function" } diff --git a/packages/reporter/src/ABIs/StandardReporterContractABI.json b/packages/reporter/src/ABIs/StandardReporterContractABI.json index f3e794f6..c89a25b3 100644 --- a/packages/reporter/src/ABIs/StandardReporterContractABI.json +++ b/packages/reporter/src/ABIs/StandardReporterContractABI.json @@ -1,19 +1,168 @@ [ { "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "expectedYaho", + "type": "address" + } + ], + "name": "NotYaho", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "contract IAdapter", + "name": "adapter", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "blockHeader", + "type": "bytes32" + } + ], + "name": "BlockDispatched", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "contract IAdapter", + "name": "adapter", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "messageId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "messageHash", + "type": "bytes32" + } + ], + "name": "MessageDispatched", + "type": "event" + }, + { + "inputs": [], + "name": "HEADER_STORAGE", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "YAHO", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "internalType": "contract IAdapter", + "name": "adapter", + "type": "address" + }, { "internalType": "uint256[]", "name": "blockNumbers", "type": "uint256[]" + } + ], + "name": "dispatchBlocks", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" }, { - "internalType": "address", + "internalType": "contract IAdapter", "name": "adapter", "type": "address" + }, + { + "internalType": "uint256[]", + "name": "messageIds", + "type": "uint256[]" + }, + { + "internalType": "bytes32[]", + "name": "messageHashes", + "type": "bytes32[]" + } + ], + "name": "dispatchMessages", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" } ], - "name": "reportHeaders", - "outputs": [], "stateMutability": "payable", "type": "function" } diff --git a/packages/reporter/src/ABIs/SygmaReporterContractABI.json b/packages/reporter/src/ABIs/SygmaReporterContractABI.json index b05640d1..a69d67e3 100644 --- a/packages/reporter/src/ABIs/SygmaReporterContractABI.json +++ b/packages/reporter/src/ABIs/SygmaReporterContractABI.json @@ -2,41 +2,63 @@ { "inputs": [ { - "internalType": "contract IBridge", - "name": "bridge", + "internalType": "address", + "name": "headerStorage", "type": "address" }, { - "internalType": "contract HeaderStorage", - "name": "headerStorage", + "internalType": "address", + "name": "yaho", "type": "address" }, { - "internalType": "bytes32", - "name": "resourceID", - "type": "bytes32" - }, + "internalType": "address", + "name": "bridge", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "DomainIdNotAvailable", + "type": "error" + }, + { + "inputs": [ { - "internalType": "uint8", - "name": "defaultDestinationDomainID", - "type": "uint8" + "internalType": "address", + "name": "sender", + "type": "address" }, { "internalType": "address", - "name": "defaultSygmaAdapter", + "name": "expectedYaho", "type": "address" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "name": "NotYaho", + "type": "error" + }, + { + "inputs": [], + "name": "ResourceIdNotAvailable", + "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": true, - "internalType": "address", - "name": "emitter", + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "contract IAdapter", + "name": "adapter", "type": "address" }, { @@ -46,64 +68,106 @@ "type": "uint256" }, { - "indexed": true, + "indexed": false, "internalType": "bytes32", "name": "blockHeader", "type": "bytes32" } ], - "name": "HeaderReported", + "name": "BlockDispatched", "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256[]", - "name": "blockNumbers", - "type": "uint256[]" + "indexed": true, + "internalType": "uint256", + "name": "chainId", + "type": "uint256" }, { - "internalType": "bytes", - "name": "feeData", - "type": "bytes" + "indexed": true, + "internalType": "uint8", + "name": "domainId", + "type": "uint8" } ], - "name": "reportHeaders", - "outputs": [], - "stateMutability": "payable", - "type": "function" + "name": "DomainIdSet", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256[]", - "name": "blockNumbers", - "type": "uint256[]" + "indexed": true, + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" }, { + "indexed": false, + "internalType": "contract IAdapter", + "name": "adapter", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "messageId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "messageHash", + "type": "bytes32" + } + ], + "name": "MessageDispatched", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, "internalType": "address", - "name": "sygmaAdapter", + "name": "previousOwner", "type": "address" }, { - "internalType": "uint8", - "name": "destinationDomainID", - "type": "uint8" + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "chainId", + "type": "uint256" }, { - "internalType": "bytes", - "name": "feeData", - "type": "bytes" + "indexed": true, + "internalType": "bytes32", + "name": "resourceId", + "type": "bytes32" } ], - "name": "reportHeadersToDomain", - "outputs": [], - "stateMutability": "payable", - "type": "function" + "name": "ResourceIdSet", + "type": "event" }, { "inputs": [], - "name": "_bridge", + "name": "BRIDGE", "outputs": [ { "internalType": "contract IBridge", @@ -116,12 +180,12 @@ }, { "inputs": [], - "name": "_defaultDestinationDomainID", + "name": "HEADER_STORAGE", "outputs": [ { - "internalType": "uint8", + "internalType": "address", "name": "", - "type": "uint8" + "type": "address" } ], "stateMutability": "view", @@ -129,12 +193,12 @@ }, { "inputs": [], - "name": "_defaultSygmaAdapter", + "name": "PROVIDER", "outputs": [ { - "internalType": "address", + "internalType": "string", "name": "", - "type": "address" + "type": "string" } ], "stateMutability": "view", @@ -142,10 +206,10 @@ }, { "inputs": [], - "name": "_headerStorage", + "name": "YAHO", "outputs": [ { - "internalType": "contract HeaderStorage", + "internalType": "address", "name": "", "type": "address" } @@ -154,8 +218,58 @@ "type": "function" }, { - "inputs": [], - "name": "_resourceID", + "inputs": [ + { + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "internalType": "contract IAdapter", + "name": "adapter", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "blockNumbers", + "type": "uint256[]" + } + ], + "name": "dispatchBlocks", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "internalType": "contract IAdapter", + "name": "adapter", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "messageIds", + "type": "uint256[]" + }, + { + "internalType": "bytes32[]", + "name": "messageHashes", + "type": "bytes32[]" + } + ], + "name": "dispatchMessages", "outputs": [ { "internalType": "bytes32", @@ -163,6 +277,38 @@ "type": "bytes32" } ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "domainIds", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], "stateMutability": "view", "type": "function" }, @@ -170,12 +316,12 @@ "inputs": [ { "internalType": "uint256[]", - "name": "blockNumbers", + "name": "messageIds", "type": "uint256[]" }, { "internalType": "bytes32[]", - "name": "blockHeaders", + "name": "hashes", "type": "bytes32[]" } ], @@ -190,6 +336,55 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "resourceIds", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "domainId", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "resourceId", + "type": "bytes32" + } + ], + "name": "setDomainIdAndResourceIdByChainId", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -213,5 +408,18 @@ ], "stateMutability": "pure", "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" } ] diff --git a/packages/reporter/src/ABIs/TelepathyAdapterABI.json b/packages/reporter/src/ABIs/TelepathyAdapterABI.json index 805ab0d5..83723f1e 100644 --- a/packages/reporter/src/ABIs/TelepathyAdapterABI.json +++ b/packages/reporter/src/ABIs/TelepathyAdapterABI.json @@ -1,229 +1,205 @@ [ { - "type": "constructor", - "stateMutability": "nonpayable", "inputs": [ { - "type": "address", + "internalType": "address", "name": "_telepathyRouter", - "internalType": "address" + "type": "address" } - ] + ], + "stateMutability": "nonpayable", + "type": "constructor" }, { - "type": "error", - "name": "BlockHeaderNotAvailable", "inputs": [ { - "type": "uint256", + "internalType": "uint256", "name": "slot", - "internalType": "uint256" + "type": "uint256" } - ] + ], + "name": "BlockHeaderNotAvailable", + "type": "error" }, { - "type": "error", - "name": "ConflictingBlockHeader", "inputs": [ { - "type": "uint256", + "internalType": "uint256", "name": "blockNumber", - "internalType": "uint256" + "type": "uint256" }, { - "type": "bytes32", - "name": "reportedBlockHash", - "internalType": "bytes32" + "internalType": "bytes32", + "name": "blockHash", + "type": "bytes32" }, { - "type": "bytes32", + "internalType": "bytes32", "name": "storedBlockHash", - "internalType": "bytes32" + "type": "bytes32" } - ] + ], + "name": "ConflictingBlockHeader", + "type": "error" }, { - "type": "error", - "name": "InconsistentLightClient", "inputs": [ { - "type": "address", + "internalType": "address", "name": "lightClient", - "internalType": "address" + "type": "address" } - ] + ], + "name": "InconsistentLightClient", + "type": "error" }, { - "type": "error", + "inputs": [], "name": "InvalidBlockHashProof", - "inputs": [] + "type": "error" }, { - "type": "error", - "name": "InvalidBlockHeaderLength", "inputs": [ { - "type": "uint256", + "internalType": "uint256", "name": "length", - "internalType": "uint256" + "type": "uint256" } - ] + ], + "name": "InvalidBlockHeaderLength", + "type": "error" }, { - "type": "error", + "inputs": [], "name": "InvalidBlockHeaderRLP", - "inputs": [] + "type": "error" }, { - "type": "error", + "inputs": [], "name": "InvalidBlockNumberProof", - "inputs": [] + "type": "error" }, { - "type": "error", - "name": "NoLightClientOnChain", "inputs": [ { - "type": "uint32", + "internalType": "uint32", "name": "chainId", - "internalType": "uint32" + "type": "uint32" } - ] + ], + "name": "NoLightClientOnChain", + "type": "error" }, { - "type": "event", - "name": "HashStored", + "anonymous": false, "inputs": [ { - "type": "uint256", - "name": "id", + "indexed": true, "internalType": "uint256", - "indexed": true + "name": "id", + "type": "uint256" }, { - "type": "bytes32", - "name": "hashes", + "indexed": true, "internalType": "bytes32", - "indexed": true + "name": "hash", + "type": "bytes32" } ], - "anonymous": false + "name": "HashStored", + "type": "event" }, { - "type": "function", - "stateMutability": "view", - "outputs": [ - { - "type": "bytes32", - "name": "hash", - "internalType": "bytes32" - } - ], - "name": "getHashFromOracle", "inputs": [ { - "type": "uint256", + "internalType": "uint256", "name": "domain", - "internalType": "uint256" + "type": "uint256" }, { - "type": "uint256", + "internalType": "uint256", "name": "id", - "internalType": "uint256" + "type": "uint256" } - ] - }, - { - "type": "function", - "stateMutability": "view", + ], + "name": "getHash", "outputs": [ { - "type": "bytes32", + "internalType": "bytes32", "name": "", - "internalType": "bytes32" + "type": "bytes32" } ], - "name": "hashes", - "inputs": [ - { - "type": "uint256", - "name": "", - "internalType": "uint256" - }, - { - "type": "uint256", - "name": "", - "internalType": "uint256" - } - ] + "stateMutability": "view", + "type": "function" }, { - "type": "function", - "stateMutability": "nonpayable", - "outputs": [], - "name": "proveAncestralBlockHashes", "inputs": [ { - "type": "uint256", + "internalType": "uint256", "name": "chainId", - "internalType": "uint256" + "type": "uint256" }, { - "type": "bytes[]", + "internalType": "bytes[]", "name": "blockHeaders", - "internalType": "bytes[]" + "type": "bytes[]" } - ] + ], + "name": "proveAncestralBlockHashes", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "type": "function", - "stateMutability": "nonpayable", - "outputs": [], - "name": "storeBlockHeader", "inputs": [ { - "type": "uint32", + "internalType": "uint32", "name": "_chainId", - "internalType": "uint32" + "type": "uint32" }, { - "type": "uint64", + "internalType": "uint64", "name": "_slot", - "internalType": "uint64" + "type": "uint64" }, { - "type": "uint256", + "internalType": "uint256", "name": "_blockNumber", - "internalType": "uint256" + "type": "uint256" }, { - "type": "bytes32[]", + "internalType": "bytes32[]", "name": "_blockNumberProof", - "internalType": "bytes32[]" + "type": "bytes32[]" }, { - "type": "bytes32", + "internalType": "bytes32", "name": "_blockHash", - "internalType": "bytes32" + "type": "bytes32" }, { - "type": "bytes32[]", + "internalType": "bytes32[]", "name": "_blockHashProof", - "internalType": "bytes32[]" + "type": "bytes32[]" } - ] + ], + "name": "storeBlockHeader", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "type": "function", - "stateMutability": "view", + "inputs": [], + "name": "telepathyRouter", "outputs": [ { - "type": "address", + "internalType": "address", "name": "", - "internalType": "address" + "type": "address" } ], - "name": "telepathyRouter", - "inputs": [] + "stateMutability": "view", + "type": "function" } ] diff --git a/packages/reporter/src/ABIs/WormholeAdapterABI.json b/packages/reporter/src/ABIs/WormholeAdapterABI.json index 636a5b1c..dc59d307 100644 --- a/packages/reporter/src/ABIs/WormholeAdapterABI.json +++ b/packages/reporter/src/ABIs/WormholeAdapterABI.json @@ -1,25 +1,10 @@ [ { "inputs": [ - { - "internalType": "contract IWormhole", - "name": "wormhole_", - "type": "address" - }, { "internalType": "address", - "name": "reporter_", + "name": "wormhole", "type": "address" - }, - { - "internalType": "uint256", - "name": "sourceChainId_", - "type": "uint256" - }, - { - "internalType": "uint16", - "name": "wormholeSourceChainId_", - "type": "uint16" } ], "stateMutability": "nonpayable", @@ -34,7 +19,7 @@ }, { "internalType": "bytes32", - "name": "reportedBlockHash", + "name": "blockHash", "type": "bytes32" }, { @@ -64,27 +49,6 @@ }, { "inputs": [ - { - "internalType": "address", - "name": "emitter", - "type": "address" - }, - { - "internalType": "uint16", - "name": "chainId", - "type": "uint16" - } - ], - "name": "InvalidEmitterChainId", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "emitter", - "type": "address" - }, { "components": [ { @@ -179,58 +143,118 @@ "type": "error" }, { + "inputs": [], + "name": "UnauthorizedWormholeReceive", + "type": "error" + }, + { + "anonymous": false, "inputs": [ { - "internalType": "address", - "name": "emitter", - "type": "address" + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" }, { + "indexed": true, "internalType": "bytes32", - "name": "reporter", + "name": "hash", "type": "bytes32" } ], - "name": "InvalidReporter", - "type": "error" + "name": "HashStored", + "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, - "internalType": "uint256", - "name": "id", - "type": "uint256" + "internalType": "address", + "name": "previousOwner", + "type": "address" }, { "indexed": true, - "internalType": "bytes32", - "name": "hashes", - "type": "bytes32" + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "name": "HashStored", + "name": "OwnershipTransferred", "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "uint256", - "name": "domain", + "name": "chainId", "type": "uint256" }, + { + "indexed": true, + "internalType": "uint16", + "name": "endpointId", + "type": "uint16" + }, + { + "indexed": true, + "internalType": "address", + "name": "reporter", + "type": "address" + } + ], + "name": "ReporterSet", + "type": "event" + }, + { + "inputs": [], + "name": "WORMHOLE", + "outputs": [ + { + "internalType": "contract IWormhole", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "name": "chainIds", + "outputs": [ { "internalType": "uint256", - "name": "id", + "name": "", "type": "uint256" } ], - "name": "getHashFromOracle", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "name": "enabledReporters", "outputs": [ { "internalType": "bytes32", - "name": "hash", + "name": "", "type": "bytes32" } ], @@ -241,16 +265,16 @@ "inputs": [ { "internalType": "uint256", - "name": "", + "name": "domain", "type": "uint256" }, { "internalType": "uint256", - "name": "", + "name": "id", "type": "uint256" } ], - "name": "hashes", + "name": "getHash", "outputs": [ { "internalType": "bytes32", @@ -261,6 +285,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -281,28 +318,32 @@ }, { "inputs": [], - "name": "reporter", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "sourceChainId", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "chainId", "type": "uint256" + }, + { + "internalType": "uint16", + "name": "wormholeChainId", + "type": "uint16" + }, + { + "internalType": "address", + "name": "reporter", + "type": "address" } ], - "stateMutability": "view", + "name": "setReporterByChain", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { @@ -319,29 +360,16 @@ "type": "function" }, { - "inputs": [], - "name": "wormhole", - "outputs": [ + "inputs": [ { - "internalType": "contract IWormhole", - "name": "", + "internalType": "address", + "name": "newOwner", "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "wormholeSourceChainId", - "outputs": [ - { - "internalType": "uint16", - "name": "", - "type": "uint16" - } - ], - "stateMutability": "view", + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" } ] diff --git a/packages/reporter/src/ABIs/WormhomeHeaderReporterABI.json b/packages/reporter/src/ABIs/WormhomeHeaderReporterABI.json deleted file mode 100644 index 0e80a16f..00000000 --- a/packages/reporter/src/ABIs/WormhomeHeaderReporterABI.json +++ /dev/null @@ -1,63 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "contract IWormhole", - "name": "wormhole_", - "type": "address" - }, - { - "internalType": "contract IHeaderStorage", - "name": "headerStorage_", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "headerStorage", - "outputs": [ - { - "internalType": "contract IHeaderStorage", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256[]", - "name": "blockNumbers", - "type": "uint256[]" - } - ], - "name": "reportHeaders", - "outputs": [ - { - "internalType": "uint64", - "name": "sequence", - "type": "uint64" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "wormhole", - "outputs": [ - { - "internalType": "contract IWormhole", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } -] diff --git a/packages/reporter/src/ABIs/WormhomeReporterABI.json b/packages/reporter/src/ABIs/WormhomeReporterABI.json new file mode 100644 index 00000000..454cd261 --- /dev/null +++ b/packages/reporter/src/ABIs/WormhomeReporterABI.json @@ -0,0 +1,216 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "headerStorage", + "type": "address" + }, + { + "internalType": "address", + "name": "yaho", + "type": "address" + }, + { + "internalType": "address", + "name": "wormhole", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "expectedYaho", + "type": "address" + } + ], + "name": "NotYaho", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "contract IAdapter", + "name": "adapter", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "blockHeader", + "type": "bytes32" + } + ], + "name": "BlockDispatched", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "contract IAdapter", + "name": "adapter", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "messageId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "messageHash", + "type": "bytes32" + } + ], + "name": "MessageDispatched", + "type": "event" + }, + { + "inputs": [], + "name": "HEADER_STORAGE", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PROVIDER", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "WOMRHOLE", + "outputs": [ + { + "internalType": "contract IWormhole", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "YAHO", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "internalType": "contract IAdapter", + "name": "adapter", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "blockNumbers", + "type": "uint256[]" + } + ], + "name": "dispatchBlocks", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "internalType": "contract IAdapter", + "name": "adapter", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "messageIds", + "type": "uint256[]" + }, + { + "internalType": "bytes32[]", + "name": "messageHashes", + "type": "bytes32[]" + } + ], + "name": "dispatchMessages", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "payable", + "type": "function" + } +] diff --git a/packages/reporter/src/MultiClient.ts b/packages/reporter/src/MultiClient.ts index 6413d584..d873eeaa 100644 --- a/packages/reporter/src/MultiClient.ts +++ b/packages/reporter/src/MultiClient.ts @@ -31,7 +31,7 @@ class Multiclient { }, {}) } - getClientByChain(_chain: Chain) { + getClientByChain(_chain: Chain): any { return this._clients[_chain.name] } } diff --git a/packages/reporter/src/controllers/AMBReporterController.ts b/packages/reporter/src/controllers/AMBReporterController.ts index 7eaf8947..c4983502 100644 --- a/packages/reporter/src/controllers/AMBReporterController.ts +++ b/packages/reporter/src/controllers/AMBReporterController.ts @@ -5,16 +5,9 @@ import BaseController from "./BaseController.js" import { BaseControllerConfigs } from "./BaseController.js" -interface AMBReporterControllerConfigs extends BaseControllerConfigs { - reportHeadersGas: number -} - class AMBReporterController extends BaseController { - private _reportHeadersGas: number - - constructor(_configs: AMBReporterControllerConfigs) { + constructor(_configs: BaseControllerConfigs) { super(_configs, "AMBReporterController") - this._reportHeadersGas = _configs.reportHeadersGas } async onBlocks(_blockNumbers: bigint[]) { @@ -32,8 +25,8 @@ class AMBReporterController extends BaseController { const { request } = await client.simulateContract({ address: this.reporterAddress as `0x${string}`, abi: ABI, - functionName: "reportHeaders", - args: [[blockNumber], this.adapterAddresses[chain.name], this._reportHeadersGas], + functionName: "dispatchBlocks", + args: [chain.id, this.adapterAddresses[chain.name], [blockNumber]], }) const txHash = await client.writeContract(request) diff --git a/packages/reporter/src/controllers/SygmaReporterController.ts b/packages/reporter/src/controllers/SygmaReporterController.ts index bbd3a4d0..272c73b0 100644 --- a/packages/reporter/src/controllers/SygmaReporterController.ts +++ b/packages/reporter/src/controllers/SygmaReporterController.ts @@ -5,16 +5,9 @@ import BaseController from "./BaseController.js" import { BaseControllerConfigs } from "./BaseController.js" -interface SygmaReporterControllerConfigs extends BaseControllerConfigs { - domainIds: { [chainName: string]: number } -} - class SygmaReporterController extends BaseController { - private _domainIds: { [chainName: string]: number } - - constructor(_configs: SygmaReporterControllerConfigs) { + constructor(_configs: BaseControllerConfigs) { super(_configs, "SygmaReporterController") - this._domainIds = _configs.domainIds } async onBlocks(_blockNumbers: bigint[]) { @@ -30,13 +23,8 @@ class SygmaReporterController extends BaseController { const { request } = await client.simulateContract({ address: this.reporterAddresses[chain.name], abi: ABI, - functionName: "reportHeadersToDomain", - args: [ - [blockNumber], - this.adapterAddresses[chain.name], - this._domainIds[chain.name as keyof typeof this._domainIds], - "0x", - ], + functionName: "dispatchBlocks", + args: [chain.id, this.adapterAddresses[chain.name], [blockNumber]], }) const txHash = await client.writeContract(request) this.logger.info(`headers reporter from ${this.sourceChain.name} to ${chain.name}: ${txHash}`) diff --git a/packages/reporter/src/controllers/TelepathyReporterController.ts b/packages/reporter/src/controllers/TelepathyReporterController.ts index c3a09de1..a7032fc0 100644 --- a/packages/reporter/src/controllers/TelepathyReporterController.ts +++ b/packages/reporter/src/controllers/TelepathyReporterController.ts @@ -8,6 +8,7 @@ import BaseController from "./BaseController.js" import { BaseControllerConfigs } from "./BaseController.js" +// TODO: Update to comply with Hashi v0.2.0 interface TelepathyReporterControllerConfigs extends BaseControllerConfigs { lightClientAddresses: { [chainName: string]: `0x${string}` } baseProofUrl: string diff --git a/packages/reporter/src/controllers/WormholeReporterController.ts b/packages/reporter/src/controllers/WormholeReporterController.ts index 56584eb4..822650fe 100644 --- a/packages/reporter/src/controllers/WormholeReporterController.ts +++ b/packages/reporter/src/controllers/WormholeReporterController.ts @@ -4,7 +4,7 @@ import { Chain } from "viem" import BaseController from "./BaseController.js" import sleep from "../utils/sleep.js" -import HeaderReporterABI from "../ABIs/WormhomeHeaderReporterABI.json" assert { type: "json" } +import ReporterABI from "../ABIs/WormhomeReporterABI.json" assert { type: "json" } import AdapterABI from "../ABIs/WormholeAdapterABI.json" assert { type: "json" } import WormholeABI from "../ABIs/WormholeABI.json" assert { type: "json" } @@ -47,9 +47,10 @@ class WormholeReporterController extends BaseController { this.logger.info(`reporting block header for block ${blockNumber} ...`) const { request } = await client.simulateContract({ address: this.reporterAddress as `0x${string}`, - abi: HeaderReporterABI, - functionName: "reportHeaders", - args: [[blockNumber]], + abi: ReporterABI, + functionName: "dispatchBlocks", + // targetChainId & adapter are not used in _dispatch(), here set to 0 + args: [0, "0x0000000000000000000000000000000000000000", [blockNumber]], }) let txHash = await client.writeContract(request) diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 774e0ab1..459da700 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -53,7 +53,6 @@ const main = () => { adapterAddresses: { [gnosis.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.Gnosis?.AMBAdapter, }, - reportHeadersGas: settings.reporterControllers.AMBReporterController.reportHeadersGas, }) const sygmaReporterController = new SygmaReporterController({ @@ -68,7 +67,6 @@ const main = () => { adapterAddresses: { [gnosis.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.Gnosis?.SygmaAdapter, }, - domainIds: settings.reporterControllers.SygmaReporterController.domainIds, }) const telepathyReporterController = new TelepathyReporterController({ diff --git a/packages/reporter/src/settings/index.ts b/packages/reporter/src/settings/index.ts index bfa0f700..811353bc 100644 --- a/packages/reporter/src/settings/index.ts +++ b/packages/reporter/src/settings/index.ts @@ -215,12 +215,6 @@ export const settings = { LayerZeroReporterController: { reportHeadersValue: parseEther(process.env.LAYER_ZERO_REPORT_HEADERS_VALUE as string), }, - SygmaReporterController: { - domainIds: { - [gnosis.name]: 6, - [mainnet.name]: 1, - }, - }, TelepathyReporterController: { baseProofUrl: process.env.TELEPATHY_PROOF_API_URL as string, }, diff --git a/packages/reporter/yarn.lock b/packages/reporter/yarn.lock index a76b4abf..be19c25d 100644 --- a/packages/reporter/yarn.lock +++ b/packages/reporter/yarn.lock @@ -902,15 +902,6 @@ __metadata: languageName: node linkType: hard -"async-retry@npm:^1.3.3": - version: 1.3.3 - resolution: "async-retry@npm:1.3.3" - dependencies: - retry: 0.13.1 - checksum: 38a7152ff7265a9321ea214b9c69e8224ab1febbdec98efbbde6e562f17ff68405569b796b1c5271f354aef8783665d29953f051f68c1fc45306e61aec82fdc4 - languageName: node - linkType: hard - "async@npm:^3.2.3": version: 3.2.4 resolution: "async@npm:3.2.4" @@ -2579,14 +2570,13 @@ __metadata: "@typescript-eslint/eslint-plugin": ^6.7.5 "@typescript-eslint/parser": ^6.7.5 async-mutex: ^0.4.0 - async-retry: ^1.3.3 axios: ^1.5.1 dotenv: ^16.3.1 eslint: ^8.51.0 eslint-config-prettier: ^9.0.0 nodemon: ^3.0.1 prettier: ^3.0.3 - ts-node: ^10.9.1 + ts-node: ^10.9.2 typescript: ^5.2.2 viem: ^1.16.5 winston: ^3.11.0 @@ -2600,13 +2590,6 @@ __metadata: languageName: node linkType: hard -"retry@npm:0.13.1": - version: 0.13.1 - resolution: "retry@npm:0.13.1" - checksum: 47c4d5be674f7c13eee4cfe927345023972197dbbdfba5d3af7e461d13b44de1bfd663bfc80d2f601f8ef3fc8164c16dd99655a221921954a65d044a2fc1233b - languageName: node - linkType: hard - "retry@npm:^0.12.0": version: 0.12.0 resolution: "retry@npm:0.12.0" @@ -2933,9 +2916,9 @@ __metadata: languageName: node linkType: hard -"ts-node@npm:^10.9.1": - version: 10.9.1 - resolution: "ts-node@npm:10.9.1" +"ts-node@npm:^10.9.2": + version: 10.9.2 + resolution: "ts-node@npm:10.9.2" dependencies: "@cspotcode/source-map-support": ^0.8.0 "@tsconfig/node10": ^1.0.7 @@ -2967,7 +2950,7 @@ __metadata: ts-node-script: dist/bin-script.js ts-node-transpile-only: dist/bin-transpile.js ts-script: dist/bin-script-deprecated.js - checksum: 090adff1302ab20bd3486e6b4799e90f97726ed39e02b39e566f8ab674fd5bd5f727f43615debbfc580d33c6d9d1c6b1b3ce7d8e3cca3e20530a145ffa232c35 + checksum: fde256c9073969e234526e2cfead42591b9a2aec5222bac154b0de2fa9e4ceb30efcd717ee8bc785a56f3a119bdd5aa27b333d9dbec94ed254bd26f8944c67ac languageName: node linkType: hard From 782cf3ebabf2d614e38be2813f9932b98c358b1b Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Wed, 10 Jul 2024 17:34:11 +0200 Subject: [PATCH 224/297] WIP: update StandardReporterController --- .../reporter/src/controllers/StandardReporterController.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/reporter/src/controllers/StandardReporterController.ts b/packages/reporter/src/controllers/StandardReporterController.ts index 8920beea..1ee5d06d 100644 --- a/packages/reporter/src/controllers/StandardReporterController.ts +++ b/packages/reporter/src/controllers/StandardReporterController.ts @@ -31,8 +31,8 @@ class StandardReporterController extends BaseController { const { request } = await client.simulateContract({ address: this.reporterAddresses[chain.name], abi: ABI, - functionName: "reportHeaders", - args: [[blockNumber], this.adapterAddresses[chain.name]], + functionName: "dispatchBlocks", + args: [chain.id, this.adapterAddresses[chain.name], [blockNumber]], value: this._reportHeadersValue, }) From 22e19619c6d31b5899d4496f33f2378040f387b0 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Thu, 11 Jul 2024 15:46:04 +0200 Subject: [PATCH 225/297] WIP: fix ElectronController type and add AMB for Sepolia and Chiado --- packages/reporter/.env.example | 3 + packages/reporter/.yarnrc.yml | 1 + packages/reporter/package.json | 5 +- .../src/controllers/AMBReporterController.ts | 2 + .../controllers/ElectronReporterController.ts | 2 +- packages/reporter/src/index.ts | 438 +++++++++--------- packages/reporter/src/settings/index.ts | 7 + packages/reporter/yarn.lock | 365 ++++++++++++++- 8 files changed, 601 insertions(+), 222 deletions(-) create mode 100644 packages/reporter/.yarnrc.yml diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index 552241eb..c15b0392 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -9,6 +9,7 @@ POLYGON_RPC_URL= OPTIMISM_RPC_URL=https://optimism.llamarpc.com ARBITRUM_RPC_URL=https://arbitrum.llamarpc.com SEPOLIA_RPC_URL= +CHIADO_RPC_URL=https://rpc.chiadochain.net GOERLI_BEACON_API_URL= AMB_REPORTER_HEADERS_GAS=300000 @@ -33,6 +34,8 @@ QUERY_BLOCK_LENGTH=200 SOURCE_CHAIN_ID=5 DESTINATION_CHAIN_IDS=100 +SEPOLIA_CHIADO_REPORTER=0xc6755144d60548f3DD420F47Cf48DAe553bBf042 +CHIADO_ADAPTER=0x3F5929bee6A59661D6CcC9c4eB751048009CE11B AMB_ADAPTER=0x4efB95c26bB2ebD3281749A5eAA388bc302b4445 SYMGA_ADAPTER=0x9AD7a6f4FDA8247cC0bF5932B68c5b619937dB15 GNOSIS_TELEPATHY_ADAPTER=0xDeF29f44f8315d0079A25EF03cfB0b0D8CdA3cF8 diff --git a/packages/reporter/.yarnrc.yml b/packages/reporter/.yarnrc.yml new file mode 100644 index 00000000..3186f3f0 --- /dev/null +++ b/packages/reporter/.yarnrc.yml @@ -0,0 +1 @@ +nodeLinker: node-modules diff --git a/packages/reporter/package.json b/packages/reporter/package.json index 61519dc8..5d6868a2 100644 --- a/packages/reporter/package.json +++ b/packages/reporter/package.json @@ -12,7 +12,7 @@ "prettier:write": "prettier --write \"**/*.{js,json,md,sol,ts,yml}\"", "start:dev": "nodemon" }, - "packageManager": "yarn@3.2.1", + "packageManager": "yarn@3.2.2", "dependencies": { "@chainsafe/persistent-merkle-tree": "^0.6.1", "@chainsafe/ssz": "^0.14.0", @@ -35,8 +35,9 @@ "eslint": "^8.51.0", "eslint-config-prettier": "^9.0.0", "nodemon": "^3.0.1", + "patch-package": "^8.0.0", "prettier": "^3.0.3", "ts-node": "^10.9.2", - "typescript": "^5.2.2" + "typescript": "~5.2.2" } } diff --git a/packages/reporter/src/controllers/AMBReporterController.ts b/packages/reporter/src/controllers/AMBReporterController.ts index c4983502..c6a0a474 100644 --- a/packages/reporter/src/controllers/AMBReporterController.ts +++ b/packages/reporter/src/controllers/AMBReporterController.ts @@ -22,6 +22,7 @@ class AMBReporterController extends BaseController { chain.name } ...`, ) + const { request } = await client.simulateContract({ address: this.reporterAddress as `0x${string}`, abi: ABI, @@ -30,6 +31,7 @@ class AMBReporterController extends BaseController { }) const txHash = await client.writeContract(request) + this.logger.info(`headers reporter from ${this.sourceChain.name} to ${chain.name}: ${txHash}`) } } catch (_error) { diff --git a/packages/reporter/src/controllers/ElectronReporterController.ts b/packages/reporter/src/controllers/ElectronReporterController.ts index 0c06ceef..cf429691 100644 --- a/packages/reporter/src/controllers/ElectronReporterController.ts +++ b/packages/reporter/src/controllers/ElectronReporterController.ts @@ -72,7 +72,7 @@ class ElectronReporterController extends BaseController { this.logger.info("Getting log index ...") const logIndex = receipt.logs.findIndex( - ({ address, topics }) => + ({ address, topics }: { address: string; topics: string[] }) => address.toLowerCase() === this.headerStorageAddress.toLowerCase() && topics[0] === EXPECTED_TOPIC, ) diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 459da700..03c73de3 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -9,6 +9,8 @@ import { optimism, optimismGoerli, polygon, + mainnet, + sepolia, } from "viem/chains" import { Chain } from "viem" @@ -28,8 +30,20 @@ const main = () => { const controllersEnabled = process.env.REPORTERS_ENABLED?.split(",") const sourceChainId = Number(process.env.SOURCE_CHAIN_ID) const destinationChainIds = process.env.DESTINATION_CHAIN_IDS?.split(",").map((_chainId) => Number(_chainId)) - - const chains = [arbitrum, avalanche, bsc, bscTestnet, gnosis, gnosisChiado, goerli, optimism, optimismGoerli, polygon] + const chains = [ + arbitrum, + avalanche, + bsc, + bscTestnet, + gnosis, + gnosisChiado, + goerli, + optimism, + optimismGoerli, + polygon, + mainnet, + sepolia, + ] const sourceChain: Chain = Object.values(chains).find((_chain) => _chain.id === sourceChainId) as Chain const destinationChains: Chain[] = Object.values(chains).filter((_chain) => destinationChainIds?.includes(_chain.id)) @@ -46,237 +60,237 @@ const main = () => { const ambReporterController = new AMBReporterController({ type: "classic", sourceChain, - destinationChains: destinationChains.filter(({ name }) => name === gnosis.name), + destinationChains: destinationChains.filter(({ name }) => name === gnosisChiado.name), logger, multiClient, - reporterAddress: unidirectionalReportersAddresses[sourceChain.name]?.Gnosis?.AMBReporter, + reporterAddress: unidirectionalReportersAddresses[sourceChain.name]?.[destinationChains[0].name]?.AMBReporter, adapterAddresses: { - [gnosis.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.Gnosis?.AMBAdapter, + [gnosisChiado.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[destinationChains[0].name]?.AMBAdapter, }, }) - const sygmaReporterController = new SygmaReporterController({ - type: "classic", - sourceChain, - destinationChains, - logger, - multiClient, - reporterAddresses: { - [gnosis.name]: unidirectionalReportersAddresses[sourceChain.name]?.[gnosis.name]?.SygmaReporter, - }, - adapterAddresses: { - [gnosis.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.Gnosis?.SygmaAdapter, - }, - }) + // const sygmaReporterController = new SygmaReporterController({ + // type: "classic", + // sourceChain, + // destinationChains, + // logger, + // multiClient, + // reporterAddresses: { + // [gnosis.name]: unidirectionalReportersAddresses[sourceChain.name]?.[gnosis.name]?.SygmaReporter, + // }, + // adapterAddresses: { + // [gnosis.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.Gnosis?.SygmaAdapter, + // }, + // }) - const telepathyReporterController = new TelepathyReporterController({ - type: "lightClient", - sourceChain, - destinationChains, - logger, - multiClient, - adapterAddresses: { - [gnosis.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.Gnosis?.TelepathyAdapter, - [arbitrum.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.["Arbitrum One"]?.TelepathyAdapter, - [optimism.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.["OP Mainnet"]?.TelepathyAdapter, - [bsc.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.["BNB Smart Chain"]?.TelepathyAdapter, - [polygon.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.Polygon?.TelepathyAdapter, - }, - baseProofUrl: settings.reporterControllers.TelepathyReporterController.baseProofUrl, - lightClientAddresses: { - [gnosis.name]: lightClientAddresses.Gnosis?.[sourceChain.name]?.TelepathyLightClient, - [arbitrum.name]: lightClientAddresses["Arbitrum One"]?.[sourceChain.name]?.TelepathyLightClient, - [optimism.name]: lightClientAddresses["OP Mainnet"]?.[sourceChain.name]?.TelepathyLightClient, - [bsc.name]: lightClientAddresses["BNB Smart Chain"]?.[sourceChain.name]?.TelepathyLightClient, - [polygon.name]: lightClientAddresses.Polygon?.[sourceChain.name]?.TelepathyLightClient, - }, - }) + // const telepathyReporterController = new TelepathyReporterController({ + // type: "lightClient", + // sourceChain, + // destinationChains, + // logger, + // multiClient, + // adapterAddresses: { + // [gnosis.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.Gnosis?.TelepathyAdapter, + // [arbitrum.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.["Arbitrum One"]?.TelepathyAdapter, + // [optimism.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.["OP Mainnet"]?.TelepathyAdapter, + // [bsc.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.["BNB Smart Chain"]?.TelepathyAdapter, + // [polygon.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.Polygon?.TelepathyAdapter, + // }, + // baseProofUrl: settings.reporterControllers.TelepathyReporterController.baseProofUrl, + // lightClientAddresses: { + // [gnosis.name]: lightClientAddresses.Gnosis?.[sourceChain.name]?.TelepathyLightClient, + // [arbitrum.name]: lightClientAddresses["Arbitrum One"]?.[sourceChain.name]?.TelepathyLightClient, + // [optimism.name]: lightClientAddresses["OP Mainnet"]?.[sourceChain.name]?.TelepathyLightClient, + // [bsc.name]: lightClientAddresses["BNB Smart Chain"]?.[sourceChain.name]?.TelepathyLightClient, + // [polygon.name]: lightClientAddresses.Polygon?.[sourceChain.name]?.TelepathyLightClient, + // }, + // }) - const wormholeReporterController = new WormholeReporterController({ - type: "classic", - sourceChain, - destinationChains, - logger, - multiClient, - reporterAddress: (settings.contractAddresses.reporterAddresses as any)[sourceChain.name]?.WormholeHeaderReporter, - adapterAddresses: { - [gnosis.name]: (settings.contractAddresses.adapterAddresses as any)?.Gnosis?.WormholeAdapter, - [optimism.name]: (settings.contractAddresses.adapterAddresses as any)["OP Mainnet"]?.WormholeAdapter, - [bsc.name]: (settings.contractAddresses.adapterAddresses as any)["BNB Smart Chain"]?.WormholeAdapter, - [polygon.name]: (settings.contractAddresses.adapterAddresses as any)?.Polygon.WormholeAdapter, - [avalanche.name]: (settings.contractAddresses.adapterAddresses as any)?.Avalanche.WormholeAdapter, - }, - wormholeScanBaseUrl: settings.reporterControllers.WormholeReporterController.wormholeScanBaseUrl, - wormholeAddress: (settings.contractAddresses as any)[sourceChain.name]?.Wormhole, - wormholeChainIds: settings.reporterControllers.WormholeReporterController.wormholeChainIds, - }) + // const wormholeReporterController = new WormholeReporterController({ + // type: "classic", + // sourceChain, + // destinationChains, + // logger, + // multiClient, + // reporterAddress: (settings.contractAddresses.reporterAddresses as any)[sourceChain.name]?.WormholeHeaderReporter, + // adapterAddresses: { + // [gnosis.name]: (settings.contractAddresses.adapterAddresses as any)?.Gnosis?.WormholeAdapter, + // [optimism.name]: (settings.contractAddresses.adapterAddresses as any)["OP Mainnet"]?.WormholeAdapter, + // [bsc.name]: (settings.contractAddresses.adapterAddresses as any)["BNB Smart Chain"]?.WormholeAdapter, + // [polygon.name]: (settings.contractAddresses.adapterAddresses as any)?.Polygon.WormholeAdapter, + // [avalanche.name]: (settings.contractAddresses.adapterAddresses as any)?.Avalanche.WormholeAdapter, + // }, + // wormholeScanBaseUrl: settings.reporterControllers.WormholeReporterController.wormholeScanBaseUrl, + // wormholeAddress: (settings.contractAddresses as any)[sourceChain.name]?.Wormhole, + // wormholeChainIds: settings.reporterControllers.WormholeReporterController.wormholeChainIds, + // }) - // TODO: add check to prevent to always run OptimismReporterController even when destinationChains does not include optimism - const optimismReporterController = new OptimismReporterController({ - type: "native", - sourceChain, - logger, - multiClient, - reporterAddress: - settings.contractAddresses.reporterAddresses.unidirectional.Ethereum["OP Mainnet"] - .L1CrossDomainMessengerHeaderReporter, - adapterAddresses: { - [optimism.name]: - settings.contractAddresses.adapterAddresses.unidirectional.Ethereum["OP Mainnet"].L2CrossDomainMessengerAdapter, - }, - }) + // // TODO: add check to prevent to always run OptimismReporterController even when destinationChains does not include optimism + // const optimismReporterController = new OptimismReporterController({ + // type: "native", + // sourceChain, + // logger, + // multiClient, + // reporterAddress: + // settings.contractAddresses.reporterAddresses.unidirectional.Ethereum["OP Mainnet"] + // .L1CrossDomainMessengerHeaderReporter, + // adapterAddresses: { + // [optimism.name]: + // settings.contractAddresses.adapterAddresses.unidirectional.Ethereum["OP Mainnet"].L2CrossDomainMessengerAdapter, + // }, + // }) - const axelarReporterController = new StandardReporterController({ - name: "AxelarReporterController", - type: "classic", - sourceChain, - destinationChains, - logger, - multiClient, - reporterAddresses: { - [bsc.name]: unidirectionalReportersAddresses[sourceChain.name]?.[bsc.name]?.AxelarReporter, - }, - adapterAddresses: { - [bsc.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[bsc.name]?.AxelarAdapter, - }, - reportHeadersValue: settings.reporterControllers.AxelarReporterController.reportHeadersValue, - }) + // const axelarReporterController = new StandardReporterController({ + // name: "AxelarReporterController", + // type: "classic", + // sourceChain, + // destinationChains, + // logger, + // multiClient, + // reporterAddresses: { + // [bsc.name]: unidirectionalReportersAddresses[sourceChain.name]?.[bsc.name]?.AxelarReporter, + // }, + // adapterAddresses: { + // [bsc.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[bsc.name]?.AxelarAdapter, + // }, + // reportHeadersValue: settings.reporterControllers.AxelarReporterController.reportHeadersValue, + // }) - const connextReporterController = new StandardReporterController({ - name: "ConnextReporterController", - type: "classic", - sourceChain, - destinationChains, - logger, - multiClient, - reporterAddresses: { - [gnosis.name]: unidirectionalReportersAddresses[sourceChain.name]?.[gnosis.name]?.ConnextReporter, - }, - adapterAddresses: { - [gnosis.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[gnosis.name]?.ConnextAdapter, - }, - reportHeadersValue: settings.reporterControllers.ConnextReporterController.reportHeadersValue, - }) + // const connextReporterController = new StandardReporterController({ + // name: "ConnextReporterController", + // type: "classic", + // sourceChain, + // destinationChains, + // logger, + // multiClient, + // reporterAddresses: { + // [gnosis.name]: unidirectionalReportersAddresses[sourceChain.name]?.[gnosis.name]?.ConnextReporter, + // }, + // adapterAddresses: { + // [gnosis.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[gnosis.name]?.ConnextAdapter, + // }, + // reportHeadersValue: settings.reporterControllers.ConnextReporterController.reportHeadersValue, + // }) - const celerReporterController = new StandardReporterController({ - name: "CelerReporterController", - type: "classic", - sourceChain, - destinationChains, - logger, - multiClient, - reporterAddresses: { - [polygon.name]: unidirectionalReportersAddresses[sourceChain.name]?.[polygon.name]?.CelerReporter, - }, - adapterAddresses: { - [polygon.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[polygon.name]?.CelerAdapter, - }, - reportHeadersValue: settings.reporterControllers.CelerReporterController.reportHeadersValue, - }) + // const celerReporterController = new StandardReporterController({ + // name: "CelerReporterController", + // type: "classic", + // sourceChain, + // destinationChains, + // logger, + // multiClient, + // reporterAddresses: { + // [polygon.name]: unidirectionalReportersAddresses[sourceChain.name]?.[polygon.name]?.CelerReporter, + // }, + // adapterAddresses: { + // [polygon.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[polygon.name]?.CelerAdapter, + // }, + // reportHeadersValue: settings.reporterControllers.CelerReporterController.reportHeadersValue, + // }) - const layerZeroReporterController = new StandardReporterController({ - name: "LayerZeroReporterController", - type: "classic", - sourceChain, - destinationChains, - logger, - multiClient, - reporterAddresses: { - [avalanche.name]: unidirectionalReportersAddresses[sourceChain.name]?.[avalanche.name]?.LayerZeroReporter, - [bsc.name]: unidirectionalReportersAddresses[sourceChain.name]?.[bsc.name]?.LayerZeroReporter, - }, - adapterAddresses: { - [avalanche.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[avalanche.name]?.LayerZeroAdapter, - [bsc.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[bsc.name]?.LayerZeroAdapter, - }, - reportHeadersValue: settings.reporterControllers.LayerZeroReporterController.reportHeadersValue, - }) + // const layerZeroReporterController = new StandardReporterController({ + // name: "LayerZeroReporterController", + // type: "classic", + // sourceChain, + // destinationChains, + // logger, + // multiClient, + // reporterAddresses: { + // [avalanche.name]: unidirectionalReportersAddresses[sourceChain.name]?.[avalanche.name]?.LayerZeroReporter, + // [bsc.name]: unidirectionalReportersAddresses[sourceChain.name]?.[bsc.name]?.LayerZeroReporter, + // }, + // adapterAddresses: { + // [avalanche.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[avalanche.name]?.LayerZeroAdapter, + // [bsc.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[bsc.name]?.LayerZeroAdapter, + // }, + // reportHeadersValue: settings.reporterControllers.LayerZeroReporterController.reportHeadersValue, + // }) - const hyperlaneReporterController = new StandardReporterController({ - name: "HyperlaneReporterController", - type: "classic", - sourceChain, - destinationChains, - logger, - multiClient, - reporterAddresses: { - [bsc.name]: unidirectionalReportersAddresses[sourceChain.name]?.[bsc.name]?.HyperlaneReporter, - }, - adapterAddresses: { - [bsc.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[bsc.name]?.HyperlaneAdapter, - }, - }) + // const hyperlaneReporterController = new StandardReporterController({ + // name: "HyperlaneReporterController", + // type: "classic", + // sourceChain, + // destinationChains, + // logger, + // multiClient, + // reporterAddresses: { + // [bsc.name]: unidirectionalReportersAddresses[sourceChain.name]?.[bsc.name]?.HyperlaneReporter, + // }, + // adapterAddresses: { + // [bsc.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[bsc.name]?.HyperlaneAdapter, + // }, + // }) - const ccipReporterController = new StandardReporterController({ - name: "CCIPReporterController", - type: "classic", - sourceChain, - destinationChains, - logger, - multiClient, - reporterAddresses: { - [optimismGoerli.name]: unidirectionalReportersAddresses[sourceChain.name]?.[optimismGoerli.name]?.CCIPReporter, - [bscTestnet.name]: unidirectionalReportersAddresses[sourceChain.name]?.[bscTestnet.name]?.CCIPReporter, - [avalanche.name]: unidirectionalReportersAddresses[sourceChain.name]?.[avalanche.name]?.CCIPReporter, - }, - adapterAddresses: { - [optimismGoerli.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[optimismGoerli.name]?.CCIPAdapter, - [bscTestnet.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[bscTestnet.name]?.CCIPAdapter, - [avalanche.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[avalanche.name]?.CCIPAdapter, - }, - reportHeadersValue: settings.reporterControllers.CCIPReporterController.reportHeadersValue, - }) + // const ccipReporterController = new StandardReporterController({ + // name: "CCIPReporterController", + // type: "classic", + // sourceChain, + // destinationChains, + // logger, + // multiClient, + // reporterAddresses: { + // [optimismGoerli.name]: unidirectionalReportersAddresses[sourceChain.name]?.[optimismGoerli.name]?.CCIPReporter, + // [bscTestnet.name]: unidirectionalReportersAddresses[sourceChain.name]?.[bscTestnet.name]?.CCIPReporter, + // [avalanche.name]: unidirectionalReportersAddresses[sourceChain.name]?.[avalanche.name]?.CCIPReporter, + // }, + // adapterAddresses: { + // [optimismGoerli.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[optimismGoerli.name]?.CCIPAdapter, + // [bscTestnet.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[bscTestnet.name]?.CCIPAdapter, + // [avalanche.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[avalanche.name]?.CCIPAdapter, + // }, + // reportHeadersValue: settings.reporterControllers.CCIPReporterController.reportHeadersValue, + // }) - const zetaReporterController = new StandardReporterController({ - name: "ZetaReporterController", - type: "classic", - sourceChain, - destinationChains, - logger, - multiClient, - reporterAddresses: { - [bscTestnet.name]: unidirectionalReportersAddresses[sourceChain.name]?.[bscTestnet.name]?.ZetaChainReporter, - }, - adapterAddresses: { - [bscTestnet.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[bscTestnet.name]?.ZetaChainAdapter, - }, - reportHeadersValue: settings.reporterControllers.ZetaReporterController.reportHeadersValue, - }) + // const zetaReporterController = new StandardReporterController({ + // name: "ZetaReporterController", + // type: "classic", + // sourceChain, + // destinationChains, + // logger, + // multiClient, + // reporterAddresses: { + // [bscTestnet.name]: unidirectionalReportersAddresses[sourceChain.name]?.[bscTestnet.name]?.ZetaChainReporter, + // }, + // adapterAddresses: { + // [bscTestnet.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[bscTestnet.name]?.ZetaChainAdapter, + // }, + // reportHeadersValue: settings.reporterControllers.ZetaReporterController.reportHeadersValue, + // }) - const electronReporterController = new ElectronReporterController({ - type: "lightClient", - sourceChain, - destinationChains, - logger, - multiClient, - adapterAddresses: { - [gnosisChiado.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.["Gnosis Chiado"]?.ElectronAdapter, - }, - headerStorageAddress: (settings.contractAddresses as any)[sourceChain.name].HeaderStorage, - lightClientAddresses: { - [gnosisChiado.name]: lightClientAddresses["Gnosis Chiado"]?.[sourceChain.name]?.ElectronLightClient, - }, - beaconchaBaseUrl: (settings.reporterControllers.ElectronReporterController.beaconchaBaseUrls as any)[ - sourceChain.name - ], - beaconApiBaseUrl: (settings.beaconApiUrls as any)[sourceChain.name], - }) + // const electronReporterController = new ElectronReporterController({ + // type: "lightClient", + // sourceChain, + // destinationChains, + // logger, + // multiClient, + // adapterAddresses: { + // [gnosisChiado.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.["Gnosis Chiado"]?.ElectronAdapter, + // }, + // headerStorageAddress: (settings.contractAddresses as any)[sourceChain.name].HeaderStorage, + // lightClientAddresses: { + // [gnosisChiado.name]: lightClientAddresses["Gnosis Chiado"]?.[sourceChain.name]?.ElectronLightClient, + // }, + // beaconchaBaseUrl: (settings.reporterControllers.ElectronReporterController.beaconchaBaseUrls as any)[ + // sourceChain.name + // ], + // beaconApiBaseUrl: (settings.beaconApiUrls as any)[sourceChain.name], + // }) const coordinator = new Coordinator({ controllers: [ ambReporterController, - sygmaReporterController, - telepathyReporterController, - wormholeReporterController, - optimismReporterController, - axelarReporterController, - connextReporterController, - celerReporterController, - layerZeroReporterController, - hyperlaneReporterController, - ccipReporterController, - zetaReporterController, - electronReporterController, + // sygmaReporterController, + // telepathyReporterController, + // wormholeReporterController, + // optimismReporterController, + // axelarReporterController, + // connextReporterController, + // celerReporterController, + // layerZeroReporterController, + // hyperlaneReporterController, + // ccipReporterController, + // zetaReporterController, + // electronReporterController, ].filter((_controller) => controllersEnabled?.includes(_controller.name)), intervalFetchBlocksMs: settings.Coordinator.intervalFetchBlocksMs, logger, diff --git a/packages/reporter/src/settings/index.ts b/packages/reporter/src/settings/index.ts index 811353bc..eb4cf97e 100644 --- a/packages/reporter/src/settings/index.ts +++ b/packages/reporter/src/settings/index.ts @@ -51,6 +51,7 @@ export const settings = { [gnosis.name]: { TelepathyAdapter: process.env.GNOSIS_TELEPATHY_ADAPTER as `0x${string}`, AMBAdapter: process.env.GNOSIS_AMB_ADAPTER as `0x${string}`, + AMBReporter: process.env.GNOSIS_AMB_REPORTER as `0x${string}`, ConnextAdapter: process.env.GNOSIS_CONNEXT_ADAPTER_MAINNET as `0x${string}`, SygmaAdapter: process.env.GNOSIS_SYGMA_ADAPTER as `0x${string}`, // this works with many chains }, @@ -82,6 +83,9 @@ export const settings = { [bscTestnet.name]: { CCIPAdapter: process.env.BSC_TESTNET_CCIP_ADAPTER_SEPOLIA as `0x${string}`, }, + [gnosisChiado.name]: { + AMBAdapter: process.env.CHIADO_ADAPTER as `0x${string}`, + }, }, [goerli.name]: { [bscTestnet.name]: { @@ -140,6 +144,9 @@ export const settings = { [bscTestnet.name]: { CCIPReporter: process.env.SEPOLIA_CCIP_REPORTER_BSC_TESTNET as `0x${string}`, }, + [gnosisChiado.name]: { + AMBReporter: process.env.SEPOLIA_CHIADO_REPORTER as `0x${string}`, + }, }, [goerli.name]: { [bscTestnet.name]: { diff --git a/packages/reporter/yarn.lock b/packages/reporter/yarn.lock index be19c25d..17edb509 100644 --- a/packages/reporter/yarn.lock +++ b/packages/reporter/yarn.lock @@ -721,6 +721,13 @@ __metadata: languageName: node linkType: hard +"@yarnpkg/lockfile@npm:^1.1.0": + version: 1.1.0 + resolution: "@yarnpkg/lockfile@npm:1.1.0" + checksum: 05b881b4866a3546861fee756e6d3812776ea47fa6eb7098f983d6d0eefa02e12b66c3fff931574120f196286a7ad4879ce02743c8bb2be36c6a576c7852083a + languageName: node + linkType: hard + "abbrev@npm:1, abbrev@npm:^1.0.0": version: 1.1.1 resolution: "abbrev@npm:1.1.1" @@ -916,6 +923,13 @@ __metadata: languageName: node linkType: hard +"at-least-node@npm:^1.0.0": + version: 1.0.0 + resolution: "at-least-node@npm:1.0.0" + checksum: 463e2f8e43384f1afb54bc68485c436d7622acec08b6fad269b421cb1d29cebb5af751426793d0961ed243146fe4dc983402f6d5a51b720b277818dbf6f2e49e + languageName: node + linkType: hard + "axios@npm:^1.5.1": version: 1.5.1 resolution: "axios@npm:1.5.1" @@ -976,6 +990,15 @@ __metadata: languageName: node linkType: hard +"braces@npm:^3.0.3": + version: 3.0.3 + resolution: "braces@npm:3.0.3" + dependencies: + fill-range: ^7.1.1 + checksum: b95aa0b3bd909f6cd1720ffcf031aeaf46154dd88b4da01f9a1d3f7ea866a79eba76a6d01cbc3c422b2ee5cdc39a4f02491058d5df0d7bf6e6a162a832df1f69 + languageName: node + linkType: hard + "cacache@npm:^17.0.0": version: 17.1.4 resolution: "cacache@npm:17.1.4" @@ -996,6 +1019,19 @@ __metadata: languageName: node linkType: hard +"call-bind@npm:^1.0.5": + version: 1.0.7 + resolution: "call-bind@npm:1.0.7" + 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 + checksum: 295c0c62b90dd6522e6db3b0ab1ce26bdf9e7404215bda13cfee25b626b5ff1a7761324d58d38b1ef1607fc65aca2d06e44d2e18d0dfc6c14b465b00d8660029 + languageName: node + linkType: hard + "callsites@npm:^3.0.0": version: 3.1.0 resolution: "callsites@npm:3.1.0" @@ -1003,7 +1039,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^4.0.0": +"chalk@npm:^4.0.0, chalk@npm:^4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: @@ -1039,6 +1075,13 @@ __metadata: languageName: node linkType: hard +"ci-info@npm:^3.7.0": + version: 3.9.0 + resolution: "ci-info@npm:3.9.0" + checksum: 6b19dc9b2966d1f8c2041a838217299718f15d6c4b63ae36e4674edd2bee48f780e94761286a56aa59eb305a85fbea4ddffb7630ec063e7ec7e7e5ad42549a87 + languageName: node + linkType: hard + "clean-stack@npm:^2.0.0": version: 2.2.0 resolution: "clean-stack@npm:2.2.0" @@ -1159,7 +1202,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2": +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": version: 7.0.3 resolution: "cross-spawn@npm:7.0.3" dependencies: @@ -1198,6 +1241,17 @@ __metadata: languageName: node linkType: hard +"define-data-property@npm:^1.1.4": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" + dependencies: + es-define-property: ^1.0.0 + es-errors: ^1.3.0 + gopd: ^1.0.1 + checksum: 8068ee6cab694d409ac25936eb861eea704b7763f7f342adbdfe337fc27c78d7ae0eff2364b2917b58c508d723c7a074326d068eef2e45c4edcd85cf94d0313b + languageName: node + linkType: hard + "delayed-stream@npm:~1.0.0": version: 1.0.0 resolution: "delayed-stream@npm:1.0.0" @@ -1295,6 +1349,22 @@ __metadata: languageName: node linkType: hard +"es-define-property@npm:^1.0.0": + version: 1.0.0 + resolution: "es-define-property@npm:1.0.0" + dependencies: + get-intrinsic: ^1.2.4 + checksum: f66ece0a887b6dca71848fa71f70461357c0e4e7249696f81bad0a1f347eed7b31262af4a29f5d726dc026426f085483b6b90301855e647aa8e21936f07293c6 + languageName: node + linkType: hard + +"es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: ec1414527a0ccacd7f15f4a3bc66e215f04f595ba23ca75cdae0927af099b5ec865f9f4d33e9d7e86f512f252876ac77d4281a7871531a50678132429b1271b5 + languageName: node + linkType: hard + "escape-string-regexp@npm:^4.0.0": version: 4.0.0 resolution: "escape-string-regexp@npm:4.0.0" @@ -1523,6 +1593,15 @@ __metadata: languageName: node linkType: hard +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" + dependencies: + to-regex-range: ^5.0.1 + checksum: b4abfbca3839a3d55e4ae5ec62e131e2e356bf4859ce8480c64c4876100f4df292a63e5bb1618e1d7460282ca2b305653064f01654474aa35c68000980f17798 + languageName: node + linkType: hard + "find-up@npm:^5.0.0": version: 5.0.0 resolution: "find-up@npm:5.0.0" @@ -1533,6 +1612,15 @@ __metadata: languageName: node linkType: hard +"find-yarn-workspace-root@npm:^2.0.0": + version: 2.0.0 + resolution: "find-yarn-workspace-root@npm:2.0.0" + dependencies: + micromatch: ^4.0.2 + checksum: fa5ca8f9d08fe7a54ce7c0a5931ff9b7e36f9ee7b9475fb13752bcea80ec6b5f180fa5102d60b376d5526ce924ea3fc6b19301262efa0a5d248dd710f3644242 + languageName: node + linkType: hard + "flat-cache@npm:^3.0.4": version: 3.1.1 resolution: "flat-cache@npm:3.1.1" @@ -1589,6 +1677,18 @@ __metadata: languageName: node linkType: hard +"fs-extra@npm:^9.0.0": + version: 9.1.0 + resolution: "fs-extra@npm:9.1.0" + dependencies: + at-least-node: ^1.0.0 + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: ba71ba32e0faa74ab931b7a0031d1523c66a73e225de7426e275e238e312d07313d2da2d33e34a52aa406c8763ade5712eb3ec9ba4d9edce652bcacdc29e6b20 + languageName: node + linkType: hard + "fs-minipass@npm:^2.0.0": version: 2.1.0 resolution: "fs-minipass@npm:2.1.0" @@ -1633,6 +1733,13 @@ __metadata: languageName: node linkType: hard +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 2b0ff4ce708d99715ad14a6d1f894e2a83242e4a52ccfcefaee5e40050562e5f6dafc1adbb4ce2d4ab47279a45dc736ab91ea5042d843c3c092820dfe032efb1 + languageName: node + linkType: hard + "gauge@npm:^4.0.3": version: 4.0.4 resolution: "gauge@npm:4.0.4" @@ -1649,6 +1756,19 @@ __metadata: languageName: node linkType: hard +"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.4": + version: 1.2.4 + resolution: "get-intrinsic@npm:1.2.4" + 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 + checksum: 414e3cdf2c203d1b9d7d33111df746a4512a1aa622770b361dadddf8ed0b5aeb26c560f49ca077e24bfafb0acb55ca908d1f709216ccba33ffc548ec8a79a951 + languageName: node + linkType: hard + "glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" @@ -1719,7 +1839,16 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.2.6": +"gopd@npm:^1.0.1": + version: 1.0.1 + resolution: "gopd@npm:1.0.1" + dependencies: + get-intrinsic: ^1.1.3 + checksum: a5ccfb8806e0917a94e0b3de2af2ea4979c1da920bc381667c260e00e7cafdbe844e2cb9c5bcfef4e5412e8bf73bab837285bc35c7ba73aaaf0134d4583393a6 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 @@ -1747,6 +1876,29 @@ __metadata: languageName: node linkType: hard +"has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" + dependencies: + es-define-property: ^1.0.0 + checksum: fcbb246ea2838058be39887935231c6d5788babed499d0e9d0cc5737494c48aba4fe17ba1449e0d0fbbb1e36175442faa37f9c427ae357d6ccb1d895fbcd3de3 + languageName: node + linkType: hard + +"has-proto@npm:^1.0.1": + version: 1.0.3 + resolution: "has-proto@npm:1.0.3" + checksum: fe7c3d50b33f50f3933a04413ed1f69441d21d2d2944f81036276d30635cad9279f6b43bc8f32036c31ebdfcf6e731150f46c1907ad90c669ffe9b066c3ba5c4 + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.3": + version: 1.0.3 + resolution: "has-symbols@npm:1.0.3" + checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 + languageName: node + linkType: hard + "has-unicode@npm:^2.0.1": version: 2.0.1 resolution: "has-unicode@npm:2.0.1" @@ -1754,6 +1906,15 @@ __metadata: languageName: node linkType: hard +"hasown@npm:^2.0.0": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" + dependencies: + function-bind: ^1.1.2 + checksum: e8516f776a15149ca6c6ed2ae3110c417a00b62260e222590e54aa367cbcd6ed99122020b37b7fbdf05748df57b265e70095d7bf35a47660587619b15ffb93db + languageName: node + linkType: hard + "http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" @@ -1878,6 +2039,15 @@ __metadata: languageName: node linkType: hard +"is-docker@npm:^2.0.0": + version: 2.2.1 + resolution: "is-docker@npm:2.2.1" + bin: + is-docker: cli.js + checksum: 3fef7ddbf0be25958e8991ad941901bf5922ab2753c46980b60b05c1bf9c9c2402d35e6dc32e4380b980ef5e1970a5d9d5e5aa2e02d77727c3b6b5e918474c56 + languageName: node + linkType: hard + "is-extglob@npm:^2.1.1": version: 2.1.1 resolution: "is-extglob@npm:2.1.1" @@ -1929,6 +2099,22 @@ __metadata: languageName: node linkType: hard +"is-wsl@npm:^2.1.1": + version: 2.2.0 + resolution: "is-wsl@npm:2.2.0" + dependencies: + is-docker: ^2.0.0 + checksum: 20849846ae414997d290b75e16868e5261e86ff5047f104027026fd61d8b5a9b0b3ade16239f35e1a067b3c7cc02f70183cb661010ed16f4b6c7c93dad1b19d8 + languageName: node + linkType: hard + +"isarray@npm:^2.0.5": + version: 2.0.5 + resolution: "isarray@npm:2.0.5" + checksum: bd5bbe4104438c4196ba58a54650116007fa0262eccef13a4c55b2e09a5b36b59f1e75b9fcc49883dd9d4953892e6fc007eef9e9155648ceea036e184b0f930a + languageName: node + linkType: hard + "isexe@npm:^2.0.0": version: 2.0.0 resolution: "isexe@npm:2.0.0" @@ -1997,6 +2183,38 @@ __metadata: languageName: node linkType: hard +"json-stable-stringify@npm:^1.0.2": + version: 1.1.1 + resolution: "json-stable-stringify@npm:1.1.1" + dependencies: + call-bind: ^1.0.5 + isarray: ^2.0.5 + jsonify: ^0.0.1 + object-keys: ^1.1.1 + checksum: e1ba06600fd278767eeff53f28e408e29c867e79abf564e7aadc3ce8f31f667258f8db278ef28831e45884dd687388fa1910f46e599fc19fb94c9afbbe3a4de8 + languageName: node + linkType: hard + +"jsonfile@npm:^6.0.1": + version: 6.1.0 + resolution: "jsonfile@npm:6.1.0" + dependencies: + graceful-fs: ^4.1.6 + universalify: ^2.0.0 + dependenciesMeta: + graceful-fs: + optional: true + checksum: 7af3b8e1ac8fe7f1eccc6263c6ca14e1966fcbc74b618d3c78a0a2075579487547b94f72b7a1114e844a1e15bb00d440e5d1720bfc4612d790a6f285d5ea8354 + languageName: node + linkType: hard + +"jsonify@npm:^0.0.1": + version: 0.0.1 + resolution: "jsonify@npm:0.0.1" + checksum: 027287e1c0294fce15f18c0ff990cfc2318e7f01fb76515f784d5cd0784abfec6fc5c2355c3a2f2cb0ad7f4aa2f5b74ebbfe4e80476c35b2d13cabdb572e1134 + languageName: node + linkType: hard + "keyv@npm:^4.5.3": version: 4.5.4 resolution: "keyv@npm:4.5.4" @@ -2006,6 +2224,15 @@ __metadata: languageName: node linkType: hard +"klaw-sync@npm:^6.0.0": + version: 6.0.0 + resolution: "klaw-sync@npm:6.0.0" + dependencies: + graceful-fs: ^4.1.11 + checksum: 0da397f8961313c3ef8f79fb63af9002cde5a8fb2aeb1a37351feff0dd6006129c790400c3f5c3b4e757bedcabb13d21ec0a5eaef5a593d59515d4f2c291e475 + languageName: node + linkType: hard + "kuler@npm:^2.0.0": version: 2.0.0 resolution: "kuler@npm:2.0.0" @@ -2120,6 +2347,16 @@ __metadata: languageName: node linkType: hard +"micromatch@npm:^4.0.2": + version: 4.0.7 + resolution: "micromatch@npm:4.0.7" + dependencies: + braces: ^3.0.3 + picomatch: ^2.3.1 + checksum: 3cde047d70ad80cf60c787b77198d680db3b8c25b23feb01de5e2652205d9c19f43bd81882f69a0fd1f0cde6a7a122d774998aad3271ddb1b8accf8a0f480cf7 + languageName: node + linkType: hard + "micromatch@npm:^4.0.4": version: 4.0.5 resolution: "micromatch@npm:4.0.5" @@ -2164,6 +2401,13 @@ __metadata: languageName: node linkType: hard +"minimist@npm:^1.2.6": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0 + languageName: node + linkType: hard + "minipass-collect@npm:^1.0.2": version: 1.0.2 resolution: "minipass-collect@npm:1.0.2" @@ -2367,6 +2611,13 @@ __metadata: languageName: node linkType: hard +"object-keys@npm:^1.1.1": + version: 1.1.1 + resolution: "object-keys@npm:1.1.1" + checksum: b363c5e7644b1e1b04aa507e88dcb8e3a2f52b6ffd0ea801e4c7a62d5aa559affe21c55a07fd4b1fd55fc03a33c610d73426664b20032405d7b92a1414c34d6a + languageName: node + linkType: hard + "once@npm:^1.3.0": version: 1.4.0 resolution: "once@npm:1.4.0" @@ -2385,6 +2636,16 @@ __metadata: languageName: node linkType: hard +"open@npm:^7.4.2": + version: 7.4.2 + resolution: "open@npm:7.4.2" + dependencies: + is-docker: ^2.0.0 + is-wsl: ^2.1.1 + checksum: 3333900ec0e420d64c23b831bc3467e57031461d843c801f569b2204a1acc3cd7b3ec3c7897afc9dde86491dfa289708eb92bba164093d8bd88fb2c231843c91 + languageName: node + linkType: hard + "optionator@npm:^0.9.3": version: 0.9.3 resolution: "optionator@npm:0.9.3" @@ -2399,6 +2660,13 @@ __metadata: languageName: node linkType: hard +"os-tmpdir@npm:~1.0.2": + version: 1.0.2 + resolution: "os-tmpdir@npm:1.0.2" + checksum: 5666560f7b9f10182548bf7013883265be33620b1c1b4a4d405c25be2636f970c5488ff3e6c48de75b55d02bde037249fe5dbfbb4c0fb7714953d56aed062e6d + languageName: node + linkType: hard + "p-limit@npm:^3.0.2": version: 3.1.0 resolution: "p-limit@npm:3.1.0" @@ -2435,6 +2703,31 @@ __metadata: languageName: node linkType: hard +"patch-package@npm:^8.0.0": + version: 8.0.0 + resolution: "patch-package@npm:8.0.0" + dependencies: + "@yarnpkg/lockfile": ^1.1.0 + chalk: ^4.1.2 + ci-info: ^3.7.0 + cross-spawn: ^7.0.3 + find-yarn-workspace-root: ^2.0.0 + fs-extra: ^9.0.0 + json-stable-stringify: ^1.0.2 + klaw-sync: ^6.0.0 + minimist: ^1.2.6 + open: ^7.4.2 + rimraf: ^2.6.3 + semver: ^7.5.3 + slash: ^2.0.0 + tmp: ^0.0.33 + yaml: ^2.2.2 + bin: + patch-package: index.js + checksum: d23cddc4d1622e2d8c7ca31b145c6eddb24bd271f69905e766de5e1f199f0b9a5479a6a6939ea857288399d4ed249285639d539a2c00fbddb7daa39934b007a2 + languageName: node + linkType: hard + "path-exists@npm:^4.0.0": version: 4.0.0 resolution: "path-exists@npm:4.0.0" @@ -2575,9 +2868,10 @@ __metadata: eslint: ^8.51.0 eslint-config-prettier: ^9.0.0 nodemon: ^3.0.1 + patch-package: ^8.0.0 prettier: ^3.0.3 ts-node: ^10.9.2 - typescript: ^5.2.2 + typescript: ~5.2.2 viem: ^1.16.5 winston: ^3.11.0 languageName: unknown @@ -2604,6 +2898,17 @@ __metadata: languageName: node linkType: hard +"rimraf@npm:^2.6.3": + version: 2.7.1 + resolution: "rimraf@npm:2.7.1" + dependencies: + glob: ^7.1.3 + bin: + rimraf: ./bin.js + checksum: cdc7f6eacb17927f2a075117a823e1c5951792c6498ebcce81ca8203454a811d4cf8900314154d3259bb8f0b42ab17f67396a8694a54cae3283326e57ad250cd + languageName: node + linkType: hard + "rimraf@npm:^3.0.2": version: 3.0.2 resolution: "rimraf@npm:3.0.2" @@ -2679,6 +2984,20 @@ __metadata: languageName: node linkType: hard +"set-function-length@npm:^1.2.1": + version: 1.2.2 + resolution: "set-function-length@npm:1.2.2" + 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 + checksum: a8248bdacdf84cb0fab4637774d9fb3c7a8e6089866d04c817583ff48e14149c87044ce683d7f50759a8c50fb87c7a7e173535b06169c87ef76f5fb276dfff72 + languageName: node + linkType: hard + "shebang-command@npm:^2.0.0": version: 2.0.0 resolution: "shebang-command@npm:2.0.0" @@ -2727,6 +3046,13 @@ __metadata: languageName: node linkType: hard +"slash@npm:^2.0.0": + version: 2.0.0 + resolution: "slash@npm:2.0.0" + checksum: 512d4350735375bd11647233cb0e2f93beca6f53441015eea241fe784d8068281c3987fbaa93e7ef1c38df68d9c60013045c92837423c69115297d6169aa85e6 + languageName: node + linkType: hard + "slash@npm:^3.0.0": version: 3.0.0 resolution: "slash@npm:3.0.0" @@ -2880,6 +3206,15 @@ __metadata: languageName: node linkType: hard +"tmp@npm:^0.0.33": + version: 0.0.33 + resolution: "tmp@npm:0.0.33" + dependencies: + os-tmpdir: ~1.0.2 + checksum: 902d7aceb74453ea02abbf58c203f4a8fc1cead89b60b31e354f74ed5b3fb09ea817f94fb310f884a5d16987dd9fa5a735412a7c2dd088dd3d415aa819ae3a28 + languageName: node + linkType: hard + "to-regex-range@npm:^5.0.1": version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" @@ -2984,7 +3319,7 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^5.2.2": +"typescript@npm:~5.2.2": version: 5.2.2 resolution: "typescript@npm:5.2.2" bin: @@ -2994,9 +3329,9 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@^5.2.2#~builtin": +"typescript@patch:typescript@~5.2.2#~builtin": version: 5.2.2 - resolution: "typescript@patch:typescript@npm%3A5.2.2#~builtin::version=5.2.2&hash=7ad353" + resolution: "typescript@patch:typescript@npm%3A5.2.2#~builtin::version=5.2.2&hash=f456af" bin: tsc: bin/tsc tsserver: bin/tsserver @@ -3036,6 +3371,13 @@ __metadata: languageName: node linkType: hard +"universalify@npm:^2.0.0": + version: 2.0.1 + resolution: "universalify@npm:2.0.1" + checksum: ecd8469fe0db28e7de9e5289d32bd1b6ba8f7183db34f3bfc4ca53c49891c2d6aa05f3fb3936a81285a905cc509fb641a0c3fc131ec786167eff41236ae32e60 + languageName: node + linkType: hard + "uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" @@ -3196,6 +3538,15 @@ __metadata: languageName: node linkType: hard +"yaml@npm:^2.2.2": + version: 2.4.5 + resolution: "yaml@npm:2.4.5" + bin: + yaml: bin.mjs + checksum: f8efd407c07e095f00f3031108c9960b2b12971d10162b1ec19007200f6c987d2e28f73283f4731119aa610f177a3ea03d4a8fcf640600a25de1b74d00c69b3d + languageName: node + linkType: hard + "yn@npm:3.1.1": version: 3.1.1 resolution: "yn@npm:3.1.1" From a0a9abd5c9bac67d78ec6ab7b99ff8206c476d02 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Thu, 11 Jul 2024 16:49:25 +0200 Subject: [PATCH 226/297] feat: CCIP Reporter controller --- packages/reporter/.env.example | 1 + .../src/ABIs/CCIPReporterContractABI.json | 368 +++++++++++++++ .../src/controllers/CCIPReporterController.ts | 43 ++ packages/reporter/src/index.ts | 428 +++++++++--------- packages/reporter/src/settings/index.ts | 2 + 5 files changed, 635 insertions(+), 207 deletions(-) create mode 100644 packages/reporter/src/ABIs/CCIPReporterContractABI.json create mode 100644 packages/reporter/src/controllers/CCIPReporterController.ts diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index c15b0392..dad27e33 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -36,6 +36,7 @@ DESTINATION_CHAIN_IDS=100 SEPOLIA_CHIADO_REPORTER=0xc6755144d60548f3DD420F47Cf48DAe553bBf042 CHIADO_ADAPTER=0x3F5929bee6A59661D6CcC9c4eB751048009CE11B +SEPOLIA_CHIADO_CCIP_REPORTER=0xf66871C91952b09270d223cD3A1e5Dad57b14fbC AMB_ADAPTER=0x4efB95c26bB2ebD3281749A5eAA388bc302b4445 SYMGA_ADAPTER=0x9AD7a6f4FDA8247cC0bF5932B68c5b619937dB15 GNOSIS_TELEPATHY_ADAPTER=0xDeF29f44f8315d0079A25EF03cfB0b0D8CdA3cF8 diff --git a/packages/reporter/src/ABIs/CCIPReporterContractABI.json b/packages/reporter/src/ABIs/CCIPReporterContractABI.json new file mode 100644 index 00000000..fdd75331 --- /dev/null +++ b/packages/reporter/src/ABIs/CCIPReporterContractABI.json @@ -0,0 +1,368 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "headerStorage", + "type": "address" + }, + { + "internalType": "address", + "name": "yaho", + "type": "address" + }, + { + "internalType": "address", + "name": "ccipRouter", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "ChainSelectorNotAvailable", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "expectedYaho", + "type": "address" + } + ], + "name": "NotYaho", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "contract IAdapter", + "name": "adapter", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "blockHeader", + "type": "bytes32" + } + ], + "name": "BlockDispatched", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint64", + "name": "chainSelector", + "type": "uint64" + } + ], + "name": "ChainSelectorSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "name": "FeeSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "contract IAdapter", + "name": "adapter", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "messageId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "messageHash", + "type": "bytes32" + } + ], + "name": "MessageDispatched", + "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": [], + "name": "CCIP_ROUTER", + "outputs": [ + { + "internalType": "contract IRouterClient", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "HEADER_STORAGE", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PROVIDER", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "YAHO", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "chainSelectors", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "internalType": "contract IAdapter", + "name": "adapter", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "blockNumbers", + "type": "uint256[]" + } + ], + "name": "dispatchBlocks", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "internalType": "contract IAdapter", + "name": "adapter", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "messageIds", + "type": "uint256[]" + }, + { + "internalType": "bytes32[]", + "name": "messageHashes", + "type": "bytes32[]" + } + ], + "name": "dispatchMessages", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "fee", + "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": [ + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "uint64", + "name": "chainSelector", + "type": "uint64" + } + ], + "name": "setChainSelectorByChainId", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "fee_", + "type": "uint256" + } + ], + "name": "setFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] diff --git a/packages/reporter/src/controllers/CCIPReporterController.ts b/packages/reporter/src/controllers/CCIPReporterController.ts new file mode 100644 index 00000000..702bdb03 --- /dev/null +++ b/packages/reporter/src/controllers/CCIPReporterController.ts @@ -0,0 +1,43 @@ +import { Chain } from "viem" +import ABI from "../ABIs/CCIPReporterContractABI.json" assert { type: "json" } + +import BaseController from "./BaseController.js" + +import { BaseControllerConfigs } from "./BaseController.js" + +class CCIPReporterController extends BaseController { + constructor(_configs: BaseControllerConfigs) { + super(_configs, "CCIPReporterController") + } + + async onBlocks(_blockNumbers: bigint[]) { + try { + const client = this.multiClient.getClientByChain(this.sourceChain) + + for (const chain of this.destinationChains as Chain[]) { + const blockNumber = _blockNumbers[_blockNumbers.length - 1] + + this.logger.info( + `reporting block header for block from ${_blockNumbers[0]} to ${_blockNumbers[_blockNumbers.length - 1]} on ${ + chain.name + } ...`, + ) + + const { request } = await client.simulateContract({ + address: this.reporterAddress as `0x${string}`, + abi: ABI, + functionName: "dispatchBlocks", + args: [chain.id, this.adapterAddresses[chain.name], [blockNumber]], + value: 200000000000000, // fee + }) + + const txHash = await client.writeContract(request) + this.logger.info(`headers reporter from ${this.sourceChain.name} to ${chain.name}: ${txHash}`) + } + } catch (_error) { + this.logger.error(_error) + } + } +} + +export default CCIPReporterController diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 03c73de3..39699784 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -22,6 +22,7 @@ import SygmaReporterController from "./controllers/SygmaReporterController.js" import StandardReporterController from "./controllers/StandardReporterController.js" import TelepathyReporterController from "./controllers/TelepathyReporterController.js" import WormholeReporterController from "./controllers/WormholeReporterController.js" +import CCIPReporterController from "./controllers/CCIPReporterController.js" import Coordinator from "./Coordinator.js" import { settings } from "./settings/index.js" import logger from "./utils/logger.js" @@ -69,228 +70,241 @@ const main = () => { }, }) - // const sygmaReporterController = new SygmaReporterController({ - // type: "classic", - // sourceChain, - // destinationChains, - // logger, - // multiClient, - // reporterAddresses: { - // [gnosis.name]: unidirectionalReportersAddresses[sourceChain.name]?.[gnosis.name]?.SygmaReporter, - // }, - // adapterAddresses: { - // [gnosis.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.Gnosis?.SygmaAdapter, - // }, - // }) + const ccipReporterController = new CCIPReporterController({ + type: "classic", + sourceChain, + destinationChains: destinationChains.filter(({ name }) => name === gnosisChiado.name), + logger, + multiClient, + reporterAddress: unidirectionalReportersAddresses[sourceChain.name]?.[destinationChains[0].name]?.CCIPReporter, + adapterAddresses: { + [gnosisChiado.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[destinationChains[0].name]?.CCIPAdapter, + }, + }) - // const telepathyReporterController = new TelepathyReporterController({ - // type: "lightClient", - // sourceChain, - // destinationChains, - // logger, - // multiClient, - // adapterAddresses: { - // [gnosis.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.Gnosis?.TelepathyAdapter, - // [arbitrum.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.["Arbitrum One"]?.TelepathyAdapter, - // [optimism.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.["OP Mainnet"]?.TelepathyAdapter, - // [bsc.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.["BNB Smart Chain"]?.TelepathyAdapter, - // [polygon.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.Polygon?.TelepathyAdapter, - // }, - // baseProofUrl: settings.reporterControllers.TelepathyReporterController.baseProofUrl, - // lightClientAddresses: { - // [gnosis.name]: lightClientAddresses.Gnosis?.[sourceChain.name]?.TelepathyLightClient, - // [arbitrum.name]: lightClientAddresses["Arbitrum One"]?.[sourceChain.name]?.TelepathyLightClient, - // [optimism.name]: lightClientAddresses["OP Mainnet"]?.[sourceChain.name]?.TelepathyLightClient, - // [bsc.name]: lightClientAddresses["BNB Smart Chain"]?.[sourceChain.name]?.TelepathyLightClient, - // [polygon.name]: lightClientAddresses.Polygon?.[sourceChain.name]?.TelepathyLightClient, - // }, - // }) + const sygmaReporterController = new SygmaReporterController({ + type: "classic", + sourceChain, + destinationChains, + logger, + multiClient, + reporterAddresses: { + [gnosis.name]: unidirectionalReportersAddresses[sourceChain.name]?.[gnosis.name]?.SygmaReporter, + }, + adapterAddresses: { + [gnosis.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.Gnosis?.SygmaAdapter, + }, + }) + + const telepathyReporterController = new TelepathyReporterController({ + type: "lightClient", + sourceChain, + destinationChains, + logger, + multiClient, + adapterAddresses: { + [gnosis.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.Gnosis?.TelepathyAdapter, + [arbitrum.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.["Arbitrum One"]?.TelepathyAdapter, + [optimism.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.["OP Mainnet"]?.TelepathyAdapter, + [bsc.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.["BNB Smart Chain"]?.TelepathyAdapter, + [polygon.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.Polygon?.TelepathyAdapter, + }, + baseProofUrl: settings.reporterControllers.TelepathyReporterController.baseProofUrl, + lightClientAddresses: { + [gnosis.name]: lightClientAddresses.Gnosis?.[sourceChain.name]?.TelepathyLightClient, + [arbitrum.name]: lightClientAddresses["Arbitrum One"]?.[sourceChain.name]?.TelepathyLightClient, + [optimism.name]: lightClientAddresses["OP Mainnet"]?.[sourceChain.name]?.TelepathyLightClient, + [bsc.name]: lightClientAddresses["BNB Smart Chain"]?.[sourceChain.name]?.TelepathyLightClient, + [polygon.name]: lightClientAddresses.Polygon?.[sourceChain.name]?.TelepathyLightClient, + }, + }) - // const wormholeReporterController = new WormholeReporterController({ - // type: "classic", - // sourceChain, - // destinationChains, - // logger, - // multiClient, - // reporterAddress: (settings.contractAddresses.reporterAddresses as any)[sourceChain.name]?.WormholeHeaderReporter, - // adapterAddresses: { - // [gnosis.name]: (settings.contractAddresses.adapterAddresses as any)?.Gnosis?.WormholeAdapter, - // [optimism.name]: (settings.contractAddresses.adapterAddresses as any)["OP Mainnet"]?.WormholeAdapter, - // [bsc.name]: (settings.contractAddresses.adapterAddresses as any)["BNB Smart Chain"]?.WormholeAdapter, - // [polygon.name]: (settings.contractAddresses.adapterAddresses as any)?.Polygon.WormholeAdapter, - // [avalanche.name]: (settings.contractAddresses.adapterAddresses as any)?.Avalanche.WormholeAdapter, - // }, - // wormholeScanBaseUrl: settings.reporterControllers.WormholeReporterController.wormholeScanBaseUrl, - // wormholeAddress: (settings.contractAddresses as any)[sourceChain.name]?.Wormhole, - // wormholeChainIds: settings.reporterControllers.WormholeReporterController.wormholeChainIds, - // }) + const wormholeReporterController = new WormholeReporterController({ + type: "classic", + sourceChain, + destinationChains, + logger, + multiClient, + reporterAddress: (settings.contractAddresses.reporterAddresses as any)[sourceChain.name]?.WormholeHeaderReporter, + adapterAddresses: { + [gnosis.name]: (settings.contractAddresses.adapterAddresses as any)?.Gnosis?.WormholeAdapter, + [optimism.name]: (settings.contractAddresses.adapterAddresses as any)["OP Mainnet"]?.WormholeAdapter, + [bsc.name]: (settings.contractAddresses.adapterAddresses as any)["BNB Smart Chain"]?.WormholeAdapter, + [polygon.name]: (settings.contractAddresses.adapterAddresses as any)?.Polygon.WormholeAdapter, + [avalanche.name]: (settings.contractAddresses.adapterAddresses as any)?.Avalanche.WormholeAdapter, + }, + wormholeScanBaseUrl: settings.reporterControllers.WormholeReporterController.wormholeScanBaseUrl, + wormholeAddress: (settings.contractAddresses as any)[sourceChain.name]?.Wormhole, + wormholeChainIds: settings.reporterControllers.WormholeReporterController.wormholeChainIds, + }) - // // TODO: add check to prevent to always run OptimismReporterController even when destinationChains does not include optimism - // const optimismReporterController = new OptimismReporterController({ - // type: "native", - // sourceChain, - // logger, - // multiClient, - // reporterAddress: - // settings.contractAddresses.reporterAddresses.unidirectional.Ethereum["OP Mainnet"] - // .L1CrossDomainMessengerHeaderReporter, - // adapterAddresses: { - // [optimism.name]: - // settings.contractAddresses.adapterAddresses.unidirectional.Ethereum["OP Mainnet"].L2CrossDomainMessengerAdapter, - // }, - // }) + // TODO: add check to prevent to always run OptimismReporterController even when destinationChains does not include optimism + const optimismReporterController = new OptimismReporterController({ + type: "native", + sourceChain, + logger, + multiClient, + reporterAddress: + settings.contractAddresses.reporterAddresses.unidirectional.Ethereum["OP Mainnet"] + .L1CrossDomainMessengerHeaderReporter, + adapterAddresses: { + [optimism.name]: + settings.contractAddresses.adapterAddresses.unidirectional.Ethereum["OP Mainnet"].L2CrossDomainMessengerAdapter, + }, + }) - // const axelarReporterController = new StandardReporterController({ - // name: "AxelarReporterController", - // type: "classic", - // sourceChain, - // destinationChains, - // logger, - // multiClient, - // reporterAddresses: { - // [bsc.name]: unidirectionalReportersAddresses[sourceChain.name]?.[bsc.name]?.AxelarReporter, - // }, - // adapterAddresses: { - // [bsc.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[bsc.name]?.AxelarAdapter, - // }, - // reportHeadersValue: settings.reporterControllers.AxelarReporterController.reportHeadersValue, - // }) + const axelarReporterController = new StandardReporterController({ + name: "AxelarReporterController", + type: "classic", + sourceChain, + destinationChains, + logger, + multiClient, + reporterAddresses: { + [bsc.name]: unidirectionalReportersAddresses[sourceChain.name]?.[bsc.name]?.AxelarReporter, + }, + adapterAddresses: { + [bsc.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[bsc.name]?.AxelarAdapter, + }, + reportHeadersValue: settings.reporterControllers.AxelarReporterController.reportHeadersValue, + }) - // const connextReporterController = new StandardReporterController({ - // name: "ConnextReporterController", - // type: "classic", - // sourceChain, - // destinationChains, - // logger, - // multiClient, - // reporterAddresses: { - // [gnosis.name]: unidirectionalReportersAddresses[sourceChain.name]?.[gnosis.name]?.ConnextReporter, - // }, - // adapterAddresses: { - // [gnosis.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[gnosis.name]?.ConnextAdapter, - // }, - // reportHeadersValue: settings.reporterControllers.ConnextReporterController.reportHeadersValue, - // }) + const connextReporterController = new StandardReporterController({ + name: "ConnextReporterController", + type: "classic", + sourceChain, + destinationChains, + logger, + multiClient, + reporterAddresses: { + [gnosis.name]: unidirectionalReportersAddresses[sourceChain.name]?.[gnosis.name]?.ConnextReporter, + }, + adapterAddresses: { + [gnosis.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[gnosis.name]?.ConnextAdapter, + }, + reportHeadersValue: settings.reporterControllers.ConnextReporterController.reportHeadersValue, + }) - // const celerReporterController = new StandardReporterController({ - // name: "CelerReporterController", - // type: "classic", - // sourceChain, - // destinationChains, - // logger, - // multiClient, - // reporterAddresses: { - // [polygon.name]: unidirectionalReportersAddresses[sourceChain.name]?.[polygon.name]?.CelerReporter, - // }, - // adapterAddresses: { - // [polygon.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[polygon.name]?.CelerAdapter, - // }, - // reportHeadersValue: settings.reporterControllers.CelerReporterController.reportHeadersValue, - // }) + const celerReporterController = new StandardReporterController({ + name: "CelerReporterController", + type: "classic", + sourceChain, + destinationChains, + logger, + multiClient, + reporterAddresses: { + [polygon.name]: unidirectionalReportersAddresses[sourceChain.name]?.[polygon.name]?.CelerReporter, + }, + adapterAddresses: { + [polygon.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[polygon.name]?.CelerAdapter, + }, + reportHeadersValue: settings.reporterControllers.CelerReporterController.reportHeadersValue, + }) - // const layerZeroReporterController = new StandardReporterController({ - // name: "LayerZeroReporterController", - // type: "classic", - // sourceChain, - // destinationChains, - // logger, - // multiClient, - // reporterAddresses: { - // [avalanche.name]: unidirectionalReportersAddresses[sourceChain.name]?.[avalanche.name]?.LayerZeroReporter, - // [bsc.name]: unidirectionalReportersAddresses[sourceChain.name]?.[bsc.name]?.LayerZeroReporter, - // }, - // adapterAddresses: { - // [avalanche.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[avalanche.name]?.LayerZeroAdapter, - // [bsc.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[bsc.name]?.LayerZeroAdapter, - // }, - // reportHeadersValue: settings.reporterControllers.LayerZeroReporterController.reportHeadersValue, - // }) + const layerZeroReporterController = new StandardReporterController({ + name: "LayerZeroReporterController", + type: "classic", + sourceChain, + destinationChains, + logger, + multiClient, + reporterAddresses: { + [avalanche.name]: unidirectionalReportersAddresses[sourceChain.name]?.[avalanche.name]?.LayerZeroReporter, + [bsc.name]: unidirectionalReportersAddresses[sourceChain.name]?.[bsc.name]?.LayerZeroReporter, + }, + adapterAddresses: { + [avalanche.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[avalanche.name]?.LayerZeroAdapter, + [bsc.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[bsc.name]?.LayerZeroAdapter, + }, + reportHeadersValue: settings.reporterControllers.LayerZeroReporterController.reportHeadersValue, + }) - // const hyperlaneReporterController = new StandardReporterController({ - // name: "HyperlaneReporterController", - // type: "classic", - // sourceChain, - // destinationChains, - // logger, - // multiClient, - // reporterAddresses: { - // [bsc.name]: unidirectionalReportersAddresses[sourceChain.name]?.[bsc.name]?.HyperlaneReporter, - // }, - // adapterAddresses: { - // [bsc.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[bsc.name]?.HyperlaneAdapter, - // }, - // }) + const hyperlaneReporterController = new StandardReporterController({ + name: "HyperlaneReporterController", + type: "classic", + sourceChain, + destinationChains, + logger, + multiClient, + reporterAddresses: { + [bsc.name]: unidirectionalReportersAddresses[sourceChain.name]?.[bsc.name]?.HyperlaneReporter, + }, + adapterAddresses: { + [bsc.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[bsc.name]?.HyperlaneAdapter, + }, + }) - // const ccipReporterController = new StandardReporterController({ - // name: "CCIPReporterController", - // type: "classic", - // sourceChain, - // destinationChains, - // logger, - // multiClient, - // reporterAddresses: { - // [optimismGoerli.name]: unidirectionalReportersAddresses[sourceChain.name]?.[optimismGoerli.name]?.CCIPReporter, - // [bscTestnet.name]: unidirectionalReportersAddresses[sourceChain.name]?.[bscTestnet.name]?.CCIPReporter, - // [avalanche.name]: unidirectionalReportersAddresses[sourceChain.name]?.[avalanche.name]?.CCIPReporter, - // }, - // adapterAddresses: { - // [optimismGoerli.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[optimismGoerli.name]?.CCIPAdapter, - // [bscTestnet.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[bscTestnet.name]?.CCIPAdapter, - // [avalanche.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[avalanche.name]?.CCIPAdapter, - // }, - // reportHeadersValue: settings.reporterControllers.CCIPReporterController.reportHeadersValue, - // }) + const ccipReporterController = new StandardReporterController({ + name: "CCIPReporterController", + type: "classic", + sourceChain, + destinationChains, + logger, + multiClient, + reporterAddresses: { + [optimismGoerli.name]: unidirectionalReportersAddresses[sourceChain.name]?.[optimismGoerli.name]?.CCIPReporter, + [bscTestnet.name]: unidirectionalReportersAddresses[sourceChain.name]?.[bscTestnet.name]?.CCIPReporter, + [avalanche.name]: unidirectionalReportersAddresses[sourceChain.name]?.[avalanche.name]?.CCIPReporter, + }, + adapterAddresses: { + [optimismGoerli.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[optimismGoerli.name]?.CCIPAdapter, + [bscTestnet.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[bscTestnet.name]?.CCIPAdapter, + [avalanche.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[avalanche.name]?.CCIPAdapter, + }, + reportHeadersValue: settings.reporterControllers.CCIPReporterController.reportHeadersValue, + }) - // const zetaReporterController = new StandardReporterController({ - // name: "ZetaReporterController", - // type: "classic", - // sourceChain, - // destinationChains, - // logger, - // multiClient, - // reporterAddresses: { - // [bscTestnet.name]: unidirectionalReportersAddresses[sourceChain.name]?.[bscTestnet.name]?.ZetaChainReporter, - // }, - // adapterAddresses: { - // [bscTestnet.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[bscTestnet.name]?.ZetaChainAdapter, - // }, - // reportHeadersValue: settings.reporterControllers.ZetaReporterController.reportHeadersValue, - // }) + const zetaReporterController = new StandardReporterController({ + name: "ZetaReporterController", + type: "classic", + sourceChain, + destinationChains, + logger, + multiClient, + reporterAddresses: { + [bscTestnet.name]: unidirectionalReportersAddresses[sourceChain.name]?.[bscTestnet.name]?.ZetaChainReporter, + }, + adapterAddresses: { + [bscTestnet.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[bscTestnet.name]?.ZetaChainAdapter, + }, + reportHeadersValue: settings.reporterControllers.ZetaReporterController.reportHeadersValue, + }) - // const electronReporterController = new ElectronReporterController({ - // type: "lightClient", - // sourceChain, - // destinationChains, - // logger, - // multiClient, - // adapterAddresses: { - // [gnosisChiado.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.["Gnosis Chiado"]?.ElectronAdapter, - // }, - // headerStorageAddress: (settings.contractAddresses as any)[sourceChain.name].HeaderStorage, - // lightClientAddresses: { - // [gnosisChiado.name]: lightClientAddresses["Gnosis Chiado"]?.[sourceChain.name]?.ElectronLightClient, - // }, - // beaconchaBaseUrl: (settings.reporterControllers.ElectronReporterController.beaconchaBaseUrls as any)[ - // sourceChain.name - // ], - // beaconApiBaseUrl: (settings.beaconApiUrls as any)[sourceChain.name], - // }) + const electronReporterController = new ElectronReporterController({ + type: "lightClient", + sourceChain, + destinationChains, + logger, + multiClient, + adapterAddresses: { + [gnosisChiado.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.["Gnosis Chiado"]?.ElectronAdapter, + }, + headerStorageAddress: (settings.contractAddresses as any)[sourceChain.name].HeaderStorage, + lightClientAddresses: { + [gnosisChiado.name]: lightClientAddresses["Gnosis Chiado"]?.[sourceChain.name]?.ElectronLightClient, + }, + beaconchaBaseUrl: (settings.reporterControllers.ElectronReporterController.beaconchaBaseUrls as any)[ + sourceChain.name + ], + beaconApiBaseUrl: (settings.beaconApiUrls as any)[sourceChain.name], + }) const coordinator = new Coordinator({ controllers: [ ambReporterController, - // sygmaReporterController, - // telepathyReporterController, - // wormholeReporterController, - // optimismReporterController, - // axelarReporterController, - // connextReporterController, - // celerReporterController, - // layerZeroReporterController, - // hyperlaneReporterController, - // ccipReporterController, - // zetaReporterController, - // electronReporterController, + ccipReporterController, + sygmaReporterController, + telepathyReporterController, + wormholeReporterController, + optimismReporterController, + axelarReporterController, + connextReporterController, + celerReporterController, + layerZeroReporterController, + hyperlaneReporterController, + ccipReporterController, + zetaReporterController, + electronReporterController, ].filter((_controller) => controllersEnabled?.includes(_controller.name)), intervalFetchBlocksMs: settings.Coordinator.intervalFetchBlocksMs, logger, diff --git a/packages/reporter/src/settings/index.ts b/packages/reporter/src/settings/index.ts index eb4cf97e..7a92d247 100644 --- a/packages/reporter/src/settings/index.ts +++ b/packages/reporter/src/settings/index.ts @@ -85,6 +85,7 @@ export const settings = { }, [gnosisChiado.name]: { AMBAdapter: process.env.CHIADO_ADAPTER as `0x${string}`, + CCIPAdapter: process.env.SEPOLIA_CHIADO_CCIP_ADAPTER as `0x${string}`, }, }, [goerli.name]: { @@ -146,6 +147,7 @@ export const settings = { }, [gnosisChiado.name]: { AMBReporter: process.env.SEPOLIA_CHIADO_REPORTER as `0x${string}`, + CCIPReporter: process.env.SEPOLIA_CHIADO_CCIP_REPORTER as `0x${string}`, }, }, [goerli.name]: { From adbf1ee38ed087c638ff2884569170d92ec0fe3f Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Thu, 11 Jul 2024 22:41:08 +0200 Subject: [PATCH 227/297] chore: change AMB controller into Standard controller --- packages/reporter/.env.example | 3 + .../ABIs/LayerZeroReporterContractABI.json | 368 ++++++++++++++++++ packages/reporter/src/Coordinator.ts | 1 + .../src/controllers/AMBReporterController.ts | 43 -- .../src/controllers/CCIPReporterController.ts | 43 -- packages/reporter/src/index.ts | 34 +- packages/reporter/src/settings/index.ts | 9 + 7 files changed, 398 insertions(+), 103 deletions(-) create mode 100644 packages/reporter/src/ABIs/LayerZeroReporterContractABI.json delete mode 100644 packages/reporter/src/controllers/AMBReporterController.ts delete mode 100644 packages/reporter/src/controllers/CCIPReporterController.ts diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index dad27e33..de90174e 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -37,6 +37,9 @@ DESTINATION_CHAIN_IDS=100 SEPOLIA_CHIADO_REPORTER=0xc6755144d60548f3DD420F47Cf48DAe553bBf042 CHIADO_ADAPTER=0x3F5929bee6A59661D6CcC9c4eB751048009CE11B SEPOLIA_CHIADO_CCIP_REPORTER=0xf66871C91952b09270d223cD3A1e5Dad57b14fbC +SEPOLIA_CHIADO_LZ_REPORTER=0xF7c2687c75FcBC7A00663f9436783A2B898537a4 +SEPOLIA_CHIADO_LZ_ADAPTER= + AMB_ADAPTER=0x4efB95c26bB2ebD3281749A5eAA388bc302b4445 SYMGA_ADAPTER=0x9AD7a6f4FDA8247cC0bF5932B68c5b619937dB15 GNOSIS_TELEPATHY_ADAPTER=0xDeF29f44f8315d0079A25EF03cfB0b0D8CdA3cF8 diff --git a/packages/reporter/src/ABIs/LayerZeroReporterContractABI.json b/packages/reporter/src/ABIs/LayerZeroReporterContractABI.json new file mode 100644 index 00000000..6d6a228c --- /dev/null +++ b/packages/reporter/src/ABIs/LayerZeroReporterContractABI.json @@ -0,0 +1,368 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "headerStorage", + "type": "address" + }, + { + "internalType": "address", + "name": "yaho", + "type": "address" + }, + { + "internalType": "address", + "name": "lzEndpoint", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "EndpointIdNotAvailable", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "expectedYaho", + "type": "address" + } + ], + "name": "NotYaho", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "contract IAdapter", + "name": "adapter", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "blockHeader", + "type": "bytes32" + } + ], + "name": "BlockDispatched", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint16", + "name": "endpointId", + "type": "uint16" + } + ], + "name": "EndpointIdSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "name": "FeeSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "contract IAdapter", + "name": "adapter", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "messageId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "messageHash", + "type": "bytes32" + } + ], + "name": "MessageDispatched", + "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": [], + "name": "HEADER_STORAGE", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "LAYER_ZERO_ENDPOINT", + "outputs": [ + { + "internalType": "contract ILayerZeroEndpoint", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PROVIDER", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "YAHO", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "internalType": "contract IAdapter", + "name": "adapter", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "blockNumbers", + "type": "uint256[]" + } + ], + "name": "dispatchBlocks", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "internalType": "contract IAdapter", + "name": "adapter", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "messageIds", + "type": "uint256[]" + }, + { + "internalType": "bytes32[]", + "name": "messageHashes", + "type": "bytes32[]" + } + ], + "name": "dispatchMessages", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "endpointIds", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "fee", + "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": [ + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "uint16", + "name": "endpointId", + "type": "uint16" + } + ], + "name": "setEndpointIdByChainId", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "fee_", + "type": "uint256" + } + ], + "name": "setFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] diff --git a/packages/reporter/src/Coordinator.ts b/packages/reporter/src/Coordinator.ts index aa97f878..8101e33a 100644 --- a/packages/reporter/src/Coordinator.ts +++ b/packages/reporter/src/Coordinator.ts @@ -47,6 +47,7 @@ class Coordinator { } start() { + console.log("controllers: ", this.controllers) this.fetchBlocks() this.intervals.push( setInterval(() => { diff --git a/packages/reporter/src/controllers/AMBReporterController.ts b/packages/reporter/src/controllers/AMBReporterController.ts deleted file mode 100644 index c6a0a474..00000000 --- a/packages/reporter/src/controllers/AMBReporterController.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { Chain } from "viem" -import ABI from "../ABIs/AMBReporterContractABI.json" assert { type: "json" } - -import BaseController from "./BaseController.js" - -import { BaseControllerConfigs } from "./BaseController.js" - -class AMBReporterController extends BaseController { - constructor(_configs: BaseControllerConfigs) { - super(_configs, "AMBReporterController") - } - - async onBlocks(_blockNumbers: bigint[]) { - try { - const client = this.multiClient.getClientByChain(this.sourceChain) - - for (const chain of this.destinationChains as Chain[]) { - const blockNumber = _blockNumbers[_blockNumbers.length - 1] - - this.logger.info( - `reporting block header for block from ${_blockNumbers[0]} to ${_blockNumbers[_blockNumbers.length - 1]} on ${ - chain.name - } ...`, - ) - - const { request } = await client.simulateContract({ - address: this.reporterAddress as `0x${string}`, - abi: ABI, - functionName: "dispatchBlocks", - args: [chain.id, this.adapterAddresses[chain.name], [blockNumber]], - }) - - const txHash = await client.writeContract(request) - - this.logger.info(`headers reporter from ${this.sourceChain.name} to ${chain.name}: ${txHash}`) - } - } catch (_error) { - this.logger.error(_error) - } - } -} - -export default AMBReporterController diff --git a/packages/reporter/src/controllers/CCIPReporterController.ts b/packages/reporter/src/controllers/CCIPReporterController.ts deleted file mode 100644 index 702bdb03..00000000 --- a/packages/reporter/src/controllers/CCIPReporterController.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { Chain } from "viem" -import ABI from "../ABIs/CCIPReporterContractABI.json" assert { type: "json" } - -import BaseController from "./BaseController.js" - -import { BaseControllerConfigs } from "./BaseController.js" - -class CCIPReporterController extends BaseController { - constructor(_configs: BaseControllerConfigs) { - super(_configs, "CCIPReporterController") - } - - async onBlocks(_blockNumbers: bigint[]) { - try { - const client = this.multiClient.getClientByChain(this.sourceChain) - - for (const chain of this.destinationChains as Chain[]) { - const blockNumber = _blockNumbers[_blockNumbers.length - 1] - - this.logger.info( - `reporting block header for block from ${_blockNumbers[0]} to ${_blockNumbers[_blockNumbers.length - 1]} on ${ - chain.name - } ...`, - ) - - const { request } = await client.simulateContract({ - address: this.reporterAddress as `0x${string}`, - abi: ABI, - functionName: "dispatchBlocks", - args: [chain.id, this.adapterAddresses[chain.name], [blockNumber]], - value: 200000000000000, // fee - }) - - const txHash = await client.writeContract(request) - this.logger.info(`headers reporter from ${this.sourceChain.name} to ${chain.name}: ${txHash}`) - } - } catch (_error) { - this.logger.error(_error) - } - } -} - -export default CCIPReporterController diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 39699784..bcbc6941 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -11,18 +11,18 @@ import { polygon, mainnet, sepolia, + optimismSepolia, } from "viem/chains" import { Chain } from "viem" import Multiclient from "./MultiClient.js" -import AMBReporterController from "./controllers/AMBReporterController.js" import ElectronReporterController from "./controllers/ElectronReporterController.js" import OptimismReporterController from "./controllers/OptimismReporterController.js" import SygmaReporterController from "./controllers/SygmaReporterController.js" import StandardReporterController from "./controllers/StandardReporterController.js" import TelepathyReporterController from "./controllers/TelepathyReporterController.js" import WormholeReporterController from "./controllers/WormholeReporterController.js" -import CCIPReporterController from "./controllers/CCIPReporterController.js" + import Coordinator from "./Coordinator.js" import { settings } from "./settings/index.js" import logger from "./utils/logger.js" @@ -58,27 +58,18 @@ const main = () => { rpcUrls: settings.rpcUrls, }) - const ambReporterController = new AMBReporterController({ + const ambReporterController = new StandardReporterController({ + name: "AMBReporterController", type: "classic", sourceChain, destinationChains: destinationChains.filter(({ name }) => name === gnosisChiado.name), logger, multiClient, - reporterAddress: unidirectionalReportersAddresses[sourceChain.name]?.[destinationChains[0].name]?.AMBReporter, - adapterAddresses: { - [gnosisChiado.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[destinationChains[0].name]?.AMBAdapter, + reporterAddresses: { + [gnosisChiado.name]: unidirectionalReportersAddresses[sourceChain.name]?.[gnosisChiado.name]?.AMBReporter, }, - }) - - const ccipReporterController = new CCIPReporterController({ - type: "classic", - sourceChain, - destinationChains: destinationChains.filter(({ name }) => name === gnosisChiado.name), - logger, - multiClient, - reporterAddress: unidirectionalReportersAddresses[sourceChain.name]?.[destinationChains[0].name]?.CCIPReporter, adapterAddresses: { - [gnosisChiado.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[destinationChains[0].name]?.CCIPAdapter, + [gnosisChiado.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[gnosisChiado.name]?.AMBAdapter, }, }) @@ -206,15 +197,22 @@ const main = () => { type: "classic", sourceChain, destinationChains, + logger, multiClient, reporterAddresses: { [avalanche.name]: unidirectionalReportersAddresses[sourceChain.name]?.[avalanche.name]?.LayerZeroReporter, [bsc.name]: unidirectionalReportersAddresses[sourceChain.name]?.[bsc.name]?.LayerZeroReporter, + [gnosisChiado.name]: unidirectionalReportersAddresses[sourceChain.name]?.[gnosisChiado.name]?.LayerZeroReporter, + [optimismSepolia.name]: + unidirectionalReportersAddresses[sourceChain.name]?.[optimismSepolia.name]?.LayerZeroReporter, }, adapterAddresses: { [avalanche.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[avalanche.name]?.LayerZeroAdapter, [bsc.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[bsc.name]?.LayerZeroAdapter, + [gnosisChiado.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[gnosisChiado.name]?.LayerZeroAdapter, + [optimismSepolia.name]: + unidirectionalAdaptersAddresses[sourceChain.name]?.[optimismSepolia.name]?.LayerZeroAdapter, }, reportHeadersValue: settings.reporterControllers.LayerZeroReporterController.reportHeadersValue, }) @@ -245,11 +243,13 @@ const main = () => { [optimismGoerli.name]: unidirectionalReportersAddresses[sourceChain.name]?.[optimismGoerli.name]?.CCIPReporter, [bscTestnet.name]: unidirectionalReportersAddresses[sourceChain.name]?.[bscTestnet.name]?.CCIPReporter, [avalanche.name]: unidirectionalReportersAddresses[sourceChain.name]?.[avalanche.name]?.CCIPReporter, + [gnosisChiado.name]: unidirectionalReportersAddresses[sourceChain.name]?.[gnosisChiado.name]?.CCIPReporter, }, adapterAddresses: { [optimismGoerli.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[optimismGoerli.name]?.CCIPAdapter, [bscTestnet.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[bscTestnet.name]?.CCIPAdapter, [avalanche.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[avalanche.name]?.CCIPAdapter, + [gnosisChiado.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[gnosisChiado.name]?.CCIPAdapter, }, reportHeadersValue: settings.reporterControllers.CCIPReporterController.reportHeadersValue, }) @@ -279,7 +279,7 @@ const main = () => { adapterAddresses: { [gnosisChiado.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.["Gnosis Chiado"]?.ElectronAdapter, }, - headerStorageAddress: (settings.contractAddresses as any)[sourceChain.name].HeaderStorage, + headerStorageAddress: (settings.contractAddresses as any)[sourceChain.name]?.HeaderStorage, lightClientAddresses: { [gnosisChiado.name]: lightClientAddresses["Gnosis Chiado"]?.[sourceChain.name]?.ElectronLightClient, }, diff --git a/packages/reporter/src/settings/index.ts b/packages/reporter/src/settings/index.ts index 7a92d247..affe4b31 100644 --- a/packages/reporter/src/settings/index.ts +++ b/packages/reporter/src/settings/index.ts @@ -11,6 +11,7 @@ import { mainnet, optimism, optimismGoerli, + optimismSepolia, polygon, sepolia, } from "viem/chains" @@ -77,6 +78,9 @@ export const settings = { },*/ }, [sepolia.name]: { + [optimismSepolia.name]: { + LayerZeroAdapter: process.env.OPTIMISM_SEPOLIA_LZ_ADAPTER as `0x${string}`, + }, [optimismGoerli.name]: { CCIPAdapter: process.env.OPTIMISM_GOERLI_CCIP_ADAPTER_SEPOLIA as `0x${string}`, }, @@ -86,6 +90,7 @@ export const settings = { [gnosisChiado.name]: { AMBAdapter: process.env.CHIADO_ADAPTER as `0x${string}`, CCIPAdapter: process.env.SEPOLIA_CHIADO_CCIP_ADAPTER as `0x${string}`, + LayerZeroAdapter: process.env.SEPOLIA_CHIADO_LZ_ADAPTER as `0x${string}`, }, }, [goerli.name]: { @@ -139,6 +144,9 @@ export const settings = { }, }, [sepolia.name]: { + [optimismSepolia.name]: { + LayerZeroReporter: process.env.SEPOLIA_CHIADO_LZ_REPORTER as `0x${string}`, + }, [optimismGoerli.name]: { CCIPReporter: process.env.SEPOLIA_CCIP_REPORTER_OPTIMISM_GOERLI as `0x${string}`, }, @@ -148,6 +156,7 @@ export const settings = { [gnosisChiado.name]: { AMBReporter: process.env.SEPOLIA_CHIADO_REPORTER as `0x${string}`, CCIPReporter: process.env.SEPOLIA_CHIADO_CCIP_REPORTER as `0x${string}`, + LayerZeroReporter: process.env.SEPOLIA_CHIADO_LZ_REPORTER as `0x${string}`, }, }, [goerli.name]: { From f5d5e836f1c7b45916c3f4cfe9bdd9fea874fe09 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Fri, 12 Jul 2024 18:09:06 +0200 Subject: [PATCH 228/297] WIP: update LayerZero adapter to LZ v2 & fix controller config --- .../adapters/LayerZero/LayerZeroAdapter.sol | 28 ++++--- .../adapters/LayerZero/LayerZeroReporter.sol | 44 ++++++---- .../interfaces/ILayerZeroEndpointV2.sol | 84 +++++++++++++++++++ .../interfaces/ILayerZeroReceiver.sol | 14 ++-- packages/evm/package.json | 5 ++ packages/reporter/.env.example | 63 ++++++++++---- packages/reporter/src/index.ts | 28 +++++-- packages/reporter/src/settings/index.ts | 16 +++- 8 files changed, 220 insertions(+), 62 deletions(-) create mode 100644 packages/evm/contracts/adapters/LayerZero/interfaces/ILayerZeroEndpointV2.sol diff --git a/packages/evm/contracts/adapters/LayerZero/LayerZeroAdapter.sol b/packages/evm/contracts/adapters/LayerZero/LayerZeroAdapter.sol index e9688db8..6d683fc1 100644 --- a/packages/evm/contracts/adapters/LayerZero/LayerZeroAdapter.sol +++ b/packages/evm/contracts/adapters/LayerZero/LayerZeroAdapter.sol @@ -3,33 +3,41 @@ pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { ILayerZeroReceiver } from "./interfaces/ILayerZeroReceiver.sol"; +import { Origin } from "./interfaces/ILayerZeroEndpointV2.sol"; import { BlockHashAdapter } from "../BlockHashAdapter.sol"; contract LayerZeroAdapter is BlockHashAdapter, Ownable, ILayerZeroReceiver { string public constant PROVIDER = "layer-zero"; address public immutable LAYER_ZERO_ENDPOINT; - mapping(uint32 => bytes32) public enabledReportersPaths; + mapping(uint32 => address) public enabledReporter; mapping(uint32 => uint256) public chainIds; error UnauthorizedLayerZeroReceive(); - event ReporterSet(uint256 indexed chainId, uint16 indexed endpointId, address indexed reporter); + event ReporterSet(uint256 indexed chainId, uint32 indexed endpointId, address indexed reporter); constructor(address lzEndpoint) { LAYER_ZERO_ENDPOINT = lzEndpoint; } - function lzReceive(uint16 srcEndpointId, bytes memory srcPath, uint64 /* nonce */, bytes memory payload) external { - if (msg.sender != LAYER_ZERO_ENDPOINT || enabledReportersPaths[srcEndpointId] != keccak256(srcPath)) - revert UnauthorizedLayerZeroReceive(); - uint256 sourceChainId = chainIds[srcEndpointId]; - (uint256[] memory ids, bytes32[] memory hashes) = abi.decode(payload, (uint256[], bytes32[])); - _storeHashes(sourceChainId, ids, hashes); + function lzReceive( + Origin calldata _origin, + bytes32 _guid, + bytes calldata _message, + address _executor, + bytes calldata _extraData + ) external payable { + if ( + msg.sender != LAYER_ZERO_ENDPOINT || + enabledReporter[_origin.srcEid] != address(uint160(uint256(_origin.sender))) + ) revert UnauthorizedLayerZeroReceive(); + (uint256[] memory ids, bytes32[] memory hashes) = abi.decode(_message, (uint256[], bytes32[])); + _storeHashes(chainIds[_origin.srcEid], ids, hashes); } - function setReporterByChain(uint256 chainId, uint16 endpointId, address reporter) external onlyOwner { - enabledReportersPaths[endpointId] = keccak256(abi.encodePacked(reporter, address(this))); + function setReporterByChain(uint256 chainId, uint32 endpointId, address reporter) external onlyOwner { + enabledReporter[endpointId] = reporter; chainIds[endpointId] = chainId; emit ReporterSet(chainId, endpointId, reporter); } diff --git a/packages/evm/contracts/adapters/LayerZero/LayerZeroReporter.sol b/packages/evm/contracts/adapters/LayerZero/LayerZeroReporter.sol index fc87b8af..a7d8c27f 100644 --- a/packages/evm/contracts/adapters/LayerZero/LayerZeroReporter.sol +++ b/packages/evm/contracts/adapters/LayerZero/LayerZeroReporter.sol @@ -2,54 +2,62 @@ pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; -import { ILayerZeroEndpoint } from "./interfaces/ILayerZeroEndpoint.sol"; +import { ILayerZeroEndpointV2, MessagingParams } from "./interfaces/ILayerZeroEndpointV2.sol"; import { Reporter } from "../Reporter.sol"; +import { OptionsBuilder } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/libs/OptionsBuilder.sol"; contract LayerZeroReporter is Reporter, Ownable { + using OptionsBuilder for bytes; + string public constant PROVIDER = "layer-zero"; - ILayerZeroEndpoint public immutable LAYER_ZERO_ENDPOINT; + ILayerZeroEndpointV2 public immutable LAYER_ZERO_ENDPOINT; - mapping(uint256 => uint16) public endpointIds; - uint256 public fee; + mapping(uint256 => uint32) public endpointIds; + uint128 public fee; + address refundAddress; error EndpointIdNotAvailable(); - event EndpointIdSet(uint256 indexed chainId, uint16 indexed endpointId); + event EndpointIdSet(uint256 indexed chainId, uint32 indexed endpointId); event FeeSet(uint256 fee); constructor(address headerStorage, address yaho, address lzEndpoint) Reporter(headerStorage, yaho) { - LAYER_ZERO_ENDPOINT = ILayerZeroEndpoint(lzEndpoint); + LAYER_ZERO_ENDPOINT = ILayerZeroEndpointV2(lzEndpoint); } - function setEndpointIdByChainId(uint256 chainId, uint16 endpointId) external onlyOwner { + function setEndpointIdByChainId(uint256 chainId, uint32 endpointId) external onlyOwner { endpointIds[chainId] = endpointId; emit EndpointIdSet(chainId, endpointId); } - function setFee(uint256 fee_) external onlyOwner { + function setFee(uint128 fee_) external onlyOwner { fee = fee_; emit FeeSet(fee); } + function setRefundAddress(address refundAddress_) external onlyOwner { + refundAddress = refundAddress_; + } + function _dispatch( uint256 targetChainId, address adapter, uint256[] memory ids, bytes32[] memory hashes ) internal override returns (bytes32) { - uint16 targetEndpointId = endpointIds[targetChainId]; + uint32 targetEndpointId = endpointIds[targetChainId]; if (targetEndpointId == 0) revert EndpointIdNotAvailable(); - bytes memory payload = abi.encode(ids, hashes); - bytes memory path = abi.encodePacked(adapter, address(this)); - // solhint-disable-next-line check-send-result - LAYER_ZERO_ENDPOINT.send{ value: fee }( + bytes memory options = OptionsBuilder.newOptions().addExecutorLzReceiveOption(fee, 0); + bytes memory message = abi.encode(ids, hashes); + MessagingParams memory params = MessagingParams( targetEndpointId, - path, - payload, - payable(msg.sender), // _refundAddress: refund address - address(0), // _zroPaymentAddress: future parameter - bytes("") // _adapterParams: adapterParams (see "Advanced Features") + bytes32(abi.encode(adapter)), + message, + options, + false // receiver in lz Token ); + // solhint-disable-next-line check-send-result + LAYER_ZERO_ENDPOINT.send{ value: msg.value }(params, refundAddress); return bytes32(0); } } diff --git a/packages/evm/contracts/adapters/LayerZero/interfaces/ILayerZeroEndpointV2.sol b/packages/evm/contracts/adapters/LayerZero/interfaces/ILayerZeroEndpointV2.sol new file mode 100644 index 00000000..6ced7ba9 --- /dev/null +++ b/packages/evm/contracts/adapters/LayerZero/interfaces/ILayerZeroEndpointV2.sol @@ -0,0 +1,84 @@ +// SPDX-License-Identifier: MIT + +pragma solidity >=0.8.0; + +struct MessagingParams { + uint32 dstEid; + bytes32 receiver; + bytes message; + bytes options; + bool payInLzToken; +} + +struct MessagingReceipt { + bytes32 guid; + uint64 nonce; + MessagingFee fee; +} + +struct MessagingFee { + uint256 nativeFee; + uint256 lzTokenFee; +} + +struct Origin { + uint32 srcEid; + bytes32 sender; + uint64 nonce; +} + +interface ILayerZeroEndpointV2 { + event PacketSent(bytes encodedPayload, bytes options, address sendLibrary); + + event PacketVerified(Origin origin, address receiver, bytes32 payloadHash); + + event PacketDelivered(Origin origin, address receiver); + + event LzReceiveAlert( + address indexed receiver, + address indexed executor, + Origin origin, + bytes32 guid, + uint256 gas, + uint256 value, + bytes message, + bytes extraData, + bytes reason + ); + + event LzTokenSet(address token); + + event DelegateSet(address sender, address delegate); + + function quote(MessagingParams calldata _params, address _sender) external view returns (MessagingFee memory); + + function send( + MessagingParams calldata _params, + address _refundAddress + ) external payable returns (MessagingReceipt memory); + + function verify(Origin calldata _origin, address _receiver, bytes32 _payloadHash) external; + + function verifiable(Origin calldata _origin, address _receiver) external view returns (bool); + + function initializable(Origin calldata _origin, address _receiver) external view returns (bool); + + function lzReceive( + Origin calldata _origin, + address _receiver, + bytes32 _guid, + bytes calldata _message, + bytes calldata _extraData + ) external payable; + + // oapp can burn messages partially by calling this function with its own business logic if messages are verified in order + function clear(address _oapp, Origin calldata _origin, bytes32 _guid, bytes calldata _message) external; + + function setLzToken(address _lzToken) external; + + function lzToken() external view returns (address); + + function nativeToken() external view returns (address); + + function setDelegate(address _delegate) external; +} diff --git a/packages/evm/contracts/adapters/LayerZero/interfaces/ILayerZeroReceiver.sol b/packages/evm/contracts/adapters/LayerZero/interfaces/ILayerZeroReceiver.sol index af1c7a87..6c6144da 100644 --- a/packages/evm/contracts/adapters/LayerZero/interfaces/ILayerZeroReceiver.sol +++ b/packages/evm/contracts/adapters/LayerZero/interfaces/ILayerZeroReceiver.sol @@ -1,11 +1,13 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.20; +import { Origin } from "./ILayerZeroEndpointV2.sol"; interface ILayerZeroReceiver { - // @notice LayerZero endpoint will invoke this function to deliver the message on the destination - // @param _srcChainId - the source endpoint identifier - // @param _srcAddress - the source sending contract address from the source chain - // @param _nonce - the ordered message nonce - // @param _payload - the signed payload is the UA bytes has encoded to be sent - function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external; + function lzReceive( + Origin calldata _origin, + bytes32 _guid, + bytes calldata _message, + address _executor, + bytes calldata _extraData + ) external payable; } diff --git a/packages/evm/package.json b/packages/evm/package.json index 5a7ec34b..6af92c76 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -18,6 +18,7 @@ "@nomicfoundation/hardhat-chai-matchers": "^1.0.4", "@nomicfoundation/hardhat-network-helpers": "^1.0.8", "@nomicfoundation/hardhat-toolbox": "^2.0.0", + "@nomicfoundation/hardhat-verify": "^2.0.8", "@nomiclabs/hardhat-ethers": "^2.2.1", "@nomiclabs/hardhat-etherscan": "^3.1.2", "@trivago/prettier-plugin-sort-imports": "^4.0.0", @@ -94,9 +95,13 @@ "@chainlink/contracts-ccip": "0.7.6", "@connext/interfaces": "2.0.0", "@hyperlane-xyz/core": "3.1.10", + "@layerzerolabs/lz-evm-messagelib-v2": "^2.3.29", + "@layerzerolabs/lz-evm-oapp-v2": "^2.3.29", + "@layerzerolabs/lz-evm-protocol-v2": "^2.3.29", "@openzeppelin/contracts-upgradeable": "4.8.1", "@polytope-labs/solidity-merkle-trees": "0.2.1", "@routerprotocol/evm-gateway-contracts": "1.1.13", + "solidity-bytes-utils": "^0.8.2", "solidity-rlp": "2.0.8" } } diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index de90174e..0281cfb3 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -1,22 +1,23 @@ +# Fake private key PRIVATE_KEY= -REPORTERS_ENABLED=AMBReporterController,SygmaReporterController,TelepathyReporterController,WormholeReporterController,OptimismReporterController,AxelarReporterController,ConnextReporterController,CelerReporterController,LayerZeroReporterController,CCIPReporterController,ZetaReporterController - +REPORTERS_ENABLED=AMBReporterController,LayerZeroReporterController GNOSIS_RPC_URL=https://rpc.ankr.com/gnosis -MAINNET_RPC_URL= +MAINNET_RPC_URL=https://eth.llamarpc.com +BSC_RPC_URL=https://bsc-dataseed1.binance.org GOERLI_RPC_URL= -POLYGON_RPC_URL= +POLYGON_RPC_URL=https://polygon.llamarpc.com OPTIMISM_RPC_URL=https://optimism.llamarpc.com ARBITRUM_RPC_URL=https://arbitrum.llamarpc.com -SEPOLIA_RPC_URL= +SEPOLIA_RPC_URL=https://1rpc.io/sepolia CHIADO_RPC_URL=https://rpc.chiadochain.net GOERLI_BEACON_API_URL= -AMB_REPORTER_HEADERS_GAS=300000 +AMB_REPORTER_HEADERS_GAS=200000 AXELAR_REPORT_HEADERS_VALUE=0.0001 CELER_REPORT_HEADERS_VALUE=0.0001 -LAYER_ZERO_REPORT_HEADERS_VALUE=0.0007 -CCIP_REPORT_HEADERS_VALUE=0.0002 +LAYER_ZERO_REPORT_HEADERS_VALUE=0.0002 +CCIP_REPORT_HEADERS_VALUE=0.002 CONNEXT_REPORT_HEADERS_VALUE=0.00003 ZETA_CHAIN_REPORT_HEADERS_VALUE=0.001 @@ -31,19 +32,51 @@ TIME_FETCH_BLOCKS_MS=3600000 BLOCK_BUFFER=10 QUERY_BLOCK_LENGTH=200 -SOURCE_CHAIN_ID=5 -DESTINATION_CHAIN_IDS=100 +# For Testnet +SOURCE_CHAIN_ID=11155111 +DESTINATION_CHAIN_IDS=10200,421614 + +# For Mainnet +# SOURCE_CHAIN_ID=1 +# DESTINATION_CHAIN_IDS=137,56 + + +# Mainnet +## Layer Zero +MAINNET_LAYER_ZERO_REPORTER=0x3da176b43604aacf6178128865afccb21ee0f943 +BSC_MAINNET_LAYER_ZERO_ADAPTER=0x7237bb8d1d38DF8b473b5A38eD90088AF162ad8e +POLYGON_MAINNET_LAYER_ZERO_ADAPTER=0x79e4D1B8b8De0bC2F8A3DC477480C935C66F373E +## AMB +MAINNET_AMB_REPORTER=0xDbdF80c87f414fac8342e04D870764197bD3bAC7 +GNOSIS_AMB_ADAPTER=0x79e4D1B8b8De0bC2F8A3DC477480C935C66F373E + + +# Testnet SEPOLIA_CHIADO_REPORTER=0xc6755144d60548f3DD420F47Cf48DAe553bBf042 -CHIADO_ADAPTER=0x3F5929bee6A59661D6CcC9c4eB751048009CE11B +CHIADO_SEPOLIA_ADAPTER=0x3F5929bee6A59661D6CcC9c4eB751048009CE11B + + + +# LEGACY +GNOSIS_AMB_ADAPTER=0x4efB95c26bB2ebD3281749A5eAA388bc302b4445 +GNOSIS_AMB_REPORTER=0xc6755144d60548f3DD420F47Cf48DAe553bBf042 + SEPOLIA_CHIADO_CCIP_REPORTER=0xf66871C91952b09270d223cD3A1e5Dad57b14fbC +SEPOLIA_CHIADO_CCIP_ADAPTER=0xf66871C91952b09270d223cD3A1e5Dad57b14fbC # FAKE SEPOLIA_CHIADO_LZ_REPORTER=0xF7c2687c75FcBC7A00663f9436783A2B898537a4 -SEPOLIA_CHIADO_LZ_ADAPTER= +SEPOLIA_CHIADO_LZ_ADAPTER=0xF7c2687c75FcBC7A00663f9436783A2B898537a4 + +SEPOLIA_ARB_LZ_REPORTER=0x77B2cF15Ed888F3d5150E602d9805823Fdc8E51D +SEPOLIA_ARB_LZ_ADAPTER=0x117D7D593e6a7d9699a763C552BFA3177a46B957 -AMB_ADAPTER=0x4efB95c26bB2ebD3281749A5eAA388bc302b4445 +OPTIMISM_SEPOLIA_LZ_ADAPTER=0xF7c2687c75FcBC7A00663f9436783A2B898537a4 +CHIADO_ADAPTER=0x3F5929bee6A59661D6CcC9c4eB751048009CE11B + +#AMB_ADAPTER=0x4efB95c26bB2ebD3281749A5eAA388bc302b4445 SYMGA_ADAPTER=0x9AD7a6f4FDA8247cC0bF5932B68c5b619937dB15 GNOSIS_TELEPATHY_ADAPTER=0xDeF29f44f8315d0079A25EF03cfB0b0D8CdA3cF8 -MAINNET_AMB_REPORTER=0x6be796cb66CdB3566b8AbebA2C516CbDF93fE831 +# MAINNET_AMB_REPORTER=0x6be796cb66CdB3566b8AbebA2C516CbDF93fE831 MAINNET_HEADER_REPORTER=0x11378C54aA4e2Daf4603f9be86ae0Cb70786682a POLYGON_TELEPATHY_ADAPTER=0x04413A4795dD1f5347eAD1CD7C76Bd9E5e48b461 BSC_TELEPATHY_ADAPTER=0x2E5685F20f42cC3b01e4A9ADE49F6848E242f022 @@ -68,7 +101,7 @@ OPTIMISM_GOERLI_CCIP_ADAPTER_SEPOLIA=0x520185210Aa645220a49afD9C33d28b73494e14d SEPOLIA_CCIP_REPORTER_OPTIMISM_GOERLI=0xF3D2877866cd8E6771843b96B66aFcE425B2353C BSC_TESTNET_CCIP_ADAPTER_SEPOLIA=0xB6133Ab655B990E80Af3E948852C8ec2a46651A5 SEPOLIA_CCIP_REPORTER_BSC_TESTNET=0x855A2814E0DFf8327f1a52aCC9537772B829e226 -MAINNET_LAYER_ZERO_REPORTER_BSC=0x6E8793E22480e9Bfd6031E2230e68e1822193717 + BSC_LAYER_ZERO_ADAPTER_MAINNET=0xaC3c8D19A64B98d62ED16FFf8a4229E8ED36A469 GOERLI_ZETA_REPORTER_BSC_TESTNET=0x9a9fc484D3F83B489bc58c2A3EeeA8331F21796B BSC_TESTNET_ZETA_ADAPTER_GOERLI=0x2829D554678a767c5B091D28A0A294dB7643ec05 diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index bcbc6941..2e261371 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -1,5 +1,6 @@ import { arbitrum, + arbitrumSepolia, avalanche, bsc, bscTestnet, @@ -8,10 +9,10 @@ import { goerli, optimism, optimismGoerli, + optimismSepolia, polygon, mainnet, sepolia, - optimismSepolia, } from "viem/chains" import { Chain } from "viem" @@ -34,6 +35,7 @@ const main = () => { const chains = [ arbitrum, avalanche, + arbitrumSepolia, bsc, bscTestnet, gnosis, @@ -62,13 +64,15 @@ const main = () => { name: "AMBReporterController", type: "classic", sourceChain, - destinationChains: destinationChains.filter(({ name }) => name === gnosisChiado.name), + destinationChains: destinationChains.filter(({ name }) => name === gnosis.name || name === gnosisChiado.name), logger, multiClient, reporterAddresses: { + [gnosis.name]: unidirectionalReportersAddresses[sourceChain.name]?.[gnosis.name]?.AMBReporter, [gnosisChiado.name]: unidirectionalReportersAddresses[sourceChain.name]?.[gnosisChiado.name]?.AMBReporter, }, adapterAddresses: { + [gnosis.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[gnosis.name]?.AMBAdapter, [gnosisChiado.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[gnosisChiado.name]?.AMBAdapter, }, }) @@ -197,22 +201,28 @@ const main = () => { type: "classic", sourceChain, destinationChains, - logger, multiClient, reporterAddresses: { - [avalanche.name]: unidirectionalReportersAddresses[sourceChain.name]?.[avalanche.name]?.LayerZeroReporter, + // [avalanche.name]: unidirectionalReportersAddresses[sourceChain.name]?.[avalanche.name]?.LayerZeroReporter, + // [gnosisChiado.name]: unidirectionalReportersAddresses[sourceChain.name]?.[gnosisChiado.name]?.LayerZeroReporter, + // [optimismSepolia.name]: + // unidirectionalReportersAddresses[sourceChain.name]?.[optimismSepolia.name]?.LayerZeroReporter, + [polygon.name]: unidirectionalReportersAddresses[sourceChain.name]?.[polygon.name]?.LayerZeroReporter, [bsc.name]: unidirectionalReportersAddresses[sourceChain.name]?.[bsc.name]?.LayerZeroReporter, - [gnosisChiado.name]: unidirectionalReportersAddresses[sourceChain.name]?.[gnosisChiado.name]?.LayerZeroReporter, - [optimismSepolia.name]: - unidirectionalReportersAddresses[sourceChain.name]?.[optimismSepolia.name]?.LayerZeroReporter, + [arbitrumSepolia.name]: + unidirectionalReportersAddresses[sourceChain.name]?.[arbitrumSepolia.name]?.LayerZeroReporter, }, adapterAddresses: { - [avalanche.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[avalanche.name]?.LayerZeroAdapter, + [polygon.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[polygon.name]?.LayerZeroAdapter, [bsc.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[bsc.name]?.LayerZeroAdapter, - [gnosisChiado.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[gnosisChiado.name]?.LayerZeroAdapter, + + [arbitrumSepolia.name]: + unidirectionalAdaptersAddresses[sourceChain.name]?.[arbitrumSepolia.name]?.LayerZeroAdapter, [optimismSepolia.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[optimismSepolia.name]?.LayerZeroAdapter, + // [gnosisChiado.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[gnosisChiado.name]?.LayerZeroAdapter, + // [avalanche.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[avalanche.name]?.LayerZeroAdapter, }, reportHeadersValue: settings.reporterControllers.LayerZeroReporterController.reportHeadersValue, }) diff --git a/packages/reporter/src/settings/index.ts b/packages/reporter/src/settings/index.ts index affe4b31..d5190295 100644 --- a/packages/reporter/src/settings/index.ts +++ b/packages/reporter/src/settings/index.ts @@ -2,6 +2,7 @@ import "dotenv/config" import { parseEther } from "viem" import { arbitrum, + arbitrumSepolia, avalanche, bsc, bscTestnet, @@ -47,18 +48,18 @@ export const settings = { AxelarAdapter: process.env.BSC_AXELAR_ADAPTER_MAINNET as `0x${string}`, TelepathyAdapter: process.env.BSC_TELEPATHY_ADAPTER as `0x${string}`, HyperlaneAdapter: process.env.BSC_HYPERLANE_ADAPTER as `0x${string}`, - LayerZeroAdapter: process.env.BSC_LAYER_ZERO_ADAPTER_MAINNET as `0x${string}`, + LayerZeroAdapter: process.env.BSC_MAINNET_LAYER_ZERO_ADAPTER as `0x${string}`, }, [gnosis.name]: { TelepathyAdapter: process.env.GNOSIS_TELEPATHY_ADAPTER as `0x${string}`, AMBAdapter: process.env.GNOSIS_AMB_ADAPTER as `0x${string}`, - AMBReporter: process.env.GNOSIS_AMB_REPORTER as `0x${string}`, ConnextAdapter: process.env.GNOSIS_CONNEXT_ADAPTER_MAINNET as `0x${string}`, SygmaAdapter: process.env.GNOSIS_SYGMA_ADAPTER as `0x${string}`, // this works with many chains }, [polygon.name]: { TelepathyAdapter: process.env.POLYGON_TELEPATHY_ADAPTER as `0x${string}`, CelerAdapter: process.env.POLYGON_CELER_ADAPTER_MAINNET as `0x${string}`, + LayerZeroAdapter: process.env.POLYGON_MAINNET_LAYER_ZERO_ADAPTER as `0x${string}`, }, [optimism.name]: { TelepathyAdapter: process.env.OPTIMISM_TELEPATHY_ADAPTER as `0x${string}`, @@ -88,10 +89,13 @@ export const settings = { CCIPAdapter: process.env.BSC_TESTNET_CCIP_ADAPTER_SEPOLIA as `0x${string}`, }, [gnosisChiado.name]: { - AMBAdapter: process.env.CHIADO_ADAPTER as `0x${string}`, + AMBAdapter: process.env.CHIADO_SEPOLIA_ADAPTER as `0x${string}`, CCIPAdapter: process.env.SEPOLIA_CHIADO_CCIP_ADAPTER as `0x${string}`, LayerZeroAdapter: process.env.SEPOLIA_CHIADO_LZ_ADAPTER as `0x${string}`, }, + [arbitrumSepolia.name]: { + LayerZeroAdapter: process.env.SEPOLIA_ARB_LZ_ADAPTER as `0x${string}`, + }, }, [goerli.name]: { [bscTestnet.name]: { @@ -124,7 +128,7 @@ export const settings = { [bsc.name]: { AxelarReporter: process.env.MAINNET_AXELAR_REPORTER_BSC as `0x${string}`, HyperlaneReporter: process.env.MAINNET_HYPERLANE_REPORTER_BSC as `0x${string}`, - LayerZeroReporter: process.env.MAINNET_LAYER_ZERO_REPORTER_BSC as `0x${string}`, + LayerZeroReporter: process.env.MAINNET_LAYER_ZERO_REPORTER as `0x${string}`, }, [gnosis.name]: { AMBReporter: process.env.MAINNET_AMB_REPORTER as `0x${string}`, @@ -137,6 +141,7 @@ export const settings = { }, [polygon.name]: { CelerReporter: process.env.MAINNET_CELER_REPORTER_POLYGON as `0x${string}`, + LayerZeroReporter: process.env.MAINNET_LAYER_ZERO_REPORTER as `0x${string}`, }, [avalanche.name]: { LayerZeroReporter: process.env.MAINNET_LAYER_ZERO_REPORTER_AVALANCHE as `0x${string}`, @@ -158,6 +163,9 @@ export const settings = { CCIPReporter: process.env.SEPOLIA_CHIADO_CCIP_REPORTER as `0x${string}`, LayerZeroReporter: process.env.SEPOLIA_CHIADO_LZ_REPORTER as `0x${string}`, }, + [arbitrumSepolia.name]: { + LayerZeroReporter: process.env.SEPOLIA_ARB_LZ_REPORTER as `0x${string}`, + }, }, [goerli.name]: { [bscTestnet.name]: { From f2152686a2138a16e7341460c7b69df02f9bfd08 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Tue, 16 Jul 2024 04:41:42 +0800 Subject: [PATCH 229/297] fix: LayerZeroV2 Reporter & Adapter --- .../adapters/LayerZero/LayerZeroAdapter.sol | 17 +++++++++++++-- .../adapters/LayerZero/LayerZeroReporter.sol | 20 +++++++++++++++--- .../interfaces/ILayerZeroReceiver.sol | 4 ++++ .../evm/tasks/deploy/adapters/layerzero.ts | 21 ++++++++++++++----- 4 files changed, 52 insertions(+), 10 deletions(-) diff --git a/packages/evm/contracts/adapters/LayerZero/LayerZeroAdapter.sol b/packages/evm/contracts/adapters/LayerZero/LayerZeroAdapter.sol index 6d683fc1..0c112382 100644 --- a/packages/evm/contracts/adapters/LayerZero/LayerZeroAdapter.sol +++ b/packages/evm/contracts/adapters/LayerZero/LayerZeroAdapter.sol @@ -4,9 +4,10 @@ pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { ILayerZeroReceiver } from "./interfaces/ILayerZeroReceiver.sol"; import { Origin } from "./interfaces/ILayerZeroEndpointV2.sol"; +import { OAppCore } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/OAppCore.sol"; import { BlockHashAdapter } from "../BlockHashAdapter.sol"; -contract LayerZeroAdapter is BlockHashAdapter, Ownable, ILayerZeroReceiver { +contract LayerZeroAdapter is BlockHashAdapter, Ownable, ILayerZeroReceiver, OAppCore { string public constant PROVIDER = "layer-zero"; address public immutable LAYER_ZERO_ENDPOINT; @@ -17,7 +18,7 @@ contract LayerZeroAdapter is BlockHashAdapter, Ownable, ILayerZeroReceiver { event ReporterSet(uint256 indexed chainId, uint32 indexed endpointId, address indexed reporter); - constructor(address lzEndpoint) { + constructor(address lzEndpoint, address delegate) OAppCore(lzEndpoint, delegate) { LAYER_ZERO_ENDPOINT = lzEndpoint; } @@ -36,6 +37,18 @@ contract LayerZeroAdapter is BlockHashAdapter, Ownable, ILayerZeroReceiver { _storeHashes(chainIds[_origin.srcEid], ids, hashes); } + function nextNonce(uint32 /*_srcEid*/, bytes32 /*_sender*/) public pure override returns (uint64 nonce) { + return 0; + } + + function allowInitializePath(Origin calldata origin) public view override returns (bool) { + return peers[origin.srcEid] == origin.sender; + } + + function oAppVersion() public pure virtual override returns (uint64 senderVersion, uint64 receiverVersion) { + return (1, 1); + } + function setReporterByChain(uint256 chainId, uint32 endpointId, address reporter) external onlyOwner { enabledReporter[endpointId] = reporter; chainIds[endpointId] = chainId; diff --git a/packages/evm/contracts/adapters/LayerZero/LayerZeroReporter.sol b/packages/evm/contracts/adapters/LayerZero/LayerZeroReporter.sol index a7d8c27f..eb7566e7 100644 --- a/packages/evm/contracts/adapters/LayerZero/LayerZeroReporter.sol +++ b/packages/evm/contracts/adapters/LayerZero/LayerZeroReporter.sol @@ -5,8 +5,9 @@ import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { ILayerZeroEndpointV2, MessagingParams } from "./interfaces/ILayerZeroEndpointV2.sol"; import { Reporter } from "../Reporter.sol"; import { OptionsBuilder } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/libs/OptionsBuilder.sol"; +import { OAppCore } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/OAppCore.sol"; -contract LayerZeroReporter is Reporter, Ownable { +contract LayerZeroReporter is Reporter, Ownable, OAppCore { using OptionsBuilder for bytes; string public constant PROVIDER = "layer-zero"; @@ -21,7 +22,16 @@ contract LayerZeroReporter is Reporter, Ownable { event EndpointIdSet(uint256 indexed chainId, uint32 indexed endpointId); event FeeSet(uint256 fee); - constructor(address headerStorage, address yaho, address lzEndpoint) Reporter(headerStorage, yaho) { + constructor( + address headerStorage, + address yaho, + address lzEndpoint, + address delegate, + address refundAddress_, + uint128 defaultFee_ + ) Reporter(headerStorage, yaho) OAppCore(lzEndpoint, delegate) { + refundAddress = refundAddress_; + fee = defaultFee_; LAYER_ZERO_ENDPOINT = ILayerZeroEndpointV2(lzEndpoint); } @@ -35,10 +45,14 @@ contract LayerZeroReporter is Reporter, Ownable { emit FeeSet(fee); } - function setRefundAddress(address refundAddress_) external onlyOwner { + function setDefaultRefundAddress(address refundAddress_) external onlyOwner { refundAddress = refundAddress_; } + function oAppVersion() public pure virtual override returns (uint64 senderVersion, uint64 receiverVersion) { + return (1, 1); + } + function _dispatch( uint256 targetChainId, address adapter, diff --git a/packages/evm/contracts/adapters/LayerZero/interfaces/ILayerZeroReceiver.sol b/packages/evm/contracts/adapters/LayerZero/interfaces/ILayerZeroReceiver.sol index 6c6144da..124c24e3 100644 --- a/packages/evm/contracts/adapters/LayerZero/interfaces/ILayerZeroReceiver.sol +++ b/packages/evm/contracts/adapters/LayerZero/interfaces/ILayerZeroReceiver.sol @@ -10,4 +10,8 @@ interface ILayerZeroReceiver { address _executor, bytes calldata _extraData ) external payable; + + function allowInitializePath(Origin calldata _origin) external view returns (bool); + + function nextNonce(uint32 _eid, bytes32 _sender) external view returns (uint64); } diff --git a/packages/evm/tasks/deploy/adapters/layerzero.ts b/packages/evm/tasks/deploy/adapters/layerzero.ts index aed9a324..b2cd195d 100644 --- a/packages/evm/tasks/deploy/adapters/layerzero.ts +++ b/packages/evm/tasks/deploy/adapters/layerzero.ts @@ -9,7 +9,8 @@ import type { LayerZeroReporter__factory } from "../../../types/factories/contra import { verify } from "../index" task("deploy:LayerZeroAdapter") - .addParam("lzEndpoint", "address of the LayerZero endpoint contract") + .addParam("lzendpoint", "address of the LayerZero endpoint contract") + .addParam("delegate", "address of delegate") .addFlag("verify", "whether to verify the contract on Etherscan") .setAction(async function (taskArguments: TaskArguments, hre) { console.log("Deploying LayerZeroAdapter...") @@ -17,7 +18,7 @@ task("deploy:LayerZeroAdapter") const layerZeroAdapterFactory: LayerZeroAdapter__factory = ( await hre.ethers.getContractFactory("LayerZeroAdapter") ) - const constructorArguments = [taskArguments.lzEndpoint] as const + const constructorArguments = [taskArguments.lzendpoint, taskArguments.delegate] as const const layerZeroAdapter: LayerZeroAdapter = ( await layerZeroAdapterFactory.connect(signers[0]).deploy(...constructorArguments) ) @@ -27,9 +28,12 @@ task("deploy:LayerZeroAdapter") }) task("deploy:LayerZeroReporter") - .addParam("headerStorage", "address of the header storage contract") + .addParam("headerstorage", "address of the header storage contract") .addParam("yaho", "address of the Yaho contract") - .addParam("lzEndpoint", "address of the LayerZero endpoint contract") + .addParam("lzendpoint", "address of the LayerZero endpoint contract") + .addParam("delegate", "address of delegate") + .addParam("refundaddress", "refund address") + .addParam("defaultfee", "default fee") .addFlag("verify", "whether to verify the contract on Etherscan") .setAction(async function (taskArguments: TaskArguments, hre) { console.log("Deploying LayerZeroReporter...") @@ -37,7 +41,14 @@ task("deploy:LayerZeroReporter") const layerZeroReporterFactory: LayerZeroReporter__factory = ( await hre.ethers.getContractFactory("LayerZeroReporter") ) - const constructorArguments = [taskArguments.headerStorage, taskArguments.yaho, taskArguments.lzEndpoint] as const + const constructorArguments = [ + taskArguments.headerstorage, + taskArguments.yaho, + taskArguments.lzendpoint, + taskArguments.delegate, + taskArguments.refundaddress, + taskArguments.defaultfee, + ] as const const layerZeroReporter: LayerZeroReporter = ( await layerZeroReporterFactory.connect(signers[0]).deploy(...constructorArguments) ) From cb557de25b2d121860dd0b153513fbbfaa84c9a9 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Tue, 16 Jul 2024 05:14:45 +0800 Subject: [PATCH 230/297] feat: add Base config to LayerZero controller --- packages/reporter/src/index.ts | 8 ++++++-- packages/reporter/src/settings/index.ts | 9 +++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 2e261371..40b20c93 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -2,6 +2,7 @@ import { arbitrum, arbitrumSepolia, avalanche, + base, bsc, bscTestnet, gnosis, @@ -36,6 +37,7 @@ const main = () => { arbitrum, avalanche, arbitrumSepolia, + base, bsc, bscTestnet, gnosis, @@ -49,7 +51,6 @@ const main = () => { ] const sourceChain: Chain = Object.values(chains).find((_chain) => _chain.id === sourceChainId) as Chain const destinationChains: Chain[] = Object.values(chains).filter((_chain) => destinationChainIds?.includes(_chain.id)) - const unidirectionalAdaptersAddresses = settings.contractAddresses.adapterAddresses.unidirectional as any const unidirectionalReportersAddresses = settings.contractAddresses.reporterAddresses.unidirectional as any const lightClientAddresses = settings.contractAddresses.lightClientAddresses as any @@ -210,13 +211,16 @@ const main = () => { // unidirectionalReportersAddresses[sourceChain.name]?.[optimismSepolia.name]?.LayerZeroReporter, [polygon.name]: unidirectionalReportersAddresses[sourceChain.name]?.[polygon.name]?.LayerZeroReporter, [bsc.name]: unidirectionalReportersAddresses[sourceChain.name]?.[bsc.name]?.LayerZeroReporter, + [base.name]: unidirectionalReportersAddresses[sourceChain.name]?.[base.name]?.LayerZeroReporter, + [optimism.name]: unidirectionalReportersAddresses[sourceChain.name]?.[optimism.name]?.LayerZeroReporter, [arbitrumSepolia.name]: unidirectionalReportersAddresses[sourceChain.name]?.[arbitrumSepolia.name]?.LayerZeroReporter, }, adapterAddresses: { [polygon.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[polygon.name]?.LayerZeroAdapter, [bsc.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[bsc.name]?.LayerZeroAdapter, - + [base.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[base.name].LayerZeroAdapter, + [optimism.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[optimism.name].layerZeroAdapter, [arbitrumSepolia.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[arbitrumSepolia.name]?.LayerZeroAdapter, [optimismSepolia.name]: diff --git a/packages/reporter/src/settings/index.ts b/packages/reporter/src/settings/index.ts index d5190295..9c7d9315 100644 --- a/packages/reporter/src/settings/index.ts +++ b/packages/reporter/src/settings/index.ts @@ -4,6 +4,7 @@ import { arbitrum, arbitrumSepolia, avalanche, + base, bsc, bscTestnet, gnosis, @@ -65,6 +66,7 @@ export const settings = { TelepathyAdapter: process.env.OPTIMISM_TELEPATHY_ADAPTER as `0x${string}`, L2CrossDomainMessengerAdapter: process.env .OPTIMISM_L2_CROSS_DOMAIN_MESSENGER_ADAPTER_ADDRESS as `0x${string}`, + LayerZeroAdapter: process.env.OPTIMISM_MAINNET_LAYER_ZERO_ADAPTER as `0x${string}`, }, [arbitrum.name]: { TelepathyAdapter: process.env.ARBITRUM_TELEPATHY_ADAPTER as `0x${string}`, @@ -73,6 +75,9 @@ export const settings = { LayerZeroAdapter: process.env.AVALANCHE_LAYER_ZERO_ADAPTER_MAINNET as `0x${string}`, CCIPAdapter: process.env.AVALANCHE_CCIP_ADAPTER_MAINNET as `0x${string}`, }, + [base.name]: { + LayerZeroAdapter: process.env.BASE_MAINNET_LAYER_ZERO_ADAPTER as `0x${string}`, + }, /*[goerli.name]: { AMBReporter: "0xedc0b1d3de4496e0d917af42f29cb71eb2982319" as `0x${string}`, SygmaReporter: "0x2f96d347c932ac73b56e9352ecc0707e25173d88" as `0x${string}`, @@ -138,6 +143,10 @@ export const settings = { [optimism.name]: { L1CrossDomainMessengerHeaderReporter: process.env .MAINNET_L1_CROSS_DOMAIN_MESSENGER_HEADER_REPORTER_ADDRESS as `0x${string}`, + LayerZeroReporter: process.env.MAINNET_LAYER_ZERO_REPORTER as `0x${string}`, + }, + [base.name]: { + LayerZeroReporter: process.env.MAINNET_LAYER_ZERO_REPORTER as `0x${string}`, }, [polygon.name]: { CelerReporter: process.env.MAINNET_CELER_REPORTER_POLYGON as `0x${string}`, From da427a496b67c6923884eb4396eb76f21c48e4d6 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Tue, 16 Jul 2024 05:15:14 +0800 Subject: [PATCH 231/297] chore: update tsconfig.json and Dockerfile --- packages/reporter/Dockerfile | 9 ++++++--- packages/reporter/tsconfig.json | 26 ++++++++++++++++++++------ 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/packages/reporter/Dockerfile b/packages/reporter/Dockerfile index 58daafc7..b251100d 100644 --- a/packages/reporter/Dockerfile +++ b/packages/reporter/Dockerfile @@ -1,13 +1,16 @@ -FROM node:alpine +FROM node:18-alpine WORKDIR /usr/src/app COPY package.json yarn.lock .env ./ -RUN yarn install +RUN corepack enable && \ + corepack prepare --activate yarn@3.2.2 && \ + yarn install ADD . /usr/src/app -RUN yarn compile +RUN yarn install && \ + yarn compile CMD ["node", "dist/index.js"] \ No newline at end of file diff --git a/packages/reporter/tsconfig.json b/packages/reporter/tsconfig.json index 22729817..93d4d790 100644 --- a/packages/reporter/tsconfig.json +++ b/packages/reporter/tsconfig.json @@ -6,16 +6,30 @@ "esModuleInterop": true, "experimentalDecorators": true, "forceConsistentCasingInFileNames": true, - "lib": ["es6", "ESNext", "DOM"], - "module": "NodeNext", + "lib": [ + "es6", + "ESNext", + "DOM" + ], + "module": "ESNext", + "moduleResolution": "node", "noImplicitAny": true, "outDir": "./dist", + "rootDir": "./src", "removeComments": true, "resolveJsonModule": true, "sourceMap": true, "strict": true, - "target": "ES2020" + "target": "ESNext" }, - "exclude": ["node_modules"], - "include": ["./src/**/*"] -} + "exclude": [ + "node_modules" + ], + "include": [ + "./src/**/*" + ], + "ts-node": { + "esm": true, + "experimentalSpecifierResolution": "node" + } +} \ No newline at end of file From b7177be2f22c69ee04337e0d9fbd176bace540df Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Tue, 16 Jul 2024 05:15:54 +0800 Subject: [PATCH 232/297] chore: add configuration logs in Controller class --- packages/reporter/src/Coordinator.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/reporter/src/Coordinator.ts b/packages/reporter/src/Coordinator.ts index 8101e33a..44c04b64 100644 --- a/packages/reporter/src/Coordinator.ts +++ b/packages/reporter/src/Coordinator.ts @@ -47,7 +47,13 @@ class Coordinator { } start() { - console.log("controllers: ", this.controllers) + this.logger.info(`Start Reporter with config${this.controllers}`) + this.logger.info(`Source chain: ${this.sourceChain}`) + this.logger.info(`Query block length: ${this._queryBlockLength}`) + this.logger.info(`Block Buffer: ${this._blockBuffer}`) + this.logger.info(`Interval to fetch blocks (ms): ${this._intervalFetchBlocksMs}`) + this.logger.info(`Interval to update light clients: ${this._intervalsUpdateLightClients}`) + this.fetchBlocks() this.intervals.push( setInterval(() => { From aac37d55d0ddaafe5dc4a61f5bc4a18be0275d7a Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Tue, 16 Jul 2024 05:22:59 +0800 Subject: [PATCH 233/297] update .env.example --- packages/reporter/.env.example | 115 +++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index 0281cfb3..b4f1fb0b 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -20,7 +20,122 @@ LAYER_ZERO_REPORT_HEADERS_VALUE=0.0002 CCIP_REPORT_HEADERS_VALUE=0.002 CONNEXT_REPORT_HEADERS_VALUE=0.00003 ZETA_CHAIN_REPORT_HEADERS_VALUE=0.001 +# Fake private key +PRIVATE_KEY= +# 0xdcaf8079eaf0d349e391dfa694ebfeb14d6e9187afec1aa79ccb3facbc6af251 +REPORTERS_ENABLED= +GNOSIS_RPC_URL=https://rpc.ankr.com/gnosis +MAINNET_RPC_URL= +# MAINNET_RPC_URL=https://eth.llamarpc.com +BSC_RPC_URL=https://bsc-dataseed1.binance.org +GOERLI_RPC_URL= +POLYGON_RPC_URL= +OPTIMISM_RPC_URL=https://optimism.llamarpc.com +ARBITRUM_RPC_URL=https://arbitrum.llamarpc.com +SEPOLIA_RPC_URL=https://eth-sepolia.g.alchemy.com/v2/-nS9M81JxS_vHfz1wlWLIuSo0O6W_HMC +CHIADO_RPC_URL=https://rpc.chiadochain.net +GOERLI_BEACON_API_URL= + +AMB_REPORTER_HEADERS_GAS=200000 +AXELAR_REPORT_HEADERS_VALUE=0.0001 +CELER_REPORT_HEADERS_VALUE=0.0001 +LAYER_ZERO_REPORT_HEADERS_VALUE=0.00015 +CCIP_REPORT_HEADERS_VALUE=0.002 +CONNEXT_REPORT_HEADERS_VALUE=0.00003 +ZETA_CHAIN_REPORT_HEADERS_VALUE=0.001 + +TELEPATHY_PROOF_API_URL= +TELEPATHY_BLOCK_BUFFER=10 +TELEPATHY_INTERVAL_UPDATE=30000 +ELECTRON_INTERVAL_UPDATE=30000 + +WORMHOLE_SCAN_BASE_URL=https://api.wormholescan.io + +TIME_FETCH_BLOCKS_MS=60000 +BLOCK_BUFFER=10 +QUERY_BLOCK_LENGTH=200 + + +# For Mainnet +SOURCE_CHAIN_ID= +DESTINATION_CHAIN_IDS= + + +# Mainnet +## Layer Zero +MAINNET_LAYER_ZERO_REPORTER=0xbc5f67da5347cd4304e9623bc86e71a874287ea1 +BSC_MAINNET_LAYER_ZERO_ADAPTER=0xDbdF80c87f414fac8342e04D870764197bD3bAC7 +POLYGON_MAINNET_LAYER_ZERO_ADAPTER=0x998dA7f6cF98541E4F4469cc9d53B9374F186591 +BASE_MAINNET_LAYER_ZERO_ADAPTER=0xA86bc62Ac53Dc86687AB6C15fdebC71ad51fB615 +OPTIMISM_MAINNET_LAYER_ZERO_ADAPTER=0xA86bc62Ac53Dc86687AB6C15fdebC71ad51fB615 + + +## AMB +MAINNET_AMB_REPORTER=0xDbdF80c87f414fac8342e04D870764197bD3bAC7 +GNOSIS_AMB_ADAPTER=0x79e4D1B8b8De0bC2F8A3DC477480C935C66F373E + + +# Testnet +SEPOLIA_CHIADO_REPORTER=0xc6755144d60548f3DD420F47Cf48DAe553bBf042 +CHIADO_SEPOLIA_ADAPTER=0x3F5929bee6A59661D6CcC9c4eB751048009CE11B + + + +# LEGACY +GNOSIS_AMB_ADAPTER=0x4efB95c26bB2ebD3281749A5eAA388bc302b4445 +GNOSIS_AMB_REPORTER=0xc6755144d60548f3DD420F47Cf48DAe553bBf042 +SEPOLIA_CHIADO_CCIP_REPORTER=0xf66871C91952b09270d223cD3A1e5Dad57b14fbC +SEPOLIA_CHIADO_CCIP_ADAPTER=0xf66871C91952b09270d223cD3A1e5Dad57b14fbC # FAKE +SEPOLIA_CHIADO_LZ_REPORTER=0xF7c2687c75FcBC7A00663f9436783A2B898537a4 +SEPOLIA_CHIADO_LZ_ADAPTER=0xF7c2687c75FcBC7A00663f9436783A2B898537a4 + +SEPOLIA_ARB_LZ_REPORTER=0x49f6BE2C7DB433395939b2c728dF2CB99Ca5f8c5 +SEPOLIA_ARB_LZ_ADAPTER=0x21eAB033C7D2DF6A67AeF6C5Bda9A7F151eB9f52 + +OPTIMISM_SEPOLIA_LZ_ADAPTER=0xF7c2687c75FcBC7A00663f9436783A2B898537a4 +CHIADO_ADAPTER=0x3F5929bee6A59661D6CcC9c4eB751048009CE11B + +#AMB_ADAPTER=0x4efB95c26bB2ebD3281749A5eAA388bc302b4445 +SYMGA_ADAPTER=0x9AD7a6f4FDA8247cC0bF5932B68c5b619937dB15 +GNOSIS_TELEPATHY_ADAPTER=0xDeF29f44f8315d0079A25EF03cfB0b0D8CdA3cF8 +# MAINNET_AMB_REPORTER=0x6be796cb66CdB3566b8AbebA2C516CbDF93fE831 +MAINNET_HEADER_REPORTER=0x11378C54aA4e2Daf4603f9be86ae0Cb70786682a +POLYGON_TELEPATHY_ADAPTER=0x04413A4795dD1f5347eAD1CD7C76Bd9E5e48b461 +BSC_TELEPATHY_ADAPTER=0x2E5685F20f42cC3b01e4A9ADE49F6848E242f022 +OPTIMISM_TELEPATHY_ADAPTER=0x856dcc80f75a9737D9D498266E1Af013668316Fb +ARBITRUM_TELEPATHY_ADAPTER=0x2E5685F20f42cC3b01e4A9ADE49F6848E242f022 +GNOSIS_WORMHOLE_ADAPTER=0x8EA3F385be8FCB98eB4dBfad2D00846860Bf648D +POLYGON_WORMHOLE_ADAPTER=0xb7806ea66c1bb9FfeB41Dc303601a469ddf3b9C2 +BSC_WORMHOLE_ADAPTER=0x11378C54aA4e2Daf4603f9be86ae0Cb70786682a +OPTIMISM_WORMHOLE_ADAPTER=0x1fF52708D610b1D17F0830f036e992677CDc508A +AVALANCHE_WORMHOLE_ADAPTER=0x6E9ce437c46e7fA4F0888c21AAC0d9099Ad133ea +MAINNET_WORMHOLE_HEADER_REPORTER=0xDeF29f44f8315d0079A25EF03cfB0b0D8CdA3cF8 +MAINNET_WORMHOLE_ADDRESS=0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B +MAINNET_L1_CROSS_DOMAIN_MESSENGER_HEADER_REPORTER_ADDRESS=0xbA5B3f0643582E75AF252e7631dE62c046970167 +OPTIMISM_L2_CROSS_DOMAIN_MESSENGER_ADAPTER_ADDRESS=0xe58E7bF7aCD1396D8F9eAF44DB3D4Fd055DCDb51 +MAINNET_AXELAR_REPORTER_BSC=0xBfd877753F8B4f4117a08aD54DcBE69cF3165d81 +BSC_AXELAR_ADAPTER_MAINNET=0xb7806ea66c1bb9FfeB41Dc303601a469ddf3b9C2 +POLYGON_CELER_ADAPTER_MAINNET=0x1fF52708D610b1D17F0830f036e992677CDc508A +MAINNET_CELER_REPORTER_POLYGON=0x52258b83051B7031483740aC9EcAa07926392ea0 +AVALANCHE_LAYER_ZERO_ADAPTER_MAINNET=0x11378C54aA4e2Daf4603f9be86ae0Cb70786682a +MAINNET_LAYER_ZERO_REPORTER_AVALANCHE=0x16B43E348e0A19E9196ae79D172aDC52B3Aa3E20 +OPTIMISM_GOERLI_CCIP_ADAPTER_SEPOLIA=0x520185210Aa645220a49afD9C33d28b73494e14d +SEPOLIA_CCIP_REPORTER_OPTIMISM_GOERLI=0xF3D2877866cd8E6771843b96B66aFcE425B2353C +BSC_TESTNET_CCIP_ADAPTER_SEPOLIA=0xB6133Ab655B990E80Af3E948852C8ec2a46651A5 +SEPOLIA_CCIP_REPORTER_BSC_TESTNET=0x855A2814E0DFf8327f1a52aCC9537772B829e226 + +BSC_LAYER_ZERO_ADAPTER_MAINNET=0xaC3c8D19A64B98d62ED16FFf8a4229E8ED36A469 +GOERLI_ZETA_REPORTER_BSC_TESTNET=0x9a9fc484D3F83B489bc58c2A3EeeA8331F21796B +BSC_TESTNET_ZETA_ADAPTER_GOERLI=0x2829D554678a767c5B091D28A0A294dB7643ec05 +MAINNET_CCIP_REPORTER_AVALANCHE=0xeEFD0D67E4eF9330870961C38a3e25ECE369B141 +AVALANCHE_CCIP_ADAPTER_MAINNET=0x04413A4795dD1f5347eAD1CD7C76Bd9E5e48b461 +GNOSIS_SYGMA_ADAPTER=0x483285D0e24401D0C5DB6cF1FAC4f79f412079C0 +MAINNET_SYGMA_REPORTER_GNOSIS=0x973bB99db211755b80c9087fe436fBb81A45AD5E +MAINNET_HEADER_STORAGE=0x22F1fc71A505c0b2bf4D5075801cc5E0ec84B09e +GOERLI_HEADER_STORAGE=0x4cD014AC64AAa899b46BF3a477B68bb67e33eDC4 +CHIADO_ELECTRON_ADAPTER_GOERLI=0x66fBC348aef3797fb885f8073173E5064bf7ABBb +CHIADO_ELECTRON_LIGHT_CLIENT_GOERLI=0xc01707bD835f6108785DF081C943C7C108FC3D89 TELEPATHY_PROOF_API_URL= TELEPATHY_BLOCK_BUFFER=10 TELEPATHY_INTERVAL_UPDATE=30000 From 1aeff54a2163902dfd9f81de8b9b0ea19ad169a8 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Thu, 18 Jul 2024 19:25:34 +0800 Subject: [PATCH 234/297] fix: typo and .env.example --- packages/reporter/.env.example | 13 +++++-------- packages/reporter/src/index.ts | 4 ++-- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index b4f1fb0b..4f4f5e19 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -51,7 +51,7 @@ ELECTRON_INTERVAL_UPDATE=30000 WORMHOLE_SCAN_BASE_URL=https://api.wormholescan.io -TIME_FETCH_BLOCKS_MS=60000 +TIME_FETCH_BLOCKS_MS=1440000 # 24 minutes BLOCK_BUFFER=10 QUERY_BLOCK_LENGTH=200 @@ -76,17 +76,14 @@ GNOSIS_AMB_ADAPTER=0x79e4D1B8b8De0bC2F8A3DC477480C935C66F373E # Testnet -SEPOLIA_CHIADO_REPORTER=0xc6755144d60548f3DD420F47Cf48DAe553bBf042 -CHIADO_SEPOLIA_ADAPTER=0x3F5929bee6A59661D6CcC9c4eB751048009CE11B - +GNOSIS_AMB_ADAPTER=0x3F5929bee6A59661D6CcC9c4eB751048009CE11B +GNOSIS_AMB_REPORTER=0xc6755144d60548f3DD420F47Cf48DAe553bBf042 +SEPOLIA_CHIADO_CCIP_REPORTER=0xf66871C91952b09270d223cD3A1e5Dad57b14fbC +SEPOLIA_CHIADO_CCIP_ADAPTER=0x8A2A7509B98f0f21BEFF82e2520A920DB61fFa9d # LEGACY -GNOSIS_AMB_ADAPTER=0x4efB95c26bB2ebD3281749A5eAA388bc302b4445 -GNOSIS_AMB_REPORTER=0xc6755144d60548f3DD420F47Cf48DAe553bBf042 -SEPOLIA_CHIADO_CCIP_REPORTER=0xf66871C91952b09270d223cD3A1e5Dad57b14fbC -SEPOLIA_CHIADO_CCIP_ADAPTER=0xf66871C91952b09270d223cD3A1e5Dad57b14fbC # FAKE SEPOLIA_CHIADO_LZ_REPORTER=0xF7c2687c75FcBC7A00663f9436783A2B898537a4 SEPOLIA_CHIADO_LZ_ADAPTER=0xF7c2687c75FcBC7A00663f9436783A2B898537a4 diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 40b20c93..a7a5c22d 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -219,8 +219,8 @@ const main = () => { adapterAddresses: { [polygon.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[polygon.name]?.LayerZeroAdapter, [bsc.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[bsc.name]?.LayerZeroAdapter, - [base.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[base.name].LayerZeroAdapter, - [optimism.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[optimism.name].layerZeroAdapter, + [base.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[base.name]?.LayerZeroAdapter, + [optimism.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[optimism.name]?.LayerZeroAdapter, [arbitrumSepolia.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[arbitrumSepolia.name]?.LayerZeroAdapter, [optimismSepolia.name]: From fc6f62d2eeb528c9764cc2045339830796e2f52a Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Fri, 26 Jul 2024 13:01:57 +0800 Subject: [PATCH 235/297] feat(reporter): update Wormhole Reporter syntax and address --- packages/reporter/.env.example | 130 ++---------------- .../controllers/WormholeReporterController.ts | 9 +- packages/reporter/src/index.ts | 13 +- packages/reporter/src/settings/index.ts | 15 +- 4 files changed, 40 insertions(+), 127 deletions(-) diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index 4f4f5e19..e341bce5 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -1,29 +1,7 @@ # Fake private key PRIVATE_KEY= -REPORTERS_ENABLED=AMBReporterController,LayerZeroReporterController -GNOSIS_RPC_URL=https://rpc.ankr.com/gnosis -MAINNET_RPC_URL=https://eth.llamarpc.com -BSC_RPC_URL=https://bsc-dataseed1.binance.org -GOERLI_RPC_URL= -POLYGON_RPC_URL=https://polygon.llamarpc.com -OPTIMISM_RPC_URL=https://optimism.llamarpc.com -ARBITRUM_RPC_URL=https://arbitrum.llamarpc.com -SEPOLIA_RPC_URL=https://1rpc.io/sepolia -CHIADO_RPC_URL=https://rpc.chiadochain.net -GOERLI_BEACON_API_URL= - -AMB_REPORTER_HEADERS_GAS=200000 -AXELAR_REPORT_HEADERS_VALUE=0.0001 -CELER_REPORT_HEADERS_VALUE=0.0001 -LAYER_ZERO_REPORT_HEADERS_VALUE=0.0002 -CCIP_REPORT_HEADERS_VALUE=0.002 -CONNEXT_REPORT_HEADERS_VALUE=0.00003 -ZETA_CHAIN_REPORT_HEADERS_VALUE=0.001 -# Fake private key -PRIVATE_KEY= -# 0xdcaf8079eaf0d349e391dfa694ebfeb14d6e9187afec1aa79ccb3facbc6af251 -REPORTERS_ENABLED= +REPORTERS_ENABLED=WormholeReporterController,AMBReporterController,LayerZeroReporterController GNOSIS_RPC_URL=https://rpc.ankr.com/gnosis MAINNET_RPC_URL= # MAINNET_RPC_URL=https://eth.llamarpc.com @@ -32,7 +10,7 @@ GOERLI_RPC_URL= POLYGON_RPC_URL= OPTIMISM_RPC_URL=https://optimism.llamarpc.com ARBITRUM_RPC_URL=https://arbitrum.llamarpc.com -SEPOLIA_RPC_URL=https://eth-sepolia.g.alchemy.com/v2/-nS9M81JxS_vHfz1wlWLIuSo0O6W_HMC +SEPOLIA_RPC_URL= CHIADO_RPC_URL=https://rpc.chiadochain.net GOERLI_BEACON_API_URL= @@ -49,14 +27,16 @@ TELEPATHY_BLOCK_BUFFER=10 TELEPATHY_INTERVAL_UPDATE=30000 ELECTRON_INTERVAL_UPDATE=30000 -WORMHOLE_SCAN_BASE_URL=https://api.wormholescan.io +# WORMHOLE_SCAN_BASE_URL=https://api.wormholescan.io # Mainnet +WORMHOLE_SCAN_BASE_URL=https://api.testnet.wormholescan.io/ # Testnet + -TIME_FETCH_BLOCKS_MS=1440000 # 24 minutes +TIME_FETCH_BLOCKS_MS=30000 BLOCK_BUFFER=10 QUERY_BLOCK_LENGTH=200 -# For Mainnet + SOURCE_CHAIN_ID= DESTINATION_CHAIN_IDS= @@ -81,106 +61,22 @@ GNOSIS_AMB_REPORTER=0xc6755144d60548f3DD420F47Cf48DAe553bBf042 SEPOLIA_CHIADO_CCIP_REPORTER=0xf66871C91952b09270d223cD3A1e5Dad57b14fbC SEPOLIA_CHIADO_CCIP_ADAPTER=0x8A2A7509B98f0f21BEFF82e2520A920DB61fFa9d +SEPOLIA_WORMHOLE_ADDRESS=0x4a8bc80Ed5a4067f1CCf107057b8270E0cC11A78 -# LEGACY - -SEPOLIA_CHIADO_LZ_REPORTER=0xF7c2687c75FcBC7A00663f9436783A2B898537a4 -SEPOLIA_CHIADO_LZ_ADAPTER=0xF7c2687c75FcBC7A00663f9436783A2B898537a4 - -SEPOLIA_ARB_LZ_REPORTER=0x49f6BE2C7DB433395939b2c728dF2CB99Ca5f8c5 -SEPOLIA_ARB_LZ_ADAPTER=0x21eAB033C7D2DF6A67AeF6C5Bda9A7F151eB9f52 - -OPTIMISM_SEPOLIA_LZ_ADAPTER=0xF7c2687c75FcBC7A00663f9436783A2B898537a4 -CHIADO_ADAPTER=0x3F5929bee6A59661D6CcC9c4eB751048009CE11B - -#AMB_ADAPTER=0x4efB95c26bB2ebD3281749A5eAA388bc302b4445 -SYMGA_ADAPTER=0x9AD7a6f4FDA8247cC0bF5932B68c5b619937dB15 -GNOSIS_TELEPATHY_ADAPTER=0xDeF29f44f8315d0079A25EF03cfB0b0D8CdA3cF8 -# MAINNET_AMB_REPORTER=0x6be796cb66CdB3566b8AbebA2C516CbDF93fE831 -MAINNET_HEADER_REPORTER=0x11378C54aA4e2Daf4603f9be86ae0Cb70786682a -POLYGON_TELEPATHY_ADAPTER=0x04413A4795dD1f5347eAD1CD7C76Bd9E5e48b461 -BSC_TELEPATHY_ADAPTER=0x2E5685F20f42cC3b01e4A9ADE49F6848E242f022 -OPTIMISM_TELEPATHY_ADAPTER=0x856dcc80f75a9737D9D498266E1Af013668316Fb -ARBITRUM_TELEPATHY_ADAPTER=0x2E5685F20f42cC3b01e4A9ADE49F6848E242f022 -GNOSIS_WORMHOLE_ADAPTER=0x8EA3F385be8FCB98eB4dBfad2D00846860Bf648D -POLYGON_WORMHOLE_ADAPTER=0xb7806ea66c1bb9FfeB41Dc303601a469ddf3b9C2 -BSC_WORMHOLE_ADAPTER=0x11378C54aA4e2Daf4603f9be86ae0Cb70786682a -OPTIMISM_WORMHOLE_ADAPTER=0x1fF52708D610b1D17F0830f036e992677CDc508A -AVALANCHE_WORMHOLE_ADAPTER=0x6E9ce437c46e7fA4F0888c21AAC0d9099Ad133ea -MAINNET_WORMHOLE_HEADER_REPORTER=0xDeF29f44f8315d0079A25EF03cfB0b0D8CdA3cF8 -MAINNET_WORMHOLE_ADDRESS=0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B -MAINNET_L1_CROSS_DOMAIN_MESSENGER_HEADER_REPORTER_ADDRESS=0xbA5B3f0643582E75AF252e7631dE62c046970167 -OPTIMISM_L2_CROSS_DOMAIN_MESSENGER_ADAPTER_ADDRESS=0xe58E7bF7aCD1396D8F9eAF44DB3D4Fd055DCDb51 -MAINNET_AXELAR_REPORTER_BSC=0xBfd877753F8B4f4117a08aD54DcBE69cF3165d81 -BSC_AXELAR_ADAPTER_MAINNET=0xb7806ea66c1bb9FfeB41Dc303601a469ddf3b9C2 -POLYGON_CELER_ADAPTER_MAINNET=0x1fF52708D610b1D17F0830f036e992677CDc508A -MAINNET_CELER_REPORTER_POLYGON=0x52258b83051B7031483740aC9EcAa07926392ea0 -AVALANCHE_LAYER_ZERO_ADAPTER_MAINNET=0x11378C54aA4e2Daf4603f9be86ae0Cb70786682a -MAINNET_LAYER_ZERO_REPORTER_AVALANCHE=0x16B43E348e0A19E9196ae79D172aDC52B3Aa3E20 -OPTIMISM_GOERLI_CCIP_ADAPTER_SEPOLIA=0x520185210Aa645220a49afD9C33d28b73494e14d -SEPOLIA_CCIP_REPORTER_OPTIMISM_GOERLI=0xF3D2877866cd8E6771843b96B66aFcE425B2353C -BSC_TESTNET_CCIP_ADAPTER_SEPOLIA=0xB6133Ab655B990E80Af3E948852C8ec2a46651A5 -SEPOLIA_CCIP_REPORTER_BSC_TESTNET=0x855A2814E0DFf8327f1a52aCC9537772B829e226 - -BSC_LAYER_ZERO_ADAPTER_MAINNET=0xaC3c8D19A64B98d62ED16FFf8a4229E8ED36A469 -GOERLI_ZETA_REPORTER_BSC_TESTNET=0x9a9fc484D3F83B489bc58c2A3EeeA8331F21796B -BSC_TESTNET_ZETA_ADAPTER_GOERLI=0x2829D554678a767c5B091D28A0A294dB7643ec05 -MAINNET_CCIP_REPORTER_AVALANCHE=0xeEFD0D67E4eF9330870961C38a3e25ECE369B141 -AVALANCHE_CCIP_ADAPTER_MAINNET=0x04413A4795dD1f5347eAD1CD7C76Bd9E5e48b461 -GNOSIS_SYGMA_ADAPTER=0x483285D0e24401D0C5DB6cF1FAC4f79f412079C0 -MAINNET_SYGMA_REPORTER_GNOSIS=0x973bB99db211755b80c9087fe436fBb81A45AD5E -MAINNET_HEADER_STORAGE=0x22F1fc71A505c0b2bf4D5075801cc5E0ec84B09e -GOERLI_HEADER_STORAGE=0x4cD014AC64AAa899b46BF3a477B68bb67e33eDC4 -CHIADO_ELECTRON_ADAPTER_GOERLI=0x66fBC348aef3797fb885f8073173E5064bf7ABBb -CHIADO_ELECTRON_LIGHT_CLIENT_GOERLI=0xc01707bD835f6108785DF081C943C7C108FC3D89 -TELEPATHY_PROOF_API_URL= -TELEPATHY_BLOCK_BUFFER=10 -TELEPATHY_INTERVAL_UPDATE=30000 -ELECTRON_INTERVAL_UPDATE=30000 - -WORMHOLE_SCAN_BASE_URL=https://api.wormholescan.io - -TIME_FETCH_BLOCKS_MS=3600000 -BLOCK_BUFFER=10 -QUERY_BLOCK_LENGTH=200 - -# For Testnet -SOURCE_CHAIN_ID=11155111 -DESTINATION_CHAIN_IDS=10200,421614 - -# For Mainnet -# SOURCE_CHAIN_ID=1 -# DESTINATION_CHAIN_IDS=137,56 - - -# Mainnet -## Layer Zero -MAINNET_LAYER_ZERO_REPORTER=0x3da176b43604aacf6178128865afccb21ee0f943 -BSC_MAINNET_LAYER_ZERO_ADAPTER=0x7237bb8d1d38DF8b473b5A38eD90088AF162ad8e -POLYGON_MAINNET_LAYER_ZERO_ADAPTER=0x79e4D1B8b8De0bC2F8A3DC477480C935C66F373E - -## AMB -MAINNET_AMB_REPORTER=0xDbdF80c87f414fac8342e04D870764197bD3bAC7 -GNOSIS_AMB_ADAPTER=0x79e4D1B8b8De0bC2F8A3DC477480C935C66F373E - - -# Testnet -SEPOLIA_CHIADO_REPORTER=0xc6755144d60548f3DD420F47Cf48DAe553bBf042 -CHIADO_SEPOLIA_ADAPTER=0x3F5929bee6A59661D6CcC9c4eB751048009CE11B - - +SEPOLIA_CHIADO_WORMHOLE_REPORTER=0xeE8082F48e768e096c2EEC5C80DC818eb6E15858 +SEPOLIA_CHIADO_WORMHOLE_ADAPTER=0x79e4D1B8b8De0bC2F8A3DC477480C935C66F373E # LEGACY GNOSIS_AMB_ADAPTER=0x4efB95c26bB2ebD3281749A5eAA388bc302b4445 GNOSIS_AMB_REPORTER=0xc6755144d60548f3DD420F47Cf48DAe553bBf042 SEPOLIA_CHIADO_CCIP_REPORTER=0xf66871C91952b09270d223cD3A1e5Dad57b14fbC -SEPOLIA_CHIADO_CCIP_ADAPTER=0xf66871C91952b09270d223cD3A1e5Dad57b14fbC # FAKE +SEPOLIA_CHIADO_CCIP_ADAPTER=0x8A2A7509B98f0f21BEFF82e2520A920DB61fFa9d SEPOLIA_CHIADO_LZ_REPORTER=0xF7c2687c75FcBC7A00663f9436783A2B898537a4 SEPOLIA_CHIADO_LZ_ADAPTER=0xF7c2687c75FcBC7A00663f9436783A2B898537a4 -SEPOLIA_ARB_LZ_REPORTER=0x77B2cF15Ed888F3d5150E602d9805823Fdc8E51D -SEPOLIA_ARB_LZ_ADAPTER=0x117D7D593e6a7d9699a763C552BFA3177a46B957 +SEPOLIA_ARB_LZ_REPORTER=0x49f6BE2C7DB433395939b2c728dF2CB99Ca5f8c5 +SEPOLIA_ARB_LZ_ADAPTER=0x21eAB033C7D2DF6A67AeF6C5Bda9A7F151eB9f52 OPTIMISM_SEPOLIA_LZ_ADAPTER=0xF7c2687c75FcBC7A00663f9436783A2B898537a4 CHIADO_ADAPTER=0x3F5929bee6A59661D6CcC9c4eB751048009CE11B diff --git a/packages/reporter/src/controllers/WormholeReporterController.ts b/packages/reporter/src/controllers/WormholeReporterController.ts index 822650fe..a0553eb1 100644 --- a/packages/reporter/src/controllers/WormholeReporterController.ts +++ b/packages/reporter/src/controllers/WormholeReporterController.ts @@ -32,6 +32,7 @@ class WormholeReporterController extends BaseController { async onBlocks(_blockNumbers: bigint[]) { const release = await this._mutex.acquire() + try { const wormholeChainId = this._wormholeChainIds[this.sourceChain.name] const client = this.multiClient.getClientByChain(this.sourceChain) @@ -57,14 +58,16 @@ class WormholeReporterController extends BaseController { this.logger.info(`header reported from ${this.sourceChain.name} to Wormhole Network: ${txHash}`) let vaaBytes = null + let sequence = Number(nextSequence) + while (true) { try { this.logger.info("Waiting for signed VAA ...") + const { data } = await this._wormholeScanClient.get( - `v1/signed_vaa/${wormholeChainId}/000000000000000000000000${this.reporterAddress?.slice( - wormholeChainId, - )}/${Number(nextSequence)}`, + `v1/signed_vaa/${wormholeChainId}/000000000000000000000000${this.reporterAddress?.slice(2)}/${sequence}`, ) + vaaBytes = "0x" + Buffer.from(data.vaaBytes, "base64").toString("hex") this.logger.info("Signed VAA available! Proceeding ...") break diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index a7a5c22d..59dba0df 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -121,13 +121,14 @@ const main = () => { destinationChains, logger, multiClient, - reporterAddress: (settings.contractAddresses.reporterAddresses as any)[sourceChain.name]?.WormholeHeaderReporter, + reporterAddress: (settings.contractAddresses.reporterAddresses as any)[sourceChain.name]?.WormholeReporter, adapterAddresses: { - [gnosis.name]: (settings.contractAddresses.adapterAddresses as any)?.Gnosis?.WormholeAdapter, - [optimism.name]: (settings.contractAddresses.adapterAddresses as any)["OP Mainnet"]?.WormholeAdapter, - [bsc.name]: (settings.contractAddresses.adapterAddresses as any)["BNB Smart Chain"]?.WormholeAdapter, - [polygon.name]: (settings.contractAddresses.adapterAddresses as any)?.Polygon.WormholeAdapter, - [avalanche.name]: (settings.contractAddresses.adapterAddresses as any)?.Avalanche.WormholeAdapter, + // [gnosis.name]: (settings.contractAddresses.adapterAddresses as any)?.Gnosis?.WormholeAdapter, + // [optimism.name]: (settings.contractAddresses.adapterAddresses as any)["OP Mainnet"]?.WormholeAdapter, + // [bsc.name]: (settings.contractAddresses.adapterAddresses as any)["BNB Smart Chain"]?.WormholeAdapter, + // [polygon.name]: (settings.contractAddresses.adapterAddresses as any)?.Polygon.WormholeAdapter, + // [avalanche.name]: (settings.contractAddresses.adapterAddresses as any)?.Avalanche.WormholeAdapter, + [gnosisChiado.name]: (settings.contractAddresses.adapterAddresses as any)?.[gnosisChiado.name]?.WormholeAdapter, }, wormholeScanBaseUrl: settings.reporterControllers.WormholeReporterController.wormholeScanBaseUrl, wormholeAddress: (settings.contractAddresses as any)[sourceChain.name]?.Wormhole, diff --git a/packages/reporter/src/settings/index.ts b/packages/reporter/src/settings/index.ts index 9c7d9315..654b2df0 100644 --- a/packages/reporter/src/settings/index.ts +++ b/packages/reporter/src/settings/index.ts @@ -97,6 +97,7 @@ export const settings = { AMBAdapter: process.env.CHIADO_SEPOLIA_ADAPTER as `0x${string}`, CCIPAdapter: process.env.SEPOLIA_CHIADO_CCIP_ADAPTER as `0x${string}`, LayerZeroAdapter: process.env.SEPOLIA_CHIADO_LZ_ADAPTER as `0x${string}`, + WormholeAdapter: process.env.SEPOLIA_CHIADO_WORMHOLE_ADAPTER as `0x${string}`, }, [arbitrumSepolia.name]: { LayerZeroAdapter: process.env.SEPOLIA_ARB_LZ_ADAPTER as `0x${string}`, @@ -111,6 +112,9 @@ export const settings = { }, }, }, + [gnosisChiado.name]: { + WormholeAdapter: process.env.SEPOLIA_CHIADO_WORMHOLE_ADAPTER as `0x${string}`, + }, [gnosis.name]: { WormholeAdapter: process.env.GNOSIS_WORMHOLE_ADAPTER as `0x${string}`, }, @@ -171,6 +175,7 @@ export const settings = { AMBReporter: process.env.SEPOLIA_CHIADO_REPORTER as `0x${string}`, CCIPReporter: process.env.SEPOLIA_CHIADO_CCIP_REPORTER as `0x${string}`, LayerZeroReporter: process.env.SEPOLIA_CHIADO_LZ_REPORTER as `0x${string}`, + WormholeReporter: process.env.SEPOLIA_CHIADO_WORMHOLE_REPORTER as `0x${string}`, }, [arbitrumSepolia.name]: { LayerZeroReporter: process.env.SEPOLIA_ARB_LZ_REPORTER as `0x${string}`, @@ -185,6 +190,9 @@ export const settings = { [mainnet.name]: { WormholeHeaderReporter: process.env.MAINNET_WORMHOLE_HEADER_REPORTER as `0x${string}`, }, + [sepolia.name]: { + WormholeReporter: process.env.SEPOLIA_CHIADO_WORMHOLE_REPORTER as `0x${string}`, + }, }, lightClientAddresses: { [gnosisChiado.name]: { @@ -225,6 +233,9 @@ export const settings = { Wormhole: process.env.MAINNET_WORMHOLE_ADDRESS as `0x${string}`, HeaderStorage: process.env.MAINNET_HEADER_STORAGE as `0x${string}`, }, + [sepolia.name]: { + Wormhole: process.env.SEPOLIA_WORMHOLE_ADDRESS as `0x${string}`, + }, }, reporterControllers: { AMBReporterController: { @@ -254,10 +265,12 @@ export const settings = { baseProofUrl: process.env.TELEPATHY_PROOF_API_URL as string, }, WormholeReporterController: { + wormholeAddress: process.env.WORMHOLE_CONTRACT_ADDRESS as `0x${string}`, wormholeChainIds: { [mainnet.name]: 2, + [sepolia.name]: 10002, }, - wormholeScanBaseUrl: "https://api.wormholescan.io", + wormholeScanBaseUrl: process.env.WORMHOLE_SCAN_BASE_URL as string, }, ZetaReporterController: { reportHeadersValue: parseEther(process.env.ZETA_CHAIN_REPORT_HEADERS_VALUE as string), From 10a88b58d65ff2d7c4326ff3d054b00a5bcad99d Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Fri, 26 Jul 2024 14:00:28 +0800 Subject: [PATCH 236/297] chore(evm): update Wormhole deploy task --- .../evm/tasks/deploy/adapters/wormhole.ts | 59 +++++-------------- 1 file changed, 15 insertions(+), 44 deletions(-) diff --git a/packages/evm/tasks/deploy/adapters/wormhole.ts b/packages/evm/tasks/deploy/adapters/wormhole.ts index b61ed770..5dd59e2f 100644 --- a/packages/evm/tasks/deploy/adapters/wormhole.ts +++ b/packages/evm/tasks/deploy/adapters/wormhole.ts @@ -4,18 +4,13 @@ import type { TaskArguments } from "hardhat/types" import { verify } from ".." import type { WormholeAdapter } from "../../../types/contracts/adapters/Wormhole/WormholeAdapter" -import type { WormholeHeaderReporter } from "../../../types/contracts/adapters/Wormhole/WormholeHeaderReporter" -import type { WormholeMessageRelay } from "../../../types/contracts/adapters/Wormhole/WormholeMessageRelay" +import type { WormholeReporter } from "../../../types/contracts/adapters/Wormhole/WormholeReporter" import type { WormholeAdapter__factory } from "../../../types/factories/contracts/adapters/Wormhole/WormholeAdapter__factory" -import type { WormholeHeaderReporter__factory } from "../../../types/factories/contracts/adapters/Wormhole/WormholeHeaderReporter__factory" -import type { WormholeMessageRelay__factory } from "../../../types/factories/contracts/adapters/Wormhole/WormholeMessageRelay__factory" +import type { WormholeReporter__factory } from "../../../types/factories/contracts/adapters/Wormhole/WormholeReporter__factory" // Deploy on destination chain task("deploy:Wormhole:Adapter") .addParam("wormhole", "address of the Wormhole contract", undefined, types.string) - .addParam("reporter", "address of the hash reporter", undefined, types.string) - .addParam("chainId", "source chain id", undefined, types.string) - .addParam("wormholeChainId", "wormhole source chain id", undefined, types.string) .addFlag("verify", "whether to verify the contract on Etherscan") .setAction(async function (taskArguments: TaskArguments, hre) { console.log("Deploying WormholeAdapter...") @@ -23,12 +18,7 @@ task("deploy:Wormhole:Adapter") const wormholeAdapterFactory: WormholeAdapter__factory = ( await hre.ethers.getContractFactory("WormholeAdapter") ) - const constructorArguments = [ - taskArguments.wormhole, - taskArguments.reporter, - taskArguments.chainId, - taskArguments.wormholeChainId, - ] as const + const constructorArguments = [taskArguments.wormhole] as const const wormholeAdapter: WormholeAdapter = ( await wormholeAdapterFactory.connect(signers[0]).deploy(...constructorArguments) ) @@ -38,41 +28,22 @@ task("deploy:Wormhole:Adapter") }) // Deploy source chain -task("deploy:Wormhole:HeaderReporter") - .addParam("wormhole", "address of the Wormhole contract", undefined, types.string) - .addParam("headerStorage", "address of the header storage contract", undefined, types.string) - .addFlag("verify", "whether to verify the contract on Etherscan") - .setAction(async function (taskArguments: TaskArguments, hre) { - console.log("Deploying WormholeHeaderReporter...") - const signers: SignerWithAddress[] = await hre.ethers.getSigners() - const wormholeHeaderReporterFactory: WormholeHeaderReporter__factory = ( - await hre.ethers.getContractFactory("WormholeHeaderReporter") - ) - const constructorArguments = [taskArguments.wormhole, taskArguments.headerStorage] as const - const wormholeHeaderReporter: WormholeHeaderReporter = ( - await wormholeHeaderReporterFactory.connect(signers[0]).deploy(...constructorArguments) - ) - await wormholeHeaderReporter.deployed() - console.log("WormholeHeaderReporter deployed to:", wormholeHeaderReporter.address) - if (taskArguments.verify) await verify(hre, wormholeHeaderReporter, constructorArguments) - }) - -// Deploy source chain -task("deploy:Wormhole:MessageRelay") - .addParam("wormhole", "address of the Wormhole contract", undefined, types.string) +task("deploy:Wormhole:Reporter") .addParam("yaho", "address of the Yaho contract", undefined, types.string) + .addParam("wormhole", "address of the Wormhole contract", undefined, types.string) + .addParam("headerstorage", "address of the header storage contract", undefined, types.string) .addFlag("verify", "whether to verify the contract on Etherscan") .setAction(async function (taskArguments: TaskArguments, hre) { - console.log("Deploying WormholeMessageRelay...") + console.log("Deploying WormholeReporter...") const signers: SignerWithAddress[] = await hre.ethers.getSigners() - const wormholeMessageRelayFactory: WormholeMessageRelay__factory = ( - await hre.ethers.getContractFactory("WormholeMessageRelay") + const wormholeReporterFactory: WormholeReporter__factory = ( + await hre.ethers.getContractFactory("WormholeReporter") ) - const constructorArguments = [taskArguments.wormhole, taskArguments.yaho] as const - const wormholeMessageRelay: WormholeMessageRelay = ( - await wormholeMessageRelayFactory.connect(signers[0]).deploy(...constructorArguments) + const constructorArguments = [taskArguments.headerstorage, taskArguments.yaho, taskArguments.wormhole] as const + const wormholeReporter: WormholeReporter = ( + await wormholeReporterFactory.connect(signers[0]).deploy(...constructorArguments) ) - await wormholeMessageRelay.deployed() - console.log("WormholeMessageRelay deployed to:", wormholeMessageRelay.address) - if (taskArguments.verify) await verify(hre, wormholeMessageRelay, constructorArguments) + await wormholeReporter.deployed() + console.log("WormholeHeaderReporter deployed to:", wormholeReporter.address) + if (taskArguments.verify) await verify(hre, wormholeReporter, constructorArguments) }) From ea3bd0277738c05469187643925b36b76dec6f38 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Fri, 26 Jul 2024 18:03:58 +0800 Subject: [PATCH 237/297] misc(relayer): update .env.example --- packages/relayer/.env.example | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/relayer/.env.example b/packages/relayer/.env.example index 5f80c130..3380a0fd 100644 --- a/packages/relayer/.env.example +++ b/packages/relayer/.env.example @@ -3,6 +3,7 @@ CHAIN_ID= RPC= PK= WATCH_INTERVAL_TIME_MS= +CREATE_BATCH_INTERVAL_TIME_MS= MONGO_DB_URI= MIN_BATCH_SIZE= WHITELISTED_SENDER_ADDRESSES= \ No newline at end of file From 77e02754ac43cda4036a42dd11d90a1eabbd1df7 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Fri, 26 Jul 2024 20:05:04 +0800 Subject: [PATCH 238/297] chore(reporter): update AMB reporter variable name --- packages/reporter/.env.example | 4 ++-- packages/reporter/src/settings/index.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index e341bce5..8d701cc1 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -56,8 +56,8 @@ GNOSIS_AMB_ADAPTER=0x79e4D1B8b8De0bC2F8A3DC477480C935C66F373E # Testnet -GNOSIS_AMB_ADAPTER=0x3F5929bee6A59661D6CcC9c4eB751048009CE11B -GNOSIS_AMB_REPORTER=0xc6755144d60548f3DD420F47Cf48DAe553bBf042 +SEPOLIA_CHIADO_AMB_ADAPTER=0x3F5929bee6A59661D6CcC9c4eB751048009CE11B +SEPOLIA_CHIADO_AMB_REPORTER=0xc6755144d60548f3DD420F47Cf48DAe553bBf042 SEPOLIA_CHIADO_CCIP_REPORTER=0xf66871C91952b09270d223cD3A1e5Dad57b14fbC SEPOLIA_CHIADO_CCIP_ADAPTER=0x8A2A7509B98f0f21BEFF82e2520A920DB61fFa9d diff --git a/packages/reporter/src/settings/index.ts b/packages/reporter/src/settings/index.ts index 654b2df0..4f6a2c05 100644 --- a/packages/reporter/src/settings/index.ts +++ b/packages/reporter/src/settings/index.ts @@ -94,7 +94,7 @@ export const settings = { CCIPAdapter: process.env.BSC_TESTNET_CCIP_ADAPTER_SEPOLIA as `0x${string}`, }, [gnosisChiado.name]: { - AMBAdapter: process.env.CHIADO_SEPOLIA_ADAPTER as `0x${string}`, + AMBAdapter: process.env.SEPOLIA_CHIADO_AMB_ADAPTER as `0x${string}`, CCIPAdapter: process.env.SEPOLIA_CHIADO_CCIP_ADAPTER as `0x${string}`, LayerZeroAdapter: process.env.SEPOLIA_CHIADO_LZ_ADAPTER as `0x${string}`, WormholeAdapter: process.env.SEPOLIA_CHIADO_WORMHOLE_ADAPTER as `0x${string}`, @@ -172,7 +172,7 @@ export const settings = { CCIPReporter: process.env.SEPOLIA_CCIP_REPORTER_BSC_TESTNET as `0x${string}`, }, [gnosisChiado.name]: { - AMBReporter: process.env.SEPOLIA_CHIADO_REPORTER as `0x${string}`, + AMBReporter: process.env.SEPOLIA_CHIADO_AMB_REPORTER as `0x${string}`, CCIPReporter: process.env.SEPOLIA_CHIADO_CCIP_REPORTER as `0x${string}`, LayerZeroReporter: process.env.SEPOLIA_CHIADO_LZ_REPORTER as `0x${string}`, WormholeReporter: process.env.SEPOLIA_CHIADO_WORMHOLE_REPORTER as `0x${string}`, From 99a6a2a41ba9db3d9f84549f9981da18db18f2d0 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Mon, 29 Jul 2024 17:14:13 +0800 Subject: [PATCH 239/297] feat(reporter): add Base related addresses --- packages/reporter/.env.example | 12 +++++-- packages/reporter/src/Coordinator.ts | 5 ++- .../controllers/StandardReporterController.ts | 7 +++- packages/reporter/src/index.ts | 6 +++- packages/reporter/src/settings/index.ts | 35 +++++++++++++++++++ 5 files changed, 58 insertions(+), 7 deletions(-) diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index 8d701cc1..9f8cdebf 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -10,6 +10,7 @@ GOERLI_RPC_URL= POLYGON_RPC_URL= OPTIMISM_RPC_URL=https://optimism.llamarpc.com ARBITRUM_RPC_URL=https://arbitrum.llamarpc.com +BASE_RPC_URL= SEPOLIA_RPC_URL= CHIADO_RPC_URL=https://rpc.chiadochain.net GOERLI_BEACON_API_URL= @@ -37,8 +38,8 @@ QUERY_BLOCK_LENGTH=200 -SOURCE_CHAIN_ID= -DESTINATION_CHAIN_IDS= +SOURCE_CHAIN_ID=8453 +DESTINATION_CHAIN_IDS=42161,10,56,137,100 # Mainnet @@ -49,6 +50,13 @@ POLYGON_MAINNET_LAYER_ZERO_ADAPTER=0x998dA7f6cF98541E4F4469cc9d53B9374F186591 BASE_MAINNET_LAYER_ZERO_ADAPTER=0xA86bc62Ac53Dc86687AB6C15fdebC71ad51fB615 OPTIMISM_MAINNET_LAYER_ZERO_ADAPTER=0xA86bc62Ac53Dc86687AB6C15fdebC71ad51fB615 +### BASE +BASE_LZ_REPORTER=0x495b872b329eba69F81A749f8A152766851C23b0 +BASE_POLYGON_LZ_ADAPTER=0x998dA7f6cF98541E4F4469cc9d53B9374F186591 +BASE_GNO_LZ_ADAPTER=0xC82e50cc90C84DC492B4Beb6792DEeB496d52424 +BASE_BNB_LZ_ADAPTER=0xDbdF80c87f414fac8342e04D870764197bD3bAC7 +BASE_OPTIMISM_LZ_ADAPTER=0xA86bc62Ac53Dc86687AB6C15fdebC71ad51fB615 +BASE_ARBITRUM_LZ_ADAPTER=0xA86bc62Ac53Dc86687AB6C15fdebC71ad51fB615 ## AMB MAINNET_AMB_REPORTER=0xDbdF80c87f414fac8342e04D870764197bD3bAC7 diff --git a/packages/reporter/src/Coordinator.ts b/packages/reporter/src/Coordinator.ts index 44c04b64..4a5be932 100644 --- a/packages/reporter/src/Coordinator.ts +++ b/packages/reporter/src/Coordinator.ts @@ -47,12 +47,11 @@ class Coordinator { } start() { - this.logger.info(`Start Reporter with config${this.controllers}`) - this.logger.info(`Source chain: ${this.sourceChain}`) + this.logger.info(`Running ${this.controllers[0].name}`) + this.logger.info(`Source chain: ${this.sourceChain.name}`) this.logger.info(`Query block length: ${this._queryBlockLength}`) this.logger.info(`Block Buffer: ${this._blockBuffer}`) this.logger.info(`Interval to fetch blocks (ms): ${this._intervalFetchBlocksMs}`) - this.logger.info(`Interval to update light clients: ${this._intervalsUpdateLightClients}`) this.fetchBlocks() this.intervals.push( diff --git a/packages/reporter/src/controllers/StandardReporterController.ts b/packages/reporter/src/controllers/StandardReporterController.ts index 1ee5d06d..5686cdfe 100644 --- a/packages/reporter/src/controllers/StandardReporterController.ts +++ b/packages/reporter/src/controllers/StandardReporterController.ts @@ -25,7 +25,10 @@ class StandardReporterController extends BaseController { const blockNumber = _blockNumbers[_blockNumbers.length - 1] for (const chain of this.destinationChains as Chain[]) { - if (!this.adapterAddresses[chain.name]) continue + if (!this.adapterAddresses[chain.name]) { + this.logger.info(`Adapter address is missing for ${chain.name}. Skipping...`) + continue + } this.logger.info(`reporting block header for block ${blockNumber} on ${chain.name} ...`) const { request } = await client.simulateContract({ @@ -38,6 +41,8 @@ class StandardReporterController extends BaseController { const txHash = await client.writeContract(request) this.logger.info(`headers reporter from ${this.sourceChain.name} to ${chain.name}: ${txHash}`) + + await new Promise((resolve) => setTimeout(resolve, 12000)) } } catch (_error) { this.logger.error(_error) diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 59dba0df..45835d67 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -31,6 +31,7 @@ import logger from "./utils/logger.js" const main = () => { const controllersEnabled = process.env.REPORTERS_ENABLED?.split(",") + const sourceChainId = Number(process.env.SOURCE_CHAIN_ID) const destinationChainIds = process.env.DESTINATION_CHAIN_IDS?.split(",").map((_chainId) => Number(_chainId)) const chains = [ @@ -212,16 +213,20 @@ const main = () => { // unidirectionalReportersAddresses[sourceChain.name]?.[optimismSepolia.name]?.LayerZeroReporter, [polygon.name]: unidirectionalReportersAddresses[sourceChain.name]?.[polygon.name]?.LayerZeroReporter, [bsc.name]: unidirectionalReportersAddresses[sourceChain.name]?.[bsc.name]?.LayerZeroReporter, + [gnosis.name]: unidirectionalReportersAddresses[sourceChain.name]?.[gnosis.name]?.LayerZeroReporter, [base.name]: unidirectionalReportersAddresses[sourceChain.name]?.[base.name]?.LayerZeroReporter, [optimism.name]: unidirectionalReportersAddresses[sourceChain.name]?.[optimism.name]?.LayerZeroReporter, + [arbitrum.name]: unidirectionalReportersAddresses[sourceChain.name]?.[arbitrum.name]?.LayerZeroReporter, [arbitrumSepolia.name]: unidirectionalReportersAddresses[sourceChain.name]?.[arbitrumSepolia.name]?.LayerZeroReporter, }, adapterAddresses: { [polygon.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[polygon.name]?.LayerZeroAdapter, [bsc.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[bsc.name]?.LayerZeroAdapter, + [gnosis.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[gnosis.name]?.LayerZeroAdapter, [base.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[base.name]?.LayerZeroAdapter, [optimism.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[optimism.name]?.LayerZeroAdapter, + [arbitrum.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[arbitrum.name]?.LayerZeroAdapter, [arbitrumSepolia.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[arbitrumSepolia.name]?.LayerZeroAdapter, [optimismSepolia.name]: @@ -317,7 +322,6 @@ const main = () => { celerReporterController, layerZeroReporterController, hyperlaneReporterController, - ccipReporterController, zetaReporterController, electronReporterController, ].filter((_controller) => controllersEnabled?.includes(_controller.name)), diff --git a/packages/reporter/src/settings/index.ts b/packages/reporter/src/settings/index.ts index 4f6a2c05..e21db5e1 100644 --- a/packages/reporter/src/settings/index.ts +++ b/packages/reporter/src/settings/index.ts @@ -37,6 +37,7 @@ export const settings = { [bsc.name]: process.env.BSC_RPC_URL as string, [arbitrum.name]: process.env.ARBITRUM_RPC_URL as string, [sepolia.name]: process.env.SEPOLIA_RPC_URL as string, + [base.name]: process.env.BASE_RPC_URL as string, }, beaconApiUrls: { [goerli.name]: process.env.GOERLI_BEACON_API_URL as string, @@ -83,6 +84,23 @@ export const settings = { SygmaReporter: "0x2f96d347c932ac73b56e9352ecc0707e25173d88" as `0x${string}`, },*/ }, + [base.name]: { + [polygon.name]: { + LayerZeroAdapter: process.env.BASE_POLYGON_LZ_ADAPTER as `0x${string}`, + }, + [bsc.name]: { + LayerZeroAdapter: process.env.BASE_BNB_LZ_ADAPTER as `0x${string}`, + }, + [gnosis.name]: { + LayerZeroAdapter: process.env.BASE_GNO_LZ_ADAPTER as `0x${string}`, + }, + [arbitrum.name]: { + LayerZeroAdapter: process.env.BASE_ARBITRUM_LZ_ADAPTER as `0x${string}`, + }, + [optimism.name]: { + LayerZeroAdapter: process.env.BASE_OPTIMISM_LZ_ADAPTER as `0x${string}`, + }, + }, [sepolia.name]: { [optimismSepolia.name]: { LayerZeroAdapter: process.env.OPTIMISM_SEPOLIA_LZ_ADAPTER as `0x${string}`, @@ -161,6 +179,23 @@ export const settings = { CCIPReporter: process.env.MAINNET_CCIP_REPORTER_AVALANCHE as `0x${string}`, }, }, + [base.name]: { + [polygon.name]: { + LayerZeroReporter: process.env.BASE_LZ_REPORTER as `0x${string}`, + }, + [bsc.name]: { + LayerZeroReporter: process.env.BASE_LZ_REPORTER as `0x${string}`, + }, + [gnosis.name]: { + LayerZeroReporter: process.env.BASE_LZ_REPORTER as `0x${string}`, + }, + [arbitrum.name]: { + LayerZeroReporter: process.env.BASE_LZ_REPORTER as `0x${string}`, + }, + [optimism.name]: { + LayerZeroReporter: process.env.BASE_LZ_REPORTER as `0x${string}`, + }, + }, [sepolia.name]: { [optimismSepolia.name]: { LayerZeroReporter: process.env.SEPOLIA_CHIADO_LZ_REPORTER as `0x${string}`, From 447abf79e45723ecad66fa14cc24217cf610ee71 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Wed, 31 Jul 2024 14:20:54 +0800 Subject: [PATCH 240/297] feat(evm): add Arb Header Storage.sol --- packages/evm/contracts/interfaces/IArbSys.sol | 10 +++++ .../evm/contracts/utils/ArbHeaderStorage.sol | 38 +++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 packages/evm/contracts/interfaces/IArbSys.sol create mode 100644 packages/evm/contracts/utils/ArbHeaderStorage.sol diff --git a/packages/evm/contracts/interfaces/IArbSys.sol b/packages/evm/contracts/interfaces/IArbSys.sol new file mode 100644 index 00000000..b052bd3b --- /dev/null +++ b/packages/evm/contracts/interfaces/IArbSys.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity ^0.8.0; + +interface IArbSys { + /** + * @notice Get Arbitrum block hash (reverts unless currentBlockNum-256 <= arbBlockNum < currentBlockNum) + * @return block hash + */ + function arbBlockHash(uint256 arbBlockNum) external view returns (bytes32); +} diff --git a/packages/evm/contracts/utils/ArbHeaderStorage.sol b/packages/evm/contracts/utils/ArbHeaderStorage.sol new file mode 100644 index 00000000..3c5898cb --- /dev/null +++ b/packages/evm/contracts/utils/ArbHeaderStorage.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity ^0.8.20; + +import { IHeaderStorage } from "../interfaces/IHeaderStorage.sol"; +import { IArbSys } from "../interfaces/IArbSys.sol"; + +/// @dev Solidity's blockhash will return pseudo-random bytes32 instead of block hash of Arbitrum block +/// https://docs.arbitrum.io/build-decentralized-apps/arbitrum-vs-ethereum/solidity-support#differences-from-solidity-on-ethereum +/// Need to call precompiled arbBlockHash(uint256 blockNumber) to get actual block hash of Arbitrum +/// https://docs.arbitrum.io/build-decentralized-apps/precompiles/reference#arbsys +contract ArbHeaderStorage is IHeaderStorage { + mapping(uint256 => bytes32) public headers; + + /// @inheritdoc IHeaderStorage + function storeBlockHeader(uint256 blockNumber) public returns (bytes32) { + bytes32 blockHeader = headers[blockNumber]; + if (blockHeader == 0) { + // ArbSys precompiled contract = 0x0000000000000000000000000000000000000064 + blockHeader = IArbSys(0x0000000000000000000000000000000000000064).arbBlockHash(blockNumber); + if (blockHeader == 0) revert HeaderOutOfRange(blockNumber); + headers[blockNumber] = blockHeader; + emit HeaderStored(blockNumber, blockHeader); + } + return blockHeader; + } + + /// @inheritdoc IHeaderStorage + function storeBlockHeaders(uint256[] memory blockNumbers) public returns (bytes32[] memory) { + bytes32[] memory blockHeaders = new bytes32[](blockNumbers.length); + for (uint256 i = 0; i < blockNumbers.length; ) { + blockHeaders[i] = storeBlockHeader(blockNumbers[i]); + unchecked { + ++i; + } + } + return blockHeaders; + } +} From ed2e40b0c05a4c8591fa802915273efba17aee1e Mon Sep 17 00:00:00 2001 From: mpetrun5 Date: Thu, 22 Aug 2024 10:18:04 +0200 Subject: [PATCH 241/297] feat(contracts): implement Spectre adapter push flow --- .../adapters/Spectre/SpectreAdapter.sol | 81 +++++++ .../adapters/Spectre/interfaces/ISpectre.sol | 6 + .../contracts/adapters/Spectre/lib/Merkle.sol | 118 ++++++++++ .../adapters/Spectre/mock/MockSpectre.sol | 10 + .../Spectre/01_SpectreAdapter.spec.ts | 205 ++++++++++++++++++ 5 files changed, 420 insertions(+) create mode 100644 packages/evm/contracts/adapters/Spectre/SpectreAdapter.sol create mode 100644 packages/evm/contracts/adapters/Spectre/interfaces/ISpectre.sol create mode 100644 packages/evm/contracts/adapters/Spectre/lib/Merkle.sol create mode 100644 packages/evm/contracts/adapters/Spectre/mock/MockSpectre.sol create mode 100644 packages/evm/test/adapters/Spectre/01_SpectreAdapter.spec.ts diff --git a/packages/evm/contracts/adapters/Spectre/SpectreAdapter.sol b/packages/evm/contracts/adapters/Spectre/SpectreAdapter.sol new file mode 100644 index 00000000..fdf52058 --- /dev/null +++ b/packages/evm/contracts/adapters/Spectre/SpectreAdapter.sol @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity ^0.8.20; + +import { Merkle } from "./lib/Merkle.sol"; +import { Receipt } from "../Electron/lib/Receipt.sol"; +import { BlockHashAdapter } from "../BlockHashAdapter.sol"; +import { AccessControl } from "@openzeppelin/contracts/access/AccessControl.sol"; +import { ISpectre } from "./interfaces/ISpectre.sol"; + +contract SpectreAdapter is AccessControl, BlockHashAdapter { + string public constant PROVIDER = "spectre"; + + // keccak256("MessageDispatched(uint256,(uint256,uint256,uint256,address,address,bytes,address[],address[]))") + bytes32 internal constant MESSAGE_DISPATCHED_EVENT_SIG = + 0x218247aabc759e65b5bb92ccc074f9d62cd187259f2a0984c3c9cf91f67ff7cf; + + address public immutable SOURCE_YAHO; + uint256 public immutable SOURCE_CHAIN_ID; + address public spectreAddress; + + error Unauthorized(); + error InvalidEventSource(); + error InvalidReceiptsRoot(); + error ErrorParseReceipt(); + error InvalidEventSignature(); + error BlockHeaderRootMissing(); + + constructor(address initialSpectreAddress, uint256 sourceChainId, address sourceYaho) { + _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); + SOURCE_CHAIN_ID = sourceChainId; + SOURCE_YAHO = sourceYaho; + spectreAddress = initialSpectreAddress; + } + + modifier onlyAdmin() { + if (!hasRole(DEFAULT_ADMIN_ROLE, msg.sender)) revert Unauthorized(); + _; + } + + function changeSpectreAddress(address newSpectreAddress) external onlyAdmin { + spectreAddress = newSpectreAddress; + } + + function verifyAndStoreDispatchedMessage( + uint64 srcSlot, + uint64 txSlot, + bytes32[] memory receiptsRootProof, + bytes32 receiptsRoot, + bytes[] memory receiptProof, + bytes memory txIndexRLPEncoded, + uint256 logIndex + ) external { + bytes32 blockHeaderRoot = ISpectre(spectreAddress).blockHeaderRoots(srcSlot); + if (blockHeaderRoot == bytes32(0)) revert BlockHeaderRootMissing(); + + bool isValidReceiptsRoot = Merkle.verifyReceiptsRoot( + receiptsRootProof, + receiptsRoot, + srcSlot, + txSlot, + blockHeaderRoot + ); + if (!isValidReceiptsRoot) revert InvalidReceiptsRoot(); + + Receipt.ParsedReceipt memory parsedReceipt = Receipt.parseReceipt( + receiptsRoot, + receiptProof, + txIndexRLPEncoded, + logIndex + ); + + if (!parsedReceipt.isValid) revert ErrorParseReceipt(); + if (bytes32(parsedReceipt.topics[0]) != MESSAGE_DISPATCHED_EVENT_SIG) revert InvalidEventSignature(); + if (parsedReceipt.eventSource != SOURCE_YAHO) revert InvalidEventSource(); + + uint256 messageId = uint256(parsedReceipt.topics[1]); + bytes32 messageHash = keccak256(parsedReceipt.data); + + _storeHash(SOURCE_CHAIN_ID, messageId, messageHash); + } +} diff --git a/packages/evm/contracts/adapters/Spectre/interfaces/ISpectre.sol b/packages/evm/contracts/adapters/Spectre/interfaces/ISpectre.sol new file mode 100644 index 00000000..7449cfe1 --- /dev/null +++ b/packages/evm/contracts/adapters/Spectre/interfaces/ISpectre.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.20; + +interface ISpectre { + function blockHeaderRoots(uint256 slot) external view returns (bytes32); +} diff --git a/packages/evm/contracts/adapters/Spectre/lib/Merkle.sol b/packages/evm/contracts/adapters/Spectre/lib/Merkle.sol new file mode 100644 index 00000000..109fcde2 --- /dev/null +++ b/packages/evm/contracts/adapters/Spectre/lib/Merkle.sol @@ -0,0 +1,118 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity ^0.8.20; + +library Merkle { + uint256 internal constant SLOTS_PER_HISTORICAL_ROOT = 8192; + // BeaconState -> BlockRoots + uint256 internal constant BLOCK_ROOTS_GINDEX = 37; + // BeaconBlock -> BeaconState + uint256 internal constant STATE_ROOT_GINDEX = 11; + // BeaconBlock -> BeaconBody -> ExecutionPayload -> ReceiptsRoot + uint256 internal constant RECEIPT_ROOT_GINDEX = 6435; + + function restoreMerkleRoot( + bytes32[] memory branch, + bytes32 leaf, + uint256 index + ) internal pure returns (bytes32 root) { + require(index < 2 ** branch.length, "invalid leaf index"); + + bytes32 combineHash = leaf; + uint256 curIndex = index; + for (uint256 i = 0; i < branch.length; ) { + if (curIndex % 2 == 0) combineHash = sha256(bytes.concat(combineHash, branch[i])); + else combineHash = sha256(bytes.concat(branch[i], combineHash)); + + curIndex /= 2; + + unchecked { + i++; + } + } + + root = combineHash; + } + + function verifyReceiptsRoot( + bytes32[] memory receiptsRootBranch, + bytes32 receiptsRoot, + uint64 lcSlot, + uint64 txSlot, + bytes32 headerRoot + ) internal pure returns (bool) { + uint256 index; + if (txSlot == lcSlot) { + index = RECEIPT_ROOT_GINDEX; + } else if (lcSlot - txSlot <= SLOTS_PER_HISTORICAL_ROOT) { + uint256[] memory blockRootsGindex = new uint256[](2); + blockRootsGindex[0] = BLOCK_ROOTS_GINDEX; + blockRootsGindex[1] = calculateArrayGindex(txSlot % SLOTS_PER_HISTORICAL_ROOT); + uint256[] memory receiptGindexes = new uint256[](3); + receiptGindexes[0] = STATE_ROOT_GINDEX; + receiptGindexes[1] = concatGindices(blockRootsGindex); + receiptGindexes[2] = RECEIPT_ROOT_GINDEX; + + // BeaconBlock -> BeaconState -> HistoricalRoots -> BeaconBlock -> BeaconBody -> ExecutionPayload -> ReceiptsRoot + index = concatGindices(receiptGindexes); + } else if (lcSlot - txSlot > SLOTS_PER_HISTORICAL_ROOT) { + revert("txSlot lags by >8192 blocks. Not supported."); + } else { + revert("txSlot can't be greater than lightclient slot"); + } + + bytes32 computedRoot = restoreMerkleRoot(receiptsRootBranch, receiptsRoot, calculateIndex(index)); + return computedRoot == headerRoot; + } + + function concatGindices(uint256[] memory gindices) public pure returns (uint256) { + uint256 result = 1; // Start with binary "1" + for (uint i = 0; i < gindices.length; i++) { + uint256 gindex = gindices[i]; + uint256 gindexWithoutLeadingOne = gindex & ((1 << (bitLength(gindex) - 1)) - 1); + result = (result << (bitLength(gindex) - 1)) | gindexWithoutLeadingOne; + } + return result; + } + + function bitLength(uint256 number) internal pure returns (uint256) { + if (number == 0) { + return 0; + } + uint256 length = 0; + while (number > 0) { + length++; + number >>= 1; + } + return length; + } + + function calculateArrayGindex(uint256 elementIndex) internal pure returns (uint256) { + uint256 gindex = 1; + uint256 depth = 0; + while ((1 << depth) < SLOTS_PER_HISTORICAL_ROOT) { + depth++; + } + + for (uint256 d = 0; d < depth; d++) { + gindex = (gindex << 1) | ((elementIndex >> (depth - d - 1)) & 1); + } + return gindex; + } + + function calculateIndex(uint256 gindex) internal pure returns (uint256 index) { + uint256 depth = floorLog2(gindex); + index = gindex % (2 ** depth); + } + + function floorLog2(uint256 x) internal pure returns (uint256) { + require(x > 0, "Input must be greater than zero"); + uint256 result = 0; + + while (x > 1) { + x >>= 1; + result++; + } + + return result; + } +} diff --git a/packages/evm/contracts/adapters/Spectre/mock/MockSpectre.sol b/packages/evm/contracts/adapters/Spectre/mock/MockSpectre.sol new file mode 100644 index 00000000..41ca1f21 --- /dev/null +++ b/packages/evm/contracts/adapters/Spectre/mock/MockSpectre.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity ^0.8.20; + +contract MockSpectre { + mapping(uint256 => bytes32) public blockHeaderRoots; + + function setRoot(uint256 slot, bytes32 root) external { + blockHeaderRoots[slot] = root; + } +} diff --git a/packages/evm/test/adapters/Spectre/01_SpectreAdapter.spec.ts b/packages/evm/test/adapters/Spectre/01_SpectreAdapter.spec.ts new file mode 100644 index 00000000..dbc11a70 --- /dev/null +++ b/packages/evm/test/adapters/Spectre/01_SpectreAdapter.spec.ts @@ -0,0 +1,205 @@ +import { expect } from "chai" +import { ethers, network } from "hardhat" + +const VALID_BLOCK_ROOT = "0x21778119263e321fc9e9ca5690d8d4a55dbd4947030fd14319877fe86ecb7de5" +const FINALIZED_SLOT = 5695360 +const ATTESTED_SLOT = 5695353 +const BLOCK_ROOT_PROOF = [ + "0xbb41fbe3b46fac981d3df3e8629e5e7310185a1f961aba376bcf96e1bd874e28", + "0x27cbd7708030e106676b683596e811e0bab22138cd7f6913a2bf3b63740daa1f", + "0x30e26d0ab55a378ffa3ed82e8aa8096eb3b6f4d02f858d6b30d0a13639414abc", + "0x69ac5f7d1fbca2197d57670e574e3e097a94e5756113c673f4e41fb7be05fc13", + "0xe9b42d876d7a422dc65f4394e339e3b9042ad40eb11f18c585e534bb3a47443d", + "0xfefb6d9f04304b533bf67fc11e53a34a08973448a33152613e7ef94f297360b4", + "0x57dcc8849c3f72f977e31447fd31899a7eff85c04c990ea78dec3bcb98b36802", + "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71", + "0x327f2adfa0f0f5c61e4cbcddacf5254d0e7648d30a64191b206f2c145b64bfd5", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b", + "0x878631e8ffef821741c28a205c570a9087c3c80b124b9be1f7284e66a821264e", + "0x6b0fdfedb1ebb1f2bfcab466d7ba1ff1c83330d2971bca48afd7167695cdd92f", + "0xc1412f29a954cd3f1be61a15c89ad4751bbf99ea5e6db9c230f630907a9bd02d", + "0x7aa2c58dc6265c1432df13be057481fb6e6a768748951040b226f520ac3db98f", + "0xc854071ad4c6627ea7cb962df282bb5f196ac0997412e69a5a8029765d0dd4dc", + "0x93ee1ce022111ab4b9963409a75427d4f222c56eb893a8a15cd08558b41f4bae", + "0xec9ec868b016b64ab18fd458176edb153a46f0c42a9e9f0166e24da8284151ba", + "0x28ce8c0c6f76c0ee6ff6a5e62d716e4d953a1864d60044a97af487eefdc77548", + "0x6662f6b95c932ba99a9773dca52cd94b79e2a22a6a094235c931ef2c1c1ebe98", + "0xf935f2f2b59ddfd994b3f2f113fe15b05f3e27bb31e9dda42af9848f654ab175", + "0x7965303298051020ff8cf76d7f0ad5e1d9fcf85a92e9df291cb7081243227bdd", + "0xe9fc6a23ead75b105541475f84f38a77bc15e73122d56d013c9ce78797d142d4", + "0x50ee4913ad51f139eacd4239481bfaa78e7cbe24b298b4108b901dcb92076ea0", + "0xa19e1d43afb1c9bb9044278b8fc626d493cb9eabca295fc449aa4cf992b9f847", + "0x2f630e4ee1785e0292af4667b5157b3e966a1e0b8bcad4a3df727bfd2268460a", + "0x5fbcd76ca37f9948be8c6311a5b6cc2a7090cdceaa7a27741bbd86eb4775ba46", + "0xae4b78ed6c0c6823750a22a6b0c2ae6397316eaa72d081f101c5f9e3d80eccca", + "0xb02c1c50b30dc30509964dfe3135b5605e687b35c61ae1ecd51807fe0f321c73", + "0x5168c522d5c2bb2637b8f43831bf78ad9c072f8cb10a6994b15de93e1c6c7054", + "0x80348cee4cd87fc19e81fc1ab0d99055fe51aba331dd10348fc6b3def42e1373", + "0x7dd3b024989ee3ba4d612a8038a465302dd9a9a230c259db7ec79a0d59d437e8", + "0x1802ea95218e92f7c59bb5da3adf73d4bab7efe723e100886262f2fedffa82a6", +] +const RECEIPT_ROOT = "0xd84fe72ebbc7d725297e7de74628a7b594a34997218d3eb0c94e2c88b49b679e" +const RECEIPT_PROOF = [ + "0xf90111a0d796d78912c8f7f0264489b41970b757d0de0dff0002c3836f92b204b23cfd0ca00a0d07f2d4c747362bc2fb76371bb29e5e96d4eaa42bb150e884fe16fab30bc6a0d0d0c5fd8815dffb371f9af7d8054e4371760235ec5a94ede508db83896f1dffa0efe5a66c883aa270bc79bf09ac6388caffb55ab7763588a47e3da4577bec67a2a094a9cc0f8266bb8385dc7e7670a6ef79ed18ecab0c04f74a1dd4d3038fae61bea0d1e4d7546d7870c9600285a645944480227b982be7533bc741524c0ffadc5e48a08c07352e2cd34dcddcb3977c8299854f4d39d54e6284bd37b2b0447bfce6e96780a0923f5cd8f74f85139f72eedf87d303d8066e2fd02f511671c172cc85084aae2c8080808080808080", + "0xf901f180a0719191dbc2edcbebf7a622644be3104422e7db547fd9a879121b2abfa0b34020a0a5406d11635972f187bc0888366448c5d441fddc6a7487d03e417a07d9df47bea0185e5ad44a8c439541239ac4ff0391c811d3c1909b61a519f4663e4bc813c169a0cb2b36f4f9e10767bb23b4cc02335a9bec669524a1acb529886812ebee475a95a083a8760b96414e915aa3112c3bd1be95ace88ac1ce544211686e04643d83f248a082cc986b27e1bb7daa57da34179b818696487cbcc7ee27a7bf28e14143be2ccea0bd1228e14c526ab7c6277ad68be512937f57fd72e87caf96329c59db729f9278a06343de45f16e4fea4598a69cbf8ed9172f2d1a435c3b1e5f463f81faa75e5bb3a0c116e535585bc8a92a3a3af3713cf502de809e644b72234a384d2768c01d4b9ba052ca43b677c29069a603c05707b03dc7f87cd3a52c8e5965a2fef9b11b66ce69a057917dd7b8ea46f06cd34cd1dce1940bf9b135ec3bb6e9c063b32633d40c7b78a01469d300559e5f0ac180235a556b02b545557690de90e1058e10fe0f0e6418b3a0850a54243d0d09ea0cd66bf942f2aba3e3a09998171f745a234a53b4a40d0954a08a3672065ed6c6dc656670ec06390998ae029544c1eae88f937a568bf46c2ce4a01d0af7637d3615b7d433d64a2eade9d2aca1626af411682a3e70c7ba308f46ca80", + "0xf9062820b90624f906210183091829b90100000000000000000000000d0008020001000000000000000000000000000000000000000000800000000000000000000020000000000000000000000100000000001000000000000010000000000000000000000000020000000000000000800000000000000000000000000000000200100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000010000000000000000000080000000000000000000000002000000000000040001000000000000200000000200400004000000000000200000080010000000000000000000000000000000000000000004000000040000080001000000000000f90516f9023c9421eab033c7d2df6a67aef6c5bda9a7f151eb9f52f842a0218247aabc759e65b5bb92ccc074f9d62cd187259f2a0984c3c9cf91f67ff7cfa0f17e52a0ade03ab5e2ceb4955f720c593b8094417e354c033b34db8afc5f806fb901e0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000009f900000000000000000000000000000000000000000000000000000000000027d80000000000000000000000000000000000000000000000000000000000000001000000000000000000000000ec62ae0516e9fd565d3084eed742b4f196356df2000000000000000000000000a86bc62ac53dc86687ab6c15fdebc71ad51fb615000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c6755144d60548f3dd420f47cf48dae553bbf04200000000000000000000000000000000000000000000000000000000000000010000000000000000000000003f5929bee6a59661d6ccc9c4eb751048009ce11bf8bc94c6755144d60548f3dd420f47cf48dae553bbf042f863a0d05d8e0013365e4d441d98e6459477af9dd142c5cf590e87ca927921993b6c62a000000000000000000000000000000000000000000000000000000000000027d8a0f17e52a0ade03ab5e2ceb4955f720c593b8094417e354c033b34db8afc5f806fb8400000000000000000000000003f5929bee6a59661d6ccc9c4eb751048009ce11ba319fa327c587841e94c1cbb3106de0a17067334e7243045a7f06a5940d749e6f901bc94f2546d6648bd2af6a008a7e7c1542bb240329e11f842a0482515ce3d9494a37ce83f18b72b363449458435fafdd7a53ddea7460fe01b58a0000500000735a05d7e98453b1abcedec7918072d3d6f5ec20000000000000f8fb9016000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000118000500000735a05d7e98453b1abcedec7918072d3d6f5ec20000000000000f8fc6755144d60548f3dd420f47cf48dae553bbf0423f5929bee6a59661d6ccc9c4eb751048009ce11b0007a120030200aa36a727d869f55903000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001f17e52a0ade03ab5e2ceb4955f720c593b8094417e354c033b34db8afc5f806f0000000000000000000000000000000000000000000000000000000000000001a319fa327c587841e94c1cbb3106de0a17067334e7243045a7f06a5940d749e60000000000000000f85894ec62ae0516e9fd565d3084eed742b4f196356df2e1a058b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b1525a00000000000000000000000000000000000000000000000000000000000000992", +] +const TX_INDEX = "0x05" +const LOG_INDEX = 0 + +const setup = async () => { + await network.provider.request({ method: "hardhat_reset", params: [] }) + const signers = await ethers.getSigners() + const admin = signers[0] + const yahoAddress = "0x21eAB033C7D2DF6A67AeF6C5Bda9A7F151eB9f52" + const sourceChainId = 11155111 + const EthereumTrieDB = await ethers.getContractFactory("EthereumTrieDB") + const ethereumTrieDB = await EthereumTrieDB.deploy() + const MerklePatricia = await ethers.getContractFactory("MerklePatricia", { + libraries: { + EthereumTrieDB: ethereumTrieDB.address, + }, + }) + const merklePatricia = await MerklePatricia.deploy() + const SpectreAdapter = await ethers.getContractFactory("SpectreAdapter", { + libraries: { + MerklePatricia: merklePatricia.address, + }, + }) + const MockSpectre = await ethers.getContractFactory("MockSpectre") + const spectre = await MockSpectre.deploy() + const spectreAdapter = await SpectreAdapter.deploy(spectre.address, sourceChainId, yahoAddress) + await spectreAdapter.deployed() + return { + admin, + yahoAddress, + sourceChainId, + spectre, + spectreAdapter, + } +} + +describe("SpectreAdapter", function () { + describe("Constructor", function () { + it("Successfully deploys contract with correct state", async function () { + const { spectre, sourceChainId, yahoAddress, spectreAdapter } = await setup() + + expect(await spectreAdapter.spectreAddress()).to.equal(spectre.address) + expect(await spectreAdapter.SOURCE_YAHO()).to.equal(yahoAddress) + expect(await spectreAdapter.SOURCE_CHAIN_ID()).to.equal(sourceChainId) + }) + }) + + describe("changeSpectreAddress()", function () { + it("Successfully changes address when admin address used", async function () { + const { spectreAdapter } = await setup() + const newAddress = "0x0b51633aE43BF1BaC0cf6149beC37096241C0Cf4" + + await spectreAdapter.changeSpectreAddress(newAddress) + + expect(await spectreAdapter.spectreAddress()).to.equal(newAddress) + }) + + it("Reverts when admin address not used", async function () { + let { spectreAdapter } = await setup() + const signers = await ethers.getSigners() + spectreAdapter = spectreAdapter.connect(signers[1]) + const newAddress = "0x0b51633aE43BF1BaC0cf6149beC37096241C0Cf4" + + await expect(spectreAdapter.changeSpectreAddress(newAddress)).to.be.revertedWithCustomError( + spectreAdapter, + "Unauthorized", + ) + }) + }) + + describe("verifyAndStoreDispatchedMessage()", function () { + it("Succesfully verifies a valid `MessageDispatched` event and stores hash", async function () { + const { spectreAdapter, spectre, sourceChainId } = await setup() + await spectre.setRoot(FINALIZED_SLOT, VALID_BLOCK_ROOT) + + const tx = await spectreAdapter.verifyAndStoreDispatchedMessage( + FINALIZED_SLOT, + ATTESTED_SLOT, + BLOCK_ROOT_PROOF, + RECEIPT_ROOT, + RECEIPT_PROOF, + TX_INDEX, + LOG_INDEX, + ) + + const expectedId = "109230589513832448651825219171321317961370859414947483691584271680487324352623" + const expectedHash = "0xa319fa327c587841e94c1cbb3106de0a17067334e7243045a7f06a5940d749e6" + await expect(tx).to.emit(spectreAdapter, "HashStored").withArgs(expectedId, expectedHash) + expect(await spectreAdapter.getHash(sourceChainId, expectedId)).to.equal(expectedHash) + }) + + it("Reverts with invalid block root", async function () { + const { spectreAdapter, spectre } = await setup() + await spectre.setRoot(FINALIZED_SLOT, "0x21787119263e321fc9e9ca5690d8d4a55dbd4947030fd14319877fe86ecb7de5") + + await expect( + spectreAdapter.verifyAndStoreDispatchedMessage( + FINALIZED_SLOT, + ATTESTED_SLOT, + BLOCK_ROOT_PROOF, + RECEIPT_ROOT, + RECEIPT_PROOF, + TX_INDEX, + LOG_INDEX, + ), + ).to.be.revertedWithCustomError(spectreAdapter, "InvalidReceiptsRoot") + }) + + it("Reverts when receipt root invalid", async function () { + const { spectreAdapter, spectre } = await setup() + await spectre.setRoot(FINALIZED_SLOT, VALID_BLOCK_ROOT) + + await expect( + spectreAdapter.verifyAndStoreDispatchedMessage( + FINALIZED_SLOT, + ATTESTED_SLOT, + BLOCK_ROOT_PROOF, + "0xd85fe72ebbc7d725297e7de74628a7b594a34997218d3eb0c94e2c88b49b679e", + RECEIPT_PROOF, + TX_INDEX, + LOG_INDEX, + ), + ).to.be.revertedWithCustomError(spectreAdapter, "InvalidReceiptsRoot") + }) + + it("Reverts when block root is missing", async function () { + const { spectreAdapter } = await setup() + + await expect( + spectreAdapter.verifyAndStoreDispatchedMessage( + FINALIZED_SLOT, + ATTESTED_SLOT, + BLOCK_ROOT_PROOF, + RECEIPT_ROOT, + RECEIPT_PROOF, + TX_INDEX, + LOG_INDEX, + ), + ).to.be.revertedWithCustomError(spectreAdapter, "BlockHeaderRootMissing") + }) + + it("Reverts when `MessageDispatched` signature is invalid", async function () { + const { spectreAdapter, spectre } = await setup() + await spectre.setRoot(FINALIZED_SLOT, VALID_BLOCK_ROOT) + + await expect( + spectreAdapter.verifyAndStoreDispatchedMessage( + FINALIZED_SLOT, + ATTESTED_SLOT, + BLOCK_ROOT_PROOF, + RECEIPT_ROOT, + RECEIPT_PROOF, + TX_INDEX, + 1, + ), + ).to.be.revertedWithCustomError(spectreAdapter, "InvalidEventSignature") + }) + }) +}) From 09a66b0a33f06f9b2bd3cf67d1c2cfe8defb07bf Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 22 Aug 2024 14:50:56 +0200 Subject: [PATCH 242/297] refactor(evm): refactors Merkle --- .../adapters/Electron/lib/Merkle.sol | 77 ++++++++++++++++--- 1 file changed, 65 insertions(+), 12 deletions(-) diff --git a/packages/evm/contracts/adapters/Electron/lib/Merkle.sol b/packages/evm/contracts/adapters/Electron/lib/Merkle.sol index 737f1c89..1d3970d7 100644 --- a/packages/evm/contracts/adapters/Electron/lib/Merkle.sol +++ b/packages/evm/contracts/adapters/Electron/lib/Merkle.sol @@ -36,25 +36,78 @@ library Merkle { ) internal pure returns (bool) { uint256 index; if (txSlot == lcSlot) { - index = 3 * (2 ** (5 + 4)) + 24 * (2 ** 4) + 3; + // BeaconBlock -> BeaconBody -> ExecutionPayload -> ReceiptsRoot + index = 6435; } else if (lcSlot - txSlot <= SLOTS_PER_HISTORICAL_ROOT) { - index = - 3 * - (2 ** (5 + 13 + 5 + 4)) + - 6 * - (2 ** (13 + 5 + 4)) + - (txSlot % SLOTS_PER_HISTORICAL_ROOT) * - (2 ** (5 + 4)) + - 24 * - (2 ** 4) + - 3; + uint256[] memory historicalRootGindexes = new uint256[](2); + historicalRootGindexes[0] = 37; + historicalRootGindexes[1] = calculateArrayGindex(txSlot % SLOTS_PER_HISTORICAL_ROOT); + uint256[] memory receiptGindexes = new uint256[](3); + receiptGindexes[0] = 11; + receiptGindexes[1] = concatGindices(historicalRootGindexes); + receiptGindexes[2] = 6435; + + // BeaconBlock -> BeaconState -> HistoricalRoots -> BeaconBlock -> BeaconBody -> ExecutionPayload -> ReceiptsRoot + index = concatGindices(receiptGindexes); } else if (lcSlot - txSlot > SLOTS_PER_HISTORICAL_ROOT) { revert("txSlot lags by >8192 blocks. Not supported."); } else { revert("txSlot can't be greater than lightclient slot"); } - bytes32 computedRoot = restoreMerkleRoot(receiptsRootBranch, receiptsRoot, index); + bytes32 computedRoot = restoreMerkleRoot(receiptsRootBranch, receiptsRoot, calculateIndex(index)); return computedRoot == headerRoot; } + + function concatGindices(uint256[] memory gindices) public pure returns (uint256) { + uint256 result = 1; // Start with binary "1" + for (uint i = 0; i < gindices.length; i++) { + uint256 gindex = gindices[i]; + uint256 gindexWithoutLeadingOne = gindex & ((1 << (bitLength(gindex) - 1)) - 1); + result = (result << (bitLength(gindex) - 1)) | gindexWithoutLeadingOne; + } + return result; + } + + function bitLength(uint256 number) internal pure returns (uint256) { + if (number == 0) { + return 0; + } + uint256 length = 0; + while (number > 0) { + length++; + number >>= 1; + } + return length; + } + + function calculateArrayGindex(uint256 elementIndex) internal pure returns (uint256) { + uint256 gindex = 1; + uint256 depth = 0; + while ((1 << depth) < SLOTS_PER_HISTORICAL_ROOT) { + depth++; + } + + for (uint256 d = 0; d < depth; d++) { + gindex = (gindex << 1) | ((elementIndex >> (depth - d - 1)) & 1); + } + return gindex; + } + + function calculateIndex(uint256 gindex) internal pure returns (uint256 index) { + uint256 depth = floorLog2(gindex); + index = gindex % (2 ** depth); + } + + function floorLog2(uint256 x) internal pure returns (uint256) { + require(x > 0, "Input must be greater than zero"); + uint256 result = 0; + + while (x > 1) { + x >>= 1; + result++; + } + + return result; + } } From c668622e0a77767ec7689b2f14a36194895ade60 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 22 Aug 2024 14:51:21 +0200 Subject: [PATCH 243/297] fix(evm): fixes dendreth deployment task --- .../evm/tasks/deploy/adapters/dendreth.ts | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/packages/evm/tasks/deploy/adapters/dendreth.ts b/packages/evm/tasks/deploy/adapters/dendreth.ts index 48b4ffe0..cb8d5855 100644 --- a/packages/evm/tasks/deploy/adapters/dendreth.ts +++ b/packages/evm/tasks/deploy/adapters/dendreth.ts @@ -6,16 +6,36 @@ import type { DendrETHAdapter } from "../../../types/contracts/adapters/DendrETH import type { DendrETHAdapter__factory } from "../../../types/factories/contracts/adapters/DendrETH/DendrETHAdapter__factory" import { verify } from "../index" +const MerklePatriciaAddresses = { + 10200: "0x777662E6A65411e0A425E59C496A7D1C0635A935", +} + task("deploy:adapter:DendrETHAdapter") - .addParam("sourceChainId", "Source chain id") .addParam("dendreth", "address of the DendrETH contract") + .addParam("sourceChainId", "Source chain id") + .addParam("sourceYaho", "address of the source Yaho contract") + .addFlag("verify", "whether to verify the contract on Etherscan") .setAction(async function (taskArguments: TaskArguments, hre) { - console.log("Deploying DendrETHAdapter...") const signers: SignerWithAddress[] = await hre.ethers.getSigners() + + console.log("Deploying DendrETHAdapter...") + const merklePatriciaAddress = MerklePatriciaAddresses[hre.network.config.chainId] + if (!merklePatriciaAddress) { + throw new Error("MerklePatricia Not Found") + } const dendrETHAdapterFactory: DendrETHAdapter__factory = ( - await hre.ethers.getContractFactory("DendrETHAdapter") + await hre.ethers.getContractFactory("DendrETHAdapter", { + libraries: { + MerklePatricia: merklePatriciaAddress, + }, + }) ) - const constructorArguments = [taskArguments.sourceChainId, taskArguments.dendreth] as const + const constructorArguments = [ + taskArguments.dendreth, + taskArguments.sourceChainId, + taskArguments.sourceYaho, + ] as const + const dendrETHAdapter: DendrETHAdapter = ( await dendrETHAdapterFactory.connect(signers[0]).deploy(...constructorArguments) ) From 129fd8bb4613562f447a3522e4856a94e9fe62b6 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Thu, 22 Aug 2024 14:53:08 +0200 Subject: [PATCH 244/297] refactor(evm): rm part of a comment --- packages/evm/contracts/adapters/DendrETH/DendrETHAdapter.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/evm/contracts/adapters/DendrETH/DendrETHAdapter.sol b/packages/evm/contracts/adapters/DendrETH/DendrETHAdapter.sol index 83f7acb6..a480cafb 100644 --- a/packages/evm/contracts/adapters/DendrETH/DendrETHAdapter.sol +++ b/packages/evm/contracts/adapters/DendrETH/DendrETHAdapter.sol @@ -9,7 +9,7 @@ import { BlockHashAdapter } from "../BlockHashAdapter.sol"; contract DendrETHAdapter is BlockHashAdapter { bytes32 internal constant MESSAGE_DISPATCHED_EVENT_SIG = - 0x218247aabc759e65b5bb92ccc074f9d62cd187259f2a0984c3c9cf91f67ff7cf; // keccak256("MessageDispatched(uint256,(uint256,uint256,uint256,address,address,bytes,address[],address[]))"); // keccak256("MessageDispatched(uint256,(uint256,uint256,uint256,address,address,bytes,address[],address[]))") + 0x218247aabc759e65b5bb92ccc074f9d62cd187259f2a0984c3c9cf91f67ff7cf; // keccak256("MessageDispatched(uint256,(uint256,uint256,uint256,address,address,bytes,address[],address[]))"); address public immutable DENDRETH_ADDRESS; address public immutable SOURCE_YAHO; From c6558b2c3b7061b8778c276db12570effc54ab93 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Sun, 25 Aug 2024 14:36:07 +0800 Subject: [PATCH 245/297] feat: dockerfile and docker compose for executor and relayer --- Dockerfile.executor | 30 ++++++++++++++++++++++++++ Dockerfile.relayer | 30 ++++++++++++++++++++++++++ docker-compose.yml | 38 +++++++++++++++++++++++++++++++++ packages/common/package.json | 4 ++-- packages/executor/package.json | 4 ++-- packages/executor/tsconfig.json | 20 ++++++++++++----- packages/relayer/tsconfig.json | 3 ++- 7 files changed, 119 insertions(+), 10 deletions(-) create mode 100644 Dockerfile.executor create mode 100644 Dockerfile.relayer create mode 100644 docker-compose.yml diff --git a/Dockerfile.executor b/Dockerfile.executor new file mode 100644 index 00000000..c3404b9f --- /dev/null +++ b/Dockerfile.executor @@ -0,0 +1,30 @@ +FROM node:18-alpine + +WORKDIR /usr/src/app +COPY package.json yarn.lock ./ + +COPY packages/common/package.json ./packages/common/ +COPY packages/executor/package.json ./packages/executor/ + +RUN yarn install --ignore-scripts + +WORKDIR /usr/src/app/packages/common +RUN yarn install --ignore-scripts + +WORKDIR /usr/src/app/packages/executor +RUN yarn install --ignore-scripts + +WORKDIR /usr/src/app + +COPY packages/common/ ./packages/common/ +COPY packages/executor/ ./packages/executor/ + +WORKDIR /usr/src/app/packages/common +RUN yarn compile + + + +WORKDIR /usr/src/app/packages/executor +RUN yarn compile + +CMD ["yarn", "start"] \ No newline at end of file diff --git a/Dockerfile.relayer b/Dockerfile.relayer new file mode 100644 index 00000000..f2d4479a --- /dev/null +++ b/Dockerfile.relayer @@ -0,0 +1,30 @@ +FROM node:18-alpine + +WORKDIR /usr/src/app +COPY package.json yarn.lock ./ + +COPY packages/common/package.json ./packages/common/ +COPY packages/relayer/package.json ./packages/relayer/ + +RUN yarn install --ignore-scripts + +WORKDIR /usr/src/app/packages/common +RUN yarn install --ignore-scripts + +WORKDIR /usr/src/app/packages/relayer +RUN yarn install --ignore-scripts + +WORKDIR /usr/src/app + +COPY packages/common/ ./packages/common/ +COPY packages/relayer/ ./packages/relayer/ + +WORKDIR /usr/src/app/packages/common +RUN yarn compile + + + +WORKDIR /usr/src/app/packages/relayer +RUN yarn compile + +CMD ["yarn", "start"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..f25ad892 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,38 @@ +version: "3.8" + +services: + mongodb: + image: mongo:latest + container_name: mongodb + ports: + - "27017:27017" + networks: + - mongo-network + volumes: -mongo-data:/data/db + + executor: + build: + context: . + dockerfile: Dockerfile.executor + container_name: executor + networks: + - mongo-network + depends_on: + - mongodb + + relayer: + build: + context: . + dockerfile: Dockerfile.relayer + container_name: relayer + networks: + - mongo-network + depends_on: + - mongodb +networks: + mongo-network: + driver: bridge + +volumes: + mongo-data: + driver: local diff --git a/packages/common/package.json b/packages/common/package.json index 8ce9e361..104f572f 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -17,8 +17,8 @@ "prettier:write": "prettier --write \"**/*.{js,json,md,sol,ts,yml}\"" }, "dependencies": { - "winston": "^3.11.0", - "viem": "^2.9.28" + "viem": "^2.9.28", + "winston": "^3.11.0" }, "devDependencies": { "@types/node": "^20.8.9", diff --git a/packages/executor/package.json b/packages/executor/package.json index 8af52a07..39e31722 100644 --- a/packages/executor/package.json +++ b/packages/executor/package.json @@ -12,14 +12,14 @@ "lint": "eslint --ignore-path ./.eslintignore --ext .js,.ts .", "prettier:check": "prettier --check \"**/*.{js,json,md,sol,ts,yml}\"", "prettier:write": "prettier --write \"**/*.{js,json,md,sol,ts,yml}\"", - "start": "ts-node --esm ./src/index.ts", + "start": "node --loader ts-node/esm ./src/index.ts", "start:dev": "nodemon" }, "dependencies": { "@gnosis/hashi-common": "0.1.0", "dotenv": "^16.3.1", "mongodb": "6.5.0", - "viem": "^2.9.28", + "viem": "2.20.0", "winston": "^3.11.0" }, "devDependencies": { diff --git a/packages/executor/tsconfig.json b/packages/executor/tsconfig.json index d69a137b..974c23aa 100644 --- a/packages/executor/tsconfig.json +++ b/packages/executor/tsconfig.json @@ -6,21 +6,31 @@ "esModuleInterop": true, "experimentalDecorators": true, "forceConsistentCasingInFileNames": true, - "lib": ["es6", "ESNext", "DOM"], + "lib": [ + "es6", + "ESNext", + "DOM" + ], "module": "ESNext", "moduleResolution": "node", "noImplicitAny": true, "outDir": "./dist", + "rootDir": "./src", "removeComments": true, "resolveJsonModule": true, "sourceMap": true, "strict": true, - "target": "ESNext" + "target": "ESNext", + "skipLibCheck": true, }, - "exclude": ["node_modules"], - "include": ["./src/**/*"], + "exclude": [ + "node_modules" + ], + "include": [ + "./src/**/*" + ], "ts-node": { "esm": true, "experimentalSpecifierResolution": "node" } -} +} \ No newline at end of file diff --git a/packages/relayer/tsconfig.json b/packages/relayer/tsconfig.json index d167b40a..652aa407 100644 --- a/packages/relayer/tsconfig.json +++ b/packages/relayer/tsconfig.json @@ -19,7 +19,8 @@ "resolveJsonModule": true, "sourceMap": true, "strict": true, - "target": "ESNext" + "target": "ESNext", + "skipLibCheck": true, }, "exclude": [ "node_modules" From 926ef27fee1e1aeb1f7ab35d26d9d979fdef4546 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Sun, 25 Aug 2024 15:28:21 +0800 Subject: [PATCH 246/297] fix: docker-compose format error --- docker-compose.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index f25ad892..5afb0136 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,7 +8,8 @@ services: - "27017:27017" networks: - mongo-network - volumes: -mongo-data:/data/db + volumes: + - mongo-data:/data/db executor: build: From b1517a23f9d7b401098eb167217ed857da6ea929 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Fri, 30 Aug 2024 16:50:35 +0800 Subject: [PATCH 247/297] fix: Executor messageIds type & relayer start script --- docker-compose.yml | 2 +- packages/executor/src/index.ts | 18 ++++++++++++------ packages/relayer/package.json | 2 +- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 5afb0136..80025ddb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,7 +25,7 @@ services: build: context: . dockerfile: Dockerfile.relayer - container_name: relayer + container_name: hashi-relayer networks: - mongo-network depends_on: diff --git a/packages/executor/src/index.ts b/packages/executor/src/index.ts index d5217b3a..668b89ae 100644 --- a/packages/executor/src/index.ts +++ b/packages/executor/src/index.ts @@ -1,8 +1,8 @@ -import 'dotenv/config' -import { createWalletClient, http, Chain, publicActions, Log } from "viem" +import "dotenv/config" +import { createWalletClient, http, Chain, publicActions, Log, createPublicClient } from "viem" import { privateKeyToAccount } from "viem/accounts" import * as chains from "viem/chains" -import { MongoClient} from "mongodb" +import { MongoClient } from "mongodb" import { adapterAbi, Batcher, logger, Message, Watcher, yahoAbi, yaruAbi } from "@gnosis/hashi-common" const mongoClient = new MongoClient(process.env.MONGO_DB_URI as string) @@ -12,13 +12,14 @@ const db = mongoClient.db("hashi") const sourceChain = Object.values(chains).find(({ id }) => id.toString() === (process.env.SOURCE_CHAIN_ID as string)) if (!sourceChain) throw new Error("Invalid SOURCE_CHAIN_ID") const targetChain = Object.values(chains).find(({ id }) => id.toString() === (process.env.TARGET_CHAIN_ID as string)) -if (!sourceChain) throw new Error("Invalid TARGET_CHAIN_ID") +if (!targetChain) throw new Error("Invalid TARGET_CHAIN_ID") const sourceClient = createWalletClient({ account: privateKeyToAccount(process.env.PK as `0x${string}`), chain: sourceChain as Chain | undefined, transport: http(process.env.SOURCE_RPC as string), }).extend(publicActions) + const targetClient = createWalletClient({ account: privateKeyToAccount(process.env.PK as `0x${string}`), chain: targetChain as Chain | undefined, @@ -37,7 +38,11 @@ const watchers = adapters.map( service: `ExecutorWatcher:${_adapter.slice(0, 6)}${_adapter.slice(_adapter.length - 4, _adapter.length)}`, watchIntervalTimeMs: Number(process.env.WATCH_INTERVAL_TIME_MS as string), onLogs: async (_logs: Log[]) => { - const messageIds = _logs.map((_log) => _log.topics[1]) + const messageIds = _logs + .map((_log) => _log.topics[1]) + .filter((id): id is `0x${string}` => id !== undefined) // Filter out undefined values + .map((id) => BigInt(id)) // Convert each string to bigint + // NOTE: without setting fromBlock and toBlock, it's not possible to getContractEvents const blockNumber = await sourceClient.getBlockNumber() const messageDispatchedLogs = await sourceClient.getContractEvents({ @@ -49,8 +54,9 @@ const watchers = adapters.map( }, fromBlock: blockNumber - BigInt(process.env.BLOCKS_WINDOW as string), toBlock: blockNumber, + strict: true, }) - + logger.info(`Found corresponding ${messageDispatchedLogs.length} message dispatch logs`) const messages = messageDispatchedLogs.map((_log) => Message.fromLog(_log)) for (const message of messages) { const hashStoredLog = _logs.find((_log) => _log.topics[1] === message.id) as Log diff --git a/packages/relayer/package.json b/packages/relayer/package.json index 33ab6a51..fbc166b2 100644 --- a/packages/relayer/package.json +++ b/packages/relayer/package.json @@ -12,7 +12,7 @@ "lint": "eslint --ignore-path ./.eslintignore --ext .js,.ts .", "prettier:check": "prettier --check \"**/*.{js,json,md,sol,ts,yml}\"", "prettier:write": "prettier --write \"**/*.{js,json,md,sol,ts,yml}\"", - "start": "ts-node --esm ./src/index.ts", + "start": "node --loader ts-node/esm ./src/index.ts", "start:dev": "nodemon" }, "dependencies": { From 2797d116f4f50a3c358dbf6456be3a08f3d3d935 Mon Sep 17 00:00:00 2001 From: Seun Lanlege Date: Thu, 12 Sep 2024 13:23:12 +0000 Subject: [PATCH 248/297] add Hyperbridge adapter & reporter --- .../Hyperbridge/HyperbridgeAdapter.sol | 35 ++++++++++++++ .../Hyperbridge/HyperbridgeReporter.sol | 48 +++++++++++++++++++ yarn.lock | 35 ++++++++++++++ 3 files changed, 118 insertions(+) create mode 100644 packages/evm/contracts/adapters/Hyperbridge/HyperbridgeAdapter.sol create mode 100644 packages/evm/contracts/adapters/Hyperbridge/HyperbridgeReporter.sol diff --git a/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeAdapter.sol b/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeAdapter.sol new file mode 100644 index 00000000..0e7d3d58 --- /dev/null +++ b/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeAdapter.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity ^0.8.20; + +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; +import { BlockHashAdapter } from "../BlockHashAdapter.sol"; +import { BaseIsmpModule } from "@polytope-labs/ismp-solidity/interfaces/IIsmpModule.sol"; +import { StateMachine } from "@polytope-labs/ismp-solidity/interfaces/StateMachine.sol"; + +contract HyperbridgeAdapter is BlockHashAdapter, Ownable, BaseIsmpModule { + mapping(uint32 => bytes32) public enabledReporters; + mapping(uint32 => uint256) public chainIds; + + error UnauthorizedRequest(); + + event ReporterSet(uint256 indexed chainId, uint16 indexed chainId, address indexed reporter); + + function setReporterByChain(uint256 chainId, uint16 chainId, address reporter) external onlyOwner { + bytes32 stateMachineId = keccak256(StateMachine.evm(chainId)); + enabledReportersPaths[stateMachineId] = keccak256(reporter); + chainIds[stateMachineId] = chainId; + emit ReporterSet(chainId, chainId, reporter); + } + + /// Process incoming blockhashes + function onAccept( + IncomingPostRequest calldata incoming + ) external override onlyHost { + bytes32 stateMachineId = keccak256(incoming.request.source); + if (enabledReportersPaths[stateMachineId] != keccak256(incoming.request.from)) + revert UnauthorizedRequest(); + uint256 sourceChainId = chainIds[stateMachineId]; + (uint256[] memory ids, bytes32[] memory hashes) = abi.decode(payload, (uint256[], bytes32[])); + _storeHashes(sourceChainId, ids, hashes); + } +} diff --git a/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeReporter.sol b/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeReporter.sol new file mode 100644 index 00000000..baa5a5cc --- /dev/null +++ b/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeReporter.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity ^0.8.20; + +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { Reporter } from "../Reporter.sol"; + +import { StateMachine } from "@polytope-labs/ismp-solidity/interfaces/StateMachine.sol"; +import { BaseIsmpModule } from "@polytope-labs/ismp-solidity/interfaces/IIsmpModule.sol"; +import { IDispatcher, DispatchPost } from "@polytope-labs/ismp-solidity/interfaces/IDispatcher.sol"; + +contract HyperbridgeReporter is Reporter, Ownable, BaseIsmpModule { + string public constant PROVIDER = "hyperbridge"; + + constructor() { + address host = host(); + address feeToken = IDispatcher(host).feeToken(); + // approve the host to spend infinitely + IERC20(feeToken).approve(host, type(uint256).max); + } + + function _dispatch( + uint256 targetChainId, + address adapter, + uint256[] memory ids, + bytes32[] memory hashes + ) internal override returns (bytes32) { + bytes memory payload = abi.encode(ids, hashes); + DispatchPost memory post = DispatchPost({ + // recipient chain + dest: StateMachine.evm(targetChainId), + // recipient contract + to: abi.encode(adapter), + // serialized message + body: payload, + // no timeouts + timeout: 0, + // todo: relayer fee for delivery. self-relay also supported + fee: 0, + // who gets the relayer fee refunds in the case of a timeout? + payer: address(this) + }); + + // dispatch cross-chain message, returns request Id + // without msg.value payments are collected in stablecoins + return IDispatcher(host()).dispatch(post); + } +} diff --git a/yarn.lock b/yarn.lock index 5f63e9d4..be4904b8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1302,11 +1302,28 @@ resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.3.3.tgz#ff6ee919fc2a1abaf72b22814bfb72ed129ec137" integrity sha512-tDBopO1c98Yk7Cv/PZlHqrvtVjlgK5R4J6jxLwoO7qxK4xqOiZG+zSkIvGFpPZ0ikc3QOED3plgdqjgNTnBc7g== +"@polytope-labs/ismp-solidity@^0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@polytope-labs/ismp-solidity/-/ismp-solidity-0.6.1.tgz#040cfd8362475d6a513fd7b05f7992450df4947f" + integrity sha512-IUIej203J/sKgPJswkiUitfiPqUtJlg3ZAdDjB9LyelwbFr8ZBuRBNSZtu3FbLMSC5N7/l4e/LY5+MiC3VtXRQ== + dependencies: + "@polytope-labs/solidity-merkle-trees" "^0.2.3" + openzeppelin-solidity "^4.8.1" + prettier "^3.3.3" + prettier-plugin-solidity "^1.3.1" + "@polytope-labs/solidity-merkle-trees@0.2.1": version "0.2.1" resolved "https://registry.yarnpkg.com/@polytope-labs/solidity-merkle-trees/-/solidity-merkle-trees-0.2.1.tgz#7c3399c071ee246df92f37b8cebc9f545a915917" integrity sha512-aoJbZXWgIDgvwWEXQL3cEqFAXdTzaOxo3r373LMOtm8W/v9RnRNVW/gplWQGVZs+tvdwGP9Sp6ToKknIIPwQ5g== +"@polytope-labs/solidity-merkle-trees@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@polytope-labs/solidity-merkle-trees/-/solidity-merkle-trees-0.2.3.tgz#d8346c14190cf41574c20a34b333e26465932622" + integrity sha512-aUcUjVNX0CXJNk7pS0jpqbfhi3w9VUI21/3IyTOblw0iAmctkUGq5TDwQBR7zXZnuTxpXbBPPEuXW1uhI2BHDA== + dependencies: + openzeppelin-solidity "^4.8.1" + "@routerprotocol/evm-gateway-contracts@1.1.13": version "1.1.13" resolved "https://registry.yarnpkg.com/@routerprotocol/evm-gateway-contracts/-/evm-gateway-contracts-1.1.13.tgz#609cd2a0cbcdb92e9a55fcdcb5cba0cc62fc11a7" @@ -5484,6 +5501,11 @@ open@^7.4.2: is-docker "^2.0.0" is-wsl "^2.1.1" +openzeppelin-solidity@^4.8.1: + version "4.8.1" + resolved "https://registry.yarnpkg.com/openzeppelin-solidity/-/openzeppelin-solidity-4.8.1.tgz#2ab492a5a53a5520401e94df36e43807de7a3b50" + integrity sha512-KM0pVpfrCBdifqN2ZeJZFvFuoGz3GmI4Ty/ceKNkcaf7VVWo/rLOfc5EiLh+Ukb5NadNmYo8WMeGhFA8hVWDpg== + optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" @@ -5747,6 +5769,14 @@ prettier-plugin-solidity@^1.0.0: semver "^7.5.4" solidity-comments-extractor "^0.0.8" +prettier-plugin-solidity@^1.3.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.4.1.tgz#8060baf18853a9e34d2e09e47e87b4f19e15afe9" + integrity sha512-Mq8EtfacVZ/0+uDKTtHZGW3Aa7vEbX/BNx63hmVg6YTiTXSiuKP0amj0G6pGwjmLaOfymWh3QgXEZkjQbU8QRg== + dependencies: + "@solidity-parser/parser" "^0.18.0" + semver "^7.5.4" + prettier@^2.1.2, prettier@^2.3.1, prettier@^2.8.3, prettier@^2.8.7: version "2.8.8" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" @@ -5757,6 +5787,11 @@ prettier@^3.0.3: resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== +prettier@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" + integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== + 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" From fc9f2e13be901ce15d89149a6d10392d2ecd3fde Mon Sep 17 00:00:00 2001 From: Seun Lanlege Date: Thu, 12 Sep 2024 15:49:53 +0000 Subject: [PATCH 249/297] remove todos --- .../evm/contracts/adapters/Hyperbridge/HyperbridgeAdapter.sol | 2 +- .../contracts/adapters/Hyperbridge/HyperbridgeReporter.sol | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeAdapter.sol b/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeAdapter.sol index 0e7d3d58..5461c7c3 100644 --- a/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeAdapter.sol +++ b/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeAdapter.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { BlockHashAdapter } from "../BlockHashAdapter.sol"; -import { BaseIsmpModule } from "@polytope-labs/ismp-solidity/interfaces/IIsmpModule.sol"; +import { BaseIsmpModule, IncomingPostRequest } from "@polytope-labs/ismp-solidity/interfaces/IIsmpModule.sol"; import { StateMachine } from "@polytope-labs/ismp-solidity/interfaces/StateMachine.sol"; contract HyperbridgeAdapter is BlockHashAdapter, Ownable, BaseIsmpModule { diff --git a/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeReporter.sol b/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeReporter.sol index baa5a5cc..4f0eeaec 100644 --- a/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeReporter.sol +++ b/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeReporter.sol @@ -35,9 +35,9 @@ contract HyperbridgeReporter is Reporter, Ownable, BaseIsmpModule { body: payload, // no timeouts timeout: 0, - // todo: relayer fee for delivery. self-relay also supported + // requests will be self-relayed fee: 0, - // who gets the relayer fee refunds in the case of a timeout? + // relayer fee refunds payer: address(this) }); From de789a167b918a06d6cb0d46f820fd8dc85812c5 Mon Sep 17 00:00:00 2001 From: Seun Lanlege Date: Thu, 12 Sep 2024 16:29:34 +0000 Subject: [PATCH 250/297] fix setReporterByChain & comment --- .../contracts/adapters/Hyperbridge/HyperbridgeAdapter.sol | 6 +++--- .../contracts/adapters/Hyperbridge/HyperbridgeReporter.sol | 3 +-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeAdapter.sol b/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeAdapter.sol index 5461c7c3..c876eb90 100644 --- a/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeAdapter.sol +++ b/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeAdapter.sol @@ -12,16 +12,16 @@ contract HyperbridgeAdapter is BlockHashAdapter, Ownable, BaseIsmpModule { error UnauthorizedRequest(); - event ReporterSet(uint256 indexed chainId, uint16 indexed chainId, address indexed reporter); + event ReporterSet(uint256 indexed chainId, address indexed reporter); - function setReporterByChain(uint256 chainId, uint16 chainId, address reporter) external onlyOwner { + function setReporterByChain(uint256 chainId, address reporter) external onlyOwner { bytes32 stateMachineId = keccak256(StateMachine.evm(chainId)); enabledReportersPaths[stateMachineId] = keccak256(reporter); chainIds[stateMachineId] = chainId; emit ReporterSet(chainId, chainId, reporter); } - /// Process incoming blockhashes + /// Process incoming requests function onAccept( IncomingPostRequest calldata incoming ) external override onlyHost { diff --git a/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeReporter.sol b/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeReporter.sol index 4f0eeaec..c2e57706 100644 --- a/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeReporter.sol +++ b/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeReporter.sol @@ -41,8 +41,7 @@ contract HyperbridgeReporter is Reporter, Ownable, BaseIsmpModule { payer: address(this) }); - // dispatch cross-chain message, returns request Id - // without msg.value payments are collected in stablecoins + // dispatch cross-chain message, returns request id return IDispatcher(host()).dispatch(post); } } From 50cb8e25a30f639d3fefa02068e0fad0e505a646 Mon Sep 17 00:00:00 2001 From: Seun Lanlege Date: Fri, 13 Sep 2024 09:55:37 +0000 Subject: [PATCH 251/297] feat(chore): add deployment task --- .../Hyperbridge/HyperbridgeAdapter.sol | 17 +- .../Hyperbridge/HyperbridgeReporter.sol | 10 +- packages/evm/package.json | 3 +- .../evm/tasks/deploy/adapters/hyperbridge.ts | 45 + ...ope-labs+solidity-merkle-trees+0.2.1.patch | 13 - yarn.lock | 17775 +++++++++------- 6 files changed, 10543 insertions(+), 7320 deletions(-) create mode 100644 packages/evm/tasks/deploy/adapters/hyperbridge.ts delete mode 100644 patches/@polytope-labs+solidity-merkle-trees+0.2.1.patch diff --git a/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeAdapter.sol b/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeAdapter.sol index c876eb90..0b77e520 100644 --- a/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeAdapter.sol +++ b/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeAdapter.sol @@ -7,8 +7,8 @@ import { BaseIsmpModule, IncomingPostRequest } from "@polytope-labs/ismp-solidit import { StateMachine } from "@polytope-labs/ismp-solidity/interfaces/StateMachine.sol"; contract HyperbridgeAdapter is BlockHashAdapter, Ownable, BaseIsmpModule { - mapping(uint32 => bytes32) public enabledReporters; - mapping(uint32 => uint256) public chainIds; + mapping(bytes32 => bytes32) public enabledReporters; + mapping(bytes32 => uint256) public chainIds; error UnauthorizedRequest(); @@ -16,20 +16,17 @@ contract HyperbridgeAdapter is BlockHashAdapter, Ownable, BaseIsmpModule { function setReporterByChain(uint256 chainId, address reporter) external onlyOwner { bytes32 stateMachineId = keccak256(StateMachine.evm(chainId)); - enabledReportersPaths[stateMachineId] = keccak256(reporter); + enabledReporters[stateMachineId] = keccak256(abi.encodePacked(reporter)); chainIds[stateMachineId] = chainId; - emit ReporterSet(chainId, chainId, reporter); + emit ReporterSet(chainId, reporter); } /// Process incoming requests - function onAccept( - IncomingPostRequest calldata incoming - ) external override onlyHost { + function onAccept(IncomingPostRequest calldata incoming) external override onlyHost { bytes32 stateMachineId = keccak256(incoming.request.source); - if (enabledReportersPaths[stateMachineId] != keccak256(incoming.request.from)) - revert UnauthorizedRequest(); + if (enabledReporters[stateMachineId] != keccak256(incoming.request.from)) revert UnauthorizedRequest(); uint256 sourceChainId = chainIds[stateMachineId]; - (uint256[] memory ids, bytes32[] memory hashes) = abi.decode(payload, (uint256[], bytes32[])); + (uint256[] memory ids, bytes32[] memory hashes) = abi.decode(incoming.request.body, (uint256[], bytes32[])); _storeHashes(sourceChainId, ids, hashes); } } diff --git a/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeReporter.sol b/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeReporter.sol index c2e57706..1d018a1d 100644 --- a/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeReporter.sol +++ b/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeReporter.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { Reporter } from "../Reporter.sol"; import { StateMachine } from "@polytope-labs/ismp-solidity/interfaces/StateMachine.sol"; @@ -12,7 +12,7 @@ import { IDispatcher, DispatchPost } from "@polytope-labs/ismp-solidity/interfac contract HyperbridgeReporter is Reporter, Ownable, BaseIsmpModule { string public constant PROVIDER = "hyperbridge"; - constructor() { + constructor(address headerStorage, address yaho) Reporter(headerStorage, yaho) { address host = host(); address feeToken = IDispatcher(host).feeToken(); // approve the host to spend infinitely @@ -30,14 +30,14 @@ contract HyperbridgeReporter is Reporter, Ownable, BaseIsmpModule { // recipient chain dest: StateMachine.evm(targetChainId), // recipient contract - to: abi.encode(adapter), + to: abi.encodePacked(adapter), // serialized message body: payload, // no timeouts timeout: 0, // requests will be self-relayed - fee: 0, - // relayer fee refunds + fee: 0, + // relayer fee refunds payer: address(this) }); diff --git a/packages/evm/package.json b/packages/evm/package.json index 5a7ec34b..67631b35 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -95,7 +95,8 @@ "@connext/interfaces": "2.0.0", "@hyperlane-xyz/core": "3.1.10", "@openzeppelin/contracts-upgradeable": "4.8.1", - "@polytope-labs/solidity-merkle-trees": "0.2.1", + "@polytope-labs/ismp-solidity": "^0.6.4", + "@polytope-labs/solidity-merkle-trees": "0.3.2", "@routerprotocol/evm-gateway-contracts": "1.1.13", "solidity-rlp": "2.0.8" } diff --git a/packages/evm/tasks/deploy/adapters/hyperbridge.ts b/packages/evm/tasks/deploy/adapters/hyperbridge.ts new file mode 100644 index 00000000..903caed2 --- /dev/null +++ b/packages/evm/tasks/deploy/adapters/hyperbridge.ts @@ -0,0 +1,45 @@ +import type { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers" +import { task } from "hardhat/config" +import type { TaskArguments } from "hardhat/types" + +import type { HyperbridgeAdapter } from "../../../types/contracts/adapters/Hyperbridge/HyperbridgeAdapter" +import type { HyperbridgeReporter } from "../../../types/contracts/adapters/Hyperbridge/HyperbridgeReporter" +import type { HyperbridgeAdapter__factory } from "../../../types/factories/contracts/adapters/Hyperbridge/HyperbridgeAdapter__factory" +import type { HyperbridgeReporter__factory } from "../../../types/factories/contracts/adapters/Hyperbridge/HyperbridgeReporter__factory" +import { verify } from "../index" + +task("deploy:HyperbridgeAdapter") + .addFlag("verify", "whether to verify the contract on Etherscan") + .setAction(async function (taskArguments: TaskArguments, hre) { + console.log("Deploying HyperbridgeAdapter...") + const signers: SignerWithAddress[] = await hre.ethers.getSigners() + const HyperbridgeAdapterFactory: HyperbridgeAdapter__factory = ( + await hre.ethers.getContractFactory("HyperbridgeAdapter") + ) + const constructorArguments = [] as const + const HyperbridgeAdapter: HyperbridgeAdapter = ( + await HyperbridgeAdapterFactory.connect(signers[0]).deploy(...constructorArguments) + ) + await HyperbridgeAdapter.deployed() + console.log("HyperbridgeAdapter deployed to:", HyperbridgeAdapter.address) + if (taskArguments.verify) await verify(hre, HyperbridgeAdapter, constructorArguments) + }) + +task("deploy:HyperbridgeReporter") + .addParam("headerStorage", "address of the header storage contract") + .addParam("yaho", "address of the Yaho contract") + .addFlag("verify", "whether to verify the contract on Etherscan") + .setAction(async function (taskArguments: TaskArguments, hre) { + console.log("Deploying HyperbridgeReporter...") + const signers: SignerWithAddress[] = await hre.ethers.getSigners() + const HyperbridgeReporterFactory: HyperbridgeReporter__factory = ( + await hre.ethers.getContractFactory("HyperbridgeReporter") + ) + const constructorArguments = [taskArguments.headerStorage, taskArguments.yaho] as const + const HyperbridgeReporter: HyperbridgeReporter = ( + await HyperbridgeReporterFactory.connect(signers[0]).deploy(...constructorArguments) + ) + await HyperbridgeReporter.deployed() + console.log("HyperbridgeReporter deployed to:", HyperbridgeReporter.address) + if (taskArguments.verify) await verify(hre, HyperbridgeReporter, constructorArguments) + }) diff --git a/patches/@polytope-labs+solidity-merkle-trees+0.2.1.patch b/patches/@polytope-labs+solidity-merkle-trees+0.2.1.patch deleted file mode 100644 index 43ca06f4..00000000 --- a/patches/@polytope-labs+solidity-merkle-trees+0.2.1.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/node_modules/@polytope-labs/solidity-merkle-trees/src/trie/substrate/SubstrateTrieDB.sol b/node_modules/@polytope-labs/solidity-merkle-trees/src/trie/substrate/SubstrateTrieDB.sol -index 40b7397..6eb68b1 100644 ---- a/node_modules/@polytope-labs/solidity-merkle-trees/src/trie/substrate/SubstrateTrieDB.sol -+++ b/node_modules/@polytope-labs/solidity-merkle-trees/src/trie/substrate/SubstrateTrieDB.sol -@@ -5,7 +5,7 @@ import "../Bytes.sol"; - import {NibbleSliceOps} from "../NibbleSlice.sol"; - - import {ScaleCodec} from "./ScaleCodec.sol"; --import "openzeppelin/utils/Strings.sol"; -+import "@openzeppelin/contracts/utils/Strings.sol"; - - // SPDX-License-Identifier: Apache2 - diff --git a/yarn.lock b/yarn.lock index be4904b8..2438ed9a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,7295 +1,10488 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@adraffy/ens-normalize@1.10.0": - version "1.10.0" - resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz#d2a39395c587e092d77cbbc80acf956a54f38bf7" - integrity sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q== - -"@axelar-network/axelar-gmp-sdk-solidity@5.6.2": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@axelar-network/axelar-gmp-sdk-solidity/-/axelar-gmp-sdk-solidity-5.6.2.tgz#9a48a5ef7f00490898d8d33e0756b35416069fd2" - integrity sha512-lJT1Sily/to5jZHkE3rGtkb8qnurNTFnlz4HwbQec+MtqVgPkY3/SsiPTw7967hmZavAw02eiE1jFSW7XKksZQ== - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5": - 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/generator@7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.7.tgz#8da2599beb4a86194a3b24df6c085931d9ee45ad" - integrity sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w== - dependencies: - "@babel/types" "^7.17.0" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/generator@^7.23.0": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.4.tgz#1fc55532b88adf952025d5d2d1e71f946cb1c498" - integrity sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw== - dependencies: - "@babel/types" "^7.24.0" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^2.5.1" - -"@babel/helper-environment-visitor@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== - -"@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-string-parser@^7.23.4": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" - integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== - -"@babel/helper-validator-identifier@^7.16.7", "@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" - -"@babel/parser@^7.20.5", "@babel/parser@^7.23.0", "@babel/parser@^7.24.0": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.4.tgz#234487a110d89ad5a3ed4a8a566c36b9453e8c88" - integrity sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg== - -"@babel/runtime@^7.17.2", "@babel/runtime@^7.23.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" - integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/template@^7.22.15": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" - integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== - dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/parser" "^7.24.0" - "@babel/types" "^7.24.0" - -"@babel/traverse@7.23.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" - integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.0" - "@babel/types" "^7.23.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@7.17.0": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" - integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - to-fast-properties "^2.0.0" - -"@babel/types@^7.17.0", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" - integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== - dependencies: - "@babel/helper-string-parser" "^7.23.4" - "@babel/helper-validator-identifier" "^7.22.20" - to-fast-properties "^2.0.0" - -"@chainlink/contracts-ccip@0.7.6": - version "0.7.6" - resolved "https://registry.yarnpkg.com/@chainlink/contracts-ccip/-/contracts-ccip-0.7.6.tgz#5bf4568a0bbf4e29d2e8c32348e5ecc6ced006d2" - integrity sha512-yNbCBFpLs3R+ALymto9dQYKz3vatnjqYGu1pnMD0i2fHEMthiXe0+otaNCGNht6n8k7ruNaA0DNpz3F+2jHQXw== - dependencies: - "@eth-optimism/contracts" "^0.5.21" - "@openzeppelin/contracts" "~4.3.3" - "@openzeppelin/contracts-upgradeable-4.7.3" "npm:@openzeppelin/contracts-upgradeable@v4.7.3" - "@openzeppelin/contracts-v0.7" "npm:@openzeppelin/contracts@v3.4.2" - -"@chainsafe/as-sha256@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz#3639df0e1435cab03f4d9870cc3ac079e57a6fc9" - integrity sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg== - -"@chainsafe/persistent-merkle-tree@^0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz#4c9ee80cc57cd3be7208d98c40014ad38f36f7ff" - integrity sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ== - dependencies: - "@chainsafe/as-sha256" "^0.3.1" - -"@chainsafe/persistent-merkle-tree@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz#2b4a62c9489a5739dedd197250d8d2f5427e9f63" - integrity sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw== - dependencies: - "@chainsafe/as-sha256" "^0.3.1" - -"@chainsafe/ssz@^0.10.0": - version "0.10.2" - resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.10.2.tgz#c782929e1bb25fec66ba72e75934b31fd087579e" - integrity sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg== - dependencies: - "@chainsafe/as-sha256" "^0.3.1" - "@chainsafe/persistent-merkle-tree" "^0.5.0" - -"@chainsafe/ssz@^0.9.2": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.9.4.tgz#696a8db46d6975b600f8309ad3a12f7c0e310497" - integrity sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ== - dependencies: - "@chainsafe/as-sha256" "^0.3.1" - "@chainsafe/persistent-merkle-tree" "^0.4.2" - case "^1.6.3" - -"@colors/colors@1.6.0", "@colors/colors@^1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" - integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== - -"@commitlint/cli@^17.3.0", "@commitlint/cli@^17.5.1": - version "17.8.1" - resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-17.8.1.tgz#10492114a022c91dcfb1d84dac773abb3db76d33" - integrity sha512-ay+WbzQesE0Rv4EQKfNbSMiJJ12KdKTDzIt0tcK4k11FdsWmtwP0Kp1NWMOUswfIWo6Eb7p7Ln721Nx9FLNBjg== - dependencies: - "@commitlint/format" "^17.8.1" - "@commitlint/lint" "^17.8.1" - "@commitlint/load" "^17.8.1" - "@commitlint/read" "^17.8.1" - "@commitlint/types" "^17.8.1" - execa "^5.0.0" - lodash.isfunction "^3.0.9" - resolve-from "5.0.0" - resolve-global "1.0.0" - yargs "^17.0.0" - -"@commitlint/config-conventional@^17.3.0", "@commitlint/config-conventional@^17.4.4": - version "17.8.1" - resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-17.8.1.tgz#e5bcf0cfec8da7ac50bc04dc92e0a4ea74964ce0" - integrity sha512-NxCOHx1kgneig3VLauWJcDWS40DVjg7nKOpBEEK9E5fjJpQqLCilcnKkIIjdBH98kEO1q3NpE5NSrZ2kl/QGJg== - dependencies: - conventional-changelog-conventionalcommits "^6.1.0" - -"@commitlint/config-validator@^17.8.1": - version "17.8.1" - resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-17.8.1.tgz#5cc93b6b49d5524c9cc345a60e5bf74bcca2b7f9" - integrity sha512-UUgUC+sNiiMwkyiuIFR7JG2cfd9t/7MV8VB4TZ+q02ZFkHoduUS4tJGsCBWvBOGD9Btev6IecPMvlWUfJorkEA== - dependencies: - "@commitlint/types" "^17.8.1" - ajv "^8.11.0" - -"@commitlint/config-validator@^19.0.3": - version "19.0.3" - resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-19.0.3.tgz#052b181a30da6b4fc16dc5230f4589ac95e0bc81" - integrity sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q== - dependencies: - "@commitlint/types" "^19.0.3" - ajv "^8.11.0" - -"@commitlint/ensure@^17.8.1": - version "17.8.1" - resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-17.8.1.tgz#59183557844999dbb6aab6d03629a3d104d01a8d" - integrity sha512-xjafwKxid8s1K23NFpL8JNo6JnY/ysetKo8kegVM7c8vs+kWLP8VrQq+NbhgVlmCojhEDbzQKp4eRXSjVOGsow== - dependencies: - "@commitlint/types" "^17.8.1" - lodash.camelcase "^4.3.0" - lodash.kebabcase "^4.1.1" - lodash.snakecase "^4.1.1" - lodash.startcase "^4.4.0" - lodash.upperfirst "^4.3.1" - -"@commitlint/execute-rule@^17.8.1": - version "17.8.1" - resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-17.8.1.tgz#504ed69eb61044eeb84fdfd10cc18f0dab14f34c" - integrity sha512-JHVupQeSdNI6xzA9SqMF+p/JjrHTcrJdI02PwesQIDCIGUrv04hicJgCcws5nzaoZbROapPs0s6zeVHoxpMwFQ== - -"@commitlint/execute-rule@^19.0.0": - version "19.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-19.0.0.tgz#928fb239ae8deec82a6e3b05ec9cfe20afa83856" - integrity sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw== - -"@commitlint/format@^17.8.1": - version "17.8.1" - resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-17.8.1.tgz#6108bb6b4408e711006680649927e1b559bdc5f8" - integrity sha512-f3oMTyZ84M9ht7fb93wbCKmWxO5/kKSbwuYvS867duVomoOsgrgljkGGIztmT/srZnaiGbaK8+Wf8Ik2tSr5eg== - dependencies: - "@commitlint/types" "^17.8.1" - chalk "^4.1.0" - -"@commitlint/is-ignored@^17.8.1": - version "17.8.1" - resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-17.8.1.tgz#cf25bcd8409c79684b63f8bdeb35df48edda244e" - integrity sha512-UshMi4Ltb4ZlNn4F7WtSEugFDZmctzFpmbqvpyxD3la510J+PLcnyhf9chs7EryaRFJMdAKwsEKfNK0jL/QM4g== - dependencies: - "@commitlint/types" "^17.8.1" - semver "7.5.4" - -"@commitlint/lint@^17.8.1": - version "17.8.1" - resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-17.8.1.tgz#bfc21215f6b18d41d4d43e2aa3cb79a5d7726cd8" - integrity sha512-aQUlwIR1/VMv2D4GXSk7PfL5hIaFSfy6hSHV94O8Y27T5q+DlDEgd/cZ4KmVI+MWKzFfCTiTuWqjfRSfdRllCA== - dependencies: - "@commitlint/is-ignored" "^17.8.1" - "@commitlint/parse" "^17.8.1" - "@commitlint/rules" "^17.8.1" - "@commitlint/types" "^17.8.1" - -"@commitlint/load@>6.1.1": - version "19.2.0" - resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-19.2.0.tgz#3ca51fdead4f1e1e09c9c7df343306412b1ef295" - integrity sha512-XvxxLJTKqZojCxaBQ7u92qQLFMMZc4+p9qrIq/9kJDy8DOrEa7P1yx7Tjdc2u2JxIalqT4KOGraVgCE7eCYJyQ== - dependencies: - "@commitlint/config-validator" "^19.0.3" - "@commitlint/execute-rule" "^19.0.0" - "@commitlint/resolve-extends" "^19.1.0" - "@commitlint/types" "^19.0.3" - chalk "^5.3.0" - cosmiconfig "^9.0.0" - cosmiconfig-typescript-loader "^5.0.0" - lodash.isplainobject "^4.0.6" - lodash.merge "^4.6.2" - lodash.uniq "^4.5.0" - -"@commitlint/load@^17.8.1": - version "17.8.1" - resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-17.8.1.tgz#fa061e7bfa53281eb03ca8517ca26d66a189030c" - integrity sha512-iF4CL7KDFstP1kpVUkT8K2Wl17h2yx9VaR1ztTc8vzByWWcbO/WaKwxsnCOqow9tVAlzPfo1ywk9m2oJ9ucMqA== - dependencies: - "@commitlint/config-validator" "^17.8.1" - "@commitlint/execute-rule" "^17.8.1" - "@commitlint/resolve-extends" "^17.8.1" - "@commitlint/types" "^17.8.1" - "@types/node" "20.5.1" - chalk "^4.1.0" - cosmiconfig "^8.0.0" - cosmiconfig-typescript-loader "^4.0.0" - lodash.isplainobject "^4.0.6" - lodash.merge "^4.6.2" - lodash.uniq "^4.5.0" - resolve-from "^5.0.0" - ts-node "^10.8.1" - typescript "^4.6.4 || ^5.2.2" - -"@commitlint/message@^17.8.1": - version "17.8.1" - resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-17.8.1.tgz#a5cd226c419be20ee03c3d237db6ac37b95958b3" - integrity sha512-6bYL1GUQsD6bLhTH3QQty8pVFoETfFQlMn2Nzmz3AOLqRVfNNtXBaSY0dhZ0dM6A2MEq4+2d7L/2LP8TjqGRkA== - -"@commitlint/parse@^17.8.1": - version "17.8.1" - resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-17.8.1.tgz#6e00b8f50ebd63562d25dcf4230da2c9f984e626" - integrity sha512-/wLUickTo0rNpQgWwLPavTm7WbwkZoBy3X8PpkUmlSmQJyWQTj0m6bDjiykMaDt41qcUbfeFfaCvXfiR4EGnfw== - dependencies: - "@commitlint/types" "^17.8.1" - conventional-changelog-angular "^6.0.0" - conventional-commits-parser "^4.0.0" - -"@commitlint/read@^17.8.1": - version "17.8.1" - resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-17.8.1.tgz#b3f28777607c756078356cc133368b0e8c08092f" - integrity sha512-Fd55Oaz9irzBESPCdMd8vWWgxsW3OWR99wOntBDHgf9h7Y6OOHjWEdS9Xzen1GFndqgyoaFplQS5y7KZe0kO2w== - dependencies: - "@commitlint/top-level" "^17.8.1" - "@commitlint/types" "^17.8.1" - fs-extra "^11.0.0" - git-raw-commits "^2.0.11" - minimist "^1.2.6" - -"@commitlint/resolve-extends@^17.8.1": - version "17.8.1" - resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-17.8.1.tgz#9af01432bf2fd9ce3dd5a00d266cce14e4c977e7" - integrity sha512-W/ryRoQ0TSVXqJrx5SGkaYuAaE/BUontL1j1HsKckvM6e5ZaG0M9126zcwL6peKSuIetJi7E87PRQF8O86EW0Q== - dependencies: - "@commitlint/config-validator" "^17.8.1" - "@commitlint/types" "^17.8.1" - import-fresh "^3.0.0" - lodash.mergewith "^4.6.2" - resolve-from "^5.0.0" - resolve-global "^1.0.0" - -"@commitlint/resolve-extends@^19.1.0": - version "19.1.0" - resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-19.1.0.tgz#fa5b8f921e9c8d76f53624c35bf25b9676bd73fa" - integrity sha512-z2riI+8G3CET5CPgXJPlzftH+RiWYLMYv4C9tSLdLXdr6pBNimSKukYP9MS27ejmscqCTVA4almdLh0ODD2KYg== - dependencies: - "@commitlint/config-validator" "^19.0.3" - "@commitlint/types" "^19.0.3" - global-directory "^4.0.1" - import-meta-resolve "^4.0.0" - lodash.mergewith "^4.6.2" - resolve-from "^5.0.0" - -"@commitlint/rules@^17.8.1": - version "17.8.1" - resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-17.8.1.tgz#da49cab1b7ebaf90d108de9f58f684dc4ccb65a0" - integrity sha512-2b7OdVbN7MTAt9U0vKOYKCDsOvESVXxQmrvuVUZ0rGFMCrCPJWWP1GJ7f0lAypbDAhaGb8zqtdOr47192LBrIA== - dependencies: - "@commitlint/ensure" "^17.8.1" - "@commitlint/message" "^17.8.1" - "@commitlint/to-lines" "^17.8.1" - "@commitlint/types" "^17.8.1" - execa "^5.0.0" - -"@commitlint/to-lines@^17.8.1": - version "17.8.1" - resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-17.8.1.tgz#a5c4a7cf7dff3dbdd69289fc0eb19b66f3cfe017" - integrity sha512-LE0jb8CuR/mj6xJyrIk8VLz03OEzXFgLdivBytoooKO5xLt5yalc8Ma5guTWobw998sbR3ogDd+2jed03CFmJA== - -"@commitlint/top-level@^17.8.1": - version "17.8.1" - resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-17.8.1.tgz#206d37d6782f33c9572e44fbe3758392fdeea7bc" - integrity sha512-l6+Z6rrNf5p333SHfEte6r+WkOxGlWK4bLuZKbtf/2TXRN+qhrvn1XE63VhD8Oe9oIHQ7F7W1nG2k/TJFhx2yA== - dependencies: - find-up "^5.0.0" - -"@commitlint/types@^17.8.1": - version "17.8.1" - resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-17.8.1.tgz#883a0ad35c5206d5fef7bc6ce1bbe648118af44e" - integrity sha512-PXDQXkAmiMEG162Bqdh9ChML/GJZo6vU+7F03ALKDK8zYc6SuAr47LjG7hGYRqUOz+WK0dU7bQ0xzuqFMdxzeQ== - dependencies: - chalk "^4.1.0" - -"@commitlint/types@^19.0.3": - version "19.0.3" - resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-19.0.3.tgz#feff4ecac2b5c359f2a57f9ab094b2ac80ef0266" - integrity sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA== - dependencies: - "@types/conventional-commits-parser" "^5.0.0" - chalk "^5.3.0" - -"@connext/interfaces@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@connext/interfaces/-/interfaces-2.0.0.tgz#17f27a516315e40a440c3ef34db83834ad51917f" - integrity sha512-1dYh5T0Zx6zVvLWDHRRUuXZxTGLXeqefDK/zUQyNYQMmPWRBzA967wK0mtrU6drJq4VkO2gZ5QFE63mMDEz8TQ== - -"@cosmjs/encoding@^0.31.3": - version "0.31.3" - resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.31.3.tgz#2519d9c9ae48368424971f253775c4580b54c5aa" - integrity sha512-6IRtG0fiVYwyP7n+8e54uTx2pLYijO48V3t9TLiROERm5aUAIzIlz6Wp0NYaI5he9nh1lcEGJ1lkquVKFw3sUg== - dependencies: - base64-js "^1.3.0" - bech32 "^1.1.4" - readonly-date "^1.0.0" - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@dabh/diagnostics@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" - integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== - dependencies: - colorspace "1.1.x" - enabled "2.0.x" - kuler "^2.0.0" - -"@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.4.0", "@eslint-community/regexpp@^4.5.1", "@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== - -"@eth-optimism/contracts@^0.5.21": - version "0.5.40" - resolved "https://registry.yarnpkg.com/@eth-optimism/contracts/-/contracts-0.5.40.tgz#d13a04a15ea947a69055e6fc74d87e215d4c936a" - integrity sha512-MrzV0nvsymfO/fursTB7m/KunkPsCndltVgfdHaT1Aj5Vi6R/doKIGGkOofHX+8B6VMZpuZosKCMQ5lQuqjt8w== - dependencies: - "@eth-optimism/core-utils" "0.12.0" - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - -"@eth-optimism/contracts@^0.6.0": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@eth-optimism/contracts/-/contracts-0.6.0.tgz#15ae76222a9b4d958a550cafb1960923af613a31" - integrity sha512-vQ04wfG9kMf1Fwy3FEMqH2QZbgS0gldKhcBeBUPfO8zu68L61VI97UDXmsMQXzTsEAxK8HnokW3/gosl4/NW3w== - dependencies: - "@eth-optimism/core-utils" "0.12.0" - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - -"@eth-optimism/core-utils@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@eth-optimism/core-utils/-/core-utils-0.12.0.tgz#6337e4599a34de23f8eceb20378de2a2de82b0ea" - integrity sha512-qW+7LZYCz7i8dRa7SRlUKIo1VBU8lvN0HeXCxJR+z+xtMzMQpPds20XJNCMclszxYQHkXY00fOT6GvFw9ZL6nw== - dependencies: - "@ethersproject/abi" "^5.7.0" - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/address" "^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/keccak256" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/providers" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/web" "^5.7.0" - bufio "^1.0.7" - chai "^4.3.4" - -"@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/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.0.9", "@ethersproject/abi@^5.1.2", "@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.0.2", "@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", "@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", "@ethersproject/providers@^5.7.0", "@ethersproject/providers@^5.7.1", "@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", "@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", "@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" - -"@fastify/busboy@^2.0.0": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" - integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== - -"@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== - -"@hyperlane-xyz/core@3.1.10": - version "3.1.10" - resolved "https://registry.yarnpkg.com/@hyperlane-xyz/core/-/core-3.1.10.tgz#7baab71079268bb8016b512b23d18a6b011086c4" - integrity sha512-kc7pypB9BPzIarHJCPVzbW52lUI5j8LluCp3zDmZICICXSfc6rTYVU93LosceBKoQTNGc7Ur/UgTHiOaHC4sYA== - dependencies: - "@eth-optimism/contracts" "^0.6.0" - "@hyperlane-xyz/utils" "3.1.10" - "@openzeppelin/contracts" "^4.9.3" - "@openzeppelin/contracts-upgradeable" "^v4.9.3" - -"@hyperlane-xyz/utils@3.1.10": - version "3.1.10" - resolved "https://registry.yarnpkg.com/@hyperlane-xyz/utils/-/utils-3.1.10.tgz#0c4369499b8fa96504ace95d2d2ce8d6064cb934" - integrity sha512-6CvtPxuQpg7qpdbRQccPjavcbPXMTFIXG3Pc1ZfO2JI6eftLCpMFYOfLpwYhtXPCjjVqk2kgdwOUiN4NTfLp1Q== - dependencies: - "@cosmjs/encoding" "^0.31.3" - "@solana/web3.js" "^1.78.0" - bignumber.js "^9.1.1" - ethers "^5.7.2" - -"@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.0.3", "@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/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@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/eth-sig-util@^4.0.0": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" - integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ== - dependencies: - ethereumjs-abi "^0.6.8" - ethereumjs-util "^6.2.1" - ethjs-util "^0.1.6" - tweetnacl "^1.0.3" - tweetnacl-util "^0.15.1" - -"@mongodb-js/saslprep@^1.1.5": - version "1.1.5" - resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.1.5.tgz#0c48a96c8d799e81fae311b7251aa5c1dc7c6e95" - integrity sha512-XLNOMH66KhJzUJNwT/qlMnS4WsNDWD5ASdyaSH3EtK+F4r/CFGa3jT4GNi4mfOitGvWXtdLgQJkQjxSVrio+jA== - dependencies: - sparse-bitfield "^3.0.3" - -"@noble/curves@1.2.0", "@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/curves@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.0.tgz#f05771ef64da724997f69ee1261b2417a49522d6" - integrity sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg== - dependencies: - "@noble/hashes" "1.4.0" - -"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" - integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== - -"@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.0", "@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.4.0", "@noble/hashes@^1.3.3", "@noble/hashes@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" - integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== - -"@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": - version "1.7.1" - resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" - integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - 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" - -"@nomicfoundation/ethereumjs-block@5.0.2": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.2.tgz#13a7968f5964f1697da941281b7f7943b0465d04" - integrity sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q== - dependencies: - "@nomicfoundation/ethereumjs-common" "4.0.2" - "@nomicfoundation/ethereumjs-rlp" "5.0.2" - "@nomicfoundation/ethereumjs-trie" "6.0.2" - "@nomicfoundation/ethereumjs-tx" "5.0.2" - "@nomicfoundation/ethereumjs-util" "9.0.2" - ethereum-cryptography "0.1.3" - ethers "^5.7.1" - -"@nomicfoundation/ethereumjs-blockchain@7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.2.tgz#45323b673b3d2fab6b5008535340d1b8fea7d446" - integrity sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w== - dependencies: - "@nomicfoundation/ethereumjs-block" "5.0.2" - "@nomicfoundation/ethereumjs-common" "4.0.2" - "@nomicfoundation/ethereumjs-ethash" "3.0.2" - "@nomicfoundation/ethereumjs-rlp" "5.0.2" - "@nomicfoundation/ethereumjs-trie" "6.0.2" - "@nomicfoundation/ethereumjs-tx" "5.0.2" - "@nomicfoundation/ethereumjs-util" "9.0.2" - abstract-level "^1.0.3" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - level "^8.0.0" - lru-cache "^5.1.1" - memory-level "^1.0.0" - -"@nomicfoundation/ethereumjs-common@4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.2.tgz#a15d1651ca36757588fdaf2a7d381a150662a3c3" - integrity sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg== - dependencies: - "@nomicfoundation/ethereumjs-util" "9.0.2" - crc-32 "^1.2.0" - -"@nomicfoundation/ethereumjs-ethash@3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.2.tgz#da77147f806401ee996bfddfa6487500118addca" - integrity sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg== - dependencies: - "@nomicfoundation/ethereumjs-block" "5.0.2" - "@nomicfoundation/ethereumjs-rlp" "5.0.2" - "@nomicfoundation/ethereumjs-util" "9.0.2" - abstract-level "^1.0.3" - bigint-crypto-utils "^3.0.23" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/ethereumjs-evm@2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.2.tgz#4c2f4b84c056047102a4fa41c127454e3f0cfcf6" - integrity sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ== - dependencies: - "@ethersproject/providers" "^5.7.1" - "@nomicfoundation/ethereumjs-common" "4.0.2" - "@nomicfoundation/ethereumjs-tx" "5.0.2" - "@nomicfoundation/ethereumjs-util" "9.0.2" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - mcl-wasm "^0.7.1" - rustbn.js "~0.2.0" - -"@nomicfoundation/ethereumjs-rlp@5.0.2": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.2.tgz#4fee8dc58a53ac6ae87fb1fca7c15dc06c6b5dea" - integrity sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA== - -"@nomicfoundation/ethereumjs-statemanager@2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.2.tgz#3ba4253b29b1211cafe4f9265fee5a0d780976e0" - integrity sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA== - dependencies: - "@nomicfoundation/ethereumjs-common" "4.0.2" - "@nomicfoundation/ethereumjs-rlp" "5.0.2" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - ethers "^5.7.1" - js-sdsl "^4.1.4" - -"@nomicfoundation/ethereumjs-trie@6.0.2": - version "6.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.2.tgz#9a6dbd28482dca1bc162d12b3733acab8cd12835" - integrity sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ== - dependencies: - "@nomicfoundation/ethereumjs-rlp" "5.0.2" - "@nomicfoundation/ethereumjs-util" "9.0.2" - "@types/readable-stream" "^2.3.13" - ethereum-cryptography "0.1.3" - readable-stream "^3.6.0" - -"@nomicfoundation/ethereumjs-tx@5.0.2": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.2.tgz#117813b69c0fdc14dd0446698a64be6df71d7e56" - integrity sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g== - dependencies: - "@chainsafe/ssz" "^0.9.2" - "@ethersproject/providers" "^5.7.2" - "@nomicfoundation/ethereumjs-common" "4.0.2" - "@nomicfoundation/ethereumjs-rlp" "5.0.2" - "@nomicfoundation/ethereumjs-util" "9.0.2" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/ethereumjs-util@9.0.2": - version "9.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.2.tgz#16bdc1bb36f333b8a3559bbb4b17dac805ce904d" - integrity sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ== - dependencies: - "@chainsafe/ssz" "^0.10.0" - "@nomicfoundation/ethereumjs-rlp" "5.0.2" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/ethereumjs-vm@7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.2.tgz#3b0852cb3584df0e18c182d0672a3596c9ca95e6" - integrity sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA== - dependencies: - "@nomicfoundation/ethereumjs-block" "5.0.2" - "@nomicfoundation/ethereumjs-blockchain" "7.0.2" - "@nomicfoundation/ethereumjs-common" "4.0.2" - "@nomicfoundation/ethereumjs-evm" "2.0.2" - "@nomicfoundation/ethereumjs-rlp" "5.0.2" - "@nomicfoundation/ethereumjs-statemanager" "2.0.2" - "@nomicfoundation/ethereumjs-trie" "6.0.2" - "@nomicfoundation/ethereumjs-tx" "5.0.2" - "@nomicfoundation/ethereumjs-util" "9.0.2" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - mcl-wasm "^0.7.1" - rustbn.js "~0.2.0" - -"@nomicfoundation/hardhat-chai-matchers@^1.0.4": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.6.tgz#72a2e312e1504ee5dd73fe302932736432ba96bc" - integrity sha512-f5ZMNmabZeZegEfuxn/0kW+mm7+yV7VNDxLpMOMGXWFJ2l/Ct3QShujzDRF9cOkK9Ui/hbDeOWGZqyQALDXVCQ== - dependencies: - "@ethersproject/abi" "^5.1.2" - "@types/chai-as-promised" "^7.1.3" - chai-as-promised "^7.1.1" - deep-eql "^4.0.1" - ordinal "^1.0.3" - -"@nomicfoundation/hardhat-network-helpers@^1.0.8": - version "1.0.10" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.10.tgz#c61042ceb104fdd6c10017859fdef6529c1d6585" - integrity sha512-R35/BMBlx7tWN5V6d/8/19QCwEmIdbnA4ZrsuXgvs8i2qFx5i7h6mH5pBS4Pwi4WigLH+upl6faYusrNPuzMrQ== - dependencies: - ethereumjs-util "^7.1.4" - -"@nomicfoundation/hardhat-toolbox@^2.0.0": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-2.0.2.tgz#ec95f23b53cb4e71a1a7091380fa223aad18f156" - integrity sha512-vnN1AzxbvpSx9pfdRHbUzTRIXpMLPXnUlkW855VaDk6N1pwRaQ2gNzEmFAABk4lWf11E00PKwFd/q27HuwYrYg== - -"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz#4c858096b1c17fe58a474fe81b46815f93645c15" - integrity sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w== - -"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz#6e25ccdf6e2d22389c35553b64fe6f3fdaec432c" - integrity sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA== - -"@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz#0a224ea50317139caeebcdedd435c28a039d169c" - integrity sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA== - -"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz#dfa085d9ffab9efb2e7b383aed3f557f7687ac2b" - integrity sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg== - -"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz#c9e06b5d513dd3ab02a7ac069c160051675889a4" - integrity sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w== - -"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz#8d328d16839e52571f72f2998c81e46bf320f893" - integrity sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA== - -"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz#9b49d0634b5976bb5ed1604a1e1b736f390959bb" - integrity sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w== - -"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz#e2867af7264ebbcc3131ef837878955dd6a3676f" - integrity sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg== - -"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz#0685f78608dd516c8cdfb4896ed451317e559585" - integrity sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ== - -"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz#c9a44f7108646f083b82e851486e0f6aeb785836" - integrity sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw== - -"@nomicfoundation/solidity-analyzer@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz#f5f4d36d3f66752f59a57e7208cd856f3ddf6f2d" - integrity sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg== - optionalDependencies: - "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.1" - "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.1" - "@nomicfoundation/solidity-analyzer-freebsd-x64" "0.1.1" - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.1" - "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.1" - "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.1" - "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.1" - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc" "0.1.1" - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.1" - "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.1" - -"@nomiclabs/hardhat-ethers@^2.2.1": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz#b41053e360c31a32c2640c9a45ee981a7e603fe0" - integrity sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg== - -"@nomiclabs/hardhat-etherscan@^3.1.2": - version "3.1.8" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.8.tgz#3c12ee90b3733e0775e05111146ef9418d4f5a38" - integrity sha512-v5F6IzQhrsjHh6kQz4uNrym49brK9K5bYCq2zQZ729RYRaifI9hHbtmK+KkIVevfhut7huQFEQ77JLRMAzWYjQ== - dependencies: - "@ethersproject/abi" "^5.1.2" - "@ethersproject/address" "^5.0.2" - cbor "^8.1.0" - chalk "^2.4.2" - debug "^4.1.1" - fs-extra "^7.0.1" - lodash "^4.17.11" - semver "^6.3.0" - table "^6.8.0" - undici "^5.14.0" +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 6 + cacheKey: 8 + +"@adraffy/ens-normalize@npm:1.10.0": + version: 1.10.0 + resolution: "@adraffy/ens-normalize@npm:1.10.0" + checksum: af0540f963a2632da2bbc37e36ea6593dcfc607b937857133791781e246d47f870d5e3d21fa70d5cfe94e772c284588c81ea3f5b7f4ea8fbb824369444e4dbcb + languageName: node + linkType: hard + +"@adraffy/ens-normalize@npm:1.10.1": + version: 1.10.1 + resolution: "@adraffy/ens-normalize@npm:1.10.1" + checksum: 0836f394ea256972ec19a0b5e78cb7f5bcdfd48d8a32c7478afc94dd53ae44c04d1aa2303d7f3077b4f3ac2323b1f557ab9188e8059978748fdcd83e04a80dcc + languageName: node + linkType: hard + +"@axelar-network/axelar-gmp-sdk-solidity@npm:5.6.2": + version: 5.6.2 + resolution: "@axelar-network/axelar-gmp-sdk-solidity@npm:5.6.2" + checksum: d36260a18e0303446685fac3a04c14503454de830320b55ddb0d4382ef0d970c4cfd759029b17b1b6178f85cf3300500aa94705690e752b398dfbc32c414cf2d + languageName: node + linkType: hard + +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.22.13, @babel/code-frame@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/code-frame@npm:7.24.7" + dependencies: + "@babel/highlight": ^7.24.7 + picocolors: ^1.0.0 + checksum: 830e62cd38775fdf84d612544251ce773d544a8e63df667728cc9e0126eeef14c6ebda79be0f0bc307e8318316b7f58c27ce86702e0a1f5c321d842eb38ffda4 + languageName: node + linkType: hard + +"@babel/generator@npm:7.17.7": + version: 7.17.7 + resolution: "@babel/generator@npm:7.17.7" + dependencies: + "@babel/types": ^7.17.0 + jsesc: ^2.5.1 + source-map: ^0.5.0 + checksum: e7344b9b4559115f2754ecc2ae9508412ea6a8f617544cd3d3f17cabc727bd30630765f96c8a4ebc8901ded1492a3a6c23d695a4f1e8f3042f860b30c891985c + languageName: node + linkType: hard + +"@babel/generator@npm:^7.23.0": + version: 7.25.6 + resolution: "@babel/generator@npm:7.25.6" + dependencies: + "@babel/types": ^7.25.6 + "@jridgewell/gen-mapping": ^0.3.5 + "@jridgewell/trace-mapping": ^0.3.25 + jsesc: ^2.5.1 + checksum: b55975cd664f5602304d868bb34f4ee3bed6f5c7ce8132cd92ff27a46a53a119def28a182d91992e86f75db904f63094a81247703c4dc96e4db0c03fd04bcd68 + languageName: node + linkType: hard + +"@babel/helper-environment-visitor@npm:^7.22.20": + version: 7.24.7 + resolution: "@babel/helper-environment-visitor@npm:7.24.7" + dependencies: + "@babel/types": ^7.24.7 + checksum: 079d86e65701b29ebc10baf6ed548d17c19b808a07aa6885cc141b690a78581b180ee92b580d755361dc3b16adf975b2d2058b8ce6c86675fcaf43cf22f2f7c6 + languageName: node + linkType: hard + +"@babel/helper-function-name@npm:^7.23.0": + version: 7.24.7 + resolution: "@babel/helper-function-name@npm:7.24.7" + dependencies: + "@babel/template": ^7.24.7 + "@babel/types": ^7.24.7 + checksum: 142ee08922074dfdc0ff358e09ef9f07adf3671ab6eef4fca74dcf7a551f1a43717e7efa358c9e28d7eea84c28d7f177b7a58c70452fc312ae3b1893c5dab2a4 + languageName: node + linkType: hard + +"@babel/helper-hoist-variables@npm:^7.22.5": + version: 7.24.7 + resolution: "@babel/helper-hoist-variables@npm:7.24.7" + dependencies: + "@babel/types": ^7.24.7 + checksum: 6cfdcf2289cd12185dcdbdf2435fa8d3447b797ac75851166de9fc8503e2fd0021db6baf8dfbecad3753e582c08e6a3f805c8d00cbed756060a877d705bd8d8d + languageName: node + linkType: hard + +"@babel/helper-split-export-declaration@npm:^7.22.6": + version: 7.24.7 + resolution: "@babel/helper-split-export-declaration@npm:7.24.7" + dependencies: + "@babel/types": ^7.24.7 + checksum: e3ddc91273e5da67c6953f4aa34154d005a00791dc7afa6f41894e768748540f6ebcac5d16e72541aea0c89bee4b89b4da6a3d65972a0ea8bfd2352eda5b7e22 + languageName: node + linkType: hard + +"@babel/helper-string-parser@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/helper-string-parser@npm:7.24.8" + checksum: 39b03c5119216883878655b149148dc4d2e284791e969b19467a9411fccaa33f7a713add98f4db5ed519535f70ad273cdadfd2eb54d47ebbdeac5083351328ce + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^7.16.7, @babel/helper-validator-identifier@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-validator-identifier@npm:7.24.7" + checksum: 6799ab117cefc0ecd35cd0b40ead320c621a298ecac88686a14cffceaac89d80cdb3c178f969861bf5fa5e4f766648f9161ea0752ecfe080d8e89e3147270257 + languageName: node + linkType: hard + +"@babel/highlight@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/highlight@npm:7.24.7" + dependencies: + "@babel/helper-validator-identifier": ^7.24.7 + chalk: ^2.4.2 + js-tokens: ^4.0.0 + picocolors: ^1.0.0 + checksum: 5cd3a89f143671c4ac129960024ba678b669e6fc673ce078030f5175002d1d3d52bc10b22c5b916a6faf644b5028e9a4bd2bb264d053d9b05b6a98690f1d46f1 + languageName: node + linkType: hard + +"@babel/parser@npm:^7.20.5, @babel/parser@npm:^7.23.0, @babel/parser@npm:^7.25.0": + version: 7.25.6 + resolution: "@babel/parser@npm:7.25.6" + dependencies: + "@babel/types": ^7.25.6 + bin: + parser: ./bin/babel-parser.js + checksum: 85b237ded09ee43cc984493c35f3b1ff8a83e8dbbb8026b8132e692db6567acc5a1659ec928e4baa25499ddd840d7dae9dee3062be7108fe23ec5f94a8066b1e + languageName: node + linkType: hard + +"@babel/runtime@npm:^7.25.0": + version: 7.25.6 + resolution: "@babel/runtime@npm:7.25.6" + dependencies: + regenerator-runtime: ^0.14.0 + checksum: ee1a69d3ac7802803f5ee6a96e652b78b8addc28c6a38c725a4ad7d61a059d9e6cb9f6550ed2f63cce67a1bd82e0b1ef66a1079d895be6bfb536a5cfbd9ccc32 + languageName: node + linkType: hard + +"@babel/template@npm:^7.24.7": + version: 7.25.0 + resolution: "@babel/template@npm:7.25.0" + dependencies: + "@babel/code-frame": ^7.24.7 + "@babel/parser": ^7.25.0 + "@babel/types": ^7.25.0 + checksum: 3f2db568718756d0daf2a16927b78f00c425046b654cd30b450006f2e84bdccaf0cbe6dc04994aa1f5f6a4398da2f11f3640a4d3ee31722e43539c4c919c817b + languageName: node + linkType: hard + +"@babel/traverse@npm:7.23.2": + version: 7.23.2 + resolution: "@babel/traverse@npm:7.23.2" + dependencies: + "@babel/code-frame": ^7.22.13 + "@babel/generator": ^7.23.0 + "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-function-name": ^7.23.0 + "@babel/helper-hoist-variables": ^7.22.5 + "@babel/helper-split-export-declaration": ^7.22.6 + "@babel/parser": ^7.23.0 + "@babel/types": ^7.23.0 + debug: ^4.1.0 + globals: ^11.1.0 + checksum: 26a1eea0dde41ab99dde8b9773a013a0dc50324e5110a049f5d634e721ff08afffd54940b3974a20308d7952085ac769689369e9127dea655f868c0f6e1ab35d + languageName: node + linkType: hard + +"@babel/types@npm:7.17.0": + version: 7.17.0 + resolution: "@babel/types@npm:7.17.0" + dependencies: + "@babel/helper-validator-identifier": ^7.16.7 + to-fast-properties: ^2.0.0 + checksum: 12e5a287986fe557188e87b2c5202223f1dc83d9239a196ab936fdb9f8c1eb0be717ff19f934b5fad4e29a75586d5798f74bed209bccea1c20376b9952056f0e + languageName: node + linkType: hard + +"@babel/types@npm:^7.17.0, @babel/types@npm:^7.23.0, @babel/types@npm:^7.24.7, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.6": + version: 7.25.6 + resolution: "@babel/types@npm:7.25.6" + dependencies: + "@babel/helper-string-parser": ^7.24.8 + "@babel/helper-validator-identifier": ^7.24.7 + to-fast-properties: ^2.0.0 + checksum: 9b2f84ff3f874ad05b0b9bf06862c56f478b65781801f82296b4cc01bee39e79c20a7c0a06959fed0ee582c8267e1cb21638318655c5e070b0287242a844d1c9 + languageName: node + linkType: hard + +"@chainlink/contracts-ccip@npm:0.7.6": + version: 0.7.6 + resolution: "@chainlink/contracts-ccip@npm:0.7.6" + dependencies: + "@eth-optimism/contracts": ^0.5.21 + "@openzeppelin/contracts": ~4.3.3 + "@openzeppelin/contracts-upgradeable-4.7.3": "npm:@openzeppelin/contracts-upgradeable@v4.7.3" + "@openzeppelin/contracts-v0.7": "npm:@openzeppelin/contracts@v3.4.2" + checksum: 6acf068a82297d7738f88a542c6d533f23c42ff4bf855fc8efcc49c0d24281ba62007c9aa6a6b66384603bea1cfe2b281cec8d35f280b2900abca81775f30495 + languageName: node + linkType: hard + +"@chainsafe/as-sha256@npm:^0.3.1": + version: 0.3.1 + resolution: "@chainsafe/as-sha256@npm:0.3.1" + checksum: 58ea733be1657b0e31dbf48b0dba862da0833df34a81c1460c7352f04ce90874f70003cbf34d0afb9e5e53a33ee2d63a261a8b12462be85b2ba0a6f7f13d6150 + languageName: node + linkType: hard + +"@chainsafe/persistent-merkle-tree@npm:^0.4.2": + version: 0.4.2 + resolution: "@chainsafe/persistent-merkle-tree@npm:0.4.2" + dependencies: + "@chainsafe/as-sha256": ^0.3.1 + checksum: f9cfcb2132a243992709715dbd28186ab48c7c0c696f29d30857693cca5526bf753974a505ef68ffd5623bbdbcaa10f9083f4dd40bf99eb6408e451cc26a1a9e + languageName: node + linkType: hard + +"@chainsafe/persistent-merkle-tree@npm:^0.5.0": + version: 0.5.0 + resolution: "@chainsafe/persistent-merkle-tree@npm:0.5.0" + dependencies: + "@chainsafe/as-sha256": ^0.3.1 + checksum: 2c67203da776c79cd3a6132e2d672fe132393b2e63dc71604e3134acc8c0ec25cc5e431051545939ea0f7c5ff2066fb806b9e5cab974ca085d046226a1671f7d + languageName: node + linkType: hard + +"@chainsafe/ssz@npm:^0.10.0": + version: 0.10.2 + resolution: "@chainsafe/ssz@npm:0.10.2" + dependencies: + "@chainsafe/as-sha256": ^0.3.1 + "@chainsafe/persistent-merkle-tree": ^0.5.0 + checksum: 6bb70cf741d0a19dd0b28b3f6f067b96fa39f556e2eefa6ac745b21db9c3b3a8393dc3cca8ff4a6ce065ed71ddc3fb1b2b390a92004b9d01067c26e2558e5503 + languageName: node + linkType: hard + +"@chainsafe/ssz@npm:^0.9.2": + version: 0.9.4 + resolution: "@chainsafe/ssz@npm:0.9.4" + dependencies: + "@chainsafe/as-sha256": ^0.3.1 + "@chainsafe/persistent-merkle-tree": ^0.4.2 + case: ^1.6.3 + checksum: c6eaedeae9e5618b3c666ff4507a27647f665a8dcf17d5ca86da4ed4788c5a93868f256d0005467d184fdf35ec03f323517ec2e55ec42492d769540a2ec396bc + languageName: node + linkType: hard + +"@colors/colors@npm:1.6.0, @colors/colors@npm:^1.6.0": + version: 1.6.0 + resolution: "@colors/colors@npm:1.6.0" + checksum: aa209963e0c3218e80a4a20553ba8c0fbb6fa13140540b4e5f97923790be06801fc90172c1114fc8b7e888b3d012b67298cde6b9e81521361becfaee400c662f + languageName: node + linkType: hard + +"@commitlint/cli@npm:^17.3.0, @commitlint/cli@npm:^17.5.1": + version: 17.8.1 + resolution: "@commitlint/cli@npm:17.8.1" + dependencies: + "@commitlint/format": ^17.8.1 + "@commitlint/lint": ^17.8.1 + "@commitlint/load": ^17.8.1 + "@commitlint/read": ^17.8.1 + "@commitlint/types": ^17.8.1 + execa: ^5.0.0 + lodash.isfunction: ^3.0.9 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + yargs: ^17.0.0 + bin: + commitlint: cli.js + checksum: 293d5868e2f586a9ac5364c40eeb0fe2131ea689312c43d43ababe6f2415c998619c5070cf89e7298125a1d96b9e5912b85f51db75aedbfb189d67554f911dbf + languageName: node + linkType: hard + +"@commitlint/config-conventional@npm:^17.3.0, @commitlint/config-conventional@npm:^17.4.4": + version: 17.8.1 + resolution: "@commitlint/config-conventional@npm:17.8.1" + dependencies: + conventional-changelog-conventionalcommits: ^6.1.0 + checksum: ce8ace1a13f3a797ed699ffa13dc46273a27e1dc3ae8a9d01492c0637a8592e4ed24bb32d9a43f8745a8690a52d77ea4a950d039977b0dbcbf834f8cbacf5def + languageName: node + linkType: hard + +"@commitlint/config-validator@npm:^17.8.1": + version: 17.8.1 + resolution: "@commitlint/config-validator@npm:17.8.1" + dependencies: + "@commitlint/types": ^17.8.1 + ajv: ^8.11.0 + checksum: 487051cc36a82ba50f217dfd26721f4fa26d8c4206ee5cb0debd2793aa950280f3ca5bd1a8738e9c71ca8508b58548918b43169c21219ca4cb67f5dcd1e49d9f + languageName: node + linkType: hard + +"@commitlint/config-validator@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/config-validator@npm:19.5.0" + dependencies: + "@commitlint/types": ^19.5.0 + ajv: ^8.11.0 + checksum: 681bfdcabcb0ff794ea65d95128083869c97039c3a352219d6d88a2d4f3d0412b8ec515db77433fc6b0fce072051beb103d16889d42e76ea97873191ec191b23 + languageName: node + linkType: hard + +"@commitlint/ensure@npm:^17.8.1": + version: 17.8.1 + resolution: "@commitlint/ensure@npm:17.8.1" + dependencies: + "@commitlint/types": ^17.8.1 + lodash.camelcase: ^4.3.0 + lodash.kebabcase: ^4.1.1 + lodash.snakecase: ^4.1.1 + lodash.startcase: ^4.4.0 + lodash.upperfirst: ^4.3.1 + checksum: a4a5d3071df0e52dad0293c649c236f070c4fcd3380f11747a6f9b06b036adea281e557d117156e31313fbe18a7d71bf06e05e92776adbde7867190e1735bc43 + languageName: node + linkType: hard + +"@commitlint/execute-rule@npm:^17.8.1": + version: 17.8.1 + resolution: "@commitlint/execute-rule@npm:17.8.1" + checksum: 73354b5605931a71f727ee0262a5509277e92f134e2d704d44eafe4da7acb1cd2c7d084dcf8096cc0ac7ce83b023cc0ae8f79b17487b132ccc2e0b3920105a11 + languageName: node + linkType: hard + +"@commitlint/execute-rule@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/execute-rule@npm:19.5.0" + checksum: ff05568c3a287ef8564171d5bc5d4510b2e00b552e4703f79db3d62f3cba9d669710717695d199e04c2117d41f9e72d7e43a342d5c1b62d456bc8e8bb7dda1e9 + languageName: node + linkType: hard + +"@commitlint/format@npm:^17.8.1": + version: 17.8.1 + resolution: "@commitlint/format@npm:17.8.1" + dependencies: + "@commitlint/types": ^17.8.1 + chalk: ^4.1.0 + checksum: 0481e4d49196c942d7723a1abd352c3c884ceb9f434fb4e64bfab71bc264e9b7c643a81069f20d2a035fca70261a472508d73b1a60fe378c60534ca6301408b6 + languageName: node + linkType: hard + +"@commitlint/is-ignored@npm:^17.8.1": + version: 17.8.1 + resolution: "@commitlint/is-ignored@npm:17.8.1" + dependencies: + "@commitlint/types": ^17.8.1 + semver: 7.5.4 + checksum: 26eb2f1a84a774625f3f6fe4fa978c57d81028ee6a6925ab3fb02981ac395f9584ab4a71af59c3f2ac84a06c775e3f52683c033c565d86271a7aa99c2eb6025c + languageName: node + linkType: hard + +"@commitlint/lint@npm:^17.8.1": + version: 17.8.1 + resolution: "@commitlint/lint@npm:17.8.1" + dependencies: + "@commitlint/is-ignored": ^17.8.1 + "@commitlint/parse": ^17.8.1 + "@commitlint/rules": ^17.8.1 + "@commitlint/types": ^17.8.1 + checksum: 025712ad928098b3f94d8dc38566785f6c3eeba799725dbd935c5514141ea77b01e036fed1dbbf60cc954736f706ddbb85339751c43f16f5f3f94170d1decb2a + languageName: node + linkType: hard + +"@commitlint/load@npm:>6.1.1": + version: 19.5.0 + resolution: "@commitlint/load@npm:19.5.0" + dependencies: + "@commitlint/config-validator": ^19.5.0 + "@commitlint/execute-rule": ^19.5.0 + "@commitlint/resolve-extends": ^19.5.0 + "@commitlint/types": ^19.5.0 + chalk: ^5.3.0 + cosmiconfig: ^9.0.0 + cosmiconfig-typescript-loader: ^5.0.0 + lodash.isplainobject: ^4.0.6 + lodash.merge: ^4.6.2 + lodash.uniq: ^4.5.0 + checksum: 87a9450c768632c09e9d98993752a5622aee698642eee5a9b31c3c48625455e043406b7ea6e02a8f41d86c524c9ecbdb9b823caf67da3048f0d96531177fda28 + languageName: node + linkType: hard + +"@commitlint/load@npm:^17.8.1": + version: 17.8.1 + resolution: "@commitlint/load@npm:17.8.1" + dependencies: + "@commitlint/config-validator": ^17.8.1 + "@commitlint/execute-rule": ^17.8.1 + "@commitlint/resolve-extends": ^17.8.1 + "@commitlint/types": ^17.8.1 + "@types/node": 20.5.1 + chalk: ^4.1.0 + cosmiconfig: ^8.0.0 + cosmiconfig-typescript-loader: ^4.0.0 + lodash.isplainobject: ^4.0.6 + lodash.merge: ^4.6.2 + lodash.uniq: ^4.5.0 + resolve-from: ^5.0.0 + ts-node: ^10.8.1 + typescript: ^4.6.4 || ^5.2.2 + checksum: 5a9a9f0d4621a4cc61c965c3adc88d04ccac40640b022bb3bbad70ed4435bb0c103647a2e29e37fc3d68021dae041c937bee611fe2e5461bebe997640f4f626b + languageName: node + linkType: hard + +"@commitlint/message@npm:^17.8.1": + version: 17.8.1 + resolution: "@commitlint/message@npm:17.8.1" + checksum: ee3ca9bf02828ea322becba47c67f7585aa3fd22b197eab69679961e67e3c7bdf56f6ef41cb3b831b521af7dabd305eb5d7ee053c8294531cc8ca64dbbff82fc + languageName: node + linkType: hard + +"@commitlint/parse@npm:^17.8.1": + version: 17.8.1 + resolution: "@commitlint/parse@npm:17.8.1" + dependencies: + "@commitlint/types": ^17.8.1 + conventional-changelog-angular: ^6.0.0 + conventional-commits-parser: ^4.0.0 + checksum: 5322ae049b43a329761063b6e698714593d84d874147ced6290c8d88a9ebea2ba8c660a5815392a731377ac26fbf6b215bb9b87d84d8b49cb47fa1c62d228b24 + languageName: node + linkType: hard + +"@commitlint/read@npm:^17.8.1": + version: 17.8.1 + resolution: "@commitlint/read@npm:17.8.1" + dependencies: + "@commitlint/top-level": ^17.8.1 + "@commitlint/types": ^17.8.1 + fs-extra: ^11.0.0 + git-raw-commits: ^2.0.11 + minimist: ^1.2.6 + checksum: 122f1842cb8b87b2c447383095420d077dcae6fbb4f871f8b05fa088f99d95d18a8c6675be2eb3e67bf7ff47a9990764261e3eebc5e474404f14e3379f48df42 + languageName: node + linkType: hard + +"@commitlint/resolve-extends@npm:^17.8.1": + version: 17.8.1 + resolution: "@commitlint/resolve-extends@npm:17.8.1" + dependencies: + "@commitlint/config-validator": ^17.8.1 + "@commitlint/types": ^17.8.1 + import-fresh: ^3.0.0 + lodash.mergewith: ^4.6.2 + resolve-from: ^5.0.0 + resolve-global: ^1.0.0 + checksum: c6fb7d3f263b876ff805396abad27bc514b1a69dcc634903c28782f4f3932eddc37221daa3264a45a5b82d28aa17a57c7bab4830c6efae741cc875f137366608 + languageName: node + linkType: hard + +"@commitlint/resolve-extends@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/resolve-extends@npm:19.5.0" + dependencies: + "@commitlint/config-validator": ^19.5.0 + "@commitlint/types": ^19.5.0 + global-directory: ^4.0.1 + import-meta-resolve: ^4.0.0 + lodash.mergewith: ^4.6.2 + resolve-from: ^5.0.0 + checksum: 4198541f25fad991d9214373419a97aec9ff068a960d0a7f2070ea4c456aef0ac7c1ad49b55b20b0d4c57c19a55fad76806597d70a739781fdc74b6fbd5339a3 + languageName: node + linkType: hard + +"@commitlint/rules@npm:^17.8.1": + version: 17.8.1 + resolution: "@commitlint/rules@npm:17.8.1" + dependencies: + "@commitlint/ensure": ^17.8.1 + "@commitlint/message": ^17.8.1 + "@commitlint/to-lines": ^17.8.1 + "@commitlint/types": ^17.8.1 + execa: ^5.0.0 + checksum: b284514a4b8dad6bcbbc91c7548d69d0bbe9fcbdb241c15f5f9da413e8577c19d11190f1d709b38487c49dc874359bd9d0b72ab39f91cce06191e4ddaf8ec84d + languageName: node + linkType: hard + +"@commitlint/to-lines@npm:^17.8.1": + version: 17.8.1 + resolution: "@commitlint/to-lines@npm:17.8.1" + checksum: ff175c202c89537301f32b6e13ebe6919ac782a6e109cb5f6136566d71555a54f6574caf4d674d3409d32fdea1b4a28518837632ca05c7557d4f18f339574e62 + languageName: node + linkType: hard + +"@commitlint/top-level@npm:^17.8.1": + version: 17.8.1 + resolution: "@commitlint/top-level@npm:17.8.1" + dependencies: + find-up: ^5.0.0 + checksum: 25c8a6f4026c705a5ad4d9358eae7558734f549623da1c5f44cba8d6bc495f20d3ad05418febb8dca4f6b63f40bf44763007a14ab7209c435566843be114e7fc + languageName: node + linkType: hard + +"@commitlint/types@npm:^17.8.1": + version: 17.8.1 + resolution: "@commitlint/types@npm:17.8.1" + dependencies: + chalk: ^4.1.0 + checksum: a4cfa8c417aa0209694b96da04330282e41150caae1e1d0cec596ea34e3ce15afb84b3263abe5b89758ec1f3f71a9de0ee2d593df66db17b283127dd5e7cd6ac + languageName: node + linkType: hard + +"@commitlint/types@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/types@npm:19.5.0" + dependencies: + "@types/conventional-commits-parser": ^5.0.0 + chalk: ^5.3.0 + checksum: a26f33ec6987d7d93bdbd7e1b177cfac30ca056ea383faf343c6a09c0441aa057a24be1459c3d4e7e91edd2ecf8d6c4dd670948c9d22646d64767137c6db098a + languageName: node + linkType: hard + +"@connext/interfaces@npm:2.0.0": + version: 2.0.0 + resolution: "@connext/interfaces@npm:2.0.0" + checksum: 8cc776d9c0d5cc8ca92c0d0d4cc656b07efb4f48df517a85be54ef5a289db78f7dfc1d92ff4e41c5fd0788e29d63199ccfc6ee7340f9766a164ebf4ef7a83ff4 + languageName: node + linkType: hard + +"@cosmjs/encoding@npm:^0.31.3": + version: 0.31.3 + resolution: "@cosmjs/encoding@npm:0.31.3" + dependencies: + base64-js: ^1.3.0 + bech32: ^1.1.4 + readonly-date: ^1.0.0 + checksum: dadef0579828299be20a64edf820ac8770c0cc47a842594bc9b494f160a347b745941d795360755ccbe385b9d0912aa54753479d1a70ff762d2d334693952ff9 + languageName: node + linkType: hard + +"@cspotcode/source-map-support@npm:^0.8.0": + version: 0.8.1 + resolution: "@cspotcode/source-map-support@npm:0.8.1" + dependencies: + "@jridgewell/trace-mapping": 0.3.9 + checksum: 5718f267085ed8edb3e7ef210137241775e607ee18b77d95aa5bd7514f47f5019aa2d82d96b3bf342ef7aa890a346fa1044532ff7cc3009e7d24fce3ce6200fa + languageName: node + linkType: hard + +"@dabh/diagnostics@npm:^2.0.2": + version: 2.0.3 + resolution: "@dabh/diagnostics@npm:2.0.3" + dependencies: + colorspace: 1.1.x + enabled: 2.0.x + kuler: ^2.0.0 + checksum: 4879600c55c8315a0fb85fbb19057bad1adc08f0a080a8cb4e2b63f723c379bfc4283b68123a2b078d367b327dd8df12fcb27464efe791addc0a48b9df6d79a1 + languageName: node + linkType: hard + +"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": + version: 4.4.0 + resolution: "@eslint-community/eslint-utils@npm:4.4.0" + dependencies: + eslint-visitor-keys: ^3.3.0 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: cdfe3ae42b4f572cbfb46d20edafe6f36fc5fb52bf2d90875c58aefe226892b9677fef60820e2832caf864a326fe4fc225714c46e8389ccca04d5f9288aabd22 + languageName: node + linkType: hard + +"@eslint-community/regexpp@npm:^4.4.0, @eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": + version: 4.11.0 + resolution: "@eslint-community/regexpp@npm:4.11.0" + checksum: 97d2fe46690b69417a551bd19a3dc53b6d9590d2295c43cc4c4e44e64131af541e2f4a44d5c12e87de990403654d3dae9d33600081f3a2f0386b368abc9111ec + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^2.1.4": + version: 2.1.4 + resolution: "@eslint/eslintrc@npm:2.1.4" + 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 + checksum: 10957c7592b20ca0089262d8c2a8accbad14b4f6507e35416c32ee6b4dbf9cad67dfb77096bbd405405e9ada2b107f3797fe94362e1c55e0b09d6e90dd149127 + languageName: node + linkType: hard + +"@eslint/js@npm:8.57.0": + version: 8.57.0 + resolution: "@eslint/js@npm:8.57.0" + checksum: 315dc65b0e9893e2bff139bddace7ea601ad77ed47b4550e73da8c9c2d2766c7a575c3cddf17ef85b8fd6a36ff34f91729d0dcca56e73ca887c10df91a41b0bb + languageName: node + linkType: hard + +"@eth-optimism/contracts@npm:^0.5.21": + version: 0.5.40 + resolution: "@eth-optimism/contracts@npm:0.5.40" + dependencies: + "@eth-optimism/core-utils": 0.12.0 + "@ethersproject/abstract-provider": ^5.7.0 + "@ethersproject/abstract-signer": ^5.7.0 + peerDependencies: + ethers: ^5 + checksum: 11dde466c90b886efe8b5fd123fa5893187a4ff84839213d417f90ae4e45bf00b2f62d56e4ebe23ba5dd7ec33beed22c4c41e206add35fce0db073fe2dbae6ba + languageName: node + linkType: hard + +"@eth-optimism/contracts@npm:^0.6.0": + version: 0.6.0 + resolution: "@eth-optimism/contracts@npm:0.6.0" + dependencies: + "@eth-optimism/core-utils": 0.12.0 + "@ethersproject/abstract-provider": ^5.7.0 + "@ethersproject/abstract-signer": ^5.7.0 + peerDependencies: + ethers: ^5 + checksum: 52e9a6cc6ad9bf3ab085d3be501fa4c89e48865baa8aee01aff39c2b007b69600304c7e8f8f4e00d67396e48a0dbfe3a260437efd3a4d7216424cece52639870 + languageName: node + linkType: hard + +"@eth-optimism/core-utils@npm:0.12.0": + version: 0.12.0 + resolution: "@eth-optimism/core-utils@npm:0.12.0" + dependencies: + "@ethersproject/abi": ^5.7.0 + "@ethersproject/abstract-provider": ^5.7.0 + "@ethersproject/address": ^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/keccak256": ^5.7.0 + "@ethersproject/properties": ^5.7.0 + "@ethersproject/providers": ^5.7.0 + "@ethersproject/rlp": ^5.7.0 + "@ethersproject/transactions": ^5.7.0 + "@ethersproject/web": ^5.7.0 + bufio: ^1.0.7 + chai: ^4.3.4 + checksum: 1c820107c44bdbb46becb1b00fd0dabb44f3ac8f54e6da7872a5a134411fad26f53b193225da55e79d6a8d7f0d01cc16a123db5d41ebaf02ca78360249a4b52a + languageName: node + linkType: hard + +"@ethereumjs/rlp@npm:^4.0.1": + version: 4.0.1 + resolution: "@ethereumjs/rlp@npm:4.0.1" + bin: + rlp: bin/rlp + checksum: 30db19c78faa2b6ff27275ab767646929207bb207f903f09eb3e4c273ce2738b45f3c82169ddacd67468b4f063d8d96035f2bf36f02b6b7e4d928eefe2e3ecbc + languageName: node + linkType: hard + +"@ethereumjs/util@npm:^8.1.0": + version: 8.1.0 + resolution: "@ethereumjs/util@npm:8.1.0" + dependencies: + "@ethereumjs/rlp": ^4.0.1 + ethereum-cryptography: ^2.0.0 + micro-ftch: ^0.3.1 + checksum: 9ae5dee8f12b0faf81cd83f06a41560e79b0ba96a48262771d897a510ecae605eb6d84f687da001ab8ccffd50f612ae50f988ef76e6312c752897f462f3ac08d + languageName: node + linkType: hard + +"@ethersproject/abi@npm:5.7.0, @ethersproject/abi@npm:^5.0.9, @ethersproject/abi@npm:^5.1.2, @ethersproject/abi@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/abi@npm:5.7.0" + 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 + checksum: bc6962bb6cb854e4d2a4d65b2c49c716477675b131b1363312234bdbb7e19badb7d9ce66f4ca2a70ae2ea84f7123dbc4e300a1bfe5d58864a7eafabc1466627e + languageName: node + linkType: hard + +"@ethersproject/abstract-provider@npm:5.7.0, @ethersproject/abstract-provider@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/abstract-provider@npm:5.7.0" + 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 + checksum: 74cf4696245cf03bb7cc5b6cbf7b4b89dd9a79a1c4688126d214153a938126d4972d42c93182198653ce1de35f2a2cad68be40337d4774b3698a39b28f0228a8 + languageName: node + linkType: hard + +"@ethersproject/abstract-signer@npm:5.7.0, @ethersproject/abstract-signer@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/abstract-signer@npm:5.7.0" + 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 + checksum: a823dac9cfb761e009851050ebebd5b229d1b1cc4a75b125c2da130ff37e8218208f7f9d1386f77407705b889b23d4a230ad67185f8872f083143e0073cbfbe3 + languageName: node + linkType: hard + +"@ethersproject/address@npm:5.7.0, @ethersproject/address@npm:^5.0.2, @ethersproject/address@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/address@npm:5.7.0" + 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 + checksum: 64ea5ebea9cc0e845c413e6cb1e54e157dd9fc0dffb98e239d3a3efc8177f2ff798cd4e3206cf3660ee8faeb7bef1a47dc0ebef0d7b132c32e61e550c7d4c843 + languageName: node + linkType: hard + +"@ethersproject/base64@npm:5.7.0, @ethersproject/base64@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/base64@npm:5.7.0" + dependencies: + "@ethersproject/bytes": ^5.7.0 + checksum: 7dd5d734d623582f08f665434f53685041a3d3b334a0e96c0c8afa8bbcaab934d50e5b6b980e826a8fde8d353e0b18f11e61faf17468177274b8e7c69cd9742b + languageName: node + linkType: hard + +"@ethersproject/basex@npm:5.7.0, @ethersproject/basex@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/basex@npm:5.7.0" + dependencies: + "@ethersproject/bytes": ^5.7.0 + "@ethersproject/properties": ^5.7.0 + checksum: 326087b7e1f3787b5fe6cd1cf2b4b5abfafbc355a45e88e22e5e9d6c845b613ffc5301d629b28d5c4d5e2bfe9ec424e6782c804956dff79be05f0098cb5817de + languageName: node + linkType: hard + +"@ethersproject/bignumber@npm:5.7.0, @ethersproject/bignumber@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/bignumber@npm:5.7.0" + dependencies: + "@ethersproject/bytes": ^5.7.0 + "@ethersproject/logger": ^5.7.0 + bn.js: ^5.2.1 + checksum: 8c9a134b76f3feb4ec26a5a27379efb4e156b8fb2de0678a67788a91c7f4e30abe9d948638458e4b20f2e42380da0adacc7c9389d05fce070692edc6ae9b4904 + languageName: node + linkType: hard + +"@ethersproject/bytes@npm:5.7.0, @ethersproject/bytes@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/bytes@npm:5.7.0" + dependencies: + "@ethersproject/logger": ^5.7.0 + checksum: 66ad365ceaab5da1b23b72225c71dce472cf37737af5118181fa8ab7447d696bea15ca22e3a0e8836fdd8cfac161afe321a7c67d0dde96f9f645ddd759676621 + languageName: node + linkType: hard + +"@ethersproject/constants@npm:5.7.0, @ethersproject/constants@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/constants@npm:5.7.0" + dependencies: + "@ethersproject/bignumber": ^5.7.0 + checksum: 6d4b1355747cce837b3e76ec3bde70e4732736f23b04f196f706ebfa5d4d9c2be50904a390d4d40ce77803b98d03d16a9b6898418e04ba63491933ce08c4ba8a + languageName: node + linkType: hard + +"@ethersproject/contracts@npm:5.7.0, @ethersproject/contracts@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/contracts@npm:5.7.0" + 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 + checksum: 6ccf1121cba01b31e02f8c507cb971ab6bfed85706484a9ec09878ef1594a62215f43c4fdef8f4a4875b99c4a800bc95e3be69b1803f8ce479e07634b5a740c0 + languageName: node + linkType: hard + +"@ethersproject/hash@npm:5.7.0, @ethersproject/hash@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/hash@npm:5.7.0" + 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 + checksum: 6e9fa8d14eb08171cd32f17f98cc108ec2aeca74a427655f0d689c550fee0b22a83b3b400fad7fb3f41cf14d4111f87f170aa7905bcbcd1173a55f21b06262ef + languageName: node + linkType: hard + +"@ethersproject/hdnode@npm:5.7.0, @ethersproject/hdnode@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/hdnode@npm:5.7.0" + 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 + checksum: bfe5ca2d89a42de73655f853170ef4766b933c5f481cddad709b3aca18823275b096e572f92d1602a052f80b426edde44ad6b9d028799775a7dad4a5bbed2133 + languageName: node + linkType: hard + +"@ethersproject/json-wallets@npm:5.7.0, @ethersproject/json-wallets@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/json-wallets@npm:5.7.0" + 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 + checksum: f583458d22db62efaaf94d38dd243482776a45bf90f9f3882fbad5aa0b8fd288b41eb7c1ff8ec0b99c9b751088e43d6173530db64dd33c59f9d8daa8d7ad5aa2 + languageName: node + linkType: hard + +"@ethersproject/keccak256@npm:5.7.0, @ethersproject/keccak256@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/keccak256@npm:5.7.0" + dependencies: + "@ethersproject/bytes": ^5.7.0 + js-sha3: 0.8.0 + checksum: ff70950d82203aab29ccda2553422cbac2e7a0c15c986bd20a69b13606ed8bb6e4fdd7b67b8d3b27d4f841e8222cbaccd33ed34be29f866fec7308f96ed244c6 + languageName: node + linkType: hard + +"@ethersproject/logger@npm:5.7.0, @ethersproject/logger@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/logger@npm:5.7.0" + checksum: 075ab2f605f1fd0813f2e39c3308f77b44a67732b36e712d9bc085f22a84aac4da4f71b39bee50fe78da3e1c812673fadc41180c9970fe5e486e91ea17befe0d + languageName: node + linkType: hard + +"@ethersproject/networks@npm:5.7.1, @ethersproject/networks@npm:^5.7.0": + version: 5.7.1 + resolution: "@ethersproject/networks@npm:5.7.1" + dependencies: + "@ethersproject/logger": ^5.7.0 + checksum: 0339f312304c17d9a0adce550edb825d4d2c8c9468c1634c44172c67a9ed256f594da62c4cda5c3837a0f28b7fabc03aca9b492f68ff1fdad337ee861b27bd5d + languageName: node + linkType: hard + +"@ethersproject/pbkdf2@npm:5.7.0, @ethersproject/pbkdf2@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/pbkdf2@npm:5.7.0" + dependencies: + "@ethersproject/bytes": ^5.7.0 + "@ethersproject/sha2": ^5.7.0 + checksum: b895adb9e35a8a127e794f7aadc31a2424ef355a70e51cde10d457e3e888bb8102373199a540cf61f2d6b9a32e47358f9c65b47d559f42bf8e596b5fd67901e9 + languageName: node + linkType: hard + +"@ethersproject/properties@npm:5.7.0, @ethersproject/properties@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/properties@npm:5.7.0" + dependencies: + "@ethersproject/logger": ^5.7.0 + checksum: 6ab0ccf0c3aadc9221e0cdc5306ce6cd0df7f89f77d77bccdd1277182c9ead0202cd7521329ba3acde130820bf8af299e17cf567d0d497c736ee918207bbf59f + languageName: node + linkType: hard + +"@ethersproject/providers@npm:5.7.2, @ethersproject/providers@npm:^5.7.0, @ethersproject/providers@npm:^5.7.1, @ethersproject/providers@npm:^5.7.2": + version: 5.7.2 + resolution: "@ethersproject/providers@npm:5.7.2" + 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 + checksum: 1754c731a5ca6782ae9677f4a9cd8b6246c4ef21a966c9a01b133750f3c578431ec43ec254e699969c4a0f87e84463ded50f96b415600aabd37d2056aee58c19 + languageName: node + linkType: hard + +"@ethersproject/random@npm:5.7.0, @ethersproject/random@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/random@npm:5.7.0" + dependencies: + "@ethersproject/bytes": ^5.7.0 + "@ethersproject/logger": ^5.7.0 + checksum: 017829c91cff6c76470852855108115b0b52c611b6be817ed1948d56ba42d6677803ec2012aa5ae298a7660024156a64c11fcf544e235e239ab3f89f0fff7345 + languageName: node + linkType: hard + +"@ethersproject/rlp@npm:5.7.0, @ethersproject/rlp@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/rlp@npm:5.7.0" + dependencies: + "@ethersproject/bytes": ^5.7.0 + "@ethersproject/logger": ^5.7.0 + checksum: bce165b0f7e68e4d091c9d3cf47b247cac33252df77a095ca4281d32d5eeaaa3695d9bc06b2b057c5015353a68df89f13a4a54a72e888e4beeabbe56b15dda6e + languageName: node + linkType: hard + +"@ethersproject/sha2@npm:5.7.0, @ethersproject/sha2@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/sha2@npm:5.7.0" + dependencies: + "@ethersproject/bytes": ^5.7.0 + "@ethersproject/logger": ^5.7.0 + hash.js: 1.1.7 + checksum: 09321057c022effbff4cc2d9b9558228690b5dd916329d75c4b1ffe32ba3d24b480a367a7cc92d0f0c0b1c896814d03351ae4630e2f1f7160be2bcfbde435dbc + languageName: node + linkType: hard + +"@ethersproject/signing-key@npm:5.7.0, @ethersproject/signing-key@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/signing-key@npm:5.7.0" + 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 + checksum: 8f8de09b0aac709683bbb49339bc0a4cd2f95598f3546436c65d6f3c3a847ffa98e06d35e9ed2b17d8030bd2f02db9b7bd2e11c5cf8a71aad4537487ab4cf03a + languageName: node + linkType: hard + +"@ethersproject/solidity@npm:5.7.0, @ethersproject/solidity@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/solidity@npm:5.7.0" + 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 + checksum: 9a02f37f801c96068c3e7721f83719d060175bc4e80439fe060e92bd7acfcb6ac1330c7e71c49f4c2535ca1308f2acdcb01e00133129aac00581724c2d6293f3 + languageName: node + linkType: hard + +"@ethersproject/strings@npm:5.7.0, @ethersproject/strings@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/strings@npm:5.7.0" + dependencies: + "@ethersproject/bytes": ^5.7.0 + "@ethersproject/constants": ^5.7.0 + "@ethersproject/logger": ^5.7.0 + checksum: 5ff78693ae3fdf3cf23e1f6dc047a61e44c8197d2408c42719fef8cb7b7b3613a4eec88ac0ed1f9f5558c74fe0de7ae3195a29ca91a239c74b9f444d8e8b50df + languageName: node + linkType: hard + +"@ethersproject/transactions@npm:5.7.0, @ethersproject/transactions@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/transactions@npm:5.7.0" + 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 + checksum: a31b71996d2b283f68486241bff0d3ea3f1ba0e8f1322a8fffc239ccc4f4a7eb2ea9994b8fd2f093283fd75f87bae68171e01b6265261f821369aca319884a79 + languageName: node + linkType: hard + +"@ethersproject/units@npm:5.7.0": + version: 5.7.0 + resolution: "@ethersproject/units@npm:5.7.0" + dependencies: + "@ethersproject/bignumber": ^5.7.0 + "@ethersproject/constants": ^5.7.0 + "@ethersproject/logger": ^5.7.0 + checksum: 304714f848cd32e57df31bf545f7ad35c2a72adae957198b28cbc62166daa929322a07bff6e9c9ac4577ab6aa0de0546b065ed1b2d20b19e25748b7d475cb0fc + languageName: node + linkType: hard + +"@ethersproject/wallet@npm:5.7.0, @ethersproject/wallet@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/wallet@npm:5.7.0" + 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 + checksum: a4009bf7331eddab38e3015b5e9101ef92de7f705b00a6196b997db0e5635b6d83561674d46c90c6f77b87c0500fe4a6b0183ba13749efc22db59c99deb82fbd + languageName: node + linkType: hard + +"@ethersproject/web@npm:5.7.1, @ethersproject/web@npm:^5.7.0": + version: 5.7.1 + resolution: "@ethersproject/web@npm:5.7.1" + 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 + checksum: 7028c47103f82fd2e2c197ce0eecfacaa9180ffeec7de7845b1f4f9b19d84081b7a48227aaddde05a4aaa526af574a9a0ce01cc0fc75e3e371f84b38b5b16b2b + languageName: node + linkType: hard + +"@ethersproject/wordlists@npm:5.7.0, @ethersproject/wordlists@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/wordlists@npm:5.7.0" + 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 + checksum: 30eb6eb0731f9ef5faa44bf9c0c6e950bcaaef61e4d2d9ce0ae6d341f4e2d6d1f4ab4f8880bfce03b7aac4b862fb740e1421170cfbf8e2aafc359277d49e6e97 + languageName: node + linkType: hard + +"@fastify/busboy@npm:^2.0.0": + version: 2.1.1 + resolution: "@fastify/busboy@npm:2.1.1" + checksum: 42c32ef75e906c9a4809c1e1930a5ca6d4ddc8d138e1a8c8ba5ea07f997db32210617d23b2e4a85fe376316a41a1a0439fc6ff2dedf5126d96f45a9d80754fb2 + languageName: node + linkType: hard + +"@gnosis/hashi-common@0.1.0, @gnosis/hashi-common@workspace:packages/common": + version: 0.0.0-use.local + resolution: "@gnosis/hashi-common@workspace:packages/common" + dependencies: + "@types/node": ^20.8.9 + "@typescript-eslint/eslint-plugin": ^6.7.5 + "@typescript-eslint/parser": ^6.7.5 + eslint: ^8.51.0 + eslint-config-prettier: ^9.0.0 + prettier: ^3.0.3 + ts-node: ^10.9.1 + typescript: ^5.2.2 + viem: ^2.9.28 + winston: ^3.11.0 + languageName: unknown + linkType: soft + +"@gnosis/hashi-evm@workspace:packages/evm": + version: 0.0.0-use.local + resolution: "@gnosis/hashi-evm@workspace:packages/evm" + dependencies: + "@axelar-network/axelar-gmp-sdk-solidity": 5.6.2 + "@chainlink/contracts-ccip": 0.7.6 + "@commitlint/cli": ^17.3.0 + "@commitlint/config-conventional": ^17.3.0 + "@connext/interfaces": 2.0.0 + "@ethersproject/abi": ^5.7.0 + "@ethersproject/abstract-signer": ^5.7.0 + "@ethersproject/bignumber": ^5.7.0 + "@ethersproject/bytes": ^5.7.0 + "@ethersproject/providers": ^5.7.2 + "@hyperlane-xyz/core": 3.1.10 + "@nomicfoundation/hardhat-chai-matchers": ^1.0.4 + "@nomicfoundation/hardhat-network-helpers": ^1.0.8 + "@nomicfoundation/hardhat-toolbox": ^2.0.0 + "@nomiclabs/hardhat-ethers": ^2.2.1 + "@nomiclabs/hardhat-etherscan": ^3.1.2 + "@openzeppelin/contracts-upgradeable": 4.8.1 + "@polytope-labs/ismp-solidity": ^0.6.4 + "@polytope-labs/solidity-merkle-trees": 0.3.2 + "@routerprotocol/evm-gateway-contracts": 1.1.13 + "@trivago/prettier-plugin-sort-imports": ^4.0.0 + "@typechain/ethers-v5": ^10.1.1 + "@typechain/hardhat": ^6.1.4 + "@types/chai": ^4.3.4 + "@types/fs-extra": ^9.0.13 + "@types/mocha": ^10.0.0 + "@types/node": ^18.11.9 + "@typescript-eslint/eslint-plugin": ^5.44.0 + "@typescript-eslint/parser": ^5.44.0 + chai: ^4.3.7 + commitizen: ^4.2.5 + cross-env: ^7.0.3 + cz-conventional-changelog: ^3.3.0 + dotenv: ^16.0.3 + eslint: ^8.28.0 + eslint-config-prettier: ^8.5.0 + ethers: ^5.7.2 + fs-extra: ^10.1.0 + hardhat: 2.19.4 + hardhat-change-network: ^0.0.7 + hardhat-deploy: ^0.11.31 + hardhat-gas-reporter: ^1.0.9 + lint-staged: ^13.0.4 + lodash: ^4.17.21 + mocha: ^10.1.0 + pinst: ^3.0.0 + prettier: ^2.8.7 + prettier-plugin-solidity: ^1.0.0 + shx: ^0.3.4 + solhint: ^3.3.7 + solhint-plugin-prettier: ^0.0.5 + solidity-coverage: ^0.8.2 + solidity-rlp: 2.0.8 + ts-generator: ^0.1.1 + ts-node: ^10.9.1 + typechain: ^8.1.1 + typescript: ^4.9.3 + languageName: unknown + linkType: soft + +"@gnosis/hashi-executor@workspace:packages/executor": + version: 0.0.0-use.local + resolution: "@gnosis/hashi-executor@workspace:packages/executor" + dependencies: + "@gnosis/hashi-common": 0.1.0 + "@types/node": ^20.8.9 + "@typescript-eslint/eslint-plugin": ^6.7.5 + "@typescript-eslint/parser": ^6.7.5 + dotenv: ^16.3.1 + eslint: ^8.51.0 + eslint-config-prettier: ^9.0.0 + mongodb: 6.5.0 + nodemon: ^3.0.1 + prettier: ^3.0.3 + ts-node: ^10.9.1 + typescript: ^5.2.2 + viem: ^2.9.28 + winston: ^3.11.0 + languageName: unknown + linkType: soft + +"@gnosis/hashi-relayer@workspace:packages/relayer": + version: 0.0.0-use.local + resolution: "@gnosis/hashi-relayer@workspace:packages/relayer" + dependencies: + "@gnosis/hashi-common": 0.1.0 + "@types/node": ^20.8.9 + "@typescript-eslint/eslint-plugin": ^6.7.5 + "@typescript-eslint/parser": ^6.7.5 + dotenv: ^16.3.1 + eslint: ^8.51.0 + eslint-config-prettier: ^9.0.0 + mongodb: 6.5.0 + nodemon: ^3.0.1 + prettier: ^3.0.3 + ts-node: ^10.9.1 + typescript: ^5.2.2 + viem: ^2.9.28 + winston: ^3.11.0 + languageName: unknown + linkType: soft + +"@humanwhocodes/config-array@npm:^0.11.14": + version: 0.11.14 + resolution: "@humanwhocodes/config-array@npm:0.11.14" + dependencies: + "@humanwhocodes/object-schema": ^2.0.2 + debug: ^4.3.1 + minimatch: ^3.0.5 + checksum: 861ccce9eaea5de19546653bccf75bf09fe878bc39c3aab00aeee2d2a0e654516adad38dd1098aab5e3af0145bbcbf3f309bdf4d964f8dab9dcd5834ae4c02f2 + languageName: node + linkType: hard + +"@humanwhocodes/module-importer@npm:^1.0.1": + version: 1.0.1 + resolution: "@humanwhocodes/module-importer@npm:1.0.1" + checksum: 0fd22007db8034a2cdf2c764b140d37d9020bbfce8a49d3ec5c05290e77d4b0263b1b972b752df8c89e5eaa94073408f2b7d977aed131faf6cf396ebb5d7fb61 + languageName: node + linkType: hard + +"@humanwhocodes/object-schema@npm:^2.0.2": + version: 2.0.3 + resolution: "@humanwhocodes/object-schema@npm:2.0.3" + checksum: d3b78f6c5831888c6ecc899df0d03bcc25d46f3ad26a11d7ea52944dc36a35ef543fad965322174238d677a43d5c694434f6607532cff7077062513ad7022631 + languageName: node + linkType: hard + +"@hyperlane-xyz/core@npm:3.1.10": + version: 3.1.10 + resolution: "@hyperlane-xyz/core@npm:3.1.10" + dependencies: + "@eth-optimism/contracts": ^0.6.0 + "@hyperlane-xyz/utils": 3.1.10 + "@openzeppelin/contracts": ^4.9.3 + "@openzeppelin/contracts-upgradeable": ^v4.9.3 + peerDependencies: + "@ethersproject/abi": "*" + "@ethersproject/providers": "*" + "@types/sinon-chai": "*" + checksum: af099ebb9d4615ab7ce89ab0611563cbe9699a405161e3ce67b4ab203ea65bff4148e0c46eaecacc9698525d2d591fe55198c7692f8008e828e199b5de2630fd + languageName: node + linkType: hard + +"@hyperlane-xyz/utils@npm:3.1.10": + version: 3.1.10 + resolution: "@hyperlane-xyz/utils@npm:3.1.10" + dependencies: + "@cosmjs/encoding": ^0.31.3 + "@solana/web3.js": ^1.78.0 + bignumber.js: ^9.1.1 + ethers: ^5.7.2 + checksum: c549a3a73f6c4e666f0344bf5443cac07a8aea4039e2af13adc26c430d81f68d7254f3d3a5d18bcdf30f6ea41ea5ab1c7f723f81ae23bad36ee1292c290247c9 + languageName: node + linkType: hard + +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: ^5.1.2 + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: ^7.0.1 + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: ^8.1.0 + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: 4a473b9b32a7d4d3cfb7a614226e555091ff0c5a29a1734c28c72a182c2f6699b26fc6b5c2131dfd841e86b185aea714c72201d7c98c2fba5f17709333a67aeb + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.5 + resolution: "@jridgewell/gen-mapping@npm:0.3.5" + dependencies: + "@jridgewell/set-array": ^1.2.1 + "@jridgewell/sourcemap-codec": ^1.4.10 + "@jridgewell/trace-mapping": ^0.3.24 + checksum: ff7a1764ebd76a5e129c8890aa3e2f46045109dabde62b0b6c6a250152227647178ff2069ea234753a690d8f3c4ac8b5e7b267bbee272bffb7f3b0a370ab6e52 + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.0.3, @jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 83b85f72c59d1c080b4cbec0fef84528963a1b5db34e4370fa4bd1e3ff64a0d80e0cee7369d11d73c704e0286fb2865b530acac7a871088fbe92b5edf1000870 + languageName: node + linkType: hard + +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 832e513a85a588f8ed4f27d1279420d8547743cc37fcad5a5a76fc74bb895b013dfe614d0eed9cb860048e6546b798f8f2652020b4b2ba0561b05caa8c654b10 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": + version: 1.5.0 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" + checksum: 05df4f2538b3b0f998ea4c1cd34574d0feba216fa5d4ccaef0187d12abf82eafe6021cec8b49f9bb4d90f2ba4582ccc581e72986a5fcf4176ae0cfeb04cf52ec + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:0.3.9": + version: 0.3.9 + resolution: "@jridgewell/trace-mapping@npm:0.3.9" + dependencies: + "@jridgewell/resolve-uri": ^3.0.3 + "@jridgewell/sourcemap-codec": ^1.4.10 + checksum: d89597752fd88d3f3480845691a05a44bd21faac18e2185b6f436c3b0fd0c5a859fbbd9aaa92050c4052caf325ad3e10e2e1d1b64327517471b7d51babc0ddef + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" + dependencies: + "@jridgewell/resolve-uri": ^3.1.0 + "@jridgewell/sourcemap-codec": ^1.4.14 + checksum: 9d3c40d225e139987b50c48988f8717a54a8c994d8a948ee42e1412e08988761d0754d7d10b803061cc3aebf35f92a5dbbab493bd0e1a9ef9e89a2130e83ba34 + languageName: node + linkType: hard + +"@metamask/eth-sig-util@npm:^4.0.0": + version: 4.0.1 + resolution: "@metamask/eth-sig-util@npm:4.0.1" + dependencies: + ethereumjs-abi: ^0.6.8 + ethereumjs-util: ^6.2.1 + ethjs-util: ^0.1.6 + tweetnacl: ^1.0.3 + tweetnacl-util: ^0.15.1 + checksum: 740df4c92a1282e6be4c00c86c1a8ccfb93e767596e43f6da895aa5bab4a28fc3c2209f0327db34924a4a1e9db72bc4d3dddfcfc45cca0b218c9ccbf7d1b1445 + languageName: node + linkType: hard + +"@mongodb-js/saslprep@npm:^1.1.5": + version: 1.1.9 + resolution: "@mongodb-js/saslprep@npm:1.1.9" + dependencies: + sparse-bitfield: ^3.0.3 + checksum: 6f13983e41c9fbd5273eeae9135e47e5b7a19125a63287bea69e33a618f8e034cfcf2258c77d0f5d6dcf386dfe2bb520bc01613afd1528c52f82c71172629242 + languageName: node + linkType: hard + +"@noble/curves@npm:1.2.0": + version: 1.2.0 + resolution: "@noble/curves@npm:1.2.0" + dependencies: + "@noble/hashes": 1.3.2 + checksum: bb798d7a66d8e43789e93bc3c2ddff91a1e19fdb79a99b86cd98f1e5eff0ee2024a2672902c2576ef3577b6f282f3b5c778bebd55761ddbb30e36bf275e83dd0 + languageName: node + linkType: hard + +"@noble/curves@npm:1.4.0": + version: 1.4.0 + resolution: "@noble/curves@npm:1.4.0" + dependencies: + "@noble/hashes": 1.4.0 + checksum: 0014ff561d16e98da4a57e2310a4015e4bdab3b1e1eafcd18d3f9b955c29c3501452ca5d702fddf8ca92d570bbeadfbe53fe16ebbd81a319c414f739154bb26b + languageName: node + linkType: hard + +"@noble/curves@npm:1.4.2, @noble/curves@npm:~1.4.0": + version: 1.4.2 + resolution: "@noble/curves@npm:1.4.2" + dependencies: + "@noble/hashes": 1.4.0 + checksum: c475a83c4263e2c970eaba728895b9b5d67e0ca880651e9c6e3efdc5f6a4f07ceb5b043bf71c399fc80fada0b8706e69d0772bffdd7b9de2483b988973a34cba + languageName: node + linkType: hard + +"@noble/curves@npm:^1.4.0, @noble/curves@npm:^1.4.2": + version: 1.6.0 + resolution: "@noble/curves@npm:1.6.0" + dependencies: + "@noble/hashes": 1.5.0 + checksum: 258f3feb2a6098cf35521562ecb7d452fd728e8a008ff9f1ef435184f9d0c782ceb8f7b7fa8df3317c3be7a19f53995ee124cd05c8080b130bd42e3cb072f24d + languageName: node + linkType: hard + +"@noble/hashes@npm:1.2.0, @noble/hashes@npm:~1.2.0": + version: 1.2.0 + resolution: "@noble/hashes@npm:1.2.0" + checksum: 8ca080ce557b8f40fb2f78d3aedffd95825a415ac8e13d7ffe3643f8626a8c2d99a3e5975b555027ac24316d8b3c02a35b8358567c0c23af681e6573602aa434 + languageName: node + linkType: hard + +"@noble/hashes@npm:1.3.2": + version: 1.3.2 + resolution: "@noble/hashes@npm:1.3.2" + checksum: fe23536b436539d13f90e4b9be843cc63b1b17666a07634a2b1259dded6f490be3d050249e6af98076ea8f2ea0d56f578773c2197f2aa0eeaa5fba5bc18ba474 + languageName: node + linkType: hard + +"@noble/hashes@npm:1.4.0, @noble/hashes@npm:~1.4.0": + version: 1.4.0 + resolution: "@noble/hashes@npm:1.4.0" + checksum: 8ba816ae26c90764b8c42493eea383716396096c5f7ba6bea559993194f49d80a73c081f315f4c367e51bd2d5891700bcdfa816b421d24ab45b41cb03e4f3342 + languageName: node + linkType: hard + +"@noble/hashes@npm:1.5.0, @noble/hashes@npm:^1.4.0, @noble/hashes@npm:~1.5.0": + version: 1.5.0 + resolution: "@noble/hashes@npm:1.5.0" + checksum: 9cc031d5c888c455bfeef76af649b87f75380a4511405baea633c1e4912fd84aff7b61e99716f0231d244c9cfeda1fafd7d718963e6a0c674ed705e9b1b4f76b + languageName: node + linkType: hard + +"@noble/secp256k1@npm:1.7.1, @noble/secp256k1@npm:~1.7.0": + version: 1.7.1 + resolution: "@noble/secp256k1@npm:1.7.1" + checksum: d2301f1f7690368d8409a3152450458f27e54df47e3f917292de3de82c298770890c2de7c967d237eff9c95b70af485389a9695f73eb05a43e2bd562d18b18cb + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": 2.0.5 + run-parallel: ^1.1.9 + checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59 + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": 2.1.5 + fastq: ^1.6.0 + checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53 + languageName: node + linkType: hard + +"@nomicfoundation/ethereumjs-block@npm:5.0.2": + version: 5.0.2 + resolution: "@nomicfoundation/ethereumjs-block@npm:5.0.2" + dependencies: + "@nomicfoundation/ethereumjs-common": 4.0.2 + "@nomicfoundation/ethereumjs-rlp": 5.0.2 + "@nomicfoundation/ethereumjs-trie": 6.0.2 + "@nomicfoundation/ethereumjs-tx": 5.0.2 + "@nomicfoundation/ethereumjs-util": 9.0.2 + ethereum-cryptography: 0.1.3 + ethers: ^5.7.1 + checksum: 7ff744f44a01f1c059ca7812a1cfc8089f87aa506af6cb39c78331dca71b32993cbd6fa05ad03f8c4f4fab73bb998a927af69e0d8ff01ae192ee5931606e09f5 + languageName: node + linkType: hard + +"@nomicfoundation/ethereumjs-blockchain@npm:7.0.2": + version: 7.0.2 + resolution: "@nomicfoundation/ethereumjs-blockchain@npm:7.0.2" + dependencies: + "@nomicfoundation/ethereumjs-block": 5.0.2 + "@nomicfoundation/ethereumjs-common": 4.0.2 + "@nomicfoundation/ethereumjs-ethash": 3.0.2 + "@nomicfoundation/ethereumjs-rlp": 5.0.2 + "@nomicfoundation/ethereumjs-trie": 6.0.2 + "@nomicfoundation/ethereumjs-tx": 5.0.2 + "@nomicfoundation/ethereumjs-util": 9.0.2 + abstract-level: ^1.0.3 + debug: ^4.3.3 + ethereum-cryptography: 0.1.3 + level: ^8.0.0 + lru-cache: ^5.1.1 + memory-level: ^1.0.0 + checksum: b7e440dcd73e32aa72d13bfd28cb472773c9c60ea808a884131bf7eb3f42286ad594a0864215f599332d800f3fe1f772fff4b138d2dcaa8f41e4d8389bff33e7 + languageName: node + linkType: hard + +"@nomicfoundation/ethereumjs-common@npm:4.0.2": + version: 4.0.2 + resolution: "@nomicfoundation/ethereumjs-common@npm:4.0.2" + dependencies: + "@nomicfoundation/ethereumjs-util": 9.0.2 + crc-32: ^1.2.0 + checksum: f0d84704d6254d374299c19884312bd5666974b4b6f342d3f10bc76e549de78d20e45a53d25fbdc146268a52335497127e4f069126da7c60ac933a158e704887 + languageName: node + linkType: hard + +"@nomicfoundation/ethereumjs-ethash@npm:3.0.2": + version: 3.0.2 + resolution: "@nomicfoundation/ethereumjs-ethash@npm:3.0.2" + dependencies: + "@nomicfoundation/ethereumjs-block": 5.0.2 + "@nomicfoundation/ethereumjs-rlp": 5.0.2 + "@nomicfoundation/ethereumjs-util": 9.0.2 + abstract-level: ^1.0.3 + bigint-crypto-utils: ^3.0.23 + ethereum-cryptography: 0.1.3 + checksum: e4011e4019dd9b92f7eeebfc1e6c9a9685c52d8fd0ee4f28f03e50048a23b600c714490827f59fdce497b3afb503b3fd2ebf6815ff307e9949c3efeff1403278 + languageName: node + linkType: hard + +"@nomicfoundation/ethereumjs-evm@npm:2.0.2": + version: 2.0.2 + resolution: "@nomicfoundation/ethereumjs-evm@npm:2.0.2" + dependencies: + "@ethersproject/providers": ^5.7.1 + "@nomicfoundation/ethereumjs-common": 4.0.2 + "@nomicfoundation/ethereumjs-tx": 5.0.2 + "@nomicfoundation/ethereumjs-util": 9.0.2 + debug: ^4.3.3 + ethereum-cryptography: 0.1.3 + mcl-wasm: ^0.7.1 + rustbn.js: ~0.2.0 + checksum: a23cf570836ddc147606b02df568069de946108e640f902358fef67e589f6b371d856056ee44299d9b4e3497f8ae25faa45e6b18fefd90e9b222dc6a761d85f0 + languageName: node + linkType: hard + +"@nomicfoundation/ethereumjs-rlp@npm:5.0.2": + version: 5.0.2 + resolution: "@nomicfoundation/ethereumjs-rlp@npm:5.0.2" + bin: + rlp: bin/rlp + checksum: a74434cadefca9aa8754607cc1ad7bb4bbea4ee61c6214918e60a5bbee83206850346eb64e39fd1fe97f854c7ec0163e01148c0c881dda23881938f0645a0ef2 + languageName: node + linkType: hard + +"@nomicfoundation/ethereumjs-statemanager@npm:2.0.2": + version: 2.0.2 + resolution: "@nomicfoundation/ethereumjs-statemanager@npm:2.0.2" + dependencies: + "@nomicfoundation/ethereumjs-common": 4.0.2 + "@nomicfoundation/ethereumjs-rlp": 5.0.2 + debug: ^4.3.3 + ethereum-cryptography: 0.1.3 + ethers: ^5.7.1 + js-sdsl: ^4.1.4 + checksum: 3ab6578e252e53609afd98d8ba42a99f182dcf80252f23ed9a5e0471023ffb2502130f85fc47fa7c94cd149f9be799ed9a0942ca52a143405be9267f4ad94e64 + languageName: node + linkType: hard + +"@nomicfoundation/ethereumjs-trie@npm:6.0.2": + version: 6.0.2 + resolution: "@nomicfoundation/ethereumjs-trie@npm:6.0.2" + dependencies: + "@nomicfoundation/ethereumjs-rlp": 5.0.2 + "@nomicfoundation/ethereumjs-util": 9.0.2 + "@types/readable-stream": ^2.3.13 + ethereum-cryptography: 0.1.3 + readable-stream: ^3.6.0 + checksum: d4da918d333851b9f2cce7dbd25ab5753e0accd43d562d98fd991b168b6a08d1794528f0ade40fe5617c84900378376fe6256cdbe52c8d66bf4c53293bbc7c40 + languageName: node + linkType: hard + +"@nomicfoundation/ethereumjs-tx@npm:5.0.2": + version: 5.0.2 + resolution: "@nomicfoundation/ethereumjs-tx@npm:5.0.2" + dependencies: + "@chainsafe/ssz": ^0.9.2 + "@ethersproject/providers": ^5.7.2 + "@nomicfoundation/ethereumjs-common": 4.0.2 + "@nomicfoundation/ethereumjs-rlp": 5.0.2 + "@nomicfoundation/ethereumjs-util": 9.0.2 + ethereum-cryptography: 0.1.3 + checksum: 0bbcea75786b2ccb559afe2ecc9866fb4566a9f157b6ffba4f50960d14f4b3da2e86e273f6fadda9b860e67cfcabf589970fb951b328cb5f900a585cd21842a2 + languageName: node + linkType: hard + +"@nomicfoundation/ethereumjs-util@npm:9.0.2": + version: 9.0.2 + resolution: "@nomicfoundation/ethereumjs-util@npm:9.0.2" + dependencies: + "@chainsafe/ssz": ^0.10.0 + "@nomicfoundation/ethereumjs-rlp": 5.0.2 + ethereum-cryptography: 0.1.3 + checksum: 3a08f7b88079ef9f53b43da9bdcb8195498fd3d3911c2feee2571f4d1204656053f058b2f650471c86f7d2d0ba2f814768c7cfb0f266eede41c848356afc4900 + languageName: node + linkType: hard + +"@nomicfoundation/ethereumjs-vm@npm:7.0.2": + version: 7.0.2 + resolution: "@nomicfoundation/ethereumjs-vm@npm:7.0.2" + dependencies: + "@nomicfoundation/ethereumjs-block": 5.0.2 + "@nomicfoundation/ethereumjs-blockchain": 7.0.2 + "@nomicfoundation/ethereumjs-common": 4.0.2 + "@nomicfoundation/ethereumjs-evm": 2.0.2 + "@nomicfoundation/ethereumjs-rlp": 5.0.2 + "@nomicfoundation/ethereumjs-statemanager": 2.0.2 + "@nomicfoundation/ethereumjs-trie": 6.0.2 + "@nomicfoundation/ethereumjs-tx": 5.0.2 + "@nomicfoundation/ethereumjs-util": 9.0.2 + debug: ^4.3.3 + ethereum-cryptography: 0.1.3 + mcl-wasm: ^0.7.1 + rustbn.js: ~0.2.0 + checksum: 1c25ba4d0644cadb8a2b0241a4bb02e578bfd7f70e3492b855c2ab5c120cb159cb8f7486f84dc1597884bd1697feedbfb5feb66e91352afb51f3694fd8e4a043 + languageName: node + linkType: hard + +"@nomicfoundation/hardhat-chai-matchers@npm:^1.0.4": + version: 1.0.6 + resolution: "@nomicfoundation/hardhat-chai-matchers@npm:1.0.6" + dependencies: + "@ethersproject/abi": ^5.1.2 + "@types/chai-as-promised": ^7.1.3 + chai-as-promised: ^7.1.1 + deep-eql: ^4.0.1 + ordinal: ^1.0.3 + peerDependencies: + "@nomiclabs/hardhat-ethers": ^2.0.0 + chai: ^4.2.0 + ethers: ^5.0.0 + hardhat: ^2.9.4 + checksum: c388e5ed9068f2ba7c227737ab7312dd03405d5fab195247b061f2fa52e700fbd0fb65359c2d4f2086f2905bfca642c19a9122d034533edd936f89aea65ac7f2 + languageName: node + linkType: hard + +"@nomicfoundation/hardhat-network-helpers@npm:^1.0.8": + version: 1.0.11 + resolution: "@nomicfoundation/hardhat-network-helpers@npm:1.0.11" + dependencies: + ethereumjs-util: ^7.1.4 + peerDependencies: + hardhat: ^2.9.5 + checksum: b1566de2b0ff6de0fa825b13befd9a3318538e45c2d7e54b52dbf724b9ea5019365f1cf6962f4b89313747da847b575692783cfe03b60dbff3a2e419e135c3fb + languageName: node + linkType: hard + +"@nomicfoundation/hardhat-toolbox@npm:^2.0.0": + version: 2.0.2 + resolution: "@nomicfoundation/hardhat-toolbox@npm:2.0.2" + peerDependencies: + "@ethersproject/abi": ^5.4.7 + "@ethersproject/providers": ^5.4.7 + "@nomicfoundation/hardhat-chai-matchers": ^1.0.0 + "@nomicfoundation/hardhat-network-helpers": ^1.0.0 + "@nomiclabs/hardhat-ethers": ^2.0.0 + "@nomiclabs/hardhat-etherscan": ^3.0.0 + "@typechain/ethers-v5": ^10.1.0 + "@typechain/hardhat": ^6.1.2 + "@types/chai": ^4.2.0 + "@types/mocha": ">=9.1.0" + "@types/node": ">=12.0.0" + chai: ^4.2.0 + ethers: ^5.4.7 + hardhat: ^2.11.0 + hardhat-gas-reporter: ^1.0.8 + solidity-coverage: ^0.8.1 + ts-node: ">=8.0.0" + typechain: ^8.1.0 + typescript: ">=4.5.0" + checksum: a2eafb709acbabe40de4871c4e8684a03098f045dba4fc6c6e9281358d072f386a668488c109e2a36b8eade01dc4c4f9e8a76fa45c92591857c590c6e19f1ae7 + languageName: node + linkType: hard + +"@nomicfoundation/solidity-analyzer-darwin-arm64@npm:0.1.2": + version: 0.1.2 + resolution: "@nomicfoundation/solidity-analyzer-darwin-arm64@npm:0.1.2" + checksum: 5bf3cf3f88e39d7b684f0ca75621b794b62e2676eb63c6977e847acc9c827bdc132143cc84e46be2797b93edc522f2c6f85bf5501fd7b8c85b346fb27e4dd488 + languageName: node + linkType: hard + +"@nomicfoundation/solidity-analyzer-darwin-x64@npm:0.1.2": + version: 0.1.2 + resolution: "@nomicfoundation/solidity-analyzer-darwin-x64@npm:0.1.2" + checksum: 8061dc7749d97409ccde4a2e529316c29f83f2d07c78ffea87803777229e2a7d967bbb8bda564903ab5e9e89ad3b46cbcb060621209d1c6e4212c4b1b096c076 + languageName: node + linkType: hard + +"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@npm:0.1.2": + version: 0.1.2 + resolution: "@nomicfoundation/solidity-analyzer-linux-arm64-gnu@npm:0.1.2" + checksum: 46111d18446ea5d157628c202d1ee1fc3444b32a0e3aa24337bbb407653606a79a3b199bf1e5fe5f74c5c78833cf243e492f20ab6a1503137e89f2236b3ecfe7 + languageName: node + linkType: hard + +"@nomicfoundation/solidity-analyzer-linux-arm64-musl@npm:0.1.2": + version: 0.1.2 + resolution: "@nomicfoundation/solidity-analyzer-linux-arm64-musl@npm:0.1.2" + checksum: 588e81e7b36cbe80b9d2c502dc2db4bf8706732bcea6906b79bac202eb441fa2f4b9f703c30d82a17ed2a4402eaf038057fb14fc1c16eac5ade103ff9b085cdc + languageName: node + linkType: hard + +"@nomicfoundation/solidity-analyzer-linux-x64-gnu@npm:0.1.2": + version: 0.1.2 + resolution: "@nomicfoundation/solidity-analyzer-linux-x64-gnu@npm:0.1.2" + checksum: 26f8307bde4a2c7609d297f2af6a50cad87aa46e914326b09d5cb424b4f45f0f75e982f9fcb9ee3361a2f9b141fcc9c10a665ddbc9686e01b017c639fbfb500b + languageName: node + linkType: hard + +"@nomicfoundation/solidity-analyzer-linux-x64-musl@npm:0.1.2": + version: 0.1.2 + resolution: "@nomicfoundation/solidity-analyzer-linux-x64-musl@npm:0.1.2" + checksum: d3628bae4f04bcdb2f1dec1d6790cdf97812e7e5c0a426f4227acc97883fa3165017a800375237e36bc588f0fb4971b0936a372869a801a97f42336ee4e42feb + languageName: node + linkType: hard + +"@nomicfoundation/solidity-analyzer-win32-x64-msvc@npm:0.1.2": + version: 0.1.2 + resolution: "@nomicfoundation/solidity-analyzer-win32-x64-msvc@npm:0.1.2" + checksum: 4a7d34d8419608cc343b6c028e07bd9ec72fd4ab82ccd36807ccf0fc8ad708b8d5baae9121532073ef08b2deb24d9c3a6f7b627c26f91f2a7de0cdb7024238f1 + languageName: node + linkType: hard + +"@nomicfoundation/solidity-analyzer@npm:^0.1.0": + version: 0.1.2 + resolution: "@nomicfoundation/solidity-analyzer@npm:0.1.2" + dependencies: + "@nomicfoundation/solidity-analyzer-darwin-arm64": 0.1.2 + "@nomicfoundation/solidity-analyzer-darwin-x64": 0.1.2 + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": 0.1.2 + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": 0.1.2 + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": 0.1.2 + "@nomicfoundation/solidity-analyzer-linux-x64-musl": 0.1.2 + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": 0.1.2 + dependenciesMeta: + "@nomicfoundation/solidity-analyzer-darwin-arm64": + optional: true + "@nomicfoundation/solidity-analyzer-darwin-x64": + optional: true + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": + optional: true + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": + optional: true + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": + optional: true + "@nomicfoundation/solidity-analyzer-linux-x64-musl": + optional: true + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": + optional: true + checksum: 0de3a317658345b9012285665bb4c810a98b3668bcf32a118912fda00e5760fa2c77d0a92bce6b687dcc7b4bb34b0a83f8e6748bfa68660a2303d781ca728aef + languageName: node + linkType: hard + +"@nomiclabs/hardhat-ethers@npm:^2.2.1": + version: 2.2.3 + resolution: "@nomiclabs/hardhat-ethers@npm:2.2.3" + peerDependencies: + ethers: ^5.0.0 + hardhat: ^2.0.0 + checksum: 72321317e55eb510306e04c42353c5f7ceb42d086fc76cc740120da6e1635b7ad5bbf23a8d6b02bd590754adcf646618933111624085ab249b1ff3482e773226 + languageName: node + linkType: hard + +"@nomiclabs/hardhat-etherscan@npm:^3.1.2": + version: 3.1.8 + resolution: "@nomiclabs/hardhat-etherscan@npm:3.1.8" + dependencies: + "@ethersproject/abi": ^5.1.2 + "@ethersproject/address": ^5.0.2 + cbor: ^8.1.0 + chalk: ^2.4.2 + debug: ^4.1.1 + fs-extra: ^7.0.1 + lodash: ^4.17.11 + semver: ^6.3.0 + table: ^6.8.0 + undici: ^5.14.0 + peerDependencies: + hardhat: ^2.0.4 + checksum: 13864380d104705a54668adf2fb37a87d1147a064c1d29dbc356390e7254d5c7501b9b3af9c4ec2f9d9ff642a01417d5d35970d626fe706f5f4830820ae89ecb + languageName: node + linkType: hard + +"@npmcli/agent@npm:^2.0.0": + version: 2.2.2 + resolution: "@npmcli/agent@npm:2.2.2" + dependencies: + agent-base: ^7.1.0 + http-proxy-agent: ^7.0.0 + https-proxy-agent: ^7.0.1 + lru-cache: ^10.0.1 + socks-proxy-agent: ^8.0.3 + checksum: 67de7b88cc627a79743c88bab35e023e23daf13831a8aa4e15f998b92f5507b644d8ffc3788afc8e64423c612e0785a6a92b74782ce368f49a6746084b50d874 + languageName: node + linkType: hard + +"@npmcli/fs@npm:^3.1.0": + version: 3.1.1 + resolution: "@npmcli/fs@npm:3.1.1" + dependencies: + semver: ^7.3.5 + checksum: d960cab4b93adcb31ce223bfb75c5714edbd55747342efb67dcc2f25e023d930a7af6ece3e75f2f459b6f38fc14d031c766f116cd124fdc937fd33112579e820 + languageName: node + linkType: hard "@openzeppelin/contracts-upgradeable-4.7.3@npm:@openzeppelin/contracts-upgradeable@v4.7.3": - version "4.7.3" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.7.3.tgz#f1d606e2827d409053f3e908ba4eb8adb1dd6995" - integrity sha512-+wuegAMaLcZnLCJIvrVUDzA9z/Wp93f0Dla/4jJvIhijRrPabjQbZe6fWiECLaJyfn5ci9fqf9vTw3xpQOad2A== - -"@openzeppelin/contracts-upgradeable@4.8.1": - version "4.8.1" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.8.1.tgz#363f7dd08f25f8f77e16d374350c3d6b43340a7a" - integrity sha512-1wTv+20lNiC0R07jyIAbHU7TNHKRwGiTGRfiNnA8jOWjKT98g5OgLpYWOi40Vgpk8SPLA9EvfJAbAeIyVn+7Bw== - -"@openzeppelin/contracts-upgradeable@^4.7.3", "@openzeppelin/contracts-upgradeable@^v4.9.3": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.6.tgz#38b21708a719da647de4bb0e4802ee235a0d24df" - integrity sha512-m4iHazOsOCv1DgM7eD7GupTJ+NFVujRZt1wzddDPSVGpWdKq1SKkla5htKG7+IS4d2XOCtzkUNwRZ7Vq5aEUMA== + version: 4.7.3 + resolution: "@openzeppelin/contracts-upgradeable@npm:4.7.3" + checksum: c9ffb40cb847a975d440204fc6a811f43af960050242f707332b984d29bd16dc242ffa0935de61867aeb9e0357fadedb16b09b276deda5e9775582face831021 + languageName: node + linkType: hard + +"@openzeppelin/contracts-upgradeable@npm:4.8.1": + version: 4.8.1 + resolution: "@openzeppelin/contracts-upgradeable@npm:4.8.1" + checksum: 6af2fbddf263214c02d80430b218cb3ca8482e77b1cc070d07ca4f79d42460941e7ea1bb89a096bd292841040652e10d779b491cd19c201008d92e9e689d9000 + languageName: node + linkType: hard + +"@openzeppelin/contracts-upgradeable@npm:^4.7.3, @openzeppelin/contracts-upgradeable@npm:^v4.9.3": + version: 4.9.6 + resolution: "@openzeppelin/contracts-upgradeable@npm:4.9.6" + checksum: 481075e7222cab025ae55304263fca69a2d04305521957bc16d2aece9fa2b86b6914711724822493e3d04df7e793469cd0bcb1e09f0ddd10cb4e360ac7eed12a + languageName: node + linkType: hard "@openzeppelin/contracts-v0.7@npm:@openzeppelin/contracts@v3.4.2": - version "3.4.2" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.4.2.tgz#d81f786fda2871d1eb8a8c5a73e455753ba53527" - integrity sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA== - -"@openzeppelin/contracts@^4.4.1", "@openzeppelin/contracts@^4.9.3": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.9.6.tgz#2a880a24eb19b4f8b25adc2a5095f2aa27f39677" - integrity sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA== - -"@openzeppelin/contracts@~4.3.3": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.3.3.tgz#ff6ee919fc2a1abaf72b22814bfb72ed129ec137" - integrity sha512-tDBopO1c98Yk7Cv/PZlHqrvtVjlgK5R4J6jxLwoO7qxK4xqOiZG+zSkIvGFpPZ0ikc3QOED3plgdqjgNTnBc7g== - -"@polytope-labs/ismp-solidity@^0.6.1": - version "0.6.1" - resolved "https://registry.yarnpkg.com/@polytope-labs/ismp-solidity/-/ismp-solidity-0.6.1.tgz#040cfd8362475d6a513fd7b05f7992450df4947f" - integrity sha512-IUIej203J/sKgPJswkiUitfiPqUtJlg3ZAdDjB9LyelwbFr8ZBuRBNSZtu3FbLMSC5N7/l4e/LY5+MiC3VtXRQ== - dependencies: - "@polytope-labs/solidity-merkle-trees" "^0.2.3" - openzeppelin-solidity "^4.8.1" - prettier "^3.3.3" - prettier-plugin-solidity "^1.3.1" - -"@polytope-labs/solidity-merkle-trees@0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@polytope-labs/solidity-merkle-trees/-/solidity-merkle-trees-0.2.1.tgz#7c3399c071ee246df92f37b8cebc9f545a915917" - integrity sha512-aoJbZXWgIDgvwWEXQL3cEqFAXdTzaOxo3r373LMOtm8W/v9RnRNVW/gplWQGVZs+tvdwGP9Sp6ToKknIIPwQ5g== - -"@polytope-labs/solidity-merkle-trees@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@polytope-labs/solidity-merkle-trees/-/solidity-merkle-trees-0.2.3.tgz#d8346c14190cf41574c20a34b333e26465932622" - integrity sha512-aUcUjVNX0CXJNk7pS0jpqbfhi3w9VUI21/3IyTOblw0iAmctkUGq5TDwQBR7zXZnuTxpXbBPPEuXW1uhI2BHDA== - dependencies: - openzeppelin-solidity "^4.8.1" - -"@routerprotocol/evm-gateway-contracts@1.1.13": - version "1.1.13" - resolved "https://registry.yarnpkg.com/@routerprotocol/evm-gateway-contracts/-/evm-gateway-contracts-1.1.13.tgz#609cd2a0cbcdb92e9a55fcdcb5cba0cc62fc11a7" - integrity sha512-XCjODM/AKx/WLc8pa9UzlatBBS73xkGBXDbSsFxq4XQUqO8ao7Gcnp61n9CoW8QN7wDKev+6tiHagia+piDzMg== - dependencies: - "@openzeppelin/contracts" "^4.4.1" - "@openzeppelin/contracts-upgradeable" "^4.7.3" - -"@scure/base@~1.1.0", "@scure/base@~1.1.2", "@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.1.5": - version "1.1.5" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" - integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw== - dependencies: - "@noble/hashes" "~1.2.0" - "@noble/secp256k1" "~1.7.0" - "@scure/base" "~1.1.0" - -"@scure/bip32@1.3.2": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.2.tgz#90e78c027d5e30f0b22c1f8d50ff12f3fb7559f8" - integrity sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA== - dependencies: - "@noble/curves" "~1.2.0" - "@noble/hashes" "~1.3.2" - "@scure/base" "~1.1.2" - -"@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.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" - integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg== - dependencies: - "@noble/hashes" "~1.2.0" - "@scure/base" "~1.1.0" - -"@scure/bip39@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.1.tgz#5cee8978656b272a917b7871c981e0541ad6ac2a" - integrity sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg== - dependencies: - "@noble/hashes" "~1.3.0" - "@scure/base" "~1.1.0" - -"@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" - -"@sentry/core@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" - integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== - dependencies: - "@sentry/hub" "5.30.0" - "@sentry/minimal" "5.30.0" - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" - tslib "^1.9.3" - -"@sentry/hub@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" - integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== - dependencies: - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" - tslib "^1.9.3" - -"@sentry/minimal@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" - integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== - dependencies: - "@sentry/hub" "5.30.0" - "@sentry/types" "5.30.0" - tslib "^1.9.3" - -"@sentry/node@^5.18.1": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" - integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== - dependencies: - "@sentry/core" "5.30.0" - "@sentry/hub" "5.30.0" - "@sentry/tracing" "5.30.0" - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" - cookie "^0.4.1" - https-proxy-agent "^5.0.0" - lru_map "^0.3.3" - tslib "^1.9.3" - -"@sentry/tracing@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" - integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== - dependencies: - "@sentry/hub" "5.30.0" - "@sentry/minimal" "5.30.0" - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" - tslib "^1.9.3" - -"@sentry/types@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" - integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== - -"@sentry/utils@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" - integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== - dependencies: - "@sentry/types" "5.30.0" - tslib "^1.9.3" - -"@solana/buffer-layout@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz#b996235eaec15b1e0b5092a8ed6028df77fa6c15" - integrity sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA== - dependencies: - buffer "~6.0.3" - -"@solana/web3.js@^1.78.0": - version "1.91.7" - resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.91.7.tgz#1d639f8f3cc772fd6d88b982e8fdb17dc192b9e1" - integrity sha512-HqljZKDwk6Z4TajKRGhGLlRsbGK4S8EY27DA7v1z6yakewiUY3J7ZKDZRxcqz2MYV/ZXRrJ6wnnpiHFkPdv0WA== - dependencies: - "@babel/runtime" "^7.23.4" - "@noble/curves" "^1.4.0" - "@noble/hashes" "^1.3.3" - "@solana/buffer-layout" "^4.0.1" - agentkeepalive "^4.5.0" - bigint-buffer "^1.1.5" - bn.js "^5.2.1" - borsh "^0.7.0" - bs58 "^4.0.1" - buffer "6.0.3" - fast-stable-stringify "^1.0.0" - jayson "^4.1.0" - node-fetch "^2.7.0" - rpc-websockets "^7.5.1" - superstruct "^0.14.2" - -"@solidity-parser/parser@^0.14.0": - version "0.14.5" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.5.tgz#87bc3cc7b068e08195c219c91cd8ddff5ef1a804" - integrity sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg== - dependencies: - antlr4ts "^0.5.0-alpha.4" - -"@solidity-parser/parser@^0.16.0": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.16.2.tgz#42cb1e3d88b3e8029b0c9befff00b634cd92d2fa" - integrity sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg== - dependencies: - antlr4ts "^0.5.0-alpha.4" - -"@solidity-parser/parser@^0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.17.0.tgz#52a2fcc97ff609f72011014e4c5b485ec52243ef" - integrity sha512-Nko8R0/kUo391jsEHHxrGM07QFdnPGvlmox4rmH0kNiNAashItAilhy4Mv4pK5gQmW5f4sXAF58fwJbmlkGcVw== - -"@solidity-parser/parser@^0.18.0": - version "0.18.0" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.18.0.tgz#8e77a02a09ecce957255a2f48c9a7178ec191908" - integrity sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA== - -"@trivago/prettier-plugin-sort-imports@^4.0.0": - version "4.3.0" - resolved "https://registry.yarnpkg.com/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.3.0.tgz#725f411646b3942193a37041c84e0b2116339789" - integrity sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ== - dependencies: - "@babel/generator" "7.17.7" - "@babel/parser" "^7.20.5" - "@babel/traverse" "7.23.2" - "@babel/types" "7.17.0" - javascript-natural-sort "0.7.1" - lodash "^4.17.21" - -"@tsconfig/node10@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" - integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== - -"@typechain/ethers-v5@^10.1.1": - version "10.2.1" - resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz#50241e6957683281ecfa03fb5a6724d8a3ce2391" - integrity sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A== - dependencies: - lodash "^4.17.15" - ts-essentials "^7.0.1" - -"@typechain/hardhat@^6.1.4": - version "6.1.6" - resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-6.1.6.tgz#1a749eb35e5054c80df531cf440819cb347c62ea" - integrity sha512-BiVnegSs+ZHVymyidtK472syodx1sXYlYJJixZfRstHVGYTi8V1O7QG4nsjyb0PC/LORcq7sfBUcHto1y6UgJA== - dependencies: - fs-extra "^9.1.0" - -"@types/bn.js@^4.11.3": - version "4.11.6" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" - integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== - dependencies: - "@types/node" "*" - -"@types/bn.js@^5.1.0": - 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/chai-as-promised@^7.1.3": - version "7.1.8" - resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz#f2b3d82d53c59626b5d6bbc087667ccb4b677fe9" - integrity sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw== - dependencies: - "@types/chai" "*" - -"@types/chai@*", "@types/chai@^4.3.4": - version "4.3.14" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.14.tgz#ae3055ea2be43c91c9fd700a36d67820026d96e6" - integrity sha512-Wj71sXE4Q4AkGdG9Tvq1u/fquNz9EdG4LIJMwVVII7ashjD/8cf8fyIfJAjRr6YcsXnSE8cOGQPq1gqeR8z+3w== - -"@types/concat-stream@^1.6.0": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@types/concat-stream/-/concat-stream-1.6.1.tgz#24bcfc101ecf68e886aaedce60dfd74b632a1b74" - integrity sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA== - dependencies: - "@types/node" "*" - -"@types/connect@^3.4.33": - version "3.4.38" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" - integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== - dependencies: - "@types/node" "*" - -"@types/conventional-commits-parser@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz#8c9d23e0b415b24b91626d07017303755d542dc8" - integrity sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ== - dependencies: - "@types/node" "*" - -"@types/form-data@0.0.33": - version "0.0.33" - resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-0.0.33.tgz#c9ac85b2a5fd18435b8c85d9ecb50e6d6c893ff8" - integrity sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw== - dependencies: - "@types/node" "*" - -"@types/fs-extra@^9.0.13": - version "9.0.13" - resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" - integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== - dependencies: - "@types/node" "*" - -"@types/glob@^7.1.1": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" - integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== - dependencies: - "@types/minimatch" "*" - "@types/node" "*" - -"@types/json-schema@^7.0.12", "@types/json-schema@^7.0.9": - 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/lru-cache@^5.1.0": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" - integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== - -"@types/minimatch@*": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" - integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== - -"@types/minimist@^1.2.0": - version "1.2.5" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" - integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== - -"@types/mkdirp@^0.5.2": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f" - integrity sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg== - dependencies: - "@types/node" "*" - -"@types/mocha@^10.0.0": - version "10.0.6" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.6.tgz#818551d39113081048bdddbef96701b4e8bb9d1b" - integrity sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg== - -"@types/node@*", "@types/node@^20.8.9": - version "20.12.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.7.tgz#04080362fa3dd6c5822061aa3124f5c152cff384" - integrity sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg== - dependencies: - undici-types "~5.26.4" - -"@types/node@20.5.1": - version "20.5.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.1.tgz#178d58ee7e4834152b0e8b4d30cbfab578b9bb30" - integrity sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg== - -"@types/node@^10.0.3": - version "10.17.60" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" - integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== - -"@types/node@^12.12.54": - version "12.20.55" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" - integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== - -"@types/node@^18.11.9": - version "18.19.31" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.31.tgz#b7d4a00f7cb826b60a543cebdbda5d189aaecdcd" - integrity sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA== - dependencies: - undici-types "~5.26.4" - -"@types/node@^8.0.0": - version "8.10.66" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.66.tgz#dd035d409df322acc83dff62a602f12a5783bbb3" - integrity sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw== - -"@types/normalize-package-data@^2.4.0": - version "2.4.4" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" - integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== - -"@types/pbkdf2@^3.0.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.2.tgz#2dc43808e9985a2c69ff02e2d2027bd4fe33e8dc" - integrity sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew== - dependencies: - "@types/node" "*" - -"@types/prettier@^2.1.1": - version "2.7.3" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" - integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== - -"@types/qs@^6.2.31", "@types/qs@^6.9.7": - version "6.9.15" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.15.tgz#adde8a060ec9c305a82de1babc1056e73bd64dce" - integrity sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg== - -"@types/readable-stream@^2.3.13": - version "2.3.15" - resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-2.3.15.tgz#3d79c9ceb1b6a57d5f6e6976f489b9b5384321ae" - integrity sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ== - dependencies: - "@types/node" "*" - safe-buffer "~5.1.1" - -"@types/resolve@^0.0.8": - version "0.0.8" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" - integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== - dependencies: - "@types/node" "*" - -"@types/secp256k1@^4.0.1": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.6.tgz#d60ba2349a51c2cbc5e816dcd831a42029d376bf" - integrity sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ== - dependencies: - "@types/node" "*" - -"@types/semver@^7.3.12", "@types/semver@^7.5.0": - version "7.5.8" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" - integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== - -"@types/triple-beam@^1.3.2": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" - integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== - -"@types/webidl-conversions@*": - version "7.0.3" - resolved "https://registry.yarnpkg.com/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz#1306dbfa53768bcbcfc95a1c8cde367975581859" - integrity sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA== - -"@types/whatwg-url@^11.0.2": - version "11.0.4" - resolved "https://registry.yarnpkg.com/@types/whatwg-url/-/whatwg-url-11.0.4.tgz#ffed0dc8d89d91f62e3f368fcbda222a487c4f63" - integrity sha512-lXCmTWSHJvf0TRSO58nm978b8HJ/EdsSsEKLd3ODHFjo+3VGAyyTp4v50nWvwtzBxSMQrVOK7tcuN0zGPLICMw== - dependencies: - "@types/webidl-conversions" "*" - -"@types/ws@^7.4.4": - version "7.4.7" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" - integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== - dependencies: - "@types/node" "*" - -"@typescript-eslint/eslint-plugin@^5.44.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" - integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== - dependencies: - "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/type-utils" "5.62.0" - "@typescript-eslint/utils" "5.62.0" - debug "^4.3.4" - graphemer "^1.4.0" - ignore "^5.2.0" - natural-compare-lite "^1.4.0" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/eslint-plugin@^6.7.5": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz#30830c1ca81fd5f3c2714e524c4303e0194f9cd3" - integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA== - dependencies: - "@eslint-community/regexpp" "^4.5.1" - "@typescript-eslint/scope-manager" "6.21.0" - "@typescript-eslint/type-utils" "6.21.0" - "@typescript-eslint/utils" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" - debug "^4.3.4" - graphemer "^1.4.0" - ignore "^5.2.4" - natural-compare "^1.4.0" - semver "^7.5.4" - ts-api-utils "^1.0.1" - -"@typescript-eslint/parser@^5.44.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" - integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== - dependencies: - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" - debug "^4.3.4" - -"@typescript-eslint/parser@^6.7.5": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" - integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== - dependencies: - "@typescript-eslint/scope-manager" "6.21.0" - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/typescript-estree" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" - integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== - dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" - -"@typescript-eslint/scope-manager@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" - integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== - dependencies: - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" - -"@typescript-eslint/type-utils@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" - integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== - dependencies: - "@typescript-eslint/typescript-estree" "5.62.0" - "@typescript-eslint/utils" "5.62.0" - debug "^4.3.4" - tsutils "^3.21.0" - -"@typescript-eslint/type-utils@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz#6473281cfed4dacabe8004e8521cee0bd9d4c01e" - integrity sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag== - dependencies: - "@typescript-eslint/typescript-estree" "6.21.0" - "@typescript-eslint/utils" "6.21.0" - debug "^4.3.4" - ts-api-utils "^1.0.1" - -"@typescript-eslint/types@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" - integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== - -"@typescript-eslint/types@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" - integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== - -"@typescript-eslint/typescript-estree@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" - integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== - dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/typescript-estree@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" - integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== - dependencies: - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - minimatch "9.0.3" - semver "^7.5.4" - ts-api-utils "^1.0.1" - -"@typescript-eslint/utils@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" - integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" - eslint-scope "^5.1.1" - semver "^7.3.7" - -"@typescript-eslint/utils@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.21.0.tgz#4714e7a6b39e773c1c8e97ec587f520840cd8134" - integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@types/json-schema" "^7.0.12" - "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "6.21.0" - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/typescript-estree" "6.21.0" - semver "^7.5.4" - -"@typescript-eslint/visitor-keys@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" - integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== - dependencies: - "@typescript-eslint/types" "5.62.0" - eslint-visitor-keys "^3.3.0" - -"@typescript-eslint/visitor-keys@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" - integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== - dependencies: - "@typescript-eslint/types" "6.21.0" - eslint-visitor-keys "^3.4.1" - -"@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== - -"@yarnpkg/lockfile@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" - integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== - -JSONStream@^1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" - integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -abbrev@1.0.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" - integrity sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q== - -abitype@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.0.tgz#237176dace81d90d018bebf3a45cb42f2a2d9e97" - integrity sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ== - -abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3, abstract-level@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.4.tgz#3ad8d684c51cc9cbc9cf9612a7100b716c414b57" - integrity sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg== - dependencies: - buffer "^6.0.3" - catering "^2.1.0" - is-buffer "^2.0.5" - level-supports "^4.0.0" - level-transcoder "^1.0.1" - module-error "^1.0.1" - queue-microtask "^1.2.3" - -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-walk@^8.1.1: - version "8.3.2" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" - integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== - -acorn@^8.4.1, 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== - -adm-zip@^0.4.16: - version "0.4.16" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" - integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== - -aes-js@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" - integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -agentkeepalive@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" - integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== - dependencies: - humanize-ms "^1.2.1" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv@^6.12.4, ajv@^6.12.6: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.1, ajv@^8.11.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" - -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== - -ansi-colors@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - -ansi-colors@^4.1.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - -ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-escapes@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-5.0.0.tgz#b6a0caf0eef0c41af190e9a749e0c00ec04bb2a6" - integrity sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA== - dependencies: - type-fest "^1.0.2" - -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@^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-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -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.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^6.0.0, ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -antlr4@^4.11.0: - version "4.13.1" - resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.13.1.tgz#1e0a1830a08faeb86217cb2e6c34716004e4253d" - integrity sha512-kiXTspaRYvnIArgE97z5YVVf/cDVQABr3abFRR6mE7yesLMkgu4ujuyV/sgxafQ8wgve0DJQUJ38Z8tkgA2izA== - -antlr4ts@^0.5.0-alpha.4: - version "0.5.0-alpha.4" - resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" - integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -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-ify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" - integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== - -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-uniq@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== - -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== - -asap@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== - -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - -ast-parents@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/ast-parents/-/ast-parents-0.0.1.tgz#508fd0f05d0c48775d9eccda2e174423261e8dd3" - integrity sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA== - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -async@1.x: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== - -async@^3.2.3: - version "3.2.5" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" - integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== - -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== - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -axios@^0.21.1: - version "0.21.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== - dependencies: - follow-redirects "^1.14.0" - -axios@^1.5.1: - version "1.6.8" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66" - integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ== - dependencies: - follow-redirects "^1.15.6" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -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== - -base-x@^3.0.2: - version "3.0.9" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" - integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== - dependencies: - safe-buffer "^5.0.1" - -base64-js@^1.3.0, base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -bech32@1.1.4, 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== - -bigint-buffer@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/bigint-buffer/-/bigint-buffer-1.1.5.tgz#d038f31c8e4534c1f8d0015209bf34b4fa6dd442" - integrity sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA== - dependencies: - bindings "^1.3.0" - -bigint-crypto-utils@^3.0.23: - version "3.3.0" - resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz#72ad00ae91062cf07f2b1def9594006c279c1d77" - integrity sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg== - -bignumber.js@^9.1.1: - version "9.1.2" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" - integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== - -binary-extensions@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== - -bindings@^1.3.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" - -bl@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.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== - -bn.js@4.11.6: - version "4.11.6" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" - integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== - -bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" - integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== - -borsh@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.7.0.tgz#6e9560d719d86d90dc589bca60ffc8a6c51fec2a" - integrity sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA== - dependencies: - bn.js "^5.2.0" - bs58 "^4.0.0" - text-encoding-utf-8 "^1.0.2" - -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, 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.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== - -browser-level@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browser-level/-/browser-level-1.0.1.tgz#36e8c3183d0fe1c405239792faaab5f315871011" - integrity sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ== - dependencies: - abstract-level "^1.0.2" - catering "^2.1.1" - module-error "^1.0.2" - run-parallel-limit "^1.1.0" - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -browserify-aes@^1.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" - -bs58@^4.0.0, bs58@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" - integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== - dependencies: - base-x "^3.0.2" - -bs58check@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" - integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== - dependencies: - bs58 "^4.0.0" - create-hash "^1.1.0" - safe-buffer "^5.1.2" - -bson@^6.4.0: - version "6.6.0" - resolved "https://registry.yarnpkg.com/bson/-/bson-6.6.0.tgz#f225137eb49fe19bee4d87949a0515c05176e2ad" - integrity sha512-BVINv2SgcMjL4oYbBuCQTpE3/VKOSxrOA8Cj/wQP7izSzlBGVomdm+TcUd0Pzy0ytLSSDweCKQ6X3f5veM5LQA== - -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, buffer@^6.0.3, 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" - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -bufferutil@^4.0.1: - version "4.0.8" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.8.tgz#1de6a71092d65d7766c4d8a522b261a6e787e8ea" - integrity sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw== - dependencies: - node-gyp-build "^4.3.0" - -bufio@^1.0.7: - version "1.2.1" - resolved "https://registry.yarnpkg.com/bufio/-/bufio-1.2.1.tgz#8d4ab3ddfcd5faa90f996f922f9397d41cbaf2de" - integrity sha512-9oR3zNdupcg/Ge2sSHQF3GX+kmvL/fTPvD0nd5AGLq8SjUYnTz+SlFjK/GXidndbZtIj+pVKXiWeR9w6e9wKCA== - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -cachedir@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" - integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== - -call-bind@^1.0.5, 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-keys@^6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" - integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== - dependencies: - camelcase "^5.3.1" - map-obj "^4.0.0" - quick-lru "^4.0.1" - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.0.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -case@^1.6.3: - version "1.6.3" - resolved "https://registry.yarnpkg.com/case/-/case-1.6.3.tgz#0a4386e3e9825351ca2e6216c60467ff5f1ea1c9" - integrity sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ== - -caseless@^0.12.0, caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== - -catering@^2.1.0, catering@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" - integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== - -cbor@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5" - integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg== - dependencies: - nofilter "^3.1.0" - -chai-as-promised@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" - integrity sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA== - dependencies: - check-error "^1.0.2" - -chai@^4.3.4, chai@^4.3.7: - 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@5.3.0, chalk@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" - integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== - -chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - 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, chalk@^4.1.1, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -"charenc@>= 0.0.1": - version "0.0.2" - resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" - integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== - -check-error@^1.0.2, 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" - -chokidar@3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chokidar@^3.4.0, chokidar@^3.5.2: - version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -ci-info@^3.7.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" - integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== - -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" - -classic-level@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.4.1.tgz#169ecf9f9c6200ad42a98c8576af449c1badbaee" - integrity sha512-qGx/KJl3bvtOHrGau2WklEZuXhS3zme+jf+fsu6Ej7W7IP/C49v7KNlWIsT1jZu0YnfzSIYDGcEWpCa1wKGWXQ== - dependencies: - abstract-level "^1.0.2" - catering "^2.1.0" - module-error "^1.0.1" - napi-macros "^2.2.2" - node-gyp-build "^4.3.0" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-cursor@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea" - integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== - dependencies: - restore-cursor "^4.0.0" - -cli-spinners@^2.5.0: - version "2.9.2" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" - integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== - -cli-table3@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" - integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== - dependencies: - object-assign "^4.1.0" - string-width "^2.1.1" - optionalDependencies: - colors "^1.1.2" - -cli-truncate@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" - integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== - dependencies: - slice-ansi "^5.0.0" - string-width "^5.0.0" - -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== - -color-convert@^1.9.0, color-convert@^1.9.3: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - 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.0.0, color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-string@^1.6.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" - integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color@^3.1.3: - version "3.2.1" - resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" - integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== - dependencies: - color-convert "^1.9.3" - color-string "^1.6.0" - -colorette@^2.0.20: - version "2.0.20" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" - integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== - -colors@1.4.0, colors@^1.1.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" - integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== - -colorspace@1.1.x: - version "1.1.4" - resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" - integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== - dependencies: - color "^3.1.3" - text-hex "1.0.x" - -combined-stream@^1.0.6, 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-exists@^1.2.8: - version "1.2.9" - resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" - integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== - -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@11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-11.0.0.tgz#43e19c25dbedc8256203538e8d7e9346877a6f67" - integrity sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ== - -commander@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" - integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== - -commander@^10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" - integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== - -commander@^2.20.3: - 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== - -commitizen@^4.0.3, commitizen@^4.2.5: - version "4.3.0" - resolved "https://registry.yarnpkg.com/commitizen/-/commitizen-4.3.0.tgz#0d056c542a2d2b1f9b9aba981aa32575b2849924" - integrity sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw== - dependencies: - cachedir "2.3.0" - cz-conventional-changelog "3.3.0" - dedent "0.7.0" - detect-indent "6.1.0" - find-node-modules "^2.1.2" - find-root "1.1.0" - fs-extra "9.1.0" - glob "7.2.3" - inquirer "8.2.5" - is-utf8 "^0.2.1" - lodash "4.17.21" - minimist "1.2.7" - strip-bom "4.0.0" - strip-json-comments "3.1.1" - -compare-func@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" - integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== - dependencies: - array-ify "^1.0.0" - dot-prop "^5.1.0" - -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== - -concat-stream@^1.6.0, concat-stream@^1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -conventional-changelog-angular@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-6.0.0.tgz#a9a9494c28b7165889144fd5b91573c4aa9ca541" - integrity sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg== - dependencies: - compare-func "^2.0.0" - -conventional-changelog-conventionalcommits@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-6.1.0.tgz#3bad05f4eea64e423d3d90fc50c17d2c8cf17652" - integrity sha512-3cS3GEtR78zTfMzk0AizXKKIdN4OvSh7ibNz6/DPbhWWQu7LqE/8+/GqSodV+sywUR2gpJAdP/1JFf4XtN7Zpw== - dependencies: - compare-func "^2.0.0" - -conventional-commit-types@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz#7c9214e58eae93e85dd66dbfbafe7e4fffa2365b" - integrity sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg== - -conventional-commits-parser@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-4.0.0.tgz#02ae1178a381304839bce7cea9da5f1b549ae505" - integrity sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg== - dependencies: - JSONStream "^1.3.5" - is-text-path "^1.0.1" - meow "^8.1.2" - split2 "^3.2.2" - -cookie@^0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== - -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== - -cosmiconfig-typescript-loader@^4.0.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.4.0.tgz#f3feae459ea090f131df5474ce4b1222912319f9" - integrity sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw== - -cosmiconfig-typescript-loader@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.0.0.tgz#0d3becfe022a871f7275ceb2397d692e06045dc8" - integrity sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA== - dependencies: - jiti "^1.19.1" - -cosmiconfig@^8.0.0: - version "8.3.6" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" - integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== - dependencies: - import-fresh "^3.3.0" - js-yaml "^4.1.0" - parse-json "^5.2.0" - path-type "^4.0.0" - -cosmiconfig@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" - integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== - dependencies: - env-paths "^2.2.1" - import-fresh "^3.3.0" - js-yaml "^4.1.0" - parse-json "^5.2.0" - -crc-32@^1.2.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" - integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== - -create-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.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" - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-env@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" - integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== - dependencies: - cross-spawn "^7.0.1" - -cross-spawn@^7.0.1, 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" - -"crypt@>= 0.0.1": - version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" - integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== - -cz-conventional-changelog@3.3.0, cz-conventional-changelog@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz#9246947c90404149b3fe2cf7ee91acad3b7d22d2" - integrity sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw== - dependencies: - chalk "^2.4.1" - commitizen "^4.0.3" - conventional-commit-types "^3.0.0" - lodash.map "^4.5.1" - longest "^2.0.1" - word-wrap "^1.0.3" - optionalDependencies: - "@commitlint/load" ">6.1.1" - -dargs@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" - integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== - -death@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" - integrity sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w== - -debug@4, debug@4.3.4, debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, 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" - -decamelize-keys@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" - integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - -decamelize@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" - integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== - -dedent@0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== - -deep-eql@^4.0.1, 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== - -defaults@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" - integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== - dependencies: - clone "^1.0.2" - -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" - -delay@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" - integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== - -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== - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -detect-file@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" - integrity sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q== - -detect-indent@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" - integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== - -diff@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -difflib@^0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/difflib/-/difflib-0.2.4.tgz#b5e30361a6db023176d562892db85940a718f47e" - integrity sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w== - dependencies: - heap ">= 0.2.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@^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" - -dot-prop@^5.1.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" - integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== - dependencies: - is-obj "^2.0.0" - -dotenv@^16.0.3, dotenv@^16.3.1: - version "16.4.5" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" - integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -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.2, elliptic@^6.5.4: - 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@^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== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -enabled@2.0.x: - version "2.0.0" - resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" - integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== - -encode-utf8@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" - integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw== - -enquirer@^2.3.0, enquirer@^2.3.6: - version "2.4.1" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" - integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== - dependencies: - ansi-colors "^4.1.1" - strip-ansi "^6.0.1" - -env-paths@^2.2.0, env-paths@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" - integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-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.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== - -es6-promise@^4.0.3: - version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" - integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== - -es6-promisify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" - integrity sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ== - dependencies: - es6-promise "^4.0.3" - -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@4.0.0, escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escodegen@1.8.x: - version "1.8.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" - integrity sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A== - dependencies: - esprima "^2.7.1" - estraverse "^1.9.1" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.2.0" - -eslint-config-prettier@^8.5.0: - version "8.10.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" - integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== - -eslint-config-prettier@^9.0.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-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@^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-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@^8.28.0, eslint@^8.51.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@^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@2.7.x, esprima@^2.7.1: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - integrity sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A== - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.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.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@^1.9.1: - version "1.9.3" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" - integrity sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA== - -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== - -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== - -eth-gas-reporter@^0.2.25: - version "0.2.27" - resolved "https://registry.yarnpkg.com/eth-gas-reporter/-/eth-gas-reporter-0.2.27.tgz#928de8548a674ed64c7ba0bf5795e63079150d4e" - integrity sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw== - dependencies: - "@solidity-parser/parser" "^0.14.0" - axios "^1.5.1" - cli-table3 "^0.5.0" - colors "1.4.0" - ethereum-cryptography "^1.0.3" - ethers "^5.7.2" - fs-readdir-recursive "^1.1.0" - lodash "^4.17.14" - markdown-table "^1.1.3" - mocha "^10.2.0" - req-cwd "^2.0.0" - sha1 "^1.1.1" - sync-request "^6.0.0" - -ethereum-bloom-filters@^1.0.6: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.1.0.tgz#b3fc1eb789509ee30db0bf99a2988ccacb8d0397" - integrity sha512-J1gDRkLpuGNvWYzWslBQR9cDV4nd4kfvVTE/Wy4Kkm4yb3EYRSlyi0eB/inTsSTTVyA0+HyzHgbr95Fn/Z1fSw== - dependencies: - "@noble/hashes" "^1.4.0" - -ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" - integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== - dependencies: - "@types/pbkdf2" "^3.0.0" - "@types/secp256k1" "^4.0.1" - blakejs "^1.1.0" - browserify-aes "^1.2.0" - bs58check "^2.1.2" - create-hash "^1.2.0" - create-hmac "^1.1.7" - hash.js "^1.1.7" - keccak "^3.0.0" - pbkdf2 "^3.0.17" - randombytes "^2.1.0" - safe-buffer "^5.1.2" - scrypt-js "^3.0.0" - secp256k1 "^4.0.1" - setimmediate "^1.0.5" - -ethereum-cryptography@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz#5ccfa183e85fdaf9f9b299a79430c044268c9b3a" - integrity sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw== - dependencies: - "@noble/hashes" "1.2.0" - "@noble/secp256k1" "1.7.1" - "@scure/bip32" "1.1.5" - "@scure/bip39" "1.1.1" - -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" - -ethereumjs-abi@^0.6.8: - version "0.6.8" - resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" - integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== - dependencies: - bn.js "^4.11.8" - ethereumjs-util "^6.0.0" - -ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" - integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== - dependencies: - "@types/bn.js" "^4.11.3" - bn.js "^4.11.0" - create-hash "^1.1.2" - elliptic "^6.5.2" - ethereum-cryptography "^0.1.3" - ethjs-util "0.1.6" - rlp "^2.2.3" - -ethereumjs-util@^7.1.4: - version "7.1.5" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" - integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== - dependencies: - "@types/bn.js" "^5.1.0" - bn.js "^5.1.2" - create-hash "^1.1.2" - ethereum-cryptography "^0.1.3" - rlp "^2.2.4" - -ethers@^5.7.0, ethers@^5.7.1, ethers@^5.7.2: - 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" - -ethjs-unit@0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" - integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw== - dependencies: - bn.js "4.11.6" - number-to-bn "1.7.0" - -ethjs-util@0.1.6, ethjs-util@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" - integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== - dependencies: - is-hex-prefixed "1.0.0" - strip-hex-prefix "1.0.0" - -eventemitter3@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -eventemitter3@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" - integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== - -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@7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-7.2.0.tgz#657e75ba984f42a70f38928cedc87d6f2d4fe4e9" - integrity sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.1" - human-signals "^4.3.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^3.0.7" - strip-final-newline "^3.0.0" - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -expand-tilde@^2.0.0, expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" - integrity sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw== - dependencies: - homedir-polyfill "^1.0.1" - -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" - -eyes@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" - integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ== - -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, fast-diff@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" - integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== - -fast-glob@^3.0.3, fast-glob@^3.2.9: - version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== - 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== - -fast-stable-stringify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz#5c5543462b22aeeefd36d05b34e51c78cb86d313" - integrity sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag== - -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" - -fecha@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" - integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== - -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - 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-node-modules@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/find-node-modules/-/find-node-modules-2.1.3.tgz#3c976cff2ca29ee94b4f9eafc613987fc4c0ee44" - integrity sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg== - dependencies: - findup-sync "^4.0.0" - merge "^2.1.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-root@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" - integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== - -find-up@5.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" - -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== - dependencies: - locate-path "^2.0.0" - -find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-yarn-workspace-root@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" - integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== - dependencies: - micromatch "^4.0.2" - -findup-sync@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-4.0.0.tgz#956c9cdde804052b881b428512905c4a5f2cdef0" - integrity sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ== - dependencies: - detect-file "^1.0.0" - is-glob "^4.0.0" - micromatch "^4.0.2" - resolve-dir "^1.0.1" - -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@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" - integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== - -fmix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/fmix/-/fmix-0.1.0.tgz#c7bbf124dec42c9d191cfb947d0a9778dd986c0c" - integrity sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w== - dependencies: - imul "^1.0.0" - -fn.name@1.x.x: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" - integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== - -follow-redirects@^1.12.1, follow-redirects@^1.14.0, follow-redirects@^1.15.6: - version "1.15.6" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" - integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== - -form-data@^2.2.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" - integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -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" - -fp-ts@1.19.3: - version "1.19.3" - resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" - integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== - -fp-ts@^1.0.0: - version "1.19.5" - resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" - integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== - -fs-extra@9.1.0, fs-extra@^9.0.0, fs-extra@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^0.30.0: - version "0.30.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" - integrity sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - path-is-absolute "^1.0.0" - rimraf "^2.2.8" - -fs-extra@^10.0.0, fs-extra@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^11.0.0: - version "11.2.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" - integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^7.0.0, fs-extra@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" - integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-readdir-recursive@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" - integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== - -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== - -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== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -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.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-port@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" - integrity sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg== - -get-stream@^6.0.0, get-stream@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -ghost-testrpc@^0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz#c4de9557b1d1ae7b2d20bbe474a91378ca90ce92" - integrity sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ== - dependencies: - chalk "^2.4.2" - node-emoji "^1.10.0" - -git-raw-commits@^2.0.11: - version "2.0.11" - resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" - integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== - dependencies: - dargs "^7.0.0" - lodash "^4.17.15" - meow "^8.0.0" - split2 "^3.0.0" - through2 "^4.0.0" - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - 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@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.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - 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.2.3, glob@^7.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.1.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" - -glob@^5.0.15: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-directory@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/global-directory/-/global-directory-4.0.1.tgz#4d7ac7cfd2cb73f304c53b8810891748df5e361e" - integrity sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q== - dependencies: - ini "4.1.1" - -global-dirs@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" - integrity sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg== - dependencies: - ini "^1.3.4" - -global-modules@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" - integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== - dependencies: - global-prefix "^1.0.1" - is-windows "^1.0.1" - resolve-dir "^1.0.0" - -global-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - -global-prefix@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" - integrity sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg== - dependencies: - expand-tilde "^2.0.2" - homedir-polyfill "^1.0.1" - ini "^1.3.4" - is-windows "^1.0.1" - which "^1.2.14" - -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - -globals@^11.1.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" - -globby@^10.0.1: - version "10.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" - integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== - dependencies: - "@types/glob" "^7.1.1" - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.0.3" - glob "^7.1.3" - ignore "^5.1.1" - merge2 "^1.2.3" - slash "^3.0.0" - -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.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -handlebars@^4.0.1: - version "4.7.8" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" - integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== - dependencies: - minimist "^1.2.5" - neo-async "^2.6.2" - source-map "^0.6.1" - wordwrap "^1.0.0" - optionalDependencies: - uglify-js "^3.1.4" - -hard-rejection@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" - integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== - -hardhat-change-network@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/hardhat-change-network/-/hardhat-change-network-0.0.7.tgz#9f9b7943ff966515658b70bf5e44bc2f073af402" - integrity sha512-Usp9fJan9SOJnOlVcv/jMJDchseE7bIDA5ZsBnracgVk4MiBwkvMqpmLWn5G1aDBvnUCthvS2gO3odfahgkV0Q== - -hardhat-deploy@^0.11.31: - version "0.11.45" - resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.11.45.tgz#bed86118175a38a03bb58aba2ce1ed5e80a20bc8" - integrity sha512-aC8UNaq3JcORnEUIwV945iJuvBwi65tjHVDU3v6mOcqik7WAzHVCJ7cwmkkipsHrWysrB5YvGF1q9S1vIph83w== - dependencies: - "@ethersproject/abi" "^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/contracts" "^5.7.0" - "@ethersproject/providers" "^5.7.2" - "@ethersproject/solidity" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/wallet" "^5.7.0" - "@types/qs" "^6.9.7" - axios "^0.21.1" - chalk "^4.1.2" - chokidar "^3.5.2" - debug "^4.3.2" - enquirer "^2.3.6" - ethers "^5.7.0" - form-data "^4.0.0" - fs-extra "^10.0.0" - match-all "^1.2.6" - murmur-128 "^0.2.1" - qs "^6.9.4" - zksync-web3 "^0.14.3" - -hardhat-gas-reporter@^1.0.9: - version "1.0.10" - resolved "https://registry.yarnpkg.com/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.10.tgz#ebe5bda5334b5def312747580cd923c2b09aef1b" - integrity sha512-02N4+So/fZrzJ88ci54GqwVA3Zrf0C9duuTyGt0CFRIh/CdNwbnTgkXkRfojOMLBQ+6t+lBIkgbsOtqMvNwikA== - dependencies: - array-uniq "1.0.3" - eth-gas-reporter "^0.2.25" - sha1 "^1.1.1" - -hardhat@2.19.4: - version "2.19.4" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.19.4.tgz#5112c30295d8be2e18e55d847373c50483ed1902" - integrity sha512-fTQJpqSt3Xo9Mn/WrdblNGAfcANM6XC3tAEi6YogB4s02DmTf93A8QsGb8uR0KR8TFcpcS8lgiW4ugAIYpnbrQ== - dependencies: - "@ethersproject/abi" "^5.1.2" - "@metamask/eth-sig-util" "^4.0.0" - "@nomicfoundation/ethereumjs-block" "5.0.2" - "@nomicfoundation/ethereumjs-blockchain" "7.0.2" - "@nomicfoundation/ethereumjs-common" "4.0.2" - "@nomicfoundation/ethereumjs-evm" "2.0.2" - "@nomicfoundation/ethereumjs-rlp" "5.0.2" - "@nomicfoundation/ethereumjs-statemanager" "2.0.2" - "@nomicfoundation/ethereumjs-trie" "6.0.2" - "@nomicfoundation/ethereumjs-tx" "5.0.2" - "@nomicfoundation/ethereumjs-util" "9.0.2" - "@nomicfoundation/ethereumjs-vm" "7.0.2" - "@nomicfoundation/solidity-analyzer" "^0.1.0" - "@sentry/node" "^5.18.1" - "@types/bn.js" "^5.1.0" - "@types/lru-cache" "^5.1.0" - adm-zip "^0.4.16" - aggregate-error "^3.0.0" - ansi-escapes "^4.3.0" - chalk "^2.4.2" - chokidar "^3.4.0" - ci-info "^2.0.0" - debug "^4.1.1" - enquirer "^2.3.0" - env-paths "^2.2.0" - ethereum-cryptography "^1.0.3" - ethereumjs-abi "^0.6.8" - find-up "^2.1.0" - fp-ts "1.19.3" - fs-extra "^7.0.1" - glob "7.2.0" - immutable "^4.0.0-rc.12" - io-ts "1.10.4" - keccak "^3.0.2" - lodash "^4.17.11" - mnemonist "^0.38.0" - mocha "^10.0.0" - p-map "^4.0.0" - raw-body "^2.4.1" - resolve "1.17.0" - semver "^6.3.0" - solc "0.7.3" - source-map-support "^0.5.13" - stacktrace-parser "^0.1.10" - tsort "0.0.1" - undici "^5.14.0" - uuid "^8.3.2" - ws "^7.4.6" - -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity 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.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: - 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.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -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.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hasown@^2.0.0: - 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" - -he@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -"heap@>= 0.2.0": - version "0.2.7" - resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" - integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== - -hmac-drbg@^1.0.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" - -homedir-polyfill@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" - integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== - dependencies: - parse-passwd "^1.0.0" - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -hosted-git-info@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" - integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== - dependencies: - lru-cache "^6.0.0" - -http-basic@^8.1.1: - version "8.1.3" - resolved "https://registry.yarnpkg.com/http-basic/-/http-basic-8.1.3.tgz#a7cabee7526869b9b710136970805b1004261bbf" - integrity sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw== - dependencies: - caseless "^0.12.0" - concat-stream "^1.6.2" - http-response-object "^3.0.1" - parse-cache-control "^1.0.1" - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-response-object@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/http-response-object/-/http-response-object-3.0.2.tgz#7f435bb210454e4360d074ef1f989d5ea8aa9810" - integrity sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA== - dependencies: - "@types/node" "^10.0.3" - -https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -human-signals@^4.3.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" - integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== - -humanize-ms@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" - integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== - dependencies: - ms "^2.0.0" - -husky@^8.0.3: - version "8.0.3" - resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" - integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== - -iconv-lite@0.4.24, 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.1.13, 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-by-default@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" - integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== - -ignore@^5.1.1, ignore@^5.2.0, ignore@^5.2.4: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== - -immutable@^4.0.0-rc.12: - version "4.3.5" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.5.tgz#f8b436e66d59f99760dc577f5c99a4fd2a5cc5a0" - integrity sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw== - -import-fresh@^3.0.0, import-fresh@^3.2.1, import-fresh@^3.3.0: - 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-meta-resolve@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz#f9db8bead9fafa61adb811db77a2bf22c5399706" - integrity sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw== - -imul@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/imul/-/imul-1.0.1.tgz#9d5867161e8b3de96c2c38d5dc7cb102f35e2ac9" - integrity sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA== - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -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.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" - integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== - -ini@^1.3.4, ini@^1.3.5: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -inquirer@8.2.5: - version "8.2.5" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.5.tgz#d8654a7542c35a9b9e069d27e2df4858784d54f8" - integrity sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.1" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.21" - mute-stream "0.0.8" - ora "^5.4.1" - run-async "^2.4.0" - rxjs "^7.5.5" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - wrap-ansi "^7.0.0" - -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - -io-ts@1.10.4: - version "1.10.4" - resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" - integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g== - dependencies: - fp-ts "^1.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-buffer@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-core-module@^2.13.0, is-core-module@^2.5.0: - 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-docker@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-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@^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-fullwidth-code-point@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" - integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-hex-prefixed@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" - integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== - -is-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== - -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-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" - integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== - -is-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-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== - -is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - -is-text-path@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" - integrity sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w== - dependencies: - text-extensions "^1.0.0" - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-utf8@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== - -is-windows@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -isarray@^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== - -isomorphic-ws@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" - integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== - -isows@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.3.tgz#93c1cf0575daf56e7120bab5c8c448b0809d0d74" - integrity sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg== - -javascript-natural-sort@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59" - integrity sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw== - -jayson@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/jayson/-/jayson-4.1.0.tgz#60dc946a85197317f2b1439d672a8b0a99cea2f9" - integrity sha512-R6JlbyLN53Mjku329XoRT2zJAE6ZgOQ8f91ucYdMCD4nkGCF9kZSrcGXpHIU4jeKj58zUZke2p+cdQchU7Ly7A== - dependencies: - "@types/connect" "^3.4.33" - "@types/node" "^12.12.54" - "@types/ws" "^7.4.4" - JSONStream "^1.3.5" - commander "^2.20.3" - delay "^5.0.0" - es6-promisify "^5.0.0" - eyes "^0.1.8" - isomorphic-ws "^4.0.1" - json-stringify-safe "^5.0.1" - uuid "^8.3.2" - ws "^7.4.5" - -jiti@^1.19.1: - version "1.21.0" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" - integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== - -js-sdsl@^4.1.4: - version "4.4.2" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.2.tgz#2e3c031b1f47d3aca8b775532e3ebb0818e7f847" - integrity sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w== - -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.x: - 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, 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" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -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.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-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== - -json-stable-stringify@^1.0.2: - version "1.1.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz#52d4361b47d49168bcc4e564189a42e5a7439454" - integrity sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg== - dependencies: - call-bind "^1.0.5" - isarray "^2.0.5" - jsonify "^0.0.1" - object-keys "^1.1.1" - -json-stringify-safe@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== - -jsonfile@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonify@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" - integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== - -jsonparse@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== - -jsonschema@^1.2.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" - integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== - -keccak@^3.0.0, keccak@^3.0.2: - version "3.0.4" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d" - integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q== - dependencies: - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - readable-stream "^3.6.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, kind-of@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -klaw-sync@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" - integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== - dependencies: - graceful-fs "^4.1.11" - -klaw@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== - optionalDependencies: - graceful-fs "^4.1.9" - -kuler@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" - integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== - -level-supports@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a" - integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA== - -level-transcoder@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c" - integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w== - dependencies: - buffer "^6.0.3" - module-error "^1.0.1" - -level@^8.0.0: - version "8.0.1" - resolved "https://registry.yarnpkg.com/level/-/level-8.0.1.tgz#737161db1bc317193aca4e7b6f436e7e1df64379" - integrity sha512-oPBGkheysuw7DmzFQYyFe8NAia5jFLAgEnkgWnK3OXAuJr8qFT+xBQIwokAZPME2bhPFzS8hlYcL16m8UZrtwQ== - dependencies: - abstract-level "^1.0.4" - browser-level "^1.0.1" - classic-level "^1.2.0" - -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" - -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" - -lilconfig@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -lint-staged@^13.0.4: - version "13.3.0" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-13.3.0.tgz#7965d72a8d6a6c932f85e9c13ccf3596782d28a5" - integrity sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ== - dependencies: - chalk "5.3.0" - commander "11.0.0" - debug "4.3.4" - execa "7.2.0" - lilconfig "2.1.0" - listr2 "6.6.1" - micromatch "4.0.5" - pidtree "0.6.0" - string-argv "0.3.2" - yaml "2.3.1" - -listr2@6.6.1: - version "6.6.1" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-6.6.1.tgz#08b2329e7e8ba6298481464937099f4a2cd7f95d" - integrity sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg== - dependencies: - cli-truncate "^3.1.0" - colorette "^2.0.20" - eventemitter3 "^5.0.1" - log-update "^5.0.1" - rfdc "^1.3.0" - wrap-ansi "^8.1.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - 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.isfunction@^3.0.9: - version "3.0.9" - resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" - integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw== - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== - -lodash.kebabcase@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" - integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== - -lodash.map@^4.5.1: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" - integrity sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q== - -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.mergewith@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" - integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== - -lodash.snakecase@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" - integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== - -lodash.startcase@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" - integrity sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== - -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== - -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== - -lodash.upperfirst@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" - integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== - -lodash@4.17.21, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@4.1.0, log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -log-update@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-5.0.1.tgz#9e928bf70cb183c1f0c9e91d9e6b7115d597ce09" - integrity sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw== - dependencies: - ansi-escapes "^5.0.0" - cli-cursor "^4.0.0" - slice-ansi "^5.0.0" - strip-ansi "^7.0.1" - wrap-ansi "^8.0.1" - -logform@^2.3.2, logform@^2.4.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/logform/-/logform-2.6.0.tgz#8c82a983f05d6eaeb2d75e3decae7a768b2bf9b5" - integrity sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ== - dependencies: - "@colors/colors" "1.6.0" - "@types/triple-beam" "^1.3.2" - fecha "^4.2.0" - ms "^2.1.1" - safe-stable-stringify "^2.3.1" - triple-beam "^1.3.0" - -longest@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-2.0.1.tgz#781e183296aa94f6d4d916dc335d0d17aefa23f8" - integrity sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q== - -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@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -lru_map@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" - integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -map-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== - -map-obj@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" - integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== - -markdown-table@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" - integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== - -match-all@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/match-all/-/match-all-1.2.6.tgz#66d276ad6b49655551e63d3a6ee53e8be0566f8d" - integrity sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ== - -mcl-wasm@^0.7.1: - version "0.7.9" - resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.9.tgz#c1588ce90042a8700c3b60e40efb339fc07ab87f" - integrity sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ== - -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" - -memory-level@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692" - integrity sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og== - dependencies: - abstract-level "^1.0.0" - functional-red-black-tree "^1.0.1" - module-error "^1.0.1" - -memory-pager@^1.0.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" - integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== - -memorystream@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" - integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== - -meow@^8.0.0, meow@^8.1.2: - version "8.1.2" - resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" - integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== - dependencies: - "@types/minimist" "^1.2.0" - camelcase-keys "^6.2.2" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "4.1.0" - normalize-package-data "^3.0.0" - read-pkg-up "^7.0.1" - redent "^3.0.0" - trim-newlines "^3.0.0" - type-fest "^0.18.0" - yargs-parser "^20.2.3" - -merge-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.2.3, 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== - -merge@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/merge/-/merge-2.1.1.tgz#59ef4bf7e0b3e879186436e8481c06a6c162ca98" - integrity sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w== - -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.5, micromatch@^4.0.2, 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" - -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: - 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@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - -min-indent@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - 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@2 || 3", minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" - integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== - dependencies: - brace-expansion "^2.0.1" - -minimatch@9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^5.0.1: - version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" - -minimist-options@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" - integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - kind-of "^6.0.3" - -minimist@1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== - -minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -mkdirp@0.5.x, 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== - -mnemonist@^0.38.0: - version "0.38.5" - resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" - integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg== - dependencies: - obliterator "^2.0.0" - -mocha@^10.0.0, mocha@^10.1.0, mocha@^10.2.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.4.0.tgz#ed03db96ee9cfc6d20c56f8e2af07b961dbae261" - integrity sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA== - dependencies: - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.3" - debug "4.3.4" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "8.1.0" - he "1.2.0" - js-yaml "4.1.0" - log-symbols "4.1.0" - minimatch "5.0.1" - ms "2.1.3" - serialize-javascript "6.0.0" - strip-json-comments "3.1.1" - supports-color "8.1.1" - workerpool "6.2.1" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" - -module-error@^1.0.1, module-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" - integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== - -mongodb-connection-string-url@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.0.tgz#b4f87f92fd8593f3b9365f592515a06d304a1e9c" - integrity sha512-t1Vf+m1I5hC2M5RJx/7AtxgABy1cZmIPQRMXw+gEIPn/cZNF3Oiy+l0UIypUwVB5trcWHq3crg2g3uAR9aAwsQ== - dependencies: - "@types/whatwg-url" "^11.0.2" - whatwg-url "^13.0.0" - -mongodb@6.5.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-6.5.0.tgz#3735b4fba085b26ca06f7744e9639bc538e93d87" - integrity sha512-Fozq68InT+JKABGLqctgtb8P56pRrJFkbhW0ux+x1mdHeyinor8oNzJqwLjV/t5X5nJGfTlluxfyMnOXNggIUA== - dependencies: - "@mongodb-js/saslprep" "^1.1.5" - bson "^6.4.0" - mongodb-connection-string-url "^3.0.0" - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3, ms@^2.0.0, ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -murmur-128@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/murmur-128/-/murmur-128-0.2.1.tgz#a9f6568781d2350ecb1bf80c14968cadbeaa4b4d" - integrity sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg== - dependencies: - encode-utf8 "^1.0.2" - fmix "^0.1.0" - imul "^1.0.0" - -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -napi-macros@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.2.2.tgz#817fef20c3e0e40a963fbf7b37d1600bd0201044" - integrity sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g== - -natural-compare-lite@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" - integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== - -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== - -node-addon-api@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" - integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== - -node-emoji@^1.10.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" - integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== - dependencies: - lodash "^4.17.21" - -node-fetch@^2.7.0: - 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.0, node-gyp-build@^4.3.0: - 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== - -nodemon@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.1.0.tgz#ff7394f2450eb6a5e96fe4180acd5176b29799c9" - integrity sha512-xqlktYlDMCepBJd43ZQhjWwMw2obW/JRvkrLxq5RCNcuDDX1DbcPT+qT1IlIIdf+DhnWs90JpTMe+Y5KxOchvA== - dependencies: - chokidar "^3.5.2" - debug "^4" - ignore-by-default "^1.0.1" - minimatch "^3.1.2" - pstree.remy "^1.1.8" - semver "^7.5.3" - simple-update-notifier "^2.0.0" - supports-color "^5.5.0" - touch "^3.1.0" - undefsafe "^2.0.5" - -nofilter@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" - integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== - -nopt@3.x: - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg== - dependencies: - abbrev "1" - -nopt@~1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" - integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== - dependencies: - abbrev "1" - -normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-package-data@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" - integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== - dependencies: - hosted-git-info "^4.0.1" - is-core-module "^2.5.0" - semver "^7.3.4" - validate-npm-package-license "^3.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -npm-run-path@^5.1.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" - integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== - dependencies: - path-key "^4.0.0" - -number-to-bn@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" - integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig== - dependencies: - bn.js "4.11.6" - strip-hex-prefix "1.0.0" - -object-assign@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -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-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== - -obliterator@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" - integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== - -once@1.x, once@^1.3.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" - -one-time@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" - integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== - dependencies: - fn.name "1.x.x" - -onetime@^5.1.0, onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - -open@^7.4.2: - version "7.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" - integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== - dependencies: - is-docker "^2.0.0" - is-wsl "^2.1.1" - -openzeppelin-solidity@^4.8.1: - version "4.8.1" - resolved "https://registry.yarnpkg.com/openzeppelin-solidity/-/openzeppelin-solidity-4.8.1.tgz#2ab492a5a53a5520401e94df36e43807de7a3b50" - integrity sha512-KM0pVpfrCBdifqN2ZeJZFvFuoGz3GmI4Ty/ceKNkcaf7VVWo/rLOfc5EiLh+Ukb5NadNmYo8WMeGhFA8hVWDpg== - -optionator@^0.8.1: - 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.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.5" - -ora@^5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" - integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== - dependencies: - bl "^4.1.0" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-spinners "^2.5.0" - is-interactive "^1.0.0" - is-unicode-supported "^0.1.0" - log-symbols "^4.1.0" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - -ordinal@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/ordinal/-/ordinal-1.0.3.tgz#1a3c7726a61728112f50944ad7c35c06ae3a0d4d" - integrity sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ== - -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-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - -p-limit@^2.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@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== - dependencies: - p-limit "^1.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - 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-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -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-cache-control@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e" - integrity sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg== - -parse-json@^5.0.0, parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== - -patch-package@8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-8.0.0.tgz#d191e2f1b6e06a4624a0116bcb88edd6714ede61" - integrity sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA== - dependencies: - "@yarnpkg/lockfile" "^1.1.0" - chalk "^4.1.2" - ci-info "^3.7.0" - cross-spawn "^7.0.3" - find-yarn-workspace-root "^2.0.0" - fs-extra "^9.0.0" - json-stable-stringify "^1.0.2" - klaw-sync "^6.0.0" - minimist "^1.2.6" - open "^7.4.2" - rimraf "^2.6.3" - semver "^7.5.3" - slash "^2.0.0" - tmp "^0.0.33" - yaml "^2.2.2" - -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-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - -path-parse@^1.0.6, 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.17: - 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.0.4, picomatch@^2.2.1, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pidtree@0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" - integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pinst@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pinst/-/pinst-3.0.0.tgz#80dec0a85f1f993c6084172020f3dbf512897eec" - integrity sha512-cengSmBxtCyaJqtRSvJorIIZXMXg+lJ3sIljGmtBGUVonMnMsVJbnzl6jGN1HkOWwxNuJynCJ2hXxxqCQrFDdw== - -pluralize@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" - integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== - -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-plugin-solidity@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.3.1.tgz#59944d3155b249f7f234dee29f433524b9a4abcf" - integrity sha512-MN4OP5I2gHAzHZG1wcuJl0FsLS3c4Cc5494bbg+6oQWBPuEamjwDvmGfFMZ6NFzsh3Efd9UUxeT7ImgjNH4ozA== - dependencies: - "@solidity-parser/parser" "^0.17.0" - semver "^7.5.4" - solidity-comments-extractor "^0.0.8" - -prettier-plugin-solidity@^1.3.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.4.1.tgz#8060baf18853a9e34d2e09e47e87b4f19e15afe9" - integrity sha512-Mq8EtfacVZ/0+uDKTtHZGW3Aa7vEbX/BNx63hmVg6YTiTXSiuKP0amj0G6pGwjmLaOfymWh3QgXEZkjQbU8QRg== - dependencies: - "@solidity-parser/parser" "^0.18.0" - semver "^7.5.4" - -prettier@^2.1.2, prettier@^2.3.1, prettier@^2.8.3, prettier@^2.8.7: - version "2.8.8" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" - integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== - -prettier@^3.0.3: - version "3.2.5" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" - integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== - -prettier@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" - integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== - -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== - -promise@^8.0.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" - integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== - dependencies: - asap "~2.0.6" - -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - -pstree.remy@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" - integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== - -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.4.0, qs@^6.9.4: - 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" - -queue-microtask@^1.2.2, queue-microtask@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -quick-lru@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" - integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== - -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" - -raw-body@^2.4.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" - integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -read-pkg-up@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" - integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - -readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@^2.2.2: - 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" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -readonly-date@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/readonly-date/-/readonly-date-1.0.0.tgz#5af785464d8c7d7c40b9d738cbde8c646f97dcd9" - integrity sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ== - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== - dependencies: - resolve "^1.1.6" - -recursive-readdir@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" - integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== - dependencies: - minimatch "^3.0.5" - -redent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" - integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== - dependencies: - indent-string "^4.0.0" - strip-indent "^3.0.0" - -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== - -regenerator-runtime@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" - integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== - -req-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/req-cwd/-/req-cwd-2.0.0.tgz#d4082b4d44598036640fb73ddea01ed53db49ebc" - integrity sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ== - dependencies: - req-from "^2.0.0" - -req-from@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/req-from/-/req-from-2.0.0.tgz#d74188e47f93796f4aa71df6ee35ae689f3e0e70" - integrity sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA== - dependencies: - resolve-from "^3.0.0" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-from-string@^2.0.0, require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -resolve-dir@^1.0.0, resolve-dir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" - integrity sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg== - dependencies: - expand-tilde "^2.0.0" - global-modules "^1.0.0" - -resolve-from@5.0.0, resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== - -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-global@1.0.0, resolve-global@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-global/-/resolve-global-1.0.0.tgz#a2a79df4af2ca3f49bf77ef9ddacd322dad19255" - integrity sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw== - dependencies: - global-dirs "^0.1.1" - -resolve@1.1.x: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== - -resolve@1.17.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== - dependencies: - path-parse "^1.0.6" - -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.8.1: - 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@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -restore-cursor@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-4.0.0.tgz#519560a4318975096def6e609d44100edaa4ccb9" - integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== - dependencies: - onetime "^5.1.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== - -rfdc@^1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f" - integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg== - -rimraf@^2.2.8, rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - 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" - -rlp@^2.2.3, rlp@^2.2.4: - version "2.2.7" - resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" - integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== - dependencies: - bn.js "^5.2.0" - -rpc-websockets@^7.5.1: - version "7.10.0" - resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.10.0.tgz#8ffaf6aaab3eb18e603c7549988cf49feeddcd29" - integrity sha512-cemZ6RiDtYZpPiBzYijdOrkQQzmBCmug0E9SdRH2gIUNT15ql4mwCYWIp0VnSZq6Qrw/JkGUygp4PrK1y9KfwQ== - dependencies: - "@babel/runtime" "^7.17.2" - eventemitter3 "^4.0.7" - uuid "^8.3.2" - ws "^8.5.0" - optionalDependencies: - bufferutil "^4.0.1" - utf-8-validate "^5.0.2" - -run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - -run-parallel-limit@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz#be80e936f5768623a38a963262d6bef8ff11e7ba" - integrity sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw== - dependencies: - queue-microtask "^1.2.2" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rustbn.js@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" - integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== - -rxjs@^7.5.5: - version "7.8.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" - integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== - dependencies: - tslib "^2.1.0" - -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-stable-stringify@^2.3.1: - version "2.4.3" - resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" - integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sc-istanbul@^0.4.5: - version "0.4.6" - resolved "https://registry.yarnpkg.com/sc-istanbul/-/sc-istanbul-0.4.6.tgz#cf6784355ff2076f92d70d59047d71c13703e839" - integrity sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g== - dependencies: - abbrev "1.0.x" - async "1.x" - escodegen "1.8.x" - esprima "2.7.x" - glob "^5.0.15" - handlebars "^4.0.1" - js-yaml "3.x" - mkdirp "0.5.x" - nopt "3.x" - once "1.x" - resolve "1.1.x" - supports-color "^3.1.0" - which "^1.1.1" - wordwrap "^1.0.0" - -scrypt-js@3.0.1, scrypt-js@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" - integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== - -secp256k1@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" - integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== - dependencies: - elliptic "^6.5.4" - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - -"semver@2 || 3 || 4 || 5", semver@^5.5.0: - version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -semver@7.5.4: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -semver@^6.3.0: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.3.4, semver@^7.3.7, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4: - 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.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== - dependencies: - randombytes "^2.1.0" - -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" - -setimmediate@^1.0.5: - 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== - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - 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" - -sha1@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/sha1/-/sha1-1.1.1.tgz#addaa7a93168f393f19eb2b15091618e2700f848" - integrity sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA== - dependencies: - charenc ">= 0.0.1" - crypt ">= 0.0.1" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shelljs@^0.8.3, shelljs@^0.8.5: - version "0.8.5" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" - integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - -shx@^0.3.4: - version "0.3.4" - resolved "https://registry.yarnpkg.com/shx/-/shx-0.3.4.tgz#74289230b4b663979167f94e1935901406e40f02" - integrity sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g== - dependencies: - minimist "^1.2.3" - shelljs "^0.8.5" - -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.2, signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== - dependencies: - is-arrayish "^0.3.1" - -simple-update-notifier@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" - integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== - dependencies: - semver "^7.5.3" - -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== - -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@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -slice-ansi@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" - integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== - dependencies: - ansi-styles "^6.0.0" - is-fullwidth-code-point "^4.0.0" - -solc@0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" - integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== - dependencies: - command-exists "^1.2.8" - commander "3.0.2" - follow-redirects "^1.12.1" - fs-extra "^0.30.0" - js-sha3 "0.8.0" - memorystream "^0.3.1" - require-from-string "^2.0.0" - semver "^5.5.0" - tmp "0.0.33" - -solhint-plugin-prettier@^0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/solhint-plugin-prettier/-/solhint-plugin-prettier-0.0.5.tgz#e3b22800ba435cd640a9eca805a7f8bc3e3e6a6b" - integrity sha512-7jmWcnVshIrO2FFinIvDQmhQpfpS2rRRn3RejiYgnjIE68xO2bvrYvjqVNfrio4xH9ghOqn83tKuTzLjEbmGIA== - dependencies: - prettier-linter-helpers "^1.0.0" - -solhint@^3.3.7: - version "3.6.2" - resolved "https://registry.yarnpkg.com/solhint/-/solhint-3.6.2.tgz#2b2acbec8fdc37b2c68206a71ba89c7f519943fe" - integrity sha512-85EeLbmkcPwD+3JR7aEMKsVC9YrRSxd4qkXuMzrlf7+z2Eqdfm1wHWq1ffTuo5aDhoZxp2I9yF3QkxZOxOL7aQ== - dependencies: - "@solidity-parser/parser" "^0.16.0" - ajv "^6.12.6" - antlr4 "^4.11.0" - ast-parents "^0.0.1" - chalk "^4.1.2" - commander "^10.0.0" - cosmiconfig "^8.0.0" - fast-diff "^1.2.0" - glob "^8.0.3" - ignore "^5.2.4" - js-yaml "^4.1.0" - lodash "^4.17.21" - pluralize "^8.0.0" - semver "^7.5.2" - strip-ansi "^6.0.1" - table "^6.8.1" - text-table "^0.2.0" - optionalDependencies: - prettier "^2.8.3" - -solidity-comments-extractor@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/solidity-comments-extractor/-/solidity-comments-extractor-0.0.8.tgz#f6e148ab0c49f30c1abcbecb8b8df01ed8e879f8" - integrity sha512-htM7Vn6LhHreR+EglVMd2s+sZhcXAirB1Zlyrv5zBuTxieCvjfnRpd7iZk75m/u6NOlEyQ94C6TWbBn2cY7w8g== - -solidity-coverage@^0.8.2: - version "0.8.12" - resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.8.12.tgz#c4fa2f64eff8ada7a1387b235d6b5b0e6c6985ed" - integrity sha512-8cOB1PtjnjFRqOgwFiD8DaUsYJtVJ6+YdXQtSZDrLGf8cdhhh8xzTtGzVTGeBf15kTv0v7lYPJlV/az7zLEPJw== - dependencies: - "@ethersproject/abi" "^5.0.9" - "@solidity-parser/parser" "^0.18.0" - chalk "^2.4.2" - death "^1.1.0" - difflib "^0.2.4" - fs-extra "^8.1.0" - ghost-testrpc "^0.0.2" - global-modules "^2.0.0" - globby "^10.0.1" - jsonschema "^1.2.4" - lodash "^4.17.21" - mocha "^10.2.0" - node-emoji "^1.10.0" - pify "^4.0.1" - recursive-readdir "^2.2.2" - sc-istanbul "^0.4.5" - semver "^7.3.4" - shelljs "^0.8.3" - web3-utils "^1.3.6" - -solidity-rlp@2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/solidity-rlp/-/solidity-rlp-2.0.8.tgz#1548370b690ef06dbb62af06b7675bc86b19bbe3" - integrity sha512-gzYzHoFKRH1ydJeCfzm3z/BvKrZGK/V9+qbOlNbBcRAYeizjCdDNhLTTE8iIJrHqsRrZRSOo+7mhbnxoBoZvJQ== - -source-map-support@^0.5.13: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.5.0: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -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== - -source-map@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" - integrity sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA== - dependencies: - amdefine ">=0.0.4" - -sparse-bitfield@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11" - integrity sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ== - dependencies: - memory-pager "^1.0.2" - -spdx-correct@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" - integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" - integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.17" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz#887da8aa73218e51a1d917502d79863161a93f9c" - integrity sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg== - -split2@^3.0.0, split2@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" - integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== - dependencies: - readable-stream "^3.0.0" - -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== - -stack-trace@0.0.x: - version "0.0.10" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" - integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== - -stacktrace-parser@^0.1.10: - version "0.1.10" - resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" - integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== - dependencies: - type-fest "^0.7.1" - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -string-argv@0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" - integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== - -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@^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@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.0, string-width@^5.0.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - 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@^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@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-bom@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - -strip-hex-prefix@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" - integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== - dependencies: - is-hex-prefixed "1.0.0" - -strip-indent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" - integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== - dependencies: - min-indent "^1.0.0" - -strip-json-comments@3.1.1, strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -superstruct@^0.14.2: - version "0.14.2" - resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.14.2.tgz#0dbcdf3d83676588828f1cf5ed35cda02f59025b" - integrity sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ== - -supports-color@8.1.1: - 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-color@^3.1.0: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A== - dependencies: - has-flag "^1.0.0" - -supports-color@^5.3.0, supports-color@^5.5.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-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== - -sync-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/sync-request/-/sync-request-6.1.0.tgz#e96217565b5e50bbffe179868ba75532fb597e68" - integrity sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw== - dependencies: - http-response-object "^3.0.1" - sync-rpc "^1.2.1" - then-request "^6.0.0" - -sync-rpc@^1.2.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/sync-rpc/-/sync-rpc-1.3.6.tgz#b2e8b2550a12ccbc71df8644810529deb68665a7" - integrity sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw== - dependencies: - get-port "^3.1.0" - -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@^6.8.0, table@^6.8.1: - version "6.8.2" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.2.tgz#c5504ccf201213fa227248bdc8c5569716ac6c58" - integrity sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA== - dependencies: - ajv "^8.0.1" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - -text-encoding-utf-8@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" - integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== - -text-extensions@^1.0.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" - integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== - -text-hex@1.0.x: - version "1.0.0" - resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" - integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -then-request@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/then-request/-/then-request-6.0.2.tgz#ec18dd8b5ca43aaee5cb92f7e4c1630e950d4f0c" - integrity sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA== - dependencies: - "@types/concat-stream" "^1.6.0" - "@types/form-data" "0.0.33" - "@types/node" "^8.0.0" - "@types/qs" "^6.2.31" - caseless "~0.12.0" - concat-stream "^1.6.0" - form-data "^2.2.0" - http-basic "^8.1.1" - http-response-object "^3.0.1" - promise "^8.0.0" - qs "^6.4.0" - -through2@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" - integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== - dependencies: - readable-stream "3" - -"through@>=2.2.7 <3", 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== - -tmp@0.0.33, tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -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" - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -touch@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" - integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== - dependencies: - nopt "~1.0.10" - -tr46@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-4.1.1.tgz#281a758dcc82aeb4fe38c7dfe4d11a395aac8469" - integrity sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw== - dependencies: - punycode "^2.3.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== - -trim-newlines@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" - integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== - -triple-beam@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" - integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== - -ts-api-utils@^1.0.1: - 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@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-1.0.4.tgz#ce3b5dade5f5d97cf69889c11bf7d2da8555b15a" - integrity sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ== - -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== - -ts-generator@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ts-generator/-/ts-generator-0.1.1.tgz#af46f2fb88a6db1f9785977e9590e7bcd79220ab" - integrity sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ== - dependencies: - "@types/mkdirp" "^0.5.2" - "@types/prettier" "^2.1.1" - "@types/resolve" "^0.0.8" - chalk "^2.4.1" - glob "^7.1.2" - mkdirp "^0.5.1" - prettier "^2.1.2" - resolve "^1.8.1" - ts-essentials "^1.0.0" - -ts-node@^10.8.1, ts-node@^10.9.1: - version "10.9.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" - integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -tslib@^1.8.1, tslib@^1.9.3: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.1.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== - -tsort@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" - integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -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.18.0: - version "0.18.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" - integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -type-fest@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" - integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -type-fest@^1.0.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" - integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== - -typechain@^8.1.1: - 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" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== - -"typescript@^4.6.4 || ^5.2.2", typescript@^5.2.2: - version "5.4.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" - integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== - -typescript@^4.9.3: - version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== - -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== - -uglify-js@^3.1.4: - version "3.17.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" - integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== - -undefsafe@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" - integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== - -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== - -undici@^5.14.0: - version "5.28.4" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068" - integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g== - dependencies: - "@fastify/busboy" "^2.0.0" - -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== - -universalify@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" - integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== - -unpipe@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -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" - -utf-8-validate@^5.0.2: - version "5.0.10" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" - integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== - dependencies: - node-gyp-build "^4.3.0" - -utf8@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" - integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== - -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== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -viem@^2.9.28: - version "2.9.28" - resolved "https://registry.yarnpkg.com/viem/-/viem-2.9.28.tgz#75b6bd110801a4340fee2daa3eb0bffbe9cc990e" - integrity sha512-/1iTg8yQlCNJ+7wSmdsBNB/vhjWqFJtTH6XZXHjGXrZnlBxAtHR5ZAr5TvTJc/2nhVIVE4BkCe5JCrIiSuZodg== - dependencies: - "@adraffy/ens-normalize" "1.10.0" - "@noble/curves" "1.2.0" - "@noble/hashes" "1.3.2" - "@scure/bip32" "1.3.2" - "@scure/bip39" "1.2.1" - abitype "1.0.0" - isows "1.0.3" - ws "8.13.0" - -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== - dependencies: - defaults "^1.0.3" - -web3-utils@^1.3.6: - version "1.10.4" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.4.tgz#0daee7d6841641655d8b3726baf33b08eda1cbec" - integrity sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A== - dependencies: - "@ethereumjs/util" "^8.1.0" - bn.js "^5.2.1" - ethereum-bloom-filters "^1.0.6" - ethereum-cryptography "^2.1.2" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - utf8 "3.0.0" - -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== - -webidl-conversions@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" - integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== - -whatwg-url@^13.0.0: - version "13.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-13.0.0.tgz#b7b536aca48306394a34e44bda8e99f332410f8f" - integrity sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig== - dependencies: - tr46 "^4.1.1" - webidl-conversions "^7.0.0" - -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@^1.1.1, which@^1.2.14, which@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.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" - -winston-transport@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.7.0.tgz#e302e6889e6ccb7f383b926df6936a5b781bd1f0" - integrity sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg== - dependencies: - logform "^2.3.2" - readable-stream "^3.6.0" - triple-beam "^1.3.0" - -winston@^3.11.0: - version "3.13.0" - resolved "https://registry.yarnpkg.com/winston/-/winston-3.13.0.tgz#e76c0d722f78e04838158c61adc1287201de7ce3" - integrity sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ== - dependencies: - "@colors/colors" "^1.6.0" - "@dabh/diagnostics" "^2.0.2" - async "^3.2.3" - is-stream "^2.0.0" - logform "^2.4.0" - one-time "^1.0.0" - readable-stream "^3.4.0" - safe-stable-stringify "^2.3.1" - stack-trace "0.0.x" - triple-beam "^1.3.0" - winston-transport "^4.7.0" - -word-wrap@^1.0.3, word-wrap@^1.2.5, 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== - -wordwrap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== - -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" - -workerpool@6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" - integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.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== - -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.13.0: - version "8.13.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" - integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== - -ws@^7.4.5, ws@^7.4.6: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - -ws@^8.5.0: - version "8.17.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.0.tgz#d145d18eca2ed25aaf791a183903f7be5e295fea" - integrity sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -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== - -yaml@2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b" - integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== - -yaml@^2.2.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.2.tgz#7a2b30f2243a5fc299e1f14ca58d475ed4bc5362" - integrity sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA== - -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== - -yargs-parser@^20.2.2, yargs-parser@^20.2.3: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs-unparser@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" - integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== - dependencies: - camelcase "^6.0.0" - decamelize "^4.0.0" - flat "^5.0.2" - is-plain-obj "^2.1.0" - -yargs@16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yargs@^17.0.0: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zksync-web3@^0.14.3: - version "0.14.4" - resolved "https://registry.yarnpkg.com/zksync-web3/-/zksync-web3-0.14.4.tgz#0b70a7e1a9d45cc57c0971736079185746d46b1f" - integrity sha512-kYehMD/S6Uhe1g434UnaMN+sBr9nQm23Ywn0EUP5BfQCsbjcr3ORuS68PosZw8xUTu3pac7G6YMSnNHk+fwzvg== + version: 3.4.2 + resolution: "@openzeppelin/contracts@npm:3.4.2" + checksum: 0c90f029fe50a49643588e4c8670dae3bbf31795133a6ddce9bdcbc258486332700bb732287baabf7bf807f39182fe8ea2ffa19aa5caf359b1b9c0f083280748 + languageName: node + linkType: hard + +"@openzeppelin/contracts@npm:^4.4.1, @openzeppelin/contracts@npm:^4.9.3": + version: 4.9.6 + resolution: "@openzeppelin/contracts@npm:4.9.6" + checksum: 274b6e968268294f12d5ca4f0278f6e6357792c8bb4d76664f83dbdc325f780541538a127e6a6e97e4f018088b42f65952014dec9c745c0fa25081f43ef9c4bf + languageName: node + linkType: hard + +"@openzeppelin/contracts@npm:~4.3.3": + version: 4.3.3 + resolution: "@openzeppelin/contracts@npm:4.3.3" + checksum: 73eb23e7acc8531931076d11251629bdc8579c99ef921a3facbd8abf7b860bc214c97a4bd56cd67db7c9d1db837765132640f24987aac8097a13960bb41ca6d1 + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 6ad6a00fc4f2f2cfc6bff76fb1d88b8ee20bc0601e18ebb01b6d4be583733a860239a521a7fbca73b612e66705078809483549d2b18f370eb346c5155c8e4a0f + languageName: node + linkType: hard + +"@polytope-labs/ismp-solidity@npm:^0.6.4": + version: 0.6.4 + resolution: "@polytope-labs/ismp-solidity@npm:0.6.4" + dependencies: + "@polytope-labs/solidity-merkle-trees": ^0.3.2 + openzeppelin-solidity: ^4.8.1 + prettier: ^3.3.3 + prettier-plugin-solidity: ^1.3.1 + checksum: 0ec0a648fe48b95a414af7549b61d4fb59310c50c21878883b7712bcca328ec946e1f8dfb62f1413cf88436f9d82006213b52a893aeb03b6eb05ed24322ce4a9 + languageName: node + linkType: hard + +"@polytope-labs/solidity-merkle-trees@npm:0.3.2, @polytope-labs/solidity-merkle-trees@npm:^0.3.2": + version: 0.3.2 + resolution: "@polytope-labs/solidity-merkle-trees@npm:0.3.2" + dependencies: + openzeppelin-solidity: ^4.8.1 + checksum: a758e0dc669138d7ca512bddf1eced89792ac1e00bf725d238e9664df53917bf22c5d5a7c4e2798cbeb036c6aca64af53928a35f36c39eb32466c6024f82c789 + languageName: node + linkType: hard + +"@routerprotocol/evm-gateway-contracts@npm:1.1.13": + version: 1.1.13 + resolution: "@routerprotocol/evm-gateway-contracts@npm:1.1.13" + dependencies: + "@openzeppelin/contracts": ^4.4.1 + "@openzeppelin/contracts-upgradeable": ^4.7.3 + checksum: 08898738eaf06d330a96ada9c1760ddc5ee8e3f7871eca425d1ce66a3c1496766d1509f40aec203b6f1dd6f077696fdf5c7e489ba3291f0377261e556d4999cc + languageName: node + linkType: hard + +"@scure/base@npm:~1.1.0, @scure/base@npm:~1.1.6, @scure/base@npm:~1.1.8": + version: 1.1.8 + resolution: "@scure/base@npm:1.1.8" + checksum: 1fc8a355ba68663c0eb430cf6a2c5ff5af790c347c1ba1953f344e8681ab37e37e2545e495f7f971b0245727d710fea8c1e57d232d0c6c543cbed4965c7596a1 + languageName: node + linkType: hard + +"@scure/bip32@npm:1.1.5": + version: 1.1.5 + resolution: "@scure/bip32@npm:1.1.5" + dependencies: + "@noble/hashes": ~1.2.0 + "@noble/secp256k1": ~1.7.0 + "@scure/base": ~1.1.0 + checksum: b08494ab0d2b1efee7226d1b5100db5157ebea22a78bb87126982a76a186cb3048413e8be0ba2622d00d048a20acbba527af730de86c132a77de616eb9907a3b + languageName: node + linkType: hard + +"@scure/bip32@npm:1.4.0": + version: 1.4.0 + resolution: "@scure/bip32@npm:1.4.0" + dependencies: + "@noble/curves": ~1.4.0 + "@noble/hashes": ~1.4.0 + "@scure/base": ~1.1.6 + checksum: eff491651cbf2bea8784936de75af5fc020fc1bbb9bcb26b2cfeefbd1fb2440ebfaf30c0733ca11c0ae1e272a2ef4c3c34ba5c9fb3e1091c3285a4272045b0c6 + languageName: node + linkType: hard + +"@scure/bip39@npm:1.1.1": + version: 1.1.1 + resolution: "@scure/bip39@npm:1.1.1" + dependencies: + "@noble/hashes": ~1.2.0 + "@scure/base": ~1.1.0 + checksum: fbb594c50696fa9c14e891d872f382e50a3f919b6c96c55ef2fb10c7102c546dafb8f099a62bd114c12a00525b595dcf7381846f383f0ddcedeaa6e210747d2f + languageName: node + linkType: hard + +"@scure/bip39@npm:1.3.0": + version: 1.3.0 + resolution: "@scure/bip39@npm:1.3.0" + dependencies: + "@noble/hashes": ~1.4.0 + "@scure/base": ~1.1.6 + checksum: dbb0b27df753eb6c6380010b25cc9a9ea31f9cb08864fc51e69e5880ff7e2b8f85b72caea1f1f28af165e83b72c48dd38617e43fc632779d025b50ba32ea759e + languageName: node + linkType: hard + +"@scure/bip39@npm:1.4.0": + version: 1.4.0 + resolution: "@scure/bip39@npm:1.4.0" + dependencies: + "@noble/hashes": ~1.5.0 + "@scure/base": ~1.1.8 + checksum: 211f2c01361993bfe54c0e4949f290224381457c7f76d7cd51d6a983f3f4b6b9f85adfd0e623977d777ed80417a5fe729eb19dd34e657147810a0e58a8e7b9e0 + languageName: node + linkType: hard + +"@sentry/core@npm:5.30.0": + version: 5.30.0 + resolution: "@sentry/core@npm:5.30.0" + dependencies: + "@sentry/hub": 5.30.0 + "@sentry/minimal": 5.30.0 + "@sentry/types": 5.30.0 + "@sentry/utils": 5.30.0 + tslib: ^1.9.3 + checksum: 8a2b22687e70d76fa4381bce215d770b6c08561c5ff5d6afe39c8c3c509c18ee7384ad0be3aee18d3a858a3c88e1d2821cf10eb5e05646376a33200903b56da2 + languageName: node + linkType: hard + +"@sentry/hub@npm:5.30.0": + version: 5.30.0 + resolution: "@sentry/hub@npm:5.30.0" + dependencies: + "@sentry/types": 5.30.0 + "@sentry/utils": 5.30.0 + tslib: ^1.9.3 + checksum: 09f778cc78765213f1e35a3ee6da3a8e02a706e8a7e5b7f84614707f4b665c7297b700a1849ab2ca1f02ede5884fd9ae893e58dc65f04f35ccdfee17e99ee93d + languageName: node + linkType: hard + +"@sentry/minimal@npm:5.30.0": + version: 5.30.0 + resolution: "@sentry/minimal@npm:5.30.0" + dependencies: + "@sentry/hub": 5.30.0 + "@sentry/types": 5.30.0 + tslib: ^1.9.3 + checksum: 934650f6989ce51f425c7c4b4d4d9bfecface8162a36d21df8a241f780ab1716dd47b81e2170e4cc624797ed1eebe10f71e4876c1e25b787860daaef75ca7a0c + languageName: node + linkType: hard + +"@sentry/node@npm:^5.18.1": + version: 5.30.0 + resolution: "@sentry/node@npm:5.30.0" + dependencies: + "@sentry/core": 5.30.0 + "@sentry/hub": 5.30.0 + "@sentry/tracing": 5.30.0 + "@sentry/types": 5.30.0 + "@sentry/utils": 5.30.0 + cookie: ^0.4.1 + https-proxy-agent: ^5.0.0 + lru_map: ^0.3.3 + tslib: ^1.9.3 + checksum: 5f0367cc52f9d716c64ba727e2a5c8592364494c8fdadfb3df2d0ee9d7956b886fb3ec674370292d2a7b7e1d9a8e1b84c69c06e8a4a064be8d4687698df0090c + languageName: node + linkType: hard + +"@sentry/tracing@npm:5.30.0": + version: 5.30.0 + resolution: "@sentry/tracing@npm:5.30.0" + dependencies: + "@sentry/hub": 5.30.0 + "@sentry/minimal": 5.30.0 + "@sentry/types": 5.30.0 + "@sentry/utils": 5.30.0 + tslib: ^1.9.3 + checksum: 720c07b111e8128e70a939ab4e9f9cfd13dc23303b27575afddabab08d08f9b94499017c76a9ffe253bf3ca40833e8f9262cf6dc546ba24da6eb74fedae5f92b + languageName: node + linkType: hard + +"@sentry/types@npm:5.30.0": + version: 5.30.0 + resolution: "@sentry/types@npm:5.30.0" + checksum: de7df777824c8e311f143c6fd7de220b24f25b5018312fe8f67d93bebf0f3cdd32bbca9f155846f5c31441d940eebe27c8338000321559a743264c7e41dda560 + languageName: node + linkType: hard + +"@sentry/utils@npm:5.30.0": + version: 5.30.0 + resolution: "@sentry/utils@npm:5.30.0" + dependencies: + "@sentry/types": 5.30.0 + tslib: ^1.9.3 + checksum: 27b259a136c664427641dd32ee3dc490553f3b5e92986accfa829d14063ebc69b191e92209ac9c40fbc367f74cfa17dc93b4c40981d666711fd57b4d51a82062 + languageName: node + linkType: hard + +"@solana/buffer-layout@npm:^4.0.1": + version: 4.0.1 + resolution: "@solana/buffer-layout@npm:4.0.1" + dependencies: + buffer: ~6.0.3 + checksum: bf846888e813187243d4008a7a9f58b49d16cbd995b9d7f1b72898aa510ed77b1ce5e8468e7b2fd26dd81e557a4e74a666e21fccb95f123c1f740d41138bbacd + languageName: node + linkType: hard + +"@solana/web3.js@npm:^1.78.0": + version: 1.95.3 + resolution: "@solana/web3.js@npm:1.95.3" + dependencies: + "@babel/runtime": ^7.25.0 + "@noble/curves": ^1.4.2 + "@noble/hashes": ^1.4.0 + "@solana/buffer-layout": ^4.0.1 + agentkeepalive: ^4.5.0 + bigint-buffer: ^1.1.5 + bn.js: ^5.2.1 + borsh: ^0.7.0 + bs58: ^4.0.1 + buffer: 6.0.3 + fast-stable-stringify: ^1.0.0 + jayson: ^4.1.1 + node-fetch: ^2.7.0 + rpc-websockets: ^9.0.2 + superstruct: ^2.0.2 + checksum: 6951eb12275de09ef9422fc65982b7496f3d11253b4cd1b09694dd2135d92aa272a04a7adf50ef0136a459b08ea40e07f6e7cbf1970cae44d6193d93fe6acc1f + languageName: node + linkType: hard + +"@solidity-parser/parser@npm:^0.14.0": + version: 0.14.5 + resolution: "@solidity-parser/parser@npm:0.14.5" + dependencies: + antlr4ts: ^0.5.0-alpha.4 + checksum: 9e85a0d4f8a05a11db6022444b70b2f353e2358467b1cce44cdda703ae1e3c7337e1b8cbc2eec8e14a8f34f9c60b42f325e5fe9b3c934cc980e35091e292d7ee + languageName: node + linkType: hard + +"@solidity-parser/parser@npm:^0.16.0": + version: 0.16.2 + resolution: "@solidity-parser/parser@npm:0.16.2" + dependencies: + antlr4ts: ^0.5.0-alpha.4 + checksum: 109f7bec5de943c63e444fdde179d9bba6a592c18c836f585753798f428424cfcca72c715e7a345e4b79b83d6548543c9e56cb4b263e9b1e8352af2efcfd224a + languageName: node + linkType: hard + +"@solidity-parser/parser@npm:^0.18.0": + version: 0.18.0 + resolution: "@solidity-parser/parser@npm:0.18.0" + checksum: 970d991529d632862fa88e107531339d84df35bf0374e31e8215ce301b19a01ede33fccf4d374402649814263f8bc278a8e6d62a0129bb877539fbdd16a604cc + languageName: node + linkType: hard + +"@swc/helpers@npm:^0.5.11": + version: 0.5.13 + resolution: "@swc/helpers@npm:0.5.13" + dependencies: + tslib: ^2.4.0 + checksum: d50c2c10da6ef940af423c6b03ad9c3c94cf9de59314b1e921a7d1bcc081a6074481c9d67b655fc8fe66a73288f98b25950743792a63882bfb5793b362494fc0 + languageName: node + linkType: hard + +"@trivago/prettier-plugin-sort-imports@npm:^4.0.0": + version: 4.3.0 + resolution: "@trivago/prettier-plugin-sort-imports@npm:4.3.0" + dependencies: + "@babel/generator": 7.17.7 + "@babel/parser": ^7.20.5 + "@babel/traverse": 7.23.2 + "@babel/types": 7.17.0 + javascript-natural-sort: 0.7.1 + lodash: ^4.17.21 + peerDependencies: + "@vue/compiler-sfc": 3.x + prettier: 2.x - 3.x + peerDependenciesMeta: + "@vue/compiler-sfc": + optional: true + checksum: 22bb311ca24f09eef25915a66727e7be113b703f196f6ea0589dc9730b11a6f1e5e4bcc468213101d138b570d310792c83abb8d9487c53f9e597942fea052b6e + languageName: node + linkType: hard + +"@tsconfig/node10@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node10@npm:1.0.11" + checksum: 51fe47d55fe1b80ec35e6e5ed30a13665fd3a531945350aa74a14a1e82875fb60b350c2f2a5e72a64831b1b6bc02acb6760c30b3738b54954ec2dea82db7a267 + languageName: node + linkType: hard + +"@tsconfig/node12@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node12@npm:1.0.11" + checksum: 5ce29a41b13e7897a58b8e2df11269c5395999e588b9a467386f99d1d26f6c77d1af2719e407621412520ea30517d718d5192a32403b8dfcc163bf33e40a338a + languageName: node + linkType: hard + +"@tsconfig/node14@npm:^1.0.0": + version: 1.0.3 + resolution: "@tsconfig/node14@npm:1.0.3" + checksum: 19275fe80c4c8d0ad0abed6a96dbf00642e88b220b090418609c4376e1cef81bf16237bf170ad1b341452feddb8115d8dd2e5acdfdea1b27422071163dc9ba9d + languageName: node + linkType: hard + +"@tsconfig/node16@npm:^1.0.2": + version: 1.0.4 + resolution: "@tsconfig/node16@npm:1.0.4" + checksum: 202319785901f942a6e1e476b872d421baec20cf09f4b266a1854060efbf78cde16a4d256e8bc949d31e6cd9a90f1e8ef8fb06af96a65e98338a2b6b0de0a0ff + languageName: node + linkType: hard + +"@typechain/ethers-v5@npm:^10.1.1": + version: 10.2.1 + resolution: "@typechain/ethers-v5@npm:10.2.1" + dependencies: + lodash: ^4.17.15 + ts-essentials: ^7.0.1 + peerDependencies: + "@ethersproject/abi": ^5.0.0 + "@ethersproject/providers": ^5.0.0 + ethers: ^5.1.3 + typechain: ^8.1.1 + typescript: ">=4.3.0" + checksum: 852da4b1ff368ef87251111a5d50077de3d0fc12c519529269a74223740f8bda89297e67a5eb6c1f5b04ee23119566d6cbccf58264d32a83132be0f328a58d22 + languageName: node + linkType: hard + +"@typechain/hardhat@npm:^6.1.4": + version: 6.1.6 + resolution: "@typechain/hardhat@npm:6.1.6" + dependencies: + fs-extra: ^9.1.0 + peerDependencies: + "@ethersproject/abi": ^5.4.7 + "@ethersproject/providers": ^5.4.7 + "@typechain/ethers-v5": ^10.2.1 + ethers: ^5.4.7 + hardhat: ^2.9.9 + typechain: ^8.1.1 + checksum: f214bebf7860956230478cb92696ba757829cfd9dc65ac99c3bc7e539378310318d92b009054186f446595c8ffc1a81e9c6d028da0eb04253253049ea1b6e8d3 + languageName: node + linkType: hard + +"@types/bn.js@npm:^4.11.3": + version: 4.11.6 + resolution: "@types/bn.js@npm:4.11.6" + dependencies: + "@types/node": "*" + checksum: 7f66f2c7b7b9303b3205a57184261974b114495736b77853af5b18d857c0b33e82ce7146911e86e87a87837de8acae28986716fd381ac7c301fd6e8d8b6c811f + languageName: node + linkType: hard + +"@types/bn.js@npm:^5.1.0": + version: 5.1.5 + resolution: "@types/bn.js@npm:5.1.5" + dependencies: + "@types/node": "*" + checksum: c87b28c4af74545624f8a3dae5294b16aa190c222626e8d4b2e327b33b1a3f1eeb43e7a24d914a9774bca43d8cd6e1cb0325c1f4b3a244af6693a024e1d918e6 + languageName: node + linkType: hard + +"@types/chai-as-promised@npm:^7.1.3": + version: 7.1.8 + resolution: "@types/chai-as-promised@npm:7.1.8" + dependencies: + "@types/chai": "*" + checksum: f0e5eab451b91bc1e289ed89519faf6591932e8a28d2ec9bbe95826eb73d28fe43713633e0c18706f3baa560a7d97e7c7c20dc53ce639e5d75bac46b2a50bf21 + languageName: node + linkType: hard + +"@types/chai@npm:*, @types/chai@npm:^4.3.4": + version: 4.3.19 + resolution: "@types/chai@npm:4.3.19" + checksum: abd4d3239735054f3b6e8163e45bc6495f66469729fbcf4784c9f2b82361a6845d45ab9c518818c78eafa46d015e3a72306e9949d1333e10d7eaedf426af4261 + languageName: node + linkType: hard + +"@types/concat-stream@npm:^1.6.0": + version: 1.6.1 + resolution: "@types/concat-stream@npm:1.6.1" + dependencies: + "@types/node": "*" + checksum: 7d211e74331affd3578b5469244f5cef84a93775f38332adb3ef12413559a23862bc682c6873d0a404b01c9d5d5f7d3ae091fe835b435b633eb420e3055b3e56 + languageName: node + linkType: hard + +"@types/connect@npm:^3.4.33": + version: 3.4.38 + resolution: "@types/connect@npm:3.4.38" + dependencies: + "@types/node": "*" + checksum: 7eb1bc5342a9604facd57598a6c62621e244822442976c443efb84ff745246b10d06e8b309b6e80130026a396f19bf6793b7cecd7380169f369dac3bfc46fb99 + languageName: node + linkType: hard + +"@types/conventional-commits-parser@npm:^5.0.0": + version: 5.0.0 + resolution: "@types/conventional-commits-parser@npm:5.0.0" + dependencies: + "@types/node": "*" + checksum: 88013c53adccaf359a429412c5d835990a88be33218f01f85eb04cf839a7d5bef51dd52b83a3032b00153e9f3ce4a7e84ff10b0a1f833c022c5e999b00eef24c + languageName: node + linkType: hard + +"@types/form-data@npm:0.0.33": + version: 0.0.33 + resolution: "@types/form-data@npm:0.0.33" + dependencies: + "@types/node": "*" + checksum: f0c283fdef2dd7191168a37b9cb2625af3cfbd7f72b5a514f938bea0a135669f79d736186d434b9e81150b47ef1bf20d97b188014a00583556fad6ce59fb9bbf + languageName: node + linkType: hard + +"@types/fs-extra@npm:^9.0.13": + version: 9.0.13 + resolution: "@types/fs-extra@npm:9.0.13" + dependencies: + "@types/node": "*" + checksum: add79e212acd5ac76b97b9045834e03a7996aef60a814185e0459088fd290519a3c1620865d588fa36c4498bf614210d2a703af5cf80aa1dbc125db78f6edac3 + languageName: node + linkType: hard + +"@types/glob@npm:^7.1.1": + version: 7.2.0 + resolution: "@types/glob@npm:7.2.0" + dependencies: + "@types/minimatch": "*" + "@types/node": "*" + checksum: 6ae717fedfdfdad25f3d5a568323926c64f52ef35897bcac8aca8e19bc50c0bd84630bbd063e5d52078b2137d8e7d3c26eabebd1a2f03ff350fff8a91e79fc19 + languageName: node + linkType: hard + +"@types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.9": + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: 97ed0cb44d4070aecea772b7b2e2ed971e10c81ec87dd4ecc160322ffa55ff330dace1793489540e3e318d90942064bb697cc0f8989391797792d919737b3b98 + languageName: node + linkType: hard + +"@types/lru-cache@npm:^5.1.0": + version: 5.1.1 + resolution: "@types/lru-cache@npm:5.1.1" + checksum: e1d6c0085f61b16ec5b3073ec76ad1be4844ea036561c3f145fc19f71f084b58a6eb600b14128aa95809d057d28f1d147c910186ae51219f58366ffd2ff2e118 + languageName: node + linkType: hard + +"@types/minimatch@npm:*": + version: 5.1.2 + resolution: "@types/minimatch@npm:5.1.2" + checksum: 0391a282860c7cb6fe262c12b99564732401bdaa5e395bee9ca323c312c1a0f45efbf34dce974682036e857db59a5c9b1da522f3d6055aeead7097264c8705a8 + languageName: node + linkType: hard + +"@types/minimist@npm:^1.2.0": + version: 1.2.5 + resolution: "@types/minimist@npm:1.2.5" + checksum: 477047b606005058ab0263c4f58097136268007f320003c348794f74adedc3166ffc47c80ec3e94687787f2ab7f4e72c468223946e79892cf0fd9e25e9970a90 + languageName: node + linkType: hard + +"@types/mkdirp@npm:^0.5.2": + version: 0.5.2 + resolution: "@types/mkdirp@npm:0.5.2" + dependencies: + "@types/node": "*" + checksum: 21e6681ee18cee6314dbe0f57ada48981912b76de8266f438ba2573770d60aaa8dd376baad3f20e2346696a7cca84b0aadd1737222341553a0091831a46e6ad1 + languageName: node + linkType: hard + +"@types/mocha@npm:^10.0.0": + version: 10.0.8 + resolution: "@types/mocha@npm:10.0.8" + checksum: d64faa9f1ed249441944a6ae3f01d72c756b54d8bcf8e2edccb09c0d084cec6d8a0cd8b717df517812f045ade20b4b8768e06aa8633bd2485a41ec37f06be710 + languageName: node + linkType: hard + +"@types/node@npm:*": + version: 22.5.4 + resolution: "@types/node@npm:22.5.4" + dependencies: + undici-types: ~6.19.2 + checksum: 77ac225c38c428200036780036da0bc6764e2721cfa8f528c7e7da7cfefe01a32a5791e28a54efbeedbc977949058d7db902b2e00139298225d4686cee4ae6db + languageName: node + linkType: hard + +"@types/node@npm:18.15.13": + version: 18.15.13 + resolution: "@types/node@npm:18.15.13" + checksum: 79cc5a2b5f98e8973061a4260a781425efd39161a0e117a69cd089603964816c1a14025e1387b4590c8e82d05133b7b4154fa53a7dffb3877890a66145e76515 + languageName: node + linkType: hard + +"@types/node@npm:20.5.1": + version: 20.5.1 + resolution: "@types/node@npm:20.5.1" + checksum: 3dbe611cd67afa987102c8558ee70f848949c5dcfee5f60abc073e55c0d7b048e391bf06bb1e0dc052cb7210ca97136ac496cbaf6e89123c989de6bd125fde82 + languageName: node + linkType: hard + +"@types/node@npm:^10.0.3": + version: 10.17.60 + resolution: "@types/node@npm:10.17.60" + checksum: 2cdb3a77d071ba8513e5e8306fa64bf50e3c3302390feeaeff1fd325dd25c8441369715dfc8e3701011a72fed5958c7dfa94eb9239a81b3c286caa4d97db6eef + languageName: node + linkType: hard + +"@types/node@npm:^12.12.54": + version: 12.20.55 + resolution: "@types/node@npm:12.20.55" + checksum: e4f86785f4092706e0d3b0edff8dca5a13b45627e4b36700acd8dfe6ad53db71928c8dee914d4276c7fd3b6ccd829aa919811c9eb708a2c8e4c6eb3701178c37 + languageName: node + linkType: hard + +"@types/node@npm:^18.11.9": + version: 18.19.50 + resolution: "@types/node@npm:18.19.50" + dependencies: + undici-types: ~5.26.4 + checksum: 73bdd2b46fb96816a1f7309e1b609f0832a29739c87df7daa729ff497160be143e02cf18486a0112e1981b092358aed3ca0716b532aff93c7e05f7dbb4f7586a + languageName: node + linkType: hard + +"@types/node@npm:^20.8.9": + version: 20.16.5 + resolution: "@types/node@npm:20.16.5" + dependencies: + undici-types: ~6.19.2 + checksum: f38b7bd8c4993dcf38943afa2ffdd7dfd18fc94f8f3f28d0c1045a10d39871a6cc1b8f8d3bf0c7ed848457d0e1d283482f6ca125579c13fed1b7575d23e8e8f5 + languageName: node + linkType: hard + +"@types/node@npm:^8.0.0": + version: 8.10.66 + resolution: "@types/node@npm:8.10.66" + checksum: c52039de862654a139abdc6a51de532a69dd80516ac35a959c3b3a2831ecbaaf065b0df5f9db943f5e28b544ebb9a891730d52b52f7a169b86a82bc060210000 + languageName: node + linkType: hard + +"@types/normalize-package-data@npm:^2.4.0": + version: 2.4.4 + resolution: "@types/normalize-package-data@npm:2.4.4" + checksum: 65dff72b543997b7be8b0265eca7ace0e34b75c3e5fee31de11179d08fa7124a7a5587265d53d0409532ecb7f7fba662c2012807963e1f9b059653ec2c83ee05 + languageName: node + linkType: hard + +"@types/pbkdf2@npm:^3.0.0": + version: 3.1.2 + resolution: "@types/pbkdf2@npm:3.1.2" + dependencies: + "@types/node": "*" + checksum: bebe1e596cbbe5f7d2726a58859e61986c5a42459048e29cb7f2d4d764be6bbb0844572fd5d70ca8955a8a17e8b4ed80984fc4903e165d9efb8807a3fbb051aa + languageName: node + linkType: hard + +"@types/prettier@npm:^2.1.1": + version: 2.7.3 + resolution: "@types/prettier@npm:2.7.3" + checksum: 705384209cea6d1433ff6c187c80dcc0b95d99d5c5ce21a46a9a58060c527973506822e428789d842761e0280d25e3359300f017fbe77b9755bc772ab3dc2f83 + languageName: node + linkType: hard + +"@types/qs@npm:^6.2.31, @types/qs@npm:^6.9.7": + version: 6.9.15 + resolution: "@types/qs@npm:6.9.15" + checksum: 97d8208c2b82013b618e7a9fc14df6bd40a73e1385ac479b6896bafc7949a46201c15f42afd06e86a05e914f146f495f606b6fb65610cc60cf2e0ff743ec38a2 + languageName: node + linkType: hard + +"@types/readable-stream@npm:^2.3.13": + version: 2.3.15 + resolution: "@types/readable-stream@npm:2.3.15" + dependencies: + "@types/node": "*" + safe-buffer: ~5.1.1 + checksum: ec36f525cad09b6c65a1dafcb5ad99b9e2ed824ec49b7aa23180ac427e5d35b8a0706193ecd79ab4253a283ad485ba03d5917a98daaaa144f0ea34f4823e9d82 + languageName: node + linkType: hard + +"@types/resolve@npm:^0.0.8": + version: 0.0.8 + resolution: "@types/resolve@npm:0.0.8" + dependencies: + "@types/node": "*" + checksum: f241bb773ab14b14500623ac3b57c52006ce32b20426b6d8bf2fe5fdc0344f42c77ac0f94ff57b443ae1d320a1a86c62b4e47239f0321699404402fbeb24bad6 + languageName: node + linkType: hard + +"@types/secp256k1@npm:^4.0.1": + version: 4.0.6 + resolution: "@types/secp256k1@npm:4.0.6" + dependencies: + "@types/node": "*" + checksum: 984494caf49a4ce99fda2b9ea1840eb47af946b8c2737314108949bcc0c06b4880e871296bd49ed6ea4c8423e3a302ad79fec43abfc987330e7eb98f0c4e8ba4 + languageName: node + linkType: hard + +"@types/semver@npm:^7.3.12, @types/semver@npm:^7.5.0": + version: 7.5.8 + resolution: "@types/semver@npm:7.5.8" + checksum: ea6f5276f5b84c55921785a3a27a3cd37afee0111dfe2bcb3e03c31819c197c782598f17f0b150a69d453c9584cd14c4c4d7b9a55d2c5e6cacd4d66fdb3b3663 + languageName: node + linkType: hard + +"@types/triple-beam@npm:^1.3.2": + version: 1.3.5 + resolution: "@types/triple-beam@npm:1.3.5" + checksum: 519b6a1b30d4571965c9706ad5400a200b94e4050feca3e7856e3ea7ac00ec9903e32e9a10e2762d0f7e472d5d03e5f4b29c16c0bd8c1f77c8876c683b2231f1 + languageName: node + linkType: hard + +"@types/uuid@npm:^8.3.4": + version: 8.3.4 + resolution: "@types/uuid@npm:8.3.4" + checksum: 6f11f3ff70f30210edaa8071422d405e9c1d4e53abbe50fdce365150d3c698fe7bbff65c1e71ae080cbfb8fded860dbb5e174da96fdbbdfcaa3fb3daa474d20f + languageName: node + linkType: hard + +"@types/webidl-conversions@npm:*": + version: 7.0.3 + resolution: "@types/webidl-conversions@npm:7.0.3" + checksum: 535ead9de4d3d6c8e4f4fa14e9db780d2a31e8020debc062f337e1420a41c3265e223e4f4b628f97a11ecf3b96390962cd88a9ffe34f44e159dec583ff49aa34 + languageName: node + linkType: hard + +"@types/whatwg-url@npm:^11.0.2": + version: 11.0.5 + resolution: "@types/whatwg-url@npm:11.0.5" + dependencies: + "@types/webidl-conversions": "*" + checksum: 23a0c45aff51817807b473a6adb181d6e3bb0d27dde54e84883d5d5bc93358e95204d2188e7ff7fdc2cdaf157e97e1188ef0a22ec79228da300fc30d4a05b56a + languageName: node + linkType: hard + +"@types/ws@npm:^7.4.4": + version: 7.4.7 + resolution: "@types/ws@npm:7.4.7" + dependencies: + "@types/node": "*" + checksum: b4c9b8ad209620c9b21e78314ce4ff07515c0cadab9af101c1651e7bfb992d7fd933bd8b9c99d110738fd6db523ed15f82f29f50b45510288da72e964dedb1a3 + languageName: node + linkType: hard + +"@types/ws@npm:^8.2.2": + version: 8.5.12 + resolution: "@types/ws@npm:8.5.12" + dependencies: + "@types/node": "*" + checksum: ddefb6ad1671f70ce73b38a5f47f471d4d493864fca7c51f002a86e5993d031294201c5dced6d5018fb8905ad46888d65c7f20dd54fc165910b69f42fba9a6d0 + languageName: node + linkType: hard + +"@typescript-eslint/eslint-plugin@npm:^5.44.0": + version: 5.62.0 + resolution: "@typescript-eslint/eslint-plugin@npm:5.62.0" + dependencies: + "@eslint-community/regexpp": ^4.4.0 + "@typescript-eslint/scope-manager": 5.62.0 + "@typescript-eslint/type-utils": 5.62.0 + "@typescript-eslint/utils": 5.62.0 + debug: ^4.3.4 + graphemer: ^1.4.0 + ignore: ^5.2.0 + natural-compare-lite: ^1.4.0 + semver: ^7.3.7 + tsutils: ^3.21.0 + peerDependencies: + "@typescript-eslint/parser": ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: fc104b389c768f9fa7d45a48c86d5c1ad522c1d0512943e782a56b1e3096b2cbcc1eea3fcc590647bf0658eef61aac35120a9c6daf979bf629ad2956deb516a1 + languageName: node + linkType: hard + +"@typescript-eslint/eslint-plugin@npm:^6.7.5": + version: 6.21.0 + resolution: "@typescript-eslint/eslint-plugin@npm:6.21.0" + dependencies: + "@eslint-community/regexpp": ^4.5.1 + "@typescript-eslint/scope-manager": 6.21.0 + "@typescript-eslint/type-utils": 6.21.0 + "@typescript-eslint/utils": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 + debug: ^4.3.4 + graphemer: ^1.4.0 + ignore: ^5.2.4 + natural-compare: ^1.4.0 + semver: ^7.5.4 + ts-api-utils: ^1.0.1 + peerDependencies: + "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 5ef2c502255e643e98051e87eb682c2a257e87afd8ec3b9f6274277615e1c2caf3131b352244cfb1987b8b2c415645eeacb9113fa841fc4c9b2ac46e8aed6efd + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:^5.44.0": + version: 5.62.0 + resolution: "@typescript-eslint/parser@npm:5.62.0" + dependencies: + "@typescript-eslint/scope-manager": 5.62.0 + "@typescript-eslint/types": 5.62.0 + "@typescript-eslint/typescript-estree": 5.62.0 + debug: ^4.3.4 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: d168f4c7f21a7a63f47002e2d319bcbb6173597af5c60c1cf2de046b46c76b4930a093619e69faf2d30214c29ab27b54dcf1efc7046a6a6bd6f37f59a990e752 + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:^6.7.5": + version: 6.21.0 + resolution: "@typescript-eslint/parser@npm:6.21.0" + dependencies: + "@typescript-eslint/scope-manager": 6.21.0 + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/typescript-estree": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 + debug: ^4.3.4 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 162fe3a867eeeffda7328bce32dae45b52283c68c8cb23258fb9f44971f761991af61f71b8c9fe1aa389e93dfe6386f8509c1273d870736c507d76dd40647b68 + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/scope-manager@npm:5.62.0" + dependencies: + "@typescript-eslint/types": 5.62.0 + "@typescript-eslint/visitor-keys": 5.62.0 + checksum: 6062d6b797fe1ce4d275bb0d17204c827494af59b5eaf09d8a78cdd39dadddb31074dded4297aaf5d0f839016d601032857698b0e4516c86a41207de606e9573 + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/scope-manager@npm:6.21.0" + dependencies: + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 + checksum: 71028b757da9694528c4c3294a96cc80bc7d396e383a405eab3bc224cda7341b88e0fc292120b35d3f31f47beac69f7083196c70616434072fbcd3d3e62d3376 + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/type-utils@npm:5.62.0" + dependencies: + "@typescript-eslint/typescript-estree": 5.62.0 + "@typescript-eslint/utils": 5.62.0 + debug: ^4.3.4 + tsutils: ^3.21.0 + peerDependencies: + eslint: "*" + peerDependenciesMeta: + typescript: + optional: true + checksum: fc41eece5f315dfda14320be0da78d3a971d650ea41300be7196934b9715f3fe1120a80207551eb71d39568275dbbcf359bde540d1ca1439d8be15e9885d2739 + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/type-utils@npm:6.21.0" + dependencies: + "@typescript-eslint/typescript-estree": 6.21.0 + "@typescript-eslint/utils": 6.21.0 + debug: ^4.3.4 + ts-api-utils: ^1.0.1 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 77025473f4d80acf1fafcce99c5c283e557686a61861febeba9c9913331f8a41e930bf5cd8b7a54db502a57b6eb8ea6d155cbd4f41349ed00e3d7aeb1f477ddc + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/types@npm:5.62.0" + checksum: 48c87117383d1864766486f24de34086155532b070f6264e09d0e6139449270f8a9559cfef3c56d16e3bcfb52d83d42105d61b36743626399c7c2b5e0ac3b670 + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/types@npm:6.21.0" + checksum: 9501b47d7403417af95fc1fb72b2038c5ac46feac0e1598a46bcb43e56a606c387e9dcd8a2a0abe174c91b509f2d2a8078b093786219eb9a01ab2fbf9ee7b684 + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/typescript-estree@npm:5.62.0" + dependencies: + "@typescript-eslint/types": 5.62.0 + "@typescript-eslint/visitor-keys": 5.62.0 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + semver: ^7.3.7 + tsutils: ^3.21.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 3624520abb5807ed8f57b1197e61c7b1ed770c56dfcaca66372d584ff50175225798bccb701f7ef129d62c5989070e1ee3a0aa2d84e56d9524dcf011a2bb1a52 + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.21.0" + dependencies: + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + minimatch: 9.0.3 + semver: ^7.5.4 + ts-api-utils: ^1.0.1 + peerDependenciesMeta: + typescript: + optional: true + checksum: dec02dc107c4a541e14fb0c96148f3764b92117c3b635db3a577b5a56fc48df7a556fa853fb82b07c0663b4bf2c484c9f245c28ba3e17e5cb0918ea4cab2ea21 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/utils@npm:5.62.0" + dependencies: + "@eslint-community/eslint-utils": ^4.2.0 + "@types/json-schema": ^7.0.9 + "@types/semver": ^7.3.12 + "@typescript-eslint/scope-manager": 5.62.0 + "@typescript-eslint/types": 5.62.0 + "@typescript-eslint/typescript-estree": 5.62.0 + eslint-scope: ^5.1.1 + semver: ^7.3.7 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: ee9398c8c5db6d1da09463ca7bf36ed134361e20131ea354b2da16a5fdb6df9ba70c62a388d19f6eebb421af1786dbbd79ba95ddd6ab287324fc171c3e28d931 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/utils@npm:6.21.0" + dependencies: + "@eslint-community/eslint-utils": ^4.4.0 + "@types/json-schema": ^7.0.12 + "@types/semver": ^7.5.0 + "@typescript-eslint/scope-manager": 6.21.0 + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/typescript-estree": 6.21.0 + semver: ^7.5.4 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + checksum: b129b3a4aebec8468259f4589985cb59ea808afbfdb9c54f02fad11e17d185e2bf72bb332f7c36ec3c09b31f18fc41368678b076323e6e019d06f74ee93f7bf2 + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/visitor-keys@npm:5.62.0" + dependencies: + "@typescript-eslint/types": 5.62.0 + eslint-visitor-keys: ^3.3.0 + checksum: 976b05d103fe8335bef5c93ad3f76d781e3ce50329c0243ee0f00c0fcfb186c81df50e64bfdd34970148113f8ade90887f53e3c4938183afba830b4ba8e30a35 + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.21.0" + dependencies: + "@typescript-eslint/types": 6.21.0 + eslint-visitor-keys: ^3.4.1 + checksum: 67c7e6003d5af042d8703d11538fca9d76899f0119130b373402819ae43f0bc90d18656aa7add25a24427ccf1a0efd0804157ba83b0d4e145f06107d7d1b7433 + languageName: node + linkType: hard + +"@ungap/structured-clone@npm:^1.2.0": + version: 1.2.0 + resolution: "@ungap/structured-clone@npm:1.2.0" + checksum: 4f656b7b4672f2ce6e272f2427d8b0824ed11546a601d8d5412b9d7704e83db38a8d9f402ecdf2b9063fc164af842ad0ec4a55819f621ed7e7ea4d1efcc74524 + languageName: node + linkType: hard + +"@yarnpkg/lockfile@npm:^1.1.0": + version: 1.1.0 + resolution: "@yarnpkg/lockfile@npm:1.1.0" + checksum: 05b881b4866a3546861fee756e6d3812776ea47fa6eb7098f983d6d0eefa02e12b66c3fff931574120f196286a7ad4879ce02743c8bb2be36c6a576c7852083a + languageName: node + linkType: hard + +"JSONStream@npm:^1.3.5": + version: 1.3.5 + resolution: "JSONStream@npm:1.3.5" + dependencies: + jsonparse: ^1.2.0 + through: ">=2.2.7 <3" + bin: + JSONStream: ./bin.js + checksum: 2605fa124260c61bad38bb65eba30d2f72216a78e94d0ab19b11b4e0327d572b8d530c0c9cc3b0764f727ad26d39e00bf7ebad57781ca6368394d73169c59e46 + languageName: node + linkType: hard + +"abbrev@npm:1": + version: 1.1.1 + resolution: "abbrev@npm:1.1.1" + checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 + languageName: node + linkType: hard + +"abbrev@npm:1.0.x": + version: 1.0.9 + resolution: "abbrev@npm:1.0.9" + checksum: 46460c897b4ce62cd9b1bd4a853cc46e771a1f1d929f5443f3945a976f8be5388891bf9e5f8a9862baa29587349e16c48596b6a621404d46d3b184fe9bd9fb26 + languageName: node + linkType: hard + +"abbrev@npm:^2.0.0": + version: 2.0.0 + resolution: "abbrev@npm:2.0.0" + checksum: 0e994ad2aa6575f94670d8a2149afe94465de9cedaaaac364e7fb43a40c3691c980ff74899f682f4ca58fa96b4cbd7421a015d3a6defe43a442117d7821a2f36 + languageName: node + linkType: hard + +"abitype@npm:1.0.5": + version: 1.0.5 + resolution: "abitype@npm:1.0.5" + peerDependencies: + typescript: ">=5.0.4" + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + checksum: 4a4865926e5e8e33e4fab0081a106ce4f627db30b4052fbc449e4707aea6d34d805d46c8d6d0a72234bdd9a2b4900993591515fc299bc57d393181c70dc0c19e + languageName: node + linkType: hard + +"abstract-level@npm:^1.0.0, abstract-level@npm:^1.0.2, abstract-level@npm:^1.0.3, abstract-level@npm:^1.0.4": + version: 1.0.4 + resolution: "abstract-level@npm:1.0.4" + dependencies: + buffer: ^6.0.3 + catering: ^2.1.0 + is-buffer: ^2.0.5 + level-supports: ^4.0.0 + level-transcoder: ^1.0.1 + module-error: ^1.0.1 + queue-microtask: ^1.2.3 + checksum: 5b70d08926f5234c3c23ffca848542af4def780dc96d6ca35a81659af80e6439c46f5106bd14a5ea37465173d7dcc8294317048b0194fdf6480103edc4aa9e63 + languageName: node + linkType: hard + +"acorn-jsx@npm:^5.3.2": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: c3d3b2a89c9a056b205b69530a37b972b404ee46ec8e5b341666f9513d3163e2a4f214a71f4dfc7370f5a9c07472d2fd1c11c91c3f03d093e37637d95da98950 + languageName: node + linkType: hard + +"acorn-walk@npm:^8.1.1": + version: 8.3.4 + resolution: "acorn-walk@npm:8.3.4" + dependencies: + acorn: ^8.11.0 + checksum: 4ff03f42323e7cf90f1683e08606b0f460e1e6ac263d2730e3df91c7665b6f64e696db6ea27ee4bed18c2599569be61f28a8399fa170c611161a348c402ca19c + languageName: node + linkType: hard + +"acorn@npm:^8.11.0, acorn@npm:^8.4.1, acorn@npm:^8.9.0": + version: 8.12.1 + resolution: "acorn@npm:8.12.1" + bin: + acorn: bin/acorn + checksum: 677880034aee5bdf7434cc2d25b641d7bedb0b5ef47868a78dadabedccf58e1c5457526d9d8249cd253f2df087e081c3fe7d903b448d8e19e5131a3065b83c07 + languageName: node + linkType: hard + +"adm-zip@npm:^0.4.16": + version: 0.4.16 + resolution: "adm-zip@npm:0.4.16" + checksum: 5ea46664d8b3b073fffeb7f934705fea288708745e708cffc1dd732ce3d2672cecd476b243f9d051892fd12952db2b6bd061975e1ff40057246f6d0cb6534a50 + languageName: node + linkType: hard + +"aes-js@npm:3.0.0": + version: 3.0.0 + resolution: "aes-js@npm:3.0.0" + checksum: 251e26d533cd1a915b44896b17d5ed68c24a02484cfdd2e74ec700a309267db96651ea4eb657bf20aac32a3baa61f6e34edf8e2fec2de440a655da9942d334b8 + languageName: node + linkType: hard + +"aes-js@npm:4.0.0-beta.5": + version: 4.0.0-beta.5 + resolution: "aes-js@npm:4.0.0-beta.5" + checksum: cc2ea969d77df939c32057f7e361b6530aa6cb93cb10617a17a45cd164e6d761002f031ff6330af3e67e58b1f0a3a8fd0b63a720afd591a653b02f649470e15b + languageName: node + linkType: hard + +"agent-base@npm:6": + version: 6.0.2 + resolution: "agent-base@npm:6.0.2" + dependencies: + debug: 4 + checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d + languageName: node + linkType: hard + +"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": + version: 7.1.1 + resolution: "agent-base@npm:7.1.1" + dependencies: + debug: ^4.3.4 + checksum: 51c158769c5c051482f9ca2e6e1ec085ac72b5a418a9b31b4e82fe6c0a6699adb94c1c42d246699a587b3335215037091c79e0de512c516f73b6ea844202f037 + languageName: node + linkType: hard + +"agentkeepalive@npm:^4.5.0": + version: 4.5.0 + resolution: "agentkeepalive@npm:4.5.0" + dependencies: + humanize-ms: ^1.2.1 + checksum: 13278cd5b125e51eddd5079f04d6fe0914ac1b8b91c1f3db2c1822f99ac1a7457869068997784342fe455d59daaff22e14fb7b8c3da4e741896e7e31faf92481 + languageName: node + linkType: hard + +"aggregate-error@npm:^3.0.0": + version: 3.1.0 + resolution: "aggregate-error@npm:3.1.0" + dependencies: + clean-stack: ^2.0.0 + indent-string: ^4.0.0 + checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 + languageName: node + linkType: hard + +"ajv@npm:^6.12.4, ajv@npm:^6.12.6": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" + 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 + checksum: 874972efe5c4202ab0a68379481fbd3d1b5d0a7bd6d3cc21d40d3536ebff3352a2a1fabb632d4fd2cc7fe4cbdcd5ed6782084c9bbf7f32a1536d18f9da5007d4 + languageName: node + linkType: hard + +"ajv@npm:^8.0.1, ajv@npm:^8.11.0": + version: 8.17.1 + resolution: "ajv@npm:8.17.1" + dependencies: + fast-deep-equal: ^3.1.3 + fast-uri: ^3.0.1 + json-schema-traverse: ^1.0.0 + require-from-string: ^2.0.2 + checksum: 1797bf242cfffbaf3b870d13565bd1716b73f214bb7ada9a497063aada210200da36e3ed40237285f3255acc4feeae91b1fb183625331bad27da95973f7253d9 + languageName: node + linkType: hard + +"amdefine@npm:>=0.0.4": + version: 1.0.1 + resolution: "amdefine@npm:1.0.1" + checksum: 9d4e15b94641643a9385b2841b4cb2bcf4e8e2f741ea4bd475c93ad7bab261ad4ed827a32e9c549b38b98759c4526c173ae4e6dde8caeb75ee5cebedc9863762 + languageName: node + linkType: hard + +"ansi-colors@npm:^4.1.1, ansi-colors@npm:^4.1.3": + version: 4.1.3 + resolution: "ansi-colors@npm:4.1.3" + checksum: a9c2ec842038a1fabc7db9ece7d3177e2fe1c5dc6f0c51ecfbf5f39911427b89c00b5dc6b8bd95f82a26e9b16aaae2e83d45f060e98070ce4d1333038edceb0e + languageName: node + linkType: hard + +"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.0": + version: 4.3.2 + resolution: "ansi-escapes@npm:4.3.2" + dependencies: + type-fest: ^0.21.3 + checksum: 93111c42189c0a6bed9cdb4d7f2829548e943827ee8479c74d6e0b22ee127b2a21d3f8b5ca57723b8ef78ce011fbfc2784350eb2bde3ccfccf2f575fa8489815 + languageName: node + linkType: hard + +"ansi-escapes@npm:^5.0.0": + version: 5.0.0 + resolution: "ansi-escapes@npm:5.0.0" + dependencies: + type-fest: ^1.0.2 + checksum: d4b5eb8207df38367945f5dd2ef41e08c28edc192dc766ef18af6b53736682f49d8bfcfa4e4d6ecbc2e2f97c258fda084fb29a9e43b69170b71090f771afccac + languageName: node + linkType: hard + +"ansi-regex@npm:^3.0.0": + version: 3.0.1 + resolution: "ansi-regex@npm:3.0.1" + checksum: 09daf180c5f59af9850c7ac1bd7fda85ba596cc8cbeb210826e90755f06c818af86d9fa1e6e8322fab2c3b9e9b03f56c537b42241139f824dd75066a1e7257cc + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b + languageName: node + linkType: hard + +"ansi-regex@npm:^6.0.1": + version: 6.1.0 + resolution: "ansi-regex@npm:6.1.0" + checksum: 495834a53b0856c02acd40446f7130cb0f8284f4a39afdab20d5dc42b2e198b1196119fe887beed8f9055c4ff2055e3b2f6d4641d0be018cdfb64fedf6fc1aac + languageName: node + linkType: hard + +"ansi-styles@npm:^3.2.1": + version: 3.2.1 + resolution: "ansi-styles@npm:3.2.1" + dependencies: + color-convert: ^1.9.0 + checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: ^2.0.1 + checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 + languageName: node + linkType: hard + +"ansi-styles@npm:^6.0.0, ansi-styles@npm:^6.1.0": + version: 6.2.1 + resolution: "ansi-styles@npm:6.2.1" + checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 + languageName: node + linkType: hard + +"antlr4@npm:^4.11.0": + version: 4.13.2 + resolution: "antlr4@npm:4.13.2" + checksum: 3e42659f9b84af84c21f194e625d220bd958278a5481800bb4f5929149c603fad4d492f8b6d04f7c2ab87dd3df88e63ba097fbe7bfa92a060942da713d783e0a + languageName: node + linkType: hard + +"antlr4ts@npm:^0.5.0-alpha.4": + version: 0.5.0-alpha.4 + resolution: "antlr4ts@npm:0.5.0-alpha.4" + checksum: 37948499d59477f5b5a8ea71dfb8b5330e71d5a7cee60f57351dd744219b8619fa6aac1a5b6ec1a9991846e8ddc9ca47680eb166c59b44333369b3115e7aa358 + languageName: node + linkType: hard + +"anymatch@npm:~3.1.2": + version: 3.1.3 + resolution: "anymatch@npm:3.1.3" + dependencies: + normalize-path: ^3.0.0 + picomatch: ^2.0.4 + checksum: 3e044fd6d1d26545f235a9fe4d7a534e2029d8e59fa7fd9f2a6eb21230f6b5380ea1eaf55136e60cbf8e613544b3b766e7a6fa2102e2a3a117505466e3025dc2 + languageName: node + linkType: hard + +"arg@npm:^4.1.0": + version: 4.1.3 + resolution: "arg@npm:4.1.3" + checksum: 544af8dd3f60546d3e4aff084d451b96961d2267d668670199692f8d054f0415d86fc5497d0e641e91546f0aa920e7c29e5250e99fc89f5552a34b5d93b77f43 + languageName: node + linkType: hard + +"argparse@npm:^1.0.7": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" + dependencies: + sprintf-js: ~1.0.2 + checksum: 7ca6e45583a28de7258e39e13d81e925cfa25d7d4aacbf806a382d3c02fcb13403a07fb8aeef949f10a7cfe4a62da0e2e807b348a5980554cc28ee573ef95945 + languageName: node + linkType: hard + +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced + languageName: node + linkType: hard + +"array-back@npm:^3.0.1, array-back@npm:^3.1.0": + version: 3.1.0 + resolution: "array-back@npm:3.1.0" + checksum: 7205004fcd0f9edd926db921af901b083094608d5b265738d0290092f9822f73accb468e677db74c7c94ef432d39e5ed75a7b1786701e182efb25bbba9734209 + languageName: node + linkType: hard + +"array-back@npm:^4.0.1, array-back@npm:^4.0.2": + version: 4.0.2 + resolution: "array-back@npm:4.0.2" + checksum: f30603270771eeb54e5aad5f54604c62b3577a18b6db212a7272b2b6c32049121b49431f656654790ed1469411e45f387e7627c0de8fd0515995cc40df9b9294 + languageName: node + linkType: hard + +"array-ify@npm:^1.0.0": + version: 1.0.0 + resolution: "array-ify@npm:1.0.0" + checksum: c0502015b319c93dd4484f18036bcc4b654eb76a4aa1f04afbcef11ac918859bb1f5d71ba1f0f1141770db9eef1a4f40f1761753650873068010bbf7bcdae4a4 + languageName: node + linkType: hard + +"array-union@npm:^2.1.0": + version: 2.1.0 + resolution: "array-union@npm:2.1.0" + checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d + languageName: node + linkType: hard + +"array-uniq@npm:1.0.3": + version: 1.0.3 + resolution: "array-uniq@npm:1.0.3" + checksum: 1625f06b093d8bf279b81adfec6e72951c0857d65b5e3f65f053fffe9f9dd61c2fc52cff57e38a4700817e7e3f01a4faa433d505ea9e33cdae4514c334e0bf9e + languageName: node + linkType: hard + +"arrify@npm:^1.0.1": + version: 1.0.1 + resolution: "arrify@npm:1.0.1" + checksum: 745075dd4a4624ff0225c331dacb99be501a515d39bcb7c84d24660314a6ec28e68131b137e6f7e16318170842ce97538cd298fc4cd6b2cc798e0b957f2747e7 + languageName: node + linkType: hard + +"asap@npm:~2.0.6": + version: 2.0.6 + resolution: "asap@npm:2.0.6" + checksum: b296c92c4b969e973260e47523207cd5769abd27c245a68c26dc7a0fe8053c55bb04360237cb51cab1df52be939da77150ace99ad331fb7fb13b3423ed73ff3d + languageName: node + linkType: hard + +"assertion-error@npm:^1.1.0": + version: 1.1.0 + resolution: "assertion-error@npm:1.1.0" + checksum: fd9429d3a3d4fd61782eb3962ae76b6d08aa7383123fca0596020013b3ebd6647891a85b05ce821c47d1471ed1271f00b0545cf6a4326cf2fc91efcc3b0fbecf + languageName: node + linkType: hard + +"ast-parents@npm:^0.0.1": + version: 0.0.1 + resolution: "ast-parents@npm:0.0.1" + checksum: 51360afb9f7b939eb0330fdd0d5d855d0242f273f63478d30d9053069120492173719fb3c03ba372bccf1a7c1a9041c3c6bf2ab700de8c0f8c14792b045c3b23 + languageName: node + linkType: hard + +"astral-regex@npm:^2.0.0": + version: 2.0.0 + resolution: "astral-regex@npm:2.0.0" + checksum: 876231688c66400473ba505731df37ea436e574dd524520294cc3bbc54ea40334865e01fa0d074d74d036ee874ee7e62f486ea38bc421ee8e6a871c06f011766 + languageName: node + linkType: hard + +"async@npm:1.x": + version: 1.5.2 + resolution: "async@npm:1.5.2" + checksum: fe5d6214d8f15bd51eee5ae8ec5079b228b86d2d595f47b16369dec2e11b3ff75a567bb5f70d12d79006665fbbb7ee0a7ec0e388524eefd454ecbe651c124ebd + languageName: node + linkType: hard + +"async@npm:^3.2.3": + version: 3.2.6 + resolution: "async@npm:3.2.6" + checksum: ee6eb8cd8a0ab1b58bd2a3ed6c415e93e773573a91d31df9d5ef559baafa9dab37d3b096fa7993e84585cac3697b2af6ddb9086f45d3ac8cae821bb2aab65682 + languageName: node + linkType: hard + +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 7b78c451df768adba04e2d02e63e2d0bf3b07adcd6e42b4cf665cb7ce899bedd344c69a1dcbce355b5f972d597b25aaa1c1742b52cffd9caccb22f348114f6be + languageName: node + linkType: hard + +"at-least-node@npm:^1.0.0": + version: 1.0.0 + resolution: "at-least-node@npm:1.0.0" + checksum: 463e2f8e43384f1afb54bc68485c436d7622acec08b6fad269b421cb1d29cebb5af751426793d0961ed243146fe4dc983402f6d5a51b720b277818dbf6f2e49e + languageName: node + linkType: hard + +"axios@npm:^0.21.1": + version: 0.21.4 + resolution: "axios@npm:0.21.4" + dependencies: + follow-redirects: ^1.14.0 + checksum: 44245f24ac971e7458f3120c92f9d66d1fc695e8b97019139de5b0cc65d9b8104647db01e5f46917728edfc0cfd88eb30fc4c55e6053eef4ace76768ce95ff3c + languageName: node + linkType: hard + +"axios@npm:^1.5.1": + version: 1.7.7 + resolution: "axios@npm:1.7.7" + dependencies: + follow-redirects: ^1.15.6 + form-data: ^4.0.0 + proxy-from-env: ^1.1.0 + checksum: 882d4fe0ec694a07c7f5c1f68205eb6dc5a62aecdb632cc7a4a3d0985188ce3030e0b277e1a8260ac3f194d314ae342117660a151fabffdc5081ca0b5a8b47fe + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 + languageName: node + linkType: hard + +"base-x@npm:^3.0.2": + version: 3.0.10 + resolution: "base-x@npm:3.0.10" + dependencies: + safe-buffer: ^5.0.1 + checksum: 52307739559e81d9980889de2359cb4f816cc0eb9a463028fa3ab239ab913d9044a1b47b4520f98e68453df32a457b8ba58b8d0ee7e757fc3fb971f3fa7a1482 + languageName: node + linkType: hard + +"base64-js@npm:^1.3.0, base64-js@npm:^1.3.1": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: 669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005 + languageName: node + linkType: hard + +"bech32@npm:1.1.4, bech32@npm:^1.1.4": + version: 1.1.4 + resolution: "bech32@npm:1.1.4" + checksum: 0e98db619191548390d6f09ff68b0253ba7ae6a55db93dfdbb070ba234c1fd3308c0606fbcc95fad50437227b10011e2698b89f0181f6e7f845c499bd14d0f4b + languageName: node + linkType: hard + +"bigint-buffer@npm:^1.1.5": + version: 1.1.5 + resolution: "bigint-buffer@npm:1.1.5" + dependencies: + bindings: ^1.3.0 + node-gyp: latest + checksum: d010c9f57758bcdaccb435d88b483ffcc95fe8bbc6e7fb3a44fb5221f29c894ffaf4a3c5a4a530e0e7d6608203c2cde9b79ee4f2386cd6d4462d1070bc8c9f4e + languageName: node + linkType: hard + +"bigint-crypto-utils@npm:^3.0.23": + version: 3.3.0 + resolution: "bigint-crypto-utils@npm:3.3.0" + checksum: 9598ce57b23f776c8936d44114c9f051e62b5fa654915b664784cbcbacc5aa0485f4479571c51ff58008abb1210c0d6a234853742f07cf84bda890f2a1e01000 + languageName: node + linkType: hard + +"bignumber.js@npm:^9.1.1": + version: 9.1.2 + resolution: "bignumber.js@npm:9.1.2" + checksum: 582c03af77ec9cb0ebd682a373ee6c66475db94a4325f92299621d544aa4bd45cb45fd60001610e94aef8ae98a0905fa538241d9638d4422d57abbeeac6fadaf + languageName: node + linkType: hard + +"binary-extensions@npm:^2.0.0": + version: 2.3.0 + resolution: "binary-extensions@npm:2.3.0" + checksum: bcad01494e8a9283abf18c1b967af65ee79b0c6a9e6fcfafebfe91dbe6e0fc7272bafb73389e198b310516ae04f7ad17d79aacf6cb4c0d5d5202a7e2e52c7d98 + languageName: node + linkType: hard + +"bindings@npm:^1.3.0": + version: 1.5.0 + resolution: "bindings@npm:1.5.0" + dependencies: + file-uri-to-path: 1.0.0 + checksum: 65b6b48095717c2e6105a021a7da4ea435aa8d3d3cd085cb9e85bcb6e5773cf318c4745c3f7c504412855940b585bdf9b918236612a1c7a7942491de176f1ae7 + languageName: node + linkType: hard + +"bl@npm:^4.1.0": + version: 4.1.0 + resolution: "bl@npm:4.1.0" + dependencies: + buffer: ^5.5.0 + inherits: ^2.0.4 + readable-stream: ^3.4.0 + checksum: 9e8521fa7e83aa9427c6f8ccdcba6e8167ef30cc9a22df26effcc5ab682ef91d2cbc23a239f945d099289e4bbcfae7a192e9c28c84c6202e710a0dfec3722662 + languageName: node + linkType: hard + +"blakejs@npm:^1.1.0": + version: 1.2.1 + resolution: "blakejs@npm:1.2.1" + checksum: d699ba116cfa21d0b01d12014a03e484dd76d483133e6dc9eb415aa70a119f08beb3bcefb8c71840106a00b542cba77383f8be60cd1f0d4589cb8afb922eefbe + languageName: node + linkType: hard + +"bn.js@npm:4.11.6": + version: 4.11.6 + resolution: "bn.js@npm:4.11.6" + checksum: db23047bf06fdf9cf74401c8e76bca9f55313c81df382247d2c753868b368562e69171716b81b7038ada8860af18346fd4bcd1cf9d4963f923fe8e54e61cb58a + languageName: node + linkType: hard + +"bn.js@npm:^4.11.0, bn.js@npm:^4.11.8, bn.js@npm:^4.11.9": + version: 4.12.0 + resolution: "bn.js@npm:4.12.0" + checksum: 39afb4f15f4ea537b55eaf1446c896af28ac948fdcf47171961475724d1bb65118cca49fa6e3d67706e4790955ec0e74de584e45c8f1ef89f46c812bee5b5a12 + languageName: node + linkType: hard + +"bn.js@npm:^5.1.2, bn.js@npm:^5.2.0, bn.js@npm:^5.2.1": + version: 5.2.1 + resolution: "bn.js@npm:5.2.1" + checksum: 3dd8c8d38055fedfa95c1d5fc3c99f8dd547b36287b37768db0abab3c239711f88ff58d18d155dd8ad902b0b0cee973747b7ae20ea12a09473272b0201c9edd3 + languageName: node + linkType: hard + +"borsh@npm:^0.7.0": + version: 0.7.0 + resolution: "borsh@npm:0.7.0" + dependencies: + bn.js: ^5.2.0 + bs58: ^4.0.0 + text-encoding-utf-8: ^1.0.2 + checksum: e98bfb5f7cfb820819c2870b884dac58dd4b4ce6a86c286c8fbf5c9ca582e73a8c6094df67e81a28c418ff07a309c6b118b2e27fdfea83fd92b8100c741da0b5 + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: ^1.0.0 + concat-map: 0.0.1 + checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" + dependencies: + balanced-match: ^1.0.0 + checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 + languageName: node + linkType: hard + +"braces@npm:^3.0.2, braces@npm:^3.0.3, braces@npm:~3.0.2": + version: 3.0.3 + resolution: "braces@npm:3.0.3" + dependencies: + fill-range: ^7.1.1 + checksum: b95aa0b3bd909f6cd1720ffcf031aeaf46154dd88b4da01f9a1d3f7ea866a79eba76a6d01cbc3c422b2ee5cdc39a4f02491058d5df0d7bf6e6a162a832df1f69 + languageName: node + linkType: hard + +"brorand@npm:^1.1.0": + version: 1.1.0 + resolution: "brorand@npm:1.1.0" + checksum: 8a05c9f3c4b46572dec6ef71012b1946db6cae8c7bb60ccd4b7dd5a84655db49fe043ecc6272e7ef1f69dc53d6730b9e2a3a03a8310509a3d797a618cbee52be + languageName: node + linkType: hard + +"browser-level@npm:^1.0.1": + version: 1.0.1 + resolution: "browser-level@npm:1.0.1" + dependencies: + abstract-level: ^1.0.2 + catering: ^2.1.1 + module-error: ^1.0.2 + run-parallel-limit: ^1.1.0 + checksum: 67fbc77ce832940bfa25073eccff279f512ad56f545deb996a5b23b02316f5e76f4a79d381acc27eda983f5c9a2566aaf9c97e4fdd0748288c4407307537a29b + languageName: node + linkType: hard + +"browser-stdout@npm:^1.3.1": + version: 1.3.1 + resolution: "browser-stdout@npm:1.3.1" + checksum: b717b19b25952dd6af483e368f9bcd6b14b87740c3d226c2977a65e84666ffd67000bddea7d911f111a9b6ddc822b234de42d52ab6507bce4119a4cc003ef7b3 + languageName: node + linkType: hard + +"browserify-aes@npm:^1.2.0": + version: 1.2.0 + resolution: "browserify-aes@npm:1.2.0" + 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 + checksum: 4a17c3eb55a2aa61c934c286f34921933086bf6d67f02d4adb09fcc6f2fc93977b47d9d884c25619144fccd47b3b3a399e1ad8b3ff5a346be47270114bcf7104 + languageName: node + linkType: hard + +"bs58@npm:^4.0.0, bs58@npm:^4.0.1": + version: 4.0.1 + resolution: "bs58@npm:4.0.1" + dependencies: + base-x: ^3.0.2 + checksum: b3c5365bb9e0c561e1a82f1a2d809a1a692059fae016be233a6127ad2f50a6b986467c3a50669ce4c18929dcccb297c5909314dd347a25a68c21b68eb3e95ac2 + languageName: node + linkType: hard + +"bs58check@npm:^2.1.2": + version: 2.1.2 + resolution: "bs58check@npm:2.1.2" + dependencies: + bs58: ^4.0.0 + create-hash: ^1.1.0 + safe-buffer: ^5.1.2 + checksum: 43bdf08a5dd04581b78f040bc4169480e17008da482ffe2a6507327bbc4fc5c28de0501f7faf22901cfe57fbca79cbb202ca529003fedb4cb8dccd265b38e54d + languageName: node + linkType: hard + +"bson@npm:^6.4.0": + version: 6.8.0 + resolution: "bson@npm:6.8.0" + checksum: 66076b04d7d54e7773d601a19b7c224bc5cff6b008efe102463fbc058879f2c84c0ed793b5b6ed12cc7616bbbe5e670db81cf7352e0ea947918119f8af704ba5 + languageName: node + linkType: hard + +"buffer-from@npm:^1.0.0": + version: 1.1.2 + resolution: "buffer-from@npm:1.1.2" + checksum: 0448524a562b37d4d7ed9efd91685a5b77a50672c556ea254ac9a6d30e3403a517d8981f10e565db24e8339413b43c97ca2951f10e399c6125a0d8911f5679bb + languageName: node + linkType: hard + +"buffer-xor@npm:^1.0.3": + version: 1.0.3 + resolution: "buffer-xor@npm:1.0.3" + checksum: 10c520df29d62fa6e785e2800e586a20fc4f6dfad84bcdbd12e1e8a83856de1cb75c7ebd7abe6d036bbfab738a6cf18a3ae9c8e5a2e2eb3167ca7399ce65373a + languageName: node + linkType: hard + +"buffer@npm:6.0.3, buffer@npm:^6.0.3, buffer@npm:~6.0.3": + version: 6.0.3 + resolution: "buffer@npm:6.0.3" + dependencies: + base64-js: ^1.3.1 + ieee754: ^1.2.1 + checksum: 5ad23293d9a731e4318e420025800b42bf0d264004c0286c8cc010af7a270c7a0f6522e84f54b9ad65cbd6db20b8badbfd8d2ebf4f80fa03dab093b89e68c3f9 + languageName: node + linkType: hard + +"buffer@npm:^5.5.0": + version: 5.7.1 + resolution: "buffer@npm:5.7.1" + dependencies: + base64-js: ^1.3.1 + ieee754: ^1.1.13 + checksum: e2cf8429e1c4c7b8cbd30834ac09bd61da46ce35f5c22a78e6c2f04497d6d25541b16881e30a019c6fd3154150650ccee27a308eff3e26229d788bbdeb08ab84 + languageName: node + linkType: hard + +"bufferutil@npm:^4.0.1": + version: 4.0.8 + resolution: "bufferutil@npm:4.0.8" + dependencies: + node-gyp: latest + node-gyp-build: ^4.3.0 + checksum: 7e9a46f1867dca72fda350966eb468eca77f4d623407b0650913fadf73d5750d883147d6e5e21c56f9d3b0bdc35d5474e80a600b9f31ec781315b4d2469ef087 + languageName: node + linkType: hard + +"bufio@npm:^1.0.7": + version: 1.2.1 + resolution: "bufio@npm:1.2.1" + checksum: b6e1216f4a5877617a3580b83807d8b96c794c015bc2d5eb9e70e152dc79fe923517472bd96df3d5b8feb59a0e25e2aa3cd8a70b8f90905b92d86f2e5719ed68 + languageName: node + linkType: hard + +"bytes@npm:3.1.2": + version: 3.1.2 + resolution: "bytes@npm:3.1.2" + checksum: e4bcd3948d289c5127591fbedf10c0b639ccbf00243504e4e127374a15c3bc8eed0d28d4aaab08ff6f1cf2abc0cce6ba3085ed32f4f90e82a5683ce0014e1b6e + languageName: node + linkType: hard + +"cacache@npm:^18.0.0": + version: 18.0.4 + resolution: "cacache@npm:18.0.4" + dependencies: + "@npmcli/fs": ^3.1.0 + fs-minipass: ^3.0.0 + glob: ^10.2.2 + lru-cache: ^10.0.1 + minipass: ^7.0.3 + minipass-collect: ^2.0.1 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + p-map: ^4.0.0 + ssri: ^10.0.0 + tar: ^6.1.11 + unique-filename: ^3.0.0 + checksum: b7422c113b4ec750f33beeca0f426a0024c28e3172f332218f48f963e5b970647fa1ac05679fe5bb448832c51efea9fda4456b9a95c3a1af1105fe6c1833cde2 + languageName: node + linkType: hard + +"cachedir@npm:2.3.0": + version: 2.3.0 + resolution: "cachedir@npm:2.3.0" + checksum: ec90cb0f2e6336e266aa748dbadf3da9e0b20e843e43f1591acab7a3f1451337dc2f26cb9dd833ae8cfefeffeeb43ef5b5ff62782a685f4e3c2305dd98482fcb + languageName: node + linkType: hard + +"call-bind@npm:^1.0.5, call-bind@npm:^1.0.7": + version: 1.0.7 + resolution: "call-bind@npm:1.0.7" + 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 + checksum: 295c0c62b90dd6522e6db3b0ab1ce26bdf9e7404215bda13cfee25b626b5ff1a7761324d58d38b1ef1607fc65aca2d06e44d2e18d0dfc6c14b465b00d8660029 + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 + languageName: node + linkType: hard + +"camelcase-keys@npm:^6.2.2": + version: 6.2.2 + resolution: "camelcase-keys@npm:6.2.2" + dependencies: + camelcase: ^5.3.1 + map-obj: ^4.0.0 + quick-lru: ^4.0.1 + checksum: 43c9af1adf840471e54c68ab3e5fe8a62719a6b7dbf4e2e86886b7b0ff96112c945736342b837bd2529ec9d1c7d1934e5653318478d98e0cf22c475c04658e2a + languageName: node + linkType: hard + +"camelcase@npm:^5.3.1": + version: 5.3.1 + resolution: "camelcase@npm:5.3.1" + checksum: e6effce26b9404e3c0f301498184f243811c30dfe6d0b9051863bd8e4034d09c8c2923794f280d6827e5aa055f6c434115ff97864a16a963366fb35fd673024b + languageName: node + linkType: hard + +"camelcase@npm:^6.0.0": + version: 6.3.0 + resolution: "camelcase@npm:6.3.0" + checksum: 8c96818a9076434998511251dcb2761a94817ea17dbdc37f47ac080bd088fc62c7369429a19e2178b993497132c8cbcf5cc1f44ba963e76782ba469c0474938d + languageName: node + linkType: hard + +"case@npm:^1.6.3": + version: 1.6.3 + resolution: "case@npm:1.6.3" + checksum: febe73278f910b0d28aab7efd6f51c235f9aa9e296148edb56dfb83fd58faa88308c30ce9a0122b6e53e0362c44f4407105bd5ef89c46860fc2b184e540fd68d + languageName: node + linkType: hard + +"caseless@npm:^0.12.0, caseless@npm:~0.12.0": + version: 0.12.0 + resolution: "caseless@npm:0.12.0" + checksum: b43bd4c440aa1e8ee6baefee8063b4850fd0d7b378f6aabc796c9ec8cb26d27fb30b46885350777d9bd079c5256c0e1329ad0dc7c2817e0bb466810ebb353751 + languageName: node + linkType: hard + +"catering@npm:^2.1.0, catering@npm:^2.1.1": + version: 2.1.1 + resolution: "catering@npm:2.1.1" + checksum: 205daefa69c935b0c19f3d8f2e0a520dd69aebe9bda55902958003f7c9cff8f967dfb90071b421bd6eb618576f657a89d2bc0986872c9bc04bbd66655e9d4bd6 + languageName: node + linkType: hard + +"cbor@npm:^8.1.0": + version: 8.1.0 + resolution: "cbor@npm:8.1.0" + dependencies: + nofilter: ^3.1.0 + checksum: a90338435dc7b45cc01461af979e3bb6ddd4f2a08584c437586039cd5f2235014c06e49d664295debbfb3514d87b2f06728092ab6aa6175e2e85e9cd7dc0c1fd + languageName: node + linkType: hard + +"chai-as-promised@npm:^7.1.1": + version: 7.1.2 + resolution: "chai-as-promised@npm:7.1.2" + dependencies: + check-error: ^1.0.2 + peerDependencies: + chai: ">= 2.1.2 < 6" + checksum: 671ee980054eb23a523875c1d22929a2ac05d89b5428e1fd12800f54fc69baf41014667b87e2368e2355ee2a3140d3e3d7d5a1f8638b07cfefd7fe38a149e3f6 + languageName: node + linkType: hard + +"chai@npm:^4.3.4, chai@npm:^4.3.7": + version: 4.5.0 + resolution: "chai@npm:4.5.0" + 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.1.0 + checksum: 70e5a8418a39e577e66a441cc0ce4f71fd551a650a71de30dd4e3e31e75ed1f5aa7119cf4baf4a2cb5e85c0c6befdb4d8a05811fad8738c1a6f3aa6a23803821 + languageName: node + linkType: hard + +"chalk@npm:5.3.0, chalk@npm:^5.3.0": + version: 5.3.0 + resolution: "chalk@npm:5.3.0" + checksum: 623922e077b7d1e9dedaea6f8b9e9352921f8ae3afe739132e0e00c275971bdd331268183b2628cf4ab1727c45ea1f28d7e24ac23ce1db1eb653c414ca8a5a80 + languageName: node + linkType: hard + +"chalk@npm:^2.4.1, chalk@npm:^2.4.2": + version: 2.4.2 + resolution: "chalk@npm:2.4.2" + dependencies: + ansi-styles: ^3.2.1 + escape-string-regexp: ^1.0.5 + supports-color: ^5.3.0 + checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 + languageName: node + linkType: hard + +"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: ^4.1.0 + supports-color: ^7.1.0 + checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc + languageName: node + linkType: hard + +"chardet@npm:^0.7.0": + version: 0.7.0 + resolution: "chardet@npm:0.7.0" + checksum: 6fd5da1f5d18ff5712c1e0aed41da200d7c51c28f11b36ee3c7b483f3696dabc08927fc6b227735eb8f0e1215c9a8abd8154637f3eff8cada5959df7f58b024d + languageName: node + linkType: hard + +"charenc@npm:>= 0.0.1": + version: 0.0.2 + resolution: "charenc@npm:0.0.2" + checksum: 81dcadbe57e861d527faf6dd3855dc857395a1c4d6781f4847288ab23cffb7b3ee80d57c15bba7252ffe3e5e8019db767757ee7975663ad2ca0939bb8fcaf2e5 + languageName: node + linkType: hard + +"check-error@npm:^1.0.2, check-error@npm:^1.0.3": + version: 1.0.3 + resolution: "check-error@npm:1.0.3" + dependencies: + get-func-name: ^2.0.2 + checksum: e2131025cf059b21080f4813e55b3c480419256914601750b0fee3bd9b2b8315b531e551ef12560419b8b6d92a3636511322752b1ce905703239e7cc451b6399 + languageName: node + linkType: hard + +"chokidar@npm:^3.4.0, chokidar@npm:^3.5.2, chokidar@npm:^3.5.3": + version: 3.6.0 + resolution: "chokidar@npm:3.6.0" + dependencies: + anymatch: ~3.1.2 + braces: ~3.0.2 + fsevents: ~2.3.2 + glob-parent: ~5.1.2 + is-binary-path: ~2.1.0 + is-glob: ~4.0.1 + normalize-path: ~3.0.0 + readdirp: ~3.6.0 + dependenciesMeta: + fsevents: + optional: true + checksum: d2f29f499705dcd4f6f3bbed79a9ce2388cf530460122eed3b9c48efeab7a4e28739c6551fd15bec9245c6b9eeca7a32baa64694d64d9b6faeb74ddb8c4a413d + languageName: node + linkType: hard + +"chownr@npm:^2.0.0": + version: 2.0.0 + resolution: "chownr@npm:2.0.0" + checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f + languageName: node + linkType: hard + +"ci-info@npm:^2.0.0": + version: 2.0.0 + resolution: "ci-info@npm:2.0.0" + checksum: 3b374666a85ea3ca43fa49aa3a048d21c9b475c96eb13c133505d2324e7ae5efd6a454f41efe46a152269e9b6a00c9edbe63ec7fa1921957165aae16625acd67 + languageName: node + linkType: hard + +"ci-info@npm:^3.7.0": + version: 3.9.0 + resolution: "ci-info@npm:3.9.0" + checksum: 6b19dc9b2966d1f8c2041a838217299718f15d6c4b63ae36e4674edd2bee48f780e94761286a56aa59eb305a85fbea4ddffb7630ec063e7ec7e7e5ad42549a87 + languageName: node + linkType: hard + +"cipher-base@npm:^1.0.0, cipher-base@npm:^1.0.1, cipher-base@npm:^1.0.3": + version: 1.0.4 + resolution: "cipher-base@npm:1.0.4" + dependencies: + inherits: ^2.0.1 + safe-buffer: ^5.0.1 + checksum: 47d3568dbc17431a339bad1fe7dff83ac0891be8206911ace3d3b818fc695f376df809bea406e759cdea07fff4b454fa25f1013e648851bec790c1d75763032e + languageName: node + linkType: hard + +"classic-level@npm:^1.2.0": + version: 1.4.1 + resolution: "classic-level@npm:1.4.1" + dependencies: + abstract-level: ^1.0.2 + catering: ^2.1.0 + module-error: ^1.0.1 + napi-macros: ^2.2.2 + node-gyp: latest + node-gyp-build: ^4.3.0 + checksum: 62e7e07297fcd656941eb88f92b91df0046ebb2b34987e98ec870cb736f096e212ef109a25541deba2f30866b9d5df550594ed04948614815dd5964933da50a9 + languageName: node + linkType: hard + +"clean-stack@npm:^2.0.0": + version: 2.2.0 + resolution: "clean-stack@npm:2.2.0" + checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 + languageName: node + linkType: hard + +"cli-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "cli-cursor@npm:3.1.0" + dependencies: + restore-cursor: ^3.1.0 + checksum: 2692784c6cd2fd85cfdbd11f53aea73a463a6d64a77c3e098b2b4697a20443f430c220629e1ca3b195ea5ac4a97a74c2ee411f3807abf6df2b66211fec0c0a29 + languageName: node + linkType: hard + +"cli-cursor@npm:^4.0.0": + version: 4.0.0 + resolution: "cli-cursor@npm:4.0.0" + dependencies: + restore-cursor: ^4.0.0 + checksum: ab3f3ea2076e2176a1da29f9d64f72ec3efad51c0960898b56c8a17671365c26e67b735920530eaf7328d61f8bd41c27f46b9cf6e4e10fe2fa44b5e8c0e392cc + languageName: node + linkType: hard + +"cli-spinners@npm:^2.5.0": + version: 2.9.2 + resolution: "cli-spinners@npm:2.9.2" + checksum: 1bd588289b28432e4676cb5d40505cfe3e53f2e4e10fbe05c8a710a154d6fe0ce7836844b00d6858f740f2ffe67cdc36e0fce9c7b6a8430e80e6388d5aa4956c + languageName: node + linkType: hard + +"cli-table3@npm:^0.5.0": + version: 0.5.1 + resolution: "cli-table3@npm:0.5.1" + dependencies: + colors: ^1.1.2 + object-assign: ^4.1.0 + string-width: ^2.1.1 + dependenciesMeta: + colors: + optional: true + checksum: 3ff8c821440a2a0e655a01f04e5b54a0365b3814676cd93cec2b2b0b9952a08311797ad242a181733fcff714fa7d776f8bb45ad812f296390bfa5ef584fb231d + languageName: node + linkType: hard + +"cli-truncate@npm:^3.1.0": + version: 3.1.0 + resolution: "cli-truncate@npm:3.1.0" + dependencies: + slice-ansi: ^5.0.0 + string-width: ^5.0.0 + checksum: c3243e41974445691c63f8b405df1d5a24049dc33d324fe448dc572e561a7b772ae982692900b1a5960901cc4fc7def25a629b9c69a4208ee89d12ab3332617a + languageName: node + linkType: hard + +"cli-width@npm:^3.0.0": + version: 3.0.0 + resolution: "cli-width@npm:3.0.0" + checksum: 4c94af3769367a70e11ed69aa6095f1c600c0ff510f3921ab4045af961820d57c0233acfa8b6396037391f31b4c397e1f614d234294f979ff61430a6c166c3f6 + languageName: node + linkType: hard + +"cliui@npm:^7.0.2": + version: 7.0.4 + resolution: "cliui@npm:7.0.4" + dependencies: + string-width: ^4.2.0 + strip-ansi: ^6.0.0 + wrap-ansi: ^7.0.0 + checksum: ce2e8f578a4813806788ac399b9e866297740eecd4ad1823c27fd344d78b22c5f8597d548adbcc46f0573e43e21e751f39446c5a5e804a12aace402b7a315d7f + languageName: node + linkType: hard + +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: ^4.2.0 + strip-ansi: ^6.0.1 + wrap-ansi: ^7.0.0 + checksum: 79648b3b0045f2e285b76fb2e24e207c6db44323581e421c3acbd0e86454cba1b37aea976ab50195a49e7384b871e6dfb2247ad7dec53c02454ac6497394cb56 + languageName: node + linkType: hard + +"clone@npm:^1.0.2": + version: 1.0.4 + resolution: "clone@npm:1.0.4" + checksum: d06418b7335897209e77bdd430d04f882189582e67bd1f75a04565f3f07f5b3f119a9d670c943b6697d0afb100f03b866b3b8a1f91d4d02d72c4ecf2bb64b5dd + languageName: node + linkType: hard + +"color-convert@npm:^1.9.0, color-convert@npm:^1.9.3": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" + dependencies: + color-name: 1.1.3 + checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: ~1.1.4 + checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 + languageName: node + linkType: hard + +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d + languageName: node + linkType: hard + +"color-name@npm:^1.0.0, color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 + languageName: node + linkType: hard + +"color-string@npm:^1.6.0": + version: 1.9.1 + resolution: "color-string@npm:1.9.1" + dependencies: + color-name: ^1.0.0 + simple-swizzle: ^0.2.2 + checksum: c13fe7cff7885f603f49105827d621ce87f4571d78ba28ef4a3f1a104304748f620615e6bf065ecd2145d0d9dad83a3553f52bb25ede7239d18e9f81622f1cc5 + languageName: node + linkType: hard + +"color@npm:^3.1.3": + version: 3.2.1 + resolution: "color@npm:3.2.1" + dependencies: + color-convert: ^1.9.3 + color-string: ^1.6.0 + checksum: f81220e8b774d35865c2561be921f5652117638dcda7ca4029262046e37fc2444ac7bbfdd110cf1fd9c074a4ee5eda8f85944ffbdda26186b602dd9bb05f6400 + languageName: node + linkType: hard + +"colorette@npm:^2.0.20": + version: 2.0.20 + resolution: "colorette@npm:2.0.20" + checksum: 0c016fea2b91b733eb9f4bcdb580018f52c0bc0979443dad930e5037a968237ac53d9beb98e218d2e9235834f8eebce7f8e080422d6194e957454255bde71d3d + languageName: node + linkType: hard + +"colors@npm:1.4.0, colors@npm:^1.1.2": + version: 1.4.0 + resolution: "colors@npm:1.4.0" + checksum: 98aa2c2418ad87dedf25d781be69dc5fc5908e279d9d30c34d8b702e586a0474605b3a189511482b9d5ed0d20c867515d22749537f7bc546256c6014f3ebdcec + languageName: node + linkType: hard + +"colorspace@npm:1.1.x": + version: 1.1.4 + resolution: "colorspace@npm:1.1.4" + dependencies: + color: ^3.1.3 + text-hex: 1.0.x + checksum: bb3934ef3c417e961e6d03d7ca60ea6e175947029bfadfcdb65109b01881a1c0ecf9c2b0b59abcd0ee4a0d7c1eae93beed01b0e65848936472270a0b341ebce8 + languageName: node + linkType: hard + +"combined-stream@npm:^1.0.6, combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: ~1.0.0 + checksum: 49fa4aeb4916567e33ea81d088f6584749fc90c7abec76fd516bf1c5aa5c79f3584b5ba3de6b86d26ddd64bae5329c4c7479343250cfe71c75bb366eae53bb7c + languageName: node + linkType: hard + +"command-exists@npm:^1.2.8": + version: 1.2.9 + resolution: "command-exists@npm:1.2.9" + checksum: 729ae3d88a2058c93c58840f30341b7f82688a573019535d198b57a4d8cb0135ced0ad7f52b591e5b28a90feb2c675080ce916e56254a0f7c15cb2395277cac3 + languageName: node + linkType: hard + +"command-line-args@npm:^5.1.1": + version: 5.2.1 + resolution: "command-line-args@npm:5.2.1" + dependencies: + array-back: ^3.1.0 + find-replace: ^3.0.0 + lodash.camelcase: ^4.3.0 + typical: ^4.0.0 + checksum: e759519087be3cf2e86af8b9a97d3058b4910cd11ee852495be881a067b72891f6a32718fb685ee6d41531ab76b2b7bfb6602f79f882cd4b7587ff1e827982c7 + languageName: node + linkType: hard + +"command-line-usage@npm:^6.1.0": + version: 6.1.3 + resolution: "command-line-usage@npm:6.1.3" + dependencies: + array-back: ^4.0.2 + chalk: ^2.4.2 + table-layout: ^1.0.2 + typical: ^5.2.0 + checksum: 8261d4e5536eb0bcddee0ec5e89c05bb2abd18e5760785c8078ede5020bc1c612cbe28eb6586f5ed4a3660689748e5aaad4a72f21566f4ef39393694e2fa1a0b + languageName: node + linkType: hard + +"commander@npm:11.0.0": + version: 11.0.0 + resolution: "commander@npm:11.0.0" + checksum: 6621954e1e1d078b4991c1f5bbd9439ad37aa7768d6ab4842de1dbd4d222c8a27e1b8e62108b3a92988614af45031d5bb2a2aaa92951f4d0c934d1a1ac564bb4 + languageName: node + linkType: hard + +"commander@npm:3.0.2": + version: 3.0.2 + resolution: "commander@npm:3.0.2" + checksum: 6d14ad030d1904428139487ed31febcb04c1604db2b8d9fae711f60ee6718828dc0e11602249e91c8a97b0e721e9c6d53edbc166bad3cde1596851d59a8f824d + languageName: node + linkType: hard + +"commander@npm:^10.0.0": + version: 10.0.1 + resolution: "commander@npm:10.0.1" + checksum: 436901d64a818295803c1996cd856621a74f30b9f9e28a588e726b2b1670665bccd7c1a77007ebf328729f0139838a88a19265858a0fa7a8728c4656796db948 + languageName: node + linkType: hard + +"commander@npm:^2.20.3": + version: 2.20.3 + resolution: "commander@npm:2.20.3" + checksum: ab8c07884e42c3a8dbc5dd9592c606176c7eb5c1ca5ff274bcf907039b2c41de3626f684ea75ccf4d361ba004bbaff1f577d5384c155f3871e456bdf27becf9e + languageName: node + linkType: hard + +"commitizen@npm:^4.0.3, commitizen@npm:^4.2.5": + version: 4.3.0 + resolution: "commitizen@npm:4.3.0" + dependencies: + cachedir: 2.3.0 + cz-conventional-changelog: 3.3.0 + dedent: 0.7.0 + detect-indent: 6.1.0 + find-node-modules: ^2.1.2 + find-root: 1.1.0 + fs-extra: 9.1.0 + glob: 7.2.3 + inquirer: 8.2.5 + is-utf8: ^0.2.1 + lodash: 4.17.21 + minimist: 1.2.7 + strip-bom: 4.0.0 + strip-json-comments: 3.1.1 + bin: + commitizen: bin/commitizen + cz: bin/git-cz + git-cz: bin/git-cz + checksum: 5a54f81ab7f24b74dd7791ae408796b0ac9ae6675cbe85db71047cee131e627ed5bfb9365de8b5777bedfbcdee1bccf15e5da5dae8b09b3fce93b551baa2cb63 + languageName: node + linkType: hard + +"compare-func@npm:^2.0.0": + version: 2.0.0 + resolution: "compare-func@npm:2.0.0" + dependencies: + array-ify: ^1.0.0 + dot-prop: ^5.1.0 + checksum: fb71d70632baa1e93283cf9d80f30ac97f003aabee026e0b4426c9716678079ef5fea7519b84d012cbed938c476493866a38a79760564a9e21ae9433e40e6f0d + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af + languageName: node + linkType: hard + +"concat-stream@npm:^1.6.0, concat-stream@npm:^1.6.2": + version: 1.6.2 + resolution: "concat-stream@npm:1.6.2" + dependencies: + buffer-from: ^1.0.0 + inherits: ^2.0.3 + readable-stream: ^2.2.2 + typedarray: ^0.0.6 + checksum: 1ef77032cb4459dcd5187bd710d6fc962b067b64ec6a505810de3d2b8cc0605638551b42f8ec91edf6fcd26141b32ef19ad749239b58fae3aba99187adc32285 + languageName: node + linkType: hard + +"conventional-changelog-angular@npm:^6.0.0": + version: 6.0.0 + resolution: "conventional-changelog-angular@npm:6.0.0" + dependencies: + compare-func: ^2.0.0 + checksum: ddc59ead53a45b817d83208200967f5340866782b8362d5e2e34105fdfa3d3a31585ebbdec7750bdb9de53da869f847e8ca96634a9801f51e27ecf4e7ffe2bad + languageName: node + linkType: hard + +"conventional-changelog-conventionalcommits@npm:^6.1.0": + version: 6.1.0 + resolution: "conventional-changelog-conventionalcommits@npm:6.1.0" + dependencies: + compare-func: ^2.0.0 + checksum: 4383a35cdf72f5964e194a1146e7f78276e301f73bd993b71627bb93586b6470d411b9613507ceb37e0fed0b023199c95e941541fa47172b4e6a7916fc3a53ff + languageName: node + linkType: hard + +"conventional-commit-types@npm:^3.0.0": + version: 3.0.0 + resolution: "conventional-commit-types@npm:3.0.0" + checksum: b9552de6a310c91a271ee57a890ed70d2d94340e710fc33856aaca5b24928fb2162f04dda5484d155b68c1fbaa042d904014d7fad0b6751a6d68052a0616015d + languageName: node + linkType: hard + +"conventional-commits-parser@npm:^4.0.0": + version: 4.0.0 + resolution: "conventional-commits-parser@npm:4.0.0" + dependencies: + JSONStream: ^1.3.5 + is-text-path: ^1.0.1 + meow: ^8.1.2 + split2: ^3.2.2 + bin: + conventional-commits-parser: cli.js + checksum: 12d95b5ba8e0710a6d3cd2e01f01dd7818fdf0bb2b33f4b75444e2c9aee49598776b0706a528ed49e83aec5f1896c32cbc7f8e6589f61a15187293707448f928 + languageName: node + linkType: hard + +"cookie@npm:^0.4.1": + version: 0.4.2 + resolution: "cookie@npm:0.4.2" + checksum: a00833c998bedf8e787b4c342defe5fa419abd96b32f4464f718b91022586b8f1bafbddd499288e75c037642493c83083da426c6a9080d309e3bd90fd11baa9b + languageName: node + linkType: hard + +"core-util-is@npm:~1.0.0": + version: 1.0.3 + resolution: "core-util-is@npm:1.0.3" + checksum: 9de8597363a8e9b9952491ebe18167e3b36e7707569eed0ebf14f8bba773611376466ae34575bca8cfe3c767890c859c74056084738f09d4e4a6f902b2ad7d99 + languageName: node + linkType: hard + +"cosmiconfig-typescript-loader@npm:^4.0.0": + version: 4.4.0 + resolution: "cosmiconfig-typescript-loader@npm:4.4.0" + peerDependencies: + "@types/node": "*" + cosmiconfig: ">=7" + ts-node: ">=10" + typescript: ">=4" + checksum: d6ba546de333f9440226ab2384a7b5355d8d2e278a9ca9d838664181bc27719764af10c69eec6f07189e63121e6d654235c374bd7dc455ac8dfdef3aad6657fd + languageName: node + linkType: hard + +"cosmiconfig-typescript-loader@npm:^5.0.0": + version: 5.0.0 + resolution: "cosmiconfig-typescript-loader@npm:5.0.0" + dependencies: + jiti: ^1.19.1 + peerDependencies: + "@types/node": "*" + cosmiconfig: ">=8.2" + typescript: ">=4" + checksum: 7b614313f2cc2ecbe17270de570a511aa7c974bf14a749d7ed4f4d0f4a9ed02ee7ae87d710e294204abb00bb6bb0cca53795208bb1435815d143b43c6626ec74 + languageName: node + linkType: hard + +"cosmiconfig@npm:^8.0.0": + version: 8.3.6 + resolution: "cosmiconfig@npm:8.3.6" + dependencies: + import-fresh: ^3.3.0 + js-yaml: ^4.1.0 + parse-json: ^5.2.0 + path-type: ^4.0.0 + peerDependencies: + typescript: ">=4.9.5" + peerDependenciesMeta: + typescript: + optional: true + checksum: dc339ebea427898c9e03bf01b56ba7afbac07fc7d2a2d5a15d6e9c14de98275a9565da949375aee1809591c152c0a3877bb86dbeaf74d5bd5aaa79955ad9e7a0 + languageName: node + linkType: hard + +"cosmiconfig@npm:^9.0.0": + version: 9.0.0 + resolution: "cosmiconfig@npm:9.0.0" + dependencies: + env-paths: ^2.2.1 + import-fresh: ^3.3.0 + js-yaml: ^4.1.0 + parse-json: ^5.2.0 + peerDependencies: + typescript: ">=4.9.5" + peerDependenciesMeta: + typescript: + optional: true + checksum: a30c424b53d442ea0bdd24cb1b3d0d8687c8dda4a17ab6afcdc439f8964438801619cdb66e8e79f63b9caa3e6586b60d8bab9ce203e72df6c5e80179b971fe8f + languageName: node + linkType: hard + +"crc-32@npm:^1.2.0": + version: 1.2.2 + resolution: "crc-32@npm:1.2.2" + bin: + crc32: bin/crc32.njs + checksum: ad2d0ad0cbd465b75dcaeeff0600f8195b686816ab5f3ba4c6e052a07f728c3e70df2e3ca9fd3d4484dc4ba70586e161ca5a2334ec8bf5a41bf022a6103ff243 + languageName: node + linkType: hard + +"create-hash@npm:^1.1.0, create-hash@npm:^1.1.2, create-hash@npm:^1.2.0": + version: 1.2.0 + resolution: "create-hash@npm:1.2.0" + dependencies: + cipher-base: ^1.0.1 + inherits: ^2.0.1 + md5.js: ^1.3.4 + ripemd160: ^2.0.1 + sha.js: ^2.4.0 + checksum: 02a6ae3bb9cd4afee3fabd846c1d8426a0e6b495560a977ba46120c473cb283be6aa1cace76b5f927cf4e499c6146fb798253e48e83d522feba807d6b722eaa9 + languageName: node + linkType: hard + +"create-hmac@npm:^1.1.4, create-hmac@npm:^1.1.7": + version: 1.1.7 + resolution: "create-hmac@npm:1.1.7" + 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 + checksum: ba12bb2257b585a0396108c72830e85f882ab659c3320c83584b1037f8ab72415095167ced80dc4ce8e446a8ecc4b2acf36d87befe0707d73b26cf9dc77440ed + languageName: node + linkType: hard + +"create-require@npm:^1.1.0": + version: 1.1.1 + resolution: "create-require@npm:1.1.1" + checksum: a9a1503d4390d8b59ad86f4607de7870b39cad43d929813599a23714831e81c520bddf61bcdd1f8e30f05fd3a2b71ae8538e946eb2786dc65c2bbc520f692eff + languageName: node + linkType: hard + +"cross-env@npm:^7.0.3": + version: 7.0.3 + resolution: "cross-env@npm:7.0.3" + dependencies: + cross-spawn: ^7.0.1 + bin: + cross-env: src/bin/cross-env.js + cross-env-shell: src/bin/cross-env-shell.js + checksum: 26f2f3ea2ab32617f57effb70d329c2070d2f5630adc800985d8b30b56e8bf7f5f439dd3a0358b79cee6f930afc23cf8e23515f17ccfb30092c6b62c6b630a79 + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.1, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": + version: 7.0.3 + resolution: "cross-spawn@npm:7.0.3" + dependencies: + path-key: ^3.1.0 + shebang-command: ^2.0.0 + which: ^2.0.1 + checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 + languageName: node + linkType: hard + +"crypt@npm:>= 0.0.1": + version: 0.0.2 + resolution: "crypt@npm:0.0.2" + checksum: baf4c7bbe05df656ec230018af8cf7dbe8c14b36b98726939cef008d473f6fe7a4fad906cfea4062c93af516f1550a3f43ceb4d6615329612c6511378ed9fe34 + languageName: node + linkType: hard + +"cz-conventional-changelog@npm:3.3.0, cz-conventional-changelog@npm:^3.3.0": + version: 3.3.0 + resolution: "cz-conventional-changelog@npm:3.3.0" + dependencies: + "@commitlint/load": ">6.1.1" + chalk: ^2.4.1 + commitizen: ^4.0.3 + conventional-commit-types: ^3.0.0 + lodash.map: ^4.5.1 + longest: ^2.0.1 + word-wrap: ^1.0.3 + dependenciesMeta: + "@commitlint/load": + optional: true + checksum: 8b766712092142ecec86c5c8a2a7206d0b2da46ae16e137303c6d75b42c048acd831c734fd542b9c3cbeb0fd8e7d1f5391494ed629dfba4459fee2d6f5d2c0ca + languageName: node + linkType: hard + +"dargs@npm:^7.0.0": + version: 7.0.0 + resolution: "dargs@npm:7.0.0" + checksum: b8f1e3cba59c42e1f13a114ad4848c3fc1cf7470f633ee9e9f1043762429bc97d91ae31b826fb135eefde203a3fdb20deb0c0a0222ac29d937b8046085d668d1 + languageName: node + linkType: hard + +"death@npm:^1.1.0": + version: 1.1.0 + resolution: "death@npm:1.1.0" + checksum: 8010ba9a320752f9580eb474985ed214572c0595cf83e92859e3c5a014a01fc8e8f2f2908b80b5f8bca9cb3f94adb546cf55810df6b80e282452e355cdce5aaa + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:^4.3.5": + version: 4.3.7 + resolution: "debug@npm:4.3.7" + dependencies: + ms: ^2.1.3 + peerDependenciesMeta: + supports-color: + optional: true + checksum: 822d74e209cd910ef0802d261b150314bbcf36c582ccdbb3e70f0894823c17e49a50d3e66d96b633524263975ca16b6a833f3e3b7e030c157169a5fabac63160 + languageName: node + linkType: hard + +"debug@npm:4.3.4": + version: 4.3.4 + resolution: "debug@npm:4.3.4" + dependencies: + ms: 2.1.2 + peerDependenciesMeta: + supports-color: + optional: true + checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 + languageName: node + linkType: hard + +"decamelize-keys@npm:^1.1.0": + version: 1.1.1 + resolution: "decamelize-keys@npm:1.1.1" + dependencies: + decamelize: ^1.1.0 + map-obj: ^1.0.0 + checksum: fc645fe20b7bda2680bbf9481a3477257a7f9304b1691036092b97ab04c0ab53e3bf9fcc2d2ae382536568e402ec41fb11e1d4c3836a9abe2d813dd9ef4311e0 + languageName: node + linkType: hard + +"decamelize@npm:^1.1.0": + version: 1.2.0 + resolution: "decamelize@npm:1.2.0" + checksum: ad8c51a7e7e0720c70ec2eeb1163b66da03e7616d7b98c9ef43cce2416395e84c1e9548dd94f5f6ffecfee9f8b94251fc57121a8b021f2ff2469b2bae247b8aa + languageName: node + linkType: hard + +"decamelize@npm:^4.0.0": + version: 4.0.0 + resolution: "decamelize@npm:4.0.0" + checksum: b7d09b82652c39eead4d6678bb578e3bebd848add894b76d0f6b395bc45b2d692fb88d977e7cfb93c4ed6c119b05a1347cef261174916c2e75c0a8ca57da1809 + languageName: node + linkType: hard + +"dedent@npm:0.7.0": + version: 0.7.0 + resolution: "dedent@npm:0.7.0" + checksum: 87de191050d9a40dd70cad01159a0bcf05ecb59750951242070b6abf9569088684880d00ba92a955b4058804f16eeaf91d604f283929b4f614d181cd7ae633d2 + languageName: node + linkType: hard + +"deep-eql@npm:^4.0.1, deep-eql@npm:^4.1.3": + version: 4.1.4 + resolution: "deep-eql@npm:4.1.4" + dependencies: + type-detect: ^4.0.0 + checksum: 01c3ca78ff40d79003621b157054871411f94228ceb9b2cab78da913c606631c46e8aa79efc4aa0faf3ace3092acd5221255aab3ef0e8e7b438834f0ca9a16c7 + languageName: node + linkType: hard + +"deep-extend@npm:~0.6.0": + version: 0.6.0 + resolution: "deep-extend@npm:0.6.0" + checksum: 7be7e5a8d468d6b10e6a67c3de828f55001b6eb515d014f7aeb9066ce36bd5717161eb47d6a0f7bed8a9083935b465bc163ee2581c8b128d29bf61092fdf57a7 + languageName: node + linkType: hard + +"deep-is@npm:^0.1.3, deep-is@npm:~0.1.3": + version: 0.1.4 + resolution: "deep-is@npm:0.1.4" + checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 + languageName: node + linkType: hard + +"defaults@npm:^1.0.3": + version: 1.0.4 + resolution: "defaults@npm:1.0.4" + dependencies: + clone: ^1.0.2 + checksum: 3a88b7a587fc076b84e60affad8b85245c01f60f38fc1d259e7ac1d89eb9ce6abb19e27215de46b98568dd5bc48471730b327637e6f20b0f1bc85cf00440c80a + languageName: node + linkType: hard + +"define-data-property@npm:^1.1.4": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" + dependencies: + es-define-property: ^1.0.0 + es-errors: ^1.3.0 + gopd: ^1.0.1 + checksum: 8068ee6cab694d409ac25936eb861eea704b7763f7f342adbdfe337fc27c78d7ae0eff2364b2917b58c508d723c7a074326d068eef2e45c4edcd85cf94d0313b + languageName: node + linkType: hard + +"delay@npm:^5.0.0": + version: 5.0.0 + resolution: "delay@npm:5.0.0" + checksum: 62f151151ecfde0d9afbb8a6be37a6d103c4cb24f35a20ef3fe56f920b0d0d0bb02bc9c0a3084d0179ef669ca332b91155f2ee4d9854622cd2cdba5fc95285f9 + languageName: node + linkType: hard + +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020 + languageName: node + linkType: hard + +"depd@npm:2.0.0": + version: 2.0.0 + resolution: "depd@npm:2.0.0" + checksum: abbe19c768c97ee2eed6282d8ce3031126662252c58d711f646921c9623f9052e3e1906443066beec1095832f534e57c523b7333f8e7e0d93051ab6baef5ab3a + languageName: node + linkType: hard + +"detect-file@npm:^1.0.0": + version: 1.0.0 + resolution: "detect-file@npm:1.0.0" + checksum: 1861e4146128622e847abe0e1ed80fef01e78532665858a792267adf89032b7a9c698436137707fcc6f02956c2a6a0052d6a0cef5be3d4b76b1ff0da88e2158a + languageName: node + linkType: hard + +"detect-indent@npm:6.1.0": + version: 6.1.0 + resolution: "detect-indent@npm:6.1.0" + checksum: ab953a73c72dbd4e8fc68e4ed4bfd92c97eb6c43734af3900add963fd3a9316f3bc0578b018b24198d4c31a358571eff5f0656e81a1f3b9ad5c547d58b2d093d + languageName: node + linkType: hard + +"diff@npm:^4.0.1": + version: 4.0.2 + resolution: "diff@npm:4.0.2" + checksum: f2c09b0ce4e6b301c221addd83bf3f454c0bc00caa3dd837cf6c127d6edf7223aa2bbe3b688feea110b7f262adbfc845b757c44c8a9f8c0c5b15d8fa9ce9d20d + languageName: node + linkType: hard + +"diff@npm:^5.2.0": + version: 5.2.0 + resolution: "diff@npm:5.2.0" + checksum: 12b63ca9c36c72bafa3effa77121f0581b4015df18bc16bac1f8e263597735649f1a173c26f7eba17fb4162b073fee61788abe49610e6c70a2641fe1895443fd + languageName: node + linkType: hard + +"difflib@npm:^0.2.4": + version: 0.2.4 + resolution: "difflib@npm:0.2.4" + dependencies: + heap: ">= 0.2.0" + checksum: 4f4237b026263ce7471b77d9019b901c2f358a7da89401a80a84a8c3cdc1643a8e70b7495ccbe686cb4d95492eaf5dac119cd9ecbffe5f06bfc175fbe5c20a27 + languageName: node + linkType: hard + +"dir-glob@npm:^3.0.1": + version: 3.0.1 + resolution: "dir-glob@npm:3.0.1" + dependencies: + path-type: ^4.0.0 + checksum: fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 + languageName: node + linkType: hard + +"doctrine@npm:^3.0.0": + version: 3.0.0 + resolution: "doctrine@npm:3.0.0" + dependencies: + esutils: ^2.0.2 + checksum: fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce + languageName: node + linkType: hard + +"dot-prop@npm:^5.1.0": + version: 5.3.0 + resolution: "dot-prop@npm:5.3.0" + dependencies: + is-obj: ^2.0.0 + checksum: d5775790093c234ef4bfd5fbe40884ff7e6c87573e5339432870616331189f7f5d86575c5b5af2dcf0f61172990f4f734d07844b1f23482fff09e3c4bead05ea + languageName: node + linkType: hard + +"dotenv@npm:^16.0.3, dotenv@npm:^16.3.1": + version: 16.4.5 + resolution: "dotenv@npm:16.4.5" + checksum: 301a12c3d44fd49888b74eb9ccf9f07a1f5df43f489e7fcb89647a2edcd84c42d6bc349dc8df099cd18f07c35c7b04685c1a4f3e6a6a9e6b30f8d48c15b7f49c + languageName: node + linkType: hard + +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed + languageName: node + linkType: hard + +"elliptic@npm:6.5.4": + version: 6.5.4 + resolution: "elliptic@npm:6.5.4" + 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 + checksum: d56d21fd04e97869f7ffcc92e18903b9f67f2d4637a23c860492fbbff5a3155fd9ca0184ce0c865dd6eb2487d234ce9551335c021c376cd2d3b7cb749c7d10f4 + languageName: node + linkType: hard + +"elliptic@npm:^6.5.2, elliptic@npm:^6.5.4": + version: 6.5.7 + resolution: "elliptic@npm:6.5.7" + 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 + checksum: af0ffddffdbc2fea4eeec74388cd73e62ed5a0eac6711568fb28071566319785df529c968b0bf1250ba4bc628e074b2d64c54a633e034aa6f0c6b152ceb49ab8 + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 + languageName: node + linkType: hard + +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601 + languageName: node + linkType: hard + +"enabled@npm:2.0.x": + version: 2.0.0 + resolution: "enabled@npm:2.0.0" + checksum: 9d256d89f4e8a46ff988c6a79b22fa814b4ffd82826c4fdacd9b42e9b9465709d3b748866d0ab4d442dfc6002d81de7f7b384146ccd1681f6a7f868d2acca063 + languageName: node + linkType: hard + +"encode-utf8@npm:^1.0.2": + version: 1.0.3 + resolution: "encode-utf8@npm:1.0.3" + checksum: 550224bf2a104b1d355458c8a82e9b4ea07f9fc78387bc3a49c151b940ad26473de8dc9e121eefc4e84561cb0b46de1e4cd2bc766f72ee145e9ea9541482817f + languageName: node + linkType: hard + +"encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" + dependencies: + iconv-lite: ^0.6.2 + checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f + languageName: node + linkType: hard + +"enquirer@npm:^2.3.0, enquirer@npm:^2.3.6": + version: 2.4.1 + resolution: "enquirer@npm:2.4.1" + dependencies: + ansi-colors: ^4.1.1 + strip-ansi: ^6.0.1 + checksum: f080f11a74209647dbf347a7c6a83c8a47ae1ebf1e75073a808bc1088eb780aa54075bfecd1bcdb3e3c724520edb8e6ee05da031529436b421b71066fcc48cb5 + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0, env-paths@npm:^2.2.1": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54 + languageName: node + linkType: hard + +"error-ex@npm:^1.3.1": + version: 1.3.2 + resolution: "error-ex@npm:1.3.2" + dependencies: + is-arrayish: ^0.2.1 + checksum: c1c2b8b65f9c91b0f9d75f0debaa7ec5b35c266c2cac5de412c1a6de86d4cbae04ae44e510378cb14d032d0645a36925d0186f8bb7367bcc629db256b743a001 + languageName: node + linkType: hard + +"es-define-property@npm:^1.0.0": + version: 1.0.0 + resolution: "es-define-property@npm:1.0.0" + dependencies: + get-intrinsic: ^1.2.4 + checksum: f66ece0a887b6dca71848fa71f70461357c0e4e7249696f81bad0a1f347eed7b31262af4a29f5d726dc026426f085483b6b90301855e647aa8e21936f07293c6 + languageName: node + linkType: hard + +"es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: ec1414527a0ccacd7f15f4a3bc66e215f04f595ba23ca75cdae0927af099b5ec865f9f4d33e9d7e86f512f252876ac77d4281a7871531a50678132429b1271b5 + languageName: node + linkType: hard + +"es6-promise@npm:^4.0.3": + version: 4.2.8 + resolution: "es6-promise@npm:4.2.8" + checksum: 95614a88873611cb9165a85d36afa7268af5c03a378b35ca7bda9508e1d4f1f6f19a788d4bc755b3fd37c8ebba40782018e02034564ff24c9d6fa37e959ad57d + languageName: node + linkType: hard + +"es6-promisify@npm:^5.0.0": + version: 5.0.0 + resolution: "es6-promisify@npm:5.0.0" + dependencies: + es6-promise: ^4.0.3 + checksum: fbed9d791598831413be84a5374eca8c24800ec71a16c1c528c43a98e2dadfb99331483d83ae6094ddb9b87e6f799a15d1553cebf756047e0865c753bc346b92 + languageName: node + linkType: hard + +"escalade@npm:^3.1.1": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 47b029c83de01b0d17ad99ed766347b974b0d628e848de404018f3abee728e987da0d2d370ad4574aa3d5b5bfc368754fd085d69a30f8e75903486ec4b5b709e + languageName: node + linkType: hard + +"escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 + languageName: node + linkType: hard + +"escodegen@npm:1.8.x": + version: 1.8.1 + resolution: "escodegen@npm:1.8.1" + dependencies: + esprima: ^2.7.1 + estraverse: ^1.9.1 + esutils: ^2.0.2 + optionator: ^0.8.1 + source-map: ~0.2.0 + dependenciesMeta: + source-map: + optional: true + bin: + escodegen: ./bin/escodegen.js + esgenerate: ./bin/esgenerate.js + checksum: 99f5579dbc309d8f95f8051cce2f85620c073ff1d4f7b58197addee7e81aeb5281dadfbd446a0885b8fb8c0c47ce5c2cdb5f97dbfddccb5126cca5eb9af73992 + languageName: node + linkType: hard + +"eslint-config-prettier@npm:^8.5.0": + version: 8.10.0 + resolution: "eslint-config-prettier@npm:8.10.0" + peerDependencies: + eslint: ">=7.0.0" + bin: + eslint-config-prettier: bin/cli.js + checksum: 153266badd477e49b0759816246b2132f1dbdb6c7f313ca60a9af5822fd1071c2bc5684a3720d78b725452bbac04bb130878b2513aea5e72b1b792de5a69fec8 + languageName: node + linkType: hard + +"eslint-config-prettier@npm:^9.0.0": + version: 9.1.0 + resolution: "eslint-config-prettier@npm:9.1.0" + peerDependencies: + eslint: ">=7.0.0" + bin: + eslint-config-prettier: bin/cli.js + checksum: 9229b768c879f500ee54ca05925f31b0c0bafff3d9f5521f98ff05127356de78c81deb9365c86a5ec4efa990cb72b74df8612ae15965b14136044c73e1f6a907 + languageName: node + linkType: hard + +"eslint-scope@npm:^5.1.1": + version: 5.1.1 + resolution: "eslint-scope@npm:5.1.1" + dependencies: + esrecurse: ^4.3.0 + estraverse: ^4.1.1 + checksum: 47e4b6a3f0cc29c7feedee6c67b225a2da7e155802c6ea13bbef4ac6b9e10c66cd2dcb987867ef176292bf4e64eccc680a49e35e9e9c669f4a02bac17e86abdb + languageName: node + linkType: hard + +"eslint-scope@npm:^7.2.2": + version: 7.2.2 + resolution: "eslint-scope@npm:7.2.2" + dependencies: + esrecurse: ^4.3.0 + estraverse: ^5.2.0 + checksum: ec97dbf5fb04b94e8f4c5a91a7f0a6dd3c55e46bfc7bbcd0e3138c3a76977570e02ed89a1810c778dcd72072ff0e9621ba1379b4babe53921d71e2e4486fda3e + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": + version: 3.4.3 + resolution: "eslint-visitor-keys@npm:3.4.3" + checksum: 36e9ef87fca698b6fd7ca5ca35d7b2b6eeaaf106572e2f7fd31c12d3bfdaccdb587bba6d3621067e5aece31c8c3a348b93922ab8f7b2cbc6aaab5e1d89040c60 + languageName: node + linkType: hard + +"eslint@npm:^8.28.0, eslint@npm:^8.51.0": + version: 8.57.0 + resolution: "eslint@npm:8.57.0" + 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 + bin: + eslint: bin/eslint.js + checksum: 3a48d7ff85ab420a8447e9810d8087aea5b1df9ef68c9151732b478de698389ee656fd895635b5f2871c89ee5a2652b3f343d11e9db6f8486880374ebc74a2d9 + languageName: node + linkType: hard + +"espree@npm:^9.6.0, espree@npm:^9.6.1": + version: 9.6.1 + resolution: "espree@npm:9.6.1" + dependencies: + acorn: ^8.9.0 + acorn-jsx: ^5.3.2 + eslint-visitor-keys: ^3.4.1 + checksum: eb8c149c7a2a77b3f33a5af80c10875c3abd65450f60b8af6db1bfcfa8f101e21c1e56a561c6dc13b848e18148d43469e7cd208506238554fb5395a9ea5a1ab9 + languageName: node + linkType: hard + +"esprima@npm:2.7.x, esprima@npm:^2.7.1": + version: 2.7.3 + resolution: "esprima@npm:2.7.3" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: 55584508dca0551885e62c3369bc4a783bd948b43e2f034f05c2a37f3ca398db99f072ab228234e9cab09af8dc8c65d6ca7de3a975f2a296b34d1a3aba7e89f1 + languageName: node + linkType: hard + +"esprima@npm:^4.0.0": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: b45bc805a613dbea2835278c306b91aff6173c8d034223fa81498c77dcbce3b2931bf6006db816f62eacd9fd4ea975dfd85a5b7f3c6402cfd050d4ca3c13a628 + languageName: node + linkType: hard + +"esquery@npm:^1.4.2": + version: 1.6.0 + resolution: "esquery@npm:1.6.0" + dependencies: + estraverse: ^5.1.0 + checksum: 08ec4fe446d9ab27186da274d979558557fbdbbd10968fa9758552482720c54152a5640e08b9009e5a30706b66aba510692054d4129d32d0e12e05bbc0b96fb2 + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: ^5.2.0 + checksum: ebc17b1a33c51cef46fdc28b958994b1dc43cd2e86237515cbc3b4e5d2be6a811b2315d0a1a4d9d340b6d2308b15322f5c8291059521cc5f4802f65e7ec32837 + languageName: node + linkType: hard + +"estraverse@npm:^1.9.1": + version: 1.9.3 + resolution: "estraverse@npm:1.9.3" + checksum: 78fa96317500e7783d48297dbd4c7f8735ddeb970be2981b485639ffa77578d05b8f781332622e436f2e9e533f32923c62c2e6463291e577ceeaf2776ac5e4b5 + languageName: node + linkType: hard + +"estraverse@npm:^4.1.1": + version: 4.3.0 + resolution: "estraverse@npm:4.3.0" + checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 + languageName: node + linkType: hard + +"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 22b5b08f74737379a840b8ed2036a5fb35826c709ab000683b092d9054e5c2a82c27818f12604bfc2a9a76b90b6834ef081edbc1c7ae30d1627012e067c6ec87 + languageName: node + linkType: hard + +"eth-gas-reporter@npm:^0.2.25": + version: 0.2.27 + resolution: "eth-gas-reporter@npm:0.2.27" + dependencies: + "@solidity-parser/parser": ^0.14.0 + axios: ^1.5.1 + cli-table3: ^0.5.0 + colors: 1.4.0 + ethereum-cryptography: ^1.0.3 + ethers: ^5.7.2 + fs-readdir-recursive: ^1.1.0 + lodash: ^4.17.14 + markdown-table: ^1.1.3 + mocha: ^10.2.0 + req-cwd: ^2.0.0 + sha1: ^1.1.1 + sync-request: ^6.0.0 + peerDependencies: + "@codechecks/client": ^0.1.0 + peerDependenciesMeta: + "@codechecks/client": + optional: true + checksum: 9a26a4936693de6dbe633a9e6f9d69eb93c9d45c61ecbc20702a72f15ade424785e29ae8e62ea3a2afc49ea22a4777a71914dc8da1b8587e9d47d085a3246784 + languageName: node + linkType: hard + +"ethereum-bloom-filters@npm:^1.0.6": + version: 1.2.0 + resolution: "ethereum-bloom-filters@npm:1.2.0" + dependencies: + "@noble/hashes": ^1.4.0 + checksum: 3a4d11495a5845483b78eca6455a915835d691df09a8c5754785c6bdfb5d18382d7e65b066a1c092493c1d87850c6a77243136996a231baec82f22c727e15258 + languageName: node + linkType: hard + +"ethereum-cryptography@npm:0.1.3, ethereum-cryptography@npm:^0.1.3": + version: 0.1.3 + resolution: "ethereum-cryptography@npm:0.1.3" + dependencies: + "@types/pbkdf2": ^3.0.0 + "@types/secp256k1": ^4.0.1 + blakejs: ^1.1.0 + browserify-aes: ^1.2.0 + bs58check: ^2.1.2 + create-hash: ^1.2.0 + create-hmac: ^1.1.7 + hash.js: ^1.1.7 + keccak: ^3.0.0 + pbkdf2: ^3.0.17 + randombytes: ^2.1.0 + safe-buffer: ^5.1.2 + scrypt-js: ^3.0.0 + secp256k1: ^4.0.1 + setimmediate: ^1.0.5 + checksum: 54bae7a4a96bd81398cdc35c91cfcc74339f71a95ed1b5b694663782e69e8e3afd21357de3b8bac9ff4877fd6f043601e200a7ad9133d94be6fd7d898ee0a449 + languageName: node + linkType: hard + +"ethereum-cryptography@npm:^1.0.3": + version: 1.2.0 + resolution: "ethereum-cryptography@npm:1.2.0" + dependencies: + "@noble/hashes": 1.2.0 + "@noble/secp256k1": 1.7.1 + "@scure/bip32": 1.1.5 + "@scure/bip39": 1.1.1 + checksum: 97e8e8253cb9f5a9271bd0201c37609c451c890eb85883b9c564f14743c3d7c673287406c93bf5604307593ee298ad9a03983388b85c11ca61461b9fc1a4f2c7 + languageName: node + linkType: hard + +"ethereum-cryptography@npm:^2.0.0, ethereum-cryptography@npm:^2.1.2": + version: 2.2.1 + resolution: "ethereum-cryptography@npm:2.2.1" + dependencies: + "@noble/curves": 1.4.2 + "@noble/hashes": 1.4.0 + "@scure/bip32": 1.4.0 + "@scure/bip39": 1.3.0 + checksum: 1466e4c417b315a6ac67f95088b769fafac8902b495aada3c6375d827e5a7882f9e0eea5f5451600d2250283d9198b8a3d4d996e374e07a80a324e29136f25c6 + languageName: node + linkType: hard + +"ethereumjs-abi@npm:^0.6.8": + version: 0.6.8 + resolution: "ethereumjs-abi@npm:0.6.8" + dependencies: + bn.js: ^4.11.8 + ethereumjs-util: ^6.0.0 + checksum: cede2a8ae7c7e04eeaec079c2f925601a25b2ef75cf9230e7c5da63b4ea27883b35447365a47e35c1e831af520973a2252af89022c292c18a09a4607821a366b + languageName: node + linkType: hard + +"ethereumjs-util@npm:^6.0.0, ethereumjs-util@npm:^6.2.1": + version: 6.2.1 + resolution: "ethereumjs-util@npm:6.2.1" + dependencies: + "@types/bn.js": ^4.11.3 + bn.js: ^4.11.0 + create-hash: ^1.1.2 + elliptic: ^6.5.2 + ethereum-cryptography: ^0.1.3 + ethjs-util: 0.1.6 + rlp: ^2.2.3 + checksum: e3cb4a2c034a2529281fdfc21a2126fe032fdc3038863f5720352daa65ddcc50fc8c67dbedf381a882dc3802e05d979287126d7ecf781504bde1fd8218693bde + languageName: node + linkType: hard + +"ethereumjs-util@npm:^7.1.4": + version: 7.1.5 + resolution: "ethereumjs-util@npm:7.1.5" + dependencies: + "@types/bn.js": ^5.1.0 + bn.js: ^5.1.2 + create-hash: ^1.1.2 + ethereum-cryptography: ^0.1.3 + rlp: ^2.2.4 + checksum: 27a3c79d6e06b2df34b80d478ce465b371c8458b58f5afc14d91c8564c13363ad336e6e83f57eb0bd719fde94d10ee5697ceef78b5aa932087150c5287b286d1 + languageName: node + linkType: hard + +"ethers@npm:^5.7.0, ethers@npm:^5.7.1, ethers@npm:^5.7.2": + version: 5.7.2 + resolution: "ethers@npm:5.7.2" + 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 + checksum: b7c08cf3e257185a7946117dbbf764433b7ba0e77c27298dec6088b3bc871aff711462b0621930c56880ff0a7ceb8b1d3a361ffa259f93377b48e34107f62553 + languageName: node + linkType: hard + +"ethers@npm:^6.2.3": + version: 6.13.2 + resolution: "ethers@npm:6.13.2" + 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.17.1 + checksum: 981860c736c7ae121774ad38ea07e3611ce524a77d2fcb77db499b65afe0cbe8f344cd5204d94b68b316349ff770fd2a7d9c8b2039da41c072f98d9864099925 + languageName: node + linkType: hard + +"ethjs-unit@npm:0.1.6": + version: 0.1.6 + resolution: "ethjs-unit@npm:0.1.6" + dependencies: + bn.js: 4.11.6 + number-to-bn: 1.7.0 + checksum: df6b4752ff7461a59a20219f4b1684c631ea601241c39660e3f6c6bd63c950189723841c22b3c6c0ebeb3c9fc99e0e803e3c613101206132603705fcbcf4def5 + languageName: node + linkType: hard + +"ethjs-util@npm:0.1.6, ethjs-util@npm:^0.1.6": + version: 0.1.6 + resolution: "ethjs-util@npm:0.1.6" + dependencies: + is-hex-prefixed: 1.0.0 + strip-hex-prefix: 1.0.0 + checksum: 1f42959e78ec6f49889c49c8a98639e06f52a15966387dd39faf2930db48663d026efb7db2702dcffe7f2a99c4a0144b7ce784efdbf733f4077aae95de76d65f + languageName: node + linkType: hard + +"eventemitter3@npm:^5.0.1": + version: 5.0.1 + resolution: "eventemitter3@npm:5.0.1" + checksum: 543d6c858ab699303c3c32e0f0f47fc64d360bf73c3daf0ac0b5079710e340d6fe9f15487f94e66c629f5f82cd1a8678d692f3dbb6f6fcd1190e1b97fcad36f8 + languageName: node + linkType: hard + +"evp_bytestokey@npm:^1.0.3": + version: 1.0.3 + resolution: "evp_bytestokey@npm:1.0.3" + dependencies: + md5.js: ^1.3.4 + node-gyp: latest + safe-buffer: ^5.1.1 + checksum: ad4e1577f1a6b721c7800dcc7c733fe01f6c310732bb5bf2240245c2a5b45a38518b91d8be2c610611623160b9d1c0e91f1ce96d639f8b53e8894625cf20fa45 + languageName: node + linkType: hard + +"execa@npm:7.2.0": + version: 7.2.0 + resolution: "execa@npm:7.2.0" + dependencies: + cross-spawn: ^7.0.3 + get-stream: ^6.0.1 + human-signals: ^4.3.0 + is-stream: ^3.0.0 + merge-stream: ^2.0.0 + npm-run-path: ^5.1.0 + onetime: ^6.0.0 + signal-exit: ^3.0.7 + strip-final-newline: ^3.0.0 + checksum: 14fd17ba0ca8c87b277584d93b1d9fc24f2a65e5152b31d5eb159a3b814854283eaae5f51efa9525e304447e2f757c691877f7adff8fde5746aae67eb1edd1cc + languageName: node + linkType: hard + +"execa@npm:^5.0.0": + version: 5.1.1 + resolution: "execa@npm:5.1.1" + dependencies: + cross-spawn: ^7.0.3 + get-stream: ^6.0.0 + human-signals: ^2.1.0 + is-stream: ^2.0.0 + merge-stream: ^2.0.0 + npm-run-path: ^4.0.1 + onetime: ^5.1.2 + signal-exit: ^3.0.3 + strip-final-newline: ^2.0.0 + checksum: fba9022c8c8c15ed862847e94c252b3d946036d7547af310e344a527e59021fd8b6bb0723883ea87044dc4f0201f949046993124a42ccb0855cae5bf8c786343 + languageName: node + linkType: hard + +"expand-tilde@npm:^2.0.0, expand-tilde@npm:^2.0.2": + version: 2.0.2 + resolution: "expand-tilde@npm:2.0.2" + dependencies: + homedir-polyfill: ^1.0.1 + checksum: 2efe6ed407d229981b1b6ceb552438fbc9e5c7d6a6751ad6ced3e0aa5cf12f0b299da695e90d6c2ac79191b5c53c613e508f7149e4573abfbb540698ddb7301a + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.1 + resolution: "exponential-backoff@npm:3.1.1" + checksum: 3d21519a4f8207c99f7457287291316306255a328770d320b401114ec8481986e4e467e854cb9914dd965e0a1ca810a23ccb559c642c88f4c7f55c55778a9b48 + languageName: node + linkType: hard + +"external-editor@npm:^3.0.3": + version: 3.1.0 + resolution: "external-editor@npm:3.1.0" + dependencies: + chardet: ^0.7.0 + iconv-lite: ^0.4.24 + tmp: ^0.0.33 + checksum: 1c2a616a73f1b3435ce04030261bed0e22d4737e14b090bb48e58865da92529c9f2b05b893de650738d55e692d071819b45e1669259b2b354bc3154d27a698c7 + languageName: node + linkType: hard + +"eyes@npm:^0.1.8": + version: 0.1.8 + resolution: "eyes@npm:0.1.8" + checksum: c31703a92bf36ba75ee8d379ee7985c24ee6149f3a6175f44cec7a05b178c38bce9836d3ca48c9acb0329a960ac2c4b2ead4e60cdd4fe6e8c92cad7cd6913687 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d + languageName: node + linkType: hard + +"fast-diff@npm:^1.1.2, fast-diff@npm:^1.2.0": + version: 1.3.0 + resolution: "fast-diff@npm:1.3.0" + checksum: d22d371b994fdc8cce9ff510d7b8dc4da70ac327bcba20df607dd5b9cae9f908f4d1028f5fe467650f058d1e7270235ae0b8230809a262b4df587a3b3aa216c3 + languageName: node + linkType: hard + +"fast-glob@npm:^3.0.3, fast-glob@npm:^3.2.9": + version: 3.3.2 + resolution: "fast-glob@npm:3.3.2" + 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 + checksum: 900e4979f4dbc3313840078419245621259f349950411ca2fa445a2f9a1a6d98c3b5e7e0660c5ccd563aa61abe133a21765c6c0dec8e57da1ba71d8000b05ec1 + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:^2.0.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb + languageName: node + linkType: hard + +"fast-levenshtein@npm:^2.0.6, fast-levenshtein@npm:~2.0.6": + version: 2.0.6 + resolution: "fast-levenshtein@npm:2.0.6" + checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c + languageName: node + linkType: hard + +"fast-stable-stringify@npm:^1.0.0": + version: 1.0.0 + resolution: "fast-stable-stringify@npm:1.0.0" + checksum: ef1203d246a7e8ac15e2bfbda0a89fa375947bccf9f7910be0ea759856dbe8ea5024a0d8cc2cceabe18a9cb67e95927b78bb6173a3ae37ec55a518cf36e5244b + languageName: node + linkType: hard + +"fast-uri@npm:^3.0.1": + version: 3.0.1 + resolution: "fast-uri@npm:3.0.1" + checksum: 106143ff83705995225dcc559411288f3337e732bb2e264e79788f1914b6bd8f8bc3683102de60b15ba00e6ebb443633cabac77d4ebc5cb228c47cf955e199ff + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.17.1 + resolution: "fastq@npm:1.17.1" + dependencies: + reusify: ^1.0.4 + checksum: a8c5b26788d5a1763f88bae56a8ddeee579f935a831c5fe7a8268cea5b0a91fbfe705f612209e02d639b881d7b48e461a50da4a10cfaa40da5ca7cc9da098d88 + languageName: node + linkType: hard + +"fecha@npm:^4.2.0": + version: 4.2.3 + resolution: "fecha@npm:4.2.3" + checksum: f94e2fb3acf5a7754165d04549460d3ae6c34830394d20c552197e3e000035d69732d74af04b9bed3283bf29fe2a9ebdcc0085e640b0be3cc3658b9726265e31 + languageName: node + linkType: hard + +"figures@npm:^3.0.0": + version: 3.2.0 + resolution: "figures@npm:3.2.0" + dependencies: + escape-string-regexp: ^1.0.5 + checksum: 85a6ad29e9aca80b49b817e7c89ecc4716ff14e3779d9835af554db91bac41c0f289c418923519392a1e582b4d10482ad282021330cd045bb7b80c84152f2a2b + languageName: node + linkType: hard + +"file-entry-cache@npm:^6.0.1": + version: 6.0.1 + resolution: "file-entry-cache@npm:6.0.1" + dependencies: + flat-cache: ^3.0.4 + checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 + languageName: node + linkType: hard + +"file-uri-to-path@npm:1.0.0": + version: 1.0.0 + resolution: "file-uri-to-path@npm:1.0.0" + checksum: b648580bdd893a008c92c7ecc96c3ee57a5e7b6c4c18a9a09b44fb5d36d79146f8e442578bc0e173dc027adf3987e254ba1dfd6e3ec998b7c282873010502144 + languageName: node + linkType: hard + +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" + dependencies: + to-regex-range: ^5.0.1 + checksum: b4abfbca3839a3d55e4ae5ec62e131e2e356bf4859ce8480c64c4876100f4df292a63e5bb1618e1d7460282ca2b305653064f01654474aa35c68000980f17798 + languageName: node + linkType: hard + +"find-node-modules@npm:^2.1.2": + version: 2.1.3 + resolution: "find-node-modules@npm:2.1.3" + dependencies: + findup-sync: ^4.0.0 + merge: ^2.1.1 + checksum: 4b8a194ffd56ccf1a1033de35e2ee8209869b05cce68ff7c4ab0dbf04e63fd7196283383eee4c84596c7b311755b2836815209d558234cadc330a87881e5a3f4 + languageName: node + linkType: hard + +"find-replace@npm:^3.0.0": + version: 3.0.0 + resolution: "find-replace@npm:3.0.0" + dependencies: + array-back: ^3.0.1 + checksum: 6b04bcfd79027f5b84aa1dfe100e3295da989bdac4b4de6b277f4d063e78f5c9e92ebc8a1fec6dd3b448c924ba404ee051cc759e14a3ee3e825fa1361025df08 + languageName: node + linkType: hard + +"find-root@npm:1.1.0": + version: 1.1.0 + resolution: "find-root@npm:1.1.0" + checksum: b2a59fe4b6c932eef36c45a048ae8f93c85640212ebe8363164814990ee20f154197505965f3f4f102efc33bfb1cbc26fd17c4a2fc739ebc51b886b137cbefaf + languageName: node + linkType: hard + +"find-up@npm:^2.1.0": + version: 2.1.0 + resolution: "find-up@npm:2.1.0" + dependencies: + locate-path: ^2.0.0 + checksum: 43284fe4da09f89011f08e3c32cd38401e786b19226ea440b75386c1b12a4cb738c94969808d53a84f564ede22f732c8409e3cfc3f7fb5b5c32378ad0bbf28bd + languageName: node + linkType: hard + +"find-up@npm:^4.1.0": + version: 4.1.0 + resolution: "find-up@npm:4.1.0" + dependencies: + locate-path: ^5.0.0 + path-exists: ^4.0.0 + checksum: 4c172680e8f8c1f78839486e14a43ef82e9decd0e74145f40707cc42e7420506d5ec92d9a11c22bd2c48fb0c384ea05dd30e10dd152fefeec6f2f75282a8b844 + languageName: node + linkType: hard + +"find-up@npm:^5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" + dependencies: + locate-path: ^6.0.0 + path-exists: ^4.0.0 + checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 + languageName: node + linkType: hard + +"find-yarn-workspace-root@npm:^2.0.0": + version: 2.0.0 + resolution: "find-yarn-workspace-root@npm:2.0.0" + dependencies: + micromatch: ^4.0.2 + checksum: fa5ca8f9d08fe7a54ce7c0a5931ff9b7e36f9ee7b9475fb13752bcea80ec6b5f180fa5102d60b376d5526ce924ea3fc6b19301262efa0a5d248dd710f3644242 + languageName: node + linkType: hard + +"findup-sync@npm:^4.0.0": + version: 4.0.0 + resolution: "findup-sync@npm:4.0.0" + dependencies: + detect-file: ^1.0.0 + is-glob: ^4.0.0 + micromatch: ^4.0.2 + resolve-dir: ^1.0.1 + checksum: 94131e1107ad63790ed00c4c39ca131a93ea602607bd97afeffd92b69a9a63cf2c6f57d6db88cb753fe748ac7fde79e1e76768ff784247026b7c5ebf23ede3a0 + languageName: node + linkType: hard + +"flat-cache@npm:^3.0.4": + version: 3.2.0 + resolution: "flat-cache@npm:3.2.0" + dependencies: + flatted: ^3.2.9 + keyv: ^4.5.3 + rimraf: ^3.0.2 + checksum: e7e0f59801e288b54bee5cb9681e9ee21ee28ef309f886b312c9d08415b79fc0f24ac842f84356ce80f47d6a53de62197ce0e6e148dc42d5db005992e2a756ec + languageName: node + linkType: hard + +"flat@npm:^5.0.2": + version: 5.0.2 + resolution: "flat@npm:5.0.2" + bin: + flat: cli.js + checksum: 12a1536ac746db74881316a181499a78ef953632ddd28050b7a3a43c62ef5462e3357c8c29d76072bb635f147f7a9a1f0c02efef6b4be28f8db62ceb3d5c7f5d + languageName: node + linkType: hard + +"flatted@npm:^3.2.9": + version: 3.3.1 + resolution: "flatted@npm:3.3.1" + checksum: 85ae7181650bb728c221e7644cbc9f4bf28bc556f2fc89bb21266962bdf0ce1029cc7acc44bb646cd469d9baac7c317f64e841c4c4c00516afa97320cdac7f94 + languageName: node + linkType: hard + +"fmix@npm:^0.1.0": + version: 0.1.0 + resolution: "fmix@npm:0.1.0" + dependencies: + imul: ^1.0.0 + checksum: c465344d4f169eaf10d45c33949a1e7a633f09dba2ac7063ce8ae8be743df5979d708f7f24900163589f047f5194ac5fc2476177ce31175e8805adfa7b8fb7a4 + languageName: node + linkType: hard + +"fn.name@npm:1.x.x": + version: 1.1.0 + resolution: "fn.name@npm:1.1.0" + checksum: e357144f48cfc9a7f52a82bbc6c23df7c8de639fce049cac41d41d62cabb740cdb9f14eddc6485e29c933104455bdd7a69bb14a9012cef9cd4fa252a4d0cf293 + languageName: node + linkType: hard + +"follow-redirects@npm:^1.12.1, follow-redirects@npm:^1.14.0, follow-redirects@npm:^1.15.6": + version: 1.15.9 + resolution: "follow-redirects@npm:1.15.9" + peerDependenciesMeta: + debug: + optional: true + checksum: 859e2bacc7a54506f2bf9aacb10d165df78c8c1b0ceb8023f966621b233717dab56e8d08baadc3ad3b9db58af290413d585c999694b7c146aaf2616340c3d2a6 + languageName: node + linkType: hard + +"foreground-child@npm:^3.1.0": + version: 3.3.0 + resolution: "foreground-child@npm:3.3.0" + dependencies: + cross-spawn: ^7.0.0 + signal-exit: ^4.0.1 + checksum: 1989698488f725b05b26bc9afc8a08f08ec41807cd7b92ad85d96004ddf8243fd3e79486b8348c64a3011ae5cc2c9f0936af989e1f28339805d8bc178a75b451 + languageName: node + linkType: hard + +"form-data@npm:^2.2.0": + version: 2.5.1 + resolution: "form-data@npm:2.5.1" + dependencies: + asynckit: ^0.4.0 + combined-stream: ^1.0.6 + mime-types: ^2.1.12 + checksum: 5134ada56cc246b293a1ac7678dba6830000603a3979cf83ff7b2f21f2e3725202237cfb89e32bcb38a1d35727efbd3c3a22e65b42321e8ade8eec01ce755d08 + languageName: node + linkType: hard + +"form-data@npm:^4.0.0": + version: 4.0.0 + resolution: "form-data@npm:4.0.0" + dependencies: + asynckit: ^0.4.0 + combined-stream: ^1.0.8 + mime-types: ^2.1.12 + checksum: 01135bf8675f9d5c61ff18e2e2932f719ca4de964e3be90ef4c36aacfc7b9cb2fceb5eca0b7e0190e3383fe51c5b37f4cb80b62ca06a99aaabfcfd6ac7c9328c + languageName: node + linkType: hard + +"fp-ts@npm:1.19.3": + version: 1.19.3 + resolution: "fp-ts@npm:1.19.3" + checksum: eb0d4766ad561e9c5c01bfdd3d0ae589af135556921c733d26cf5289aad9f400110defdd93e6ac1d71f626697bb44d9d95ed2879c53dfd868f7cac3cf5c5553c + languageName: node + linkType: hard + +"fp-ts@npm:^1.0.0": + version: 1.19.5 + resolution: "fp-ts@npm:1.19.5" + checksum: 67d2d9c3855d211ca2592b1ef805f98b618157e7681791a776d9d0f7f3e52fcca2122ebf5bc215908c9099fad69756d40e37210cf46cb4075dae1b61efe69e40 + languageName: node + linkType: hard + +"fs-extra@npm:9.1.0, fs-extra@npm:^9.0.0, fs-extra@npm:^9.1.0": + version: 9.1.0 + resolution: "fs-extra@npm:9.1.0" + dependencies: + at-least-node: ^1.0.0 + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: ba71ba32e0faa74ab931b7a0031d1523c66a73e225de7426e275e238e312d07313d2da2d33e34a52aa406c8763ade5712eb3ec9ba4d9edce652bcacdc29e6b20 + languageName: node + linkType: hard + +"fs-extra@npm:^0.30.0": + version: 0.30.0 + resolution: "fs-extra@npm:0.30.0" + dependencies: + graceful-fs: ^4.1.2 + jsonfile: ^2.1.0 + klaw: ^1.0.0 + path-is-absolute: ^1.0.0 + rimraf: ^2.2.8 + checksum: 6edfd65fc813baa27f1603778c0f5ec11f8c5006a20b920437813ee2023eba18aeec8bef1c89b2e6c84f9fc90fdc7c916f4a700466c8c69d22a35d018f2570f0 + languageName: node + linkType: hard + +"fs-extra@npm:^10.0.0, fs-extra@npm:^10.1.0": + version: 10.1.0 + resolution: "fs-extra@npm:10.1.0" + dependencies: + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: dc94ab37096f813cc3ca12f0f1b5ad6744dfed9ed21e953d72530d103cea193c2f81584a39e9dee1bea36de5ee66805678c0dddc048e8af1427ac19c00fffc50 + languageName: node + linkType: hard + +"fs-extra@npm:^11.0.0": + version: 11.2.0 + resolution: "fs-extra@npm:11.2.0" + dependencies: + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: b12e42fa40ba47104202f57b8480dd098aa931c2724565e5e70779ab87605665594e76ee5fb00545f772ab9ace167fe06d2ab009c416dc8c842c5ae6df7aa7e8 + languageName: node + linkType: hard + +"fs-extra@npm:^7.0.0, fs-extra@npm:^7.0.1": + version: 7.0.1 + resolution: "fs-extra@npm:7.0.1" + dependencies: + graceful-fs: ^4.1.2 + jsonfile: ^4.0.0 + universalify: ^0.1.0 + checksum: 141b9dccb23b66a66cefdd81f4cda959ff89282b1d721b98cea19ba08db3dcbe6f862f28841f3cf24bb299e0b7e6c42303908f65093cb7e201708e86ea5a8dcf + languageName: node + linkType: hard + +"fs-extra@npm:^8.1.0": + version: 8.1.0 + resolution: "fs-extra@npm:8.1.0" + dependencies: + graceful-fs: ^4.2.0 + jsonfile: ^4.0.0 + universalify: ^0.1.0 + checksum: bf44f0e6cea59d5ce071bba4c43ca76d216f89e402dc6285c128abc0902e9b8525135aa808adad72c9d5d218e9f4bcc63962815529ff2f684ad532172a284880 + languageName: node + linkType: hard + +"fs-minipass@npm:^2.0.0": + version: 2.1.0 + resolution: "fs-minipass@npm:2.1.0" + dependencies: + minipass: ^3.0.0 + checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1 + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: ^7.0.3 + checksum: 8722a41109130851d979222d3ec88aabaceeaaf8f57b2a8f744ef8bd2d1ce95453b04a61daa0078822bc5cd21e008814f06fe6586f56fef511e71b8d2394d802 + languageName: node + linkType: hard + +"fs-readdir-recursive@npm:^1.1.0": + version: 1.1.0 + resolution: "fs-readdir-recursive@npm:1.1.0" + checksum: 29d50f3d2128391c7fc9fd051c8b7ea45bcc8aa84daf31ef52b17218e20bfd2bd34d02382742801954cc8d1905832b68227f6b680a666ce525d8b6b75068ad1e + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 + languageName: node + linkType: hard + +"fsevents@npm:~2.3.2": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" + dependencies: + node-gyp: latest + checksum: 11e6ea6fea15e42461fc55b4b0e4a0a3c654faa567f1877dbd353f39156f69def97a69936d1746619d656c4b93de2238bf731f6085a03a50cabf287c9d024317 + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@~2.3.2#~builtin": + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=18f3a7" + dependencies: + node-gyp: latest + conditions: os=darwin + languageName: node + linkType: hard + +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 2b0ff4ce708d99715ad14a6d1f894e2a83242e4a52ccfcefaee5e40050562e5f6dafc1adbb4ce2d4ab47279a45dc736ab91ea5042d843c3c092820dfe032efb1 + languageName: node + linkType: hard + +"functional-red-black-tree@npm:^1.0.1": + version: 1.0.1 + resolution: "functional-red-black-tree@npm:1.0.1" + checksum: ca6c170f37640e2d94297da8bb4bf27a1d12bea3e00e6a3e007fd7aa32e37e000f5772acf941b4e4f3cf1c95c3752033d0c509af157ad8f526e7f00723b9eb9f + languageName: node + linkType: hard + +"get-caller-file@npm:^2.0.5": + version: 2.0.5 + resolution: "get-caller-file@npm:2.0.5" + checksum: b9769a836d2a98c3ee734a88ba712e62703f1df31b94b784762c433c27a386dd6029ff55c2a920c392e33657d80191edbf18c61487e198844844516f843496b9 + languageName: node + linkType: hard + +"get-func-name@npm:^2.0.1, get-func-name@npm:^2.0.2": + version: 2.0.2 + resolution: "get-func-name@npm:2.0.2" + checksum: 3f62f4c23647de9d46e6f76d2b3eafe58933a9b3830c60669e4180d6c601ce1b4aa310ba8366143f55e52b139f992087a9f0647274e8745621fa2af7e0acf13b + languageName: node + linkType: hard + +"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.4": + version: 1.2.4 + resolution: "get-intrinsic@npm:1.2.4" + 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 + checksum: 414e3cdf2c203d1b9d7d33111df746a4512a1aa622770b361dadddf8ed0b5aeb26c560f49ca077e24bfafb0acb55ca908d1f709216ccba33ffc548ec8a79a951 + languageName: node + linkType: hard + +"get-port@npm:^3.1.0": + version: 3.2.0 + resolution: "get-port@npm:3.2.0" + checksum: 31f530326569683ac4b7452eb7573c40e9dbe52aec14d80745c35475261e6389160da153d5b8ae911150b4ce99003472b30c69ba5be0cedeaa7865b95542d168 + languageName: node + linkType: hard + +"get-stream@npm:^6.0.0, get-stream@npm:^6.0.1": + version: 6.0.1 + resolution: "get-stream@npm:6.0.1" + checksum: e04ecece32c92eebf5b8c940f51468cd53554dcbb0ea725b2748be583c9523d00128137966afce410b9b051eb2ef16d657cd2b120ca8edafcf5a65e81af63cad + languageName: node + linkType: hard + +"ghost-testrpc@npm:^0.0.2": + version: 0.0.2 + resolution: "ghost-testrpc@npm:0.0.2" + dependencies: + chalk: ^2.4.2 + node-emoji: ^1.10.0 + bin: + testrpc-sc: ./index.js + checksum: 3f86326d32f5e96c9356381837edde7dd0f23dcb7223aa73e02816256b84703cb76ce922987054a05b65963326088e99a4aa142d4b467ddda7c28547ed915d6d + languageName: node + linkType: hard + +"git-raw-commits@npm:^2.0.11": + version: 2.0.11 + resolution: "git-raw-commits@npm:2.0.11" + dependencies: + dargs: ^7.0.0 + lodash: ^4.17.15 + meow: ^8.0.0 + split2: ^3.0.0 + through2: ^4.0.0 + bin: + git-raw-commits: cli.js + checksum: c178af43633684106179793b6e3473e1d2bb50bb41d04e2e285ea4eef342ca4090fee6bc8a737552fde879d22346c90de5c49f18c719a0f38d4c934f258a0f79 + languageName: node + linkType: hard + +"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: ^4.0.1 + checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e + languageName: node + linkType: hard + +"glob-parent@npm:^6.0.2": + version: 6.0.2 + resolution: "glob-parent@npm:6.0.2" + dependencies: + is-glob: ^4.0.3 + checksum: c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8 + languageName: node + linkType: hard + +"glob@npm:7.1.7": + version: 7.1.7 + resolution: "glob@npm:7.1.7" + 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 + checksum: b61f48973bbdcf5159997b0874a2165db572b368b931135832599875919c237fc05c12984e38fe828e69aa8a921eb0e8a4997266211c517c9cfaae8a93988bb8 + languageName: node + linkType: hard + +"glob@npm:7.2.0": + version: 7.2.0 + resolution: "glob@npm:7.2.0" + 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 + checksum: 78a8ea942331f08ed2e055cb5b9e40fe6f46f579d7fd3d694f3412fe5db23223d29b7fee1575440202e9a7ff9a72ab106a39fee39934c7bedafe5e5f8ae20134 + languageName: node + linkType: hard + +"glob@npm:7.2.3, glob@npm:^7.0.0, glob@npm:^7.1.2, glob@npm:^7.1.3": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + 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 + checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 + languageName: node + linkType: hard + +"glob@npm:^10.2.2, glob@npm:^10.3.10": + version: 10.4.5 + resolution: "glob@npm:10.4.5" + dependencies: + foreground-child: ^3.1.0 + jackspeak: ^3.1.2 + minimatch: ^9.0.4 + minipass: ^7.1.2 + package-json-from-dist: ^1.0.0 + path-scurry: ^1.11.1 + bin: + glob: dist/esm/bin.mjs + checksum: 0bc725de5e4862f9f387fd0f2b274baf16850dcd2714502ccf471ee401803997983e2c05590cb65f9675a3c6f2a58e7a53f9e365704108c6ad3cbf1d60934c4a + languageName: node + linkType: hard + +"glob@npm:^5.0.15": + version: 5.0.15 + resolution: "glob@npm:5.0.15" + dependencies: + inflight: ^1.0.4 + inherits: 2 + minimatch: 2 || 3 + once: ^1.3.0 + path-is-absolute: ^1.0.0 + checksum: f9742448303460672607e569457f1b57e486a79a985e269b69465834d2075b243378225f65dc54c09fcd4b75e4fb34442aec88f33f8c65fa4abccc8ee2dc2f5d + languageName: node + linkType: hard + +"glob@npm:^8.0.3, glob@npm:^8.1.0": + version: 8.1.0 + resolution: "glob@npm:8.1.0" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^5.0.1 + once: ^1.3.0 + checksum: 92fbea3221a7d12075f26f0227abac435de868dd0736a17170663783296d0dd8d3d532a5672b4488a439bf5d7fb85cdd07c11185d6cd39184f0385cbdfb86a47 + languageName: node + linkType: hard + +"global-directory@npm:^4.0.1": + version: 4.0.1 + resolution: "global-directory@npm:4.0.1" + dependencies: + ini: 4.1.1 + checksum: 5b4df24438a4e5f21e43fbdd9e54f5e12bb48dce01a0a83b415d8052ce91be2d3a97e0c8f98a535e69649b2190036155e9f0f7d3c62f9318f31bdc3fd4f235f5 + languageName: node + linkType: hard + +"global-dirs@npm:^0.1.1": + version: 0.1.1 + resolution: "global-dirs@npm:0.1.1" + dependencies: + ini: ^1.3.4 + checksum: 10624f5a8ddb8634c22804c6b24f93fb591c3639a6bc78e3584e01a238fc6f7b7965824184e57d63f6df36980b6c191484ad7bc6c35a1599b8f1d64be64c2a4a + languageName: node + linkType: hard + +"global-modules@npm:^1.0.0": + version: 1.0.0 + resolution: "global-modules@npm:1.0.0" + dependencies: + global-prefix: ^1.0.1 + is-windows: ^1.0.1 + resolve-dir: ^1.0.0 + checksum: 10be68796c1e1abc1e2ba87ec4ea507f5629873b119ab0cd29c07284ef2b930f1402d10df01beccb7391dedd9cd479611dd6a24311c71be58937beaf18edf85e + languageName: node + linkType: hard + +"global-modules@npm:^2.0.0": + version: 2.0.0 + resolution: "global-modules@npm:2.0.0" + dependencies: + global-prefix: ^3.0.0 + checksum: d6197f25856c878c2fb5f038899f2dca7cbb2f7b7cf8999660c0104972d5cfa5c68b5a0a77fa8206bb536c3903a4615665acb9709b4d80846e1bb47eaef65430 + languageName: node + linkType: hard + +"global-prefix@npm:^1.0.1": + version: 1.0.2 + resolution: "global-prefix@npm:1.0.2" + dependencies: + expand-tilde: ^2.0.2 + homedir-polyfill: ^1.0.1 + ini: ^1.3.4 + is-windows: ^1.0.1 + which: ^1.2.14 + checksum: 061b43470fe498271bcd514e7746e8a8535032b17ab9570517014ae27d700ff0dca749f76bbde13ba384d185be4310d8ba5712cb0e74f7d54d59390db63dd9a0 + languageName: node + linkType: hard + +"global-prefix@npm:^3.0.0": + version: 3.0.0 + resolution: "global-prefix@npm:3.0.0" + dependencies: + ini: ^1.3.5 + kind-of: ^6.0.2 + which: ^1.3.1 + checksum: 8a82fc1d6f22c45484a4e34656cc91bf021a03e03213b0035098d605bfc612d7141f1e14a21097e8a0413b4884afd5b260df0b6a25605ce9d722e11f1df2881d + languageName: node + linkType: hard + +"globals@npm:^11.1.0": + version: 11.12.0 + resolution: "globals@npm:11.12.0" + checksum: 67051a45eca3db904aee189dfc7cd53c20c7d881679c93f6146ddd4c9f4ab2268e68a919df740d39c71f4445d2b38ee360fc234428baea1dbdfe68bbcb46979e + languageName: node + linkType: hard + +"globals@npm:^13.19.0": + version: 13.24.0 + resolution: "globals@npm:13.24.0" + dependencies: + type-fest: ^0.20.2 + checksum: 56066ef058f6867c04ff203b8a44c15b038346a62efbc3060052a1016be9f56f4cf0b2cd45b74b22b81e521a889fc7786c73691b0549c2f3a6e825b3d394f43c + languageName: node + linkType: hard + +"globby@npm:^10.0.1": + version: 10.0.2 + resolution: "globby@npm:10.0.2" + dependencies: + "@types/glob": ^7.1.1 + array-union: ^2.1.0 + dir-glob: ^3.0.1 + fast-glob: ^3.0.3 + glob: ^7.1.3 + ignore: ^5.1.1 + merge2: ^1.2.3 + slash: ^3.0.0 + checksum: 167cd067f2cdc030db2ec43232a1e835fa06217577d545709dbf29fd21631b30ff8258705172069c855dc4d5766c3b2690834e35b936fbff01ad0329fb95a26f + languageName: node + linkType: hard + +"globby@npm:^11.1.0": + version: 11.1.0 + resolution: "globby@npm:11.1.0" + 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 + checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 + languageName: node + linkType: hard + +"gopd@npm:^1.0.1": + version: 1.0.1 + resolution: "gopd@npm:1.0.1" + dependencies: + get-intrinsic: ^1.1.3 + checksum: a5ccfb8806e0917a94e0b3de2af2ea4979c1da920bc381667c260e00e7cafdbe844e2cb9c5bcfef4e5412e8bf73bab837285bc35c7ba73aaaf0134d4583393a6 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.1.9, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 + languageName: node + linkType: hard + +"graphemer@npm:^1.4.0": + version: 1.4.0 + resolution: "graphemer@npm:1.4.0" + checksum: bab8f0be9b568857c7bec9fda95a89f87b783546d02951c40c33f84d05bb7da3fd10f863a9beb901463669b6583173a8c8cc6d6b306ea2b9b9d5d3d943c3a673 + languageName: node + linkType: hard + +"handlebars@npm:^4.0.1": + version: 4.7.8 + resolution: "handlebars@npm:4.7.8" + dependencies: + minimist: ^1.2.5 + neo-async: ^2.6.2 + source-map: ^0.6.1 + uglify-js: ^3.1.4 + wordwrap: ^1.0.0 + dependenciesMeta: + uglify-js: + optional: true + bin: + handlebars: bin/handlebars + checksum: 00e68bb5c183fd7b8b63322e6234b5ac8fbb960d712cb3f25587d559c2951d9642df83c04a1172c918c41bcfc81bfbd7a7718bbce93b893e0135fc99edea93ff + languageName: node + linkType: hard + +"hard-rejection@npm:^2.1.0": + version: 2.1.0 + resolution: "hard-rejection@npm:2.1.0" + checksum: 7baaf80a0c7fff4ca79687b4060113f1529589852152fa935e6787a2bc96211e784ad4588fb3048136ff8ffc9dfcf3ae385314a5b24db32de20bea0d1597f9dc + languageName: node + linkType: hard + +"hardhat-change-network@npm:^0.0.7": + version: 0.0.7 + resolution: "hardhat-change-network@npm:0.0.7" + peerDependencies: + hardhat: ^2.0.0 + checksum: 3cdda51abd45851be3335faa34ac2a54fe304628492a834fcd36ccf476d78ba8df0b4648ef0d93223ac65c24060998408681b5892e968b825784df62da47f402 + languageName: node + linkType: hard + +"hardhat-deploy@npm:^0.11.31": + version: 0.11.45 + resolution: "hardhat-deploy@npm:0.11.45" + dependencies: + "@ethersproject/abi": ^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/contracts": ^5.7.0 + "@ethersproject/providers": ^5.7.2 + "@ethersproject/solidity": ^5.7.0 + "@ethersproject/transactions": ^5.7.0 + "@ethersproject/wallet": ^5.7.0 + "@types/qs": ^6.9.7 + axios: ^0.21.1 + chalk: ^4.1.2 + chokidar: ^3.5.2 + debug: ^4.3.2 + enquirer: ^2.3.6 + ethers: ^5.7.0 + form-data: ^4.0.0 + fs-extra: ^10.0.0 + match-all: ^1.2.6 + murmur-128: ^0.2.1 + qs: ^6.9.4 + zksync-web3: ^0.14.3 + checksum: 7ecce33c3305857bdd1873a25d391e27ae9f581df75757035cb028ace7bb5fbb83f053435e843bc3d925e7fd8412c3dc582797fe5b4bbe1fef7f3dd989a7c878 + languageName: node + linkType: hard + +"hardhat-gas-reporter@npm:^1.0.9": + version: 1.0.10 + resolution: "hardhat-gas-reporter@npm:1.0.10" + dependencies: + array-uniq: 1.0.3 + eth-gas-reporter: ^0.2.25 + sha1: ^1.1.1 + peerDependencies: + hardhat: ^2.0.2 + checksum: caaec13ab3fcda47b8768257e4416b5fd0e8ef3aca5369aa8195419d3d4a948cc182075333651df44215cfc629d088f5ed9f762c8c14ae5a4b4a4f2613e583d0 + languageName: node + linkType: hard + +"hardhat@npm:2.19.4": + version: 2.19.4 + resolution: "hardhat@npm:2.19.4" + dependencies: + "@ethersproject/abi": ^5.1.2 + "@metamask/eth-sig-util": ^4.0.0 + "@nomicfoundation/ethereumjs-block": 5.0.2 + "@nomicfoundation/ethereumjs-blockchain": 7.0.2 + "@nomicfoundation/ethereumjs-common": 4.0.2 + "@nomicfoundation/ethereumjs-evm": 2.0.2 + "@nomicfoundation/ethereumjs-rlp": 5.0.2 + "@nomicfoundation/ethereumjs-statemanager": 2.0.2 + "@nomicfoundation/ethereumjs-trie": 6.0.2 + "@nomicfoundation/ethereumjs-tx": 5.0.2 + "@nomicfoundation/ethereumjs-util": 9.0.2 + "@nomicfoundation/ethereumjs-vm": 7.0.2 + "@nomicfoundation/solidity-analyzer": ^0.1.0 + "@sentry/node": ^5.18.1 + "@types/bn.js": ^5.1.0 + "@types/lru-cache": ^5.1.0 + adm-zip: ^0.4.16 + aggregate-error: ^3.0.0 + ansi-escapes: ^4.3.0 + chalk: ^2.4.2 + chokidar: ^3.4.0 + ci-info: ^2.0.0 + debug: ^4.1.1 + enquirer: ^2.3.0 + env-paths: ^2.2.0 + ethereum-cryptography: ^1.0.3 + ethereumjs-abi: ^0.6.8 + find-up: ^2.1.0 + fp-ts: 1.19.3 + fs-extra: ^7.0.1 + glob: 7.2.0 + immutable: ^4.0.0-rc.12 + io-ts: 1.10.4 + keccak: ^3.0.2 + lodash: ^4.17.11 + mnemonist: ^0.38.0 + mocha: ^10.0.0 + p-map: ^4.0.0 + raw-body: ^2.4.1 + resolve: 1.17.0 + semver: ^6.3.0 + solc: 0.7.3 + source-map-support: ^0.5.13 + stacktrace-parser: ^0.1.10 + tsort: 0.0.1 + undici: ^5.14.0 + uuid: ^8.3.2 + ws: ^7.4.6 + peerDependencies: + ts-node: "*" + typescript: "*" + peerDependenciesMeta: + ts-node: + optional: true + typescript: + optional: true + bin: + hardhat: internal/cli/bootstrap.js + checksum: 05dcaeab5bb641e74426ad47acfda903dcd3fd229b0d30f45b9de1d3c54fe6364161f3c88517984233d18f5b9294a050500ca7336b6ca069fa259fede6f5acb1 + languageName: node + linkType: hard + +"has-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "has-flag@npm:1.0.0" + checksum: ce3f8ae978e70f16e4bbe17d3f0f6d6c0a3dd3b62a23f97c91d0fda9ed8e305e13baf95cc5bee4463b9f25ac9f5255de113165c5fb285e01b8065b2ac079b301 + languageName: node + linkType: hard + +"has-flag@npm:^3.0.0": + version: 3.0.0 + resolution: "has-flag@npm:3.0.0" + checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad + languageName: node + linkType: hard + +"has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" + dependencies: + es-define-property: ^1.0.0 + checksum: fcbb246ea2838058be39887935231c6d5788babed499d0e9d0cc5737494c48aba4fe17ba1449e0d0fbbb1e36175442faa37f9c427ae357d6ccb1d895fbcd3de3 + languageName: node + linkType: hard + +"has-proto@npm:^1.0.1": + version: 1.0.3 + resolution: "has-proto@npm:1.0.3" + checksum: fe7c3d50b33f50f3933a04413ed1f69441d21d2d2944f81036276d30635cad9279f6b43bc8f32036c31ebdfcf6e731150f46c1907ad90c669ffe9b066c3ba5c4 + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.3": + version: 1.0.3 + resolution: "has-symbols@npm:1.0.3" + checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 + languageName: node + linkType: hard + +"hash-base@npm:^3.0.0": + version: 3.1.0 + resolution: "hash-base@npm:3.1.0" + dependencies: + inherits: ^2.0.4 + readable-stream: ^3.6.0 + safe-buffer: ^5.2.0 + checksum: 26b7e97ac3de13cb23fc3145e7e3450b0530274a9562144fc2bf5c1e2983afd0e09ed7cc3b20974ba66039fad316db463da80eb452e7373e780cbee9a0d2f2dc + languageName: node + linkType: hard + +"hash.js@npm:1.1.7, hash.js@npm:^1.0.0, hash.js@npm:^1.0.3, hash.js@npm:^1.1.7": + version: 1.1.7 + resolution: "hash.js@npm:1.1.7" + dependencies: + inherits: ^2.0.3 + minimalistic-assert: ^1.0.1 + checksum: e350096e659c62422b85fa508e4b3669017311aa4c49b74f19f8e1bc7f3a54a584fdfd45326d4964d6011f2b2d882e38bea775a96046f2a61b7779a979629d8f + languageName: node + linkType: hard + +"hasown@npm:^2.0.0, hasown@npm:^2.0.2": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" + dependencies: + function-bind: ^1.1.2 + checksum: e8516f776a15149ca6c6ed2ae3110c417a00b62260e222590e54aa367cbcd6ed99122020b37b7fbdf05748df57b265e70095d7bf35a47660587619b15ffb93db + languageName: node + linkType: hard + +"he@npm:^1.2.0": + version: 1.2.0 + resolution: "he@npm:1.2.0" + bin: + he: bin/he + checksum: 3d4d6babccccd79c5c5a3f929a68af33360d6445587d628087f39a965079d84f18ce9c3d3f917ee1e3978916fc833bb8b29377c3b403f919426f91bc6965e7a7 + languageName: node + linkType: hard + +"heap@npm:>= 0.2.0": + version: 0.2.7 + resolution: "heap@npm:0.2.7" + checksum: b0f3963a799e02173f994c452921a777f2b895b710119df999736bfed7477235c2860c423d9aea18a9f3b3d065cb1114d605c208cfcb8d0ac550f97ec5d28cb0 + languageName: node + linkType: hard + +"hmac-drbg@npm:^1.0.1": + version: 1.0.1 + resolution: "hmac-drbg@npm:1.0.1" + dependencies: + hash.js: ^1.0.3 + minimalistic-assert: ^1.0.0 + minimalistic-crypto-utils: ^1.0.1 + checksum: bd30b6a68d7f22d63f10e1888aee497d7c2c5c0bb469e66bbdac99f143904d1dfe95f8131f95b3e86c86dd239963c9d972fcbe147e7cffa00e55d18585c43fe0 + languageName: node + linkType: hard + +"homedir-polyfill@npm:^1.0.1": + version: 1.0.3 + resolution: "homedir-polyfill@npm:1.0.3" + dependencies: + parse-passwd: ^1.0.0 + checksum: 18dd4db87052c6a2179d1813adea0c4bfcfa4f9996f0e226fefb29eb3d548e564350fa28ec46b0bf1fbc0a1d2d6922ceceb80093115ea45ff8842a4990139250 + languageName: node + linkType: hard + +"hosted-git-info@npm:^2.1.4": + version: 2.8.9 + resolution: "hosted-git-info@npm:2.8.9" + checksum: c955394bdab888a1e9bb10eb33029e0f7ce5a2ac7b3f158099dc8c486c99e73809dca609f5694b223920ca2174db33d32b12f9a2a47141dc59607c29da5a62dd + languageName: node + linkType: hard + +"hosted-git-info@npm:^4.0.1": + version: 4.1.0 + resolution: "hosted-git-info@npm:4.1.0" + dependencies: + lru-cache: ^6.0.0 + checksum: c3f87b3c2f7eb8c2748c8f49c0c2517c9a95f35d26f4bf54b2a8cba05d2e668f3753548b6ea366b18ec8dadb4e12066e19fa382a01496b0ffa0497eb23cbe461 + languageName: node + linkType: hard + +"http-basic@npm:^8.1.1": + version: 8.1.3 + resolution: "http-basic@npm:8.1.3" + dependencies: + caseless: ^0.12.0 + concat-stream: ^1.6.2 + http-response-object: ^3.0.1 + parse-cache-control: ^1.0.1 + checksum: 7df5dc4d4b6eb8cc3beaa77f8e5c3074288ec3835abd83c85e5bb66d8a95a0ef97664d862caf5e225698cb795f78f9a5abd0d39404e5356ccd3e5e10c87936a5 + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.1.1": + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236 + languageName: node + linkType: hard + +"http-errors@npm:2.0.0": + version: 2.0.0 + resolution: "http-errors@npm:2.0.0" + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + checksum: 9b0a3782665c52ce9dc658a0d1560bcb0214ba5699e4ea15aefb2a496e2ca83db03ebc42e1cce4ac1f413e4e0d2d736a3fd755772c556a9a06853ba2a0b7d920 + languageName: node + linkType: hard + +"http-proxy-agent@npm:^7.0.0": + version: 7.0.2 + resolution: "http-proxy-agent@npm:7.0.2" + dependencies: + agent-base: ^7.1.0 + debug: ^4.3.4 + checksum: 670858c8f8f3146db5889e1fa117630910101db601fff7d5a8aa637da0abedf68c899f03d3451cac2f83bcc4c3d2dabf339b3aa00ff8080571cceb02c3ce02f3 + languageName: node + linkType: hard + +"http-response-object@npm:^3.0.1": + version: 3.0.2 + resolution: "http-response-object@npm:3.0.2" + dependencies: + "@types/node": ^10.0.3 + checksum: 6cbdcb4ce7b27c9158a131b772c903ed54add2ba831e29cc165e91c3969fa6f8105ddf924aac5b954b534ad15a1ae697b693331b2be5281ee24d79aae20c3264 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^5.0.0": + version: 5.0.1 + resolution: "https-proxy-agent@npm:5.0.1" + dependencies: + agent-base: 6 + debug: 4 + checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^7.0.1": + version: 7.0.5 + resolution: "https-proxy-agent@npm:7.0.5" + dependencies: + agent-base: ^7.0.2 + debug: 4 + checksum: 2e1a28960f13b041a50702ee74f240add8e75146a5c37fc98f1960f0496710f6918b3a9fe1e5aba41e50f58e6df48d107edd9c405c5f0d73ac260dabf2210857 + languageName: node + linkType: hard + +"human-signals@npm:^2.1.0": + version: 2.1.0 + resolution: "human-signals@npm:2.1.0" + checksum: b87fd89fce72391625271454e70f67fe405277415b48bcc0117ca73d31fa23a4241787afdc8d67f5a116cf37258c052f59ea82daffa72364d61351423848e3b8 + languageName: node + linkType: hard + +"human-signals@npm:^4.3.0": + version: 4.3.1 + resolution: "human-signals@npm:4.3.1" + checksum: 6f12958df3f21b6fdaf02d90896c271df00636a31e2bbea05bddf817a35c66b38a6fdac5863e2df85bd52f34958997f1f50350ff97249e1dff8452865d5235d1 + languageName: node + linkType: hard + +"humanize-ms@npm:^1.2.1": + version: 1.2.1 + resolution: "humanize-ms@npm:1.2.1" + dependencies: + ms: ^2.0.0 + checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16 + languageName: node + linkType: hard + +"husky@npm:^8.0.3": + version: 8.0.3 + resolution: "husky@npm:8.0.3" + bin: + husky: lib/bin.js + checksum: 837bc7e4413e58c1f2946d38fb050f5d7324c6f16b0fd66411ffce5703b294bd21429e8ba58711cd331951ee86ed529c5be4f76805959ff668a337dbfa82a1b0 + languageName: node + linkType: hard + +"iconv-lite@npm:0.4.24, iconv-lite@npm:^0.4.24": + version: 0.4.24 + resolution: "iconv-lite@npm:0.4.24" + dependencies: + safer-buffer: ">= 2.1.2 < 3" + checksum: bd9f120f5a5b306f0bc0b9ae1edeb1577161503f5f8252a20f1a9e56ef8775c9959fd01c55f2d3a39d9a8abaf3e30c1abeb1895f367dcbbe0a8fd1c9ca01c4f6 + languageName: node + linkType: hard + +"iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: ">= 2.1.2 < 3.0.0" + checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf + languageName: node + linkType: hard + +"ieee754@npm:^1.1.13, ieee754@npm:^1.2.1": + version: 1.2.1 + resolution: "ieee754@npm:1.2.1" + checksum: 5144c0c9815e54ada181d80a0b810221a253562422e7c6c3a60b1901154184f49326ec239d618c416c1c5945a2e197107aee8d986a3dd836b53dffefd99b5e7e + languageName: node + linkType: hard + +"ignore-by-default@npm:^1.0.1": + version: 1.0.1 + resolution: "ignore-by-default@npm:1.0.1" + checksum: 441509147b3615e0365e407a3c18e189f78c07af08564176c680be1fabc94b6c789cad1342ad887175d4ecd5225de86f73d376cec8e06b42fd9b429505ffcf8a + languageName: node + linkType: hard + +"ignore@npm:^5.1.1, ignore@npm:^5.2.0, ignore@npm:^5.2.4": + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 2acfd32a573260ea522ea0bfeff880af426d68f6831f973129e2ba7363f422923cf53aab62f8369cbf4667c7b25b6f8a3761b34ecdb284ea18e87a5262a865be + languageName: node + linkType: hard + +"immutable@npm:^4.0.0-rc.12": + version: 4.3.7 + resolution: "immutable@npm:4.3.7" + checksum: 1c50eb053bb300796551604afff554066f041aa8e15926cf98f6d11d9736b62ad12531c06515dd96375258653878b4736f8051cd20b640f5f976d09fa640e3ec + languageName: node + linkType: hard + +"import-fresh@npm:^3.0.0, import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0": + version: 3.3.0 + resolution: "import-fresh@npm:3.3.0" + dependencies: + parent-module: ^1.0.0 + resolve-from: ^4.0.0 + checksum: 2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa + languageName: node + linkType: hard + +"import-meta-resolve@npm:^4.0.0": + version: 4.1.0 + resolution: "import-meta-resolve@npm:4.1.0" + checksum: 6497af27bf3ee384ad4efd4e0ec3facf9a114863f35a7b35f248659f32faa5e1ae07baa74d603069f35734ae3718a78b3f66926f98dc9a62e261e7df37854a62 + languageName: node + linkType: hard + +"imul@npm:^1.0.0": + version: 1.0.1 + resolution: "imul@npm:1.0.1" + checksum: 6c2af3d5f09e2135e14d565a2c108412b825b221eb2c881f9130467f2adccf7ae201773ae8bcf1be169e2d090567a1fdfa9cf20d3b7da7b9cecb95b920ff3e52 + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 + languageName: node + linkType: hard + +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: ^1.3.0 + wrappy: 1 + checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd + languageName: node + linkType: hard + +"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 + languageName: node + linkType: hard + +"ini@npm:4.1.1": + version: 4.1.1 + resolution: "ini@npm:4.1.1" + checksum: 0e5909554074fbc31824fa5415b0f604de4a665514c96a897a77bf77353a7ad4743927321270e9d0610a9d510ccd1f3cd77422f7cc80d8f4542dbce75476fb6d + languageName: node + linkType: hard + +"ini@npm:^1.3.4, ini@npm:^1.3.5": + version: 1.3.8 + resolution: "ini@npm:1.3.8" + checksum: dfd98b0ca3a4fc1e323e38a6c8eb8936e31a97a918d3b377649ea15bdb15d481207a0dda1021efbd86b464cae29a0d33c1d7dcaf6c5672bee17fa849bc50a1b3 + languageName: node + linkType: hard + +"inquirer@npm:8.2.5": + version: 8.2.5 + resolution: "inquirer@npm:8.2.5" + dependencies: + ansi-escapes: ^4.2.1 + chalk: ^4.1.1 + cli-cursor: ^3.1.0 + cli-width: ^3.0.0 + external-editor: ^3.0.3 + figures: ^3.0.0 + lodash: ^4.17.21 + mute-stream: 0.0.8 + ora: ^5.4.1 + run-async: ^2.4.0 + rxjs: ^7.5.5 + string-width: ^4.1.0 + strip-ansi: ^6.0.0 + through: ^2.3.6 + wrap-ansi: ^7.0.0 + checksum: f13ee4c444187786fb393609dedf6b30870115a57b603f2e6424f29a99abc13446fd45ee22461c33c9c40a92a60a8df62d0d6b25d74fc6676fa4cb211de55b55 + languageName: node + linkType: hard + +"interpret@npm:^1.0.0": + version: 1.4.0 + resolution: "interpret@npm:1.4.0" + checksum: 2e5f51268b5941e4a17e4ef0575bc91ed0ab5f8515e3cf77486f7c14d13f3010df9c0959f37063dcc96e78d12dc6b0bb1b9e111cdfe69771f4656d2993d36155 + languageName: node + linkType: hard + +"io-ts@npm:1.10.4": + version: 1.10.4 + resolution: "io-ts@npm:1.10.4" + dependencies: + fp-ts: ^1.0.0 + checksum: 619134006778f7ca42693716ade7fc1a383079e7848bbeabc67a0e4ac9139cda6b2a88a052d539ab7d554033ee2ffe4dab5cb96b958c83fee2dff73d23f03e88 + languageName: node + linkType: hard + +"ip-address@npm:^9.0.5": + version: 9.0.5 + resolution: "ip-address@npm:9.0.5" + dependencies: + jsbn: 1.1.0 + sprintf-js: ^1.1.3 + checksum: aa15f12cfd0ef5e38349744e3654bae649a34c3b10c77a674a167e99925d1549486c5b14730eebce9fea26f6db9d5e42097b00aa4f9f612e68c79121c71652dc + languageName: node + linkType: hard + +"is-arrayish@npm:^0.2.1": + version: 0.2.1 + resolution: "is-arrayish@npm:0.2.1" + checksum: eef4417e3c10e60e2c810b6084942b3ead455af16c4509959a27e490e7aee87cfb3f38e01bbde92220b528a0ee1a18d52b787e1458ee86174d8c7f0e58cd488f + languageName: node + linkType: hard + +"is-arrayish@npm:^0.3.1": + version: 0.3.2 + resolution: "is-arrayish@npm:0.3.2" + checksum: 977e64f54d91c8f169b59afcd80ff19227e9f5c791fa28fa2e5bce355cbaf6c2c356711b734656e80c9dd4a854dd7efcf7894402f1031dfc5de5d620775b4d5f + languageName: node + linkType: hard + +"is-binary-path@npm:~2.1.0": + version: 2.1.0 + resolution: "is-binary-path@npm:2.1.0" + dependencies: + binary-extensions: ^2.0.0 + checksum: 84192eb88cff70d320426f35ecd63c3d6d495da9d805b19bc65b518984b7c0760280e57dbf119b7e9be6b161784a5a673ab2c6abe83abb5198a432232ad5b35c + languageName: node + linkType: hard + +"is-buffer@npm:^2.0.5": + version: 2.0.5 + resolution: "is-buffer@npm:2.0.5" + checksum: 764c9ad8b523a9f5a32af29bdf772b08eb48c04d2ad0a7240916ac2688c983bf5f8504bf25b35e66240edeb9d9085461f9b5dae1f3d2861c6b06a65fe983de42 + languageName: node + linkType: hard + +"is-core-module@npm:^2.13.0, is-core-module@npm:^2.5.0": + version: 2.15.1 + resolution: "is-core-module@npm:2.15.1" + dependencies: + hasown: ^2.0.2 + checksum: df134c168115690724b62018c37b2f5bba0d5745fa16960b329c5a00883a8bea6a5632fdb1e3efcce237c201826ba09f93197b7cd95577ea56b0df335be23633 + languageName: node + linkType: hard + +"is-docker@npm:^2.0.0": + version: 2.2.1 + resolution: "is-docker@npm:2.2.1" + bin: + is-docker: cli.js + checksum: 3fef7ddbf0be25958e8991ad941901bf5922ab2753c46980b60b05c1bf9c9c2402d35e6dc32e4380b980ef5e1970a5d9d5e5aa2e02d77727c3b6b5e918474c56 + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^2.0.0": + version: 2.0.0 + resolution: "is-fullwidth-code-point@npm:2.0.0" + checksum: eef9c6e15f68085fec19ff6a978a6f1b8f48018fd1265035552078ee945573594933b09bbd6f562553e2a241561439f1ef5339276eba68d272001343084cfab8 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^4.0.0": + version: 4.0.0 + resolution: "is-fullwidth-code-point@npm:4.0.0" + checksum: 8ae89bf5057bdf4f57b346fb6c55e9c3dd2549983d54191d722d5c739397a903012cc41a04ee3403fd872e811243ef91a7c5196da7b5841dc6b6aae31a264a8d + languageName: node + linkType: hard + +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: ^2.1.1 + checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 + languageName: node + linkType: hard + +"is-hex-prefixed@npm:1.0.0": + version: 1.0.0 + resolution: "is-hex-prefixed@npm:1.0.0" + checksum: 5ac58e6e528fb029cc43140f6eeb380fad23d0041cc23154b87f7c9a1b728bcf05909974e47248fd0b7fcc11ba33cf7e58d64804883056fabd23e2b898be41de + languageName: node + linkType: hard + +"is-interactive@npm:^1.0.0": + version: 1.0.0 + resolution: "is-interactive@npm:1.0.0" + checksum: 824808776e2d468b2916cdd6c16acacebce060d844c35ca6d82267da692e92c3a16fdba624c50b54a63f38bdc4016055b6f443ce57d7147240de4f8cdabaf6f9 + languageName: node + linkType: hard + +"is-lambda@npm:^1.0.1": + version: 1.0.1 + resolution: "is-lambda@npm:1.0.1" + checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35 + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a + languageName: node + linkType: hard + +"is-obj@npm:^2.0.0": + version: 2.0.0 + resolution: "is-obj@npm:2.0.0" + checksum: c9916ac8f4621962a42f5e80e7ffdb1d79a3fab7456ceaeea394cd9e0858d04f985a9ace45be44433bf605673c8be8810540fe4cc7f4266fc7526ced95af5a08 + languageName: node + linkType: hard + +"is-path-inside@npm:^3.0.3": + version: 3.0.3 + resolution: "is-path-inside@npm:3.0.3" + checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 + languageName: node + linkType: hard + +"is-plain-obj@npm:^1.1.0": + version: 1.1.0 + resolution: "is-plain-obj@npm:1.1.0" + checksum: 0ee04807797aad50859652a7467481816cbb57e5cc97d813a7dcd8915da8195dc68c436010bf39d195226cde6a2d352f4b815f16f26b7bf486a5754290629931 + languageName: node + linkType: hard + +"is-plain-obj@npm:^2.1.0": + version: 2.1.0 + resolution: "is-plain-obj@npm:2.1.0" + checksum: cec9100678b0a9fe0248a81743041ed990c2d4c99f893d935545cfbc42876cbe86d207f3b895700c690ad2fa520e568c44afc1605044b535a7820c1d40e38daa + languageName: node + linkType: hard + +"is-stream@npm:^2.0.0": + version: 2.0.1 + resolution: "is-stream@npm:2.0.1" + checksum: b8e05ccdf96ac330ea83c12450304d4a591f9958c11fd17bed240af8d5ffe08aedafa4c0f4cfccd4d28dc9d4d129daca1023633d5c11601a6cbc77521f6fae66 + languageName: node + linkType: hard + +"is-stream@npm:^3.0.0": + version: 3.0.0 + resolution: "is-stream@npm:3.0.0" + checksum: 172093fe99119ffd07611ab6d1bcccfe8bc4aa80d864b15f43e63e54b7abc71e779acd69afdb854c4e2a67fdc16ae710e370eda40088d1cfc956a50ed82d8f16 + languageName: node + linkType: hard + +"is-text-path@npm:^1.0.1": + version: 1.0.1 + resolution: "is-text-path@npm:1.0.1" + dependencies: + text-extensions: ^1.0.0 + checksum: fb5d78752c22b3f73a7c9540768f765ffcfa38c9e421e2b9af869565307fa1ae5e3d3a2ba016a43549742856846566d327da406e94a5846ec838a288b1704fd2 + languageName: node + linkType: hard + +"is-unicode-supported@npm:^0.1.0": + version: 0.1.0 + resolution: "is-unicode-supported@npm:0.1.0" + checksum: a2aab86ee7712f5c2f999180daaba5f361bdad1efadc9610ff5b8ab5495b86e4f627839d085c6530363c6d6d4ecbde340fb8e54bdb83da4ba8e0865ed5513c52 + languageName: node + linkType: hard + +"is-utf8@npm:^0.2.1": + version: 0.2.1 + resolution: "is-utf8@npm:0.2.1" + checksum: 167ccd2be869fc228cc62c1a28df4b78c6b5485d15a29027d3b5dceb09b383e86a3522008b56dcac14b592b22f0a224388718c2505027a994fd8471465de54b3 + languageName: node + linkType: hard + +"is-windows@npm:^1.0.1": + version: 1.0.2 + resolution: "is-windows@npm:1.0.2" + checksum: 438b7e52656fe3b9b293b180defb4e448088e7023a523ec21a91a80b9ff8cdb3377ddb5b6e60f7c7de4fa8b63ab56e121b6705fe081b3cf1b828b0a380009ad7 + languageName: node + linkType: hard + +"is-wsl@npm:^2.1.1": + version: 2.2.0 + resolution: "is-wsl@npm:2.2.0" + dependencies: + is-docker: ^2.0.0 + checksum: 20849846ae414997d290b75e16868e5261e86ff5047f104027026fd61d8b5a9b0b3ade16239f35e1a067b3c7cc02f70183cb661010ed16f4b6c7c93dad1b19d8 + languageName: node + linkType: hard + +"isarray@npm:^2.0.5": + version: 2.0.5 + resolution: "isarray@npm:2.0.5" + checksum: bd5bbe4104438c4196ba58a54650116007fa0262eccef13a4c55b2e09a5b36b59f1e75b9fcc49883dd9d4953892e6fc007eef9e9155648ceea036e184b0f930a + languageName: node + linkType: hard + +"isarray@npm:~1.0.0": + version: 1.0.0 + resolution: "isarray@npm:1.0.0" + checksum: f032df8e02dce8ec565cf2eb605ea939bdccea528dbcf565cdf92bfa2da9110461159d86a537388ef1acef8815a330642d7885b29010e8f7eac967c9993b65ab + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 + languageName: node + linkType: hard + +"isexe@npm:^3.1.1": + version: 3.1.1 + resolution: "isexe@npm:3.1.1" + checksum: 7fe1931ee4e88eb5aa524cd3ceb8c882537bc3a81b02e438b240e47012eef49c86904d0f0e593ea7c3a9996d18d0f1f3be8d3eaa92333977b0c3a9d353d5563e + languageName: node + linkType: hard + +"isomorphic-ws@npm:^4.0.1": + version: 4.0.1 + resolution: "isomorphic-ws@npm:4.0.1" + peerDependencies: + ws: "*" + checksum: d7190eadefdc28bdb93d67b5f0c603385aaf87724fa2974abb382ac1ec9756ed2cfb27065cbe76122879c2d452e2982bc4314317f3d6c737ddda6c047328771a + languageName: node + linkType: hard + +"isows@npm:1.0.4": + version: 1.0.4 + resolution: "isows@npm:1.0.4" + peerDependencies: + ws: "*" + checksum: a3ee62e3d6216abb3adeeb2a551fe2e7835eac87b05a6ecc3e7739259bf5f8e83290501f49e26137390c8093f207fc3378d4a7653aab76ad7bbab4b2dba9c5b9 + languageName: node + linkType: hard + +"jackspeak@npm:^3.1.2": + version: 3.4.3 + resolution: "jackspeak@npm:3.4.3" + dependencies: + "@isaacs/cliui": ^8.0.2 + "@pkgjs/parseargs": ^0.11.0 + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: be31027fc72e7cc726206b9f560395604b82e0fddb46c4cbf9f97d049bcef607491a5afc0699612eaa4213ca5be8fd3e1e7cd187b3040988b65c9489838a7c00 + languageName: node + linkType: hard + +"javascript-natural-sort@npm:0.7.1": + version: 0.7.1 + resolution: "javascript-natural-sort@npm:0.7.1" + checksum: 161e2c512cc7884bc055a582c6645d9032cab88497a76123d73cb23bfb03d97a04cf7772ecdb8bd3366fc07192c2f996366f479f725c23ef073fffe03d6a586a + languageName: node + linkType: hard + +"jayson@npm:^4.1.1": + version: 4.1.2 + resolution: "jayson@npm:4.1.2" + dependencies: + "@types/connect": ^3.4.33 + "@types/node": ^12.12.54 + "@types/ws": ^7.4.4 + JSONStream: ^1.3.5 + commander: ^2.20.3 + delay: ^5.0.0 + es6-promisify: ^5.0.0 + eyes: ^0.1.8 + isomorphic-ws: ^4.0.1 + json-stringify-safe: ^5.0.1 + uuid: ^8.3.2 + ws: ^7.5.10 + bin: + jayson: bin/jayson.js + checksum: 10d6a0ce55045a1098b9b0d1d9b4b898f034e70696e57240ba76d67eddaabd703e1f59477c667b57e39f6f1fc54dbb87b1327a8a4edef39a37a17b70c79bb6e4 + languageName: node + linkType: hard + +"jiti@npm:^1.19.1": + version: 1.21.6 + resolution: "jiti@npm:1.21.6" + bin: + jiti: bin/jiti.js + checksum: 9ea4a70a7bb950794824683ed1c632e2ede26949fbd348e2ba5ec8dc5efa54dc42022d85ae229cadaa60d4b95012e80ea07d625797199b688cc22ab0e8891d32 + languageName: node + linkType: hard + +"js-sdsl@npm:^4.1.4": + version: 4.4.2 + resolution: "js-sdsl@npm:4.4.2" + checksum: ba705adc1788bf3c6f6c8e5077824f2bb4f0acab5a984420ce5cc492c7fff3daddc26335ad2c9a67d4f5e3241ec790f9e5b72a625adcf20cf321d2fd85e62b8b + languageName: node + linkType: hard + +"js-sha3@npm:0.8.0, js-sha3@npm:^0.8.0": + version: 0.8.0 + resolution: "js-sha3@npm:0.8.0" + checksum: 75df77c1fc266973f06cce8309ce010e9e9f07ec35ab12022ed29b7f0d9c8757f5a73e1b35aa24840dced0dea7059085aa143d817aea9e188e2a80d569d9adce + languageName: node + linkType: hard + +"js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 8a95213a5a77deb6cbe94d86340e8d9ace2b93bc367790b260101d2f36a2eaf4e4e22d9fa9cf459b38af3a32fb4190e638024cf82ec95ef708680e405ea7cc78 + languageName: node + linkType: hard + +"js-yaml@npm:3.x": + version: 3.14.1 + resolution: "js-yaml@npm:3.14.1" + dependencies: + argparse: ^1.0.7 + esprima: ^4.0.0 + bin: + js-yaml: bin/js-yaml.js + checksum: bef146085f472d44dee30ec34e5cf36bf89164f5d585435a3d3da89e52622dff0b188a580e4ad091c3341889e14cb88cac6e4deb16dc5b1e9623bb0601fc255c + languageName: node + linkType: hard + +"js-yaml@npm:^4.1.0": + version: 4.1.0 + resolution: "js-yaml@npm:4.1.0" + dependencies: + argparse: ^2.0.1 + bin: + js-yaml: bin/js-yaml.js + checksum: c7830dfd456c3ef2c6e355cc5a92e6700ceafa1d14bba54497b34a99f0376cecbb3e9ac14d3e5849b426d5a5140709a66237a8c991c675431271c4ce5504151a + languageName: node + linkType: hard + +"jsbn@npm:1.1.0": + version: 1.1.0 + resolution: "jsbn@npm:1.1.0" + checksum: 944f924f2bd67ad533b3850eee47603eed0f6ae425fd1ee8c760f477e8c34a05f144c1bd4f5a5dd1963141dc79a2c55f89ccc5ab77d039e7077f3ad196b64965 + languageName: node + linkType: hard + +"jsesc@npm:^2.5.1": + version: 2.5.2 + resolution: "jsesc@npm:2.5.2" + bin: + jsesc: bin/jsesc + checksum: 4dc190771129e12023f729ce20e1e0bfceac84d73a85bc3119f7f938843fe25a4aeccb54b6494dce26fcf263d815f5f31acdefac7cc9329efb8422a4f4d9fa9d + languageName: node + linkType: hard + +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 9026b03edc2847eefa2e37646c579300a1f3a4586cfb62bf857832b60c852042d0d6ae55d1afb8926163fa54c2b01d83ae24705f34990348bdac6273a29d4581 + languageName: node + linkType: hard + +"json-parse-even-better-errors@npm:^2.3.0": + version: 2.3.1 + resolution: "json-parse-even-better-errors@npm:2.3.1" + checksum: 798ed4cf3354a2d9ccd78e86d2169515a0097a5c133337807cdf7f1fc32e1391d207ccfc276518cc1d7d8d4db93288b8a50ba4293d212ad1336e52a8ec0a941f + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 7486074d3ba247769fda17d5181b345c9fb7d12e0da98b22d1d71a5db9698d8b4bd900a3ec1a4ffdd60846fc2556274a5c894d0c48795f14cb03aeae7b55260b + languageName: node + linkType: hard + +"json-schema-traverse@npm:^1.0.0": + version: 1.0.0 + resolution: "json-schema-traverse@npm:1.0.0" + checksum: 02f2f466cdb0362558b2f1fd5e15cce82ef55d60cd7f8fa828cf35ba74330f8d767fcae5c5c2adb7851fa811766c694b9405810879bc4e1ddd78a7c0e03658ad + languageName: node + linkType: hard + +"json-stable-stringify-without-jsonify@npm:^1.0.1": + version: 1.0.1 + resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" + checksum: cff44156ddce9c67c44386ad5cddf91925fe06b1d217f2da9c4910d01f358c6e3989c4d5a02683c7a5667f9727ff05831f7aa8ae66c8ff691c556f0884d49215 + languageName: node + linkType: hard + +"json-stable-stringify@npm:^1.0.2": + version: 1.1.1 + resolution: "json-stable-stringify@npm:1.1.1" + dependencies: + call-bind: ^1.0.5 + isarray: ^2.0.5 + jsonify: ^0.0.1 + object-keys: ^1.1.1 + checksum: e1ba06600fd278767eeff53f28e408e29c867e79abf564e7aadc3ce8f31f667258f8db278ef28831e45884dd687388fa1910f46e599fc19fb94c9afbbe3a4de8 + languageName: node + linkType: hard + +"json-stringify-safe@npm:^5.0.1": + version: 5.0.1 + resolution: "json-stringify-safe@npm:5.0.1" + checksum: 48ec0adad5280b8a96bb93f4563aa1667fd7a36334f79149abd42446d0989f2ddc58274b479f4819f1f00617957e6344c886c55d05a4e15ebb4ab931e4a6a8ee + languageName: node + linkType: hard + +"jsonfile@npm:^2.1.0": + version: 2.4.0 + resolution: "jsonfile@npm:2.4.0" + dependencies: + graceful-fs: ^4.1.6 + dependenciesMeta: + graceful-fs: + optional: true + checksum: f5064aabbc9e35530dc471d8b203ae1f40dbe949ddde4391c6f6a6d310619a15f0efdae5587df594d1d70c555193aaeee9d2ed4aec9ffd5767bd5e4e62d49c3d + languageName: node + linkType: hard + +"jsonfile@npm:^4.0.0": + version: 4.0.0 + resolution: "jsonfile@npm:4.0.0" + dependencies: + graceful-fs: ^4.1.6 + dependenciesMeta: + graceful-fs: + optional: true + checksum: 6447d6224f0d31623eef9b51185af03ac328a7553efcee30fa423d98a9e276ca08db87d71e17f2310b0263fd3ffa6c2a90a6308367f661dc21580f9469897c9e + languageName: node + linkType: hard + +"jsonfile@npm:^6.0.1": + version: 6.1.0 + resolution: "jsonfile@npm:6.1.0" + dependencies: + graceful-fs: ^4.1.6 + universalify: ^2.0.0 + dependenciesMeta: + graceful-fs: + optional: true + checksum: 7af3b8e1ac8fe7f1eccc6263c6ca14e1966fcbc74b618d3c78a0a2075579487547b94f72b7a1114e844a1e15bb00d440e5d1720bfc4612d790a6f285d5ea8354 + languageName: node + linkType: hard + +"jsonify@npm:^0.0.1": + version: 0.0.1 + resolution: "jsonify@npm:0.0.1" + checksum: 027287e1c0294fce15f18c0ff990cfc2318e7f01fb76515f784d5cd0784abfec6fc5c2355c3a2f2cb0ad7f4aa2f5b74ebbfe4e80476c35b2d13cabdb572e1134 + languageName: node + linkType: hard + +"jsonparse@npm:^1.2.0": + version: 1.3.1 + resolution: "jsonparse@npm:1.3.1" + checksum: 6514a7be4674ebf407afca0eda3ba284b69b07f9958a8d3113ef1005f7ec610860c312be067e450c569aab8b89635e332cee3696789c750692bb60daba627f4d + languageName: node + linkType: hard + +"jsonschema@npm:^1.2.4": + version: 1.4.1 + resolution: "jsonschema@npm:1.4.1" + checksum: 1ef02a6cd9bc32241ec86bbf1300bdbc3b5f2d8df6eb795517cf7d1cd9909e7beba1e54fdf73990fd66be98a182bda9add9607296b0cb00b1348212988e424b2 + languageName: node + linkType: hard + +"keccak@npm:^3.0.0, keccak@npm:^3.0.2": + version: 3.0.4 + resolution: "keccak@npm:3.0.4" + dependencies: + node-addon-api: ^2.0.0 + node-gyp: latest + node-gyp-build: ^4.2.0 + readable-stream: ^3.6.0 + checksum: 2bf27b97b2f24225b1b44027de62be547f5c7326d87d249605665abd0c8c599d774671c35504c62c9b922cae02758504c6f76a73a84234d23af8a2211afaaa11 + languageName: node + linkType: hard + +"keyv@npm:^4.5.3": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" + dependencies: + json-buffer: 3.0.1 + checksum: 74a24395b1c34bd44ad5cb2b49140d087553e170625240b86755a6604cd65aa16efdbdeae5cdb17ba1284a0fbb25ad06263755dbc71b8d8b06f74232ce3cdd72 + languageName: node + linkType: hard + +"kind-of@npm:^6.0.2, kind-of@npm:^6.0.3": + version: 6.0.3 + resolution: "kind-of@npm:6.0.3" + checksum: 3ab01e7b1d440b22fe4c31f23d8d38b4d9b91d9f291df683476576493d5dfd2e03848a8b05813dd0c3f0e835bc63f433007ddeceb71f05cb25c45ae1b19c6d3b + languageName: node + linkType: hard + +"klaw-sync@npm:^6.0.0": + version: 6.0.0 + resolution: "klaw-sync@npm:6.0.0" + dependencies: + graceful-fs: ^4.1.11 + checksum: 0da397f8961313c3ef8f79fb63af9002cde5a8fb2aeb1a37351feff0dd6006129c790400c3f5c3b4e757bedcabb13d21ec0a5eaef5a593d59515d4f2c291e475 + languageName: node + linkType: hard + +"klaw@npm:^1.0.0": + version: 1.3.1 + resolution: "klaw@npm:1.3.1" + dependencies: + graceful-fs: ^4.1.9 + dependenciesMeta: + graceful-fs: + optional: true + checksum: 8f69e4797c26e7c3f2426bfa85f38a3da3c2cb1b4c6bd850d2377aed440d41ce9d806f2885c2e2e224372c56af4b1d43b8a499adecf9a05e7373dc6b8b7c52e4 + languageName: node + linkType: hard + +"kuler@npm:^2.0.0": + version: 2.0.0 + resolution: "kuler@npm:2.0.0" + checksum: 9e10b5a1659f9ed8761d38df3c35effabffbd19fc6107324095238e4ef0ff044392cae9ac64a1c2dda26e532426485342226b93806bd97504b174b0dcf04ed81 + languageName: node + linkType: hard + +"level-supports@npm:^4.0.0": + version: 4.0.1 + resolution: "level-supports@npm:4.0.1" + checksum: d4552b42bb8cdeada07b0f6356c7a90fefe76279147331f291aceae26e3e56d5f927b09ce921647c0230bfe03ddfbdcef332be921e5c2194421ae2bfa3cf6368 + languageName: node + linkType: hard + +"level-transcoder@npm:^1.0.1": + version: 1.0.1 + resolution: "level-transcoder@npm:1.0.1" + dependencies: + buffer: ^6.0.3 + module-error: ^1.0.1 + checksum: 304f08d802faf3491a533b6d87ad8be3cabfd27f2713bbe9d4c633bf50fcb9460eab5a6776bf015e101ead7ba1c1853e05e7f341112f17a9d0cb37ee5a421a25 + languageName: node + linkType: hard + +"level@npm:^8.0.0": + version: 8.0.1 + resolution: "level@npm:8.0.1" + dependencies: + abstract-level: ^1.0.4 + browser-level: ^1.0.1 + classic-level: ^1.2.0 + checksum: c5641cbba666ef9eb0292aad01d86a4f1af18e637d1fc097c65bf0109ab8d7e6fba8c8faf6c74ae4e48edac4310f7dd87def26ffeebfe395c7afd9bd2461ab97 + languageName: node + linkType: hard + +"levn@npm:^0.4.1": + version: 0.4.1 + resolution: "levn@npm:0.4.1" + dependencies: + prelude-ls: ^1.2.1 + type-check: ~0.4.0 + checksum: 12c5021c859bd0f5248561bf139121f0358285ec545ebf48bb3d346820d5c61a4309535c7f387ed7d84361cf821e124ce346c6b7cef8ee09a67c1473b46d0fc4 + languageName: node + linkType: hard + +"levn@npm:~0.3.0": + version: 0.3.0 + resolution: "levn@npm:0.3.0" + dependencies: + prelude-ls: ~1.1.2 + type-check: ~0.3.2 + checksum: 0d084a524231a8246bb10fec48cdbb35282099f6954838604f3c7fc66f2e16fa66fd9cc2f3f20a541a113c4dafdf181e822c887c8a319c9195444e6c64ac395e + languageName: node + linkType: hard + +"lilconfig@npm:2.1.0": + version: 2.1.0 + resolution: "lilconfig@npm:2.1.0" + checksum: 8549bb352b8192375fed4a74694cd61ad293904eee33f9d4866c2192865c44c4eb35d10782966242634e0cbc1e91fe62b1247f148dc5514918e3a966da7ea117 + languageName: node + linkType: hard + +"lines-and-columns@npm:^1.1.6": + version: 1.2.4 + resolution: "lines-and-columns@npm:1.2.4" + checksum: 0c37f9f7fa212b38912b7145e1cd16a5f3cd34d782441c3e6ca653485d326f58b3caccda66efce1c5812bde4961bbde3374fae4b0d11bf1226152337f3894aa5 + languageName: node + linkType: hard + +"lint-staged@npm:^13.0.4": + version: 13.3.0 + resolution: "lint-staged@npm:13.3.0" + dependencies: + chalk: 5.3.0 + commander: 11.0.0 + debug: 4.3.4 + execa: 7.2.0 + lilconfig: 2.1.0 + listr2: 6.6.1 + micromatch: 4.0.5 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.3.1 + bin: + lint-staged: bin/lint-staged.js + checksum: f7c146cc2849c9ce4f1d2808d990fcbdef5e0bb79e6e79cc895f53c91f5ac4dcefdb8c3465156b38a015dcb051f2795c6bda4f20a1e2f2fa654c7ba521b2d2e0 + languageName: node + linkType: hard + +"listr2@npm:6.6.1": + version: 6.6.1 + resolution: "listr2@npm:6.6.1" + dependencies: + cli-truncate: ^3.1.0 + colorette: ^2.0.20 + eventemitter3: ^5.0.1 + log-update: ^5.0.1 + rfdc: ^1.3.0 + wrap-ansi: ^8.1.0 + peerDependencies: + enquirer: ">= 2.3.0 < 3" + peerDependenciesMeta: + enquirer: + optional: true + checksum: 99600e8a51f838f7208bce7e16d6b3d91d361f13881e6aa91d0b561a9a093ddcf63b7bc2a7b47aec7fdbff9d0e8c9f68cb66e6dfe2d857e5b1df8ab045c26ce8 + languageName: node + linkType: hard + +"locate-path@npm:^2.0.0": + version: 2.0.0 + resolution: "locate-path@npm:2.0.0" + dependencies: + p-locate: ^2.0.0 + path-exists: ^3.0.0 + checksum: 02d581edbbbb0fa292e28d96b7de36b5b62c2fa8b5a7e82638ebb33afa74284acf022d3b1e9ae10e3ffb7658fbc49163fcd5e76e7d1baaa7801c3e05a81da755 + languageName: node + linkType: hard + +"locate-path@npm:^5.0.0": + version: 5.0.0 + resolution: "locate-path@npm:5.0.0" + dependencies: + p-locate: ^4.1.0 + checksum: 83e51725e67517287d73e1ded92b28602e3ae5580b301fe54bfb76c0c723e3f285b19252e375712316774cf52006cb236aed5704692c32db0d5d089b69696e30 + languageName: node + linkType: hard + +"locate-path@npm:^6.0.0": + version: 6.0.0 + resolution: "locate-path@npm:6.0.0" + dependencies: + p-locate: ^5.0.0 + checksum: 72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a + languageName: node + linkType: hard + +"lodash.camelcase@npm:^4.3.0": + version: 4.3.0 + resolution: "lodash.camelcase@npm:4.3.0" + checksum: cb9227612f71b83e42de93eccf1232feeb25e705bdb19ba26c04f91e885bfd3dd5c517c4a97137658190581d3493ea3973072ca010aab7e301046d90740393d1 + languageName: node + linkType: hard + +"lodash.isfunction@npm:^3.0.9": + version: 3.0.9 + resolution: "lodash.isfunction@npm:3.0.9" + checksum: 99e54c34b1e8a9ba75c034deb39cedbd2aca7af685815e67a2a8ec4f73ec9748cda6ebee5a07d7de4b938e90d421fd280e9c385cc190f903ac217ac8aff30314 + languageName: node + linkType: hard + +"lodash.isplainobject@npm:^4.0.6": + version: 4.0.6 + resolution: "lodash.isplainobject@npm:4.0.6" + checksum: 29c6351f281e0d9a1d58f1a4c8f4400924b4c79f18dfc4613624d7d54784df07efaff97c1ff2659f3e085ecf4fff493300adc4837553104cef2634110b0d5337 + languageName: node + linkType: hard + +"lodash.kebabcase@npm:^4.1.1": + version: 4.1.1 + resolution: "lodash.kebabcase@npm:4.1.1" + checksum: 5a6c59161914e1bae23438a298c7433e83d935e0f59853fa862e691164696bc07f6dfa4c313d499fbf41ba8d53314e9850416502376705a357d24ee6ca33af78 + languageName: node + linkType: hard + +"lodash.map@npm:^4.5.1": + version: 4.6.0 + resolution: "lodash.map@npm:4.6.0" + checksum: 7369a41d7d24d15ce3bbd02a7faa3a90f6266c38184e64932571b9b21b758bd10c04ffd117d1859be1a44156f29b94df5045eff172bf8a97fddf68bf1002d12f + languageName: node + linkType: hard + +"lodash.merge@npm:^4.6.2": + version: 4.6.2 + resolution: "lodash.merge@npm:4.6.2" + checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005 + languageName: node + linkType: hard + +"lodash.mergewith@npm:^4.6.2": + version: 4.6.2 + resolution: "lodash.mergewith@npm:4.6.2" + checksum: a6db2a9339752411f21b956908c404ec1e088e783a65c8b29e30ae5b3b6384f82517662d6f425cc97c2070b546cc2c7daaa8d33f78db7b6e9be06cd834abdeb8 + languageName: node + linkType: hard + +"lodash.snakecase@npm:^4.1.1": + version: 4.1.1 + resolution: "lodash.snakecase@npm:4.1.1" + checksum: 1685ed3e83dda6eae5a4dcaee161a51cd210aabb3e1c09c57150e7dd8feda19e4ca0d27d0631eabe8d0f4eaa51e376da64e8c018ae5415417c5890d42feb72a8 + languageName: node + linkType: hard + +"lodash.startcase@npm:^4.4.0": + version: 4.4.0 + resolution: "lodash.startcase@npm:4.4.0" + checksum: c03a4a784aca653845fe09d0ef67c902b6e49288dc45f542a4ab345a9c406a6dc194c774423fa313ee7b06283950301c1221dd2a1d8ecb2dac8dfbb9ed5606b5 + languageName: node + linkType: hard + +"lodash.truncate@npm:^4.4.2": + version: 4.4.2 + resolution: "lodash.truncate@npm:4.4.2" + checksum: b463d8a382cfb5f0e71c504dcb6f807a7bd379ff1ea216669aa42c52fc28c54e404bfbd96791aa09e6df0de2c1d7b8f1b7f4b1a61f324d38fe98bc535aeee4f5 + languageName: node + linkType: hard + +"lodash.uniq@npm:^4.5.0": + version: 4.5.0 + resolution: "lodash.uniq@npm:4.5.0" + checksum: a4779b57a8d0f3c441af13d9afe7ecff22dd1b8ce1129849f71d9bbc8e8ee4e46dfb4b7c28f7ad3d67481edd6e51126e4e2a6ee276e25906d10f7140187c392d + languageName: node + linkType: hard + +"lodash.upperfirst@npm:^4.3.1": + version: 4.3.1 + resolution: "lodash.upperfirst@npm:4.3.1" + checksum: cadec6955900afe1928cc60cdc4923a79c2ef991e42665419cc81630ed9b4f952a1093b222e0141ab31cbc4dba549f97ec28ff67929d71e01861c97188a5fa83 + languageName: node + linkType: hard + +"lodash@npm:4.17.21, lodash@npm:^4.17.11, lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.21": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 + languageName: node + linkType: hard + +"log-symbols@npm:^4.1.0": + version: 4.1.0 + resolution: "log-symbols@npm:4.1.0" + dependencies: + chalk: ^4.1.0 + is-unicode-supported: ^0.1.0 + checksum: fce1497b3135a0198803f9f07464165e9eb83ed02ceb2273930a6f8a508951178d8cf4f0378e9d28300a2ed2bc49050995d2bd5f53ab716bb15ac84d58c6ef74 + languageName: node + linkType: hard + +"log-update@npm:^5.0.1": + version: 5.0.1 + resolution: "log-update@npm:5.0.1" + dependencies: + ansi-escapes: ^5.0.0 + cli-cursor: ^4.0.0 + slice-ansi: ^5.0.0 + strip-ansi: ^7.0.1 + wrap-ansi: ^8.0.1 + checksum: 2c6b47dcce6f9233df6d232a37d9834cb3657a0749ef6398f1706118de74c55f158587d4128c225297ea66803f35c5ac3db4f3f617046d817233c45eedc32ef1 + languageName: node + linkType: hard + +"logform@npm:^2.6.0, logform@npm:^2.6.1": + version: 2.6.1 + resolution: "logform@npm:2.6.1" + dependencies: + "@colors/colors": 1.6.0 + "@types/triple-beam": ^1.3.2 + fecha: ^4.2.0 + ms: ^2.1.1 + safe-stable-stringify: ^2.3.1 + triple-beam: ^1.3.0 + checksum: 0c6b95fa8350ccc33c7c33d77de2a9920205399706fc1b125151c857b61eb90873f4670d9e0e58e58c165b68a363206ae670d6da8b714527c838da3c84449605 + languageName: node + linkType: hard + +"longest@npm:^2.0.1": + version: 2.0.1 + resolution: "longest@npm:2.0.1" + checksum: 9587c153919a883ecbcc33e9439bc2592aa6fdbbd2d343f8ab17d8d3e0373c4e4350e3b428566fd689d704800a23f2b4d145cbdcca4ef3fd35742e5927f919a9 + languageName: node + linkType: hard + +"loupe@npm:^2.3.6": + version: 2.3.7 + resolution: "loupe@npm:2.3.7" + dependencies: + get-func-name: ^2.0.1 + checksum: 96c058ec7167598e238bb7fb9def2f9339215e97d6685d9c1e3e4bdb33d14600e11fe7a812cf0c003dfb73ca2df374f146280b2287cae9e8d989e9d7a69a203b + languageName: node + linkType: hard + +"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": + version: 10.4.3 + resolution: "lru-cache@npm:10.4.3" + checksum: 6476138d2125387a6d20f100608c2583d415a4f64a0fecf30c9e2dda976614f09cad4baa0842447bd37dd459a7bd27f57d9d8f8ce558805abd487c583f3d774a + languageName: node + linkType: hard + +"lru-cache@npm:^5.1.1": + version: 5.1.1 + resolution: "lru-cache@npm:5.1.1" + dependencies: + yallist: ^3.0.2 + checksum: c154ae1cbb0c2206d1501a0e94df349653c92c8cbb25236d7e85190bcaf4567a03ac6eb43166fabfa36fd35623694da7233e88d9601fbf411a9a481d85dbd2cb + languageName: node + linkType: hard + +"lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" + dependencies: + yallist: ^4.0.0 + checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 + languageName: node + linkType: hard + +"lru_map@npm:^0.3.3": + version: 0.3.3 + resolution: "lru_map@npm:0.3.3" + checksum: ca9dd43c65ed7a4f117c548028101c5b6855e10923ea9d1f635af53ad20c5868ff428c364d454a7b57fe391b89c704982275410c3c5099cca5aeee00d76e169a + languageName: node + linkType: hard + +"make-error@npm:^1.1.1": + version: 1.3.6 + resolution: "make-error@npm:1.3.6" + checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 + languageName: node + linkType: hard + +"make-fetch-happen@npm:^13.0.0": + version: 13.0.1 + resolution: "make-fetch-happen@npm:13.0.1" + dependencies: + "@npmcli/agent": ^2.0.0 + cacache: ^18.0.0 + http-cache-semantics: ^4.1.1 + is-lambda: ^1.0.1 + minipass: ^7.0.2 + minipass-fetch: ^3.0.0 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + negotiator: ^0.6.3 + proc-log: ^4.2.0 + promise-retry: ^2.0.1 + ssri: ^10.0.0 + checksum: 5c9fad695579b79488fa100da05777213dd9365222f85e4757630f8dd2a21a79ddd3206c78cfd6f9b37346819681782b67900ac847a57cf04190f52dda5343fd + languageName: node + linkType: hard + +"map-obj@npm:^1.0.0": + version: 1.0.1 + resolution: "map-obj@npm:1.0.1" + checksum: 9949e7baec2a336e63b8d4dc71018c117c3ce6e39d2451ccbfd3b8350c547c4f6af331a4cbe1c83193d7c6b786082b6256bde843db90cb7da2a21e8fcc28afed + languageName: node + linkType: hard + +"map-obj@npm:^4.0.0": + version: 4.3.0 + resolution: "map-obj@npm:4.3.0" + checksum: fbc554934d1a27a1910e842bc87b177b1a556609dd803747c85ece420692380827c6ae94a95cce4407c054fa0964be3bf8226f7f2cb2e9eeee432c7c1985684e + languageName: node + linkType: hard + +"markdown-table@npm:^1.1.3": + version: 1.1.3 + resolution: "markdown-table@npm:1.1.3" + checksum: 292e8c956ae833c2ccb0a55cd8d87980cd657ab11cd9ff63c3fcc4d3a518d3b3882ba07410b8f477ba9e30b3f70658677e4e8acf61816dd6cfdd1f6293130664 + languageName: node + linkType: hard + +"match-all@npm:^1.2.6": + version: 1.2.6 + resolution: "match-all@npm:1.2.6" + checksum: 3d4f16b8fd082f2fd10e362f4a8b71c62f8a767591b3db831ca2bdcf726337e9a64e4abc30e2ef053dc2bcfb875a9ed80bd78e006ad5ef11380a7158d0cb00e1 + languageName: node + linkType: hard + +"mcl-wasm@npm:^0.7.1": + version: 0.7.9 + resolution: "mcl-wasm@npm:0.7.9" + checksum: 6b6ed5084156b98b2db70b223e1ba2c01953970b48a2e0c4ea3eeb9296610e6b3bfb2a2cce9e92e2d7ad61778b5f5a630e705e663835e915ba188c174a0a37fa + languageName: node + linkType: hard + +"md5.js@npm:^1.3.4": + version: 1.3.5 + resolution: "md5.js@npm:1.3.5" + dependencies: + hash-base: ^3.0.0 + inherits: ^2.0.1 + safe-buffer: ^5.1.2 + checksum: 098494d885684bcc4f92294b18ba61b7bd353c23147fbc4688c75b45cb8590f5a95fd4584d742415dcc52487f7a1ef6ea611cfa1543b0dc4492fe026357f3f0c + languageName: node + linkType: hard + +"memory-level@npm:^1.0.0": + version: 1.0.0 + resolution: "memory-level@npm:1.0.0" + dependencies: + abstract-level: ^1.0.0 + functional-red-black-tree: ^1.0.1 + module-error: ^1.0.1 + checksum: 80b1b7aedaf936e754adbcd7b9303018c3684fb32f9992fd967c448f145d177f16c724fbba9ed3c3590a9475fd563151eae664d69b83d2ad48714852e9fc5c72 + languageName: node + linkType: hard + +"memory-pager@npm:^1.0.2": + version: 1.5.0 + resolution: "memory-pager@npm:1.5.0" + checksum: d1a2e684583ef55c61cd3a49101da645b11ad57014dfc565e0b43baa9004b743f7e4ab81493d8fff2ab24e9950987cc3209c94bcc4fc8d7e30a475489a1f15e9 + languageName: node + linkType: hard + +"memorystream@npm:^0.3.1": + version: 0.3.1 + resolution: "memorystream@npm:0.3.1" + checksum: f18b42440d24d09516d01466c06adf797df7873f0d40aa7db02e5fb9ed83074e5e65412d0720901d7069363465f82dc4f8bcb44f0cde271567a61426ce6ca2e9 + languageName: node + linkType: hard + +"meow@npm:^8.0.0, meow@npm:^8.1.2": + version: 8.1.2 + resolution: "meow@npm:8.1.2" + dependencies: + "@types/minimist": ^1.2.0 + camelcase-keys: ^6.2.2 + decamelize-keys: ^1.1.0 + hard-rejection: ^2.1.0 + minimist-options: 4.1.0 + normalize-package-data: ^3.0.0 + read-pkg-up: ^7.0.1 + redent: ^3.0.0 + trim-newlines: ^3.0.0 + type-fest: ^0.18.0 + yargs-parser: ^20.2.3 + checksum: bc23bf1b4423ef6a821dff9734406bce4b91ea257e7f10a8b7f896f45b59649f07adc0926e2917eacd8cf1df9e4cd89c77623cf63dfd0f8bf54de07a32ee5a85 + languageName: node + linkType: hard + +"merge-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-stream@npm:2.0.0" + checksum: 6fa4dcc8d86629705cea944a4b88ef4cb0e07656ebf223fa287443256414283dd25d91c1cd84c77987f2aec5927af1a9db6085757cb43d90eb170ebf4b47f4f4 + languageName: node + linkType: hard + +"merge2@npm:^1.2.3, merge2@npm:^1.3.0, merge2@npm:^1.4.1": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 + languageName: node + linkType: hard + +"merge@npm:^2.1.1": + version: 2.1.1 + resolution: "merge@npm:2.1.1" + checksum: 9c36b0e25aa53b3f7305d7cf0f330397f1142cf311802b681e5619f12e986a790019b8246c1c0df21701c8652449f9046b0129551030097ef563d1958c823249 + languageName: node + linkType: hard + +"micro-ftch@npm:^0.3.1": + version: 0.3.1 + resolution: "micro-ftch@npm:0.3.1" + checksum: 0e496547253a36e98a83fb00c628c53c3fb540fa5aaeaf718438873785afd193244988c09d219bb1802984ff227d04938d9571ef90fe82b48bd282262586aaff + languageName: node + linkType: hard + +"micromatch@npm:4.0.5": + version: 4.0.5 + resolution: "micromatch@npm:4.0.5" + dependencies: + braces: ^3.0.2 + picomatch: ^2.3.1 + checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc + languageName: node + linkType: hard + +"micromatch@npm:^4.0.2, micromatch@npm:^4.0.4": + version: 4.0.8 + resolution: "micromatch@npm:4.0.8" + dependencies: + braces: ^3.0.3 + picomatch: ^2.3.1 + checksum: 79920eb634e6f400b464a954fcfa589c4e7c7143209488e44baf627f9affc8b1e306f41f4f0deedde97e69cb725920879462d3e750ab3bd3c1aed675bb3a8966 + languageName: node + linkType: hard + +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f + languageName: node + linkType: hard + +"mime-types@npm:^2.1.12": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: 1.52.0 + checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836 + languageName: node + linkType: hard + +"mimic-fn@npm:^2.1.0": + version: 2.1.0 + resolution: "mimic-fn@npm:2.1.0" + checksum: d2421a3444848ce7f84bd49115ddacff29c15745db73f54041edc906c14b131a38d05298dae3081667627a59b2eb1ca4b436ff2e1b80f69679522410418b478a + languageName: node + linkType: hard + +"mimic-fn@npm:^4.0.0": + version: 4.0.0 + resolution: "mimic-fn@npm:4.0.0" + checksum: 995dcece15ee29aa16e188de6633d43a3db4611bcf93620e7e62109ec41c79c0f34277165b8ce5e361205049766e371851264c21ac64ca35499acb5421c2ba56 + languageName: node + linkType: hard + +"min-indent@npm:^1.0.0": + version: 1.0.1 + resolution: "min-indent@npm:1.0.1" + checksum: bfc6dd03c5eaf623a4963ebd94d087f6f4bbbfd8c41329a7f09706b0cb66969c4ddd336abeb587bc44bc6f08e13bf90f0b374f9d71f9f01e04adc2cd6f083ef1 + languageName: node + linkType: hard + +"minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": + version: 1.0.1 + resolution: "minimalistic-assert@npm:1.0.1" + checksum: cc7974a9268fbf130fb055aff76700d7e2d8be5f761fb5c60318d0ed010d839ab3661a533ad29a5d37653133385204c503bfac995aaa4236f4e847461ea32ba7 + languageName: node + linkType: hard + +"minimalistic-crypto-utils@npm:^1.0.1": + version: 1.0.1 + resolution: "minimalistic-crypto-utils@npm:1.0.1" + checksum: 6e8a0422b30039406efd4c440829ea8f988845db02a3299f372fceba56ffa94994a9c0f2fd70c17f9969eedfbd72f34b5070ead9656a34d3f71c0bd72583a0ed + languageName: node + linkType: hard + +"minimatch@npm:2 || 3, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: ^1.1.7 + checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a + languageName: node + linkType: hard + +"minimatch@npm:9.0.3": + version: 9.0.3 + resolution: "minimatch@npm:9.0.3" + dependencies: + brace-expansion: ^2.0.1 + checksum: 253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5 + languageName: node + linkType: hard + +"minimatch@npm:^5.0.1, minimatch@npm:^5.1.6": + version: 5.1.6 + resolution: "minimatch@npm:5.1.6" + dependencies: + brace-expansion: ^2.0.1 + checksum: 7564208ef81d7065a370f788d337cd80a689e981042cb9a1d0e6580b6c6a8c9279eba80010516e258835a988363f99f54a6f711a315089b8b42694f5da9d0d77 + languageName: node + linkType: hard + +"minimatch@npm:^9.0.4": + version: 9.0.5 + resolution: "minimatch@npm:9.0.5" + dependencies: + brace-expansion: ^2.0.1 + checksum: 2c035575eda1e50623c731ec6c14f65a85296268f749b9337005210bb2b34e2705f8ef1a358b188f69892286ab99dc42c8fb98a57bde55c8d81b3023c19cea28 + languageName: node + linkType: hard + +"minimist-options@npm:4.1.0": + version: 4.1.0 + resolution: "minimist-options@npm:4.1.0" + dependencies: + arrify: ^1.0.1 + is-plain-obj: ^1.1.0 + kind-of: ^6.0.3 + checksum: 8c040b3068811e79de1140ca2b708d3e203c8003eb9a414c1ab3cd467fc5f17c9ca02a5aef23bedc51a7f8bfbe77f87e9a7e31ec81fba304cda675b019496f4e + languageName: node + linkType: hard + +"minimist@npm:1.2.7": + version: 1.2.7 + resolution: "minimist@npm:1.2.7" + checksum: 7346574a1038ca23c32e02252f603801f09384dd1d78b69a943a4e8c2c28730b80e96193882d3d3b22a063445f460e48316b29b8a25addca2d7e5e8f75478bec + languageName: node + linkType: hard + +"minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0 + languageName: node + linkType: hard + +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" + dependencies: + minipass: ^7.0.3 + checksum: b251bceea62090f67a6cced7a446a36f4cd61ee2d5cea9aee7fff79ba8030e416327a1c5aa2908dc22629d06214b46d88fdab8c51ac76bacbf5703851b5ad342 + languageName: node + linkType: hard + +"minipass-fetch@npm:^3.0.0": + version: 3.0.5 + resolution: "minipass-fetch@npm:3.0.5" + dependencies: + encoding: ^0.1.13 + minipass: ^7.0.3 + minipass-sized: ^1.0.3 + minizlib: ^2.1.2 + dependenciesMeta: + encoding: + optional: true + checksum: 8047d273236157aab27ab7cd8eab7ea79e6ecd63e8f80c3366ec076cb9a0fed550a6935bab51764369027c414647fd8256c2a20c5445fb250c483de43350de83 + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" + dependencies: + minipass: ^3.0.0 + checksum: 56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: ^3.0.0 + checksum: b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b + languageName: node + linkType: hard + +"minipass-sized@npm:^1.0.3": + version: 1.0.3 + resolution: "minipass-sized@npm:1.0.3" + dependencies: + minipass: ^3.0.0 + checksum: 79076749fcacf21b5d16dd596d32c3b6bf4d6e62abb43868fac21674078505c8b15eaca4e47ed844985a4514854f917d78f588fcd029693709417d8f98b2bd60 + languageName: node + linkType: hard + +"minipass@npm:^3.0.0": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: ^4.0.0 + checksum: a30d083c8054cee83cdcdc97f97e4641a3f58ae743970457b1489ce38ee1167b3aaf7d815cd39ec7a99b9c40397fd4f686e83750e73e652b21cb516f6d845e48 + languageName: node + linkType: hard + +"minipass@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass@npm:5.0.0" + checksum: 425dab288738853fded43da3314a0b5c035844d6f3097a8e3b5b29b328da8f3c1af6fc70618b32c29ff906284cf6406b6841376f21caaadd0793c1d5a6a620ea + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.1.2": + version: 7.1.2 + resolution: "minipass@npm:7.1.2" + checksum: 2bfd325b95c555f2b4d2814d49325691c7bee937d753814861b0b49d5edcda55cbbf22b6b6a60bb91eddac8668771f03c5ff647dcd9d0f798e9548b9cdc46ee3 + languageName: node + linkType: hard + +"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": + version: 2.1.2 + resolution: "minizlib@npm:2.1.2" + dependencies: + minipass: ^3.0.0 + yallist: ^4.0.0 + checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3 + languageName: node + linkType: hard + +"mkdirp@npm:0.5.x, mkdirp@npm:^0.5.1": + version: 0.5.6 + resolution: "mkdirp@npm:0.5.6" + dependencies: + minimist: ^1.2.6 + bin: + mkdirp: bin/cmd.js + checksum: 0c91b721bb12c3f9af4b77ebf73604baf350e64d80df91754dc509491ae93bf238581e59c7188360cec7cb62fc4100959245a42cfe01834efedc5e9d068376c2 + languageName: node + linkType: hard + +"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": + version: 1.0.4 + resolution: "mkdirp@npm:1.0.4" + bin: + mkdirp: bin/cmd.js + checksum: a96865108c6c3b1b8e1d5e9f11843de1e077e57737602de1b82030815f311be11f96f09cce59bd5b903d0b29834733e5313f9301e3ed6d6f6fba2eae0df4298f + languageName: node + linkType: hard + +"mnemonist@npm:^0.38.0": + version: 0.38.5 + resolution: "mnemonist@npm:0.38.5" + dependencies: + obliterator: ^2.0.0 + checksum: 66080afc1616866beb164e230c432964d6eed467cf37ad00e9c10161b8267928124ca8f1d0ecfea86c85568acfa62d54faaf646a86968d1135189a0fdfdd6b78 + languageName: node + linkType: hard + +"mocha@npm:^10.0.0, mocha@npm:^10.1.0, mocha@npm:^10.2.0": + version: 10.7.3 + resolution: "mocha@npm:10.7.3" + dependencies: + ansi-colors: ^4.1.3 + browser-stdout: ^1.3.1 + chokidar: ^3.5.3 + debug: ^4.3.5 + diff: ^5.2.0 + escape-string-regexp: ^4.0.0 + find-up: ^5.0.0 + glob: ^8.1.0 + he: ^1.2.0 + js-yaml: ^4.1.0 + log-symbols: ^4.1.0 + minimatch: ^5.1.6 + ms: ^2.1.3 + serialize-javascript: ^6.0.2 + strip-json-comments: ^3.1.1 + supports-color: ^8.1.1 + workerpool: ^6.5.1 + yargs: ^16.2.0 + yargs-parser: ^20.2.9 + yargs-unparser: ^2.0.0 + bin: + _mocha: bin/_mocha + mocha: bin/mocha.js + checksum: 956376dd8c7cd3e4f496ab1b06b7c89673ade2fb7f78704d8fce32b491f6940550eb1e784b7eef617e37fa29257a728df8b5b2b5e34ed7e83a692652290fab3c + languageName: node + linkType: hard + +"module-error@npm:^1.0.1, module-error@npm:^1.0.2": + version: 1.0.2 + resolution: "module-error@npm:1.0.2" + checksum: 5d653e35bd55b3e95f8aee2cdac108082ea892e71b8f651be92cde43e4ee86abee4fa8bd7fc3fe5e68b63926d42f63c54cd17b87a560c31f18739295575a3962 + languageName: node + linkType: hard + +"mongodb-connection-string-url@npm:^3.0.0": + version: 3.0.1 + resolution: "mongodb-connection-string-url@npm:3.0.1" + dependencies: + "@types/whatwg-url": ^11.0.2 + whatwg-url: ^13.0.0 + checksum: b0a3b9e619c53ce8c10452c6475dc1eeba4761ae1b293b1b37014acf609f44ab7057f084de8fceead9934dba2aad0a59315eab9371c1287dbaaf5aae48c6d371 + languageName: node + linkType: hard + +"mongodb@npm:6.5.0": + version: 6.5.0 + resolution: "mongodb@npm:6.5.0" + dependencies: + "@mongodb-js/saslprep": ^1.1.5 + bson: ^6.4.0 + mongodb-connection-string-url: ^3.0.0 + peerDependencies: + "@aws-sdk/credential-providers": ^3.188.0 + "@mongodb-js/zstd": ^1.1.0 + gcp-metadata: ^5.2.0 + kerberos: ^2.0.1 + mongodb-client-encryption: ">=6.0.0 <7" + snappy: ^7.2.2 + socks: ^2.7.1 + peerDependenciesMeta: + "@aws-sdk/credential-providers": + optional: true + "@mongodb-js/zstd": + optional: true + gcp-metadata: + optional: true + kerberos: + optional: true + mongodb-client-encryption: + optional: true + snappy: + optional: true + socks: + optional: true + checksum: 5774dfdd02d8d8e6bb70bf870f19bfad332da612fa6685d182b2e09da4f1306995ddf54f13ae0f6c3936e74444741689c04e7c009e7a847473f08f522ad16542 + languageName: node + linkType: hard + +"ms@npm:2.1.2": + version: 2.1.2 + resolution: "ms@npm:2.1.2" + checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f + languageName: node + linkType: hard + +"ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d + languageName: node + linkType: hard + +"murmur-128@npm:^0.2.1": + version: 0.2.1 + resolution: "murmur-128@npm:0.2.1" + dependencies: + encode-utf8: ^1.0.2 + fmix: ^0.1.0 + imul: ^1.0.0 + checksum: 94ff8b39bf1a1a7bde83b6d13f656bbe591e0a5b5ffe4384c39470120ab70e9eadf0af38557742a30d24421ddc63aea6bba1028a1d6b66553038ee86a660dd92 + languageName: node + linkType: hard + +"mute-stream@npm:0.0.8": + version: 0.0.8 + resolution: "mute-stream@npm:0.0.8" + checksum: ff48d251fc3f827e5b1206cda0ffdaec885e56057ee86a3155e1951bc940fd5f33531774b1cc8414d7668c10a8907f863f6561875ee6e8768931a62121a531a1 + languageName: node + linkType: hard + +"napi-macros@npm:^2.2.2": + version: 2.2.2 + resolution: "napi-macros@npm:2.2.2" + checksum: c6f9bd71cdbbc37ddc3535aa5be481238641d89585b8a3f4d301cb89abf459e2d294810432bb7d12056d1f9350b1a0899a5afcf460237a3da6c398cf0fec7629 + languageName: node + linkType: hard + +"natural-compare-lite@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare-lite@npm:1.4.0" + checksum: 5222ac3986a2b78dd6069ac62cbb52a7bf8ffc90d972ab76dfe7b01892485d229530ed20d0c62e79a6b363a663b273db3bde195a1358ce9e5f779d4453887225 + languageName: node + linkType: hard + +"natural-compare@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare@npm:1.4.0" + checksum: 23ad088b08f898fc9b53011d7bb78ec48e79de7627e01ab5518e806033861bef68d5b0cd0e2205c2f36690ac9571ff6bcb05eb777ced2eeda8d4ac5b44592c3d + languageName: node + linkType: hard + +"negotiator@npm:^0.6.3": + version: 0.6.3 + resolution: "negotiator@npm:0.6.3" + checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 + languageName: node + linkType: hard + +"neo-async@npm:^2.6.2": + version: 2.6.2 + resolution: "neo-async@npm:2.6.2" + checksum: deac9f8d00eda7b2e5cd1b2549e26e10a0faa70adaa6fdadca701cc55f49ee9018e427f424bac0c790b7c7e2d3068db97f3093f1093975f2acb8f8818b936ed9 + languageName: node + linkType: hard + +"node-addon-api@npm:^2.0.0": + version: 2.0.2 + resolution: "node-addon-api@npm:2.0.2" + dependencies: + node-gyp: latest + checksum: 31fb22d674648204f8dd94167eb5aac896c841b84a9210d614bf5d97c74ef059cc6326389cf0c54d2086e35312938401d4cc82e5fcd679202503eb8ac84814f8 + languageName: node + linkType: hard + +"node-emoji@npm:^1.10.0": + version: 1.11.0 + resolution: "node-emoji@npm:1.11.0" + dependencies: + lodash: ^4.17.21 + checksum: e8c856c04a1645062112a72e59a98b203505ed5111ff84a3a5f40611afa229b578c7d50f1e6a7f17aa62baeea4a640d2e2f61f63afc05423aa267af10977fb2b + languageName: node + linkType: hard + +"node-fetch@npm:^2.7.0": + version: 2.7.0 + resolution: "node-fetch@npm:2.7.0" + dependencies: + whatwg-url: ^5.0.0 + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + checksum: d76d2f5edb451a3f05b15115ec89fc6be39de37c6089f1b6368df03b91e1633fd379a7e01b7ab05089a25034b2023d959b47e59759cb38d88341b2459e89d6e5 + languageName: node + linkType: hard + +"node-gyp-build@npm:^4.2.0, node-gyp-build@npm:^4.3.0": + version: 4.8.2 + resolution: "node-gyp-build@npm:4.8.2" + bin: + node-gyp-build: bin.js + node-gyp-build-optional: optional.js + node-gyp-build-test: build-test.js + checksum: 1a57bba8c4c193f808bd8ad1484d4ebdd8106dd9f04a3e82554dc716e3a2d87d7e369e9503c145e0e6a7e2c663fec0d8aaf52bd8156342ec7fc388195f37824e + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 10.2.0 + resolution: "node-gyp@npm:10.2.0" + dependencies: + env-paths: ^2.2.0 + exponential-backoff: ^3.1.1 + glob: ^10.3.10 + graceful-fs: ^4.2.6 + make-fetch-happen: ^13.0.0 + nopt: ^7.0.0 + proc-log: ^4.1.0 + semver: ^7.3.5 + tar: ^6.2.1 + which: ^4.0.0 + bin: + node-gyp: bin/node-gyp.js + checksum: 0233759d8c19765f7fdc259a35eb046ad86c3d09e22f7384613ae2b89647dd27fcf833fdf5293d9335041e91f9b1c539494225959cdb312a5c8080b7534b926f + languageName: node + linkType: hard + +"nodemon@npm:^3.0.1": + version: 3.1.4 + resolution: "nodemon@npm:3.1.4" + dependencies: + chokidar: ^3.5.2 + debug: ^4 + ignore-by-default: ^1.0.1 + minimatch: ^3.1.2 + pstree.remy: ^1.1.8 + semver: ^7.5.3 + simple-update-notifier: ^2.0.0 + supports-color: ^5.5.0 + touch: ^3.1.0 + undefsafe: ^2.0.5 + bin: + nodemon: bin/nodemon.js + checksum: 3f003fc2c7bdaba559108320f188b7cb063220455e5da218ff3bf4f7468ad7059852da6e35a52b8c690cc27f6e36a433a9ad1f1bdb8096ec1ee3d930629cbeca + languageName: node + linkType: hard + +"nofilter@npm:^3.1.0": + version: 3.1.0 + resolution: "nofilter@npm:3.1.0" + checksum: 58aa85a5b4b35cbb6e42de8a8591c5e338061edc9f3e7286f2c335e9e9b9b8fa7c335ae45daa8a1f3433164dc0b9a3d187fa96f9516e04a17a1f9ce722becc4f + languageName: node + linkType: hard + +"nopt@npm:3.x": + version: 3.0.6 + resolution: "nopt@npm:3.0.6" + dependencies: + abbrev: 1 + bin: + nopt: ./bin/nopt.js + checksum: 7f8579029a0d7cb3341c6b1610b31e363f708b7aaaaf3580e3ec5ae8528d1f3a79d350d8bfa331776e6c6703a5a148b72edd9b9b4c1dd55874d8e70e963d1e20 + languageName: node + linkType: hard + +"nopt@npm:^7.0.0": + version: 7.2.1 + resolution: "nopt@npm:7.2.1" + dependencies: + abbrev: ^2.0.0 + bin: + nopt: bin/nopt.js + checksum: 6fa729cc77ce4162cfad8abbc9ba31d4a0ff6850c3af61d59b505653bef4781ec059f8890ecfe93ee8aa0c511093369cca88bfc998101616a2904e715bbbb7c9 + languageName: node + linkType: hard + +"normalize-package-data@npm:^2.5.0": + version: 2.5.0 + resolution: "normalize-package-data@npm:2.5.0" + dependencies: + hosted-git-info: ^2.1.4 + resolve: ^1.10.0 + semver: 2 || 3 || 4 || 5 + validate-npm-package-license: ^3.0.1 + checksum: 7999112efc35a6259bc22db460540cae06564aa65d0271e3bdfa86876d08b0e578b7b5b0028ee61b23f1cae9fc0e7847e4edc0948d3068a39a2a82853efc8499 + languageName: node + linkType: hard + +"normalize-package-data@npm:^3.0.0": + version: 3.0.3 + resolution: "normalize-package-data@npm:3.0.3" + dependencies: + hosted-git-info: ^4.0.1 + is-core-module: ^2.5.0 + semver: ^7.3.4 + validate-npm-package-license: ^3.0.1 + checksum: bbcee00339e7c26fdbc760f9b66d429258e2ceca41a5df41f5df06cc7652de8d82e8679ff188ca095cad8eff2b6118d7d866af2b68400f74602fbcbce39c160a + languageName: node + linkType: hard + +"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 + languageName: node + linkType: hard + +"npm-run-path@npm:^4.0.1": + version: 4.0.1 + resolution: "npm-run-path@npm:4.0.1" + dependencies: + path-key: ^3.0.0 + checksum: 5374c0cea4b0bbfdfae62da7bbdf1e1558d338335f4cacf2515c282ff358ff27b2ecb91ffa5330a8b14390ac66a1e146e10700440c1ab868208430f56b5f4d23 + languageName: node + linkType: hard + +"npm-run-path@npm:^5.1.0": + version: 5.3.0 + resolution: "npm-run-path@npm:5.3.0" + dependencies: + path-key: ^4.0.0 + checksum: ae8e7a89da9594fb9c308f6555c73f618152340dcaae423e5fb3620026fefbec463618a8b761920382d666fa7a2d8d240b6fe320e8a6cdd54dc3687e2b659d25 + languageName: node + linkType: hard + +"number-to-bn@npm:1.7.0": + version: 1.7.0 + resolution: "number-to-bn@npm:1.7.0" + dependencies: + bn.js: 4.11.6 + strip-hex-prefix: 1.0.0 + checksum: 5b8c9dbe7b49dc7a069e5f0ba4e197257c89db11463478cb002fee7a34dc8868636952bd9f6310e5fdf22b266e0e6dffb5f9537c741734718107e90ae59b3de4 + languageName: node + linkType: hard + +"object-assign@npm:^4.1.0": + version: 4.1.1 + resolution: "object-assign@npm:4.1.1" + checksum: fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f + languageName: node + linkType: hard + +"object-inspect@npm:^1.13.1": + version: 1.13.2 + resolution: "object-inspect@npm:1.13.2" + checksum: 9f850b3c045db60e0e97746e809ee4090d6ce62195af17dd1e9438ac761394a7d8ec4f7906559aea5424eaf61e35d3e53feded2ccd5f62fcc7d9670d3c8eb353 + languageName: node + linkType: hard + +"object-keys@npm:^1.1.1": + version: 1.1.1 + resolution: "object-keys@npm:1.1.1" + checksum: b363c5e7644b1e1b04aa507e88dcb8e3a2f52b6ffd0ea801e4c7a62d5aa559affe21c55a07fd4b1fd55fc03a33c610d73426664b20032405d7b92a1414c34d6a + languageName: node + linkType: hard + +"obliterator@npm:^2.0.0": + version: 2.0.4 + resolution: "obliterator@npm:2.0.4" + checksum: f28ad35b6d812089315f375dc3e6e5f9bebf958ebe4b10ccd471c7115cbcf595e74bdac4783ae758e5b1f47e3096427fdb37cfa7bed566b132df92ff317b9a7c + languageName: node + linkType: hard + +"once@npm:1.x, once@npm:^1.3.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: 1 + checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 + languageName: node + linkType: hard + +"one-time@npm:^1.0.0": + version: 1.0.0 + resolution: "one-time@npm:1.0.0" + dependencies: + fn.name: 1.x.x + checksum: fd008d7e992bdec1c67f53a2f9b46381ee12a9b8c309f88b21f0223546003fb47e8ad7c1fd5843751920a8d276c63bd4b45670ef80c61fb3e07dbccc962b5c7d + languageName: node + linkType: hard + +"onetime@npm:^5.1.0, onetime@npm:^5.1.2": + version: 5.1.2 + resolution: "onetime@npm:5.1.2" + dependencies: + mimic-fn: ^2.1.0 + checksum: 2478859ef817fc5d4e9c2f9e5728512ddd1dbc9fb7829ad263765bb6d3b91ce699d6e2332eef6b7dff183c2f490bd3349f1666427eaba4469fba0ac38dfd0d34 + languageName: node + linkType: hard + +"onetime@npm:^6.0.0": + version: 6.0.0 + resolution: "onetime@npm:6.0.0" + dependencies: + mimic-fn: ^4.0.0 + checksum: 0846ce78e440841335d4e9182ef69d5762e9f38aa7499b19f42ea1c4cd40f0b4446094c455c713f9adac3f4ae86f613bb5e30c99e52652764d06a89f709b3788 + languageName: node + linkType: hard + +"open@npm:^7.4.2": + version: 7.4.2 + resolution: "open@npm:7.4.2" + dependencies: + is-docker: ^2.0.0 + is-wsl: ^2.1.1 + checksum: 3333900ec0e420d64c23b831bc3467e57031461d843c801f569b2204a1acc3cd7b3ec3c7897afc9dde86491dfa289708eb92bba164093d8bd88fb2c231843c91 + languageName: node + linkType: hard + +"openzeppelin-solidity@npm:^4.8.1": + version: 4.8.1 + resolution: "openzeppelin-solidity@npm:4.8.1" + bin: + openzeppelin-contracts-migrate-imports: scripts/migrate-imports.js + checksum: 4337c0669a26f2768231a1e287cc2291d803caa90d36ddb6a3636995235406ef9520a51a0890cabc3907687b58db1293fc44e9069462cf3a9a8ec3b4c1ff4366 + languageName: node + linkType: hard + +"optionator@npm:^0.8.1": + version: 0.8.3 + resolution: "optionator@npm:0.8.3" + 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 + checksum: b8695ddf3d593203e25ab0900e265d860038486c943ff8b774f596a310f8ceebdb30c6832407a8198ba3ec9debe1abe1f51d4aad94843612db3b76d690c61d34 + languageName: node + linkType: hard + +"optionator@npm:^0.9.3": + version: 0.9.4 + resolution: "optionator@npm:0.9.4" + dependencies: + deep-is: ^0.1.3 + fast-levenshtein: ^2.0.6 + levn: ^0.4.1 + prelude-ls: ^1.2.1 + type-check: ^0.4.0 + word-wrap: ^1.2.5 + checksum: ecbd010e3dc73e05d239976422d9ef54a82a13f37c11ca5911dff41c98a6c7f0f163b27f922c37e7f8340af9d36febd3b6e9cef508f3339d4c393d7276d716bb + languageName: node + linkType: hard + +"ora@npm:^5.4.1": + version: 5.4.1 + resolution: "ora@npm:5.4.1" + dependencies: + bl: ^4.1.0 + chalk: ^4.1.0 + cli-cursor: ^3.1.0 + cli-spinners: ^2.5.0 + is-interactive: ^1.0.0 + is-unicode-supported: ^0.1.0 + log-symbols: ^4.1.0 + strip-ansi: ^6.0.0 + wcwidth: ^1.0.1 + checksum: 28d476ee6c1049d68368c0dc922e7225e3b5600c3ede88fade8052837f9ed342625fdaa84a6209302587c8ddd9b664f71f0759833cbdb3a4cf81344057e63c63 + languageName: node + linkType: hard + +"ordinal@npm:^1.0.3": + version: 1.0.3 + resolution: "ordinal@npm:1.0.3" + checksum: 6761c5b7606b6c4b0c22b4097dab4fe7ffcddacc49238eedf9c0ced877f5d4e4ad3f4fd43fefa1cc3f167cc54c7149267441b2ae85b81ccf13f45cf4b7947164 + languageName: node + linkType: hard + +"os-tmpdir@npm:~1.0.2": + version: 1.0.2 + resolution: "os-tmpdir@npm:1.0.2" + checksum: 5666560f7b9f10182548bf7013883265be33620b1c1b4a4d405c25be2636f970c5488ff3e6c48de75b55d02bde037249fe5dbfbb4c0fb7714953d56aed062e6d + languageName: node + linkType: hard + +"p-limit@npm:^1.1.0": + version: 1.3.0 + resolution: "p-limit@npm:1.3.0" + dependencies: + p-try: ^1.0.0 + checksum: 281c1c0b8c82e1ac9f81acd72a2e35d402bf572e09721ce5520164e9de07d8274451378a3470707179ad13240535558f4b277f02405ad752e08c7d5b0d54fbfd + languageName: node + linkType: hard + +"p-limit@npm:^2.2.0": + version: 2.3.0 + resolution: "p-limit@npm:2.3.0" + dependencies: + p-try: ^2.0.0 + checksum: 84ff17f1a38126c3314e91ecfe56aecbf36430940e2873dadaa773ffe072dc23b7af8e46d4b6485d302a11673fe94c6b67ca2cfbb60c989848b02100d0594ac1 + languageName: node + linkType: hard + +"p-limit@npm:^3.0.2": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" + dependencies: + yocto-queue: ^0.1.0 + checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 + languageName: node + linkType: hard + +"p-locate@npm:^2.0.0": + version: 2.0.0 + resolution: "p-locate@npm:2.0.0" + dependencies: + p-limit: ^1.1.0 + checksum: e2dceb9b49b96d5513d90f715780f6f4972f46987dc32a0e18bc6c3fc74a1a5d73ec5f81b1398af5e58b99ea1ad03fd41e9181c01fa81b4af2833958696e3081 + languageName: node + linkType: hard + +"p-locate@npm:^4.1.0": + version: 4.1.0 + resolution: "p-locate@npm:4.1.0" + dependencies: + p-limit: ^2.2.0 + checksum: 513bd14a455f5da4ebfcb819ef706c54adb09097703de6aeaa5d26fe5ea16df92b48d1ac45e01e3944ce1e6aa2a66f7f8894742b8c9d6e276e16cd2049a2b870 + languageName: node + linkType: hard + +"p-locate@npm:^5.0.0": + version: 5.0.0 + resolution: "p-locate@npm:5.0.0" + dependencies: + p-limit: ^3.0.2 + checksum: 1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3 + languageName: node + linkType: hard + +"p-map@npm:^4.0.0": + version: 4.0.0 + resolution: "p-map@npm:4.0.0" + dependencies: + aggregate-error: ^3.0.0 + checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c + languageName: node + linkType: hard + +"p-try@npm:^1.0.0": + version: 1.0.0 + resolution: "p-try@npm:1.0.0" + checksum: 3b5303f77eb7722144154288bfd96f799f8ff3e2b2b39330efe38db5dd359e4fb27012464cd85cb0a76e9b7edd1b443568cb3192c22e7cffc34989df0bafd605 + languageName: node + linkType: hard + +"p-try@npm:^2.0.0": + version: 2.2.0 + resolution: "p-try@npm:2.2.0" + checksum: f8a8e9a7693659383f06aec604ad5ead237c7a261c18048a6e1b5b85a5f8a067e469aa24f5bc009b991ea3b058a87f5065ef4176793a200d4917349881216cae + languageName: node + linkType: hard + +"package-json-from-dist@npm:^1.0.0": + version: 1.0.0 + resolution: "package-json-from-dist@npm:1.0.0" + checksum: ac706ec856a5a03f5261e4e48fa974f24feb044d51f84f8332e2af0af04fbdbdd5bbbfb9cbbe354190409bc8307c83a9e38c6672c3c8855f709afb0006a009ea + languageName: node + linkType: hard + +"parent-module@npm:^1.0.0": + version: 1.0.1 + resolution: "parent-module@npm:1.0.1" + dependencies: + callsites: ^3.0.0 + checksum: 6ba8b255145cae9470cf5551eb74be2d22281587af787a2626683a6c20fbb464978784661478dd2a3f1dad74d1e802d403e1b03c1a31fab310259eec8ac560ff + languageName: node + linkType: hard + +"parse-cache-control@npm:^1.0.1": + version: 1.0.1 + resolution: "parse-cache-control@npm:1.0.1" + checksum: 5a70868792124eb07c2dd07a78fcb824102e972e908254e9e59ce59a4796c51705ff28196d2b20d3b7353d14e9f98e65ed0e4eda9be072cc99b5297dc0466fee + languageName: node + linkType: hard + +"parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": + version: 5.2.0 + resolution: "parse-json@npm:5.2.0" + dependencies: + "@babel/code-frame": ^7.0.0 + error-ex: ^1.3.1 + json-parse-even-better-errors: ^2.3.0 + lines-and-columns: ^1.1.6 + checksum: 62085b17d64da57f40f6afc2ac1f4d95def18c4323577e1eced571db75d9ab59b297d1d10582920f84b15985cbfc6b6d450ccbf317644cfa176f3ed982ad87e2 + languageName: node + linkType: hard + +"parse-passwd@npm:^1.0.0": + version: 1.0.0 + resolution: "parse-passwd@npm:1.0.0" + checksum: 4e55e0231d58f828a41d0f1da2bf2ff7bcef8f4cb6146e69d16ce499190de58b06199e6bd9b17fbf0d4d8aef9052099cdf8c4f13a6294b1a522e8e958073066e + languageName: node + linkType: hard + +"patch-package@npm:8.0.0": + version: 8.0.0 + resolution: "patch-package@npm:8.0.0" + dependencies: + "@yarnpkg/lockfile": ^1.1.0 + chalk: ^4.1.2 + ci-info: ^3.7.0 + cross-spawn: ^7.0.3 + find-yarn-workspace-root: ^2.0.0 + fs-extra: ^9.0.0 + json-stable-stringify: ^1.0.2 + klaw-sync: ^6.0.0 + minimist: ^1.2.6 + open: ^7.4.2 + rimraf: ^2.6.3 + semver: ^7.5.3 + slash: ^2.0.0 + tmp: ^0.0.33 + yaml: ^2.2.2 + bin: + patch-package: index.js + checksum: d23cddc4d1622e2d8c7ca31b145c6eddb24bd271f69905e766de5e1f199f0b9a5479a6a6939ea857288399d4ed249285639d539a2c00fbddb7daa39934b007a2 + languageName: node + linkType: hard + +"path-exists@npm:^3.0.0": + version: 3.0.0 + resolution: "path-exists@npm:3.0.0" + checksum: 96e92643aa34b4b28d0de1cd2eba52a1c5313a90c6542d03f62750d82480e20bfa62bc865d5cfc6165f5fcd5aeb0851043c40a39be5989646f223300021bae0a + languageName: node + linkType: hard + +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 + languageName: node + linkType: hard + +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 + languageName: node + linkType: hard + +"path-key@npm:^3.0.0, path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 + languageName: node + linkType: hard + +"path-key@npm:^4.0.0": + version: 4.0.0 + resolution: "path-key@npm:4.0.0" + checksum: 8e6c314ae6d16b83e93032c61020129f6f4484590a777eed709c4a01b50e498822b00f76ceaf94bc64dbd90b327df56ceadce27da3d83393790f1219e07721d7 + languageName: node + linkType: hard + +"path-parse@npm:^1.0.6, path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a + languageName: node + linkType: hard + +"path-scurry@npm:^1.11.1": + version: 1.11.1 + resolution: "path-scurry@npm:1.11.1" + dependencies: + lru-cache: ^10.2.0 + minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 + checksum: 890d5abcd593a7912dcce7cf7c6bf7a0b5648e3dee6caf0712c126ca0a65c7f3d7b9d769072a4d1baf370f61ce493ab5b038d59988688e0c5f3f646ee3c69023 + languageName: node + linkType: hard + +"path-type@npm:^4.0.0": + version: 4.0.0 + resolution: "path-type@npm:4.0.0" + checksum: 5b1e2daa247062061325b8fdbfd1fb56dde0a448fb1455453276ea18c60685bdad23a445dc148cf87bc216be1573357509b7d4060494a6fd768c7efad833ee45 + languageName: node + linkType: hard + +"pathval@npm:^1.1.1": + version: 1.1.1 + resolution: "pathval@npm:1.1.1" + checksum: 090e3147716647fb7fb5b4b8c8e5b55e5d0a6086d085b6cd23f3d3c01fcf0ff56fd3cc22f2f4a033bd2e46ed55d61ed8379e123b42afe7d531a2a5fc8bb556d6 + languageName: node + linkType: hard + +"pbkdf2@npm:^3.0.17": + version: 3.1.2 + resolution: "pbkdf2@npm:3.1.2" + 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 + checksum: 2c950a100b1da72123449208e231afc188d980177d021d7121e96a2de7f2abbc96ead2b87d03d8fe5c318face097f203270d7e27908af9f471c165a4e8e69c92 + languageName: node + linkType: hard + +"picocolors@npm:^1.0.0": + version: 1.1.0 + resolution: "picocolors@npm:1.1.0" + checksum: a64d653d3a188119ff45781dfcdaeedd7625583f45280aea33fcb032c7a0d3959f2368f9b192ad5e8aade75b74dbd954ffe3106c158509a45e4c18ab379a2acd + languageName: node + linkType: hard + +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf + languageName: node + linkType: hard + +"pidtree@npm:0.6.0": + version: 0.6.0 + resolution: "pidtree@npm:0.6.0" + bin: + pidtree: bin/pidtree.js + checksum: 8fbc073ede9209dd15e80d616e65eb674986c93be49f42d9ddde8dbbd141bb53d628a7ca4e58ab5c370bb00383f67d75df59a9a226dede8fa801267a7030c27a + languageName: node + linkType: hard + +"pify@npm:^4.0.1": + version: 4.0.1 + resolution: "pify@npm:4.0.1" + checksum: 9c4e34278cb09987685fa5ef81499c82546c033713518f6441778fbec623fc708777fe8ac633097c72d88470d5963094076c7305cafc7ad340aae27cfacd856b + languageName: node + linkType: hard + +"pinst@npm:^3.0.0": + version: 3.0.0 + resolution: "pinst@npm:3.0.0" + bin: + pinst: bin.js + checksum: 4ae48a6a60f79c37071233af51b4d91bfc85cfa3c12b66ccda60cdb642b4d14a4ab0cb3587afc55b1f6192cea1772a5e4822026a0d0d3528296edef00cc2d61f + languageName: node + linkType: hard + +"pluralize@npm:^8.0.0": + version: 8.0.0 + resolution: "pluralize@npm:8.0.0" + checksum: 08931d4a6a4a5561a7f94f67a31c17e6632cb21e459ab3ff4f6f629d9a822984cf8afef2311d2005fbea5d7ef26016ebb090db008e2d8bce39d0a9a9d218736e + languageName: node + linkType: hard + +"prelude-ls@npm:^1.2.1": + version: 1.2.1 + resolution: "prelude-ls@npm:1.2.1" + checksum: cd192ec0d0a8e4c6da3bb80e4f62afe336df3f76271ac6deb0e6a36187133b6073a19e9727a1ff108cd8b9982e4768850d413baa71214dd80c7979617dca827a + languageName: node + linkType: hard + +"prelude-ls@npm:~1.1.2": + version: 1.1.2 + resolution: "prelude-ls@npm:1.1.2" + checksum: c4867c87488e4a0c233e158e4d0d5565b609b105d75e4c05dc760840475f06b731332eb93cc8c9cecb840aa8ec323ca3c9a56ad7820ad2e63f0261dadcb154e4 + languageName: node + linkType: hard + +"prettier-linter-helpers@npm:^1.0.0": + version: 1.0.0 + resolution: "prettier-linter-helpers@npm:1.0.0" + dependencies: + fast-diff: ^1.1.2 + checksum: 00ce8011cf6430158d27f9c92cfea0a7699405633f7f1d4a45f07e21bf78e99895911cbcdc3853db3a824201a7c745bd49bfea8abd5fb9883e765a90f74f8392 + languageName: node + linkType: hard + +"prettier-plugin-solidity@npm:^1.0.0, prettier-plugin-solidity@npm:^1.3.1": + version: 1.4.1 + resolution: "prettier-plugin-solidity@npm:1.4.1" + dependencies: + "@solidity-parser/parser": ^0.18.0 + semver: ^7.5.4 + peerDependencies: + prettier: ">=2.3.0" + checksum: ac9f3cc525553a45e70f60898da5d4a7b733128cdd9893686364790ff688c56dd6eb0234620759dc6fabad4dc354a27097927b29ea7761c5814c64613c07222f + languageName: node + linkType: hard + +"prettier@npm:^2.1.2, prettier@npm:^2.3.1, prettier@npm:^2.8.3, prettier@npm:^2.8.7": + version: 2.8.8 + resolution: "prettier@npm:2.8.8" + bin: + prettier: bin-prettier.js + checksum: b49e409431bf129dd89238d64299ba80717b57ff5a6d1c1a8b1a28b590d998a34e083fa13573bc732bb8d2305becb4c9a4407f8486c81fa7d55100eb08263cf8 + languageName: node + linkType: hard + +"prettier@npm:^3.0.3, prettier@npm:^3.3.3": + version: 3.3.3 + resolution: "prettier@npm:3.3.3" + bin: + prettier: bin/prettier.cjs + checksum: bc8604354805acfdde6106852d14b045bb20827ad76a5ffc2455b71a8257f94de93f17f14e463fe844808d2ccc87248364a5691488a3304f1031326e62d9276e + languageName: node + linkType: hard + +"proc-log@npm:^4.1.0, proc-log@npm:^4.2.0": + version: 4.2.0 + resolution: "proc-log@npm:4.2.0" + checksum: 98f6cd012d54b5334144c5255ecb941ee171744f45fca8b43b58ae5a0c1af07352475f481cadd9848e7f0250376ee584f6aa0951a856ff8f021bdfbff4eb33fc + languageName: node + linkType: hard + +"process-nextick-args@npm:~2.0.0": + version: 2.0.1 + resolution: "process-nextick-args@npm:2.0.1" + checksum: 1d38588e520dab7cea67cbbe2efdd86a10cc7a074c09657635e34f035277b59fbb57d09d8638346bf7090f8e8ebc070c96fa5fd183b777fff4f5edff5e9466cf + languageName: node + linkType: hard + +"promise-retry@npm:^2.0.1": + version: 2.0.1 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: ^2.0.2 + retry: ^0.12.0 + checksum: f96a3f6d90b92b568a26f71e966cbbc0f63ab85ea6ff6c81284dc869b41510e6cdef99b6b65f9030f0db422bf7c96652a3fff9f2e8fb4a0f069d8f4430359429 + languageName: node + linkType: hard + +"promise@npm:^8.0.0": + version: 8.3.0 + resolution: "promise@npm:8.3.0" + dependencies: + asap: ~2.0.6 + checksum: a69f0ddbddf78ffc529cffee7ad950d307347615970564b17988ce43fbe767af5c738a9439660b24a9a8cbea106c0dcbb6c2b20e23b7e96a8e89e5c2679e94d5 + languageName: node + linkType: hard + +"proxy-from-env@npm:^1.1.0": + version: 1.1.0 + resolution: "proxy-from-env@npm:1.1.0" + checksum: ed7fcc2ba0a33404958e34d95d18638249a68c430e30fcb6c478497d72739ba64ce9810a24f53a7d921d0c065e5b78e3822759800698167256b04659366ca4d4 + languageName: node + linkType: hard + +"pstree.remy@npm:^1.1.8": + version: 1.1.8 + resolution: "pstree.remy@npm:1.1.8" + checksum: 5cb53698d6bb34dfb278c8a26957964aecfff3e161af5fbf7cee00bbe9d8547c7aced4bd9cb193bce15fb56e9e4220fc02a5bf9c14345ffb13a36b858701ec2d + languageName: node + linkType: hard + +"punycode@npm:^2.1.0, punycode@npm:^2.3.0": + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: bb0a0ceedca4c3c57a9b981b90601579058903c62be23c5e8e843d2c2d4148a3ecf029d5133486fb0e1822b098ba8bba09e89d6b21742d02fa26bda6441a6fb2 + languageName: node + linkType: hard + +"qs@npm:^6.4.0, qs@npm:^6.9.4": + version: 6.13.0 + resolution: "qs@npm:6.13.0" + dependencies: + side-channel: ^1.0.6 + checksum: e9404dc0fc2849245107108ce9ec2766cde3be1b271de0bf1021d049dc5b98d1a2901e67b431ac5509f865420a7ed80b7acb3980099fe1c118a1c5d2e1432ad8 + languageName: node + linkType: hard + +"queue-microtask@npm:^1.2.2, queue-microtask@npm:^1.2.3": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 + languageName: node + linkType: hard + +"quick-lru@npm:^4.0.1": + version: 4.0.1 + resolution: "quick-lru@npm:4.0.1" + checksum: bea46e1abfaa07023e047d3cf1716a06172c4947886c053ede5c50321893711577cb6119360f810cc3ffcd70c4d7db4069c3cee876b358ceff8596e062bd1154 + languageName: node + linkType: hard + +"randombytes@npm:^2.1.0": + version: 2.1.0 + resolution: "randombytes@npm:2.1.0" + dependencies: + safe-buffer: ^5.1.0 + checksum: d779499376bd4cbb435ef3ab9a957006c8682f343f14089ed5f27764e4645114196e75b7f6abf1cbd84fd247c0cb0651698444df8c9bf30e62120fbbc52269d6 + languageName: node + linkType: hard + +"raw-body@npm:^2.4.1": + version: 2.5.2 + resolution: "raw-body@npm:2.5.2" + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + checksum: ba1583c8d8a48e8fbb7a873fdbb2df66ea4ff83775421bfe21ee120140949ab048200668c47d9ae3880012f6e217052690628cf679ddfbd82c9fc9358d574676 + languageName: node + linkType: hard + +"read-pkg-up@npm:^7.0.1": + version: 7.0.1 + resolution: "read-pkg-up@npm:7.0.1" + dependencies: + find-up: ^4.1.0 + read-pkg: ^5.2.0 + type-fest: ^0.8.1 + checksum: e4e93ce70e5905b490ca8f883eb9e48b5d3cebc6cd4527c25a0d8f3ae2903bd4121c5ab9c5a3e217ada0141098eeb661313c86fa008524b089b8ed0b7f165e44 + languageName: node + linkType: hard + +"read-pkg@npm:^5.2.0": + version: 5.2.0 + resolution: "read-pkg@npm:5.2.0" + dependencies: + "@types/normalize-package-data": ^2.4.0 + normalize-package-data: ^2.5.0 + parse-json: ^5.0.0 + type-fest: ^0.6.0 + checksum: eb696e60528b29aebe10e499ba93f44991908c57d70f2d26f369e46b8b9afc208ef11b4ba64f67630f31df8b6872129e0a8933c8c53b7b4daf0eace536901222 + languageName: node + linkType: hard + +"readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0, readable-stream@npm:^3.6.2": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" + dependencies: + inherits: ^2.0.3 + string_decoder: ^1.1.1 + util-deprecate: ^1.0.1 + checksum: bdcbe6c22e846b6af075e32cf8f4751c2576238c5043169a1c221c92ee2878458a816a4ea33f4c67623c0b6827c8a400409bfb3cf0bf3381392d0b1dfb52ac8d + languageName: node + linkType: hard + +"readable-stream@npm:^2.2.2": + version: 2.3.8 + resolution: "readable-stream@npm:2.3.8" + 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 + checksum: 65645467038704f0c8aaf026a72fbb588a9e2ef7a75cd57a01702ee9db1c4a1e4b03aaad36861a6a0926546a74d174149c8c207527963e0c2d3eee2f37678a42 + languageName: node + linkType: hard + +"readdirp@npm:~3.6.0": + version: 3.6.0 + resolution: "readdirp@npm:3.6.0" + dependencies: + picomatch: ^2.2.1 + checksum: 1ced032e6e45670b6d7352d71d21ce7edf7b9b928494dcaba6f11fba63180d9da6cd7061ebc34175ffda6ff529f481818c962952004d273178acd70f7059b320 + languageName: node + linkType: hard + +"readonly-date@npm:^1.0.0": + version: 1.0.0 + resolution: "readonly-date@npm:1.0.0" + checksum: 78481e2abf3c2f9bc526029458aee3e2b1c476ca1434c4cc9db5c9aba51bf8f1323c1995d764ff01f2055b01f13e05416b2e14b387f644b0a5a56554c3ee9d0a + languageName: node + linkType: hard + +"rechoir@npm:^0.6.2": + version: 0.6.2 + resolution: "rechoir@npm:0.6.2" + dependencies: + resolve: ^1.1.6 + checksum: fe76bf9c21875ac16e235defedd7cbd34f333c02a92546142b7911a0f7c7059d2e16f441fe6fb9ae203f459c05a31b2bcf26202896d89e390eda7514d5d2702b + languageName: node + linkType: hard + +"recursive-readdir@npm:^2.2.2": + version: 2.2.3 + resolution: "recursive-readdir@npm:2.2.3" + dependencies: + minimatch: ^3.0.5 + checksum: 88ec96e276237290607edc0872b4f9842837b95cfde0cdbb1e00ba9623dfdf3514d44cdd14496ab60a0c2dd180a6ef8a3f1c34599e6cf2273afac9b72a6fb2b5 + languageName: node + linkType: hard + +"redent@npm:^3.0.0": + version: 3.0.0 + resolution: "redent@npm:3.0.0" + dependencies: + indent-string: ^4.0.0 + strip-indent: ^3.0.0 + checksum: fa1ef20404a2d399235e83cc80bd55a956642e37dd197b4b612ba7327bf87fa32745aeb4a1634b2bab25467164ab4ed9c15be2c307923dd08b0fe7c52431ae6b + languageName: node + linkType: hard + +"reduce-flatten@npm:^2.0.0": + version: 2.0.0 + resolution: "reduce-flatten@npm:2.0.0" + checksum: 64393ef99a16b20692acfd60982d7fdbd7ff8d9f8f185c6023466444c6dd2abb929d67717a83cec7f7f8fb5f46a25d515b3b2bf2238fdbfcdbfd01d2a9e73cb8 + languageName: node + linkType: hard + +"regenerator-runtime@npm:^0.14.0": + version: 0.14.1 + resolution: "regenerator-runtime@npm:0.14.1" + checksum: 9f57c93277b5585d3c83b0cf76be47b473ae8c6d9142a46ce8b0291a04bb2cf902059f0f8445dcabb3fb7378e5fe4bb4ea1e008876343d42e46d3b484534ce38 + languageName: node + linkType: hard + +"req-cwd@npm:^2.0.0": + version: 2.0.0 + resolution: "req-cwd@npm:2.0.0" + dependencies: + req-from: ^2.0.0 + checksum: c44f9dea0b0f7d3a72be18a04f7769e0eefbadca363e3a346c1c02b79745126c871e1f6970357b3e731c26740aad8344bf80fb3ce055a2bcf8ca85ad2b44f519 + languageName: node + linkType: hard + +"req-from@npm:^2.0.0": + version: 2.0.0 + resolution: "req-from@npm:2.0.0" + dependencies: + resolve-from: ^3.0.0 + checksum: 4c369881a2296e23e71668ed089c5d93b37652fe900ec9f1e1f5c1da65f6bca4ee271e97ba2b806fdea50219e011995d1df3c80a7209015cc1e1fc622507f140 + languageName: node + linkType: hard + +"require-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: fb47e70bf0001fdeabdc0429d431863e9475e7e43ea5f94ad86503d918423c1543361cc5166d713eaa7029dd7a3d34775af04764bebff99ef413111a5af18c80 + languageName: node + linkType: hard + +"require-from-string@npm:^2.0.0, require-from-string@npm:^2.0.2": + version: 2.0.2 + resolution: "require-from-string@npm:2.0.2" + checksum: a03ef6895445f33a4015300c426699bc66b2b044ba7b670aa238610381b56d3f07c686251740d575e22f4c87531ba662d06937508f0f3c0f1ddc04db3130560b + languageName: node + linkType: hard + +"resolve-dir@npm:^1.0.0, resolve-dir@npm:^1.0.1": + version: 1.0.1 + resolution: "resolve-dir@npm:1.0.1" + dependencies: + expand-tilde: ^2.0.0 + global-modules: ^1.0.0 + checksum: ef736b8ed60d6645c3b573da17d329bfb50ec4e1d6c5ffd6df49e3497acef9226f9810ea6823b8ece1560e01dcb13f77a9f6180d4f242d00cc9a8f4de909c65c + languageName: node + linkType: hard + +"resolve-from@npm:5.0.0, resolve-from@npm:^5.0.0": + version: 5.0.0 + resolution: "resolve-from@npm:5.0.0" + checksum: 4ceeb9113e1b1372d0cd969f3468fa042daa1dd9527b1b6bb88acb6ab55d8b9cd65dbf18819f9f9ddf0db804990901dcdaade80a215e7b2c23daae38e64f5bdf + languageName: node + linkType: hard + +"resolve-from@npm:^3.0.0": + version: 3.0.0 + resolution: "resolve-from@npm:3.0.0" + checksum: fff9819254d2d62b57f74e5c2ca9c0bdd425ca47287c4d801bc15f947533148d858229ded7793b0f59e61e49e782fffd6722048add12996e1bd4333c29669062 + languageName: node + linkType: hard + +"resolve-from@npm:^4.0.0": + version: 4.0.0 + resolution: "resolve-from@npm:4.0.0" + checksum: f4ba0b8494846a5066328ad33ef8ac173801a51739eb4d63408c847da9a2e1c1de1e6cbbf72699211f3d13f8fc1325648b169bd15eb7da35688e30a5fb0e4a7f + languageName: node + linkType: hard + +"resolve-global@npm:1.0.0, resolve-global@npm:^1.0.0": + version: 1.0.0 + resolution: "resolve-global@npm:1.0.0" + dependencies: + global-dirs: ^0.1.1 + checksum: c4e11d33e84bde7516b824503ffbe4b6cce863d5ce485680fd3db997b7c64da1df98321b1fd0703b58be8bc9bc83bc96bd83043f96194386b45eb47229efb6b6 + languageName: node + linkType: hard + +"resolve@npm:1.1.x": + version: 1.1.7 + resolution: "resolve@npm:1.1.7" + checksum: afd20873fbde7641c9125efe3f940c2a99f6b1f90f1b7b743e744bdaac1cb105b2e4e0317bcc052ed7e31d57afa86b394a4dc9a1b33a297977be134fdf0250ab + languageName: node + linkType: hard + +"resolve@npm:1.17.0": + version: 1.17.0 + resolution: "resolve@npm:1.17.0" + dependencies: + path-parse: ^1.0.6 + checksum: 9ceaf83b3429f2d7ff5d0281b8d8f18a1f05b6ca86efea7633e76b8f76547f33800799dfdd24434942dec4fbd9e651ed3aef577d9a6b5ec87ad89c1060e24759 + languageName: node + linkType: hard + +"resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.8.1": + version: 1.22.8 + resolution: "resolve@npm:1.22.8" + dependencies: + is-core-module: ^2.13.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: f8a26958aa572c9b064562750b52131a37c29d072478ea32e129063e2da7f83e31f7f11e7087a18225a8561cfe8d2f0df9dbea7c9d331a897571c0a2527dbb4c + languageName: node + linkType: hard + +"resolve@patch:resolve@1.1.x#~builtin": + version: 1.1.7 + resolution: "resolve@patch:resolve@npm%3A1.1.7#~builtin::version=1.1.7&hash=07638b" + checksum: e9dbca78600ae56835c43a09f1276876c883e4b4bbd43e2683fa140671519d2bdebeb1c1576ca87c8c508ae2987b3ec481645ac5d3054b0f23254cfc1ce49942 + languageName: node + linkType: hard + +"resolve@patch:resolve@1.17.0#~builtin": + version: 1.17.0 + resolution: "resolve@patch:resolve@npm%3A1.17.0#~builtin::version=1.17.0&hash=07638b" + dependencies: + path-parse: ^1.0.6 + checksum: 6fd799f282ddf078c4bc20ce863e3af01fa8cb218f0658d9162c57161a2dbafe092b13015b9a4c58d0e1e801cf7aa7a4f13115fea9db98c3f9a0c43e429bad6f + languageName: node + linkType: hard + +"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.8.1#~builtin": + version: 1.22.8 + resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin::version=1.22.8&hash=07638b" + dependencies: + is-core-module: ^2.13.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 5479b7d431cacd5185f8db64bfcb7286ae5e31eb299f4c4f404ad8aa6098b77599563ac4257cb2c37a42f59dfc06a1bec2bcf283bb448f319e37f0feb9a09847 + languageName: node + linkType: hard + +"restore-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "restore-cursor@npm:3.1.0" + dependencies: + onetime: ^5.1.0 + signal-exit: ^3.0.2 + checksum: f877dd8741796b909f2a82454ec111afb84eb45890eb49ac947d87991379406b3b83ff9673a46012fca0d7844bb989f45cc5b788254cf1a39b6b5a9659de0630 + languageName: node + linkType: hard + +"restore-cursor@npm:^4.0.0": + version: 4.0.0 + resolution: "restore-cursor@npm:4.0.0" + dependencies: + onetime: ^5.1.0 + signal-exit: ^3.0.2 + checksum: 5b675c5a59763bf26e604289eab35711525f11388d77f409453904e1e69c0d37ae5889295706b2c81d23bd780165084d040f9b68fffc32cc921519031c4fa4af + languageName: node + linkType: hard + +"retry@npm:^0.12.0": + version: 0.12.0 + resolution: "retry@npm:0.12.0" + checksum: 623bd7d2e5119467ba66202d733ec3c2e2e26568074923bc0585b6b99db14f357e79bdedb63cab56cec47491c4a0da7e6021a7465ca6dc4f481d3898fdd3158c + languageName: node + linkType: hard + +"reusify@npm:^1.0.4": + version: 1.0.4 + resolution: "reusify@npm:1.0.4" + checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc + languageName: node + linkType: hard + +"rfdc@npm:^1.3.0": + version: 1.4.1 + resolution: "rfdc@npm:1.4.1" + checksum: 3b05bd55062c1d78aaabfcea43840cdf7e12099968f368e9a4c3936beb744adb41cbdb315eac6d4d8c6623005d6f87fdf16d8a10e1ff3722e84afea7281c8d13 + languageName: node + linkType: hard + +"rimraf@npm:^2.2.8, rimraf@npm:^2.6.3": + version: 2.7.1 + resolution: "rimraf@npm:2.7.1" + dependencies: + glob: ^7.1.3 + bin: + rimraf: ./bin.js + checksum: cdc7f6eacb17927f2a075117a823e1c5951792c6498ebcce81ca8203454a811d4cf8900314154d3259bb8f0b42ab17f67396a8694a54cae3283326e57ad250cd + languageName: node + linkType: hard + +"rimraf@npm:^3.0.2": + version: 3.0.2 + resolution: "rimraf@npm:3.0.2" + dependencies: + glob: ^7.1.3 + bin: + rimraf: bin.js + checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 + languageName: node + linkType: hard + +"ripemd160@npm:^2.0.0, ripemd160@npm:^2.0.1": + version: 2.0.2 + resolution: "ripemd160@npm:2.0.2" + dependencies: + hash-base: ^3.0.0 + inherits: ^2.0.1 + checksum: 006accc40578ee2beae382757c4ce2908a826b27e2b079efdcd2959ee544ddf210b7b5d7d5e80467807604244e7388427330f5c6d4cd61e6edaddc5773ccc393 + languageName: node + linkType: hard + +"rlp@npm:^2.2.3, rlp@npm:^2.2.4": + version: 2.2.7 + resolution: "rlp@npm:2.2.7" + dependencies: + bn.js: ^5.2.0 + bin: + rlp: bin/rlp + checksum: 3db4dfe5c793f40ac7e0be689a1f75d05e6f2ca0c66189aeb62adab8c436b857ab4420a419251ee60370d41d957a55698fc5e23ab1e1b41715f33217bc4bb558 + languageName: node + linkType: hard + +"root-workspace-0b6124@workspace:.": + version: 0.0.0-use.local + resolution: "root-workspace-0b6124@workspace:." + dependencies: + "@commitlint/cli": ^17.5.1 + "@commitlint/config-conventional": ^17.4.4 + husky: ^8.0.3 + patch-package: 8.0.0 + prettier: ^2.8.7 + prettier-plugin-solidity: ^1.0.0 + languageName: unknown + linkType: soft + +"rpc-websockets@npm:^9.0.2": + version: 9.0.2 + resolution: "rpc-websockets@npm:9.0.2" + dependencies: + "@swc/helpers": ^0.5.11 + "@types/uuid": ^8.3.4 + "@types/ws": ^8.2.2 + buffer: ^6.0.3 + bufferutil: ^4.0.1 + eventemitter3: ^5.0.1 + utf-8-validate: ^5.0.2 + uuid: ^8.3.2 + ws: ^8.5.0 + dependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: c93cd2e5b348ecfc6a4714d88b34c23470d086cecde5d1ba459750f9f1269c6e8edf80f3c628bab423f8720a49a653093e52821b9b0779fb79e041313d0e7173 + languageName: node + linkType: hard + +"run-async@npm:^2.4.0": + version: 2.4.1 + resolution: "run-async@npm:2.4.1" + checksum: a2c88aa15df176f091a2878eb840e68d0bdee319d8d97bbb89112223259cebecb94bc0defd735662b83c2f7a30bed8cddb7d1674eb48ae7322dc602b22d03797 + languageName: node + linkType: hard + +"run-parallel-limit@npm:^1.1.0": + version: 1.1.0 + resolution: "run-parallel-limit@npm:1.1.0" + dependencies: + queue-microtask: ^1.2.2 + checksum: 672c3b87e7f939c684b9965222b361421db0930223ed1e43ebf0e7e48ccc1a022ea4de080bef4d5468434e2577c33b7681e3f03b7593fdc49ad250a55381123c + languageName: node + linkType: hard + +"run-parallel@npm:^1.1.9": + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" + dependencies: + queue-microtask: ^1.2.2 + checksum: cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d + languageName: node + linkType: hard + +"rustbn.js@npm:~0.2.0": + version: 0.2.0 + resolution: "rustbn.js@npm:0.2.0" + checksum: 2148e7ba34e70682907ee29df4784639e6eb025481b2c91249403b7ec57181980161868d9aa24822a5075dd1bb5a180dfedc77309e5f0d27b6301f9b563af99a + languageName: node + linkType: hard + +"rxjs@npm:^7.5.5": + version: 7.8.1 + resolution: "rxjs@npm:7.8.1" + dependencies: + tslib: ^2.1.0 + checksum: de4b53db1063e618ec2eca0f7965d9137cabe98cf6be9272efe6c86b47c17b987383df8574861bcced18ebd590764125a901d5506082be84a8b8e364bf05f119 + languageName: node + linkType: hard + +"safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.0, safe-buffer@npm:~5.2.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 + languageName: node + linkType: hard + +"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": + version: 5.1.2 + resolution: "safe-buffer@npm:5.1.2" + checksum: f2f1f7943ca44a594893a852894055cf619c1fbcb611237fc39e461ae751187e7baf4dc391a72125e0ac4fb2d8c5c0b3c71529622e6a58f46b960211e704903c + languageName: node + linkType: hard + +"safe-stable-stringify@npm:^2.3.1": + version: 2.5.0 + resolution: "safe-stable-stringify@npm:2.5.0" + checksum: d3ce103ed43c6c2f523e39607208bfb1c73aa48179fc5be53c3aa97c118390bffd4d55e012f5393b982b65eb3e0ee954dd57b547930d3f242b0053dcdb923d17 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 + languageName: node + linkType: hard + +"sc-istanbul@npm:^0.4.5": + version: 0.4.6 + resolution: "sc-istanbul@npm:0.4.6" + dependencies: + abbrev: 1.0.x + async: 1.x + escodegen: 1.8.x + esprima: 2.7.x + glob: ^5.0.15 + handlebars: ^4.0.1 + js-yaml: 3.x + mkdirp: 0.5.x + nopt: 3.x + once: 1.x + resolve: 1.1.x + supports-color: ^3.1.0 + which: ^1.1.1 + wordwrap: ^1.0.0 + bin: + istanbul: lib/cli.js + checksum: 256472ebd35787985be7fc924f817f3e0fcf0ed17655250555bf24f76d44af18fd1b25a91c33458e17a4c57b80375bea22d46e2a982880ffbde1b1a94dfeed19 + languageName: node + linkType: hard + +"scrypt-js@npm:3.0.1, scrypt-js@npm:^3.0.0": + version: 3.0.1 + resolution: "scrypt-js@npm:3.0.1" + checksum: b7c7d1a68d6ca946f2fbb0778e0c4ec63c65501b54023b2af7d7e9f48fdb6c6580d6f7675cd53bda5944c5ebc057560d5a6365079752546865defb3b79dea454 + languageName: node + linkType: hard + +"sdk@workspace:packages/sdk": + version: 0.0.0-use.local + resolution: "sdk@workspace:packages/sdk" + dependencies: + ethers: ^6.2.3 + languageName: unknown + linkType: soft + +"secp256k1@npm:^4.0.1": + version: 4.0.3 + resolution: "secp256k1@npm:4.0.3" + dependencies: + elliptic: ^6.5.4 + node-addon-api: ^2.0.0 + node-gyp: latest + node-gyp-build: ^4.2.0 + checksum: 21e219adc0024fbd75021001358780a3cc6ac21273c3fcaef46943af73969729709b03f1df7c012a0baab0830fb9a06ccc6b42f8d50050c665cb98078eab477b + languageName: node + linkType: hard + +"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.5.0": + version: 5.7.2 + resolution: "semver@npm:5.7.2" + bin: + semver: bin/semver + checksum: fb4ab5e0dd1c22ce0c937ea390b4a822147a9c53dbd2a9a0132f12fe382902beef4fbf12cf51bb955248d8d15874ce8cd89532569756384f994309825f10b686 + languageName: node + linkType: hard + +"semver@npm:7.5.4": + version: 7.5.4 + resolution: "semver@npm:7.5.4" + dependencies: + lru-cache: ^6.0.0 + bin: + semver: bin/semver.js + checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 + languageName: node + linkType: hard + +"semver@npm:^6.3.0": + version: 6.3.1 + resolution: "semver@npm:6.3.1" + bin: + semver: bin/semver.js + checksum: ae47d06de28836adb9d3e25f22a92943477371292d9b665fb023fae278d345d508ca1958232af086d85e0155aee22e313e100971898bbb8d5d89b8b1d4054ca2 + languageName: node + linkType: hard + +"semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4": + version: 7.6.3 + resolution: "semver@npm:7.6.3" + bin: + semver: bin/semver.js + checksum: 4110ec5d015c9438f322257b1c51fe30276e5f766a3f64c09edd1d7ea7118ecbc3f379f3b69032bacf13116dc7abc4ad8ce0d7e2bd642e26b0d271b56b61a7d8 + languageName: node + linkType: hard + +"serialize-javascript@npm:^6.0.2": + version: 6.0.2 + resolution: "serialize-javascript@npm:6.0.2" + dependencies: + randombytes: ^2.1.0 + checksum: c4839c6206c1d143c0f80763997a361310305751171dd95e4b57efee69b8f6edd8960a0b7fbfc45042aadff98b206d55428aee0dc276efe54f100899c7fa8ab7 + languageName: node + linkType: hard + +"set-function-length@npm:^1.2.1": + version: 1.2.2 + resolution: "set-function-length@npm:1.2.2" + 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 + checksum: a8248bdacdf84cb0fab4637774d9fb3c7a8e6089866d04c817583ff48e14149c87044ce683d7f50759a8c50fb87c7a7e173535b06169c87ef76f5fb276dfff72 + languageName: node + linkType: hard + +"setimmediate@npm:^1.0.5": + version: 1.0.5 + resolution: "setimmediate@npm:1.0.5" + checksum: c9a6f2c5b51a2dabdc0247db9c46460152ffc62ee139f3157440bd48e7c59425093f42719ac1d7931f054f153e2d26cf37dfeb8da17a794a58198a2705e527fd + languageName: node + linkType: hard + +"setprototypeof@npm:1.2.0": + version: 1.2.0 + resolution: "setprototypeof@npm:1.2.0" + checksum: be18cbbf70e7d8097c97f713a2e76edf84e87299b40d085c6bf8b65314e994cc15e2e317727342fa6996e38e1f52c59720b53fe621e2eb593a6847bf0356db89 + languageName: node + linkType: hard + +"sha.js@npm:^2.4.0, sha.js@npm:^2.4.8": + version: 2.4.11 + resolution: "sha.js@npm:2.4.11" + dependencies: + inherits: ^2.0.1 + safe-buffer: ^5.0.1 + bin: + sha.js: ./bin.js + checksum: ebd3f59d4b799000699097dadb831c8e3da3eb579144fd7eb7a19484cbcbb7aca3c68ba2bb362242eb09e33217de3b4ea56e4678184c334323eca24a58e3ad07 + languageName: node + linkType: hard + +"sha1@npm:^1.1.1": + version: 1.1.1 + resolution: "sha1@npm:1.1.1" + dependencies: + charenc: ">= 0.0.1" + crypt: ">= 0.0.1" + checksum: da9f47e949988e2f595ef19733fd1dc736866ef6de4e421a55c13b444c03ae532e528b7350ae6ea55d9fb053be61d4648ec2cd5250d46cfdbdf4f6b4e763713d + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: ^3.0.0 + checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 + languageName: node + linkType: hard + +"shelljs@npm:^0.8.3, shelljs@npm:^0.8.5": + version: 0.8.5 + resolution: "shelljs@npm:0.8.5" + dependencies: + glob: ^7.0.0 + interpret: ^1.0.0 + rechoir: ^0.6.2 + bin: + shjs: bin/shjs + checksum: 7babc46f732a98f4c054ec1f048b55b9149b98aa2da32f6cf9844c434b43c6251efebd6eec120937bd0999e13811ebd45efe17410edb3ca938f82f9381302748 + languageName: node + linkType: hard + +"shx@npm:^0.3.4": + version: 0.3.4 + resolution: "shx@npm:0.3.4" + dependencies: + minimist: ^1.2.3 + shelljs: ^0.8.5 + bin: + shx: lib/cli.js + checksum: 0aa168bfddc11e3fe8943cce2e0d2d8514a560bd58cf2b835b4351ba03f46068f7d88286c2627f4b85604e81952154c43746369fb3f0d60df0e3b511f465e5b8 + languageName: node + linkType: hard + +"side-channel@npm:^1.0.6": + version: 1.0.6 + resolution: "side-channel@npm:1.0.6" + dependencies: + call-bind: ^1.0.7 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.4 + object-inspect: ^1.13.1 + checksum: bfc1afc1827d712271453e91b7cd3878ac0efd767495fd4e594c4c2afaa7963b7b510e249572bfd54b0527e66e4a12b61b80c061389e129755f34c493aad9b97 + languageName: node + linkType: hard + +"signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": + version: 3.0.7 + resolution: "signal-exit@npm:3.0.7" + checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 + languageName: node + linkType: hard + +"signal-exit@npm:^4.0.1": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: 64c757b498cb8629ffa5f75485340594d2f8189e9b08700e69199069c8e3070fb3e255f7ab873c05dc0b3cec412aea7402e10a5990cb6a050bd33ba062a6c549 + languageName: node + linkType: hard + +"simple-swizzle@npm:^0.2.2": + version: 0.2.2 + resolution: "simple-swizzle@npm:0.2.2" + dependencies: + is-arrayish: ^0.3.1 + checksum: a7f3f2ab5c76c4472d5c578df892e857323e452d9f392e1b5cf74b74db66e6294a1e1b8b390b519fa1b96b5b613f2a37db6cffef52c3f1f8f3c5ea64eb2d54c0 + languageName: node + linkType: hard + +"simple-update-notifier@npm:^2.0.0": + version: 2.0.0 + resolution: "simple-update-notifier@npm:2.0.0" + dependencies: + semver: ^7.5.3 + checksum: 9ba00d38ce6a29682f64a46213834e4eb01634c2f52c813a9a7b8873ca49cdbb703696f3290f3b27dc067de6d9418b0b84bef22c3eb074acf352529b2d6c27fd + languageName: node + linkType: hard + +"slash@npm:^2.0.0": + version: 2.0.0 + resolution: "slash@npm:2.0.0" + checksum: 512d4350735375bd11647233cb0e2f93beca6f53441015eea241fe784d8068281c3987fbaa93e7ef1c38df68d9c60013045c92837423c69115297d6169aa85e6 + languageName: node + linkType: hard + +"slash@npm:^3.0.0": + version: 3.0.0 + resolution: "slash@npm:3.0.0" + checksum: 94a93fff615f25a999ad4b83c9d5e257a7280c90a32a7cb8b4a87996e4babf322e469c42b7f649fd5796edd8687652f3fb452a86dc97a816f01113183393f11c + languageName: node + linkType: hard + +"slice-ansi@npm:^4.0.0": + version: 4.0.0 + resolution: "slice-ansi@npm:4.0.0" + dependencies: + ansi-styles: ^4.0.0 + astral-regex: ^2.0.0 + is-fullwidth-code-point: ^3.0.0 + checksum: 4a82d7f085b0e1b070e004941ada3c40d3818563ac44766cca4ceadd2080427d337554f9f99a13aaeb3b4a94d9964d9466c807b3d7b7541d1ec37ee32d308756 + languageName: node + linkType: hard + +"slice-ansi@npm:^5.0.0": + version: 5.0.0 + resolution: "slice-ansi@npm:5.0.0" + dependencies: + ansi-styles: ^6.0.0 + is-fullwidth-code-point: ^4.0.0 + checksum: 7e600a2a55e333a21ef5214b987c8358fe28bfb03c2867ff2cbf919d62143d1812ac27b4297a077fdaf27a03da3678e49551c93e35f9498a3d90221908a1180e + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^8.0.3": + version: 8.0.4 + resolution: "socks-proxy-agent@npm:8.0.4" + dependencies: + agent-base: ^7.1.1 + debug: ^4.3.4 + socks: ^2.8.3 + checksum: b2ec5051d85fe49072f9a250c427e0e9571fd09d5db133819192d078fd291276e1f0f50f6dbc04329b207738b1071314cee8bdbb4b12e27de42dbcf1d4233c67 + languageName: node + linkType: hard + +"socks@npm:^2.8.3": + version: 2.8.3 + resolution: "socks@npm:2.8.3" + dependencies: + ip-address: ^9.0.5 + smart-buffer: ^4.2.0 + checksum: 7a6b7f6eedf7482b9e4597d9a20e09505824208006ea8f2c49b71657427f3c137ca2ae662089baa73e1971c62322d535d9d0cf1c9235cf6f55e315c18203eadd + languageName: node + linkType: hard + +"solc@npm:0.7.3": + version: 0.7.3 + resolution: "solc@npm:0.7.3" + dependencies: + command-exists: ^1.2.8 + commander: 3.0.2 + follow-redirects: ^1.12.1 + fs-extra: ^0.30.0 + js-sha3: 0.8.0 + memorystream: ^0.3.1 + require-from-string: ^2.0.0 + semver: ^5.5.0 + tmp: 0.0.33 + bin: + solcjs: solcjs + checksum: 2d8eb16c6d8f648213c94dc8d977cffe5099cba7d41c82d92d769ef71ae8320a985065ce3d6c306440a85f8e8d2b27fb30bdd3ac38f69e5c1fa0ab8a3fb2f217 + languageName: node + linkType: hard + +"solhint-plugin-prettier@npm:^0.0.5": + version: 0.0.5 + resolution: "solhint-plugin-prettier@npm:0.0.5" + dependencies: + prettier-linter-helpers: ^1.0.0 + peerDependencies: + prettier: ^1.15.0 || ^2.0.0 + prettier-plugin-solidity: ^1.0.0-alpha.14 + checksum: ca721e327daf49a4d9ef0ee5c9622482a8c5563d600eedfd3856c69ce67e416dd77da5166a033e2e641c9cdd7a0f2cbc7913b0eb1712081b3c7e8c633eef82a5 + languageName: node + linkType: hard + +"solhint@npm:^3.3.7": + version: 3.6.2 + resolution: "solhint@npm:3.6.2" + dependencies: + "@solidity-parser/parser": ^0.16.0 + ajv: ^6.12.6 + antlr4: ^4.11.0 + ast-parents: ^0.0.1 + chalk: ^4.1.2 + commander: ^10.0.0 + cosmiconfig: ^8.0.0 + fast-diff: ^1.2.0 + glob: ^8.0.3 + ignore: ^5.2.4 + js-yaml: ^4.1.0 + lodash: ^4.17.21 + pluralize: ^8.0.0 + prettier: ^2.8.3 + semver: ^7.5.2 + strip-ansi: ^6.0.1 + table: ^6.8.1 + text-table: ^0.2.0 + dependenciesMeta: + prettier: + optional: true + bin: + solhint: solhint.js + checksum: 96c2ab3c1444624facb45b929682c65d83019f392c7331463a45e8ed61f08122e24b6709a721b6086ddfb0d5e3c3d4281f175f74eb308415072917556bdeba22 + languageName: node + linkType: hard + +"solidity-coverage@npm:^0.8.2": + version: 0.8.13 + resolution: "solidity-coverage@npm:0.8.13" + dependencies: + "@ethersproject/abi": ^5.0.9 + "@solidity-parser/parser": ^0.18.0 + chalk: ^2.4.2 + death: ^1.1.0 + difflib: ^0.2.4 + fs-extra: ^8.1.0 + ghost-testrpc: ^0.0.2 + global-modules: ^2.0.0 + globby: ^10.0.1 + jsonschema: ^1.2.4 + lodash: ^4.17.21 + mocha: ^10.2.0 + node-emoji: ^1.10.0 + pify: ^4.0.1 + recursive-readdir: ^2.2.2 + sc-istanbul: ^0.4.5 + semver: ^7.3.4 + shelljs: ^0.8.3 + web3-utils: ^1.3.6 + peerDependencies: + hardhat: ^2.11.0 + bin: + solidity-coverage: plugins/bin.js + checksum: aa18bf332bae4256753e24c6e866beecc35adbc694a285dac3947433c708f488cb18f11026b4e00250af8eadb910b642b1532d21137444cf00666b44ac0f8366 + languageName: node + linkType: hard + +"solidity-rlp@npm:2.0.8": + version: 2.0.8 + resolution: "solidity-rlp@npm:2.0.8" + checksum: e182087ffa1ee61447a04cae1b2ac3d814a65f52c1e6c81084ed181216f63fdc44df5197b5a35a627809db392fddd65f6e8dde4b8e49decdfc6fdfc7ed7ba3e8 + languageName: node + linkType: hard + +"source-map-support@npm:^0.5.13": + version: 0.5.21 + resolution: "source-map-support@npm:0.5.21" + dependencies: + buffer-from: ^1.0.0 + source-map: ^0.6.0 + checksum: 43e98d700d79af1d36f859bdb7318e601dfc918c7ba2e98456118ebc4c4872b327773e5a1df09b0524e9e5063bb18f0934538eace60cca2710d1fa687645d137 + languageName: node + linkType: hard + +"source-map@npm:^0.5.0": + version: 0.5.7 + resolution: "source-map@npm:0.5.7" + checksum: 5dc2043b93d2f194142c7f38f74a24670cd7a0063acdaf4bf01d2964b402257ae843c2a8fa822ad5b71013b5fcafa55af7421383da919752f22ff488bc553f4d + languageName: node + linkType: hard + +"source-map@npm:^0.6.0, source-map@npm:^0.6.1": + version: 0.6.1 + resolution: "source-map@npm:0.6.1" + checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 + languageName: node + linkType: hard + +"source-map@npm:~0.2.0": + version: 0.2.0 + resolution: "source-map@npm:0.2.0" + dependencies: + amdefine: ">=0.0.4" + checksum: 95fe800c3a93f8c0b9516c033bfc75f2678e27d2e6c0b23ae222f5ddc4afa0a39bd0be15d1c0a1e766d388f3761cc854a053a4330f49242e6045e1a4f9dc0e26 + languageName: node + linkType: hard + +"sparse-bitfield@npm:^3.0.3": + version: 3.0.3 + resolution: "sparse-bitfield@npm:3.0.3" + dependencies: + memory-pager: ^1.0.2 + checksum: 174da88dbbcc783d5dbd26921931cc83830280b8055fb05333786ebe6fc015b9601b24972b3d55920dd2d9f5fb120576fbfa2469b08e5222c9cadf3f05210aab + languageName: node + linkType: hard + +"spdx-correct@npm:^3.0.0": + version: 3.2.0 + resolution: "spdx-correct@npm:3.2.0" + dependencies: + spdx-expression-parse: ^3.0.0 + spdx-license-ids: ^3.0.0 + checksum: e9ae98d22f69c88e7aff5b8778dc01c361ef635580e82d29e5c60a6533cc8f4d820803e67d7432581af0cc4fb49973125076ee3b90df191d153e223c004193b2 + languageName: node + linkType: hard + +"spdx-exceptions@npm:^2.1.0": + version: 2.5.0 + resolution: "spdx-exceptions@npm:2.5.0" + checksum: bb127d6e2532de65b912f7c99fc66097cdea7d64c10d3ec9b5e96524dbbd7d20e01cba818a6ddb2ae75e62bb0c63d5e277a7e555a85cbc8ab40044984fa4ae15 + languageName: node + linkType: hard + +"spdx-expression-parse@npm:^3.0.0": + version: 3.0.1 + resolution: "spdx-expression-parse@npm:3.0.1" + dependencies: + spdx-exceptions: ^2.1.0 + spdx-license-ids: ^3.0.0 + checksum: a1c6e104a2cbada7a593eaa9f430bd5e148ef5290d4c0409899855ce8b1c39652bcc88a725259491a82601159d6dc790bedefc9016c7472f7de8de7361f8ccde + languageName: node + linkType: hard + +"spdx-license-ids@npm:^3.0.0": + version: 3.0.20 + resolution: "spdx-license-ids@npm:3.0.20" + checksum: 0c57750bedbcff48f3d0e266fbbdaf0aab54217e182f669542ffe0b5a902dce69e8cdfa126a131e1ddd39a9bef4662e357b2b41315d7240b4a28c0a7e782bb40 + languageName: node + linkType: hard + +"split2@npm:^3.0.0, split2@npm:^3.2.2": + version: 3.2.2 + resolution: "split2@npm:3.2.2" + dependencies: + readable-stream: ^3.0.0 + checksum: 8127ddbedd0faf31f232c0e9192fede469913aa8982aa380752e0463b2e31c2359ef6962eb2d24c125bac59eeec76873678d723b1c7ff696216a1cd071e3994a + languageName: node + linkType: hard + +"sprintf-js@npm:^1.1.3": + version: 1.1.3 + resolution: "sprintf-js@npm:1.1.3" + checksum: a3fdac7b49643875b70864a9d9b469d87a40dfeaf5d34d9d0c5b1cda5fd7d065531fcb43c76357d62254c57184a7b151954156563a4d6a747015cfb41021cad0 + languageName: node + linkType: hard + +"sprintf-js@npm:~1.0.2": + version: 1.0.3 + resolution: "sprintf-js@npm:1.0.3" + checksum: 19d79aec211f09b99ec3099b5b2ae2f6e9cdefe50bc91ac4c69144b6d3928a640bb6ae5b3def70c2e85a2c3d9f5ec2719921e3a59d3ca3ef4b2fd1a4656a0df3 + languageName: node + linkType: hard + +"ssri@npm:^10.0.0": + version: 10.0.6 + resolution: "ssri@npm:10.0.6" + dependencies: + minipass: ^7.0.3 + checksum: 4603d53a05bcd44188747d38f1cc43833b9951b5a1ee43ba50535bdfc5fe4a0897472dbe69837570a5417c3c073377ef4f8c1a272683b401857f72738ee57299 + languageName: node + linkType: hard + +"stack-trace@npm:0.0.x": + version: 0.0.10 + resolution: "stack-trace@npm:0.0.10" + checksum: 473036ad32f8c00e889613153d6454f9be0536d430eb2358ca51cad6b95cea08a3cc33cc0e34de66b0dad221582b08ed2e61ef8e13f4087ab690f388362d6610 + languageName: node + linkType: hard + +"stacktrace-parser@npm:^0.1.10": + version: 0.1.10 + resolution: "stacktrace-parser@npm:0.1.10" + dependencies: + type-fest: ^0.7.1 + checksum: f4fbddfc09121d91e587b60de4beb4941108e967d71ad3a171812dc839b010ca374d064ad0a296295fed13acd103609d99a4224a25b4e67de13cae131f1901ee + languageName: node + linkType: hard + +"statuses@npm:2.0.1": + version: 2.0.1 + resolution: "statuses@npm:2.0.1" + checksum: 18c7623fdb8f646fb213ca4051be4df7efb3484d4ab662937ca6fbef7ced9b9e12842709872eb3020cc3504b93bde88935c9f6417489627a7786f24f8031cbcb + languageName: node + linkType: hard + +"string-argv@npm:0.3.2": + version: 0.3.2 + resolution: "string-argv@npm:0.3.2" + checksum: 8703ad3f3db0b2641ed2adbb15cf24d3945070d9a751f9e74a924966db9f325ac755169007233e8985a39a6a292f14d4fee20482989b89b96e473c4221508a0f + languageName: node + linkType: hard + +"string-format@npm:^2.0.0": + version: 2.0.0 + resolution: "string-format@npm:2.0.0" + checksum: dada2ef95f6d36c66562c673d95315f80457fa7dce2f3609a2e75d1190b98c88319028cf0a5b6c043d01c18d581b2641579f79480584ba030d6ac6fceb30bc55 + languageName: node + linkType: hard + +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: ^8.0.0 + is-fullwidth-code-point: ^3.0.0 + strip-ansi: ^6.0.1 + checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb + languageName: node + linkType: hard + +"string-width@npm:^2.1.1": + version: 2.1.1 + resolution: "string-width@npm:2.1.1" + dependencies: + is-fullwidth-code-point: ^2.0.0 + strip-ansi: ^4.0.0 + checksum: d6173abe088c615c8dffaf3861dc5d5906ed3dc2d6fd67ff2bd2e2b5dce7fd683c5240699cf0b1b8aa679a3b3bd6b28b5053c824cb89b813d7f6541d8f89064a + languageName: node + linkType: hard + +"string-width@npm:^5.0.0, string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: ^0.2.0 + emoji-regex: ^9.2.2 + strip-ansi: ^7.0.1 + checksum: 7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 + languageName: node + linkType: hard + +"string_decoder@npm:^1.1.1": + version: 1.3.0 + resolution: "string_decoder@npm:1.3.0" + dependencies: + safe-buffer: ~5.2.0 + checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 + languageName: node + linkType: hard + +"string_decoder@npm:~1.1.1": + version: 1.1.1 + resolution: "string_decoder@npm:1.1.1" + dependencies: + safe-buffer: ~5.1.0 + checksum: 9ab7e56f9d60a28f2be697419917c50cac19f3e8e6c28ef26ed5f4852289fe0de5d6997d29becf59028556f2c62983790c1d9ba1e2a3cc401768ca12d5183a5b + languageName: node + linkType: hard + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: ^5.0.1 + checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c + languageName: node + linkType: hard + +"strip-ansi@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-ansi@npm:4.0.0" + dependencies: + ansi-regex: ^3.0.0 + checksum: d9186e6c0cf78f25274f6750ee5e4a5725fb91b70fdd79aa5fe648eab092a0ec5b9621b22d69d4534a56319f75d8944efbd84e3afa8d4ad1b9a9491f12c84eca + languageName: node + linkType: hard + +"strip-ansi@npm:^7.0.1": + version: 7.1.0 + resolution: "strip-ansi@npm:7.1.0" + dependencies: + ansi-regex: ^6.0.1 + checksum: 859c73fcf27869c22a4e4d8c6acfe690064659e84bef9458aa6d13719d09ca88dcfd40cbf31fd0be63518ea1a643fe070b4827d353e09533a5b0b9fd4553d64d + languageName: node + linkType: hard + +"strip-bom@npm:4.0.0": + version: 4.0.0 + resolution: "strip-bom@npm:4.0.0" + checksum: 9dbcfbaf503c57c06af15fe2c8176fb1bf3af5ff65003851a102749f875a6dbe0ab3b30115eccf6e805e9d756830d3e40ec508b62b3f1ddf3761a20ebe29d3f3 + languageName: node + linkType: hard + +"strip-final-newline@npm:^2.0.0": + version: 2.0.0 + resolution: "strip-final-newline@npm:2.0.0" + checksum: 69412b5e25731e1938184b5d489c32e340605bb611d6140344abc3421b7f3c6f9984b21dff296dfcf056681b82caa3bb4cc996a965ce37bcfad663e92eae9c64 + languageName: node + linkType: hard + +"strip-final-newline@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-final-newline@npm:3.0.0" + checksum: 23ee263adfa2070cd0f23d1ac14e2ed2f000c9b44229aec9c799f1367ec001478469560abefd00c5c99ee6f0b31c137d53ec6029c53e9f32a93804e18c201050 + languageName: node + linkType: hard + +"strip-hex-prefix@npm:1.0.0": + version: 1.0.0 + resolution: "strip-hex-prefix@npm:1.0.0" + dependencies: + is-hex-prefixed: 1.0.0 + checksum: 4cafe7caee1d281d3694d14920fd5d3c11adf09371cef7e2ccedd5b83efd9e9bd2219b5d6ce6e809df6e0f437dc9d30db1192116580875698aad164a6d6b285b + languageName: node + linkType: hard + +"strip-indent@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-indent@npm:3.0.0" + dependencies: + min-indent: ^1.0.0 + checksum: 18f045d57d9d0d90cd16f72b2313d6364fd2cb4bf85b9f593523ad431c8720011a4d5f08b6591c9d580f446e78855c5334a30fb91aa1560f5d9f95ed1b4a0530 + languageName: node + linkType: hard + +"strip-json-comments@npm:3.1.1, strip-json-comments@npm:^3.1.1": + version: 3.1.1 + resolution: "strip-json-comments@npm:3.1.1" + checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 + languageName: node + linkType: hard + +"superstruct@npm:^2.0.2": + version: 2.0.2 + resolution: "superstruct@npm:2.0.2" + checksum: a5f75b72cb8b14b86f4f7f750dae8c5ab0e4e1d92414b55e7625bae07bbcafad81c92486e7e32ccacd6ae1f553caff2b92a50ff42ad5093fd35b9cb7f4e5ec86 + languageName: node + linkType: hard + +"supports-color@npm:^3.1.0": + version: 3.2.3 + resolution: "supports-color@npm:3.2.3" + dependencies: + has-flag: ^1.0.0 + checksum: 56afc05fa87d00100d90148c4d0a6e20a0af0d56dca5c54d4d40b2553ee737dab0ca4e8b53c4471afc035227b5b44dfa4824747a7f01ad733173536f7da6fbbb + languageName: node + linkType: hard + +"supports-color@npm:^5.3.0, supports-color@npm:^5.5.0": + version: 5.5.0 + resolution: "supports-color@npm:5.5.0" + dependencies: + has-flag: ^3.0.0 + checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac + languageName: node + linkType: hard + +"supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: ^4.0.0 + checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a + languageName: node + linkType: hard + +"supports-color@npm:^8.1.1": + version: 8.1.1 + resolution: "supports-color@npm:8.1.1" + dependencies: + has-flag: ^4.0.0 + checksum: c052193a7e43c6cdc741eb7f378df605636e01ad434badf7324f17fb60c69a880d8d8fcdcb562cf94c2350e57b937d7425ab5b8326c67c2adc48f7c87c1db406 + languageName: node + linkType: hard + +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 53b1e247e68e05db7b3808b99b892bd36fb096e6fba213a06da7fab22045e97597db425c724f2bbd6c99a3c295e1e73f3e4de78592289f38431049e1277ca0ae + languageName: node + linkType: hard + +"sync-request@npm:^6.0.0": + version: 6.1.0 + resolution: "sync-request@npm:6.1.0" + dependencies: + http-response-object: ^3.0.1 + sync-rpc: ^1.2.1 + then-request: ^6.0.0 + checksum: cc8438a6749f62fb501d022fae0e3af3ac4a9983f889f929c8721b328a1c3408b98ca218aad886785a02be2c34bd75eb1a5a2608bd1fcee3c8c099391ff53a11 + languageName: node + linkType: hard + +"sync-rpc@npm:^1.2.1": + version: 1.3.6 + resolution: "sync-rpc@npm:1.3.6" + dependencies: + get-port: ^3.1.0 + checksum: 4340974fb5641c2cadb9df18d6b791ed2327f28cf6d8a00c99ebc2278e37391e3f5e237596da2ff83d14d2147594c6f5b3b98a93b9327644db425d239dea172f + languageName: node + linkType: hard + +"table-layout@npm:^1.0.2": + version: 1.0.2 + resolution: "table-layout@npm:1.0.2" + dependencies: + array-back: ^4.0.1 + deep-extend: ~0.6.0 + typical: ^5.2.0 + wordwrapjs: ^4.0.0 + checksum: 8f41b5671f101a5195747ec1727b1d35ea2cd5bf85addda11cc2f4b36892db9696ce3c2c7334b5b8a122505b34d19135fede50e25678df71b0439e0704fd953f + languageName: node + linkType: hard + +"table@npm:^6.8.0, table@npm:^6.8.1": + version: 6.8.2 + resolution: "table@npm:6.8.2" + dependencies: + ajv: ^8.0.1 + lodash.truncate: ^4.4.2 + slice-ansi: ^4.0.0 + string-width: ^4.2.3 + strip-ansi: ^6.0.1 + checksum: 61188652f53a980d1759ca460ca8dea5c5322aece3210457e7084882f053c2b6a870041295e08a82cb1d676e31b056406845d94b0abf3c79a4b104777bec413b + languageName: node + linkType: hard + +"tar@npm:^6.1.11, tar@npm:^6.2.1": + version: 6.2.1 + resolution: "tar@npm:6.2.1" + dependencies: + chownr: ^2.0.0 + fs-minipass: ^2.0.0 + minipass: ^5.0.0 + minizlib: ^2.1.1 + mkdirp: ^1.0.3 + yallist: ^4.0.0 + checksum: f1322768c9741a25356c11373bce918483f40fa9a25c69c59410c8a1247632487edef5fe76c5f12ac51a6356d2f1829e96d2bc34098668a2fc34d76050ac2b6c + languageName: node + linkType: hard + +"text-encoding-utf-8@npm:^1.0.2": + version: 1.0.2 + resolution: "text-encoding-utf-8@npm:1.0.2" + checksum: ec4c15d50e738c5dba7327ad432ebf0725ec75d4d69c0bd55609254c5a3bc5341272d7003691084a0a73d60d981c8eb0e87603676fdb6f3fed60f4c9192309f9 + languageName: node + linkType: hard + +"text-extensions@npm:^1.0.0": + version: 1.9.0 + resolution: "text-extensions@npm:1.9.0" + checksum: 56a9962c1b62d39b2bcb369b7558ca85c1b55e554b38dfd725edcc0a1babe5815782a60c17ff6b839093b163dfebb92b804208aaaea616ec7571c8059ae0cf44 + languageName: node + linkType: hard + +"text-hex@npm:1.0.x": + version: 1.0.0 + resolution: "text-hex@npm:1.0.0" + checksum: 1138f68adc97bf4381a302a24e2352f04992b7b1316c5003767e9b0d3367ffd0dc73d65001ea02b07cd0ecc2a9d186de0cf02f3c2d880b8a522d4ccb9342244a + languageName: node + linkType: hard + +"text-table@npm:^0.2.0": + version: 0.2.0 + resolution: "text-table@npm:0.2.0" + checksum: b6937a38c80c7f84d9c11dd75e49d5c44f71d95e810a3250bd1f1797fc7117c57698204adf676b71497acc205d769d65c16ae8fa10afad832ae1322630aef10a + languageName: node + linkType: hard + +"then-request@npm:^6.0.0": + version: 6.0.2 + resolution: "then-request@npm:6.0.2" + dependencies: + "@types/concat-stream": ^1.6.0 + "@types/form-data": 0.0.33 + "@types/node": ^8.0.0 + "@types/qs": ^6.2.31 + caseless: ~0.12.0 + concat-stream: ^1.6.0 + form-data: ^2.2.0 + http-basic: ^8.1.1 + http-response-object: ^3.0.1 + promise: ^8.0.0 + qs: ^6.4.0 + checksum: a24a4fc95dd8591966bf3752f024f5cd4d53c2b2c29b23b4e40c3322df6a432d939bc17b589d8e9d760b90e92ab860f6f361a4dfcfe3542019e1615fb51afccc + languageName: node + linkType: hard + +"through2@npm:^4.0.0": + version: 4.0.2 + resolution: "through2@npm:4.0.2" + dependencies: + readable-stream: 3 + checksum: ac7430bd54ccb7920fd094b1c7ff3e1ad6edd94202e5528331253e5fde0cc56ceaa690e8df9895de2e073148c52dfbe6c4db74cacae812477a35660090960cc0 + languageName: node + linkType: hard + +"through@npm:>=2.2.7 <3, through@npm:^2.3.6": + version: 2.3.8 + resolution: "through@npm:2.3.8" + checksum: a38c3e059853c494af95d50c072b83f8b676a9ba2818dcc5b108ef252230735c54e0185437618596c790bbba8fcdaef5b290405981ffa09dce67b1f1bf190cbd + languageName: node + linkType: hard + +"tmp@npm:0.0.33, tmp@npm:^0.0.33": + version: 0.0.33 + resolution: "tmp@npm:0.0.33" + dependencies: + os-tmpdir: ~1.0.2 + checksum: 902d7aceb74453ea02abbf58c203f4a8fc1cead89b60b31e354f74ed5b3fb09ea817f94fb310f884a5d16987dd9fa5a735412a7c2dd088dd3d415aa819ae3a28 + languageName: node + linkType: hard + +"to-fast-properties@npm:^2.0.0": + version: 2.0.0 + resolution: "to-fast-properties@npm:2.0.0" + checksum: be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168 + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: ^7.0.0 + checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed + languageName: node + linkType: hard + +"toidentifier@npm:1.0.1": + version: 1.0.1 + resolution: "toidentifier@npm:1.0.1" + checksum: 952c29e2a85d7123239b5cfdd889a0dde47ab0497f0913d70588f19c53f7e0b5327c95f4651e413c74b785147f9637b17410ac8c846d5d4a20a5a33eb6dc3a45 + languageName: node + linkType: hard + +"touch@npm:^3.1.0": + version: 3.1.1 + resolution: "touch@npm:3.1.1" + bin: + nodetouch: bin/nodetouch.js + checksum: fb8c54207500eb760b6b9d77b9c5626cc027c9ad44431eed4268845f00f8c6bbfc95ce7e9da8e487f020aa921982a8bc5d8e909d0606e82686bd0a08a8e0539b + languageName: node + linkType: hard + +"tr46@npm:^4.1.1": + version: 4.1.1 + resolution: "tr46@npm:4.1.1" + dependencies: + punycode: ^2.3.0 + checksum: aeeb821ac2cd792e63ec84888b4fd6598ac6ed75d861579e21a5cf9d4ee78b2c6b94e7d45036f2ca2088bc85b9b46560ad23c4482979421063b24137349dbd96 + languageName: node + linkType: hard + +"tr46@npm:~0.0.3": + version: 0.0.3 + resolution: "tr46@npm:0.0.3" + checksum: 726321c5eaf41b5002e17ffbd1fb7245999a073e8979085dacd47c4b4e8068ff5777142fc6726d6ca1fd2ff16921b48788b87225cbc57c72636f6efa8efbffe3 + languageName: node + linkType: hard + +"trim-newlines@npm:^3.0.0": + version: 3.0.1 + resolution: "trim-newlines@npm:3.0.1" + checksum: b530f3fadf78e570cf3c761fb74fef655beff6b0f84b29209bac6c9622db75ad1417f4a7b5d54c96605dcd72734ad44526fef9f396807b90839449eb543c6206 + languageName: node + linkType: hard + +"triple-beam@npm:^1.3.0": + version: 1.4.1 + resolution: "triple-beam@npm:1.4.1" + checksum: 2e881a3e8e076b6f2b85b9ec9dd4a900d3f5016e6d21183ed98e78f9abcc0149e7d54d79a3f432b23afde46b0885bdcdcbff789f39bc75de796316961ec07f61 + languageName: node + linkType: hard + +"ts-api-utils@npm:^1.0.1": + version: 1.3.0 + resolution: "ts-api-utils@npm:1.3.0" + peerDependencies: + typescript: ">=4.2.0" + checksum: c746ddabfdffbf16cb0b0db32bb287236a19e583057f8649ee7c49995bb776e1d3ef384685181c11a1a480369e022ca97512cb08c517b2d2bd82c83754c97012 + languageName: node + linkType: hard + +"ts-command-line-args@npm:^2.2.0": + version: 2.5.1 + resolution: "ts-command-line-args@npm:2.5.1" + dependencies: + chalk: ^4.1.0 + command-line-args: ^5.1.1 + command-line-usage: ^6.1.0 + string-format: ^2.0.0 + bin: + write-markdown: dist/write-markdown.js + checksum: 7c0a7582e94f1d2160e3dd379851ec4f1758bc673ccd71bae07f839f83051b6b83e0ae14325c2d04ea728e5bde7b7eacfd2ab060b8fd4b8ab29e0bbf77f6c51e + languageName: node + linkType: hard + +"ts-essentials@npm:^1.0.0": + version: 1.0.4 + resolution: "ts-essentials@npm:1.0.4" + checksum: 2e19bbe51203707ca732dcc6c3f238b2cf22bb9213d26ae0246c02325fb3e5f17c32505ac79c1bd538b7951a798155b07422e263a95cb295070a48233e45a1b5 + languageName: node + linkType: hard + +"ts-essentials@npm:^7.0.1": + version: 7.0.3 + resolution: "ts-essentials@npm:7.0.3" + peerDependencies: + typescript: ">=3.7.0" + checksum: 74d75868acf7f8b95e447d8b3b7442ca21738c6894e576df9917a352423fde5eb43c5651da5f78997da6061458160ae1f6b279150b42f47ccc58b73e55acaa2f + languageName: node + linkType: hard + +"ts-generator@npm:^0.1.1": + version: 0.1.1 + resolution: "ts-generator@npm:0.1.1" + dependencies: + "@types/mkdirp": ^0.5.2 + "@types/prettier": ^2.1.1 + "@types/resolve": ^0.0.8 + chalk: ^2.4.1 + glob: ^7.1.2 + mkdirp: ^0.5.1 + prettier: ^2.1.2 + resolve: ^1.8.1 + ts-essentials: ^1.0.0 + bin: + ts-generator: dist/cli/run.js + checksum: 3add2e76afd7a4d9d9aee1ff26477ee4e8b4cc740b35787f9ea780c11aefc88e6c7833837eacc12b944c1883680639dc9cc47fe173eff95c62112f3a41132146 + languageName: node + linkType: hard + +"ts-node@npm:^10.8.1, ts-node@npm:^10.9.1": + version: 10.9.2 + resolution: "ts-node@npm:10.9.2" + dependencies: + "@cspotcode/source-map-support": ^0.8.0 + "@tsconfig/node10": ^1.0.7 + "@tsconfig/node12": ^1.0.7 + "@tsconfig/node14": ^1.0.0 + "@tsconfig/node16": ^1.0.2 + acorn: ^8.4.1 + acorn-walk: ^8.1.1 + arg: ^4.1.0 + create-require: ^1.1.0 + diff: ^4.0.1 + make-error: ^1.1.1 + v8-compile-cache-lib: ^3.0.1 + yn: 3.1.1 + peerDependencies: + "@swc/core": ">=1.2.50" + "@swc/wasm": ">=1.2.50" + "@types/node": "*" + typescript: ">=2.7" + peerDependenciesMeta: + "@swc/core": + optional: true + "@swc/wasm": + optional: true + bin: + ts-node: dist/bin.js + ts-node-cwd: dist/bin-cwd.js + ts-node-esm: dist/bin-esm.js + ts-node-script: dist/bin-script.js + ts-node-transpile-only: dist/bin-transpile.js + ts-script: dist/bin-script-deprecated.js + checksum: fde256c9073969e234526e2cfead42591b9a2aec5222bac154b0de2fa9e4ceb30efcd717ee8bc785a56f3a119bdd5aa27b333d9dbec94ed254bd26f8944c67ac + languageName: node + linkType: hard + +"tslib@npm:2.4.0": + version: 2.4.0 + resolution: "tslib@npm:2.4.0" + checksum: 8c4aa6a3c5a754bf76aefc38026134180c053b7bd2f81338cb5e5ebf96fefa0f417bff221592bf801077f5bf990562f6264fecbc42cd3309b33872cb6fc3b113 + languageName: node + linkType: hard + +"tslib@npm:^1.8.1, tslib@npm:^1.9.3": + version: 1.14.1 + resolution: "tslib@npm:1.14.1" + checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd + languageName: node + linkType: hard + +"tslib@npm:^2.1.0, tslib@npm:^2.4.0": + version: 2.7.0 + resolution: "tslib@npm:2.7.0" + checksum: 1606d5c89f88d466889def78653f3aab0f88692e80bb2066d090ca6112ae250ec1cfa9dbfaab0d17b60da15a4186e8ec4d893801c67896b277c17374e36e1d28 + languageName: node + linkType: hard + +"tsort@npm:0.0.1": + version: 0.0.1 + resolution: "tsort@npm:0.0.1" + checksum: 581566c248690b9ea7e431e1545affb3d2cab0f5dcd0e45ddef815dfaec4864cb5f0cfd8072924dedbc0de9585ff07e3e65db60f14fab4123737b9bb6e72eacc + languageName: node + linkType: hard + +"tsutils@npm:^3.21.0": + version: 3.21.0 + resolution: "tsutils@npm:3.21.0" + dependencies: + tslib: ^1.8.1 + peerDependencies: + typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + checksum: 1843f4c1b2e0f975e08c4c21caa4af4f7f65a12ac1b81b3b8489366826259323feb3fc7a243123453d2d1a02314205a7634e048d4a8009921da19f99755cdc48 + languageName: node + linkType: hard + +"tweetnacl-util@npm:^0.15.1": + version: 0.15.1 + resolution: "tweetnacl-util@npm:0.15.1" + checksum: ae6aa8a52cdd21a95103a4cc10657d6a2040b36c7a6da7b9d3ab811c6750a2d5db77e8c36969e75fdee11f511aa2b91c552496c6e8e989b6e490e54aca2864fc + languageName: node + linkType: hard + +"tweetnacl@npm:^1.0.3": + version: 1.0.3 + resolution: "tweetnacl@npm:1.0.3" + checksum: e4a57cac188f0c53f24c7a33279e223618a2bfb5fea426231991652a13247bea06b081fd745d71291fcae0f4428d29beba1b984b1f1ce6f66b06a6d1ab90645c + languageName: node + linkType: hard + +"type-check@npm:^0.4.0, type-check@npm:~0.4.0": + version: 0.4.0 + resolution: "type-check@npm:0.4.0" + dependencies: + prelude-ls: ^1.2.1 + checksum: ec688ebfc9c45d0c30412e41ca9c0cdbd704580eb3a9ccf07b9b576094d7b86a012baebc95681999dd38f4f444afd28504cb3a89f2ef16b31d4ab61a0739025a + languageName: node + linkType: hard + +"type-check@npm:~0.3.2": + version: 0.3.2 + resolution: "type-check@npm:0.3.2" + dependencies: + prelude-ls: ~1.1.2 + checksum: dd3b1495642731bc0e1fc40abe5e977e0263005551ac83342ecb6f4f89551d106b368ec32ad3fb2da19b3bd7b2d1f64330da2ea9176d8ddbfe389fb286eb5124 + languageName: node + linkType: hard + +"type-detect@npm:^4.0.0, type-detect@npm:^4.1.0": + version: 4.1.0 + resolution: "type-detect@npm:4.1.0" + checksum: 3b32f873cd02bc7001b00a61502b7ddc4b49278aabe68d652f732e1b5d768c072de0bc734b427abf59d0520a5f19a2e07309ab921ef02018fa1cb4af155cdb37 + languageName: node + linkType: hard + +"type-fest@npm:^0.18.0": + version: 0.18.1 + resolution: "type-fest@npm:0.18.1" + checksum: e96dcee18abe50ec82dab6cbc4751b3a82046da54c52e3b2d035b3c519732c0b3dd7a2fa9df24efd1a38d953d8d4813c50985f215f1957ee5e4f26b0fe0da395 + languageName: node + linkType: hard + +"type-fest@npm:^0.20.2": + version: 0.20.2 + resolution: "type-fest@npm:0.20.2" + checksum: 4fb3272df21ad1c552486f8a2f8e115c09a521ad7a8db3d56d53718d0c907b62c6e9141ba5f584af3f6830d0872c521357e512381f24f7c44acae583ad517d73 + languageName: node + linkType: hard + +"type-fest@npm:^0.21.3": + version: 0.21.3 + resolution: "type-fest@npm:0.21.3" + checksum: e6b32a3b3877f04339bae01c193b273c62ba7bfc9e325b8703c4ee1b32dc8fe4ef5dfa54bf78265e069f7667d058e360ae0f37be5af9f153b22382cd55a9afe0 + languageName: node + linkType: hard + +"type-fest@npm:^0.6.0": + version: 0.6.0 + resolution: "type-fest@npm:0.6.0" + checksum: b2188e6e4b21557f6e92960ec496d28a51d68658018cba8b597bd3ef757721d1db309f120ae987abeeda874511d14b776157ff809f23c6d1ce8f83b9b2b7d60f + languageName: node + linkType: hard + +"type-fest@npm:^0.7.1": + version: 0.7.1 + resolution: "type-fest@npm:0.7.1" + checksum: 5b1b113529d59949d97b76977d545989ddc11b81bb0c766b6d2ccc65473cb4b4a5c7d24f5be2c2bb2de302a5d7a13c1732ea1d34c8c59b7e0ec1f890cf7fc424 + languageName: node + linkType: hard + +"type-fest@npm:^0.8.1": + version: 0.8.1 + resolution: "type-fest@npm:0.8.1" + checksum: d61c4b2eba24009033ae4500d7d818a94fd6d1b481a8111612ee141400d5f1db46f199c014766b9fa9b31a6a7374d96fc748c6d688a78a3ce5a33123839becb7 + languageName: node + linkType: hard + +"type-fest@npm:^1.0.2": + version: 1.4.0 + resolution: "type-fest@npm:1.4.0" + checksum: b011c3388665b097ae6a109a437a04d6f61d81b7357f74cbcb02246f2f5bd72b888ae33631b99871388122ba0a87f4ff1c94078e7119ff22c70e52c0ff828201 + languageName: node + linkType: hard + +"typechain@npm:^8.1.1": + version: 8.3.2 + resolution: "typechain@npm:8.3.2" + 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 + peerDependencies: + typescript: ">=4.3.0" + bin: + typechain: dist/cli/cli.js + checksum: 146a1896fa93403404be78757790b0f95b5457efebcca16b61622e09c374d555ef4f837c1c4eedf77e03abc50276d96a2f33064ec09bb802f62d8cc2b13fce70 + languageName: node + linkType: hard + +"typedarray@npm:^0.0.6": + version: 0.0.6 + resolution: "typedarray@npm:0.0.6" + checksum: 33b39f3d0e8463985eeaeeacc3cb2e28bc3dfaf2a5ed219628c0b629d5d7b810b0eb2165f9f607c34871d5daa92ba1dc69f49051cf7d578b4cbd26c340b9d1b1 + languageName: node + linkType: hard + +"typescript@npm:^4.6.4 || ^5.2.2, typescript@npm:^5.2.2": + version: 5.6.2 + resolution: "typescript@npm:5.6.2" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 48777e1dabd9044519f56cd012b0296e3b72bafe12b7e8e34222751d45c67e0eba5387ecdaa6c14a53871a29361127798df6dc8d1d35643a0a47cb0b1c65a33a + languageName: node + linkType: hard + +"typescript@npm:^4.9.3": + version: 4.9.5 + resolution: "typescript@npm:4.9.5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: ee000bc26848147ad423b581bd250075662a354d84f0e06eb76d3b892328d8d4440b7487b5a83e851b12b255f55d71835b008a66cbf8f255a11e4400159237db + languageName: node + linkType: hard + +"typescript@patch:typescript@^4.6.4 || ^5.2.2#~builtin, typescript@patch:typescript@^5.2.2#~builtin": + version: 5.6.2 + resolution: "typescript@patch:typescript@npm%3A5.6.2#~builtin::version=5.6.2&hash=7ad353" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: c084ee1ab865f108c787e6233a5f63c126c482c0c8e87ec998ac5288a2ad54b603e1ea8b8b272355823b833eb31b9fabb99e8c6152283e1cb47e3a76bd6faf6c + languageName: node + linkType: hard + +"typescript@patch:typescript@^4.9.3#~builtin": + version: 4.9.5 + resolution: "typescript@patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=7ad353" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 2eee5c37cad4390385db5db5a8e81470e42e8f1401b0358d7390095d6f681b410f2c4a0c496c6ff9ebd775423c7785cdace7bcdad76c7bee283df3d9718c0f20 + languageName: node + linkType: hard + +"typical@npm:^4.0.0": + version: 4.0.0 + resolution: "typical@npm:4.0.0" + checksum: a242081956825328f535e6195a924240b34daf6e7fdb573a1809a42b9f37fb8114fa99c7ab89a695e0cdb419d4149d067f6723e4b95855ffd39c6c4ca378efb3 + languageName: node + linkType: hard + +"typical@npm:^5.2.0": + version: 5.2.0 + resolution: "typical@npm:5.2.0" + checksum: ccaeb151a9a556291b495571ca44c4660f736fb49c29314bbf773c90fad92e9485d3cc2b074c933866c1595abbbc962f2b8bfc6e0f52a8c6b0cdd205442036ac + languageName: node + linkType: hard + +"uglify-js@npm:^3.1.4": + version: 3.19.3 + resolution: "uglify-js@npm:3.19.3" + bin: + uglifyjs: bin/uglifyjs + checksum: 7ed6272fba562eb6a3149cfd13cda662f115847865c03099e3995a0e7a910eba37b82d4fccf9e88271bb2bcbe505bb374967450f433c17fa27aa36d94a8d0553 + languageName: node + linkType: hard + +"undefsafe@npm:^2.0.5": + version: 2.0.5 + resolution: "undefsafe@npm:2.0.5" + checksum: f42ab3b5770fedd4ada175fc1b2eb775b78f609156f7c389106aafd231bfc210813ee49f54483d7191d7b76e483bc7f537b5d92d19ded27156baf57592eb02cc + languageName: node + linkType: hard + +"undici-types@npm:~5.26.4": + version: 5.26.5 + resolution: "undici-types@npm:5.26.5" + checksum: 3192ef6f3fd5df652f2dc1cd782b49d6ff14dc98e5dced492aa8a8c65425227da5da6aafe22523c67f035a272c599bb89cfe803c1db6311e44bed3042fc25487 + languageName: node + linkType: hard + +"undici-types@npm:~6.19.2": + version: 6.19.8 + resolution: "undici-types@npm:6.19.8" + checksum: de51f1b447d22571cf155dfe14ff6d12c5bdaec237c765085b439c38ca8518fc360e88c70f99469162bf2e14188a7b0bcb06e1ed2dc031042b984b0bb9544017 + languageName: node + linkType: hard + +"undici@npm:^5.14.0": + version: 5.28.4 + resolution: "undici@npm:5.28.4" + dependencies: + "@fastify/busboy": ^2.0.0 + checksum: a8193132d84540e4dc1895ecc8dbaa176e8a49d26084d6fbe48a292e28397cd19ec5d13bc13e604484e76f94f6e334b2bdc740d5f06a6e50c44072818d0c19f9 + languageName: node + linkType: hard + +"unique-filename@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-filename@npm:3.0.0" + dependencies: + unique-slug: ^4.0.0 + checksum: 8e2f59b356cb2e54aab14ff98a51ac6c45781d15ceaab6d4f1c2228b780193dc70fae4463ce9e1df4479cb9d3304d7c2043a3fb905bdeca71cc7e8ce27e063df + languageName: node + linkType: hard + +"unique-slug@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-slug@npm:4.0.0" + dependencies: + imurmurhash: ^0.1.4 + checksum: 0884b58365af59f89739e6f71e3feacb5b1b41f2df2d842d0757933620e6de08eff347d27e9d499b43c40476cbaf7988638d3acb2ffbcb9d35fd035591adfd15 + languageName: node + linkType: hard + +"universalify@npm:^0.1.0": + version: 0.1.2 + resolution: "universalify@npm:0.1.2" + checksum: 40cdc60f6e61070fe658ca36016a8f4ec216b29bf04a55dce14e3710cc84c7448538ef4dad3728d0bfe29975ccd7bfb5f414c45e7b78883567fb31b246f02dff + languageName: node + linkType: hard + +"universalify@npm:^2.0.0": + version: 2.0.1 + resolution: "universalify@npm:2.0.1" + checksum: ecd8469fe0db28e7de9e5289d32bd1b6ba8f7183db34f3bfc4ca53c49891c2d6aa05f3fb3936a81285a905cc509fb641a0c3fc131ec786167eff41236ae32e60 + languageName: node + linkType: hard + +"unpipe@npm:1.0.0": + version: 1.0.0 + resolution: "unpipe@npm:1.0.0" + checksum: 4fa18d8d8d977c55cb09715385c203197105e10a6d220087ec819f50cb68870f02942244f1017565484237f1f8c5d3cd413631b1ae104d3096f24fdfde1b4aa2 + languageName: node + linkType: hard + +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: ^2.1.0 + checksum: 7167432de6817fe8e9e0c9684f1d2de2bb688c94388f7569f7dbdb1587c9f4ca2a77962f134ec90be0cc4d004c939ff0d05acc9f34a0db39a3c797dada262633 + languageName: node + linkType: hard + +"utf-8-validate@npm:^5.0.2": + version: 5.0.10 + resolution: "utf-8-validate@npm:5.0.10" + dependencies: + node-gyp: latest + node-gyp-build: ^4.3.0 + checksum: 5579350a023c66a2326752b6c8804cc7b39dcd251bb088241da38db994b8d78352e388dcc24ad398ab98385ba3c5ffcadb6b5b14b2637e43f767869055e46ba6 + languageName: node + linkType: hard + +"utf8@npm:3.0.0": + version: 3.0.0 + resolution: "utf8@npm:3.0.0" + checksum: cb89a69ad9ab393e3eae9b25305b3ff08bebca9adc839191a34f90777eb2942f86a96369d2839925fea58f8f722f7e27031d697f10f5f39690f8c5047303e62d + languageName: node + linkType: hard + +"util-deprecate@npm:^1.0.1, util-deprecate@npm:~1.0.1": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 + languageName: node + linkType: hard + +"uuid@npm:^8.3.2": + version: 8.3.2 + resolution: "uuid@npm:8.3.2" + bin: + uuid: dist/bin/uuid + checksum: 5575a8a75c13120e2f10e6ddc801b2c7ed7d8f3c8ac22c7ed0c7b2ba6383ec0abda88c905085d630e251719e0777045ae3236f04c812184b7c765f63a70e58df + languageName: node + linkType: hard + +"v8-compile-cache-lib@npm:^3.0.1": + version: 3.0.1 + resolution: "v8-compile-cache-lib@npm:3.0.1" + checksum: 78089ad549e21bcdbfca10c08850022b22024cdcc2da9b168bcf5a73a6ed7bf01a9cebb9eac28e03cd23a684d81e0502797e88f3ccd27a32aeab1cfc44c39da0 + languageName: node + linkType: hard + +"validate-npm-package-license@npm:^3.0.1": + version: 3.0.4 + resolution: "validate-npm-package-license@npm:3.0.4" + dependencies: + spdx-correct: ^3.0.0 + spdx-expression-parse: ^3.0.0 + checksum: 35703ac889d419cf2aceef63daeadbe4e77227c39ab6287eeb6c1b36a746b364f50ba22e88591f5d017bc54685d8137bc2d328d0a896e4d3fd22093c0f32a9ad + languageName: node + linkType: hard + +"viem@npm:^2.9.28": + version: 2.21.6 + resolution: "viem@npm:2.21.6" + dependencies: + "@adraffy/ens-normalize": 1.10.0 + "@noble/curves": 1.4.0 + "@noble/hashes": 1.4.0 + "@scure/bip32": 1.4.0 + "@scure/bip39": 1.4.0 + abitype: 1.0.5 + isows: 1.0.4 + webauthn-p256: 0.0.5 + ws: 8.17.1 + peerDependencies: + typescript: ">=5.0.4" + peerDependenciesMeta: + typescript: + optional: true + checksum: 6cbcadb178f78b5b0fc73dcd956efeecd3c3da0e86de47154e16c665e5a6f3e495e78ec620a9e8ec63d32afdb93b0f3de8ce60812c76776614ed40434f6bbaf1 + languageName: node + linkType: hard + +"wcwidth@npm:^1.0.1": + version: 1.0.1 + resolution: "wcwidth@npm:1.0.1" + dependencies: + defaults: ^1.0.3 + checksum: 814e9d1ddcc9798f7377ffa448a5a3892232b9275ebb30a41b529607691c0491de47cba426e917a4d08ded3ee7e9ba2f3fe32e62ee3cd9c7d3bafb7754bd553c + languageName: node + linkType: hard + +"web3-utils@npm:^1.3.6": + version: 1.10.4 + resolution: "web3-utils@npm:1.10.4" + dependencies: + "@ethereumjs/util": ^8.1.0 + bn.js: ^5.2.1 + ethereum-bloom-filters: ^1.0.6 + ethereum-cryptography: ^2.1.2 + ethjs-unit: 0.1.6 + number-to-bn: 1.7.0 + randombytes: ^2.1.0 + utf8: 3.0.0 + checksum: a1535817a4653f1b5cc868aa19305158122379078a41e13642e1ba64803f6f8e5dd2fb8c45c033612b8f52dde42d8008afce85296c0608276fe1513dece66a49 + languageName: node + linkType: hard + +"webauthn-p256@npm:0.0.5": + version: 0.0.5 + resolution: "webauthn-p256@npm:0.0.5" + dependencies: + "@noble/curves": ^1.4.0 + "@noble/hashes": ^1.4.0 + checksum: 2837188d1e6d947c87c5728374fb6aec96387cb766f78e7a04d5903774264feb278d68a639748f09997f591e5278796c662bb5c4e8b8286b0f22254694023584 + languageName: node + linkType: hard + +"webidl-conversions@npm:^3.0.0": + version: 3.0.1 + resolution: "webidl-conversions@npm:3.0.1" + checksum: c92a0a6ab95314bde9c32e1d0a6dfac83b578f8fa5f21e675bc2706ed6981bc26b7eb7e6a1fab158e5ce4adf9caa4a0aee49a52505d4d13c7be545f15021b17c + languageName: node + linkType: hard + +"webidl-conversions@npm:^7.0.0": + version: 7.0.0 + resolution: "webidl-conversions@npm:7.0.0" + checksum: f05588567a2a76428515333eff87200fae6c83c3948a7482ebb109562971e77ef6dc49749afa58abb993391227c5697b3ecca52018793e0cb4620a48f10bd21b + languageName: node + linkType: hard + +"whatwg-url@npm:^13.0.0": + version: 13.0.0 + resolution: "whatwg-url@npm:13.0.0" + dependencies: + tr46: ^4.1.1 + webidl-conversions: ^7.0.0 + checksum: 7f69272a1bfd5f0d994988b9e234e35d21071a9bffe0d6fd4477d295552665c566b176ff8e0251a0a79c61c5a67a7a392e248aae5887d7e22bdff0125209e26b + languageName: node + linkType: hard + +"whatwg-url@npm:^5.0.0": + version: 5.0.0 + resolution: "whatwg-url@npm:5.0.0" + dependencies: + tr46: ~0.0.3 + webidl-conversions: ^3.0.0 + checksum: b8daed4ad3356cc4899048a15b2c143a9aed0dfae1f611ebd55073310c7b910f522ad75d727346ad64203d7e6c79ef25eafd465f4d12775ca44b90fa82ed9e2c + languageName: node + linkType: hard + +"which@npm:^1.1.1, which@npm:^1.2.14, which@npm:^1.3.1": + version: 1.3.1 + resolution: "which@npm:1.3.1" + dependencies: + isexe: ^2.0.0 + bin: + which: ./bin/which + checksum: f2e185c6242244b8426c9df1510e86629192d93c1a986a7d2a591f2c24869e7ffd03d6dac07ca863b2e4c06f59a4cc9916c585b72ee9fa1aa609d0124df15e04 + languageName: node + linkType: hard + +"which@npm:^2.0.1": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: ^2.0.0 + bin: + node-which: ./bin/node-which + checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 + languageName: node + linkType: hard + +"which@npm:^4.0.0": + version: 4.0.0 + resolution: "which@npm:4.0.0" + dependencies: + isexe: ^3.1.1 + bin: + node-which: bin/which.js + checksum: f17e84c042592c21e23c8195108cff18c64050b9efb8459589116999ea9da6dd1509e6a1bac3aeebefd137be00fabbb61b5c2bc0aa0f8526f32b58ee2f545651 + languageName: node + linkType: hard + +"winston-transport@npm:^4.7.0": + version: 4.7.1 + resolution: "winston-transport@npm:4.7.1" + dependencies: + logform: ^2.6.1 + readable-stream: ^3.6.2 + triple-beam: ^1.3.0 + checksum: e1dc070df1eb2ab0270a369fd7e8ff2b7a714ba9cf9a3f2c9a3509eb5fe60667c64e5cd4f37b3dd64a21017a93ea63fdcb2ac9176b12d2222a9e4244439d1b35 + languageName: node + linkType: hard + +"winston@npm:^3.11.0": + version: 3.14.2 + resolution: "winston@npm:3.14.2" + dependencies: + "@colors/colors": ^1.6.0 + "@dabh/diagnostics": ^2.0.2 + async: ^3.2.3 + is-stream: ^2.0.0 + logform: ^2.6.0 + one-time: ^1.0.0 + readable-stream: ^3.4.0 + safe-stable-stringify: ^2.3.1 + stack-trace: 0.0.x + triple-beam: ^1.3.0 + winston-transport: ^4.7.0 + checksum: 9021637d3ab1d1e639d64e7217ed5ae63fb0e5325defdbce439f708e9b4e26c7a31eb4a731106790aa8ac6f80a3a89242de18d1991ab3838f9d84e55101f4607 + languageName: node + linkType: hard + +"word-wrap@npm:^1.0.3, word-wrap@npm:^1.2.5, word-wrap@npm:~1.2.3": + version: 1.2.5 + resolution: "word-wrap@npm:1.2.5" + checksum: f93ba3586fc181f94afdaff3a6fef27920b4b6d9eaefed0f428f8e07adea2a7f54a5f2830ce59406c8416f033f86902b91eb824072354645eea687dff3691ccb + languageName: node + linkType: hard + +"wordwrap@npm:^1.0.0": + version: 1.0.0 + resolution: "wordwrap@npm:1.0.0" + checksum: 2a44b2788165d0a3de71fd517d4880a8e20ea3a82c080ce46e294f0b68b69a2e49cff5f99c600e275c698a90d12c5ea32aff06c311f0db2eb3f1201f3e7b2a04 + languageName: node + linkType: hard + +"wordwrapjs@npm:^4.0.0": + version: 4.0.1 + resolution: "wordwrapjs@npm:4.0.1" + dependencies: + reduce-flatten: ^2.0.0 + typical: ^5.2.0 + checksum: 3d927f3c95d0ad990968da54c0ad8cde2801d8e91006cd7474c26e6b742cc8557250ce495c9732b2f9db1f903601cb74ec282e0f122ee0d02d7abe81e150eea8 + languageName: node + linkType: hard + +"workerpool@npm:^6.5.1": + version: 6.5.1 + resolution: "workerpool@npm:6.5.1" + checksum: f86d13f9139c3a57c5a5867e81905cd84134b499849405dec2ffe5b1acd30dabaa1809f6f6ee603a7c65e1e4325f21509db6b8398eaf202c8b8f5809e26a2e16 + languageName: node + linkType: hard + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: ^4.0.0 + string-width: ^4.1.0 + strip-ansi: ^6.0.0 + checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.0.1, wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: ^6.1.0 + string-width: ^5.0.1 + strip-ansi: ^7.0.1 + checksum: 371733296dc2d616900ce15a0049dca0ef67597d6394c57347ba334393599e800bab03c41d4d45221b6bc967b8c453ec3ae4749eff3894202d16800fdfe0e238 + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 + languageName: node + linkType: hard + +"ws@npm:7.4.6": + version: 7.4.6 + resolution: "ws@npm:7.4.6" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 3a990b32ed08c72070d5e8913e14dfcd831919205be52a3ff0b4cdd998c8d554f167c9df3841605cde8b11d607768cacab3e823c58c96a5c08c987e093eb767a + languageName: node + linkType: hard + +"ws@npm:8.17.1": + version: 8.17.1 + resolution: "ws@npm:8.17.1" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 442badcce1f1178ec87a0b5372ae2e9771e07c4929a3180321901f226127f252441e8689d765aa5cfba5f50ac60dd830954afc5aeae81609aefa11d3ddf5cecf + languageName: node + linkType: hard + +"ws@npm:^7.4.6, ws@npm:^7.5.10": + version: 7.5.10 + resolution: "ws@npm:7.5.10" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: f9bb062abf54cc8f02d94ca86dcd349c3945d63851f5d07a3a61c2fcb755b15a88e943a63cf580cbdb5b74436d67ef6b67f745b8f7c0814e411379138e1863cb + languageName: node + linkType: hard + +"ws@npm:^8.5.0": + version: 8.18.0 + resolution: "ws@npm:8.18.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 91d4d35bc99ff6df483bdf029b9ea4bfd7af1f16fc91231a96777a63d263e1eabf486e13a2353970efc534f9faa43bdbf9ee76525af22f4752cbc5ebda333975 + languageName: node + linkType: hard + +"y18n@npm:^5.0.5": + version: 5.0.8 + resolution: "y18n@npm:5.0.8" + checksum: 54f0fb95621ee60898a38c572c515659e51cc9d9f787fb109cef6fde4befbe1c4602dc999d30110feee37456ad0f1660fa2edcfde6a9a740f86a290999550d30 + languageName: node + linkType: hard + +"yallist@npm:^3.0.2": + version: 3.1.1 + resolution: "yallist@npm:3.1.1" + checksum: 48f7bb00dc19fc635a13a39fe547f527b10c9290e7b3e836b9a8f1ca04d4d342e85714416b3c2ab74949c9c66f9cebb0473e6bc353b79035356103b47641285d + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 + languageName: node + linkType: hard + +"yaml@npm:2.3.1": + version: 2.3.1 + resolution: "yaml@npm:2.3.1" + checksum: 2c7bc9a7cd4c9f40d3b0b0a98e370781b68b8b7c4515720869aced2b00d92f5da1762b4ffa947f9e795d6cd6b19f410bd4d15fdd38aca7bd96df59bd9486fb54 + languageName: node + linkType: hard + +"yaml@npm:^2.2.2": + version: 2.5.1 + resolution: "yaml@npm:2.5.1" + bin: + yaml: bin.mjs + checksum: 31275223863fbd0b47ba9d2b248fbdf085db8d899e4ca43fff8a3a009497c5741084da6871d11f40e555d61360951c4c910b98216c1325d2c94753c0036d8172 + languageName: node + linkType: hard + +"yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3, yargs-parser@npm:^20.2.9": + version: 20.2.9 + resolution: "yargs-parser@npm:20.2.9" + checksum: 8bb69015f2b0ff9e17b2c8e6bfe224ab463dd00ca211eece72a4cd8a906224d2703fb8a326d36fdd0e68701e201b2a60ed7cf81ce0fd9b3799f9fe7745977ae3 + languageName: node + linkType: hard + +"yargs-parser@npm:^21.1.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: ed2d96a616a9e3e1cc7d204c62ecc61f7aaab633dcbfab2c6df50f7f87b393993fe6640d017759fe112d0cb1e0119f2b4150a87305cc873fd90831c6a58ccf1c + languageName: node + linkType: hard + +"yargs-unparser@npm:^2.0.0": + version: 2.0.0 + resolution: "yargs-unparser@npm:2.0.0" + dependencies: + camelcase: ^6.0.0 + decamelize: ^4.0.0 + flat: ^5.0.2 + is-plain-obj: ^2.1.0 + checksum: 68f9a542c6927c3768c2f16c28f71b19008710abd6b8f8efbac6dcce26bbb68ab6503bed1d5994bdbc2df9a5c87c161110c1dfe04c6a3fe5c6ad1b0e15d9a8a3 + languageName: node + linkType: hard + +"yargs@npm:^16.2.0": + version: 16.2.0 + resolution: "yargs@npm:16.2.0" + dependencies: + cliui: ^7.0.2 + escalade: ^3.1.1 + get-caller-file: ^2.0.5 + require-directory: ^2.1.1 + string-width: ^4.2.0 + y18n: ^5.0.5 + yargs-parser: ^20.2.2 + checksum: b14afbb51e3251a204d81937c86a7e9d4bdbf9a2bcee38226c900d00f522969ab675703bee2a6f99f8e20103f608382936034e64d921b74df82b63c07c5e8f59 + languageName: node + linkType: hard + +"yargs@npm:^17.0.0": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" + dependencies: + cliui: ^8.0.1 + escalade: ^3.1.1 + get-caller-file: ^2.0.5 + require-directory: ^2.1.1 + string-width: ^4.2.3 + y18n: ^5.0.5 + yargs-parser: ^21.1.1 + checksum: 73b572e863aa4a8cbef323dd911d79d193b772defd5a51aab0aca2d446655216f5002c42c5306033968193bdbf892a7a4c110b0d77954a7fdf563e653967b56a + languageName: node + linkType: hard + +"yn@npm:3.1.1": + version: 3.1.1 + resolution: "yn@npm:3.1.1" + checksum: 2c487b0e149e746ef48cda9f8bad10fc83693cd69d7f9dcd8be4214e985de33a29c9e24f3c0d6bcf2288427040a8947406ab27f7af67ee9456e6b84854f02dd6 + languageName: node + linkType: hard + +"yocto-queue@npm:^0.1.0": + version: 0.1.0 + resolution: "yocto-queue@npm:0.1.0" + checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 + languageName: node + linkType: hard + +"zksync-web3@npm:^0.14.3": + version: 0.14.4 + resolution: "zksync-web3@npm:0.14.4" + peerDependencies: + ethers: ^5.7.0 + checksum: f702a3437f48a8d42c4bb35b8dd13671a168aadfc4e23ce723d62959220ccb6bf9c529c60331fe5b91afaa622147c6a37490551474fe3e35c06ac476524b5160 + languageName: node + linkType: hard From 10f1856f55fc6868211a20a8c3753451d21694f5 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Fri, 13 Sep 2024 18:51:20 +0800 Subject: [PATCH 252/297] chore(reporter): update reporters and adapters configs --- .../adapters/LayerZero/LayerZeroReporter.sol | 10 +- packages/reporter/.env.example | 183 ++++++++++-------- packages/reporter/src/index.ts | 12 -- packages/reporter/src/settings/index.ts | 180 ++++++++++++++++- 4 files changed, 281 insertions(+), 104 deletions(-) diff --git a/packages/evm/contracts/adapters/LayerZero/LayerZeroReporter.sol b/packages/evm/contracts/adapters/LayerZero/LayerZeroReporter.sol index eb7566e7..69986c4d 100644 --- a/packages/evm/contracts/adapters/LayerZero/LayerZeroReporter.sol +++ b/packages/evm/contracts/adapters/LayerZero/LayerZeroReporter.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; -import { ILayerZeroEndpointV2, MessagingParams } from "./interfaces/ILayerZeroEndpointV2.sol"; +import { ILayerZeroEndpointV2, MessagingParams, MessagingFee, MessagingReceipt } from "./interfaces/ILayerZeroEndpointV2.sol"; import { Reporter } from "../Reporter.sol"; import { OptionsBuilder } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/libs/OptionsBuilder.sol"; import { OAppCore } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/OAppCore.sol"; @@ -52,7 +52,6 @@ contract LayerZeroReporter is Reporter, Ownable, OAppCore { function oAppVersion() public pure virtual override returns (uint64 senderVersion, uint64 receiverVersion) { return (1, 1); } - function _dispatch( uint256 targetChainId, address adapter, @@ -71,7 +70,10 @@ contract LayerZeroReporter is Reporter, Ownable, OAppCore { false // receiver in lz Token ); // solhint-disable-next-line check-send-result - LAYER_ZERO_ENDPOINT.send{ value: msg.value }(params, refundAddress); - return bytes32(0); + MessagingFee memory msgFee = LAYER_ZERO_ENDPOINT.quote(params, address(this)); + MessagingReceipt memory receipt = LAYER_ZERO_ENDPOINT.send{ value: msgFee.nativeFee }(params, refundAddress); + return receipt.guid; } + + receive() external payable {} } diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index 9f8cdebf..e4ab8bae 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -44,88 +44,105 @@ DESTINATION_CHAIN_IDS=42161,10,56,137,100 # Mainnet ## Layer Zero -MAINNET_LAYER_ZERO_REPORTER=0xbc5f67da5347cd4304e9623bc86e71a874287ea1 -BSC_MAINNET_LAYER_ZERO_ADAPTER=0xDbdF80c87f414fac8342e04D870764197bD3bAC7 -POLYGON_MAINNET_LAYER_ZERO_ADAPTER=0x998dA7f6cF98541E4F4469cc9d53B9374F186591 -BASE_MAINNET_LAYER_ZERO_ADAPTER=0xA86bc62Ac53Dc86687AB6C15fdebC71ad51fB615 -OPTIMISM_MAINNET_LAYER_ZERO_ADAPTER=0xA86bc62Ac53Dc86687AB6C15fdebC71ad51fB615 -### BASE + +GNOSIS_LZ_ADAPTER=0x6602dc9b6bd964C2a11BBdA9B2275308D1Bbc14f +POLYGON_LZ_ADAPTER=0xf4C84D9ced01534f235078A10E8A44A726c4b73c +BSC_LZ_ADAPTER=0x97761F61736Ec2D108a1b6826f5Ee2E02d1B333e +OPTIMISM_LZ_ADAPTER=0x746dfa0251A31e587E97bBe0c58ED67A343280Df +ARBITRUM_LZ_ADAPTER=0x97761F61736Ec2D108a1b6826f5Ee2E02d1B333e +BASE_LZ_ADAPTER=0x5F98c418C10132aA4D1b3c98cE4F68Ef2435e4eC + + +GNOSIS_LZ_REPORTER=0xA3Bc83D557E3f2dDfF4D44966A96397760159D8B +OPTIMISM_LZ_REPORTER=0xB866C6dD03434d8fA792C471b454cb4E72ca35dc +ARBITRUM_LZ_REPORTER=0xf4C84D9ced01534f235078A10E8A44A726c4b73c +POLYGON_LZ_REPORTER=0x231e48AAEaAC6398978a1dBA4Cd38fcA208Ec391 +BSC_LZ_REPORTER=0xc9618e4d4B59570Da67b4fb0E8fC7EB40A5f8462 BASE_LZ_REPORTER=0x495b872b329eba69F81A749f8A152766851C23b0 -BASE_POLYGON_LZ_ADAPTER=0x998dA7f6cF98541E4F4469cc9d53B9374F186591 -BASE_GNO_LZ_ADAPTER=0xC82e50cc90C84DC492B4Beb6792DEeB496d52424 -BASE_BNB_LZ_ADAPTER=0xDbdF80c87f414fac8342e04D870764197bD3bAC7 -BASE_OPTIMISM_LZ_ADAPTER=0xA86bc62Ac53Dc86687AB6C15fdebC71ad51fB615 -BASE_ARBITRUM_LZ_ADAPTER=0xA86bc62Ac53Dc86687AB6C15fdebC71ad51fB615 - -## AMB -MAINNET_AMB_REPORTER=0xDbdF80c87f414fac8342e04D870764197bD3bAC7 -GNOSIS_AMB_ADAPTER=0x79e4D1B8b8De0bC2F8A3DC477480C935C66F373E - - -# Testnet -SEPOLIA_CHIADO_AMB_ADAPTER=0x3F5929bee6A59661D6CcC9c4eB751048009CE11B -SEPOLIA_CHIADO_AMB_REPORTER=0xc6755144d60548f3DD420F47Cf48DAe553bBf042 - -SEPOLIA_CHIADO_CCIP_REPORTER=0xf66871C91952b09270d223cD3A1e5Dad57b14fbC -SEPOLIA_CHIADO_CCIP_ADAPTER=0x8A2A7509B98f0f21BEFF82e2520A920DB61fFa9d -SEPOLIA_WORMHOLE_ADDRESS=0x4a8bc80Ed5a4067f1CCf107057b8270E0cC11A78 - -SEPOLIA_CHIADO_WORMHOLE_REPORTER=0xeE8082F48e768e096c2EEC5C80DC818eb6E15858 -SEPOLIA_CHIADO_WORMHOLE_ADAPTER=0x79e4D1B8b8De0bC2F8A3DC477480C935C66F373E - -# LEGACY -GNOSIS_AMB_ADAPTER=0x4efB95c26bB2ebD3281749A5eAA388bc302b4445 -GNOSIS_AMB_REPORTER=0xc6755144d60548f3DD420F47Cf48DAe553bBf042 - -SEPOLIA_CHIADO_CCIP_REPORTER=0xf66871C91952b09270d223cD3A1e5Dad57b14fbC -SEPOLIA_CHIADO_CCIP_ADAPTER=0x8A2A7509B98f0f21BEFF82e2520A920DB61fFa9d -SEPOLIA_CHIADO_LZ_REPORTER=0xF7c2687c75FcBC7A00663f9436783A2B898537a4 -SEPOLIA_CHIADO_LZ_ADAPTER=0xF7c2687c75FcBC7A00663f9436783A2B898537a4 - -SEPOLIA_ARB_LZ_REPORTER=0x49f6BE2C7DB433395939b2c728dF2CB99Ca5f8c5 -SEPOLIA_ARB_LZ_ADAPTER=0x21eAB033C7D2DF6A67AeF6C5Bda9A7F151eB9f52 - -OPTIMISM_SEPOLIA_LZ_ADAPTER=0xF7c2687c75FcBC7A00663f9436783A2B898537a4 -CHIADO_ADAPTER=0x3F5929bee6A59661D6CcC9c4eB751048009CE11B - -#AMB_ADAPTER=0x4efB95c26bB2ebD3281749A5eAA388bc302b4445 -SYMGA_ADAPTER=0x9AD7a6f4FDA8247cC0bF5932B68c5b619937dB15 -GNOSIS_TELEPATHY_ADAPTER=0xDeF29f44f8315d0079A25EF03cfB0b0D8CdA3cF8 -# MAINNET_AMB_REPORTER=0x6be796cb66CdB3566b8AbebA2C516CbDF93fE831 -MAINNET_HEADER_REPORTER=0x11378C54aA4e2Daf4603f9be86ae0Cb70786682a -POLYGON_TELEPATHY_ADAPTER=0x04413A4795dD1f5347eAD1CD7C76Bd9E5e48b461 -BSC_TELEPATHY_ADAPTER=0x2E5685F20f42cC3b01e4A9ADE49F6848E242f022 -OPTIMISM_TELEPATHY_ADAPTER=0x856dcc80f75a9737D9D498266E1Af013668316Fb -ARBITRUM_TELEPATHY_ADAPTER=0x2E5685F20f42cC3b01e4A9ADE49F6848E242f022 -GNOSIS_WORMHOLE_ADAPTER=0x8EA3F385be8FCB98eB4dBfad2D00846860Bf648D -POLYGON_WORMHOLE_ADAPTER=0xb7806ea66c1bb9FfeB41Dc303601a469ddf3b9C2 -BSC_WORMHOLE_ADAPTER=0x11378C54aA4e2Daf4603f9be86ae0Cb70786682a -OPTIMISM_WORMHOLE_ADAPTER=0x1fF52708D610b1D17F0830f036e992677CDc508A -AVALANCHE_WORMHOLE_ADAPTER=0x6E9ce437c46e7fA4F0888c21AAC0d9099Ad133ea -MAINNET_WORMHOLE_HEADER_REPORTER=0xDeF29f44f8315d0079A25EF03cfB0b0D8CdA3cF8 -MAINNET_WORMHOLE_ADDRESS=0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B -MAINNET_L1_CROSS_DOMAIN_MESSENGER_HEADER_REPORTER_ADDRESS=0xbA5B3f0643582E75AF252e7631dE62c046970167 -OPTIMISM_L2_CROSS_DOMAIN_MESSENGER_ADAPTER_ADDRESS=0xe58E7bF7aCD1396D8F9eAF44DB3D4Fd055DCDb51 -MAINNET_AXELAR_REPORTER_BSC=0xBfd877753F8B4f4117a08aD54DcBE69cF3165d81 -BSC_AXELAR_ADAPTER_MAINNET=0xb7806ea66c1bb9FfeB41Dc303601a469ddf3b9C2 -POLYGON_CELER_ADAPTER_MAINNET=0x1fF52708D610b1D17F0830f036e992677CDc508A -MAINNET_CELER_REPORTER_POLYGON=0x52258b83051B7031483740aC9EcAa07926392ea0 -AVALANCHE_LAYER_ZERO_ADAPTER_MAINNET=0x11378C54aA4e2Daf4603f9be86ae0Cb70786682a -MAINNET_LAYER_ZERO_REPORTER_AVALANCHE=0x16B43E348e0A19E9196ae79D172aDC52B3Aa3E20 -OPTIMISM_GOERLI_CCIP_ADAPTER_SEPOLIA=0x520185210Aa645220a49afD9C33d28b73494e14d -SEPOLIA_CCIP_REPORTER_OPTIMISM_GOERLI=0xF3D2877866cd8E6771843b96B66aFcE425B2353C -BSC_TESTNET_CCIP_ADAPTER_SEPOLIA=0xB6133Ab655B990E80Af3E948852C8ec2a46651A5 -SEPOLIA_CCIP_REPORTER_BSC_TESTNET=0x855A2814E0DFf8327f1a52aCC9537772B829e226 - -BSC_LAYER_ZERO_ADAPTER_MAINNET=0xaC3c8D19A64B98d62ED16FFf8a4229E8ED36A469 -GOERLI_ZETA_REPORTER_BSC_TESTNET=0x9a9fc484D3F83B489bc58c2A3EeeA8331F21796B -BSC_TESTNET_ZETA_ADAPTER_GOERLI=0x2829D554678a767c5B091D28A0A294dB7643ec05 -MAINNET_CCIP_REPORTER_AVALANCHE=0xeEFD0D67E4eF9330870961C38a3e25ECE369B141 -AVALANCHE_CCIP_ADAPTER_MAINNET=0x04413A4795dD1f5347eAD1CD7C76Bd9E5e48b461 -GNOSIS_SYGMA_ADAPTER=0x483285D0e24401D0C5DB6cF1FAC4f79f412079C0 -MAINNET_SYGMA_REPORTER_GNOSIS=0x973bB99db211755b80c9087fe436fBb81A45AD5E -MAINNET_HEADER_STORAGE=0x22F1fc71A505c0b2bf4D5075801cc5E0ec84B09e -GOERLI_HEADER_STORAGE=0x4cD014AC64AAa899b46BF3a477B68bb67e33eDC4 -CHIADO_ELECTRON_ADAPTER_GOERLI=0x66fBC348aef3797fb885f8073173E5064bf7ABBb -CHIADO_ELECTRON_LIGHT_CLIENT_GOERLI=0xc01707bD835f6108785DF081C943C7C108FC3D89 \ No newline at end of file + +# MAINNET_LAYER_ZERO_REPORTER=0xbc5f67da5347cd4304e9623bc86e71a874287ea1 +# BSC_MAINNET_LAYER_ZERO_ADAPTER=0xDbdF80c87f414fac8342e04D870764197bD3bAC7 +# POLYGON_MAINNET_LAYER_ZERO_ADAPTER=0x998dA7f6cF98541E4F4469cc9d53B9374F186591 +# BASE_MAINNET_LAYER_ZERO_ADAPTER=0xA86bc62Ac53Dc86687AB6C15fdebC71ad51fB615 +# OPTIMISM_MAINNET_LAYER_ZERO_ADAPTER=0xA86bc62Ac53Dc86687AB6C15fdebC71ad51fB615 + +# ### BASE +# BASE_LZ_REPORTER=0x495b872b329eba69F81A749f8A152766851C23b0 +# BASE_POLYGON_LZ_ADAPTER=0x998dA7f6cF98541E4F4469cc9d53B9374F186591 +# BASE_GNO_LZ_ADAPTER=0xC82e50cc90C84DC492B4Beb6792DEeB496d52424 +# BASE_BNB_LZ_ADAPTER=0xDbdF80c87f414fac8342e04D870764197bD3bAC7 +# BASE_OPTIMISM_LZ_ADAPTER=0xA86bc62Ac53Dc86687AB6C15fdebC71ad51fB615 +# BASE_ARBITRUM_LZ_ADAPTER=0xA86bc62Ac53Dc86687AB6C15fdebC71ad51fB615 + +# ## AMB +# MAINNET_AMB_REPORTER=0xDbdF80c87f414fac8342e04D870764197bD3bAC7 +# GNOSIS_AMB_ADAPTER=0x79e4D1B8b8De0bC2F8A3DC477480C935C66F373E + + +# # Testnet +# SEPOLIA_CHIADO_AMB_ADAPTER=0x3F5929bee6A59661D6CcC9c4eB751048009CE11B +# SEPOLIA_CHIADO_AMB_REPORTER=0xc6755144d60548f3DD420F47Cf48DAe553bBf042 + +# SEPOLIA_CHIADO_CCIP_REPORTER=0xf66871C91952b09270d223cD3A1e5Dad57b14fbC +# SEPOLIA_CHIADO_CCIP_ADAPTER=0x8A2A7509B98f0f21BEFF82e2520A920DB61fFa9d +# SEPOLIA_WORMHOLE_ADDRESS=0x4a8bc80Ed5a4067f1CCf107057b8270E0cC11A78 + +# SEPOLIA_CHIADO_WORMHOLE_REPORTER=0xeE8082F48e768e096c2EEC5C80DC818eb6E15858 +# SEPOLIA_CHIADO_WORMHOLE_ADAPTER=0x79e4D1B8b8De0bC2F8A3DC477480C935C66F373E + +# # LEGACY +# GNOSIS_AMB_ADAPTER=0x4efB95c26bB2ebD3281749A5eAA388bc302b4445 +# GNOSIS_AMB_REPORTER=0xc6755144d60548f3DD420F47Cf48DAe553bBf042 + +# SEPOLIA_CHIADO_CCIP_REPORTER=0xf66871C91952b09270d223cD3A1e5Dad57b14fbC +# SEPOLIA_CHIADO_CCIP_ADAPTER=0x8A2A7509B98f0f21BEFF82e2520A920DB61fFa9d +# SEPOLIA_CHIADO_LZ_REPORTER=0xF7c2687c75FcBC7A00663f9436783A2B898537a4 +# SEPOLIA_CHIADO_LZ_ADAPTER=0xF7c2687c75FcBC7A00663f9436783A2B898537a4 + +# SEPOLIA_ARB_LZ_REPORTER=0x49f6BE2C7DB433395939b2c728dF2CB99Ca5f8c5 +# SEPOLIA_ARB_LZ_ADAPTER=0x21eAB033C7D2DF6A67AeF6C5Bda9A7F151eB9f52 + +# OPTIMISM_SEPOLIA_LZ_ADAPTER=0xF7c2687c75FcBC7A00663f9436783A2B898537a4 +# CHIADO_ADAPTER=0x3F5929bee6A59661D6CcC9c4eB751048009CE11B + +# #AMB_ADAPTER=0x4efB95c26bB2ebD3281749A5eAA388bc302b4445 +# SYMGA_ADAPTER=0x9AD7a6f4FDA8247cC0bF5932B68c5b619937dB15 +# GNOSIS_TELEPATHY_ADAPTER=0xDeF29f44f8315d0079A25EF03cfB0b0D8CdA3cF8 +# # MAINNET_AMB_REPORTER=0x6be796cb66CdB3566b8AbebA2C516CbDF93fE831 +# MAINNET_HEADER_REPORTER=0x11378C54aA4e2Daf4603f9be86ae0Cb70786682a +# POLYGON_TELEPATHY_ADAPTER=0x04413A4795dD1f5347eAD1CD7C76Bd9E5e48b461 +# BSC_TELEPATHY_ADAPTER=0x2E5685F20f42cC3b01e4A9ADE49F6848E242f022 +# OPTIMISM_TELEPATHY_ADAPTER=0x856dcc80f75a9737D9D498266E1Af013668316Fb +# ARBITRUM_TELEPATHY_ADAPTER=0x2E5685F20f42cC3b01e4A9ADE49F6848E242f022 +# GNOSIS_WORMHOLE_ADAPTER=0x8EA3F385be8FCB98eB4dBfad2D00846860Bf648D +# POLYGON_WORMHOLE_ADAPTER=0xb7806ea66c1bb9FfeB41Dc303601a469ddf3b9C2 +# BSC_WORMHOLE_ADAPTER=0x11378C54aA4e2Daf4603f9be86ae0Cb70786682a +# OPTIMISM_WORMHOLE_ADAPTER=0x1fF52708D610b1D17F0830f036e992677CDc508A +# AVALANCHE_WORMHOLE_ADAPTER=0x6E9ce437c46e7fA4F0888c21AAC0d9099Ad133ea +# MAINNET_WORMHOLE_HEADER_REPORTER=0xDeF29f44f8315d0079A25EF03cfB0b0D8CdA3cF8 +# MAINNET_WORMHOLE_ADDRESS=0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B +# MAINNET_L1_CROSS_DOMAIN_MESSENGER_HEADER_REPORTER_ADDRESS=0xbA5B3f0643582E75AF252e7631dE62c046970167 +# OPTIMISM_L2_CROSS_DOMAIN_MESSENGER_ADAPTER_ADDRESS=0xe58E7bF7aCD1396D8F9eAF44DB3D4Fd055DCDb51 +# MAINNET_AXELAR_REPORTER_BSC=0xBfd877753F8B4f4117a08aD54DcBE69cF3165d81 +# BSC_AXELAR_ADAPTER_MAINNET=0xb7806ea66c1bb9FfeB41Dc303601a469ddf3b9C2 +# POLYGON_CELER_ADAPTER_MAINNET=0x1fF52708D610b1D17F0830f036e992677CDc508A +# MAINNET_CELER_REPORTER_POLYGON=0x52258b83051B7031483740aC9EcAa07926392ea0 +# AVALANCHE_LAYER_ZERO_ADAPTER_MAINNET=0x11378C54aA4e2Daf4603f9be86ae0Cb70786682a +# MAINNET_LAYER_ZERO_REPORTER_AVALANCHE=0x16B43E348e0A19E9196ae79D172aDC52B3Aa3E20 +# OPTIMISM_GOERLI_CCIP_ADAPTER_SEPOLIA=0x520185210Aa645220a49afD9C33d28b73494e14d +# SEPOLIA_CCIP_REPORTER_OPTIMISM_GOERLI=0xF3D2877866cd8E6771843b96B66aFcE425B2353C +# BSC_TESTNET_CCIP_ADAPTER_SEPOLIA=0xB6133Ab655B990E80Af3E948852C8ec2a46651A5 +# SEPOLIA_CCIP_REPORTER_BSC_TESTNET=0x855A2814E0DFf8327f1a52aCC9537772B829e226 + +# BSC_LAYER_ZERO_ADAPTER_MAINNET=0xaC3c8D19A64B98d62ED16FFf8a4229E8ED36A469 +# GOERLI_ZETA_REPORTER_BSC_TESTNET=0x9a9fc484D3F83B489bc58c2A3EeeA8331F21796B +# BSC_TESTNET_ZETA_ADAPTER_GOERLI=0x2829D554678a767c5B091D28A0A294dB7643ec05 +# MAINNET_CCIP_REPORTER_AVALANCHE=0xeEFD0D67E4eF9330870961C38a3e25ECE369B141 +# AVALANCHE_CCIP_ADAPTER_MAINNET=0x04413A4795dD1f5347eAD1CD7C76Bd9E5e48b461 +# GNOSIS_SYGMA_ADAPTER=0x483285D0e24401D0C5DB6cF1FAC4f79f412079C0 +# MAINNET_SYGMA_REPORTER_GNOSIS=0x973bB99db211755b80c9087fe436fBb81A45AD5E +# MAINNET_HEADER_STORAGE=0x22F1fc71A505c0b2bf4D5075801cc5E0ec84B09e +# GOERLI_HEADER_STORAGE=0x4cD014AC64AAa899b46BF3a477B68bb67e33eDC4 +# CHIADO_ELECTRON_ADAPTER_GOERLI=0x66fBC348aef3797fb885f8073173E5064bf7ABBb +# CHIADO_ELECTRON_LIGHT_CLIENT_GOERLI=0xc01707bD835f6108785DF081C943C7C108FC3D89 \ No newline at end of file diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 45835d67..9baa2ec7 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -207,18 +207,12 @@ const main = () => { logger, multiClient, reporterAddresses: { - // [avalanche.name]: unidirectionalReportersAddresses[sourceChain.name]?.[avalanche.name]?.LayerZeroReporter, - // [gnosisChiado.name]: unidirectionalReportersAddresses[sourceChain.name]?.[gnosisChiado.name]?.LayerZeroReporter, - // [optimismSepolia.name]: - // unidirectionalReportersAddresses[sourceChain.name]?.[optimismSepolia.name]?.LayerZeroReporter, [polygon.name]: unidirectionalReportersAddresses[sourceChain.name]?.[polygon.name]?.LayerZeroReporter, [bsc.name]: unidirectionalReportersAddresses[sourceChain.name]?.[bsc.name]?.LayerZeroReporter, [gnosis.name]: unidirectionalReportersAddresses[sourceChain.name]?.[gnosis.name]?.LayerZeroReporter, [base.name]: unidirectionalReportersAddresses[sourceChain.name]?.[base.name]?.LayerZeroReporter, [optimism.name]: unidirectionalReportersAddresses[sourceChain.name]?.[optimism.name]?.LayerZeroReporter, [arbitrum.name]: unidirectionalReportersAddresses[sourceChain.name]?.[arbitrum.name]?.LayerZeroReporter, - [arbitrumSepolia.name]: - unidirectionalReportersAddresses[sourceChain.name]?.[arbitrumSepolia.name]?.LayerZeroReporter, }, adapterAddresses: { [polygon.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[polygon.name]?.LayerZeroAdapter, @@ -227,12 +221,6 @@ const main = () => { [base.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[base.name]?.LayerZeroAdapter, [optimism.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[optimism.name]?.LayerZeroAdapter, [arbitrum.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[arbitrum.name]?.LayerZeroAdapter, - [arbitrumSepolia.name]: - unidirectionalAdaptersAddresses[sourceChain.name]?.[arbitrumSepolia.name]?.LayerZeroAdapter, - [optimismSepolia.name]: - unidirectionalAdaptersAddresses[sourceChain.name]?.[optimismSepolia.name]?.LayerZeroAdapter, - // [gnosisChiado.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[gnosisChiado.name]?.LayerZeroAdapter, - // [avalanche.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.[avalanche.name]?.LayerZeroAdapter, }, reportHeadersValue: settings.reporterControllers.LayerZeroReporterController.reportHeadersValue, }) diff --git a/packages/reporter/src/settings/index.ts b/packages/reporter/src/settings/index.ts index e21db5e1..c324fe45 100644 --- a/packages/reporter/src/settings/index.ts +++ b/packages/reporter/src/settings/index.ts @@ -86,19 +86,104 @@ export const settings = { }, [base.name]: { [polygon.name]: { - LayerZeroAdapter: process.env.BASE_POLYGON_LZ_ADAPTER as `0x${string}`, + LayerZeroAdapter: process.env.POLYGON_LZ_ADAPTER as `0x${string}`, }, [bsc.name]: { - LayerZeroAdapter: process.env.BASE_BNB_LZ_ADAPTER as `0x${string}`, + LayerZeroAdapter: process.env.BSC_LZ_ADAPTER as `0x${string}`, }, [gnosis.name]: { - LayerZeroAdapter: process.env.BASE_GNO_LZ_ADAPTER as `0x${string}`, + LayerZeroAdapter: process.env.GNOSIS_LZ_ADAPTER as `0x${string}`, }, [arbitrum.name]: { - LayerZeroAdapter: process.env.BASE_ARBITRUM_LZ_ADAPTER as `0x${string}`, + LayerZeroAdapter: process.env.ARBITRUM_LZ_ADAPTER as `0x${string}`, }, [optimism.name]: { - LayerZeroAdapter: process.env.BASE_OPTIMISM_LZ_ADAPTER as `0x${string}`, + LayerZeroAdapter: process.env.OPTIMISM_LZ_ADAPTER as `0x${string}`, + }, + }, + [gnosis.name]: { + [polygon.name]: { + LayerZeroAdapter: process.env.POLYGON_LZ_ADAPTER as `0x${string}`, + }, + [bsc.name]: { + LayerZeroAdapter: process.env.BSC_LZ_ADAPTER as `0x${string}`, + }, + [base.name]: { + LayerZeroAdapter: process.env.BASE_LZ_ADAPTER as `0x${string}`, + }, + [arbitrum.name]: { + LayerZeroAdapter: process.env.ARBITRUM_LZ_ADAPTER as `0x${string}`, + }, + [optimism.name]: { + LayerZeroAdapter: process.env.OPTIMISM_LZ_ADAPTER as `0x${string}`, + }, + }, + [polygon.name]: { + [base.name]: { + LayerZeroAdapter: process.env.BASE_LZ_ADAPTER as `0x${string}`, + }, + [bsc.name]: { + LayerZeroAdapter: process.env.BSC_LZ_ADAPTER as `0x${string}`, + }, + [gnosis.name]: { + LayerZeroAdapter: process.env.GNOSIS_LZ_ADAPTER as `0x${string}`, + }, + [arbitrum.name]: { + LayerZeroAdapter: process.env.ARBITRUM_LZ_ADAPTER as `0x${string}`, + }, + [optimism.name]: { + LayerZeroAdapter: process.env.OPTIMISM_LZ_ADAPTER as `0x${string}`, + }, + }, + [bsc.name]: { + [polygon.name]: { + LayerZeroAdapter: process.env.POLYGON_LZ_ADAPTER as `0x${string}`, + }, + [base.name]: { + LayerZeroAdapter: process.env.BASE_LZ_ADAPTER as `0x${string}`, + }, + [gnosis.name]: { + LayerZeroAdapter: process.env.GNOSIS_LZ_ADAPTER as `0x${string}`, + }, + [arbitrum.name]: { + LayerZeroAdapter: process.env.ARBITRUM_LZ_ADAPTER as `0x${string}`, + }, + [optimism.name]: { + LayerZeroAdapter: process.env.OPTIMISM_LZ_ADAPTER as `0x${string}`, + }, + }, + [optimism.name]: { + [polygon.name]: { + LayerZeroAdapter: process.env.POLYGON_LZ_ADAPTER as `0x${string}`, + }, + [bsc.name]: { + LayerZeroAdapter: process.env.BSC_LZ_ADAPTER as `0x${string}`, + }, + [gnosis.name]: { + LayerZeroAdapter: process.env.GNOSIS_LZ_ADAPTER as `0x${string}`, + }, + [arbitrum.name]: { + LayerZeroAdapter: process.env.ARBITRUM_LZ_ADAPTER as `0x${string}`, + }, + [base.name]: { + LayerZeroAdapter: process.env.BASE_LZ_ADAPTER as `0x${string}`, + }, + }, + [arbitrum.name]: { + [polygon.name]: { + LayerZeroAdapter: process.env.POLYGON_LZ_ADAPTER as `0x${string}`, + }, + [bsc.name]: { + LayerZeroAdapter: process.env.BSC_LZ_ADAPTER as `0x${string}`, + }, + [gnosis.name]: { + LayerZeroAdapter: process.env.GNOSIS_LZ_ADAPTER as `0x${string}`, + }, + [base.name]: { + LayerZeroAdapter: process.env.BASE_LZ_ADAPTER as `0x${string}`, + }, + [optimism.name]: { + LayerZeroAdapter: process.env.OPTIMISM_LZ_ADAPTER as `0x${string}`, }, }, [sepolia.name]: { @@ -196,6 +281,91 @@ export const settings = { LayerZeroReporter: process.env.BASE_LZ_REPORTER as `0x${string}`, }, }, + [gnosis.name]: { + [polygon.name]: { + LayerZeroReporter: process.env.GNOSIS_LZ_REPORTER as `0x${string}`, + }, + [bsc.name]: { + LayerZeroReporter: process.env.GNOSIS_LZ_REPORTER as `0x${string}`, + }, + [base.name]: { + LayerZeroReporter: process.env.GNOSIS_LZ_REPORTER as `0x${string}`, + }, + [arbitrum.name]: { + LayerZeroReporter: process.env.GNOSIS_LZ_REPORTER as `0x${string}`, + }, + [optimism.name]: { + LayerZeroReporter: process.env.GNOSIS_LZ_REPORTER as `0x${string}`, + }, + }, + [optimism.name]: { + [polygon.name]: { + LayerZeroReporter: process.env.OPTIMISM_LZ_REPORTER as `0x${string}`, + }, + [bsc.name]: { + LayerZeroReporter: process.env.OPTIMISM_LZ_REPORTER as `0x${string}`, + }, + [base.name]: { + LayerZeroReporter: process.env.OPTIMISM_LZ_REPORTER as `0x${string}`, + }, + [arbitrum.name]: { + LayerZeroReporter: process.env.OPTIMISM_LZ_REPORTER as `0x${string}`, + }, + [gnosis.name]: { + LayerZeroReporter: process.env.OPTIMISM_LZ_REPORTER as `0x${string}`, + }, + }, + [arbitrum.name]: { + [polygon.name]: { + LayerZeroReporter: process.env.ARBITRUM_LZ_REPORTER as `0x${string}`, + }, + [bsc.name]: { + LayerZeroReporter: process.env.ARBITRUM_LZ_REPORTER as `0x${string}`, + }, + [base.name]: { + LayerZeroReporter: process.env.ARBITRUM_LZ_REPORTER as `0x${string}`, + }, + [optimism.name]: { + LayerZeroReporter: process.env.ARBITRUM_LZ_REPORTER as `0x${string}`, + }, + [gnosis.name]: { + LayerZeroReporter: process.env.ARBITRUM_LZ_REPORTER as `0x${string}`, + }, + }, + [polygon.name]: { + [arbitrum.name]: { + LayerZeroReporter: process.env.POLYGON_LZ_REPORTER as `0x${string}`, + }, + [bsc.name]: { + LayerZeroReporter: process.env.POLYGON_LZ_REPORTER as `0x${string}`, + }, + [base.name]: { + LayerZeroReporter: process.env.POLYGON_LZ_REPORTER as `0x${string}`, + }, + [optimism.name]: { + LayerZeroReporter: process.env.POLYGON_LZ_REPORTER as `0x${string}`, + }, + [gnosis.name]: { + LayerZeroReporter: process.env.POLYGON_LZ_REPORTER as `0x${string}`, + }, + }, + [bsc.name]: { + [arbitrum.name]: { + LayerZeroReporter: process.env.BSC_LZ_REPORTER as `0x${string}`, + }, + [polygon.name]: { + LayerZeroReporter: process.env.BSC_LZ_REPORTER as `0x${string}`, + }, + [base.name]: { + LayerZeroReporter: process.env.BSC_LZ_REPORTER as `0x${string}`, + }, + [optimism.name]: { + LayerZeroReporter: process.env.BSC_LZ_REPORTER as `0x${string}`, + }, + [gnosis.name]: { + LayerZeroReporter: process.env.BSC_LZ_REPORTER as `0x${string}`, + }, + }, [sepolia.name]: { [optimismSepolia.name]: { LayerZeroReporter: process.env.SEPOLIA_CHIADO_LZ_REPORTER as `0x${string}`, From 60e9359be20230aff9b0a05de2895b2a7ebf89c8 Mon Sep 17 00:00:00 2001 From: Seun Lanlege Date: Sat, 14 Sep 2024 13:49:01 +0000 Subject: [PATCH 253/297] feat(chore): bump ismp-solidity sdk --- package.json | 3 ++- packages/common/package.json | 4 ++-- packages/evm/package.json | 2 +- yarn.lock | 27 +++++++++++++++++++-------- 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index a6ea1873..7b085274 100644 --- a/package.json +++ b/package.json @@ -19,5 +19,6 @@ }, "workspaces": [ "packages/*" - ] + ], + "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" } diff --git a/packages/common/package.json b/packages/common/package.json index 8ce9e361..104f572f 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -17,8 +17,8 @@ "prettier:write": "prettier --write \"**/*.{js,json,md,sol,ts,yml}\"" }, "dependencies": { - "winston": "^3.11.0", - "viem": "^2.9.28" + "viem": "^2.9.28", + "winston": "^3.11.0" }, "devDependencies": { "@types/node": "^20.8.9", diff --git a/packages/evm/package.json b/packages/evm/package.json index 67631b35..3b6b8ac5 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -95,7 +95,7 @@ "@connext/interfaces": "2.0.0", "@hyperlane-xyz/core": "3.1.10", "@openzeppelin/contracts-upgradeable": "4.8.1", - "@polytope-labs/ismp-solidity": "^0.6.4", + "@polytope-labs/ismp-solidity": "^0.6.9", "@polytope-labs/solidity-merkle-trees": "0.3.2", "@routerprotocol/evm-gateway-contracts": "1.1.13", "solidity-rlp": "2.0.8" diff --git a/yarn.lock b/yarn.lock index 2438ed9a..7538827a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1110,7 +1110,7 @@ __metadata: "@nomiclabs/hardhat-ethers": ^2.2.1 "@nomiclabs/hardhat-etherscan": ^3.1.2 "@openzeppelin/contracts-upgradeable": 4.8.1 - "@polytope-labs/ismp-solidity": ^0.6.4 + "@polytope-labs/ismp-solidity": ^0.6.9 "@polytope-labs/solidity-merkle-trees": 0.3.2 "@routerprotocol/evm-gateway-contracts": 1.1.13 "@trivago/prettier-plugin-sort-imports": ^4.0.0 @@ -1828,19 +1828,19 @@ __metadata: languageName: node linkType: hard -"@polytope-labs/ismp-solidity@npm:^0.6.4": - version: 0.6.4 - resolution: "@polytope-labs/ismp-solidity@npm:0.6.4" +"@polytope-labs/ismp-solidity@npm:^0.6.9": + version: 0.6.9 + resolution: "@polytope-labs/ismp-solidity@npm:0.6.9" dependencies: - "@polytope-labs/solidity-merkle-trees": ^0.3.2 + "@polytope-labs/solidity-merkle-trees": ^0.3.3 openzeppelin-solidity: ^4.8.1 prettier: ^3.3.3 prettier-plugin-solidity: ^1.3.1 - checksum: 0ec0a648fe48b95a414af7549b61d4fb59310c50c21878883b7712bcca328ec946e1f8dfb62f1413cf88436f9d82006213b52a893aeb03b6eb05ed24322ce4a9 + checksum: e70c20966d9ab58fd997dfc8232cc7e5997d665229d03e1f4bd2010adbd7827826693f6e12375c9ca23a0ae5cba07bc486e940bd04a239db4b8c59633a78594c languageName: node linkType: hard -"@polytope-labs/solidity-merkle-trees@npm:0.3.2, @polytope-labs/solidity-merkle-trees@npm:^0.3.2": +"@polytope-labs/solidity-merkle-trees@npm:0.3.2": version: 0.3.2 resolution: "@polytope-labs/solidity-merkle-trees@npm:0.3.2" dependencies: @@ -1849,6 +1849,17 @@ __metadata: languageName: node linkType: hard +"@polytope-labs/solidity-merkle-trees@npm:^0.3.3": + version: 0.3.4 + resolution: "@polytope-labs/solidity-merkle-trees@npm:0.3.4" + dependencies: + openzeppelin-solidity: ^4.8.1 + prettier: ^3.3.3 + prettier-plugin-solidity: ^1.4.1 + checksum: 49c167728cb8725a31fa8ef4ececc8734f0111f6e3878e84eb1ec1313973f56395b5cb11055aa7229964baa8d5fc2ffa71371f41c155fa34f126f196242878ba + languageName: node + linkType: hard + "@routerprotocol/evm-gateway-contracts@npm:1.1.13": version: 1.1.13 resolution: "@routerprotocol/evm-gateway-contracts@npm:1.1.13" @@ -8194,7 +8205,7 @@ __metadata: languageName: node linkType: hard -"prettier-plugin-solidity@npm:^1.0.0, prettier-plugin-solidity@npm:^1.3.1": +"prettier-plugin-solidity@npm:^1.0.0, prettier-plugin-solidity@npm:^1.3.1, prettier-plugin-solidity@npm:^1.4.1": version: 1.4.1 resolution: "prettier-plugin-solidity@npm:1.4.1" dependencies: From 943ae5fa788123bc0657a65f90c92cc9857d350c Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Mon, 16 Sep 2024 15:26:54 +0800 Subject: [PATCH 254/297] chore: remove unused ABI files --- .../src/ABIs/AMBReporterContractABI.json | 268 ------------- .../src/ABIs/CCIPReporterContractABI.json | 368 ------------------ .../ABIs/LayerZeroReporterContractABI.json | 368 ------------------ 3 files changed, 1004 deletions(-) delete mode 100644 packages/reporter/src/ABIs/AMBReporterContractABI.json delete mode 100644 packages/reporter/src/ABIs/CCIPReporterContractABI.json delete mode 100644 packages/reporter/src/ABIs/LayerZeroReporterContractABI.json diff --git a/packages/reporter/src/ABIs/AMBReporterContractABI.json b/packages/reporter/src/ABIs/AMBReporterContractABI.json deleted file mode 100644 index b9c1b8e4..00000000 --- a/packages/reporter/src/ABIs/AMBReporterContractABI.json +++ /dev/null @@ -1,268 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "address", - "name": "headerStorage", - "type": "address" - }, - { - "internalType": "address", - "name": "yaho", - "type": "address" - }, - { - "internalType": "address", - "name": "amb", - "type": "address" - }, - { - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "gas", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "expectedChainId", - "type": "uint256" - } - ], - "name": "InvalidToChainId", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "expectedYaho", - "type": "address" - } - ], - "name": "NotYaho", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "blockHeader", - "type": "bytes32" - } - ], - "name": "BlockDispatched", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "messageId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "messageHash", - "type": "bytes32" - } - ], - "name": "MessageDispatched", - "type": "event" - }, - { - "inputs": [], - "name": "AMB", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "GAS", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "HEADER_STORAGE", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "PROVIDER", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "TARGET_CHAIN_ID", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "YAHO", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "blockNumbers", - "type": "uint256[]" - } - ], - "name": "dispatchBlocks", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "messageIds", - "type": "uint256[]" - }, - { - "internalType": "bytes32[]", - "name": "messageHashes", - "type": "bytes32[]" - } - ], - "name": "dispatchMessages", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "payable", - "type": "function" - } -] diff --git a/packages/reporter/src/ABIs/CCIPReporterContractABI.json b/packages/reporter/src/ABIs/CCIPReporterContractABI.json deleted file mode 100644 index fdd75331..00000000 --- a/packages/reporter/src/ABIs/CCIPReporterContractABI.json +++ /dev/null @@ -1,368 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "address", - "name": "headerStorage", - "type": "address" - }, - { - "internalType": "address", - "name": "yaho", - "type": "address" - }, - { - "internalType": "address", - "name": "ccipRouter", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "ChainSelectorNotAvailable", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "expectedYaho", - "type": "address" - } - ], - "name": "NotYaho", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "blockHeader", - "type": "bytes32" - } - ], - "name": "BlockDispatched", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "uint64", - "name": "chainSelector", - "type": "uint64" - } - ], - "name": "ChainSelectorSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "fee", - "type": "uint256" - } - ], - "name": "FeeSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "messageId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "messageHash", - "type": "bytes32" - } - ], - "name": "MessageDispatched", - "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": [], - "name": "CCIP_ROUTER", - "outputs": [ - { - "internalType": "contract IRouterClient", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "HEADER_STORAGE", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "PROVIDER", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "YAHO", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "chainSelectors", - "outputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "blockNumbers", - "type": "uint256[]" - } - ], - "name": "dispatchBlocks", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "messageIds", - "type": "uint256[]" - }, - { - "internalType": "bytes32[]", - "name": "messageHashes", - "type": "bytes32[]" - } - ], - "name": "dispatchMessages", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "fee", - "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": [ - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "internalType": "uint64", - "name": "chainSelector", - "type": "uint64" - } - ], - "name": "setChainSelectorByChainId", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "fee_", - "type": "uint256" - } - ], - "name": "setFee", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/packages/reporter/src/ABIs/LayerZeroReporterContractABI.json b/packages/reporter/src/ABIs/LayerZeroReporterContractABI.json deleted file mode 100644 index 6d6a228c..00000000 --- a/packages/reporter/src/ABIs/LayerZeroReporterContractABI.json +++ /dev/null @@ -1,368 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "address", - "name": "headerStorage", - "type": "address" - }, - { - "internalType": "address", - "name": "yaho", - "type": "address" - }, - { - "internalType": "address", - "name": "lzEndpoint", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "EndpointIdNotAvailable", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "expectedYaho", - "type": "address" - } - ], - "name": "NotYaho", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "blockHeader", - "type": "bytes32" - } - ], - "name": "BlockDispatched", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "uint16", - "name": "endpointId", - "type": "uint16" - } - ], - "name": "EndpointIdSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "fee", - "type": "uint256" - } - ], - "name": "FeeSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "messageId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "messageHash", - "type": "bytes32" - } - ], - "name": "MessageDispatched", - "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": [], - "name": "HEADER_STORAGE", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "LAYER_ZERO_ENDPOINT", - "outputs": [ - { - "internalType": "contract ILayerZeroEndpoint", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "PROVIDER", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "YAHO", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "blockNumbers", - "type": "uint256[]" - } - ], - "name": "dispatchBlocks", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "messageIds", - "type": "uint256[]" - }, - { - "internalType": "bytes32[]", - "name": "messageHashes", - "type": "bytes32[]" - } - ], - "name": "dispatchMessages", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "endpointIds", - "outputs": [ - { - "internalType": "uint16", - "name": "", - "type": "uint16" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "fee", - "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": [ - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "internalType": "uint16", - "name": "endpointId", - "type": "uint16" - } - ], - "name": "setEndpointIdByChainId", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "fee_", - "type": "uint256" - } - ], - "name": "setFee", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } -] From 15a8f46af8bd4ba316224ca531ccea7865fbb98e Mon Sep 17 00:00:00 2001 From: Seun Lanlege Date: Mon, 16 Sep 2024 10:30:05 +0000 Subject: [PATCH 255/297] feat(chore): deploy hyperbridge adapters --- packages/evm/package.json | 2 +- packages/evm/tasks/deploy/adapters/index.ts | 1 + yarn.lock | 10 +++++----- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/evm/package.json b/packages/evm/package.json index 3b6b8ac5..98cc7899 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -95,7 +95,7 @@ "@connext/interfaces": "2.0.0", "@hyperlane-xyz/core": "3.1.10", "@openzeppelin/contracts-upgradeable": "4.8.1", - "@polytope-labs/ismp-solidity": "^0.6.9", + "@polytope-labs/ismp-solidity": "^0.7.1", "@polytope-labs/solidity-merkle-trees": "0.3.2", "@routerprotocol/evm-gateway-contracts": "1.1.13", "solidity-rlp": "2.0.8" diff --git a/packages/evm/tasks/deploy/adapters/index.ts b/packages/evm/tasks/deploy/adapters/index.ts index c6130790..87de8122 100644 --- a/packages/evm/tasks/deploy/adapters/index.ts +++ b/packages/evm/tasks/deploy/adapters/index.ts @@ -6,6 +6,7 @@ import "./celer" import "./connext" import "./dendreth" import "./electron" +import "./hyperbridge" import "./hyperlane" import "./layerzero" import "./optimism" diff --git a/yarn.lock b/yarn.lock index 7538827a..0bed97db 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1110,7 +1110,7 @@ __metadata: "@nomiclabs/hardhat-ethers": ^2.2.1 "@nomiclabs/hardhat-etherscan": ^3.1.2 "@openzeppelin/contracts-upgradeable": 4.8.1 - "@polytope-labs/ismp-solidity": ^0.6.9 + "@polytope-labs/ismp-solidity": ^0.7.1 "@polytope-labs/solidity-merkle-trees": 0.3.2 "@routerprotocol/evm-gateway-contracts": 1.1.13 "@trivago/prettier-plugin-sort-imports": ^4.0.0 @@ -1828,15 +1828,15 @@ __metadata: languageName: node linkType: hard -"@polytope-labs/ismp-solidity@npm:^0.6.9": - version: 0.6.9 - resolution: "@polytope-labs/ismp-solidity@npm:0.6.9" +"@polytope-labs/ismp-solidity@npm:^0.7.1": + version: 0.7.1 + resolution: "@polytope-labs/ismp-solidity@npm:0.7.1" dependencies: "@polytope-labs/solidity-merkle-trees": ^0.3.3 openzeppelin-solidity: ^4.8.1 prettier: ^3.3.3 prettier-plugin-solidity: ^1.3.1 - checksum: e70c20966d9ab58fd997dfc8232cc7e5997d665229d03e1f4bd2010adbd7827826693f6e12375c9ca23a0ae5cba07bc486e940bd04a239db4b8c59633a78594c + checksum: 79d963014c8a166d9ab26a5c2f5632aee8032ced8367543245f093050540441a5665014d2046b1f9df4cd7c67474856ed307cddad4040577d758c4c5cd13b7af languageName: node linkType: hard From cc5649cfaf4d48f2975c121984989fda34de1ca1 Mon Sep 17 00:00:00 2001 From: Seun Lanlege Date: Mon, 16 Sep 2024 12:27:10 +0000 Subject: [PATCH 256/297] feat(chore): rm new line --- .../evm/contracts/adapters/Hyperbridge/HyperbridgeReporter.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeReporter.sol b/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeReporter.sol index 1d018a1d..7d37651a 100644 --- a/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeReporter.sol +++ b/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeReporter.sol @@ -4,7 +4,6 @@ pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { Reporter } from "../Reporter.sol"; - import { StateMachine } from "@polytope-labs/ismp-solidity/interfaces/StateMachine.sol"; import { BaseIsmpModule } from "@polytope-labs/ismp-solidity/interfaces/IIsmpModule.sol"; import { IDispatcher, DispatchPost } from "@polytope-labs/ismp-solidity/interfaces/IDispatcher.sol"; From 9b895cdca5269788263c441663a2a83342ae9182 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 16 Sep 2024 14:41:48 +0200 Subject: [PATCH 257/297] refactor(evm): sorts imported contracts within HyperbridgeReporter and HyperbridgeAdapter --- .../evm/contracts/adapters/Hyperbridge/HyperbridgeAdapter.sol | 2 +- .../evm/contracts/adapters/Hyperbridge/HyperbridgeReporter.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeAdapter.sol b/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeAdapter.sol index 0b77e520..ac34587e 100644 --- a/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeAdapter.sol +++ b/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeAdapter.sol @@ -2,9 +2,9 @@ pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; -import { BlockHashAdapter } from "../BlockHashAdapter.sol"; import { BaseIsmpModule, IncomingPostRequest } from "@polytope-labs/ismp-solidity/interfaces/IIsmpModule.sol"; import { StateMachine } from "@polytope-labs/ismp-solidity/interfaces/StateMachine.sol"; +import { BlockHashAdapter } from "../BlockHashAdapter.sol"; contract HyperbridgeAdapter is BlockHashAdapter, Ownable, BaseIsmpModule { mapping(bytes32 => bytes32) public enabledReporters; diff --git a/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeReporter.sol b/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeReporter.sol index 7d37651a..8fc5a5ee 100644 --- a/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeReporter.sol +++ b/packages/evm/contracts/adapters/Hyperbridge/HyperbridgeReporter.sol @@ -3,10 +3,10 @@ pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import { Reporter } from "../Reporter.sol"; import { StateMachine } from "@polytope-labs/ismp-solidity/interfaces/StateMachine.sol"; import { BaseIsmpModule } from "@polytope-labs/ismp-solidity/interfaces/IIsmpModule.sol"; import { IDispatcher, DispatchPost } from "@polytope-labs/ismp-solidity/interfaces/IDispatcher.sol"; +import { Reporter } from "../Reporter.sol"; contract HyperbridgeReporter is Reporter, Ownable, BaseIsmpModule { string public constant PROVIDER = "hyperbridge"; From 9d0ab4a0cee4339e3e096844b963a8abee8570da Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 16 Sep 2024 14:45:28 +0200 Subject: [PATCH 258/297] chore(global): rm packageManager within evm and sdk and adds it within global yarn.lock --- packages/evm/package.json | 1 - packages/sdk/package.json | 1 - yarn.lock | 17755 +++++++++++++++--------------------- 3 files changed, 7260 insertions(+), 10497 deletions(-) diff --git a/packages/evm/package.json b/packages/evm/package.json index 98cc7899..0c6bfec9 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -71,7 +71,6 @@ "typescript", "typechain" ], - "packageManager": "yarn@3.2.1", "publishConfig": { "access": "public" }, diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 785aa48d..bf7c3d7f 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,6 +1,5 @@ { "name": "sdk", - "packageManager": "yarn@3.2.1", "dependencies": { "ethers": "^6.2.3" } diff --git a/yarn.lock b/yarn.lock index 0bed97db..8861a223 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,10499 +1,7264 @@ -# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! - -__metadata: - version: 6 - cacheKey: 8 - -"@adraffy/ens-normalize@npm:1.10.0": - version: 1.10.0 - resolution: "@adraffy/ens-normalize@npm:1.10.0" - checksum: af0540f963a2632da2bbc37e36ea6593dcfc607b937857133791781e246d47f870d5e3d21fa70d5cfe94e772c284588c81ea3f5b7f4ea8fbb824369444e4dbcb - languageName: node - linkType: hard - -"@adraffy/ens-normalize@npm:1.10.1": - version: 1.10.1 - resolution: "@adraffy/ens-normalize@npm:1.10.1" - checksum: 0836f394ea256972ec19a0b5e78cb7f5bcdfd48d8a32c7478afc94dd53ae44c04d1aa2303d7f3077b4f3ac2323b1f557ab9188e8059978748fdcd83e04a80dcc - languageName: node - linkType: hard - -"@axelar-network/axelar-gmp-sdk-solidity@npm:5.6.2": - version: 5.6.2 - resolution: "@axelar-network/axelar-gmp-sdk-solidity@npm:5.6.2" - checksum: d36260a18e0303446685fac3a04c14503454de830320b55ddb0d4382ef0d970c4cfd759029b17b1b6178f85cf3300500aa94705690e752b398dfbc32c414cf2d - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.22.13, @babel/code-frame@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/code-frame@npm:7.24.7" - dependencies: - "@babel/highlight": ^7.24.7 - picocolors: ^1.0.0 - checksum: 830e62cd38775fdf84d612544251ce773d544a8e63df667728cc9e0126eeef14c6ebda79be0f0bc307e8318316b7f58c27ce86702e0a1f5c321d842eb38ffda4 - languageName: node - linkType: hard - -"@babel/generator@npm:7.17.7": - version: 7.17.7 - resolution: "@babel/generator@npm:7.17.7" - dependencies: - "@babel/types": ^7.17.0 - jsesc: ^2.5.1 - source-map: ^0.5.0 - checksum: e7344b9b4559115f2754ecc2ae9508412ea6a8f617544cd3d3f17cabc727bd30630765f96c8a4ebc8901ded1492a3a6c23d695a4f1e8f3042f860b30c891985c - languageName: node - linkType: hard - -"@babel/generator@npm:^7.23.0": - version: 7.25.6 - resolution: "@babel/generator@npm:7.25.6" - dependencies: - "@babel/types": ^7.25.6 - "@jridgewell/gen-mapping": ^0.3.5 - "@jridgewell/trace-mapping": ^0.3.25 - jsesc: ^2.5.1 - checksum: b55975cd664f5602304d868bb34f4ee3bed6f5c7ce8132cd92ff27a46a53a119def28a182d91992e86f75db904f63094a81247703c4dc96e4db0c03fd04bcd68 - languageName: node - linkType: hard - -"@babel/helper-environment-visitor@npm:^7.22.20": - version: 7.24.7 - resolution: "@babel/helper-environment-visitor@npm:7.24.7" - dependencies: - "@babel/types": ^7.24.7 - checksum: 079d86e65701b29ebc10baf6ed548d17c19b808a07aa6885cc141b690a78581b180ee92b580d755361dc3b16adf975b2d2058b8ce6c86675fcaf43cf22f2f7c6 - languageName: node - linkType: hard - -"@babel/helper-function-name@npm:^7.23.0": - version: 7.24.7 - resolution: "@babel/helper-function-name@npm:7.24.7" - dependencies: - "@babel/template": ^7.24.7 - "@babel/types": ^7.24.7 - checksum: 142ee08922074dfdc0ff358e09ef9f07adf3671ab6eef4fca74dcf7a551f1a43717e7efa358c9e28d7eea84c28d7f177b7a58c70452fc312ae3b1893c5dab2a4 - languageName: node - linkType: hard - -"@babel/helper-hoist-variables@npm:^7.22.5": - version: 7.24.7 - resolution: "@babel/helper-hoist-variables@npm:7.24.7" - dependencies: - "@babel/types": ^7.24.7 - checksum: 6cfdcf2289cd12185dcdbdf2435fa8d3447b797ac75851166de9fc8503e2fd0021db6baf8dfbecad3753e582c08e6a3f805c8d00cbed756060a877d705bd8d8d - languageName: node - linkType: hard - -"@babel/helper-split-export-declaration@npm:^7.22.6": - version: 7.24.7 - resolution: "@babel/helper-split-export-declaration@npm:7.24.7" - dependencies: - "@babel/types": ^7.24.7 - checksum: e3ddc91273e5da67c6953f4aa34154d005a00791dc7afa6f41894e768748540f6ebcac5d16e72541aea0c89bee4b89b4da6a3d65972a0ea8bfd2352eda5b7e22 - languageName: node - linkType: hard - -"@babel/helper-string-parser@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/helper-string-parser@npm:7.24.8" - checksum: 39b03c5119216883878655b149148dc4d2e284791e969b19467a9411fccaa33f7a713add98f4db5ed519535f70ad273cdadfd2eb54d47ebbdeac5083351328ce - languageName: node - linkType: hard - -"@babel/helper-validator-identifier@npm:^7.16.7, @babel/helper-validator-identifier@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-validator-identifier@npm:7.24.7" - checksum: 6799ab117cefc0ecd35cd0b40ead320c621a298ecac88686a14cffceaac89d80cdb3c178f969861bf5fa5e4f766648f9161ea0752ecfe080d8e89e3147270257 - languageName: node - linkType: hard - -"@babel/highlight@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/highlight@npm:7.24.7" - dependencies: - "@babel/helper-validator-identifier": ^7.24.7 - chalk: ^2.4.2 - js-tokens: ^4.0.0 - picocolors: ^1.0.0 - checksum: 5cd3a89f143671c4ac129960024ba678b669e6fc673ce078030f5175002d1d3d52bc10b22c5b916a6faf644b5028e9a4bd2bb264d053d9b05b6a98690f1d46f1 - languageName: node - linkType: hard - -"@babel/parser@npm:^7.20.5, @babel/parser@npm:^7.23.0, @babel/parser@npm:^7.25.0": - version: 7.25.6 - resolution: "@babel/parser@npm:7.25.6" - dependencies: - "@babel/types": ^7.25.6 - bin: - parser: ./bin/babel-parser.js - checksum: 85b237ded09ee43cc984493c35f3b1ff8a83e8dbbb8026b8132e692db6567acc5a1659ec928e4baa25499ddd840d7dae9dee3062be7108fe23ec5f94a8066b1e - languageName: node - linkType: hard - -"@babel/runtime@npm:^7.25.0": - version: 7.25.6 - resolution: "@babel/runtime@npm:7.25.6" - dependencies: - regenerator-runtime: ^0.14.0 - checksum: ee1a69d3ac7802803f5ee6a96e652b78b8addc28c6a38c725a4ad7d61a059d9e6cb9f6550ed2f63cce67a1bd82e0b1ef66a1079d895be6bfb536a5cfbd9ccc32 - languageName: node - linkType: hard - -"@babel/template@npm:^7.24.7": - version: 7.25.0 - resolution: "@babel/template@npm:7.25.0" - dependencies: - "@babel/code-frame": ^7.24.7 - "@babel/parser": ^7.25.0 - "@babel/types": ^7.25.0 - checksum: 3f2db568718756d0daf2a16927b78f00c425046b654cd30b450006f2e84bdccaf0cbe6dc04994aa1f5f6a4398da2f11f3640a4d3ee31722e43539c4c919c817b - languageName: node - linkType: hard - -"@babel/traverse@npm:7.23.2": - version: 7.23.2 - resolution: "@babel/traverse@npm:7.23.2" - dependencies: - "@babel/code-frame": ^7.22.13 - "@babel/generator": ^7.23.0 - "@babel/helper-environment-visitor": ^7.22.20 - "@babel/helper-function-name": ^7.23.0 - "@babel/helper-hoist-variables": ^7.22.5 - "@babel/helper-split-export-declaration": ^7.22.6 - "@babel/parser": ^7.23.0 - "@babel/types": ^7.23.0 - debug: ^4.1.0 - globals: ^11.1.0 - checksum: 26a1eea0dde41ab99dde8b9773a013a0dc50324e5110a049f5d634e721ff08afffd54940b3974a20308d7952085ac769689369e9127dea655f868c0f6e1ab35d - languageName: node - linkType: hard - -"@babel/types@npm:7.17.0": - version: 7.17.0 - resolution: "@babel/types@npm:7.17.0" - dependencies: - "@babel/helper-validator-identifier": ^7.16.7 - to-fast-properties: ^2.0.0 - checksum: 12e5a287986fe557188e87b2c5202223f1dc83d9239a196ab936fdb9f8c1eb0be717ff19f934b5fad4e29a75586d5798f74bed209bccea1c20376b9952056f0e - languageName: node - linkType: hard - -"@babel/types@npm:^7.17.0, @babel/types@npm:^7.23.0, @babel/types@npm:^7.24.7, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.6": - version: 7.25.6 - resolution: "@babel/types@npm:7.25.6" - dependencies: - "@babel/helper-string-parser": ^7.24.8 - "@babel/helper-validator-identifier": ^7.24.7 - to-fast-properties: ^2.0.0 - checksum: 9b2f84ff3f874ad05b0b9bf06862c56f478b65781801f82296b4cc01bee39e79c20a7c0a06959fed0ee582c8267e1cb21638318655c5e070b0287242a844d1c9 - languageName: node - linkType: hard - -"@chainlink/contracts-ccip@npm:0.7.6": - version: 0.7.6 - resolution: "@chainlink/contracts-ccip@npm:0.7.6" - dependencies: - "@eth-optimism/contracts": ^0.5.21 - "@openzeppelin/contracts": ~4.3.3 - "@openzeppelin/contracts-upgradeable-4.7.3": "npm:@openzeppelin/contracts-upgradeable@v4.7.3" - "@openzeppelin/contracts-v0.7": "npm:@openzeppelin/contracts@v3.4.2" - checksum: 6acf068a82297d7738f88a542c6d533f23c42ff4bf855fc8efcc49c0d24281ba62007c9aa6a6b66384603bea1cfe2b281cec8d35f280b2900abca81775f30495 - languageName: node - linkType: hard - -"@chainsafe/as-sha256@npm:^0.3.1": - version: 0.3.1 - resolution: "@chainsafe/as-sha256@npm:0.3.1" - checksum: 58ea733be1657b0e31dbf48b0dba862da0833df34a81c1460c7352f04ce90874f70003cbf34d0afb9e5e53a33ee2d63a261a8b12462be85b2ba0a6f7f13d6150 - languageName: node - linkType: hard - -"@chainsafe/persistent-merkle-tree@npm:^0.4.2": - version: 0.4.2 - resolution: "@chainsafe/persistent-merkle-tree@npm:0.4.2" - dependencies: - "@chainsafe/as-sha256": ^0.3.1 - checksum: f9cfcb2132a243992709715dbd28186ab48c7c0c696f29d30857693cca5526bf753974a505ef68ffd5623bbdbcaa10f9083f4dd40bf99eb6408e451cc26a1a9e - languageName: node - linkType: hard - -"@chainsafe/persistent-merkle-tree@npm:^0.5.0": - version: 0.5.0 - resolution: "@chainsafe/persistent-merkle-tree@npm:0.5.0" - dependencies: - "@chainsafe/as-sha256": ^0.3.1 - checksum: 2c67203da776c79cd3a6132e2d672fe132393b2e63dc71604e3134acc8c0ec25cc5e431051545939ea0f7c5ff2066fb806b9e5cab974ca085d046226a1671f7d - languageName: node - linkType: hard - -"@chainsafe/ssz@npm:^0.10.0": - version: 0.10.2 - resolution: "@chainsafe/ssz@npm:0.10.2" - dependencies: - "@chainsafe/as-sha256": ^0.3.1 - "@chainsafe/persistent-merkle-tree": ^0.5.0 - checksum: 6bb70cf741d0a19dd0b28b3f6f067b96fa39f556e2eefa6ac745b21db9c3b3a8393dc3cca8ff4a6ce065ed71ddc3fb1b2b390a92004b9d01067c26e2558e5503 - languageName: node - linkType: hard - -"@chainsafe/ssz@npm:^0.9.2": - version: 0.9.4 - resolution: "@chainsafe/ssz@npm:0.9.4" - dependencies: - "@chainsafe/as-sha256": ^0.3.1 - "@chainsafe/persistent-merkle-tree": ^0.4.2 - case: ^1.6.3 - checksum: c6eaedeae9e5618b3c666ff4507a27647f665a8dcf17d5ca86da4ed4788c5a93868f256d0005467d184fdf35ec03f323517ec2e55ec42492d769540a2ec396bc - languageName: node - linkType: hard - -"@colors/colors@npm:1.6.0, @colors/colors@npm:^1.6.0": - version: 1.6.0 - resolution: "@colors/colors@npm:1.6.0" - checksum: aa209963e0c3218e80a4a20553ba8c0fbb6fa13140540b4e5f97923790be06801fc90172c1114fc8b7e888b3d012b67298cde6b9e81521361becfaee400c662f - languageName: node - linkType: hard - -"@commitlint/cli@npm:^17.3.0, @commitlint/cli@npm:^17.5.1": - version: 17.8.1 - resolution: "@commitlint/cli@npm:17.8.1" - dependencies: - "@commitlint/format": ^17.8.1 - "@commitlint/lint": ^17.8.1 - "@commitlint/load": ^17.8.1 - "@commitlint/read": ^17.8.1 - "@commitlint/types": ^17.8.1 - execa: ^5.0.0 - lodash.isfunction: ^3.0.9 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - yargs: ^17.0.0 - bin: - commitlint: cli.js - checksum: 293d5868e2f586a9ac5364c40eeb0fe2131ea689312c43d43ababe6f2415c998619c5070cf89e7298125a1d96b9e5912b85f51db75aedbfb189d67554f911dbf - languageName: node - linkType: hard - -"@commitlint/config-conventional@npm:^17.3.0, @commitlint/config-conventional@npm:^17.4.4": - version: 17.8.1 - resolution: "@commitlint/config-conventional@npm:17.8.1" - dependencies: - conventional-changelog-conventionalcommits: ^6.1.0 - checksum: ce8ace1a13f3a797ed699ffa13dc46273a27e1dc3ae8a9d01492c0637a8592e4ed24bb32d9a43f8745a8690a52d77ea4a950d039977b0dbcbf834f8cbacf5def - languageName: node - linkType: hard - -"@commitlint/config-validator@npm:^17.8.1": - version: 17.8.1 - resolution: "@commitlint/config-validator@npm:17.8.1" - dependencies: - "@commitlint/types": ^17.8.1 - ajv: ^8.11.0 - checksum: 487051cc36a82ba50f217dfd26721f4fa26d8c4206ee5cb0debd2793aa950280f3ca5bd1a8738e9c71ca8508b58548918b43169c21219ca4cb67f5dcd1e49d9f - languageName: node - linkType: hard - -"@commitlint/config-validator@npm:^19.5.0": - version: 19.5.0 - resolution: "@commitlint/config-validator@npm:19.5.0" - dependencies: - "@commitlint/types": ^19.5.0 - ajv: ^8.11.0 - checksum: 681bfdcabcb0ff794ea65d95128083869c97039c3a352219d6d88a2d4f3d0412b8ec515db77433fc6b0fce072051beb103d16889d42e76ea97873191ec191b23 - languageName: node - linkType: hard - -"@commitlint/ensure@npm:^17.8.1": - version: 17.8.1 - resolution: "@commitlint/ensure@npm:17.8.1" - dependencies: - "@commitlint/types": ^17.8.1 - lodash.camelcase: ^4.3.0 - lodash.kebabcase: ^4.1.1 - lodash.snakecase: ^4.1.1 - lodash.startcase: ^4.4.0 - lodash.upperfirst: ^4.3.1 - checksum: a4a5d3071df0e52dad0293c649c236f070c4fcd3380f11747a6f9b06b036adea281e557d117156e31313fbe18a7d71bf06e05e92776adbde7867190e1735bc43 - languageName: node - linkType: hard - -"@commitlint/execute-rule@npm:^17.8.1": - version: 17.8.1 - resolution: "@commitlint/execute-rule@npm:17.8.1" - checksum: 73354b5605931a71f727ee0262a5509277e92f134e2d704d44eafe4da7acb1cd2c7d084dcf8096cc0ac7ce83b023cc0ae8f79b17487b132ccc2e0b3920105a11 - languageName: node - linkType: hard - -"@commitlint/execute-rule@npm:^19.5.0": - version: 19.5.0 - resolution: "@commitlint/execute-rule@npm:19.5.0" - checksum: ff05568c3a287ef8564171d5bc5d4510b2e00b552e4703f79db3d62f3cba9d669710717695d199e04c2117d41f9e72d7e43a342d5c1b62d456bc8e8bb7dda1e9 - languageName: node - linkType: hard - -"@commitlint/format@npm:^17.8.1": - version: 17.8.1 - resolution: "@commitlint/format@npm:17.8.1" - dependencies: - "@commitlint/types": ^17.8.1 - chalk: ^4.1.0 - checksum: 0481e4d49196c942d7723a1abd352c3c884ceb9f434fb4e64bfab71bc264e9b7c643a81069f20d2a035fca70261a472508d73b1a60fe378c60534ca6301408b6 - languageName: node - linkType: hard - -"@commitlint/is-ignored@npm:^17.8.1": - version: 17.8.1 - resolution: "@commitlint/is-ignored@npm:17.8.1" - dependencies: - "@commitlint/types": ^17.8.1 - semver: 7.5.4 - checksum: 26eb2f1a84a774625f3f6fe4fa978c57d81028ee6a6925ab3fb02981ac395f9584ab4a71af59c3f2ac84a06c775e3f52683c033c565d86271a7aa99c2eb6025c - languageName: node - linkType: hard - -"@commitlint/lint@npm:^17.8.1": - version: 17.8.1 - resolution: "@commitlint/lint@npm:17.8.1" - dependencies: - "@commitlint/is-ignored": ^17.8.1 - "@commitlint/parse": ^17.8.1 - "@commitlint/rules": ^17.8.1 - "@commitlint/types": ^17.8.1 - checksum: 025712ad928098b3f94d8dc38566785f6c3eeba799725dbd935c5514141ea77b01e036fed1dbbf60cc954736f706ddbb85339751c43f16f5f3f94170d1decb2a - languageName: node - linkType: hard - -"@commitlint/load@npm:>6.1.1": - version: 19.5.0 - resolution: "@commitlint/load@npm:19.5.0" - dependencies: - "@commitlint/config-validator": ^19.5.0 - "@commitlint/execute-rule": ^19.5.0 - "@commitlint/resolve-extends": ^19.5.0 - "@commitlint/types": ^19.5.0 - chalk: ^5.3.0 - cosmiconfig: ^9.0.0 - cosmiconfig-typescript-loader: ^5.0.0 - lodash.isplainobject: ^4.0.6 - lodash.merge: ^4.6.2 - lodash.uniq: ^4.5.0 - checksum: 87a9450c768632c09e9d98993752a5622aee698642eee5a9b31c3c48625455e043406b7ea6e02a8f41d86c524c9ecbdb9b823caf67da3048f0d96531177fda28 - languageName: node - linkType: hard - -"@commitlint/load@npm:^17.8.1": - version: 17.8.1 - resolution: "@commitlint/load@npm:17.8.1" - dependencies: - "@commitlint/config-validator": ^17.8.1 - "@commitlint/execute-rule": ^17.8.1 - "@commitlint/resolve-extends": ^17.8.1 - "@commitlint/types": ^17.8.1 - "@types/node": 20.5.1 - chalk: ^4.1.0 - cosmiconfig: ^8.0.0 - cosmiconfig-typescript-loader: ^4.0.0 - lodash.isplainobject: ^4.0.6 - lodash.merge: ^4.6.2 - lodash.uniq: ^4.5.0 - resolve-from: ^5.0.0 - ts-node: ^10.8.1 - typescript: ^4.6.4 || ^5.2.2 - checksum: 5a9a9f0d4621a4cc61c965c3adc88d04ccac40640b022bb3bbad70ed4435bb0c103647a2e29e37fc3d68021dae041c937bee611fe2e5461bebe997640f4f626b - languageName: node - linkType: hard - -"@commitlint/message@npm:^17.8.1": - version: 17.8.1 - resolution: "@commitlint/message@npm:17.8.1" - checksum: ee3ca9bf02828ea322becba47c67f7585aa3fd22b197eab69679961e67e3c7bdf56f6ef41cb3b831b521af7dabd305eb5d7ee053c8294531cc8ca64dbbff82fc - languageName: node - linkType: hard - -"@commitlint/parse@npm:^17.8.1": - version: 17.8.1 - resolution: "@commitlint/parse@npm:17.8.1" - dependencies: - "@commitlint/types": ^17.8.1 - conventional-changelog-angular: ^6.0.0 - conventional-commits-parser: ^4.0.0 - checksum: 5322ae049b43a329761063b6e698714593d84d874147ced6290c8d88a9ebea2ba8c660a5815392a731377ac26fbf6b215bb9b87d84d8b49cb47fa1c62d228b24 - languageName: node - linkType: hard - -"@commitlint/read@npm:^17.8.1": - version: 17.8.1 - resolution: "@commitlint/read@npm:17.8.1" - dependencies: - "@commitlint/top-level": ^17.8.1 - "@commitlint/types": ^17.8.1 - fs-extra: ^11.0.0 - git-raw-commits: ^2.0.11 - minimist: ^1.2.6 - checksum: 122f1842cb8b87b2c447383095420d077dcae6fbb4f871f8b05fa088f99d95d18a8c6675be2eb3e67bf7ff47a9990764261e3eebc5e474404f14e3379f48df42 - languageName: node - linkType: hard - -"@commitlint/resolve-extends@npm:^17.8.1": - version: 17.8.1 - resolution: "@commitlint/resolve-extends@npm:17.8.1" - dependencies: - "@commitlint/config-validator": ^17.8.1 - "@commitlint/types": ^17.8.1 - import-fresh: ^3.0.0 - lodash.mergewith: ^4.6.2 - resolve-from: ^5.0.0 - resolve-global: ^1.0.0 - checksum: c6fb7d3f263b876ff805396abad27bc514b1a69dcc634903c28782f4f3932eddc37221daa3264a45a5b82d28aa17a57c7bab4830c6efae741cc875f137366608 - languageName: node - linkType: hard - -"@commitlint/resolve-extends@npm:^19.5.0": - version: 19.5.0 - resolution: "@commitlint/resolve-extends@npm:19.5.0" - dependencies: - "@commitlint/config-validator": ^19.5.0 - "@commitlint/types": ^19.5.0 - global-directory: ^4.0.1 - import-meta-resolve: ^4.0.0 - lodash.mergewith: ^4.6.2 - resolve-from: ^5.0.0 - checksum: 4198541f25fad991d9214373419a97aec9ff068a960d0a7f2070ea4c456aef0ac7c1ad49b55b20b0d4c57c19a55fad76806597d70a739781fdc74b6fbd5339a3 - languageName: node - linkType: hard - -"@commitlint/rules@npm:^17.8.1": - version: 17.8.1 - resolution: "@commitlint/rules@npm:17.8.1" - dependencies: - "@commitlint/ensure": ^17.8.1 - "@commitlint/message": ^17.8.1 - "@commitlint/to-lines": ^17.8.1 - "@commitlint/types": ^17.8.1 - execa: ^5.0.0 - checksum: b284514a4b8dad6bcbbc91c7548d69d0bbe9fcbdb241c15f5f9da413e8577c19d11190f1d709b38487c49dc874359bd9d0b72ab39f91cce06191e4ddaf8ec84d - languageName: node - linkType: hard - -"@commitlint/to-lines@npm:^17.8.1": - version: 17.8.1 - resolution: "@commitlint/to-lines@npm:17.8.1" - checksum: ff175c202c89537301f32b6e13ebe6919ac782a6e109cb5f6136566d71555a54f6574caf4d674d3409d32fdea1b4a28518837632ca05c7557d4f18f339574e62 - languageName: node - linkType: hard - -"@commitlint/top-level@npm:^17.8.1": - version: 17.8.1 - resolution: "@commitlint/top-level@npm:17.8.1" - dependencies: - find-up: ^5.0.0 - checksum: 25c8a6f4026c705a5ad4d9358eae7558734f549623da1c5f44cba8d6bc495f20d3ad05418febb8dca4f6b63f40bf44763007a14ab7209c435566843be114e7fc - languageName: node - linkType: hard - -"@commitlint/types@npm:^17.8.1": - version: 17.8.1 - resolution: "@commitlint/types@npm:17.8.1" - dependencies: - chalk: ^4.1.0 - checksum: a4cfa8c417aa0209694b96da04330282e41150caae1e1d0cec596ea34e3ce15afb84b3263abe5b89758ec1f3f71a9de0ee2d593df66db17b283127dd5e7cd6ac - languageName: node - linkType: hard - -"@commitlint/types@npm:^19.5.0": - version: 19.5.0 - resolution: "@commitlint/types@npm:19.5.0" - dependencies: - "@types/conventional-commits-parser": ^5.0.0 - chalk: ^5.3.0 - checksum: a26f33ec6987d7d93bdbd7e1b177cfac30ca056ea383faf343c6a09c0441aa057a24be1459c3d4e7e91edd2ecf8d6c4dd670948c9d22646d64767137c6db098a - languageName: node - linkType: hard - -"@connext/interfaces@npm:2.0.0": - version: 2.0.0 - resolution: "@connext/interfaces@npm:2.0.0" - checksum: 8cc776d9c0d5cc8ca92c0d0d4cc656b07efb4f48df517a85be54ef5a289db78f7dfc1d92ff4e41c5fd0788e29d63199ccfc6ee7340f9766a164ebf4ef7a83ff4 - languageName: node - linkType: hard - -"@cosmjs/encoding@npm:^0.31.3": - version: 0.31.3 - resolution: "@cosmjs/encoding@npm:0.31.3" - dependencies: - base64-js: ^1.3.0 - bech32: ^1.1.4 - readonly-date: ^1.0.0 - checksum: dadef0579828299be20a64edf820ac8770c0cc47a842594bc9b494f160a347b745941d795360755ccbe385b9d0912aa54753479d1a70ff762d2d334693952ff9 - languageName: node - linkType: hard - -"@cspotcode/source-map-support@npm:^0.8.0": - version: 0.8.1 - resolution: "@cspotcode/source-map-support@npm:0.8.1" - dependencies: - "@jridgewell/trace-mapping": 0.3.9 - checksum: 5718f267085ed8edb3e7ef210137241775e607ee18b77d95aa5bd7514f47f5019aa2d82d96b3bf342ef7aa890a346fa1044532ff7cc3009e7d24fce3ce6200fa - languageName: node - linkType: hard - -"@dabh/diagnostics@npm:^2.0.2": - version: 2.0.3 - resolution: "@dabh/diagnostics@npm:2.0.3" - dependencies: - colorspace: 1.1.x - enabled: 2.0.x - kuler: ^2.0.0 - checksum: 4879600c55c8315a0fb85fbb19057bad1adc08f0a080a8cb4e2b63f723c379bfc4283b68123a2b078d367b327dd8df12fcb27464efe791addc0a48b9df6d79a1 - languageName: node - linkType: hard - -"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": - version: 4.4.0 - resolution: "@eslint-community/eslint-utils@npm:4.4.0" - dependencies: - eslint-visitor-keys: ^3.3.0 - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: cdfe3ae42b4f572cbfb46d20edafe6f36fc5fb52bf2d90875c58aefe226892b9677fef60820e2832caf864a326fe4fc225714c46e8389ccca04d5f9288aabd22 - languageName: node - linkType: hard - -"@eslint-community/regexpp@npm:^4.4.0, @eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": - version: 4.11.0 - resolution: "@eslint-community/regexpp@npm:4.11.0" - checksum: 97d2fe46690b69417a551bd19a3dc53b6d9590d2295c43cc4c4e44e64131af541e2f4a44d5c12e87de990403654d3dae9d33600081f3a2f0386b368abc9111ec - languageName: node - linkType: hard - -"@eslint/eslintrc@npm:^2.1.4": - version: 2.1.4 - resolution: "@eslint/eslintrc@npm:2.1.4" - 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 - checksum: 10957c7592b20ca0089262d8c2a8accbad14b4f6507e35416c32ee6b4dbf9cad67dfb77096bbd405405e9ada2b107f3797fe94362e1c55e0b09d6e90dd149127 - languageName: node - linkType: hard - -"@eslint/js@npm:8.57.0": - version: 8.57.0 - resolution: "@eslint/js@npm:8.57.0" - checksum: 315dc65b0e9893e2bff139bddace7ea601ad77ed47b4550e73da8c9c2d2766c7a575c3cddf17ef85b8fd6a36ff34f91729d0dcca56e73ca887c10df91a41b0bb - languageName: node - linkType: hard - -"@eth-optimism/contracts@npm:^0.5.21": - version: 0.5.40 - resolution: "@eth-optimism/contracts@npm:0.5.40" - dependencies: - "@eth-optimism/core-utils": 0.12.0 - "@ethersproject/abstract-provider": ^5.7.0 - "@ethersproject/abstract-signer": ^5.7.0 - peerDependencies: - ethers: ^5 - checksum: 11dde466c90b886efe8b5fd123fa5893187a4ff84839213d417f90ae4e45bf00b2f62d56e4ebe23ba5dd7ec33beed22c4c41e206add35fce0db073fe2dbae6ba - languageName: node - linkType: hard - -"@eth-optimism/contracts@npm:^0.6.0": - version: 0.6.0 - resolution: "@eth-optimism/contracts@npm:0.6.0" - dependencies: - "@eth-optimism/core-utils": 0.12.0 - "@ethersproject/abstract-provider": ^5.7.0 - "@ethersproject/abstract-signer": ^5.7.0 - peerDependencies: - ethers: ^5 - checksum: 52e9a6cc6ad9bf3ab085d3be501fa4c89e48865baa8aee01aff39c2b007b69600304c7e8f8f4e00d67396e48a0dbfe3a260437efd3a4d7216424cece52639870 - languageName: node - linkType: hard - -"@eth-optimism/core-utils@npm:0.12.0": - version: 0.12.0 - resolution: "@eth-optimism/core-utils@npm:0.12.0" - dependencies: - "@ethersproject/abi": ^5.7.0 - "@ethersproject/abstract-provider": ^5.7.0 - "@ethersproject/address": ^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/keccak256": ^5.7.0 - "@ethersproject/properties": ^5.7.0 - "@ethersproject/providers": ^5.7.0 - "@ethersproject/rlp": ^5.7.0 - "@ethersproject/transactions": ^5.7.0 - "@ethersproject/web": ^5.7.0 - bufio: ^1.0.7 - chai: ^4.3.4 - checksum: 1c820107c44bdbb46becb1b00fd0dabb44f3ac8f54e6da7872a5a134411fad26f53b193225da55e79d6a8d7f0d01cc16a123db5d41ebaf02ca78360249a4b52a - languageName: node - linkType: hard - -"@ethereumjs/rlp@npm:^4.0.1": - version: 4.0.1 - resolution: "@ethereumjs/rlp@npm:4.0.1" - bin: - rlp: bin/rlp - checksum: 30db19c78faa2b6ff27275ab767646929207bb207f903f09eb3e4c273ce2738b45f3c82169ddacd67468b4f063d8d96035f2bf36f02b6b7e4d928eefe2e3ecbc - languageName: node - linkType: hard - -"@ethereumjs/util@npm:^8.1.0": - version: 8.1.0 - resolution: "@ethereumjs/util@npm:8.1.0" - dependencies: - "@ethereumjs/rlp": ^4.0.1 - ethereum-cryptography: ^2.0.0 - micro-ftch: ^0.3.1 - checksum: 9ae5dee8f12b0faf81cd83f06a41560e79b0ba96a48262771d897a510ecae605eb6d84f687da001ab8ccffd50f612ae50f988ef76e6312c752897f462f3ac08d - languageName: node - linkType: hard - -"@ethersproject/abi@npm:5.7.0, @ethersproject/abi@npm:^5.0.9, @ethersproject/abi@npm:^5.1.2, @ethersproject/abi@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/abi@npm:5.7.0" - 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 - checksum: bc6962bb6cb854e4d2a4d65b2c49c716477675b131b1363312234bdbb7e19badb7d9ce66f4ca2a70ae2ea84f7123dbc4e300a1bfe5d58864a7eafabc1466627e - languageName: node - linkType: hard - -"@ethersproject/abstract-provider@npm:5.7.0, @ethersproject/abstract-provider@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/abstract-provider@npm:5.7.0" - 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 - checksum: 74cf4696245cf03bb7cc5b6cbf7b4b89dd9a79a1c4688126d214153a938126d4972d42c93182198653ce1de35f2a2cad68be40337d4774b3698a39b28f0228a8 - languageName: node - linkType: hard - -"@ethersproject/abstract-signer@npm:5.7.0, @ethersproject/abstract-signer@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/abstract-signer@npm:5.7.0" - 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 - checksum: a823dac9cfb761e009851050ebebd5b229d1b1cc4a75b125c2da130ff37e8218208f7f9d1386f77407705b889b23d4a230ad67185f8872f083143e0073cbfbe3 - languageName: node - linkType: hard - -"@ethersproject/address@npm:5.7.0, @ethersproject/address@npm:^5.0.2, @ethersproject/address@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/address@npm:5.7.0" - 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 - checksum: 64ea5ebea9cc0e845c413e6cb1e54e157dd9fc0dffb98e239d3a3efc8177f2ff798cd4e3206cf3660ee8faeb7bef1a47dc0ebef0d7b132c32e61e550c7d4c843 - languageName: node - linkType: hard - -"@ethersproject/base64@npm:5.7.0, @ethersproject/base64@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/base64@npm:5.7.0" - dependencies: - "@ethersproject/bytes": ^5.7.0 - checksum: 7dd5d734d623582f08f665434f53685041a3d3b334a0e96c0c8afa8bbcaab934d50e5b6b980e826a8fde8d353e0b18f11e61faf17468177274b8e7c69cd9742b - languageName: node - linkType: hard - -"@ethersproject/basex@npm:5.7.0, @ethersproject/basex@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/basex@npm:5.7.0" - dependencies: - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/properties": ^5.7.0 - checksum: 326087b7e1f3787b5fe6cd1cf2b4b5abfafbc355a45e88e22e5e9d6c845b613ffc5301d629b28d5c4d5e2bfe9ec424e6782c804956dff79be05f0098cb5817de - languageName: node - linkType: hard - -"@ethersproject/bignumber@npm:5.7.0, @ethersproject/bignumber@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/bignumber@npm:5.7.0" - dependencies: - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - bn.js: ^5.2.1 - checksum: 8c9a134b76f3feb4ec26a5a27379efb4e156b8fb2de0678a67788a91c7f4e30abe9d948638458e4b20f2e42380da0adacc7c9389d05fce070692edc6ae9b4904 - languageName: node - linkType: hard - -"@ethersproject/bytes@npm:5.7.0, @ethersproject/bytes@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/bytes@npm:5.7.0" - dependencies: - "@ethersproject/logger": ^5.7.0 - checksum: 66ad365ceaab5da1b23b72225c71dce472cf37737af5118181fa8ab7447d696bea15ca22e3a0e8836fdd8cfac161afe321a7c67d0dde96f9f645ddd759676621 - languageName: node - linkType: hard - -"@ethersproject/constants@npm:5.7.0, @ethersproject/constants@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/constants@npm:5.7.0" - dependencies: - "@ethersproject/bignumber": ^5.7.0 - checksum: 6d4b1355747cce837b3e76ec3bde70e4732736f23b04f196f706ebfa5d4d9c2be50904a390d4d40ce77803b98d03d16a9b6898418e04ba63491933ce08c4ba8a - languageName: node - linkType: hard - -"@ethersproject/contracts@npm:5.7.0, @ethersproject/contracts@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/contracts@npm:5.7.0" - 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 - checksum: 6ccf1121cba01b31e02f8c507cb971ab6bfed85706484a9ec09878ef1594a62215f43c4fdef8f4a4875b99c4a800bc95e3be69b1803f8ce479e07634b5a740c0 - languageName: node - linkType: hard - -"@ethersproject/hash@npm:5.7.0, @ethersproject/hash@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/hash@npm:5.7.0" - 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 - checksum: 6e9fa8d14eb08171cd32f17f98cc108ec2aeca74a427655f0d689c550fee0b22a83b3b400fad7fb3f41cf14d4111f87f170aa7905bcbcd1173a55f21b06262ef - languageName: node - linkType: hard - -"@ethersproject/hdnode@npm:5.7.0, @ethersproject/hdnode@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/hdnode@npm:5.7.0" - 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 - checksum: bfe5ca2d89a42de73655f853170ef4766b933c5f481cddad709b3aca18823275b096e572f92d1602a052f80b426edde44ad6b9d028799775a7dad4a5bbed2133 - languageName: node - linkType: hard - -"@ethersproject/json-wallets@npm:5.7.0, @ethersproject/json-wallets@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/json-wallets@npm:5.7.0" - 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 - checksum: f583458d22db62efaaf94d38dd243482776a45bf90f9f3882fbad5aa0b8fd288b41eb7c1ff8ec0b99c9b751088e43d6173530db64dd33c59f9d8daa8d7ad5aa2 - languageName: node - linkType: hard - -"@ethersproject/keccak256@npm:5.7.0, @ethersproject/keccak256@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/keccak256@npm:5.7.0" - dependencies: - "@ethersproject/bytes": ^5.7.0 - js-sha3: 0.8.0 - checksum: ff70950d82203aab29ccda2553422cbac2e7a0c15c986bd20a69b13606ed8bb6e4fdd7b67b8d3b27d4f841e8222cbaccd33ed34be29f866fec7308f96ed244c6 - languageName: node - linkType: hard - -"@ethersproject/logger@npm:5.7.0, @ethersproject/logger@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/logger@npm:5.7.0" - checksum: 075ab2f605f1fd0813f2e39c3308f77b44a67732b36e712d9bc085f22a84aac4da4f71b39bee50fe78da3e1c812673fadc41180c9970fe5e486e91ea17befe0d - languageName: node - linkType: hard - -"@ethersproject/networks@npm:5.7.1, @ethersproject/networks@npm:^5.7.0": - version: 5.7.1 - resolution: "@ethersproject/networks@npm:5.7.1" - dependencies: - "@ethersproject/logger": ^5.7.0 - checksum: 0339f312304c17d9a0adce550edb825d4d2c8c9468c1634c44172c67a9ed256f594da62c4cda5c3837a0f28b7fabc03aca9b492f68ff1fdad337ee861b27bd5d - languageName: node - linkType: hard - -"@ethersproject/pbkdf2@npm:5.7.0, @ethersproject/pbkdf2@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/pbkdf2@npm:5.7.0" - dependencies: - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/sha2": ^5.7.0 - checksum: b895adb9e35a8a127e794f7aadc31a2424ef355a70e51cde10d457e3e888bb8102373199a540cf61f2d6b9a32e47358f9c65b47d559f42bf8e596b5fd67901e9 - languageName: node - linkType: hard - -"@ethersproject/properties@npm:5.7.0, @ethersproject/properties@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/properties@npm:5.7.0" - dependencies: - "@ethersproject/logger": ^5.7.0 - checksum: 6ab0ccf0c3aadc9221e0cdc5306ce6cd0df7f89f77d77bccdd1277182c9ead0202cd7521329ba3acde130820bf8af299e17cf567d0d497c736ee918207bbf59f - languageName: node - linkType: hard - -"@ethersproject/providers@npm:5.7.2, @ethersproject/providers@npm:^5.7.0, @ethersproject/providers@npm:^5.7.1, @ethersproject/providers@npm:^5.7.2": - version: 5.7.2 - resolution: "@ethersproject/providers@npm:5.7.2" - 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 - checksum: 1754c731a5ca6782ae9677f4a9cd8b6246c4ef21a966c9a01b133750f3c578431ec43ec254e699969c4a0f87e84463ded50f96b415600aabd37d2056aee58c19 - languageName: node - linkType: hard - -"@ethersproject/random@npm:5.7.0, @ethersproject/random@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/random@npm:5.7.0" - dependencies: - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - checksum: 017829c91cff6c76470852855108115b0b52c611b6be817ed1948d56ba42d6677803ec2012aa5ae298a7660024156a64c11fcf544e235e239ab3f89f0fff7345 - languageName: node - linkType: hard - -"@ethersproject/rlp@npm:5.7.0, @ethersproject/rlp@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/rlp@npm:5.7.0" - dependencies: - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - checksum: bce165b0f7e68e4d091c9d3cf47b247cac33252df77a095ca4281d32d5eeaaa3695d9bc06b2b057c5015353a68df89f13a4a54a72e888e4beeabbe56b15dda6e - languageName: node - linkType: hard - -"@ethersproject/sha2@npm:5.7.0, @ethersproject/sha2@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/sha2@npm:5.7.0" - dependencies: - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - hash.js: 1.1.7 - checksum: 09321057c022effbff4cc2d9b9558228690b5dd916329d75c4b1ffe32ba3d24b480a367a7cc92d0f0c0b1c896814d03351ae4630e2f1f7160be2bcfbde435dbc - languageName: node - linkType: hard - -"@ethersproject/signing-key@npm:5.7.0, @ethersproject/signing-key@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/signing-key@npm:5.7.0" - 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 - checksum: 8f8de09b0aac709683bbb49339bc0a4cd2f95598f3546436c65d6f3c3a847ffa98e06d35e9ed2b17d8030bd2f02db9b7bd2e11c5cf8a71aad4537487ab4cf03a - languageName: node - linkType: hard - -"@ethersproject/solidity@npm:5.7.0, @ethersproject/solidity@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/solidity@npm:5.7.0" - 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 - checksum: 9a02f37f801c96068c3e7721f83719d060175bc4e80439fe060e92bd7acfcb6ac1330c7e71c49f4c2535ca1308f2acdcb01e00133129aac00581724c2d6293f3 - languageName: node - linkType: hard - -"@ethersproject/strings@npm:5.7.0, @ethersproject/strings@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/strings@npm:5.7.0" - dependencies: - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/constants": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - checksum: 5ff78693ae3fdf3cf23e1f6dc047a61e44c8197d2408c42719fef8cb7b7b3613a4eec88ac0ed1f9f5558c74fe0de7ae3195a29ca91a239c74b9f444d8e8b50df - languageName: node - linkType: hard - -"@ethersproject/transactions@npm:5.7.0, @ethersproject/transactions@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/transactions@npm:5.7.0" - 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 - checksum: a31b71996d2b283f68486241bff0d3ea3f1ba0e8f1322a8fffc239ccc4f4a7eb2ea9994b8fd2f093283fd75f87bae68171e01b6265261f821369aca319884a79 - languageName: node - linkType: hard - -"@ethersproject/units@npm:5.7.0": - version: 5.7.0 - resolution: "@ethersproject/units@npm:5.7.0" - dependencies: - "@ethersproject/bignumber": ^5.7.0 - "@ethersproject/constants": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - checksum: 304714f848cd32e57df31bf545f7ad35c2a72adae957198b28cbc62166daa929322a07bff6e9c9ac4577ab6aa0de0546b065ed1b2d20b19e25748b7d475cb0fc - languageName: node - linkType: hard - -"@ethersproject/wallet@npm:5.7.0, @ethersproject/wallet@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/wallet@npm:5.7.0" - 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 - checksum: a4009bf7331eddab38e3015b5e9101ef92de7f705b00a6196b997db0e5635b6d83561674d46c90c6f77b87c0500fe4a6b0183ba13749efc22db59c99deb82fbd - languageName: node - linkType: hard - -"@ethersproject/web@npm:5.7.1, @ethersproject/web@npm:^5.7.0": - version: 5.7.1 - resolution: "@ethersproject/web@npm:5.7.1" - 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 - checksum: 7028c47103f82fd2e2c197ce0eecfacaa9180ffeec7de7845b1f4f9b19d84081b7a48227aaddde05a4aaa526af574a9a0ce01cc0fc75e3e371f84b38b5b16b2b - languageName: node - linkType: hard - -"@ethersproject/wordlists@npm:5.7.0, @ethersproject/wordlists@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/wordlists@npm:5.7.0" - 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 - checksum: 30eb6eb0731f9ef5faa44bf9c0c6e950bcaaef61e4d2d9ce0ae6d341f4e2d6d1f4ab4f8880bfce03b7aac4b862fb740e1421170cfbf8e2aafc359277d49e6e97 - languageName: node - linkType: hard - -"@fastify/busboy@npm:^2.0.0": - version: 2.1.1 - resolution: "@fastify/busboy@npm:2.1.1" - checksum: 42c32ef75e906c9a4809c1e1930a5ca6d4ddc8d138e1a8c8ba5ea07f997db32210617d23b2e4a85fe376316a41a1a0439fc6ff2dedf5126d96f45a9d80754fb2 - languageName: node - linkType: hard - -"@gnosis/hashi-common@0.1.0, @gnosis/hashi-common@workspace:packages/common": - version: 0.0.0-use.local - resolution: "@gnosis/hashi-common@workspace:packages/common" - dependencies: - "@types/node": ^20.8.9 - "@typescript-eslint/eslint-plugin": ^6.7.5 - "@typescript-eslint/parser": ^6.7.5 - eslint: ^8.51.0 - eslint-config-prettier: ^9.0.0 - prettier: ^3.0.3 - ts-node: ^10.9.1 - typescript: ^5.2.2 - viem: ^2.9.28 - winston: ^3.11.0 - languageName: unknown - linkType: soft - -"@gnosis/hashi-evm@workspace:packages/evm": - version: 0.0.0-use.local - resolution: "@gnosis/hashi-evm@workspace:packages/evm" - dependencies: - "@axelar-network/axelar-gmp-sdk-solidity": 5.6.2 - "@chainlink/contracts-ccip": 0.7.6 - "@commitlint/cli": ^17.3.0 - "@commitlint/config-conventional": ^17.3.0 - "@connext/interfaces": 2.0.0 - "@ethersproject/abi": ^5.7.0 - "@ethersproject/abstract-signer": ^5.7.0 - "@ethersproject/bignumber": ^5.7.0 - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/providers": ^5.7.2 - "@hyperlane-xyz/core": 3.1.10 - "@nomicfoundation/hardhat-chai-matchers": ^1.0.4 - "@nomicfoundation/hardhat-network-helpers": ^1.0.8 - "@nomicfoundation/hardhat-toolbox": ^2.0.0 - "@nomiclabs/hardhat-ethers": ^2.2.1 - "@nomiclabs/hardhat-etherscan": ^3.1.2 - "@openzeppelin/contracts-upgradeable": 4.8.1 - "@polytope-labs/ismp-solidity": ^0.7.1 - "@polytope-labs/solidity-merkle-trees": 0.3.2 - "@routerprotocol/evm-gateway-contracts": 1.1.13 - "@trivago/prettier-plugin-sort-imports": ^4.0.0 - "@typechain/ethers-v5": ^10.1.1 - "@typechain/hardhat": ^6.1.4 - "@types/chai": ^4.3.4 - "@types/fs-extra": ^9.0.13 - "@types/mocha": ^10.0.0 - "@types/node": ^18.11.9 - "@typescript-eslint/eslint-plugin": ^5.44.0 - "@typescript-eslint/parser": ^5.44.0 - chai: ^4.3.7 - commitizen: ^4.2.5 - cross-env: ^7.0.3 - cz-conventional-changelog: ^3.3.0 - dotenv: ^16.0.3 - eslint: ^8.28.0 - eslint-config-prettier: ^8.5.0 - ethers: ^5.7.2 - fs-extra: ^10.1.0 - hardhat: 2.19.4 - hardhat-change-network: ^0.0.7 - hardhat-deploy: ^0.11.31 - hardhat-gas-reporter: ^1.0.9 - lint-staged: ^13.0.4 - lodash: ^4.17.21 - mocha: ^10.1.0 - pinst: ^3.0.0 - prettier: ^2.8.7 - prettier-plugin-solidity: ^1.0.0 - shx: ^0.3.4 - solhint: ^3.3.7 - solhint-plugin-prettier: ^0.0.5 - solidity-coverage: ^0.8.2 - solidity-rlp: 2.0.8 - ts-generator: ^0.1.1 - ts-node: ^10.9.1 - typechain: ^8.1.1 - typescript: ^4.9.3 - languageName: unknown - linkType: soft - -"@gnosis/hashi-executor@workspace:packages/executor": - version: 0.0.0-use.local - resolution: "@gnosis/hashi-executor@workspace:packages/executor" - dependencies: - "@gnosis/hashi-common": 0.1.0 - "@types/node": ^20.8.9 - "@typescript-eslint/eslint-plugin": ^6.7.5 - "@typescript-eslint/parser": ^6.7.5 - dotenv: ^16.3.1 - eslint: ^8.51.0 - eslint-config-prettier: ^9.0.0 - mongodb: 6.5.0 - nodemon: ^3.0.1 - prettier: ^3.0.3 - ts-node: ^10.9.1 - typescript: ^5.2.2 - viem: ^2.9.28 - winston: ^3.11.0 - languageName: unknown - linkType: soft - -"@gnosis/hashi-relayer@workspace:packages/relayer": - version: 0.0.0-use.local - resolution: "@gnosis/hashi-relayer@workspace:packages/relayer" - dependencies: - "@gnosis/hashi-common": 0.1.0 - "@types/node": ^20.8.9 - "@typescript-eslint/eslint-plugin": ^6.7.5 - "@typescript-eslint/parser": ^6.7.5 - dotenv: ^16.3.1 - eslint: ^8.51.0 - eslint-config-prettier: ^9.0.0 - mongodb: 6.5.0 - nodemon: ^3.0.1 - prettier: ^3.0.3 - ts-node: ^10.9.1 - typescript: ^5.2.2 - viem: ^2.9.28 - winston: ^3.11.0 - languageName: unknown - linkType: soft - -"@humanwhocodes/config-array@npm:^0.11.14": - version: 0.11.14 - resolution: "@humanwhocodes/config-array@npm:0.11.14" - dependencies: - "@humanwhocodes/object-schema": ^2.0.2 - debug: ^4.3.1 - minimatch: ^3.0.5 - checksum: 861ccce9eaea5de19546653bccf75bf09fe878bc39c3aab00aeee2d2a0e654516adad38dd1098aab5e3af0145bbcbf3f309bdf4d964f8dab9dcd5834ae4c02f2 - languageName: node - linkType: hard - -"@humanwhocodes/module-importer@npm:^1.0.1": - version: 1.0.1 - resolution: "@humanwhocodes/module-importer@npm:1.0.1" - checksum: 0fd22007db8034a2cdf2c764b140d37d9020bbfce8a49d3ec5c05290e77d4b0263b1b972b752df8c89e5eaa94073408f2b7d977aed131faf6cf396ebb5d7fb61 - languageName: node - linkType: hard - -"@humanwhocodes/object-schema@npm:^2.0.2": - version: 2.0.3 - resolution: "@humanwhocodes/object-schema@npm:2.0.3" - checksum: d3b78f6c5831888c6ecc899df0d03bcc25d46f3ad26a11d7ea52944dc36a35ef543fad965322174238d677a43d5c694434f6607532cff7077062513ad7022631 - languageName: node - linkType: hard - -"@hyperlane-xyz/core@npm:3.1.10": - version: 3.1.10 - resolution: "@hyperlane-xyz/core@npm:3.1.10" - dependencies: - "@eth-optimism/contracts": ^0.6.0 - "@hyperlane-xyz/utils": 3.1.10 - "@openzeppelin/contracts": ^4.9.3 - "@openzeppelin/contracts-upgradeable": ^v4.9.3 - peerDependencies: - "@ethersproject/abi": "*" - "@ethersproject/providers": "*" - "@types/sinon-chai": "*" - checksum: af099ebb9d4615ab7ce89ab0611563cbe9699a405161e3ce67b4ab203ea65bff4148e0c46eaecacc9698525d2d591fe55198c7692f8008e828e199b5de2630fd - languageName: node - linkType: hard - -"@hyperlane-xyz/utils@npm:3.1.10": - version: 3.1.10 - resolution: "@hyperlane-xyz/utils@npm:3.1.10" - dependencies: - "@cosmjs/encoding": ^0.31.3 - "@solana/web3.js": ^1.78.0 - bignumber.js: ^9.1.1 - ethers: ^5.7.2 - checksum: c549a3a73f6c4e666f0344bf5443cac07a8aea4039e2af13adc26c430d81f68d7254f3d3a5d18bcdf30f6ea41ea5ab1c7f723f81ae23bad36ee1292c290247c9 - languageName: node - linkType: hard - -"@isaacs/cliui@npm:^8.0.2": - version: 8.0.2 - resolution: "@isaacs/cliui@npm:8.0.2" - dependencies: - string-width: ^5.1.2 - string-width-cjs: "npm:string-width@^4.2.0" - strip-ansi: ^7.0.1 - strip-ansi-cjs: "npm:strip-ansi@^6.0.1" - wrap-ansi: ^8.1.0 - wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" - checksum: 4a473b9b32a7d4d3cfb7a614226e555091ff0c5a29a1734c28c72a182c2f6699b26fc6b5c2131dfd841e86b185aea714c72201d7c98c2fba5f17709333a67aeb - languageName: node - linkType: hard - -"@jridgewell/gen-mapping@npm:^0.3.5": - version: 0.3.5 - resolution: "@jridgewell/gen-mapping@npm:0.3.5" - dependencies: - "@jridgewell/set-array": ^1.2.1 - "@jridgewell/sourcemap-codec": ^1.4.10 - "@jridgewell/trace-mapping": ^0.3.24 - checksum: ff7a1764ebd76a5e129c8890aa3e2f46045109dabde62b0b6c6a250152227647178ff2069ea234753a690d8f3c4ac8b5e7b267bbee272bffb7f3b0a370ab6e52 - languageName: node - linkType: hard - -"@jridgewell/resolve-uri@npm:^3.0.3, @jridgewell/resolve-uri@npm:^3.1.0": - version: 3.1.2 - resolution: "@jridgewell/resolve-uri@npm:3.1.2" - checksum: 83b85f72c59d1c080b4cbec0fef84528963a1b5db34e4370fa4bd1e3ff64a0d80e0cee7369d11d73c704e0286fb2865b530acac7a871088fbe92b5edf1000870 - languageName: node - linkType: hard - -"@jridgewell/set-array@npm:^1.2.1": - version: 1.2.1 - resolution: "@jridgewell/set-array@npm:1.2.1" - checksum: 832e513a85a588f8ed4f27d1279420d8547743cc37fcad5a5a76fc74bb895b013dfe614d0eed9cb860048e6546b798f8f2652020b4b2ba0561b05caa8c654b10 - languageName: node - linkType: hard - -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": - version: 1.5.0 - resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" - checksum: 05df4f2538b3b0f998ea4c1cd34574d0feba216fa5d4ccaef0187d12abf82eafe6021cec8b49f9bb4d90f2ba4582ccc581e72986a5fcf4176ae0cfeb04cf52ec - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:0.3.9": - version: 0.3.9 - resolution: "@jridgewell/trace-mapping@npm:0.3.9" - dependencies: - "@jridgewell/resolve-uri": ^3.0.3 - "@jridgewell/sourcemap-codec": ^1.4.10 - checksum: d89597752fd88d3f3480845691a05a44bd21faac18e2185b6f436c3b0fd0c5a859fbbd9aaa92050c4052caf325ad3e10e2e1d1b64327517471b7d51babc0ddef - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": - version: 0.3.25 - resolution: "@jridgewell/trace-mapping@npm:0.3.25" - dependencies: - "@jridgewell/resolve-uri": ^3.1.0 - "@jridgewell/sourcemap-codec": ^1.4.14 - checksum: 9d3c40d225e139987b50c48988f8717a54a8c994d8a948ee42e1412e08988761d0754d7d10b803061cc3aebf35f92a5dbbab493bd0e1a9ef9e89a2130e83ba34 - languageName: node - linkType: hard - -"@metamask/eth-sig-util@npm:^4.0.0": - version: 4.0.1 - resolution: "@metamask/eth-sig-util@npm:4.0.1" - dependencies: - ethereumjs-abi: ^0.6.8 - ethereumjs-util: ^6.2.1 - ethjs-util: ^0.1.6 - tweetnacl: ^1.0.3 - tweetnacl-util: ^0.15.1 - checksum: 740df4c92a1282e6be4c00c86c1a8ccfb93e767596e43f6da895aa5bab4a28fc3c2209f0327db34924a4a1e9db72bc4d3dddfcfc45cca0b218c9ccbf7d1b1445 - languageName: node - linkType: hard - -"@mongodb-js/saslprep@npm:^1.1.5": - version: 1.1.9 - resolution: "@mongodb-js/saslprep@npm:1.1.9" - dependencies: - sparse-bitfield: ^3.0.3 - checksum: 6f13983e41c9fbd5273eeae9135e47e5b7a19125a63287bea69e33a618f8e034cfcf2258c77d0f5d6dcf386dfe2bb520bc01613afd1528c52f82c71172629242 - languageName: node - linkType: hard - -"@noble/curves@npm:1.2.0": - version: 1.2.0 - resolution: "@noble/curves@npm:1.2.0" - dependencies: - "@noble/hashes": 1.3.2 - checksum: bb798d7a66d8e43789e93bc3c2ddff91a1e19fdb79a99b86cd98f1e5eff0ee2024a2672902c2576ef3577b6f282f3b5c778bebd55761ddbb30e36bf275e83dd0 - languageName: node - linkType: hard - -"@noble/curves@npm:1.4.0": - version: 1.4.0 - resolution: "@noble/curves@npm:1.4.0" - dependencies: - "@noble/hashes": 1.4.0 - checksum: 0014ff561d16e98da4a57e2310a4015e4bdab3b1e1eafcd18d3f9b955c29c3501452ca5d702fddf8ca92d570bbeadfbe53fe16ebbd81a319c414f739154bb26b - languageName: node - linkType: hard - -"@noble/curves@npm:1.4.2, @noble/curves@npm:~1.4.0": - version: 1.4.2 - resolution: "@noble/curves@npm:1.4.2" - dependencies: - "@noble/hashes": 1.4.0 - checksum: c475a83c4263e2c970eaba728895b9b5d67e0ca880651e9c6e3efdc5f6a4f07ceb5b043bf71c399fc80fada0b8706e69d0772bffdd7b9de2483b988973a34cba - languageName: node - linkType: hard - -"@noble/curves@npm:^1.4.0, @noble/curves@npm:^1.4.2": - version: 1.6.0 - resolution: "@noble/curves@npm:1.6.0" - dependencies: - "@noble/hashes": 1.5.0 - checksum: 258f3feb2a6098cf35521562ecb7d452fd728e8a008ff9f1ef435184f9d0c782ceb8f7b7fa8df3317c3be7a19f53995ee124cd05c8080b130bd42e3cb072f24d - languageName: node - linkType: hard - -"@noble/hashes@npm:1.2.0, @noble/hashes@npm:~1.2.0": - version: 1.2.0 - resolution: "@noble/hashes@npm:1.2.0" - checksum: 8ca080ce557b8f40fb2f78d3aedffd95825a415ac8e13d7ffe3643f8626a8c2d99a3e5975b555027ac24316d8b3c02a35b8358567c0c23af681e6573602aa434 - languageName: node - linkType: hard - -"@noble/hashes@npm:1.3.2": - version: 1.3.2 - resolution: "@noble/hashes@npm:1.3.2" - checksum: fe23536b436539d13f90e4b9be843cc63b1b17666a07634a2b1259dded6f490be3d050249e6af98076ea8f2ea0d56f578773c2197f2aa0eeaa5fba5bc18ba474 - languageName: node - linkType: hard - -"@noble/hashes@npm:1.4.0, @noble/hashes@npm:~1.4.0": - version: 1.4.0 - resolution: "@noble/hashes@npm:1.4.0" - checksum: 8ba816ae26c90764b8c42493eea383716396096c5f7ba6bea559993194f49d80a73c081f315f4c367e51bd2d5891700bcdfa816b421d24ab45b41cb03e4f3342 - languageName: node - linkType: hard - -"@noble/hashes@npm:1.5.0, @noble/hashes@npm:^1.4.0, @noble/hashes@npm:~1.5.0": - version: 1.5.0 - resolution: "@noble/hashes@npm:1.5.0" - checksum: 9cc031d5c888c455bfeef76af649b87f75380a4511405baea633c1e4912fd84aff7b61e99716f0231d244c9cfeda1fafd7d718963e6a0c674ed705e9b1b4f76b - languageName: node - linkType: hard - -"@noble/secp256k1@npm:1.7.1, @noble/secp256k1@npm:~1.7.0": - version: 1.7.1 - resolution: "@noble/secp256k1@npm:1.7.1" - checksum: d2301f1f7690368d8409a3152450458f27e54df47e3f917292de3de82c298770890c2de7c967d237eff9c95b70af485389a9695f73eb05a43e2bd562d18b18cb - languageName: node - linkType: hard - -"@nodelib/fs.scandir@npm:2.1.5": - version: 2.1.5 - resolution: "@nodelib/fs.scandir@npm:2.1.5" - dependencies: - "@nodelib/fs.stat": 2.0.5 - run-parallel: ^1.1.9 - checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59 - languageName: node - linkType: hard - -"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": - version: 2.0.5 - resolution: "@nodelib/fs.stat@npm:2.0.5" - checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 - languageName: node - linkType: hard - -"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": - version: 1.2.8 - resolution: "@nodelib/fs.walk@npm:1.2.8" - dependencies: - "@nodelib/fs.scandir": 2.1.5 - fastq: ^1.6.0 - checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53 - languageName: node - linkType: hard - -"@nomicfoundation/ethereumjs-block@npm:5.0.2": - version: 5.0.2 - resolution: "@nomicfoundation/ethereumjs-block@npm:5.0.2" - dependencies: - "@nomicfoundation/ethereumjs-common": 4.0.2 - "@nomicfoundation/ethereumjs-rlp": 5.0.2 - "@nomicfoundation/ethereumjs-trie": 6.0.2 - "@nomicfoundation/ethereumjs-tx": 5.0.2 - "@nomicfoundation/ethereumjs-util": 9.0.2 - ethereum-cryptography: 0.1.3 - ethers: ^5.7.1 - checksum: 7ff744f44a01f1c059ca7812a1cfc8089f87aa506af6cb39c78331dca71b32993cbd6fa05ad03f8c4f4fab73bb998a927af69e0d8ff01ae192ee5931606e09f5 - languageName: node - linkType: hard - -"@nomicfoundation/ethereumjs-blockchain@npm:7.0.2": - version: 7.0.2 - resolution: "@nomicfoundation/ethereumjs-blockchain@npm:7.0.2" - dependencies: - "@nomicfoundation/ethereumjs-block": 5.0.2 - "@nomicfoundation/ethereumjs-common": 4.0.2 - "@nomicfoundation/ethereumjs-ethash": 3.0.2 - "@nomicfoundation/ethereumjs-rlp": 5.0.2 - "@nomicfoundation/ethereumjs-trie": 6.0.2 - "@nomicfoundation/ethereumjs-tx": 5.0.2 - "@nomicfoundation/ethereumjs-util": 9.0.2 - abstract-level: ^1.0.3 - debug: ^4.3.3 - ethereum-cryptography: 0.1.3 - level: ^8.0.0 - lru-cache: ^5.1.1 - memory-level: ^1.0.0 - checksum: b7e440dcd73e32aa72d13bfd28cb472773c9c60ea808a884131bf7eb3f42286ad594a0864215f599332d800f3fe1f772fff4b138d2dcaa8f41e4d8389bff33e7 - languageName: node - linkType: hard - -"@nomicfoundation/ethereumjs-common@npm:4.0.2": - version: 4.0.2 - resolution: "@nomicfoundation/ethereumjs-common@npm:4.0.2" - dependencies: - "@nomicfoundation/ethereumjs-util": 9.0.2 - crc-32: ^1.2.0 - checksum: f0d84704d6254d374299c19884312bd5666974b4b6f342d3f10bc76e549de78d20e45a53d25fbdc146268a52335497127e4f069126da7c60ac933a158e704887 - languageName: node - linkType: hard - -"@nomicfoundation/ethereumjs-ethash@npm:3.0.2": - version: 3.0.2 - resolution: "@nomicfoundation/ethereumjs-ethash@npm:3.0.2" - dependencies: - "@nomicfoundation/ethereumjs-block": 5.0.2 - "@nomicfoundation/ethereumjs-rlp": 5.0.2 - "@nomicfoundation/ethereumjs-util": 9.0.2 - abstract-level: ^1.0.3 - bigint-crypto-utils: ^3.0.23 - ethereum-cryptography: 0.1.3 - checksum: e4011e4019dd9b92f7eeebfc1e6c9a9685c52d8fd0ee4f28f03e50048a23b600c714490827f59fdce497b3afb503b3fd2ebf6815ff307e9949c3efeff1403278 - languageName: node - linkType: hard - -"@nomicfoundation/ethereumjs-evm@npm:2.0.2": - version: 2.0.2 - resolution: "@nomicfoundation/ethereumjs-evm@npm:2.0.2" - dependencies: - "@ethersproject/providers": ^5.7.1 - "@nomicfoundation/ethereumjs-common": 4.0.2 - "@nomicfoundation/ethereumjs-tx": 5.0.2 - "@nomicfoundation/ethereumjs-util": 9.0.2 - debug: ^4.3.3 - ethereum-cryptography: 0.1.3 - mcl-wasm: ^0.7.1 - rustbn.js: ~0.2.0 - checksum: a23cf570836ddc147606b02df568069de946108e640f902358fef67e589f6b371d856056ee44299d9b4e3497f8ae25faa45e6b18fefd90e9b222dc6a761d85f0 - languageName: node - linkType: hard - -"@nomicfoundation/ethereumjs-rlp@npm:5.0.2": - version: 5.0.2 - resolution: "@nomicfoundation/ethereumjs-rlp@npm:5.0.2" - bin: - rlp: bin/rlp - checksum: a74434cadefca9aa8754607cc1ad7bb4bbea4ee61c6214918e60a5bbee83206850346eb64e39fd1fe97f854c7ec0163e01148c0c881dda23881938f0645a0ef2 - languageName: node - linkType: hard - -"@nomicfoundation/ethereumjs-statemanager@npm:2.0.2": - version: 2.0.2 - resolution: "@nomicfoundation/ethereumjs-statemanager@npm:2.0.2" - dependencies: - "@nomicfoundation/ethereumjs-common": 4.0.2 - "@nomicfoundation/ethereumjs-rlp": 5.0.2 - debug: ^4.3.3 - ethereum-cryptography: 0.1.3 - ethers: ^5.7.1 - js-sdsl: ^4.1.4 - checksum: 3ab6578e252e53609afd98d8ba42a99f182dcf80252f23ed9a5e0471023ffb2502130f85fc47fa7c94cd149f9be799ed9a0942ca52a143405be9267f4ad94e64 - languageName: node - linkType: hard - -"@nomicfoundation/ethereumjs-trie@npm:6.0.2": - version: 6.0.2 - resolution: "@nomicfoundation/ethereumjs-trie@npm:6.0.2" - dependencies: - "@nomicfoundation/ethereumjs-rlp": 5.0.2 - "@nomicfoundation/ethereumjs-util": 9.0.2 - "@types/readable-stream": ^2.3.13 - ethereum-cryptography: 0.1.3 - readable-stream: ^3.6.0 - checksum: d4da918d333851b9f2cce7dbd25ab5753e0accd43d562d98fd991b168b6a08d1794528f0ade40fe5617c84900378376fe6256cdbe52c8d66bf4c53293bbc7c40 - languageName: node - linkType: hard - -"@nomicfoundation/ethereumjs-tx@npm:5.0.2": - version: 5.0.2 - resolution: "@nomicfoundation/ethereumjs-tx@npm:5.0.2" - dependencies: - "@chainsafe/ssz": ^0.9.2 - "@ethersproject/providers": ^5.7.2 - "@nomicfoundation/ethereumjs-common": 4.0.2 - "@nomicfoundation/ethereumjs-rlp": 5.0.2 - "@nomicfoundation/ethereumjs-util": 9.0.2 - ethereum-cryptography: 0.1.3 - checksum: 0bbcea75786b2ccb559afe2ecc9866fb4566a9f157b6ffba4f50960d14f4b3da2e86e273f6fadda9b860e67cfcabf589970fb951b328cb5f900a585cd21842a2 - languageName: node - linkType: hard - -"@nomicfoundation/ethereumjs-util@npm:9.0.2": - version: 9.0.2 - resolution: "@nomicfoundation/ethereumjs-util@npm:9.0.2" - dependencies: - "@chainsafe/ssz": ^0.10.0 - "@nomicfoundation/ethereumjs-rlp": 5.0.2 - ethereum-cryptography: 0.1.3 - checksum: 3a08f7b88079ef9f53b43da9bdcb8195498fd3d3911c2feee2571f4d1204656053f058b2f650471c86f7d2d0ba2f814768c7cfb0f266eede41c848356afc4900 - languageName: node - linkType: hard - -"@nomicfoundation/ethereumjs-vm@npm:7.0.2": - version: 7.0.2 - resolution: "@nomicfoundation/ethereumjs-vm@npm:7.0.2" - dependencies: - "@nomicfoundation/ethereumjs-block": 5.0.2 - "@nomicfoundation/ethereumjs-blockchain": 7.0.2 - "@nomicfoundation/ethereumjs-common": 4.0.2 - "@nomicfoundation/ethereumjs-evm": 2.0.2 - "@nomicfoundation/ethereumjs-rlp": 5.0.2 - "@nomicfoundation/ethereumjs-statemanager": 2.0.2 - "@nomicfoundation/ethereumjs-trie": 6.0.2 - "@nomicfoundation/ethereumjs-tx": 5.0.2 - "@nomicfoundation/ethereumjs-util": 9.0.2 - debug: ^4.3.3 - ethereum-cryptography: 0.1.3 - mcl-wasm: ^0.7.1 - rustbn.js: ~0.2.0 - checksum: 1c25ba4d0644cadb8a2b0241a4bb02e578bfd7f70e3492b855c2ab5c120cb159cb8f7486f84dc1597884bd1697feedbfb5feb66e91352afb51f3694fd8e4a043 - languageName: node - linkType: hard - -"@nomicfoundation/hardhat-chai-matchers@npm:^1.0.4": - version: 1.0.6 - resolution: "@nomicfoundation/hardhat-chai-matchers@npm:1.0.6" - dependencies: - "@ethersproject/abi": ^5.1.2 - "@types/chai-as-promised": ^7.1.3 - chai-as-promised: ^7.1.1 - deep-eql: ^4.0.1 - ordinal: ^1.0.3 - peerDependencies: - "@nomiclabs/hardhat-ethers": ^2.0.0 - chai: ^4.2.0 - ethers: ^5.0.0 - hardhat: ^2.9.4 - checksum: c388e5ed9068f2ba7c227737ab7312dd03405d5fab195247b061f2fa52e700fbd0fb65359c2d4f2086f2905bfca642c19a9122d034533edd936f89aea65ac7f2 - languageName: node - linkType: hard - -"@nomicfoundation/hardhat-network-helpers@npm:^1.0.8": - version: 1.0.11 - resolution: "@nomicfoundation/hardhat-network-helpers@npm:1.0.11" - dependencies: - ethereumjs-util: ^7.1.4 - peerDependencies: - hardhat: ^2.9.5 - checksum: b1566de2b0ff6de0fa825b13befd9a3318538e45c2d7e54b52dbf724b9ea5019365f1cf6962f4b89313747da847b575692783cfe03b60dbff3a2e419e135c3fb - languageName: node - linkType: hard - -"@nomicfoundation/hardhat-toolbox@npm:^2.0.0": - version: 2.0.2 - resolution: "@nomicfoundation/hardhat-toolbox@npm:2.0.2" - peerDependencies: - "@ethersproject/abi": ^5.4.7 - "@ethersproject/providers": ^5.4.7 - "@nomicfoundation/hardhat-chai-matchers": ^1.0.0 - "@nomicfoundation/hardhat-network-helpers": ^1.0.0 - "@nomiclabs/hardhat-ethers": ^2.0.0 - "@nomiclabs/hardhat-etherscan": ^3.0.0 - "@typechain/ethers-v5": ^10.1.0 - "@typechain/hardhat": ^6.1.2 - "@types/chai": ^4.2.0 - "@types/mocha": ">=9.1.0" - "@types/node": ">=12.0.0" - chai: ^4.2.0 - ethers: ^5.4.7 - hardhat: ^2.11.0 - hardhat-gas-reporter: ^1.0.8 - solidity-coverage: ^0.8.1 - ts-node: ">=8.0.0" - typechain: ^8.1.0 - typescript: ">=4.5.0" - checksum: a2eafb709acbabe40de4871c4e8684a03098f045dba4fc6c6e9281358d072f386a668488c109e2a36b8eade01dc4c4f9e8a76fa45c92591857c590c6e19f1ae7 - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer-darwin-arm64@npm:0.1.2": - version: 0.1.2 - resolution: "@nomicfoundation/solidity-analyzer-darwin-arm64@npm:0.1.2" - checksum: 5bf3cf3f88e39d7b684f0ca75621b794b62e2676eb63c6977e847acc9c827bdc132143cc84e46be2797b93edc522f2c6f85bf5501fd7b8c85b346fb27e4dd488 - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer-darwin-x64@npm:0.1.2": - version: 0.1.2 - resolution: "@nomicfoundation/solidity-analyzer-darwin-x64@npm:0.1.2" - checksum: 8061dc7749d97409ccde4a2e529316c29f83f2d07c78ffea87803777229e2a7d967bbb8bda564903ab5e9e89ad3b46cbcb060621209d1c6e4212c4b1b096c076 - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@npm:0.1.2": - version: 0.1.2 - resolution: "@nomicfoundation/solidity-analyzer-linux-arm64-gnu@npm:0.1.2" - checksum: 46111d18446ea5d157628c202d1ee1fc3444b32a0e3aa24337bbb407653606a79a3b199bf1e5fe5f74c5c78833cf243e492f20ab6a1503137e89f2236b3ecfe7 - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer-linux-arm64-musl@npm:0.1.2": - version: 0.1.2 - resolution: "@nomicfoundation/solidity-analyzer-linux-arm64-musl@npm:0.1.2" - checksum: 588e81e7b36cbe80b9d2c502dc2db4bf8706732bcea6906b79bac202eb441fa2f4b9f703c30d82a17ed2a4402eaf038057fb14fc1c16eac5ade103ff9b085cdc - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer-linux-x64-gnu@npm:0.1.2": - version: 0.1.2 - resolution: "@nomicfoundation/solidity-analyzer-linux-x64-gnu@npm:0.1.2" - checksum: 26f8307bde4a2c7609d297f2af6a50cad87aa46e914326b09d5cb424b4f45f0f75e982f9fcb9ee3361a2f9b141fcc9c10a665ddbc9686e01b017c639fbfb500b - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer-linux-x64-musl@npm:0.1.2": - version: 0.1.2 - resolution: "@nomicfoundation/solidity-analyzer-linux-x64-musl@npm:0.1.2" - checksum: d3628bae4f04bcdb2f1dec1d6790cdf97812e7e5c0a426f4227acc97883fa3165017a800375237e36bc588f0fb4971b0936a372869a801a97f42336ee4e42feb - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer-win32-x64-msvc@npm:0.1.2": - version: 0.1.2 - resolution: "@nomicfoundation/solidity-analyzer-win32-x64-msvc@npm:0.1.2" - checksum: 4a7d34d8419608cc343b6c028e07bd9ec72fd4ab82ccd36807ccf0fc8ad708b8d5baae9121532073ef08b2deb24d9c3a6f7b627c26f91f2a7de0cdb7024238f1 - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer@npm:^0.1.0": - version: 0.1.2 - resolution: "@nomicfoundation/solidity-analyzer@npm:0.1.2" - dependencies: - "@nomicfoundation/solidity-analyzer-darwin-arm64": 0.1.2 - "@nomicfoundation/solidity-analyzer-darwin-x64": 0.1.2 - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": 0.1.2 - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": 0.1.2 - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": 0.1.2 - "@nomicfoundation/solidity-analyzer-linux-x64-musl": 0.1.2 - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": 0.1.2 - dependenciesMeta: - "@nomicfoundation/solidity-analyzer-darwin-arm64": - optional: true - "@nomicfoundation/solidity-analyzer-darwin-x64": - optional: true - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": - optional: true - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": - optional: true - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": - optional: true - "@nomicfoundation/solidity-analyzer-linux-x64-musl": - optional: true - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": - optional: true - checksum: 0de3a317658345b9012285665bb4c810a98b3668bcf32a118912fda00e5760fa2c77d0a92bce6b687dcc7b4bb34b0a83f8e6748bfa68660a2303d781ca728aef - languageName: node - linkType: hard - -"@nomiclabs/hardhat-ethers@npm:^2.2.1": - version: 2.2.3 - resolution: "@nomiclabs/hardhat-ethers@npm:2.2.3" - peerDependencies: - ethers: ^5.0.0 - hardhat: ^2.0.0 - checksum: 72321317e55eb510306e04c42353c5f7ceb42d086fc76cc740120da6e1635b7ad5bbf23a8d6b02bd590754adcf646618933111624085ab249b1ff3482e773226 - languageName: node - linkType: hard - -"@nomiclabs/hardhat-etherscan@npm:^3.1.2": - version: 3.1.8 - resolution: "@nomiclabs/hardhat-etherscan@npm:3.1.8" - dependencies: - "@ethersproject/abi": ^5.1.2 - "@ethersproject/address": ^5.0.2 - cbor: ^8.1.0 - chalk: ^2.4.2 - debug: ^4.1.1 - fs-extra: ^7.0.1 - lodash: ^4.17.11 - semver: ^6.3.0 - table: ^6.8.0 - undici: ^5.14.0 - peerDependencies: - hardhat: ^2.0.4 - checksum: 13864380d104705a54668adf2fb37a87d1147a064c1d29dbc356390e7254d5c7501b9b3af9c4ec2f9d9ff642a01417d5d35970d626fe706f5f4830820ae89ecb - languageName: node - linkType: hard - -"@npmcli/agent@npm:^2.0.0": - version: 2.2.2 - resolution: "@npmcli/agent@npm:2.2.2" - dependencies: - agent-base: ^7.1.0 - http-proxy-agent: ^7.0.0 - https-proxy-agent: ^7.0.1 - lru-cache: ^10.0.1 - socks-proxy-agent: ^8.0.3 - checksum: 67de7b88cc627a79743c88bab35e023e23daf13831a8aa4e15f998b92f5507b644d8ffc3788afc8e64423c612e0785a6a92b74782ce368f49a6746084b50d874 - languageName: node - linkType: hard - -"@npmcli/fs@npm:^3.1.0": - version: 3.1.1 - resolution: "@npmcli/fs@npm:3.1.1" - dependencies: - semver: ^7.3.5 - checksum: d960cab4b93adcb31ce223bfb75c5714edbd55747342efb67dcc2f25e023d930a7af6ece3e75f2f459b6f38fc14d031c766f116cd124fdc937fd33112579e820 - languageName: node - linkType: hard +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@adraffy/ens-normalize@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz#d2a39395c587e092d77cbbc80acf956a54f38bf7" + integrity sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q== + +"@axelar-network/axelar-gmp-sdk-solidity@5.6.2": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@axelar-network/axelar-gmp-sdk-solidity/-/axelar-gmp-sdk-solidity-5.6.2.tgz#9a48a5ef7f00490898d8d33e0756b35416069fd2" + integrity sha512-lJT1Sily/to5jZHkE3rGtkb8qnurNTFnlz4HwbQec+MtqVgPkY3/SsiPTw7967hmZavAw02eiE1jFSW7XKksZQ== + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== + dependencies: + "@babel/highlight" "^7.24.7" + picocolors "^1.0.0" + +"@babel/generator@7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.7.tgz#8da2599beb4a86194a3b24df6c085931d9ee45ad" + integrity sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w== + dependencies: + "@babel/types" "^7.17.0" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/generator@^7.23.0": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.6.tgz#0df1ad8cb32fe4d2b01d8bf437f153d19342a87c" + integrity sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw== + dependencies: + "@babel/types" "^7.25.6" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + +"@babel/helper-environment-visitor@^7.22.20": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9" + integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-function-name@^7.23.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz#75f1e1725742f39ac6584ee0b16d94513da38dd2" + integrity sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA== + dependencies: + "@babel/template" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz#b4ede1cde2fd89436397f30dc9376ee06b0f25ee" + integrity sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz#83949436890e07fa3d6873c61a96e3bbf692d856" + integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-string-parser@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" + integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== + +"@babel/helper-validator-identifier@^7.16.7", "@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + +"@babel/highlight@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.7" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/parser@^7.20.5", "@babel/parser@^7.23.0", "@babel/parser@^7.25.0": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f" + integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q== + dependencies: + "@babel/types" "^7.25.6" + +"@babel/runtime@^7.25.0": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.6.tgz#9afc3289f7184d8d7f98b099884c26317b9264d2" + integrity sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.24.7": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" + integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/parser" "^7.25.0" + "@babel/types" "^7.25.0" + +"@babel/traverse@7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" + integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@7.17.0": + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" + integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + +"@babel/types@^7.17.0", "@babel/types@^7.23.0", "@babel/types@^7.24.7", "@babel/types@^7.25.0", "@babel/types@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6" + integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw== + dependencies: + "@babel/helper-string-parser" "^7.24.8" + "@babel/helper-validator-identifier" "^7.24.7" + to-fast-properties "^2.0.0" + +"@chainlink/contracts-ccip@0.7.6": + version "0.7.6" + resolved "https://registry.yarnpkg.com/@chainlink/contracts-ccip/-/contracts-ccip-0.7.6.tgz#5bf4568a0bbf4e29d2e8c32348e5ecc6ced006d2" + integrity sha512-yNbCBFpLs3R+ALymto9dQYKz3vatnjqYGu1pnMD0i2fHEMthiXe0+otaNCGNht6n8k7ruNaA0DNpz3F+2jHQXw== + dependencies: + "@eth-optimism/contracts" "^0.5.21" + "@openzeppelin/contracts" "~4.3.3" + "@openzeppelin/contracts-upgradeable-4.7.3" "npm:@openzeppelin/contracts-upgradeable@v4.7.3" + "@openzeppelin/contracts-v0.7" "npm:@openzeppelin/contracts@v3.4.2" + +"@chainsafe/as-sha256@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz#3639df0e1435cab03f4d9870cc3ac079e57a6fc9" + integrity sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg== + +"@chainsafe/persistent-merkle-tree@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz#4c9ee80cc57cd3be7208d98c40014ad38f36f7ff" + integrity sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + +"@chainsafe/persistent-merkle-tree@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz#2b4a62c9489a5739dedd197250d8d2f5427e9f63" + integrity sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + +"@chainsafe/ssz@^0.10.0": + version "0.10.2" + resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.10.2.tgz#c782929e1bb25fec66ba72e75934b31fd087579e" + integrity sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + "@chainsafe/persistent-merkle-tree" "^0.5.0" + +"@chainsafe/ssz@^0.9.2": + version "0.9.4" + resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.9.4.tgz#696a8db46d6975b600f8309ad3a12f7c0e310497" + integrity sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + "@chainsafe/persistent-merkle-tree" "^0.4.2" + case "^1.6.3" + +"@colors/colors@1.6.0", "@colors/colors@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" + integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== + +"@commitlint/cli@^17.3.0", "@commitlint/cli@^17.5.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-17.8.1.tgz#10492114a022c91dcfb1d84dac773abb3db76d33" + integrity sha512-ay+WbzQesE0Rv4EQKfNbSMiJJ12KdKTDzIt0tcK4k11FdsWmtwP0Kp1NWMOUswfIWo6Eb7p7Ln721Nx9FLNBjg== + dependencies: + "@commitlint/format" "^17.8.1" + "@commitlint/lint" "^17.8.1" + "@commitlint/load" "^17.8.1" + "@commitlint/read" "^17.8.1" + "@commitlint/types" "^17.8.1" + execa "^5.0.0" + lodash.isfunction "^3.0.9" + resolve-from "5.0.0" + resolve-global "1.0.0" + yargs "^17.0.0" + +"@commitlint/config-conventional@^17.3.0", "@commitlint/config-conventional@^17.4.4": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-17.8.1.tgz#e5bcf0cfec8da7ac50bc04dc92e0a4ea74964ce0" + integrity sha512-NxCOHx1kgneig3VLauWJcDWS40DVjg7nKOpBEEK9E5fjJpQqLCilcnKkIIjdBH98kEO1q3NpE5NSrZ2kl/QGJg== + dependencies: + conventional-changelog-conventionalcommits "^6.1.0" + +"@commitlint/config-validator@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-17.8.1.tgz#5cc93b6b49d5524c9cc345a60e5bf74bcca2b7f9" + integrity sha512-UUgUC+sNiiMwkyiuIFR7JG2cfd9t/7MV8VB4TZ+q02ZFkHoduUS4tJGsCBWvBOGD9Btev6IecPMvlWUfJorkEA== + dependencies: + "@commitlint/types" "^17.8.1" + ajv "^8.11.0" + +"@commitlint/config-validator@^19.5.0": + version "19.5.0" + resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-19.5.0.tgz#f0a4eda2109fc716ef01bb8831af9b02e3a1e568" + integrity sha512-CHtj92H5rdhKt17RmgALhfQt95VayrUo2tSqY9g2w+laAXyk7K/Ef6uPm9tn5qSIwSmrLjKaXK9eiNuxmQrDBw== + dependencies: + "@commitlint/types" "^19.5.0" + ajv "^8.11.0" + +"@commitlint/ensure@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-17.8.1.tgz#59183557844999dbb6aab6d03629a3d104d01a8d" + integrity sha512-xjafwKxid8s1K23NFpL8JNo6JnY/ysetKo8kegVM7c8vs+kWLP8VrQq+NbhgVlmCojhEDbzQKp4eRXSjVOGsow== + dependencies: + "@commitlint/types" "^17.8.1" + lodash.camelcase "^4.3.0" + lodash.kebabcase "^4.1.1" + lodash.snakecase "^4.1.1" + lodash.startcase "^4.4.0" + lodash.upperfirst "^4.3.1" + +"@commitlint/execute-rule@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-17.8.1.tgz#504ed69eb61044eeb84fdfd10cc18f0dab14f34c" + integrity sha512-JHVupQeSdNI6xzA9SqMF+p/JjrHTcrJdI02PwesQIDCIGUrv04hicJgCcws5nzaoZbROapPs0s6zeVHoxpMwFQ== + +"@commitlint/execute-rule@^19.5.0": + version "19.5.0" + resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-19.5.0.tgz#c13da8c03ea0379f30856111e27d57518e25b8a2" + integrity sha512-aqyGgytXhl2ejlk+/rfgtwpPexYyri4t8/n4ku6rRJoRhGZpLFMqrZ+YaubeGysCP6oz4mMA34YSTaSOKEeNrg== + +"@commitlint/format@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-17.8.1.tgz#6108bb6b4408e711006680649927e1b559bdc5f8" + integrity sha512-f3oMTyZ84M9ht7fb93wbCKmWxO5/kKSbwuYvS867duVomoOsgrgljkGGIztmT/srZnaiGbaK8+Wf8Ik2tSr5eg== + dependencies: + "@commitlint/types" "^17.8.1" + chalk "^4.1.0" + +"@commitlint/is-ignored@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-17.8.1.tgz#cf25bcd8409c79684b63f8bdeb35df48edda244e" + integrity sha512-UshMi4Ltb4ZlNn4F7WtSEugFDZmctzFpmbqvpyxD3la510J+PLcnyhf9chs7EryaRFJMdAKwsEKfNK0jL/QM4g== + dependencies: + "@commitlint/types" "^17.8.1" + semver "7.5.4" + +"@commitlint/lint@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-17.8.1.tgz#bfc21215f6b18d41d4d43e2aa3cb79a5d7726cd8" + integrity sha512-aQUlwIR1/VMv2D4GXSk7PfL5hIaFSfy6hSHV94O8Y27T5q+DlDEgd/cZ4KmVI+MWKzFfCTiTuWqjfRSfdRllCA== + dependencies: + "@commitlint/is-ignored" "^17.8.1" + "@commitlint/parse" "^17.8.1" + "@commitlint/rules" "^17.8.1" + "@commitlint/types" "^17.8.1" + +"@commitlint/load@>6.1.1": + version "19.5.0" + resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-19.5.0.tgz#67f90a294894d1f99b930b6152bed2df44a81794" + integrity sha512-INOUhkL/qaKqwcTUvCE8iIUf5XHsEPCLY9looJ/ipzi7jtGhgmtH7OOFiNvwYgH7mA8osUWOUDV8t4E2HAi4xA== + dependencies: + "@commitlint/config-validator" "^19.5.0" + "@commitlint/execute-rule" "^19.5.0" + "@commitlint/resolve-extends" "^19.5.0" + "@commitlint/types" "^19.5.0" + chalk "^5.3.0" + cosmiconfig "^9.0.0" + cosmiconfig-typescript-loader "^5.0.0" + lodash.isplainobject "^4.0.6" + lodash.merge "^4.6.2" + lodash.uniq "^4.5.0" + +"@commitlint/load@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-17.8.1.tgz#fa061e7bfa53281eb03ca8517ca26d66a189030c" + integrity sha512-iF4CL7KDFstP1kpVUkT8K2Wl17h2yx9VaR1ztTc8vzByWWcbO/WaKwxsnCOqow9tVAlzPfo1ywk9m2oJ9ucMqA== + dependencies: + "@commitlint/config-validator" "^17.8.1" + "@commitlint/execute-rule" "^17.8.1" + "@commitlint/resolve-extends" "^17.8.1" + "@commitlint/types" "^17.8.1" + "@types/node" "20.5.1" + chalk "^4.1.0" + cosmiconfig "^8.0.0" + cosmiconfig-typescript-loader "^4.0.0" + lodash.isplainobject "^4.0.6" + lodash.merge "^4.6.2" + lodash.uniq "^4.5.0" + resolve-from "^5.0.0" + ts-node "^10.8.1" + typescript "^4.6.4 || ^5.2.2" + +"@commitlint/message@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-17.8.1.tgz#a5cd226c419be20ee03c3d237db6ac37b95958b3" + integrity sha512-6bYL1GUQsD6bLhTH3QQty8pVFoETfFQlMn2Nzmz3AOLqRVfNNtXBaSY0dhZ0dM6A2MEq4+2d7L/2LP8TjqGRkA== + +"@commitlint/parse@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-17.8.1.tgz#6e00b8f50ebd63562d25dcf4230da2c9f984e626" + integrity sha512-/wLUickTo0rNpQgWwLPavTm7WbwkZoBy3X8PpkUmlSmQJyWQTj0m6bDjiykMaDt41qcUbfeFfaCvXfiR4EGnfw== + dependencies: + "@commitlint/types" "^17.8.1" + conventional-changelog-angular "^6.0.0" + conventional-commits-parser "^4.0.0" + +"@commitlint/read@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-17.8.1.tgz#b3f28777607c756078356cc133368b0e8c08092f" + integrity sha512-Fd55Oaz9irzBESPCdMd8vWWgxsW3OWR99wOntBDHgf9h7Y6OOHjWEdS9Xzen1GFndqgyoaFplQS5y7KZe0kO2w== + dependencies: + "@commitlint/top-level" "^17.8.1" + "@commitlint/types" "^17.8.1" + fs-extra "^11.0.0" + git-raw-commits "^2.0.11" + minimist "^1.2.6" + +"@commitlint/resolve-extends@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-17.8.1.tgz#9af01432bf2fd9ce3dd5a00d266cce14e4c977e7" + integrity sha512-W/ryRoQ0TSVXqJrx5SGkaYuAaE/BUontL1j1HsKckvM6e5ZaG0M9126zcwL6peKSuIetJi7E87PRQF8O86EW0Q== + dependencies: + "@commitlint/config-validator" "^17.8.1" + "@commitlint/types" "^17.8.1" + import-fresh "^3.0.0" + lodash.mergewith "^4.6.2" + resolve-from "^5.0.0" + resolve-global "^1.0.0" + +"@commitlint/resolve-extends@^19.5.0": + version "19.5.0" + resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-19.5.0.tgz#f3ec33e12d10df90cae0bfad8e593431fb61b18e" + integrity sha512-CU/GscZhCUsJwcKTJS9Ndh3AKGZTNFIOoQB2n8CmFnizE0VnEuJoum+COW+C1lNABEeqk6ssfc1Kkalm4bDklA== + dependencies: + "@commitlint/config-validator" "^19.5.0" + "@commitlint/types" "^19.5.0" + global-directory "^4.0.1" + import-meta-resolve "^4.0.0" + lodash.mergewith "^4.6.2" + resolve-from "^5.0.0" + +"@commitlint/rules@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-17.8.1.tgz#da49cab1b7ebaf90d108de9f58f684dc4ccb65a0" + integrity sha512-2b7OdVbN7MTAt9U0vKOYKCDsOvESVXxQmrvuVUZ0rGFMCrCPJWWP1GJ7f0lAypbDAhaGb8zqtdOr47192LBrIA== + dependencies: + "@commitlint/ensure" "^17.8.1" + "@commitlint/message" "^17.8.1" + "@commitlint/to-lines" "^17.8.1" + "@commitlint/types" "^17.8.1" + execa "^5.0.0" + +"@commitlint/to-lines@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-17.8.1.tgz#a5c4a7cf7dff3dbdd69289fc0eb19b66f3cfe017" + integrity sha512-LE0jb8CuR/mj6xJyrIk8VLz03OEzXFgLdivBytoooKO5xLt5yalc8Ma5guTWobw998sbR3ogDd+2jed03CFmJA== + +"@commitlint/top-level@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-17.8.1.tgz#206d37d6782f33c9572e44fbe3758392fdeea7bc" + integrity sha512-l6+Z6rrNf5p333SHfEte6r+WkOxGlWK4bLuZKbtf/2TXRN+qhrvn1XE63VhD8Oe9oIHQ7F7W1nG2k/TJFhx2yA== + dependencies: + find-up "^5.0.0" + +"@commitlint/types@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-17.8.1.tgz#883a0ad35c5206d5fef7bc6ce1bbe648118af44e" + integrity sha512-PXDQXkAmiMEG162Bqdh9ChML/GJZo6vU+7F03ALKDK8zYc6SuAr47LjG7hGYRqUOz+WK0dU7bQ0xzuqFMdxzeQ== + dependencies: + chalk "^4.1.0" + +"@commitlint/types@^19.5.0": + version "19.5.0" + resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-19.5.0.tgz#c5084d1231d4dd50e40bdb656ee7601f691400b3" + integrity sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg== + dependencies: + "@types/conventional-commits-parser" "^5.0.0" + chalk "^5.3.0" + +"@connext/interfaces@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@connext/interfaces/-/interfaces-2.0.0.tgz#17f27a516315e40a440c3ef34db83834ad51917f" + integrity sha512-1dYh5T0Zx6zVvLWDHRRUuXZxTGLXeqefDK/zUQyNYQMmPWRBzA967wK0mtrU6drJq4VkO2gZ5QFE63mMDEz8TQ== + +"@cosmjs/encoding@^0.31.3": + version "0.31.3" + resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.31.3.tgz#2519d9c9ae48368424971f253775c4580b54c5aa" + integrity sha512-6IRtG0fiVYwyP7n+8e54uTx2pLYijO48V3t9TLiROERm5aUAIzIlz6Wp0NYaI5he9nh1lcEGJ1lkquVKFw3sUg== + dependencies: + base64-js "^1.3.0" + bech32 "^1.1.4" + readonly-date "^1.0.0" + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@dabh/diagnostics@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" + integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== + dependencies: + colorspace "1.1.x" + enabled "2.0.x" + kuler "^2.0.0" + +"@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.4.0", "@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": + version "4.11.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.1.tgz#a547badfc719eb3e5f4b556325e542fbe9d7a18f" + integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q== + +"@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== + +"@eth-optimism/contracts@^0.5.21": + version "0.5.40" + resolved "https://registry.yarnpkg.com/@eth-optimism/contracts/-/contracts-0.5.40.tgz#d13a04a15ea947a69055e6fc74d87e215d4c936a" + integrity sha512-MrzV0nvsymfO/fursTB7m/KunkPsCndltVgfdHaT1Aj5Vi6R/doKIGGkOofHX+8B6VMZpuZosKCMQ5lQuqjt8w== + dependencies: + "@eth-optimism/core-utils" "0.12.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + +"@eth-optimism/contracts@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@eth-optimism/contracts/-/contracts-0.6.0.tgz#15ae76222a9b4d958a550cafb1960923af613a31" + integrity sha512-vQ04wfG9kMf1Fwy3FEMqH2QZbgS0gldKhcBeBUPfO8zu68L61VI97UDXmsMQXzTsEAxK8HnokW3/gosl4/NW3w== + dependencies: + "@eth-optimism/core-utils" "0.12.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + +"@eth-optimism/core-utils@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@eth-optimism/core-utils/-/core-utils-0.12.0.tgz#6337e4599a34de23f8eceb20378de2a2de82b0ea" + integrity sha512-qW+7LZYCz7i8dRa7SRlUKIo1VBU8lvN0HeXCxJR+z+xtMzMQpPds20XJNCMclszxYQHkXY00fOT6GvFw9ZL6nw== + dependencies: + "@ethersproject/abi" "^5.7.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/address" "^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/keccak256" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/providers" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + bufio "^1.0.7" + chai "^4.3.4" + +"@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/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.0.9", "@ethersproject/abi@^5.1.2", "@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.0.2", "@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", "@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", "@ethersproject/providers@^5.7.0", "@ethersproject/providers@^5.7.1", "@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", "@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", "@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" + +"@fastify/busboy@^2.0.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" + integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== + +"@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== + +"@hyperlane-xyz/core@3.1.10": + version "3.1.10" + resolved "https://registry.yarnpkg.com/@hyperlane-xyz/core/-/core-3.1.10.tgz#7baab71079268bb8016b512b23d18a6b011086c4" + integrity sha512-kc7pypB9BPzIarHJCPVzbW52lUI5j8LluCp3zDmZICICXSfc6rTYVU93LosceBKoQTNGc7Ur/UgTHiOaHC4sYA== + dependencies: + "@eth-optimism/contracts" "^0.6.0" + "@hyperlane-xyz/utils" "3.1.10" + "@openzeppelin/contracts" "^4.9.3" + "@openzeppelin/contracts-upgradeable" "^v4.9.3" + +"@hyperlane-xyz/utils@3.1.10": + version "3.1.10" + resolved "https://registry.yarnpkg.com/@hyperlane-xyz/utils/-/utils-3.1.10.tgz#0c4369499b8fa96504ace95d2d2ce8d6064cb934" + integrity sha512-6CvtPxuQpg7qpdbRQccPjavcbPXMTFIXG3Pc1ZfO2JI6eftLCpMFYOfLpwYhtXPCjjVqk2kgdwOUiN4NTfLp1Q== + dependencies: + "@cosmjs/encoding" "^0.31.3" + "@solana/web3.js" "^1.78.0" + bignumber.js "^9.1.1" + ethers "^5.7.2" + +"@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.0.3", "@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/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@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/eth-sig-util@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" + integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ== + dependencies: + ethereumjs-abi "^0.6.8" + ethereumjs-util "^6.2.1" + ethjs-util "^0.1.6" + tweetnacl "^1.0.3" + tweetnacl-util "^0.15.1" + +"@mongodb-js/saslprep@^1.1.5": + version "1.1.9" + resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz#e974bab8eca9faa88677d4ea4da8d09a52069004" + integrity sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw== + dependencies: + sparse-bitfield "^3.0.3" + +"@noble/curves@1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.0.tgz#f05771ef64da724997f69ee1261b2417a49522d6" + integrity sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg== + dependencies: + "@noble/hashes" "1.4.0" + +"@noble/curves@1.4.2", "@noble/curves@~1.4.0": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.2.tgz#40309198c76ed71bc6dbf7ba24e81ceb4d0d1fe9" + integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw== + dependencies: + "@noble/hashes" "1.4.0" + +"@noble/curves@^1.4.0", "@noble/curves@^1.4.2": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.6.0.tgz#be5296ebcd5a1730fccea4786d420f87abfeb40b" + integrity sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ== + dependencies: + "@noble/hashes" "1.5.0" + +"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" + integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== + +"@noble/hashes@1.4.0", "@noble/hashes@~1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" + integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== + +"@noble/hashes@1.5.0", "@noble/hashes@^1.4.0", "@noble/hashes@~1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.5.0.tgz#abadc5ca20332db2b1b2aa3e496e9af1213570b0" + integrity sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA== + +"@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" + integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + 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" + +"@nomicfoundation/ethereumjs-block@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.2.tgz#13a7968f5964f1697da941281b7f7943b0465d04" + integrity sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q== + dependencies: + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + ethereum-cryptography "0.1.3" + ethers "^5.7.1" + +"@nomicfoundation/ethereumjs-blockchain@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.2.tgz#45323b673b3d2fab6b5008535340d1b8fea7d446" + integrity sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-ethash" "3.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + abstract-level "^1.0.3" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + level "^8.0.0" + lru-cache "^5.1.1" + memory-level "^1.0.0" + +"@nomicfoundation/ethereumjs-common@4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.2.tgz#a15d1651ca36757588fdaf2a7d381a150662a3c3" + integrity sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg== + dependencies: + "@nomicfoundation/ethereumjs-util" "9.0.2" + crc-32 "^1.2.0" + +"@nomicfoundation/ethereumjs-ethash@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.2.tgz#da77147f806401ee996bfddfa6487500118addca" + integrity sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + abstract-level "^1.0.3" + bigint-crypto-utils "^3.0.23" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-evm@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.2.tgz#4c2f4b84c056047102a4fa41c127454e3f0cfcf6" + integrity sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ== + dependencies: + "@ethersproject/providers" "^5.7.1" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + mcl-wasm "^0.7.1" + rustbn.js "~0.2.0" + +"@nomicfoundation/ethereumjs-rlp@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.2.tgz#4fee8dc58a53ac6ae87fb1fca7c15dc06c6b5dea" + integrity sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA== + +"@nomicfoundation/ethereumjs-statemanager@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.2.tgz#3ba4253b29b1211cafe4f9265fee5a0d780976e0" + integrity sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA== + dependencies: + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + ethers "^5.7.1" + js-sdsl "^4.1.4" + +"@nomicfoundation/ethereumjs-trie@6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.2.tgz#9a6dbd28482dca1bc162d12b3733acab8cd12835" + integrity sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ== + dependencies: + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + "@types/readable-stream" "^2.3.13" + ethereum-cryptography "0.1.3" + readable-stream "^3.6.0" + +"@nomicfoundation/ethereumjs-tx@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.2.tgz#117813b69c0fdc14dd0446698a64be6df71d7e56" + integrity sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g== + dependencies: + "@chainsafe/ssz" "^0.9.2" + "@ethersproject/providers" "^5.7.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-util@9.0.2": + version "9.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.2.tgz#16bdc1bb36f333b8a3559bbb4b17dac805ce904d" + integrity sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ== + dependencies: + "@chainsafe/ssz" "^0.10.0" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-vm@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.2.tgz#3b0852cb3584df0e18c182d0672a3596c9ca95e6" + integrity sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-blockchain" "7.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-evm" "2.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-statemanager" "2.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + mcl-wasm "^0.7.1" + rustbn.js "~0.2.0" + +"@nomicfoundation/hardhat-chai-matchers@^1.0.4": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.6.tgz#72a2e312e1504ee5dd73fe302932736432ba96bc" + integrity sha512-f5ZMNmabZeZegEfuxn/0kW+mm7+yV7VNDxLpMOMGXWFJ2l/Ct3QShujzDRF9cOkK9Ui/hbDeOWGZqyQALDXVCQ== + dependencies: + "@ethersproject/abi" "^5.1.2" + "@types/chai-as-promised" "^7.1.3" + chai-as-promised "^7.1.1" + deep-eql "^4.0.1" + ordinal "^1.0.3" + +"@nomicfoundation/hardhat-network-helpers@^1.0.8": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.11.tgz#64096829661b960b88679bd5c4fbcb50654672d1" + integrity sha512-uGPL7QSKvxrHRU69dx8jzoBvuztlLCtyFsbgfXIwIjnO3dqZRz2GNMHJoO3C3dIiUNM6jdNF4AUnoQKDscdYrA== + dependencies: + ethereumjs-util "^7.1.4" + +"@nomicfoundation/hardhat-toolbox@^2.0.0": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-2.0.2.tgz#ec95f23b53cb4e71a1a7091380fa223aad18f156" + integrity sha512-vnN1AzxbvpSx9pfdRHbUzTRIXpMLPXnUlkW855VaDk6N1pwRaQ2gNzEmFAABk4lWf11E00PKwFd/q27HuwYrYg== + +"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz#3a9c3b20d51360b20affb8f753e756d553d49557" + integrity sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw== + +"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.2.tgz#74dcfabeb4ca373d95bd0d13692f44fcef133c28" + integrity sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw== + +"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.2.tgz#4af5849a89e5a8f511acc04f28eb5d4460ba2b6a" + integrity sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA== + +"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.2.tgz#54036808a9a327b2ff84446c130a6687ee702a8e" + integrity sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA== + +"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.2.tgz#466cda0d6e43691986c944b909fc6dbb8cfc594e" + integrity sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g== + +"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.2.tgz#2b35826987a6e94444140ac92310baa088ee7f94" + integrity sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg== + +"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.2.tgz#e6363d13b8709ca66f330562337dbc01ce8bbbd9" + integrity sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA== + +"@nomicfoundation/solidity-analyzer@^0.1.0": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.2.tgz#8bcea7d300157bf3a770a851d9f5c5e2db34ac55" + integrity sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA== + optionalDependencies: + "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.2" + "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.2" + "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.2" + +"@nomiclabs/hardhat-ethers@^2.2.1": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz#b41053e360c31a32c2640c9a45ee981a7e603fe0" + integrity sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg== + +"@nomiclabs/hardhat-etherscan@^3.1.2": + version "3.1.8" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.8.tgz#3c12ee90b3733e0775e05111146ef9418d4f5a38" + integrity sha512-v5F6IzQhrsjHh6kQz4uNrym49brK9K5bYCq2zQZ729RYRaifI9hHbtmK+KkIVevfhut7huQFEQ77JLRMAzWYjQ== + dependencies: + "@ethersproject/abi" "^5.1.2" + "@ethersproject/address" "^5.0.2" + cbor "^8.1.0" + chalk "^2.4.2" + debug "^4.1.1" + fs-extra "^7.0.1" + lodash "^4.17.11" + semver "^6.3.0" + table "^6.8.0" + undici "^5.14.0" "@openzeppelin/contracts-upgradeable-4.7.3@npm:@openzeppelin/contracts-upgradeable@v4.7.3": - version: 4.7.3 - resolution: "@openzeppelin/contracts-upgradeable@npm:4.7.3" - checksum: c9ffb40cb847a975d440204fc6a811f43af960050242f707332b984d29bd16dc242ffa0935de61867aeb9e0357fadedb16b09b276deda5e9775582face831021 - languageName: node - linkType: hard - -"@openzeppelin/contracts-upgradeable@npm:4.8.1": - version: 4.8.1 - resolution: "@openzeppelin/contracts-upgradeable@npm:4.8.1" - checksum: 6af2fbddf263214c02d80430b218cb3ca8482e77b1cc070d07ca4f79d42460941e7ea1bb89a096bd292841040652e10d779b491cd19c201008d92e9e689d9000 - languageName: node - linkType: hard - -"@openzeppelin/contracts-upgradeable@npm:^4.7.3, @openzeppelin/contracts-upgradeable@npm:^v4.9.3": - version: 4.9.6 - resolution: "@openzeppelin/contracts-upgradeable@npm:4.9.6" - checksum: 481075e7222cab025ae55304263fca69a2d04305521957bc16d2aece9fa2b86b6914711724822493e3d04df7e793469cd0bcb1e09f0ddd10cb4e360ac7eed12a - languageName: node - linkType: hard + version "4.7.3" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.7.3.tgz#f1d606e2827d409053f3e908ba4eb8adb1dd6995" + integrity sha512-+wuegAMaLcZnLCJIvrVUDzA9z/Wp93f0Dla/4jJvIhijRrPabjQbZe6fWiECLaJyfn5ci9fqf9vTw3xpQOad2A== + +"@openzeppelin/contracts-upgradeable@4.8.1": + version "4.8.1" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.8.1.tgz#363f7dd08f25f8f77e16d374350c3d6b43340a7a" + integrity sha512-1wTv+20lNiC0R07jyIAbHU7TNHKRwGiTGRfiNnA8jOWjKT98g5OgLpYWOi40Vgpk8SPLA9EvfJAbAeIyVn+7Bw== + +"@openzeppelin/contracts-upgradeable@^4.7.3", "@openzeppelin/contracts-upgradeable@^v4.9.3": + version "4.9.6" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.6.tgz#38b21708a719da647de4bb0e4802ee235a0d24df" + integrity sha512-m4iHazOsOCv1DgM7eD7GupTJ+NFVujRZt1wzddDPSVGpWdKq1SKkla5htKG7+IS4d2XOCtzkUNwRZ7Vq5aEUMA== "@openzeppelin/contracts-v0.7@npm:@openzeppelin/contracts@v3.4.2": - version: 3.4.2 - resolution: "@openzeppelin/contracts@npm:3.4.2" - checksum: 0c90f029fe50a49643588e4c8670dae3bbf31795133a6ddce9bdcbc258486332700bb732287baabf7bf807f39182fe8ea2ffa19aa5caf359b1b9c0f083280748 - languageName: node - linkType: hard - -"@openzeppelin/contracts@npm:^4.4.1, @openzeppelin/contracts@npm:^4.9.3": - version: 4.9.6 - resolution: "@openzeppelin/contracts@npm:4.9.6" - checksum: 274b6e968268294f12d5ca4f0278f6e6357792c8bb4d76664f83dbdc325f780541538a127e6a6e97e4f018088b42f65952014dec9c745c0fa25081f43ef9c4bf - languageName: node - linkType: hard - -"@openzeppelin/contracts@npm:~4.3.3": - version: 4.3.3 - resolution: "@openzeppelin/contracts@npm:4.3.3" - checksum: 73eb23e7acc8531931076d11251629bdc8579c99ef921a3facbd8abf7b860bc214c97a4bd56cd67db7c9d1db837765132640f24987aac8097a13960bb41ca6d1 - languageName: node - linkType: hard - -"@pkgjs/parseargs@npm:^0.11.0": - version: 0.11.0 - resolution: "@pkgjs/parseargs@npm:0.11.0" - checksum: 6ad6a00fc4f2f2cfc6bff76fb1d88b8ee20bc0601e18ebb01b6d4be583733a860239a521a7fbca73b612e66705078809483549d2b18f370eb346c5155c8e4a0f - languageName: node - linkType: hard - -"@polytope-labs/ismp-solidity@npm:^0.7.1": - version: 0.7.1 - resolution: "@polytope-labs/ismp-solidity@npm:0.7.1" - dependencies: - "@polytope-labs/solidity-merkle-trees": ^0.3.3 - openzeppelin-solidity: ^4.8.1 - prettier: ^3.3.3 - prettier-plugin-solidity: ^1.3.1 - checksum: 79d963014c8a166d9ab26a5c2f5632aee8032ced8367543245f093050540441a5665014d2046b1f9df4cd7c67474856ed307cddad4040577d758c4c5cd13b7af - languageName: node - linkType: hard - -"@polytope-labs/solidity-merkle-trees@npm:0.3.2": - version: 0.3.2 - resolution: "@polytope-labs/solidity-merkle-trees@npm:0.3.2" - dependencies: - openzeppelin-solidity: ^4.8.1 - checksum: a758e0dc669138d7ca512bddf1eced89792ac1e00bf725d238e9664df53917bf22c5d5a7c4e2798cbeb036c6aca64af53928a35f36c39eb32466c6024f82c789 - languageName: node - linkType: hard - -"@polytope-labs/solidity-merkle-trees@npm:^0.3.3": - version: 0.3.4 - resolution: "@polytope-labs/solidity-merkle-trees@npm:0.3.4" - dependencies: - openzeppelin-solidity: ^4.8.1 - prettier: ^3.3.3 - prettier-plugin-solidity: ^1.4.1 - checksum: 49c167728cb8725a31fa8ef4ececc8734f0111f6e3878e84eb1ec1313973f56395b5cb11055aa7229964baa8d5fc2ffa71371f41c155fa34f126f196242878ba - languageName: node - linkType: hard - -"@routerprotocol/evm-gateway-contracts@npm:1.1.13": - version: 1.1.13 - resolution: "@routerprotocol/evm-gateway-contracts@npm:1.1.13" - dependencies: - "@openzeppelin/contracts": ^4.4.1 - "@openzeppelin/contracts-upgradeable": ^4.7.3 - checksum: 08898738eaf06d330a96ada9c1760ddc5ee8e3f7871eca425d1ce66a3c1496766d1509f40aec203b6f1dd6f077696fdf5c7e489ba3291f0377261e556d4999cc - languageName: node - linkType: hard - -"@scure/base@npm:~1.1.0, @scure/base@npm:~1.1.6, @scure/base@npm:~1.1.8": - version: 1.1.8 - resolution: "@scure/base@npm:1.1.8" - checksum: 1fc8a355ba68663c0eb430cf6a2c5ff5af790c347c1ba1953f344e8681ab37e37e2545e495f7f971b0245727d710fea8c1e57d232d0c6c543cbed4965c7596a1 - languageName: node - linkType: hard - -"@scure/bip32@npm:1.1.5": - version: 1.1.5 - resolution: "@scure/bip32@npm:1.1.5" - dependencies: - "@noble/hashes": ~1.2.0 - "@noble/secp256k1": ~1.7.0 - "@scure/base": ~1.1.0 - checksum: b08494ab0d2b1efee7226d1b5100db5157ebea22a78bb87126982a76a186cb3048413e8be0ba2622d00d048a20acbba527af730de86c132a77de616eb9907a3b - languageName: node - linkType: hard - -"@scure/bip32@npm:1.4.0": - version: 1.4.0 - resolution: "@scure/bip32@npm:1.4.0" - dependencies: - "@noble/curves": ~1.4.0 - "@noble/hashes": ~1.4.0 - "@scure/base": ~1.1.6 - checksum: eff491651cbf2bea8784936de75af5fc020fc1bbb9bcb26b2cfeefbd1fb2440ebfaf30c0733ca11c0ae1e272a2ef4c3c34ba5c9fb3e1091c3285a4272045b0c6 - languageName: node - linkType: hard - -"@scure/bip39@npm:1.1.1": - version: 1.1.1 - resolution: "@scure/bip39@npm:1.1.1" - dependencies: - "@noble/hashes": ~1.2.0 - "@scure/base": ~1.1.0 - checksum: fbb594c50696fa9c14e891d872f382e50a3f919b6c96c55ef2fb10c7102c546dafb8f099a62bd114c12a00525b595dcf7381846f383f0ddcedeaa6e210747d2f - languageName: node - linkType: hard - -"@scure/bip39@npm:1.3.0": - version: 1.3.0 - resolution: "@scure/bip39@npm:1.3.0" - dependencies: - "@noble/hashes": ~1.4.0 - "@scure/base": ~1.1.6 - checksum: dbb0b27df753eb6c6380010b25cc9a9ea31f9cb08864fc51e69e5880ff7e2b8f85b72caea1f1f28af165e83b72c48dd38617e43fc632779d025b50ba32ea759e - languageName: node - linkType: hard - -"@scure/bip39@npm:1.4.0": - version: 1.4.0 - resolution: "@scure/bip39@npm:1.4.0" - dependencies: - "@noble/hashes": ~1.5.0 - "@scure/base": ~1.1.8 - checksum: 211f2c01361993bfe54c0e4949f290224381457c7f76d7cd51d6a983f3f4b6b9f85adfd0e623977d777ed80417a5fe729eb19dd34e657147810a0e58a8e7b9e0 - languageName: node - linkType: hard - -"@sentry/core@npm:5.30.0": - version: 5.30.0 - resolution: "@sentry/core@npm:5.30.0" - dependencies: - "@sentry/hub": 5.30.0 - "@sentry/minimal": 5.30.0 - "@sentry/types": 5.30.0 - "@sentry/utils": 5.30.0 - tslib: ^1.9.3 - checksum: 8a2b22687e70d76fa4381bce215d770b6c08561c5ff5d6afe39c8c3c509c18ee7384ad0be3aee18d3a858a3c88e1d2821cf10eb5e05646376a33200903b56da2 - languageName: node - linkType: hard - -"@sentry/hub@npm:5.30.0": - version: 5.30.0 - resolution: "@sentry/hub@npm:5.30.0" - dependencies: - "@sentry/types": 5.30.0 - "@sentry/utils": 5.30.0 - tslib: ^1.9.3 - checksum: 09f778cc78765213f1e35a3ee6da3a8e02a706e8a7e5b7f84614707f4b665c7297b700a1849ab2ca1f02ede5884fd9ae893e58dc65f04f35ccdfee17e99ee93d - languageName: node - linkType: hard - -"@sentry/minimal@npm:5.30.0": - version: 5.30.0 - resolution: "@sentry/minimal@npm:5.30.0" - dependencies: - "@sentry/hub": 5.30.0 - "@sentry/types": 5.30.0 - tslib: ^1.9.3 - checksum: 934650f6989ce51f425c7c4b4d4d9bfecface8162a36d21df8a241f780ab1716dd47b81e2170e4cc624797ed1eebe10f71e4876c1e25b787860daaef75ca7a0c - languageName: node - linkType: hard - -"@sentry/node@npm:^5.18.1": - version: 5.30.0 - resolution: "@sentry/node@npm:5.30.0" - dependencies: - "@sentry/core": 5.30.0 - "@sentry/hub": 5.30.0 - "@sentry/tracing": 5.30.0 - "@sentry/types": 5.30.0 - "@sentry/utils": 5.30.0 - cookie: ^0.4.1 - https-proxy-agent: ^5.0.0 - lru_map: ^0.3.3 - tslib: ^1.9.3 - checksum: 5f0367cc52f9d716c64ba727e2a5c8592364494c8fdadfb3df2d0ee9d7956b886fb3ec674370292d2a7b7e1d9a8e1b84c69c06e8a4a064be8d4687698df0090c - languageName: node - linkType: hard - -"@sentry/tracing@npm:5.30.0": - version: 5.30.0 - resolution: "@sentry/tracing@npm:5.30.0" - dependencies: - "@sentry/hub": 5.30.0 - "@sentry/minimal": 5.30.0 - "@sentry/types": 5.30.0 - "@sentry/utils": 5.30.0 - tslib: ^1.9.3 - checksum: 720c07b111e8128e70a939ab4e9f9cfd13dc23303b27575afddabab08d08f9b94499017c76a9ffe253bf3ca40833e8f9262cf6dc546ba24da6eb74fedae5f92b - languageName: node - linkType: hard - -"@sentry/types@npm:5.30.0": - version: 5.30.0 - resolution: "@sentry/types@npm:5.30.0" - checksum: de7df777824c8e311f143c6fd7de220b24f25b5018312fe8f67d93bebf0f3cdd32bbca9f155846f5c31441d940eebe27c8338000321559a743264c7e41dda560 - languageName: node - linkType: hard - -"@sentry/utils@npm:5.30.0": - version: 5.30.0 - resolution: "@sentry/utils@npm:5.30.0" - dependencies: - "@sentry/types": 5.30.0 - tslib: ^1.9.3 - checksum: 27b259a136c664427641dd32ee3dc490553f3b5e92986accfa829d14063ebc69b191e92209ac9c40fbc367f74cfa17dc93b4c40981d666711fd57b4d51a82062 - languageName: node - linkType: hard - -"@solana/buffer-layout@npm:^4.0.1": - version: 4.0.1 - resolution: "@solana/buffer-layout@npm:4.0.1" - dependencies: - buffer: ~6.0.3 - checksum: bf846888e813187243d4008a7a9f58b49d16cbd995b9d7f1b72898aa510ed77b1ce5e8468e7b2fd26dd81e557a4e74a666e21fccb95f123c1f740d41138bbacd - languageName: node - linkType: hard - -"@solana/web3.js@npm:^1.78.0": - version: 1.95.3 - resolution: "@solana/web3.js@npm:1.95.3" - dependencies: - "@babel/runtime": ^7.25.0 - "@noble/curves": ^1.4.2 - "@noble/hashes": ^1.4.0 - "@solana/buffer-layout": ^4.0.1 - agentkeepalive: ^4.5.0 - bigint-buffer: ^1.1.5 - bn.js: ^5.2.1 - borsh: ^0.7.0 - bs58: ^4.0.1 - buffer: 6.0.3 - fast-stable-stringify: ^1.0.0 - jayson: ^4.1.1 - node-fetch: ^2.7.0 - rpc-websockets: ^9.0.2 - superstruct: ^2.0.2 - checksum: 6951eb12275de09ef9422fc65982b7496f3d11253b4cd1b09694dd2135d92aa272a04a7adf50ef0136a459b08ea40e07f6e7cbf1970cae44d6193d93fe6acc1f - languageName: node - linkType: hard - -"@solidity-parser/parser@npm:^0.14.0": - version: 0.14.5 - resolution: "@solidity-parser/parser@npm:0.14.5" - dependencies: - antlr4ts: ^0.5.0-alpha.4 - checksum: 9e85a0d4f8a05a11db6022444b70b2f353e2358467b1cce44cdda703ae1e3c7337e1b8cbc2eec8e14a8f34f9c60b42f325e5fe9b3c934cc980e35091e292d7ee - languageName: node - linkType: hard - -"@solidity-parser/parser@npm:^0.16.0": - version: 0.16.2 - resolution: "@solidity-parser/parser@npm:0.16.2" - dependencies: - antlr4ts: ^0.5.0-alpha.4 - checksum: 109f7bec5de943c63e444fdde179d9bba6a592c18c836f585753798f428424cfcca72c715e7a345e4b79b83d6548543c9e56cb4b263e9b1e8352af2efcfd224a - languageName: node - linkType: hard - -"@solidity-parser/parser@npm:^0.18.0": - version: 0.18.0 - resolution: "@solidity-parser/parser@npm:0.18.0" - checksum: 970d991529d632862fa88e107531339d84df35bf0374e31e8215ce301b19a01ede33fccf4d374402649814263f8bc278a8e6d62a0129bb877539fbdd16a604cc - languageName: node - linkType: hard - -"@swc/helpers@npm:^0.5.11": - version: 0.5.13 - resolution: "@swc/helpers@npm:0.5.13" - dependencies: - tslib: ^2.4.0 - checksum: d50c2c10da6ef940af423c6b03ad9c3c94cf9de59314b1e921a7d1bcc081a6074481c9d67b655fc8fe66a73288f98b25950743792a63882bfb5793b362494fc0 - languageName: node - linkType: hard - -"@trivago/prettier-plugin-sort-imports@npm:^4.0.0": - version: 4.3.0 - resolution: "@trivago/prettier-plugin-sort-imports@npm:4.3.0" - dependencies: - "@babel/generator": 7.17.7 - "@babel/parser": ^7.20.5 - "@babel/traverse": 7.23.2 - "@babel/types": 7.17.0 - javascript-natural-sort: 0.7.1 - lodash: ^4.17.21 - peerDependencies: - "@vue/compiler-sfc": 3.x - prettier: 2.x - 3.x - peerDependenciesMeta: - "@vue/compiler-sfc": - optional: true - checksum: 22bb311ca24f09eef25915a66727e7be113b703f196f6ea0589dc9730b11a6f1e5e4bcc468213101d138b570d310792c83abb8d9487c53f9e597942fea052b6e - languageName: node - linkType: hard - -"@tsconfig/node10@npm:^1.0.7": - version: 1.0.11 - resolution: "@tsconfig/node10@npm:1.0.11" - checksum: 51fe47d55fe1b80ec35e6e5ed30a13665fd3a531945350aa74a14a1e82875fb60b350c2f2a5e72a64831b1b6bc02acb6760c30b3738b54954ec2dea82db7a267 - languageName: node - linkType: hard - -"@tsconfig/node12@npm:^1.0.7": - version: 1.0.11 - resolution: "@tsconfig/node12@npm:1.0.11" - checksum: 5ce29a41b13e7897a58b8e2df11269c5395999e588b9a467386f99d1d26f6c77d1af2719e407621412520ea30517d718d5192a32403b8dfcc163bf33e40a338a - languageName: node - linkType: hard - -"@tsconfig/node14@npm:^1.0.0": - version: 1.0.3 - resolution: "@tsconfig/node14@npm:1.0.3" - checksum: 19275fe80c4c8d0ad0abed6a96dbf00642e88b220b090418609c4376e1cef81bf16237bf170ad1b341452feddb8115d8dd2e5acdfdea1b27422071163dc9ba9d - languageName: node - linkType: hard - -"@tsconfig/node16@npm:^1.0.2": - version: 1.0.4 - resolution: "@tsconfig/node16@npm:1.0.4" - checksum: 202319785901f942a6e1e476b872d421baec20cf09f4b266a1854060efbf78cde16a4d256e8bc949d31e6cd9a90f1e8ef8fb06af96a65e98338a2b6b0de0a0ff - languageName: node - linkType: hard - -"@typechain/ethers-v5@npm:^10.1.1": - version: 10.2.1 - resolution: "@typechain/ethers-v5@npm:10.2.1" - dependencies: - lodash: ^4.17.15 - ts-essentials: ^7.0.1 - peerDependencies: - "@ethersproject/abi": ^5.0.0 - "@ethersproject/providers": ^5.0.0 - ethers: ^5.1.3 - typechain: ^8.1.1 - typescript: ">=4.3.0" - checksum: 852da4b1ff368ef87251111a5d50077de3d0fc12c519529269a74223740f8bda89297e67a5eb6c1f5b04ee23119566d6cbccf58264d32a83132be0f328a58d22 - languageName: node - linkType: hard - -"@typechain/hardhat@npm:^6.1.4": - version: 6.1.6 - resolution: "@typechain/hardhat@npm:6.1.6" - dependencies: - fs-extra: ^9.1.0 - peerDependencies: - "@ethersproject/abi": ^5.4.7 - "@ethersproject/providers": ^5.4.7 - "@typechain/ethers-v5": ^10.2.1 - ethers: ^5.4.7 - hardhat: ^2.9.9 - typechain: ^8.1.1 - checksum: f214bebf7860956230478cb92696ba757829cfd9dc65ac99c3bc7e539378310318d92b009054186f446595c8ffc1a81e9c6d028da0eb04253253049ea1b6e8d3 - languageName: node - linkType: hard - -"@types/bn.js@npm:^4.11.3": - version: 4.11.6 - resolution: "@types/bn.js@npm:4.11.6" - dependencies: - "@types/node": "*" - checksum: 7f66f2c7b7b9303b3205a57184261974b114495736b77853af5b18d857c0b33e82ce7146911e86e87a87837de8acae28986716fd381ac7c301fd6e8d8b6c811f - languageName: node - linkType: hard - -"@types/bn.js@npm:^5.1.0": - version: 5.1.5 - resolution: "@types/bn.js@npm:5.1.5" - dependencies: - "@types/node": "*" - checksum: c87b28c4af74545624f8a3dae5294b16aa190c222626e8d4b2e327b33b1a3f1eeb43e7a24d914a9774bca43d8cd6e1cb0325c1f4b3a244af6693a024e1d918e6 - languageName: node - linkType: hard - -"@types/chai-as-promised@npm:^7.1.3": - version: 7.1.8 - resolution: "@types/chai-as-promised@npm:7.1.8" - dependencies: - "@types/chai": "*" - checksum: f0e5eab451b91bc1e289ed89519faf6591932e8a28d2ec9bbe95826eb73d28fe43713633e0c18706f3baa560a7d97e7c7c20dc53ce639e5d75bac46b2a50bf21 - languageName: node - linkType: hard - -"@types/chai@npm:*, @types/chai@npm:^4.3.4": - version: 4.3.19 - resolution: "@types/chai@npm:4.3.19" - checksum: abd4d3239735054f3b6e8163e45bc6495f66469729fbcf4784c9f2b82361a6845d45ab9c518818c78eafa46d015e3a72306e9949d1333e10d7eaedf426af4261 - languageName: node - linkType: hard - -"@types/concat-stream@npm:^1.6.0": - version: 1.6.1 - resolution: "@types/concat-stream@npm:1.6.1" - dependencies: - "@types/node": "*" - checksum: 7d211e74331affd3578b5469244f5cef84a93775f38332adb3ef12413559a23862bc682c6873d0a404b01c9d5d5f7d3ae091fe835b435b633eb420e3055b3e56 - languageName: node - linkType: hard - -"@types/connect@npm:^3.4.33": - version: 3.4.38 - resolution: "@types/connect@npm:3.4.38" - dependencies: - "@types/node": "*" - checksum: 7eb1bc5342a9604facd57598a6c62621e244822442976c443efb84ff745246b10d06e8b309b6e80130026a396f19bf6793b7cecd7380169f369dac3bfc46fb99 - languageName: node - linkType: hard - -"@types/conventional-commits-parser@npm:^5.0.0": - version: 5.0.0 - resolution: "@types/conventional-commits-parser@npm:5.0.0" - dependencies: - "@types/node": "*" - checksum: 88013c53adccaf359a429412c5d835990a88be33218f01f85eb04cf839a7d5bef51dd52b83a3032b00153e9f3ce4a7e84ff10b0a1f833c022c5e999b00eef24c - languageName: node - linkType: hard - -"@types/form-data@npm:0.0.33": - version: 0.0.33 - resolution: "@types/form-data@npm:0.0.33" - dependencies: - "@types/node": "*" - checksum: f0c283fdef2dd7191168a37b9cb2625af3cfbd7f72b5a514f938bea0a135669f79d736186d434b9e81150b47ef1bf20d97b188014a00583556fad6ce59fb9bbf - languageName: node - linkType: hard - -"@types/fs-extra@npm:^9.0.13": - version: 9.0.13 - resolution: "@types/fs-extra@npm:9.0.13" - dependencies: - "@types/node": "*" - checksum: add79e212acd5ac76b97b9045834e03a7996aef60a814185e0459088fd290519a3c1620865d588fa36c4498bf614210d2a703af5cf80aa1dbc125db78f6edac3 - languageName: node - linkType: hard - -"@types/glob@npm:^7.1.1": - version: 7.2.0 - resolution: "@types/glob@npm:7.2.0" - dependencies: - "@types/minimatch": "*" - "@types/node": "*" - checksum: 6ae717fedfdfdad25f3d5a568323926c64f52ef35897bcac8aca8e19bc50c0bd84630bbd063e5d52078b2137d8e7d3c26eabebd1a2f03ff350fff8a91e79fc19 - languageName: node - linkType: hard - -"@types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.9": - version: 7.0.15 - resolution: "@types/json-schema@npm:7.0.15" - checksum: 97ed0cb44d4070aecea772b7b2e2ed971e10c81ec87dd4ecc160322ffa55ff330dace1793489540e3e318d90942064bb697cc0f8989391797792d919737b3b98 - languageName: node - linkType: hard - -"@types/lru-cache@npm:^5.1.0": - version: 5.1.1 - resolution: "@types/lru-cache@npm:5.1.1" - checksum: e1d6c0085f61b16ec5b3073ec76ad1be4844ea036561c3f145fc19f71f084b58a6eb600b14128aa95809d057d28f1d147c910186ae51219f58366ffd2ff2e118 - languageName: node - linkType: hard - -"@types/minimatch@npm:*": - version: 5.1.2 - resolution: "@types/minimatch@npm:5.1.2" - checksum: 0391a282860c7cb6fe262c12b99564732401bdaa5e395bee9ca323c312c1a0f45efbf34dce974682036e857db59a5c9b1da522f3d6055aeead7097264c8705a8 - languageName: node - linkType: hard - -"@types/minimist@npm:^1.2.0": - version: 1.2.5 - resolution: "@types/minimist@npm:1.2.5" - checksum: 477047b606005058ab0263c4f58097136268007f320003c348794f74adedc3166ffc47c80ec3e94687787f2ab7f4e72c468223946e79892cf0fd9e25e9970a90 - languageName: node - linkType: hard - -"@types/mkdirp@npm:^0.5.2": - version: 0.5.2 - resolution: "@types/mkdirp@npm:0.5.2" - dependencies: - "@types/node": "*" - checksum: 21e6681ee18cee6314dbe0f57ada48981912b76de8266f438ba2573770d60aaa8dd376baad3f20e2346696a7cca84b0aadd1737222341553a0091831a46e6ad1 - languageName: node - linkType: hard - -"@types/mocha@npm:^10.0.0": - version: 10.0.8 - resolution: "@types/mocha@npm:10.0.8" - checksum: d64faa9f1ed249441944a6ae3f01d72c756b54d8bcf8e2edccb09c0d084cec6d8a0cd8b717df517812f045ade20b4b8768e06aa8633bd2485a41ec37f06be710 - languageName: node - linkType: hard - -"@types/node@npm:*": - version: 22.5.4 - resolution: "@types/node@npm:22.5.4" - dependencies: - undici-types: ~6.19.2 - checksum: 77ac225c38c428200036780036da0bc6764e2721cfa8f528c7e7da7cfefe01a32a5791e28a54efbeedbc977949058d7db902b2e00139298225d4686cee4ae6db - languageName: node - linkType: hard - -"@types/node@npm:18.15.13": - version: 18.15.13 - resolution: "@types/node@npm:18.15.13" - checksum: 79cc5a2b5f98e8973061a4260a781425efd39161a0e117a69cd089603964816c1a14025e1387b4590c8e82d05133b7b4154fa53a7dffb3877890a66145e76515 - languageName: node - linkType: hard - -"@types/node@npm:20.5.1": - version: 20.5.1 - resolution: "@types/node@npm:20.5.1" - checksum: 3dbe611cd67afa987102c8558ee70f848949c5dcfee5f60abc073e55c0d7b048e391bf06bb1e0dc052cb7210ca97136ac496cbaf6e89123c989de6bd125fde82 - languageName: node - linkType: hard - -"@types/node@npm:^10.0.3": - version: 10.17.60 - resolution: "@types/node@npm:10.17.60" - checksum: 2cdb3a77d071ba8513e5e8306fa64bf50e3c3302390feeaeff1fd325dd25c8441369715dfc8e3701011a72fed5958c7dfa94eb9239a81b3c286caa4d97db6eef - languageName: node - linkType: hard - -"@types/node@npm:^12.12.54": - version: 12.20.55 - resolution: "@types/node@npm:12.20.55" - checksum: e4f86785f4092706e0d3b0edff8dca5a13b45627e4b36700acd8dfe6ad53db71928c8dee914d4276c7fd3b6ccd829aa919811c9eb708a2c8e4c6eb3701178c37 - languageName: node - linkType: hard - -"@types/node@npm:^18.11.9": - version: 18.19.50 - resolution: "@types/node@npm:18.19.50" - dependencies: - undici-types: ~5.26.4 - checksum: 73bdd2b46fb96816a1f7309e1b609f0832a29739c87df7daa729ff497160be143e02cf18486a0112e1981b092358aed3ca0716b532aff93c7e05f7dbb4f7586a - languageName: node - linkType: hard - -"@types/node@npm:^20.8.9": - version: 20.16.5 - resolution: "@types/node@npm:20.16.5" - dependencies: - undici-types: ~6.19.2 - checksum: f38b7bd8c4993dcf38943afa2ffdd7dfd18fc94f8f3f28d0c1045a10d39871a6cc1b8f8d3bf0c7ed848457d0e1d283482f6ca125579c13fed1b7575d23e8e8f5 - languageName: node - linkType: hard - -"@types/node@npm:^8.0.0": - version: 8.10.66 - resolution: "@types/node@npm:8.10.66" - checksum: c52039de862654a139abdc6a51de532a69dd80516ac35a959c3b3a2831ecbaaf065b0df5f9db943f5e28b544ebb9a891730d52b52f7a169b86a82bc060210000 - languageName: node - linkType: hard - -"@types/normalize-package-data@npm:^2.4.0": - version: 2.4.4 - resolution: "@types/normalize-package-data@npm:2.4.4" - checksum: 65dff72b543997b7be8b0265eca7ace0e34b75c3e5fee31de11179d08fa7124a7a5587265d53d0409532ecb7f7fba662c2012807963e1f9b059653ec2c83ee05 - languageName: node - linkType: hard - -"@types/pbkdf2@npm:^3.0.0": - version: 3.1.2 - resolution: "@types/pbkdf2@npm:3.1.2" - dependencies: - "@types/node": "*" - checksum: bebe1e596cbbe5f7d2726a58859e61986c5a42459048e29cb7f2d4d764be6bbb0844572fd5d70ca8955a8a17e8b4ed80984fc4903e165d9efb8807a3fbb051aa - languageName: node - linkType: hard - -"@types/prettier@npm:^2.1.1": - version: 2.7.3 - resolution: "@types/prettier@npm:2.7.3" - checksum: 705384209cea6d1433ff6c187c80dcc0b95d99d5c5ce21a46a9a58060c527973506822e428789d842761e0280d25e3359300f017fbe77b9755bc772ab3dc2f83 - languageName: node - linkType: hard - -"@types/qs@npm:^6.2.31, @types/qs@npm:^6.9.7": - version: 6.9.15 - resolution: "@types/qs@npm:6.9.15" - checksum: 97d8208c2b82013b618e7a9fc14df6bd40a73e1385ac479b6896bafc7949a46201c15f42afd06e86a05e914f146f495f606b6fb65610cc60cf2e0ff743ec38a2 - languageName: node - linkType: hard - -"@types/readable-stream@npm:^2.3.13": - version: 2.3.15 - resolution: "@types/readable-stream@npm:2.3.15" - dependencies: - "@types/node": "*" - safe-buffer: ~5.1.1 - checksum: ec36f525cad09b6c65a1dafcb5ad99b9e2ed824ec49b7aa23180ac427e5d35b8a0706193ecd79ab4253a283ad485ba03d5917a98daaaa144f0ea34f4823e9d82 - languageName: node - linkType: hard - -"@types/resolve@npm:^0.0.8": - version: 0.0.8 - resolution: "@types/resolve@npm:0.0.8" - dependencies: - "@types/node": "*" - checksum: f241bb773ab14b14500623ac3b57c52006ce32b20426b6d8bf2fe5fdc0344f42c77ac0f94ff57b443ae1d320a1a86c62b4e47239f0321699404402fbeb24bad6 - languageName: node - linkType: hard - -"@types/secp256k1@npm:^4.0.1": - version: 4.0.6 - resolution: "@types/secp256k1@npm:4.0.6" - dependencies: - "@types/node": "*" - checksum: 984494caf49a4ce99fda2b9ea1840eb47af946b8c2737314108949bcc0c06b4880e871296bd49ed6ea4c8423e3a302ad79fec43abfc987330e7eb98f0c4e8ba4 - languageName: node - linkType: hard - -"@types/semver@npm:^7.3.12, @types/semver@npm:^7.5.0": - version: 7.5.8 - resolution: "@types/semver@npm:7.5.8" - checksum: ea6f5276f5b84c55921785a3a27a3cd37afee0111dfe2bcb3e03c31819c197c782598f17f0b150a69d453c9584cd14c4c4d7b9a55d2c5e6cacd4d66fdb3b3663 - languageName: node - linkType: hard - -"@types/triple-beam@npm:^1.3.2": - version: 1.3.5 - resolution: "@types/triple-beam@npm:1.3.5" - checksum: 519b6a1b30d4571965c9706ad5400a200b94e4050feca3e7856e3ea7ac00ec9903e32e9a10e2762d0f7e472d5d03e5f4b29c16c0bd8c1f77c8876c683b2231f1 - languageName: node - linkType: hard - -"@types/uuid@npm:^8.3.4": - version: 8.3.4 - resolution: "@types/uuid@npm:8.3.4" - checksum: 6f11f3ff70f30210edaa8071422d405e9c1d4e53abbe50fdce365150d3c698fe7bbff65c1e71ae080cbfb8fded860dbb5e174da96fdbbdfcaa3fb3daa474d20f - languageName: node - linkType: hard - -"@types/webidl-conversions@npm:*": - version: 7.0.3 - resolution: "@types/webidl-conversions@npm:7.0.3" - checksum: 535ead9de4d3d6c8e4f4fa14e9db780d2a31e8020debc062f337e1420a41c3265e223e4f4b628f97a11ecf3b96390962cd88a9ffe34f44e159dec583ff49aa34 - languageName: node - linkType: hard - -"@types/whatwg-url@npm:^11.0.2": - version: 11.0.5 - resolution: "@types/whatwg-url@npm:11.0.5" - dependencies: - "@types/webidl-conversions": "*" - checksum: 23a0c45aff51817807b473a6adb181d6e3bb0d27dde54e84883d5d5bc93358e95204d2188e7ff7fdc2cdaf157e97e1188ef0a22ec79228da300fc30d4a05b56a - languageName: node - linkType: hard - -"@types/ws@npm:^7.4.4": - version: 7.4.7 - resolution: "@types/ws@npm:7.4.7" - dependencies: - "@types/node": "*" - checksum: b4c9b8ad209620c9b21e78314ce4ff07515c0cadab9af101c1651e7bfb992d7fd933bd8b9c99d110738fd6db523ed15f82f29f50b45510288da72e964dedb1a3 - languageName: node - linkType: hard - -"@types/ws@npm:^8.2.2": - version: 8.5.12 - resolution: "@types/ws@npm:8.5.12" - dependencies: - "@types/node": "*" - checksum: ddefb6ad1671f70ce73b38a5f47f471d4d493864fca7c51f002a86e5993d031294201c5dced6d5018fb8905ad46888d65c7f20dd54fc165910b69f42fba9a6d0 - languageName: node - linkType: hard - -"@typescript-eslint/eslint-plugin@npm:^5.44.0": - version: 5.62.0 - resolution: "@typescript-eslint/eslint-plugin@npm:5.62.0" - dependencies: - "@eslint-community/regexpp": ^4.4.0 - "@typescript-eslint/scope-manager": 5.62.0 - "@typescript-eslint/type-utils": 5.62.0 - "@typescript-eslint/utils": 5.62.0 - debug: ^4.3.4 - graphemer: ^1.4.0 - ignore: ^5.2.0 - natural-compare-lite: ^1.4.0 - semver: ^7.3.7 - tsutils: ^3.21.0 - peerDependencies: - "@typescript-eslint/parser": ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: fc104b389c768f9fa7d45a48c86d5c1ad522c1d0512943e782a56b1e3096b2cbcc1eea3fcc590647bf0658eef61aac35120a9c6daf979bf629ad2956deb516a1 - languageName: node - linkType: hard - -"@typescript-eslint/eslint-plugin@npm:^6.7.5": - version: 6.21.0 - resolution: "@typescript-eslint/eslint-plugin@npm:6.21.0" - dependencies: - "@eslint-community/regexpp": ^4.5.1 - "@typescript-eslint/scope-manager": 6.21.0 - "@typescript-eslint/type-utils": 6.21.0 - "@typescript-eslint/utils": 6.21.0 - "@typescript-eslint/visitor-keys": 6.21.0 - debug: ^4.3.4 - graphemer: ^1.4.0 - ignore: ^5.2.4 - natural-compare: ^1.4.0 - semver: ^7.5.4 - ts-api-utils: ^1.0.1 - peerDependencies: - "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 5ef2c502255e643e98051e87eb682c2a257e87afd8ec3b9f6274277615e1c2caf3131b352244cfb1987b8b2c415645eeacb9113fa841fc4c9b2ac46e8aed6efd - languageName: node - linkType: hard - -"@typescript-eslint/parser@npm:^5.44.0": - version: 5.62.0 - resolution: "@typescript-eslint/parser@npm:5.62.0" - dependencies: - "@typescript-eslint/scope-manager": 5.62.0 - "@typescript-eslint/types": 5.62.0 - "@typescript-eslint/typescript-estree": 5.62.0 - debug: ^4.3.4 - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: d168f4c7f21a7a63f47002e2d319bcbb6173597af5c60c1cf2de046b46c76b4930a093619e69faf2d30214c29ab27b54dcf1efc7046a6a6bd6f37f59a990e752 - languageName: node - linkType: hard - -"@typescript-eslint/parser@npm:^6.7.5": - version: 6.21.0 - resolution: "@typescript-eslint/parser@npm:6.21.0" - dependencies: - "@typescript-eslint/scope-manager": 6.21.0 - "@typescript-eslint/types": 6.21.0 - "@typescript-eslint/typescript-estree": 6.21.0 - "@typescript-eslint/visitor-keys": 6.21.0 - debug: ^4.3.4 - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 162fe3a867eeeffda7328bce32dae45b52283c68c8cb23258fb9f44971f761991af61f71b8c9fe1aa389e93dfe6386f8509c1273d870736c507d76dd40647b68 - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/scope-manager@npm:5.62.0" - dependencies: - "@typescript-eslint/types": 5.62.0 - "@typescript-eslint/visitor-keys": 5.62.0 - checksum: 6062d6b797fe1ce4d275bb0d17204c827494af59b5eaf09d8a78cdd39dadddb31074dded4297aaf5d0f839016d601032857698b0e4516c86a41207de606e9573 - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/scope-manager@npm:6.21.0" - dependencies: - "@typescript-eslint/types": 6.21.0 - "@typescript-eslint/visitor-keys": 6.21.0 - checksum: 71028b757da9694528c4c3294a96cc80bc7d396e383a405eab3bc224cda7341b88e0fc292120b35d3f31f47beac69f7083196c70616434072fbcd3d3e62d3376 - languageName: node - linkType: hard - -"@typescript-eslint/type-utils@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/type-utils@npm:5.62.0" - dependencies: - "@typescript-eslint/typescript-estree": 5.62.0 - "@typescript-eslint/utils": 5.62.0 - debug: ^4.3.4 - tsutils: ^3.21.0 - peerDependencies: - eslint: "*" - peerDependenciesMeta: - typescript: - optional: true - checksum: fc41eece5f315dfda14320be0da78d3a971d650ea41300be7196934b9715f3fe1120a80207551eb71d39568275dbbcf359bde540d1ca1439d8be15e9885d2739 - languageName: node - linkType: hard - -"@typescript-eslint/type-utils@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/type-utils@npm:6.21.0" - dependencies: - "@typescript-eslint/typescript-estree": 6.21.0 - "@typescript-eslint/utils": 6.21.0 - debug: ^4.3.4 - ts-api-utils: ^1.0.1 - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 77025473f4d80acf1fafcce99c5c283e557686a61861febeba9c9913331f8a41e930bf5cd8b7a54db502a57b6eb8ea6d155cbd4f41349ed00e3d7aeb1f477ddc - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/types@npm:5.62.0" - checksum: 48c87117383d1864766486f24de34086155532b070f6264e09d0e6139449270f8a9559cfef3c56d16e3bcfb52d83d42105d61b36743626399c7c2b5e0ac3b670 - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/types@npm:6.21.0" - checksum: 9501b47d7403417af95fc1fb72b2038c5ac46feac0e1598a46bcb43e56a606c387e9dcd8a2a0abe174c91b509f2d2a8078b093786219eb9a01ab2fbf9ee7b684 - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/typescript-estree@npm:5.62.0" - dependencies: - "@typescript-eslint/types": 5.62.0 - "@typescript-eslint/visitor-keys": 5.62.0 - debug: ^4.3.4 - globby: ^11.1.0 - is-glob: ^4.0.3 - semver: ^7.3.7 - tsutils: ^3.21.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 3624520abb5807ed8f57b1197e61c7b1ed770c56dfcaca66372d584ff50175225798bccb701f7ef129d62c5989070e1ee3a0aa2d84e56d9524dcf011a2bb1a52 - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/typescript-estree@npm:6.21.0" - dependencies: - "@typescript-eslint/types": 6.21.0 - "@typescript-eslint/visitor-keys": 6.21.0 - debug: ^4.3.4 - globby: ^11.1.0 - is-glob: ^4.0.3 - minimatch: 9.0.3 - semver: ^7.5.4 - ts-api-utils: ^1.0.1 - peerDependenciesMeta: - typescript: - optional: true - checksum: dec02dc107c4a541e14fb0c96148f3764b92117c3b635db3a577b5a56fc48df7a556fa853fb82b07c0663b4bf2c484c9f245c28ba3e17e5cb0918ea4cab2ea21 - languageName: node - linkType: hard - -"@typescript-eslint/utils@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/utils@npm:5.62.0" - dependencies: - "@eslint-community/eslint-utils": ^4.2.0 - "@types/json-schema": ^7.0.9 - "@types/semver": ^7.3.12 - "@typescript-eslint/scope-manager": 5.62.0 - "@typescript-eslint/types": 5.62.0 - "@typescript-eslint/typescript-estree": 5.62.0 - eslint-scope: ^5.1.1 - semver: ^7.3.7 - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: ee9398c8c5db6d1da09463ca7bf36ed134361e20131ea354b2da16a5fdb6df9ba70c62a388d19f6eebb421af1786dbbd79ba95ddd6ab287324fc171c3e28d931 - languageName: node - linkType: hard - -"@typescript-eslint/utils@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/utils@npm:6.21.0" - dependencies: - "@eslint-community/eslint-utils": ^4.4.0 - "@types/json-schema": ^7.0.12 - "@types/semver": ^7.5.0 - "@typescript-eslint/scope-manager": 6.21.0 - "@typescript-eslint/types": 6.21.0 - "@typescript-eslint/typescript-estree": 6.21.0 - semver: ^7.5.4 - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - checksum: b129b3a4aebec8468259f4589985cb59ea808afbfdb9c54f02fad11e17d185e2bf72bb332f7c36ec3c09b31f18fc41368678b076323e6e019d06f74ee93f7bf2 - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/visitor-keys@npm:5.62.0" - dependencies: - "@typescript-eslint/types": 5.62.0 - eslint-visitor-keys: ^3.3.0 - checksum: 976b05d103fe8335bef5c93ad3f76d781e3ce50329c0243ee0f00c0fcfb186c81df50e64bfdd34970148113f8ade90887f53e3c4938183afba830b4ba8e30a35 - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/visitor-keys@npm:6.21.0" - dependencies: - "@typescript-eslint/types": 6.21.0 - eslint-visitor-keys: ^3.4.1 - checksum: 67c7e6003d5af042d8703d11538fca9d76899f0119130b373402819ae43f0bc90d18656aa7add25a24427ccf1a0efd0804157ba83b0d4e145f06107d7d1b7433 - languageName: node - linkType: hard - -"@ungap/structured-clone@npm:^1.2.0": - version: 1.2.0 - resolution: "@ungap/structured-clone@npm:1.2.0" - checksum: 4f656b7b4672f2ce6e272f2427d8b0824ed11546a601d8d5412b9d7704e83db38a8d9f402ecdf2b9063fc164af842ad0ec4a55819f621ed7e7ea4d1efcc74524 - languageName: node - linkType: hard - -"@yarnpkg/lockfile@npm:^1.1.0": - version: 1.1.0 - resolution: "@yarnpkg/lockfile@npm:1.1.0" - checksum: 05b881b4866a3546861fee756e6d3812776ea47fa6eb7098f983d6d0eefa02e12b66c3fff931574120f196286a7ad4879ce02743c8bb2be36c6a576c7852083a - languageName: node - linkType: hard - -"JSONStream@npm:^1.3.5": - version: 1.3.5 - resolution: "JSONStream@npm:1.3.5" - dependencies: - jsonparse: ^1.2.0 - through: ">=2.2.7 <3" - bin: - JSONStream: ./bin.js - checksum: 2605fa124260c61bad38bb65eba30d2f72216a78e94d0ab19b11b4e0327d572b8d530c0c9cc3b0764f727ad26d39e00bf7ebad57781ca6368394d73169c59e46 - languageName: node - linkType: hard - -"abbrev@npm:1": - version: 1.1.1 - resolution: "abbrev@npm:1.1.1" - checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 - languageName: node - linkType: hard - -"abbrev@npm:1.0.x": - version: 1.0.9 - resolution: "abbrev@npm:1.0.9" - checksum: 46460c897b4ce62cd9b1bd4a853cc46e771a1f1d929f5443f3945a976f8be5388891bf9e5f8a9862baa29587349e16c48596b6a621404d46d3b184fe9bd9fb26 - languageName: node - linkType: hard - -"abbrev@npm:^2.0.0": - version: 2.0.0 - resolution: "abbrev@npm:2.0.0" - checksum: 0e994ad2aa6575f94670d8a2149afe94465de9cedaaaac364e7fb43a40c3691c980ff74899f682f4ca58fa96b4cbd7421a015d3a6defe43a442117d7821a2f36 - languageName: node - linkType: hard - -"abitype@npm:1.0.5": - version: 1.0.5 - resolution: "abitype@npm:1.0.5" - peerDependencies: - typescript: ">=5.0.4" - zod: ^3 >=3.22.0 - peerDependenciesMeta: - typescript: - optional: true - zod: - optional: true - checksum: 4a4865926e5e8e33e4fab0081a106ce4f627db30b4052fbc449e4707aea6d34d805d46c8d6d0a72234bdd9a2b4900993591515fc299bc57d393181c70dc0c19e - languageName: node - linkType: hard - -"abstract-level@npm:^1.0.0, abstract-level@npm:^1.0.2, abstract-level@npm:^1.0.3, abstract-level@npm:^1.0.4": - version: 1.0.4 - resolution: "abstract-level@npm:1.0.4" - dependencies: - buffer: ^6.0.3 - catering: ^2.1.0 - is-buffer: ^2.0.5 - level-supports: ^4.0.0 - level-transcoder: ^1.0.1 - module-error: ^1.0.1 - queue-microtask: ^1.2.3 - checksum: 5b70d08926f5234c3c23ffca848542af4def780dc96d6ca35a81659af80e6439c46f5106bd14a5ea37465173d7dcc8294317048b0194fdf6480103edc4aa9e63 - languageName: node - linkType: hard - -"acorn-jsx@npm:^5.3.2": - version: 5.3.2 - resolution: "acorn-jsx@npm:5.3.2" - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: c3d3b2a89c9a056b205b69530a37b972b404ee46ec8e5b341666f9513d3163e2a4f214a71f4dfc7370f5a9c07472d2fd1c11c91c3f03d093e37637d95da98950 - languageName: node - linkType: hard - -"acorn-walk@npm:^8.1.1": - version: 8.3.4 - resolution: "acorn-walk@npm:8.3.4" - dependencies: - acorn: ^8.11.0 - checksum: 4ff03f42323e7cf90f1683e08606b0f460e1e6ac263d2730e3df91c7665b6f64e696db6ea27ee4bed18c2599569be61f28a8399fa170c611161a348c402ca19c - languageName: node - linkType: hard - -"acorn@npm:^8.11.0, acorn@npm:^8.4.1, acorn@npm:^8.9.0": - version: 8.12.1 - resolution: "acorn@npm:8.12.1" - bin: - acorn: bin/acorn - checksum: 677880034aee5bdf7434cc2d25b641d7bedb0b5ef47868a78dadabedccf58e1c5457526d9d8249cd253f2df087e081c3fe7d903b448d8e19e5131a3065b83c07 - languageName: node - linkType: hard - -"adm-zip@npm:^0.4.16": - version: 0.4.16 - resolution: "adm-zip@npm:0.4.16" - checksum: 5ea46664d8b3b073fffeb7f934705fea288708745e708cffc1dd732ce3d2672cecd476b243f9d051892fd12952db2b6bd061975e1ff40057246f6d0cb6534a50 - languageName: node - linkType: hard - -"aes-js@npm:3.0.0": - version: 3.0.0 - resolution: "aes-js@npm:3.0.0" - checksum: 251e26d533cd1a915b44896b17d5ed68c24a02484cfdd2e74ec700a309267db96651ea4eb657bf20aac32a3baa61f6e34edf8e2fec2de440a655da9942d334b8 - languageName: node - linkType: hard - -"aes-js@npm:4.0.0-beta.5": - version: 4.0.0-beta.5 - resolution: "aes-js@npm:4.0.0-beta.5" - checksum: cc2ea969d77df939c32057f7e361b6530aa6cb93cb10617a17a45cd164e6d761002f031ff6330af3e67e58b1f0a3a8fd0b63a720afd591a653b02f649470e15b - languageName: node - linkType: hard - -"agent-base@npm:6": - version: 6.0.2 - resolution: "agent-base@npm:6.0.2" - dependencies: - debug: 4 - checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d - languageName: node - linkType: hard - -"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": - version: 7.1.1 - resolution: "agent-base@npm:7.1.1" - dependencies: - debug: ^4.3.4 - checksum: 51c158769c5c051482f9ca2e6e1ec085ac72b5a418a9b31b4e82fe6c0a6699adb94c1c42d246699a587b3335215037091c79e0de512c516f73b6ea844202f037 - languageName: node - linkType: hard - -"agentkeepalive@npm:^4.5.0": - version: 4.5.0 - resolution: "agentkeepalive@npm:4.5.0" - dependencies: - humanize-ms: ^1.2.1 - checksum: 13278cd5b125e51eddd5079f04d6fe0914ac1b8b91c1f3db2c1822f99ac1a7457869068997784342fe455d59daaff22e14fb7b8c3da4e741896e7e31faf92481 - languageName: node - linkType: hard - -"aggregate-error@npm:^3.0.0": - version: 3.1.0 - resolution: "aggregate-error@npm:3.1.0" - dependencies: - clean-stack: ^2.0.0 - indent-string: ^4.0.0 - checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 - languageName: node - linkType: hard - -"ajv@npm:^6.12.4, ajv@npm:^6.12.6": - version: 6.12.6 - resolution: "ajv@npm:6.12.6" - 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 - checksum: 874972efe5c4202ab0a68379481fbd3d1b5d0a7bd6d3cc21d40d3536ebff3352a2a1fabb632d4fd2cc7fe4cbdcd5ed6782084c9bbf7f32a1536d18f9da5007d4 - languageName: node - linkType: hard - -"ajv@npm:^8.0.1, ajv@npm:^8.11.0": - version: 8.17.1 - resolution: "ajv@npm:8.17.1" - dependencies: - fast-deep-equal: ^3.1.3 - fast-uri: ^3.0.1 - json-schema-traverse: ^1.0.0 - require-from-string: ^2.0.2 - checksum: 1797bf242cfffbaf3b870d13565bd1716b73f214bb7ada9a497063aada210200da36e3ed40237285f3255acc4feeae91b1fb183625331bad27da95973f7253d9 - languageName: node - linkType: hard - -"amdefine@npm:>=0.0.4": - version: 1.0.1 - resolution: "amdefine@npm:1.0.1" - checksum: 9d4e15b94641643a9385b2841b4cb2bcf4e8e2f741ea4bd475c93ad7bab261ad4ed827a32e9c549b38b98759c4526c173ae4e6dde8caeb75ee5cebedc9863762 - languageName: node - linkType: hard - -"ansi-colors@npm:^4.1.1, ansi-colors@npm:^4.1.3": - version: 4.1.3 - resolution: "ansi-colors@npm:4.1.3" - checksum: a9c2ec842038a1fabc7db9ece7d3177e2fe1c5dc6f0c51ecfbf5f39911427b89c00b5dc6b8bd95f82a26e9b16aaae2e83d45f060e98070ce4d1333038edceb0e - languageName: node - linkType: hard - -"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.0": - version: 4.3.2 - resolution: "ansi-escapes@npm:4.3.2" - dependencies: - type-fest: ^0.21.3 - checksum: 93111c42189c0a6bed9cdb4d7f2829548e943827ee8479c74d6e0b22ee127b2a21d3f8b5ca57723b8ef78ce011fbfc2784350eb2bde3ccfccf2f575fa8489815 - languageName: node - linkType: hard - -"ansi-escapes@npm:^5.0.0": - version: 5.0.0 - resolution: "ansi-escapes@npm:5.0.0" - dependencies: - type-fest: ^1.0.2 - checksum: d4b5eb8207df38367945f5dd2ef41e08c28edc192dc766ef18af6b53736682f49d8bfcfa4e4d6ecbc2e2f97c258fda084fb29a9e43b69170b71090f771afccac - languageName: node - linkType: hard - -"ansi-regex@npm:^3.0.0": - version: 3.0.1 - resolution: "ansi-regex@npm:3.0.1" - checksum: 09daf180c5f59af9850c7ac1bd7fda85ba596cc8cbeb210826e90755f06c818af86d9fa1e6e8322fab2c3b9e9b03f56c537b42241139f824dd75066a1e7257cc - languageName: node - linkType: hard - -"ansi-regex@npm:^5.0.1": - version: 5.0.1 - resolution: "ansi-regex@npm:5.0.1" - checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b - languageName: node - linkType: hard - -"ansi-regex@npm:^6.0.1": - version: 6.1.0 - resolution: "ansi-regex@npm:6.1.0" - checksum: 495834a53b0856c02acd40446f7130cb0f8284f4a39afdab20d5dc42b2e198b1196119fe887beed8f9055c4ff2055e3b2f6d4641d0be018cdfb64fedf6fc1aac - languageName: node - linkType: hard - -"ansi-styles@npm:^3.2.1": - version: 3.2.1 - resolution: "ansi-styles@npm:3.2.1" - dependencies: - color-convert: ^1.9.0 - checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 - languageName: node - linkType: hard - -"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": - version: 4.3.0 - resolution: "ansi-styles@npm:4.3.0" - dependencies: - color-convert: ^2.0.1 - checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 - languageName: node - linkType: hard - -"ansi-styles@npm:^6.0.0, ansi-styles@npm:^6.1.0": - version: 6.2.1 - resolution: "ansi-styles@npm:6.2.1" - checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 - languageName: node - linkType: hard - -"antlr4@npm:^4.11.0": - version: 4.13.2 - resolution: "antlr4@npm:4.13.2" - checksum: 3e42659f9b84af84c21f194e625d220bd958278a5481800bb4f5929149c603fad4d492f8b6d04f7c2ab87dd3df88e63ba097fbe7bfa92a060942da713d783e0a - languageName: node - linkType: hard - -"antlr4ts@npm:^0.5.0-alpha.4": - version: 0.5.0-alpha.4 - resolution: "antlr4ts@npm:0.5.0-alpha.4" - checksum: 37948499d59477f5b5a8ea71dfb8b5330e71d5a7cee60f57351dd744219b8619fa6aac1a5b6ec1a9991846e8ddc9ca47680eb166c59b44333369b3115e7aa358 - languageName: node - linkType: hard - -"anymatch@npm:~3.1.2": - version: 3.1.3 - resolution: "anymatch@npm:3.1.3" - dependencies: - normalize-path: ^3.0.0 - picomatch: ^2.0.4 - checksum: 3e044fd6d1d26545f235a9fe4d7a534e2029d8e59fa7fd9f2a6eb21230f6b5380ea1eaf55136e60cbf8e613544b3b766e7a6fa2102e2a3a117505466e3025dc2 - languageName: node - linkType: hard - -"arg@npm:^4.1.0": - version: 4.1.3 - resolution: "arg@npm:4.1.3" - checksum: 544af8dd3f60546d3e4aff084d451b96961d2267d668670199692f8d054f0415d86fc5497d0e641e91546f0aa920e7c29e5250e99fc89f5552a34b5d93b77f43 - languageName: node - linkType: hard - -"argparse@npm:^1.0.7": - version: 1.0.10 - resolution: "argparse@npm:1.0.10" - dependencies: - sprintf-js: ~1.0.2 - checksum: 7ca6e45583a28de7258e39e13d81e925cfa25d7d4aacbf806a382d3c02fcb13403a07fb8aeef949f10a7cfe4a62da0e2e807b348a5980554cc28ee573ef95945 - languageName: node - linkType: hard - -"argparse@npm:^2.0.1": - version: 2.0.1 - resolution: "argparse@npm:2.0.1" - checksum: 83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced - languageName: node - linkType: hard - -"array-back@npm:^3.0.1, array-back@npm:^3.1.0": - version: 3.1.0 - resolution: "array-back@npm:3.1.0" - checksum: 7205004fcd0f9edd926db921af901b083094608d5b265738d0290092f9822f73accb468e677db74c7c94ef432d39e5ed75a7b1786701e182efb25bbba9734209 - languageName: node - linkType: hard - -"array-back@npm:^4.0.1, array-back@npm:^4.0.2": - version: 4.0.2 - resolution: "array-back@npm:4.0.2" - checksum: f30603270771eeb54e5aad5f54604c62b3577a18b6db212a7272b2b6c32049121b49431f656654790ed1469411e45f387e7627c0de8fd0515995cc40df9b9294 - languageName: node - linkType: hard - -"array-ify@npm:^1.0.0": - version: 1.0.0 - resolution: "array-ify@npm:1.0.0" - checksum: c0502015b319c93dd4484f18036bcc4b654eb76a4aa1f04afbcef11ac918859bb1f5d71ba1f0f1141770db9eef1a4f40f1761753650873068010bbf7bcdae4a4 - languageName: node - linkType: hard - -"array-union@npm:^2.1.0": - version: 2.1.0 - resolution: "array-union@npm:2.1.0" - checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d - languageName: node - linkType: hard - -"array-uniq@npm:1.0.3": - version: 1.0.3 - resolution: "array-uniq@npm:1.0.3" - checksum: 1625f06b093d8bf279b81adfec6e72951c0857d65b5e3f65f053fffe9f9dd61c2fc52cff57e38a4700817e7e3f01a4faa433d505ea9e33cdae4514c334e0bf9e - languageName: node - linkType: hard - -"arrify@npm:^1.0.1": - version: 1.0.1 - resolution: "arrify@npm:1.0.1" - checksum: 745075dd4a4624ff0225c331dacb99be501a515d39bcb7c84d24660314a6ec28e68131b137e6f7e16318170842ce97538cd298fc4cd6b2cc798e0b957f2747e7 - languageName: node - linkType: hard - -"asap@npm:~2.0.6": - version: 2.0.6 - resolution: "asap@npm:2.0.6" - checksum: b296c92c4b969e973260e47523207cd5769abd27c245a68c26dc7a0fe8053c55bb04360237cb51cab1df52be939da77150ace99ad331fb7fb13b3423ed73ff3d - languageName: node - linkType: hard - -"assertion-error@npm:^1.1.0": - version: 1.1.0 - resolution: "assertion-error@npm:1.1.0" - checksum: fd9429d3a3d4fd61782eb3962ae76b6d08aa7383123fca0596020013b3ebd6647891a85b05ce821c47d1471ed1271f00b0545cf6a4326cf2fc91efcc3b0fbecf - languageName: node - linkType: hard - -"ast-parents@npm:^0.0.1": - version: 0.0.1 - resolution: "ast-parents@npm:0.0.1" - checksum: 51360afb9f7b939eb0330fdd0d5d855d0242f273f63478d30d9053069120492173719fb3c03ba372bccf1a7c1a9041c3c6bf2ab700de8c0f8c14792b045c3b23 - languageName: node - linkType: hard - -"astral-regex@npm:^2.0.0": - version: 2.0.0 - resolution: "astral-regex@npm:2.0.0" - checksum: 876231688c66400473ba505731df37ea436e574dd524520294cc3bbc54ea40334865e01fa0d074d74d036ee874ee7e62f486ea38bc421ee8e6a871c06f011766 - languageName: node - linkType: hard - -"async@npm:1.x": - version: 1.5.2 - resolution: "async@npm:1.5.2" - checksum: fe5d6214d8f15bd51eee5ae8ec5079b228b86d2d595f47b16369dec2e11b3ff75a567bb5f70d12d79006665fbbb7ee0a7ec0e388524eefd454ecbe651c124ebd - languageName: node - linkType: hard - -"async@npm:^3.2.3": - version: 3.2.6 - resolution: "async@npm:3.2.6" - checksum: ee6eb8cd8a0ab1b58bd2a3ed6c415e93e773573a91d31df9d5ef559baafa9dab37d3b096fa7993e84585cac3697b2af6ddb9086f45d3ac8cae821bb2aab65682 - languageName: node - linkType: hard - -"asynckit@npm:^0.4.0": - version: 0.4.0 - resolution: "asynckit@npm:0.4.0" - checksum: 7b78c451df768adba04e2d02e63e2d0bf3b07adcd6e42b4cf665cb7ce899bedd344c69a1dcbce355b5f972d597b25aaa1c1742b52cffd9caccb22f348114f6be - languageName: node - linkType: hard - -"at-least-node@npm:^1.0.0": - version: 1.0.0 - resolution: "at-least-node@npm:1.0.0" - checksum: 463e2f8e43384f1afb54bc68485c436d7622acec08b6fad269b421cb1d29cebb5af751426793d0961ed243146fe4dc983402f6d5a51b720b277818dbf6f2e49e - languageName: node - linkType: hard - -"axios@npm:^0.21.1": - version: 0.21.4 - resolution: "axios@npm:0.21.4" - dependencies: - follow-redirects: ^1.14.0 - checksum: 44245f24ac971e7458f3120c92f9d66d1fc695e8b97019139de5b0cc65d9b8104647db01e5f46917728edfc0cfd88eb30fc4c55e6053eef4ace76768ce95ff3c - languageName: node - linkType: hard - -"axios@npm:^1.5.1": - version: 1.7.7 - resolution: "axios@npm:1.7.7" - dependencies: - follow-redirects: ^1.15.6 - form-data: ^4.0.0 - proxy-from-env: ^1.1.0 - checksum: 882d4fe0ec694a07c7f5c1f68205eb6dc5a62aecdb632cc7a4a3d0985188ce3030e0b277e1a8260ac3f194d314ae342117660a151fabffdc5081ca0b5a8b47fe - languageName: node - linkType: hard - -"balanced-match@npm:^1.0.0": - version: 1.0.2 - resolution: "balanced-match@npm:1.0.2" - checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 - languageName: node - linkType: hard - -"base-x@npm:^3.0.2": - version: 3.0.10 - resolution: "base-x@npm:3.0.10" - dependencies: - safe-buffer: ^5.0.1 - checksum: 52307739559e81d9980889de2359cb4f816cc0eb9a463028fa3ab239ab913d9044a1b47b4520f98e68453df32a457b8ba58b8d0ee7e757fc3fb971f3fa7a1482 - languageName: node - linkType: hard - -"base64-js@npm:^1.3.0, base64-js@npm:^1.3.1": - version: 1.5.1 - resolution: "base64-js@npm:1.5.1" - checksum: 669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005 - languageName: node - linkType: hard - -"bech32@npm:1.1.4, bech32@npm:^1.1.4": - version: 1.1.4 - resolution: "bech32@npm:1.1.4" - checksum: 0e98db619191548390d6f09ff68b0253ba7ae6a55db93dfdbb070ba234c1fd3308c0606fbcc95fad50437227b10011e2698b89f0181f6e7f845c499bd14d0f4b - languageName: node - linkType: hard - -"bigint-buffer@npm:^1.1.5": - version: 1.1.5 - resolution: "bigint-buffer@npm:1.1.5" - dependencies: - bindings: ^1.3.0 - node-gyp: latest - checksum: d010c9f57758bcdaccb435d88b483ffcc95fe8bbc6e7fb3a44fb5221f29c894ffaf4a3c5a4a530e0e7d6608203c2cde9b79ee4f2386cd6d4462d1070bc8c9f4e - languageName: node - linkType: hard - -"bigint-crypto-utils@npm:^3.0.23": - version: 3.3.0 - resolution: "bigint-crypto-utils@npm:3.3.0" - checksum: 9598ce57b23f776c8936d44114c9f051e62b5fa654915b664784cbcbacc5aa0485f4479571c51ff58008abb1210c0d6a234853742f07cf84bda890f2a1e01000 - languageName: node - linkType: hard - -"bignumber.js@npm:^9.1.1": - version: 9.1.2 - resolution: "bignumber.js@npm:9.1.2" - checksum: 582c03af77ec9cb0ebd682a373ee6c66475db94a4325f92299621d544aa4bd45cb45fd60001610e94aef8ae98a0905fa538241d9638d4422d57abbeeac6fadaf - languageName: node - linkType: hard - -"binary-extensions@npm:^2.0.0": - version: 2.3.0 - resolution: "binary-extensions@npm:2.3.0" - checksum: bcad01494e8a9283abf18c1b967af65ee79b0c6a9e6fcfafebfe91dbe6e0fc7272bafb73389e198b310516ae04f7ad17d79aacf6cb4c0d5d5202a7e2e52c7d98 - languageName: node - linkType: hard - -"bindings@npm:^1.3.0": - version: 1.5.0 - resolution: "bindings@npm:1.5.0" - dependencies: - file-uri-to-path: 1.0.0 - checksum: 65b6b48095717c2e6105a021a7da4ea435aa8d3d3cd085cb9e85bcb6e5773cf318c4745c3f7c504412855940b585bdf9b918236612a1c7a7942491de176f1ae7 - languageName: node - linkType: hard - -"bl@npm:^4.1.0": - version: 4.1.0 - resolution: "bl@npm:4.1.0" - dependencies: - buffer: ^5.5.0 - inherits: ^2.0.4 - readable-stream: ^3.4.0 - checksum: 9e8521fa7e83aa9427c6f8ccdcba6e8167ef30cc9a22df26effcc5ab682ef91d2cbc23a239f945d099289e4bbcfae7a192e9c28c84c6202e710a0dfec3722662 - languageName: node - linkType: hard - -"blakejs@npm:^1.1.0": - version: 1.2.1 - resolution: "blakejs@npm:1.2.1" - checksum: d699ba116cfa21d0b01d12014a03e484dd76d483133e6dc9eb415aa70a119f08beb3bcefb8c71840106a00b542cba77383f8be60cd1f0d4589cb8afb922eefbe - languageName: node - linkType: hard - -"bn.js@npm:4.11.6": - version: 4.11.6 - resolution: "bn.js@npm:4.11.6" - checksum: db23047bf06fdf9cf74401c8e76bca9f55313c81df382247d2c753868b368562e69171716b81b7038ada8860af18346fd4bcd1cf9d4963f923fe8e54e61cb58a - languageName: node - linkType: hard - -"bn.js@npm:^4.11.0, bn.js@npm:^4.11.8, bn.js@npm:^4.11.9": - version: 4.12.0 - resolution: "bn.js@npm:4.12.0" - checksum: 39afb4f15f4ea537b55eaf1446c896af28ac948fdcf47171961475724d1bb65118cca49fa6e3d67706e4790955ec0e74de584e45c8f1ef89f46c812bee5b5a12 - languageName: node - linkType: hard - -"bn.js@npm:^5.1.2, bn.js@npm:^5.2.0, bn.js@npm:^5.2.1": - version: 5.2.1 - resolution: "bn.js@npm:5.2.1" - checksum: 3dd8c8d38055fedfa95c1d5fc3c99f8dd547b36287b37768db0abab3c239711f88ff58d18d155dd8ad902b0b0cee973747b7ae20ea12a09473272b0201c9edd3 - languageName: node - linkType: hard - -"borsh@npm:^0.7.0": - version: 0.7.0 - resolution: "borsh@npm:0.7.0" - dependencies: - bn.js: ^5.2.0 - bs58: ^4.0.0 - text-encoding-utf-8: ^1.0.2 - checksum: e98bfb5f7cfb820819c2870b884dac58dd4b4ce6a86c286c8fbf5c9ca582e73a8c6094df67e81a28c418ff07a309c6b118b2e27fdfea83fd92b8100c741da0b5 - languageName: node - linkType: hard - -"brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" - dependencies: - balanced-match: ^1.0.0 - concat-map: 0.0.1 - checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 - languageName: node - linkType: hard - -"brace-expansion@npm:^2.0.1": - version: 2.0.1 - resolution: "brace-expansion@npm:2.0.1" - dependencies: - balanced-match: ^1.0.0 - checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 - languageName: node - linkType: hard - -"braces@npm:^3.0.2, braces@npm:^3.0.3, braces@npm:~3.0.2": - version: 3.0.3 - resolution: "braces@npm:3.0.3" - dependencies: - fill-range: ^7.1.1 - checksum: b95aa0b3bd909f6cd1720ffcf031aeaf46154dd88b4da01f9a1d3f7ea866a79eba76a6d01cbc3c422b2ee5cdc39a4f02491058d5df0d7bf6e6a162a832df1f69 - languageName: node - linkType: hard - -"brorand@npm:^1.1.0": - version: 1.1.0 - resolution: "brorand@npm:1.1.0" - checksum: 8a05c9f3c4b46572dec6ef71012b1946db6cae8c7bb60ccd4b7dd5a84655db49fe043ecc6272e7ef1f69dc53d6730b9e2a3a03a8310509a3d797a618cbee52be - languageName: node - linkType: hard - -"browser-level@npm:^1.0.1": - version: 1.0.1 - resolution: "browser-level@npm:1.0.1" - dependencies: - abstract-level: ^1.0.2 - catering: ^2.1.1 - module-error: ^1.0.2 - run-parallel-limit: ^1.1.0 - checksum: 67fbc77ce832940bfa25073eccff279f512ad56f545deb996a5b23b02316f5e76f4a79d381acc27eda983f5c9a2566aaf9c97e4fdd0748288c4407307537a29b - languageName: node - linkType: hard - -"browser-stdout@npm:^1.3.1": - version: 1.3.1 - resolution: "browser-stdout@npm:1.3.1" - checksum: b717b19b25952dd6af483e368f9bcd6b14b87740c3d226c2977a65e84666ffd67000bddea7d911f111a9b6ddc822b234de42d52ab6507bce4119a4cc003ef7b3 - languageName: node - linkType: hard - -"browserify-aes@npm:^1.2.0": - version: 1.2.0 - resolution: "browserify-aes@npm:1.2.0" - 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 - checksum: 4a17c3eb55a2aa61c934c286f34921933086bf6d67f02d4adb09fcc6f2fc93977b47d9d884c25619144fccd47b3b3a399e1ad8b3ff5a346be47270114bcf7104 - languageName: node - linkType: hard - -"bs58@npm:^4.0.0, bs58@npm:^4.0.1": - version: 4.0.1 - resolution: "bs58@npm:4.0.1" - dependencies: - base-x: ^3.0.2 - checksum: b3c5365bb9e0c561e1a82f1a2d809a1a692059fae016be233a6127ad2f50a6b986467c3a50669ce4c18929dcccb297c5909314dd347a25a68c21b68eb3e95ac2 - languageName: node - linkType: hard - -"bs58check@npm:^2.1.2": - version: 2.1.2 - resolution: "bs58check@npm:2.1.2" - dependencies: - bs58: ^4.0.0 - create-hash: ^1.1.0 - safe-buffer: ^5.1.2 - checksum: 43bdf08a5dd04581b78f040bc4169480e17008da482ffe2a6507327bbc4fc5c28de0501f7faf22901cfe57fbca79cbb202ca529003fedb4cb8dccd265b38e54d - languageName: node - linkType: hard - -"bson@npm:^6.4.0": - version: 6.8.0 - resolution: "bson@npm:6.8.0" - checksum: 66076b04d7d54e7773d601a19b7c224bc5cff6b008efe102463fbc058879f2c84c0ed793b5b6ed12cc7616bbbe5e670db81cf7352e0ea947918119f8af704ba5 - languageName: node - linkType: hard - -"buffer-from@npm:^1.0.0": - version: 1.1.2 - resolution: "buffer-from@npm:1.1.2" - checksum: 0448524a562b37d4d7ed9efd91685a5b77a50672c556ea254ac9a6d30e3403a517d8981f10e565db24e8339413b43c97ca2951f10e399c6125a0d8911f5679bb - languageName: node - linkType: hard - -"buffer-xor@npm:^1.0.3": - version: 1.0.3 - resolution: "buffer-xor@npm:1.0.3" - checksum: 10c520df29d62fa6e785e2800e586a20fc4f6dfad84bcdbd12e1e8a83856de1cb75c7ebd7abe6d036bbfab738a6cf18a3ae9c8e5a2e2eb3167ca7399ce65373a - languageName: node - linkType: hard - -"buffer@npm:6.0.3, buffer@npm:^6.0.3, buffer@npm:~6.0.3": - version: 6.0.3 - resolution: "buffer@npm:6.0.3" - dependencies: - base64-js: ^1.3.1 - ieee754: ^1.2.1 - checksum: 5ad23293d9a731e4318e420025800b42bf0d264004c0286c8cc010af7a270c7a0f6522e84f54b9ad65cbd6db20b8badbfd8d2ebf4f80fa03dab093b89e68c3f9 - languageName: node - linkType: hard - -"buffer@npm:^5.5.0": - version: 5.7.1 - resolution: "buffer@npm:5.7.1" - dependencies: - base64-js: ^1.3.1 - ieee754: ^1.1.13 - checksum: e2cf8429e1c4c7b8cbd30834ac09bd61da46ce35f5c22a78e6c2f04497d6d25541b16881e30a019c6fd3154150650ccee27a308eff3e26229d788bbdeb08ab84 - languageName: node - linkType: hard - -"bufferutil@npm:^4.0.1": - version: 4.0.8 - resolution: "bufferutil@npm:4.0.8" - dependencies: - node-gyp: latest - node-gyp-build: ^4.3.0 - checksum: 7e9a46f1867dca72fda350966eb468eca77f4d623407b0650913fadf73d5750d883147d6e5e21c56f9d3b0bdc35d5474e80a600b9f31ec781315b4d2469ef087 - languageName: node - linkType: hard - -"bufio@npm:^1.0.7": - version: 1.2.1 - resolution: "bufio@npm:1.2.1" - checksum: b6e1216f4a5877617a3580b83807d8b96c794c015bc2d5eb9e70e152dc79fe923517472bd96df3d5b8feb59a0e25e2aa3cd8a70b8f90905b92d86f2e5719ed68 - languageName: node - linkType: hard - -"bytes@npm:3.1.2": - version: 3.1.2 - resolution: "bytes@npm:3.1.2" - checksum: e4bcd3948d289c5127591fbedf10c0b639ccbf00243504e4e127374a15c3bc8eed0d28d4aaab08ff6f1cf2abc0cce6ba3085ed32f4f90e82a5683ce0014e1b6e - languageName: node - linkType: hard - -"cacache@npm:^18.0.0": - version: 18.0.4 - resolution: "cacache@npm:18.0.4" - dependencies: - "@npmcli/fs": ^3.1.0 - fs-minipass: ^3.0.0 - glob: ^10.2.2 - lru-cache: ^10.0.1 - minipass: ^7.0.3 - minipass-collect: ^2.0.1 - minipass-flush: ^1.0.5 - minipass-pipeline: ^1.2.4 - p-map: ^4.0.0 - ssri: ^10.0.0 - tar: ^6.1.11 - unique-filename: ^3.0.0 - checksum: b7422c113b4ec750f33beeca0f426a0024c28e3172f332218f48f963e5b970647fa1ac05679fe5bb448832c51efea9fda4456b9a95c3a1af1105fe6c1833cde2 - languageName: node - linkType: hard - -"cachedir@npm:2.3.0": - version: 2.3.0 - resolution: "cachedir@npm:2.3.0" - checksum: ec90cb0f2e6336e266aa748dbadf3da9e0b20e843e43f1591acab7a3f1451337dc2f26cb9dd833ae8cfefeffeeb43ef5b5ff62782a685f4e3c2305dd98482fcb - languageName: node - linkType: hard - -"call-bind@npm:^1.0.5, call-bind@npm:^1.0.7": - version: 1.0.7 - resolution: "call-bind@npm:1.0.7" - 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 - checksum: 295c0c62b90dd6522e6db3b0ab1ce26bdf9e7404215bda13cfee25b626b5ff1a7761324d58d38b1ef1607fc65aca2d06e44d2e18d0dfc6c14b465b00d8660029 - languageName: node - linkType: hard - -"callsites@npm:^3.0.0": - version: 3.1.0 - resolution: "callsites@npm:3.1.0" - checksum: 072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 - languageName: node - linkType: hard - -"camelcase-keys@npm:^6.2.2": - version: 6.2.2 - resolution: "camelcase-keys@npm:6.2.2" - dependencies: - camelcase: ^5.3.1 - map-obj: ^4.0.0 - quick-lru: ^4.0.1 - checksum: 43c9af1adf840471e54c68ab3e5fe8a62719a6b7dbf4e2e86886b7b0ff96112c945736342b837bd2529ec9d1c7d1934e5653318478d98e0cf22c475c04658e2a - languageName: node - linkType: hard - -"camelcase@npm:^5.3.1": - version: 5.3.1 - resolution: "camelcase@npm:5.3.1" - checksum: e6effce26b9404e3c0f301498184f243811c30dfe6d0b9051863bd8e4034d09c8c2923794f280d6827e5aa055f6c434115ff97864a16a963366fb35fd673024b - languageName: node - linkType: hard - -"camelcase@npm:^6.0.0": - version: 6.3.0 - resolution: "camelcase@npm:6.3.0" - checksum: 8c96818a9076434998511251dcb2761a94817ea17dbdc37f47ac080bd088fc62c7369429a19e2178b993497132c8cbcf5cc1f44ba963e76782ba469c0474938d - languageName: node - linkType: hard - -"case@npm:^1.6.3": - version: 1.6.3 - resolution: "case@npm:1.6.3" - checksum: febe73278f910b0d28aab7efd6f51c235f9aa9e296148edb56dfb83fd58faa88308c30ce9a0122b6e53e0362c44f4407105bd5ef89c46860fc2b184e540fd68d - languageName: node - linkType: hard - -"caseless@npm:^0.12.0, caseless@npm:~0.12.0": - version: 0.12.0 - resolution: "caseless@npm:0.12.0" - checksum: b43bd4c440aa1e8ee6baefee8063b4850fd0d7b378f6aabc796c9ec8cb26d27fb30b46885350777d9bd079c5256c0e1329ad0dc7c2817e0bb466810ebb353751 - languageName: node - linkType: hard - -"catering@npm:^2.1.0, catering@npm:^2.1.1": - version: 2.1.1 - resolution: "catering@npm:2.1.1" - checksum: 205daefa69c935b0c19f3d8f2e0a520dd69aebe9bda55902958003f7c9cff8f967dfb90071b421bd6eb618576f657a89d2bc0986872c9bc04bbd66655e9d4bd6 - languageName: node - linkType: hard - -"cbor@npm:^8.1.0": - version: 8.1.0 - resolution: "cbor@npm:8.1.0" - dependencies: - nofilter: ^3.1.0 - checksum: a90338435dc7b45cc01461af979e3bb6ddd4f2a08584c437586039cd5f2235014c06e49d664295debbfb3514d87b2f06728092ab6aa6175e2e85e9cd7dc0c1fd - languageName: node - linkType: hard - -"chai-as-promised@npm:^7.1.1": - version: 7.1.2 - resolution: "chai-as-promised@npm:7.1.2" - dependencies: - check-error: ^1.0.2 - peerDependencies: - chai: ">= 2.1.2 < 6" - checksum: 671ee980054eb23a523875c1d22929a2ac05d89b5428e1fd12800f54fc69baf41014667b87e2368e2355ee2a3140d3e3d7d5a1f8638b07cfefd7fe38a149e3f6 - languageName: node - linkType: hard - -"chai@npm:^4.3.4, chai@npm:^4.3.7": - version: 4.5.0 - resolution: "chai@npm:4.5.0" - 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.1.0 - checksum: 70e5a8418a39e577e66a441cc0ce4f71fd551a650a71de30dd4e3e31e75ed1f5aa7119cf4baf4a2cb5e85c0c6befdb4d8a05811fad8738c1a6f3aa6a23803821 - languageName: node - linkType: hard - -"chalk@npm:5.3.0, chalk@npm:^5.3.0": - version: 5.3.0 - resolution: "chalk@npm:5.3.0" - checksum: 623922e077b7d1e9dedaea6f8b9e9352921f8ae3afe739132e0e00c275971bdd331268183b2628cf4ab1727c45ea1f28d7e24ac23ce1db1eb653c414ca8a5a80 - languageName: node - linkType: hard - -"chalk@npm:^2.4.1, chalk@npm:^2.4.2": - version: 2.4.2 - resolution: "chalk@npm:2.4.2" - dependencies: - ansi-styles: ^3.2.1 - escape-string-regexp: ^1.0.5 - supports-color: ^5.3.0 - checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 - languageName: node - linkType: hard - -"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2": - version: 4.1.2 - resolution: "chalk@npm:4.1.2" - dependencies: - ansi-styles: ^4.1.0 - supports-color: ^7.1.0 - checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc - languageName: node - linkType: hard - -"chardet@npm:^0.7.0": - version: 0.7.0 - resolution: "chardet@npm:0.7.0" - checksum: 6fd5da1f5d18ff5712c1e0aed41da200d7c51c28f11b36ee3c7b483f3696dabc08927fc6b227735eb8f0e1215c9a8abd8154637f3eff8cada5959df7f58b024d - languageName: node - linkType: hard - -"charenc@npm:>= 0.0.1": - version: 0.0.2 - resolution: "charenc@npm:0.0.2" - checksum: 81dcadbe57e861d527faf6dd3855dc857395a1c4d6781f4847288ab23cffb7b3ee80d57c15bba7252ffe3e5e8019db767757ee7975663ad2ca0939bb8fcaf2e5 - languageName: node - linkType: hard - -"check-error@npm:^1.0.2, check-error@npm:^1.0.3": - version: 1.0.3 - resolution: "check-error@npm:1.0.3" - dependencies: - get-func-name: ^2.0.2 - checksum: e2131025cf059b21080f4813e55b3c480419256914601750b0fee3bd9b2b8315b531e551ef12560419b8b6d92a3636511322752b1ce905703239e7cc451b6399 - languageName: node - linkType: hard - -"chokidar@npm:^3.4.0, chokidar@npm:^3.5.2, chokidar@npm:^3.5.3": - version: 3.6.0 - resolution: "chokidar@npm:3.6.0" - dependencies: - anymatch: ~3.1.2 - braces: ~3.0.2 - fsevents: ~2.3.2 - glob-parent: ~5.1.2 - is-binary-path: ~2.1.0 - is-glob: ~4.0.1 - normalize-path: ~3.0.0 - readdirp: ~3.6.0 - dependenciesMeta: - fsevents: - optional: true - checksum: d2f29f499705dcd4f6f3bbed79a9ce2388cf530460122eed3b9c48efeab7a4e28739c6551fd15bec9245c6b9eeca7a32baa64694d64d9b6faeb74ddb8c4a413d - languageName: node - linkType: hard - -"chownr@npm:^2.0.0": - version: 2.0.0 - resolution: "chownr@npm:2.0.0" - checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f - languageName: node - linkType: hard - -"ci-info@npm:^2.0.0": - version: 2.0.0 - resolution: "ci-info@npm:2.0.0" - checksum: 3b374666a85ea3ca43fa49aa3a048d21c9b475c96eb13c133505d2324e7ae5efd6a454f41efe46a152269e9b6a00c9edbe63ec7fa1921957165aae16625acd67 - languageName: node - linkType: hard - -"ci-info@npm:^3.7.0": - version: 3.9.0 - resolution: "ci-info@npm:3.9.0" - checksum: 6b19dc9b2966d1f8c2041a838217299718f15d6c4b63ae36e4674edd2bee48f780e94761286a56aa59eb305a85fbea4ddffb7630ec063e7ec7e7e5ad42549a87 - languageName: node - linkType: hard - -"cipher-base@npm:^1.0.0, cipher-base@npm:^1.0.1, cipher-base@npm:^1.0.3": - version: 1.0.4 - resolution: "cipher-base@npm:1.0.4" - dependencies: - inherits: ^2.0.1 - safe-buffer: ^5.0.1 - checksum: 47d3568dbc17431a339bad1fe7dff83ac0891be8206911ace3d3b818fc695f376df809bea406e759cdea07fff4b454fa25f1013e648851bec790c1d75763032e - languageName: node - linkType: hard - -"classic-level@npm:^1.2.0": - version: 1.4.1 - resolution: "classic-level@npm:1.4.1" - dependencies: - abstract-level: ^1.0.2 - catering: ^2.1.0 - module-error: ^1.0.1 - napi-macros: ^2.2.2 - node-gyp: latest - node-gyp-build: ^4.3.0 - checksum: 62e7e07297fcd656941eb88f92b91df0046ebb2b34987e98ec870cb736f096e212ef109a25541deba2f30866b9d5df550594ed04948614815dd5964933da50a9 - languageName: node - linkType: hard - -"clean-stack@npm:^2.0.0": - version: 2.2.0 - resolution: "clean-stack@npm:2.2.0" - checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 - languageName: node - linkType: hard - -"cli-cursor@npm:^3.1.0": - version: 3.1.0 - resolution: "cli-cursor@npm:3.1.0" - dependencies: - restore-cursor: ^3.1.0 - checksum: 2692784c6cd2fd85cfdbd11f53aea73a463a6d64a77c3e098b2b4697a20443f430c220629e1ca3b195ea5ac4a97a74c2ee411f3807abf6df2b66211fec0c0a29 - languageName: node - linkType: hard - -"cli-cursor@npm:^4.0.0": - version: 4.0.0 - resolution: "cli-cursor@npm:4.0.0" - dependencies: - restore-cursor: ^4.0.0 - checksum: ab3f3ea2076e2176a1da29f9d64f72ec3efad51c0960898b56c8a17671365c26e67b735920530eaf7328d61f8bd41c27f46b9cf6e4e10fe2fa44b5e8c0e392cc - languageName: node - linkType: hard - -"cli-spinners@npm:^2.5.0": - version: 2.9.2 - resolution: "cli-spinners@npm:2.9.2" - checksum: 1bd588289b28432e4676cb5d40505cfe3e53f2e4e10fbe05c8a710a154d6fe0ce7836844b00d6858f740f2ffe67cdc36e0fce9c7b6a8430e80e6388d5aa4956c - languageName: node - linkType: hard - -"cli-table3@npm:^0.5.0": - version: 0.5.1 - resolution: "cli-table3@npm:0.5.1" - dependencies: - colors: ^1.1.2 - object-assign: ^4.1.0 - string-width: ^2.1.1 - dependenciesMeta: - colors: - optional: true - checksum: 3ff8c821440a2a0e655a01f04e5b54a0365b3814676cd93cec2b2b0b9952a08311797ad242a181733fcff714fa7d776f8bb45ad812f296390bfa5ef584fb231d - languageName: node - linkType: hard - -"cli-truncate@npm:^3.1.0": - version: 3.1.0 - resolution: "cli-truncate@npm:3.1.0" - dependencies: - slice-ansi: ^5.0.0 - string-width: ^5.0.0 - checksum: c3243e41974445691c63f8b405df1d5a24049dc33d324fe448dc572e561a7b772ae982692900b1a5960901cc4fc7def25a629b9c69a4208ee89d12ab3332617a - languageName: node - linkType: hard - -"cli-width@npm:^3.0.0": - version: 3.0.0 - resolution: "cli-width@npm:3.0.0" - checksum: 4c94af3769367a70e11ed69aa6095f1c600c0ff510f3921ab4045af961820d57c0233acfa8b6396037391f31b4c397e1f614d234294f979ff61430a6c166c3f6 - languageName: node - linkType: hard - -"cliui@npm:^7.0.2": - version: 7.0.4 - resolution: "cliui@npm:7.0.4" - dependencies: - string-width: ^4.2.0 - strip-ansi: ^6.0.0 - wrap-ansi: ^7.0.0 - checksum: ce2e8f578a4813806788ac399b9e866297740eecd4ad1823c27fd344d78b22c5f8597d548adbcc46f0573e43e21e751f39446c5a5e804a12aace402b7a315d7f - languageName: node - linkType: hard - -"cliui@npm:^8.0.1": - version: 8.0.1 - resolution: "cliui@npm:8.0.1" - dependencies: - string-width: ^4.2.0 - strip-ansi: ^6.0.1 - wrap-ansi: ^7.0.0 - checksum: 79648b3b0045f2e285b76fb2e24e207c6db44323581e421c3acbd0e86454cba1b37aea976ab50195a49e7384b871e6dfb2247ad7dec53c02454ac6497394cb56 - languageName: node - linkType: hard - -"clone@npm:^1.0.2": - version: 1.0.4 - resolution: "clone@npm:1.0.4" - checksum: d06418b7335897209e77bdd430d04f882189582e67bd1f75a04565f3f07f5b3f119a9d670c943b6697d0afb100f03b866b3b8a1f91d4d02d72c4ecf2bb64b5dd - languageName: node - linkType: hard - -"color-convert@npm:^1.9.0, color-convert@npm:^1.9.3": - version: 1.9.3 - resolution: "color-convert@npm:1.9.3" - dependencies: - color-name: 1.1.3 - checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 - languageName: node - linkType: hard - -"color-convert@npm:^2.0.1": - version: 2.0.1 - resolution: "color-convert@npm:2.0.1" - dependencies: - color-name: ~1.1.4 - checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 - languageName: node - linkType: hard - -"color-name@npm:1.1.3": - version: 1.1.3 - resolution: "color-name@npm:1.1.3" - checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d - languageName: node - linkType: hard - -"color-name@npm:^1.0.0, color-name@npm:~1.1.4": - version: 1.1.4 - resolution: "color-name@npm:1.1.4" - checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 - languageName: node - linkType: hard - -"color-string@npm:^1.6.0": - version: 1.9.1 - resolution: "color-string@npm:1.9.1" - dependencies: - color-name: ^1.0.0 - simple-swizzle: ^0.2.2 - checksum: c13fe7cff7885f603f49105827d621ce87f4571d78ba28ef4a3f1a104304748f620615e6bf065ecd2145d0d9dad83a3553f52bb25ede7239d18e9f81622f1cc5 - languageName: node - linkType: hard - -"color@npm:^3.1.3": - version: 3.2.1 - resolution: "color@npm:3.2.1" - dependencies: - color-convert: ^1.9.3 - color-string: ^1.6.0 - checksum: f81220e8b774d35865c2561be921f5652117638dcda7ca4029262046e37fc2444ac7bbfdd110cf1fd9c074a4ee5eda8f85944ffbdda26186b602dd9bb05f6400 - languageName: node - linkType: hard - -"colorette@npm:^2.0.20": - version: 2.0.20 - resolution: "colorette@npm:2.0.20" - checksum: 0c016fea2b91b733eb9f4bcdb580018f52c0bc0979443dad930e5037a968237ac53d9beb98e218d2e9235834f8eebce7f8e080422d6194e957454255bde71d3d - languageName: node - linkType: hard - -"colors@npm:1.4.0, colors@npm:^1.1.2": - version: 1.4.0 - resolution: "colors@npm:1.4.0" - checksum: 98aa2c2418ad87dedf25d781be69dc5fc5908e279d9d30c34d8b702e586a0474605b3a189511482b9d5ed0d20c867515d22749537f7bc546256c6014f3ebdcec - languageName: node - linkType: hard - -"colorspace@npm:1.1.x": - version: 1.1.4 - resolution: "colorspace@npm:1.1.4" - dependencies: - color: ^3.1.3 - text-hex: 1.0.x - checksum: bb3934ef3c417e961e6d03d7ca60ea6e175947029bfadfcdb65109b01881a1c0ecf9c2b0b59abcd0ee4a0d7c1eae93beed01b0e65848936472270a0b341ebce8 - languageName: node - linkType: hard - -"combined-stream@npm:^1.0.6, combined-stream@npm:^1.0.8": - version: 1.0.8 - resolution: "combined-stream@npm:1.0.8" - dependencies: - delayed-stream: ~1.0.0 - checksum: 49fa4aeb4916567e33ea81d088f6584749fc90c7abec76fd516bf1c5aa5c79f3584b5ba3de6b86d26ddd64bae5329c4c7479343250cfe71c75bb366eae53bb7c - languageName: node - linkType: hard - -"command-exists@npm:^1.2.8": - version: 1.2.9 - resolution: "command-exists@npm:1.2.9" - checksum: 729ae3d88a2058c93c58840f30341b7f82688a573019535d198b57a4d8cb0135ced0ad7f52b591e5b28a90feb2c675080ce916e56254a0f7c15cb2395277cac3 - languageName: node - linkType: hard - -"command-line-args@npm:^5.1.1": - version: 5.2.1 - resolution: "command-line-args@npm:5.2.1" - dependencies: - array-back: ^3.1.0 - find-replace: ^3.0.0 - lodash.camelcase: ^4.3.0 - typical: ^4.0.0 - checksum: e759519087be3cf2e86af8b9a97d3058b4910cd11ee852495be881a067b72891f6a32718fb685ee6d41531ab76b2b7bfb6602f79f882cd4b7587ff1e827982c7 - languageName: node - linkType: hard - -"command-line-usage@npm:^6.1.0": - version: 6.1.3 - resolution: "command-line-usage@npm:6.1.3" - dependencies: - array-back: ^4.0.2 - chalk: ^2.4.2 - table-layout: ^1.0.2 - typical: ^5.2.0 - checksum: 8261d4e5536eb0bcddee0ec5e89c05bb2abd18e5760785c8078ede5020bc1c612cbe28eb6586f5ed4a3660689748e5aaad4a72f21566f4ef39393694e2fa1a0b - languageName: node - linkType: hard - -"commander@npm:11.0.0": - version: 11.0.0 - resolution: "commander@npm:11.0.0" - checksum: 6621954e1e1d078b4991c1f5bbd9439ad37aa7768d6ab4842de1dbd4d222c8a27e1b8e62108b3a92988614af45031d5bb2a2aaa92951f4d0c934d1a1ac564bb4 - languageName: node - linkType: hard - -"commander@npm:3.0.2": - version: 3.0.2 - resolution: "commander@npm:3.0.2" - checksum: 6d14ad030d1904428139487ed31febcb04c1604db2b8d9fae711f60ee6718828dc0e11602249e91c8a97b0e721e9c6d53edbc166bad3cde1596851d59a8f824d - languageName: node - linkType: hard - -"commander@npm:^10.0.0": - version: 10.0.1 - resolution: "commander@npm:10.0.1" - checksum: 436901d64a818295803c1996cd856621a74f30b9f9e28a588e726b2b1670665bccd7c1a77007ebf328729f0139838a88a19265858a0fa7a8728c4656796db948 - languageName: node - linkType: hard - -"commander@npm:^2.20.3": - version: 2.20.3 - resolution: "commander@npm:2.20.3" - checksum: ab8c07884e42c3a8dbc5dd9592c606176c7eb5c1ca5ff274bcf907039b2c41de3626f684ea75ccf4d361ba004bbaff1f577d5384c155f3871e456bdf27becf9e - languageName: node - linkType: hard - -"commitizen@npm:^4.0.3, commitizen@npm:^4.2.5": - version: 4.3.0 - resolution: "commitizen@npm:4.3.0" - dependencies: - cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0 - dedent: 0.7.0 - detect-indent: 6.1.0 - find-node-modules: ^2.1.2 - find-root: 1.1.0 - fs-extra: 9.1.0 - glob: 7.2.3 - inquirer: 8.2.5 - is-utf8: ^0.2.1 - lodash: 4.17.21 - minimist: 1.2.7 - strip-bom: 4.0.0 - strip-json-comments: 3.1.1 - bin: - commitizen: bin/commitizen - cz: bin/git-cz - git-cz: bin/git-cz - checksum: 5a54f81ab7f24b74dd7791ae408796b0ac9ae6675cbe85db71047cee131e627ed5bfb9365de8b5777bedfbcdee1bccf15e5da5dae8b09b3fce93b551baa2cb63 - languageName: node - linkType: hard - -"compare-func@npm:^2.0.0": - version: 2.0.0 - resolution: "compare-func@npm:2.0.0" - dependencies: - array-ify: ^1.0.0 - dot-prop: ^5.1.0 - checksum: fb71d70632baa1e93283cf9d80f30ac97f003aabee026e0b4426c9716678079ef5fea7519b84d012cbed938c476493866a38a79760564a9e21ae9433e40e6f0d - languageName: node - linkType: hard - -"concat-map@npm:0.0.1": - version: 0.0.1 - resolution: "concat-map@npm:0.0.1" - checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af - languageName: node - linkType: hard - -"concat-stream@npm:^1.6.0, concat-stream@npm:^1.6.2": - version: 1.6.2 - resolution: "concat-stream@npm:1.6.2" - dependencies: - buffer-from: ^1.0.0 - inherits: ^2.0.3 - readable-stream: ^2.2.2 - typedarray: ^0.0.6 - checksum: 1ef77032cb4459dcd5187bd710d6fc962b067b64ec6a505810de3d2b8cc0605638551b42f8ec91edf6fcd26141b32ef19ad749239b58fae3aba99187adc32285 - languageName: node - linkType: hard - -"conventional-changelog-angular@npm:^6.0.0": - version: 6.0.0 - resolution: "conventional-changelog-angular@npm:6.0.0" - dependencies: - compare-func: ^2.0.0 - checksum: ddc59ead53a45b817d83208200967f5340866782b8362d5e2e34105fdfa3d3a31585ebbdec7750bdb9de53da869f847e8ca96634a9801f51e27ecf4e7ffe2bad - languageName: node - linkType: hard - -"conventional-changelog-conventionalcommits@npm:^6.1.0": - version: 6.1.0 - resolution: "conventional-changelog-conventionalcommits@npm:6.1.0" - dependencies: - compare-func: ^2.0.0 - checksum: 4383a35cdf72f5964e194a1146e7f78276e301f73bd993b71627bb93586b6470d411b9613507ceb37e0fed0b023199c95e941541fa47172b4e6a7916fc3a53ff - languageName: node - linkType: hard - -"conventional-commit-types@npm:^3.0.0": - version: 3.0.0 - resolution: "conventional-commit-types@npm:3.0.0" - checksum: b9552de6a310c91a271ee57a890ed70d2d94340e710fc33856aaca5b24928fb2162f04dda5484d155b68c1fbaa042d904014d7fad0b6751a6d68052a0616015d - languageName: node - linkType: hard - -"conventional-commits-parser@npm:^4.0.0": - version: 4.0.0 - resolution: "conventional-commits-parser@npm:4.0.0" - dependencies: - JSONStream: ^1.3.5 - is-text-path: ^1.0.1 - meow: ^8.1.2 - split2: ^3.2.2 - bin: - conventional-commits-parser: cli.js - checksum: 12d95b5ba8e0710a6d3cd2e01f01dd7818fdf0bb2b33f4b75444e2c9aee49598776b0706a528ed49e83aec5f1896c32cbc7f8e6589f61a15187293707448f928 - languageName: node - linkType: hard - -"cookie@npm:^0.4.1": - version: 0.4.2 - resolution: "cookie@npm:0.4.2" - checksum: a00833c998bedf8e787b4c342defe5fa419abd96b32f4464f718b91022586b8f1bafbddd499288e75c037642493c83083da426c6a9080d309e3bd90fd11baa9b - languageName: node - linkType: hard - -"core-util-is@npm:~1.0.0": - version: 1.0.3 - resolution: "core-util-is@npm:1.0.3" - checksum: 9de8597363a8e9b9952491ebe18167e3b36e7707569eed0ebf14f8bba773611376466ae34575bca8cfe3c767890c859c74056084738f09d4e4a6f902b2ad7d99 - languageName: node - linkType: hard - -"cosmiconfig-typescript-loader@npm:^4.0.0": - version: 4.4.0 - resolution: "cosmiconfig-typescript-loader@npm:4.4.0" - peerDependencies: - "@types/node": "*" - cosmiconfig: ">=7" - ts-node: ">=10" - typescript: ">=4" - checksum: d6ba546de333f9440226ab2384a7b5355d8d2e278a9ca9d838664181bc27719764af10c69eec6f07189e63121e6d654235c374bd7dc455ac8dfdef3aad6657fd - languageName: node - linkType: hard - -"cosmiconfig-typescript-loader@npm:^5.0.0": - version: 5.0.0 - resolution: "cosmiconfig-typescript-loader@npm:5.0.0" - dependencies: - jiti: ^1.19.1 - peerDependencies: - "@types/node": "*" - cosmiconfig: ">=8.2" - typescript: ">=4" - checksum: 7b614313f2cc2ecbe17270de570a511aa7c974bf14a749d7ed4f4d0f4a9ed02ee7ae87d710e294204abb00bb6bb0cca53795208bb1435815d143b43c6626ec74 - languageName: node - linkType: hard - -"cosmiconfig@npm:^8.0.0": - version: 8.3.6 - resolution: "cosmiconfig@npm:8.3.6" - dependencies: - import-fresh: ^3.3.0 - js-yaml: ^4.1.0 - parse-json: ^5.2.0 - path-type: ^4.0.0 - peerDependencies: - typescript: ">=4.9.5" - peerDependenciesMeta: - typescript: - optional: true - checksum: dc339ebea427898c9e03bf01b56ba7afbac07fc7d2a2d5a15d6e9c14de98275a9565da949375aee1809591c152c0a3877bb86dbeaf74d5bd5aaa79955ad9e7a0 - languageName: node - linkType: hard - -"cosmiconfig@npm:^9.0.0": - version: 9.0.0 - resolution: "cosmiconfig@npm:9.0.0" - dependencies: - env-paths: ^2.2.1 - import-fresh: ^3.3.0 - js-yaml: ^4.1.0 - parse-json: ^5.2.0 - peerDependencies: - typescript: ">=4.9.5" - peerDependenciesMeta: - typescript: - optional: true - checksum: a30c424b53d442ea0bdd24cb1b3d0d8687c8dda4a17ab6afcdc439f8964438801619cdb66e8e79f63b9caa3e6586b60d8bab9ce203e72df6c5e80179b971fe8f - languageName: node - linkType: hard - -"crc-32@npm:^1.2.0": - version: 1.2.2 - resolution: "crc-32@npm:1.2.2" - bin: - crc32: bin/crc32.njs - checksum: ad2d0ad0cbd465b75dcaeeff0600f8195b686816ab5f3ba4c6e052a07f728c3e70df2e3ca9fd3d4484dc4ba70586e161ca5a2334ec8bf5a41bf022a6103ff243 - languageName: node - linkType: hard - -"create-hash@npm:^1.1.0, create-hash@npm:^1.1.2, create-hash@npm:^1.2.0": - version: 1.2.0 - resolution: "create-hash@npm:1.2.0" - dependencies: - cipher-base: ^1.0.1 - inherits: ^2.0.1 - md5.js: ^1.3.4 - ripemd160: ^2.0.1 - sha.js: ^2.4.0 - checksum: 02a6ae3bb9cd4afee3fabd846c1d8426a0e6b495560a977ba46120c473cb283be6aa1cace76b5f927cf4e499c6146fb798253e48e83d522feba807d6b722eaa9 - languageName: node - linkType: hard - -"create-hmac@npm:^1.1.4, create-hmac@npm:^1.1.7": - version: 1.1.7 - resolution: "create-hmac@npm:1.1.7" - 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 - checksum: ba12bb2257b585a0396108c72830e85f882ab659c3320c83584b1037f8ab72415095167ced80dc4ce8e446a8ecc4b2acf36d87befe0707d73b26cf9dc77440ed - languageName: node - linkType: hard - -"create-require@npm:^1.1.0": - version: 1.1.1 - resolution: "create-require@npm:1.1.1" - checksum: a9a1503d4390d8b59ad86f4607de7870b39cad43d929813599a23714831e81c520bddf61bcdd1f8e30f05fd3a2b71ae8538e946eb2786dc65c2bbc520f692eff - languageName: node - linkType: hard - -"cross-env@npm:^7.0.3": - version: 7.0.3 - resolution: "cross-env@npm:7.0.3" - dependencies: - cross-spawn: ^7.0.1 - bin: - cross-env: src/bin/cross-env.js - cross-env-shell: src/bin/cross-env-shell.js - checksum: 26f2f3ea2ab32617f57effb70d329c2070d2f5630adc800985d8b30b56e8bf7f5f439dd3a0358b79cee6f930afc23cf8e23515f17ccfb30092c6b62c6b630a79 - languageName: node - linkType: hard - -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.1, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" - dependencies: - path-key: ^3.1.0 - shebang-command: ^2.0.0 - which: ^2.0.1 - checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 - languageName: node - linkType: hard - -"crypt@npm:>= 0.0.1": - version: 0.0.2 - resolution: "crypt@npm:0.0.2" - checksum: baf4c7bbe05df656ec230018af8cf7dbe8c14b36b98726939cef008d473f6fe7a4fad906cfea4062c93af516f1550a3f43ceb4d6615329612c6511378ed9fe34 - languageName: node - linkType: hard - -"cz-conventional-changelog@npm:3.3.0, cz-conventional-changelog@npm:^3.3.0": - version: 3.3.0 - resolution: "cz-conventional-changelog@npm:3.3.0" - dependencies: - "@commitlint/load": ">6.1.1" - chalk: ^2.4.1 - commitizen: ^4.0.3 - conventional-commit-types: ^3.0.0 - lodash.map: ^4.5.1 - longest: ^2.0.1 - word-wrap: ^1.0.3 - dependenciesMeta: - "@commitlint/load": - optional: true - checksum: 8b766712092142ecec86c5c8a2a7206d0b2da46ae16e137303c6d75b42c048acd831c734fd542b9c3cbeb0fd8e7d1f5391494ed629dfba4459fee2d6f5d2c0ca - languageName: node - linkType: hard - -"dargs@npm:^7.0.0": - version: 7.0.0 - resolution: "dargs@npm:7.0.0" - checksum: b8f1e3cba59c42e1f13a114ad4848c3fc1cf7470f633ee9e9f1043762429bc97d91ae31b826fb135eefde203a3fdb20deb0c0a0222ac29d937b8046085d668d1 - languageName: node - linkType: hard - -"death@npm:^1.1.0": - version: 1.1.0 - resolution: "death@npm:1.1.0" - checksum: 8010ba9a320752f9580eb474985ed214572c0595cf83e92859e3c5a014a01fc8e8f2f2908b80b5f8bca9cb3f94adb546cf55810df6b80e282452e355cdce5aaa - languageName: node - linkType: hard - -"debug@npm:4, debug@npm:^4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:^4.3.5": - version: 4.3.7 - resolution: "debug@npm:4.3.7" - dependencies: - ms: ^2.1.3 - peerDependenciesMeta: - supports-color: - optional: true - checksum: 822d74e209cd910ef0802d261b150314bbcf36c582ccdbb3e70f0894823c17e49a50d3e66d96b633524263975ca16b6a833f3e3b7e030c157169a5fabac63160 - languageName: node - linkType: hard - -"debug@npm:4.3.4": - version: 4.3.4 - resolution: "debug@npm:4.3.4" - dependencies: - ms: 2.1.2 - peerDependenciesMeta: - supports-color: - optional: true - checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 - languageName: node - linkType: hard - -"decamelize-keys@npm:^1.1.0": - version: 1.1.1 - resolution: "decamelize-keys@npm:1.1.1" - dependencies: - decamelize: ^1.1.0 - map-obj: ^1.0.0 - checksum: fc645fe20b7bda2680bbf9481a3477257a7f9304b1691036092b97ab04c0ab53e3bf9fcc2d2ae382536568e402ec41fb11e1d4c3836a9abe2d813dd9ef4311e0 - languageName: node - linkType: hard - -"decamelize@npm:^1.1.0": - version: 1.2.0 - resolution: "decamelize@npm:1.2.0" - checksum: ad8c51a7e7e0720c70ec2eeb1163b66da03e7616d7b98c9ef43cce2416395e84c1e9548dd94f5f6ffecfee9f8b94251fc57121a8b021f2ff2469b2bae247b8aa - languageName: node - linkType: hard - -"decamelize@npm:^4.0.0": - version: 4.0.0 - resolution: "decamelize@npm:4.0.0" - checksum: b7d09b82652c39eead4d6678bb578e3bebd848add894b76d0f6b395bc45b2d692fb88d977e7cfb93c4ed6c119b05a1347cef261174916c2e75c0a8ca57da1809 - languageName: node - linkType: hard - -"dedent@npm:0.7.0": - version: 0.7.0 - resolution: "dedent@npm:0.7.0" - checksum: 87de191050d9a40dd70cad01159a0bcf05ecb59750951242070b6abf9569088684880d00ba92a955b4058804f16eeaf91d604f283929b4f614d181cd7ae633d2 - languageName: node - linkType: hard - -"deep-eql@npm:^4.0.1, deep-eql@npm:^4.1.3": - version: 4.1.4 - resolution: "deep-eql@npm:4.1.4" - dependencies: - type-detect: ^4.0.0 - checksum: 01c3ca78ff40d79003621b157054871411f94228ceb9b2cab78da913c606631c46e8aa79efc4aa0faf3ace3092acd5221255aab3ef0e8e7b438834f0ca9a16c7 - languageName: node - linkType: hard - -"deep-extend@npm:~0.6.0": - version: 0.6.0 - resolution: "deep-extend@npm:0.6.0" - checksum: 7be7e5a8d468d6b10e6a67c3de828f55001b6eb515d014f7aeb9066ce36bd5717161eb47d6a0f7bed8a9083935b465bc163ee2581c8b128d29bf61092fdf57a7 - languageName: node - linkType: hard - -"deep-is@npm:^0.1.3, deep-is@npm:~0.1.3": - version: 0.1.4 - resolution: "deep-is@npm:0.1.4" - checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 - languageName: node - linkType: hard - -"defaults@npm:^1.0.3": - version: 1.0.4 - resolution: "defaults@npm:1.0.4" - dependencies: - clone: ^1.0.2 - checksum: 3a88b7a587fc076b84e60affad8b85245c01f60f38fc1d259e7ac1d89eb9ce6abb19e27215de46b98568dd5bc48471730b327637e6f20b0f1bc85cf00440c80a - languageName: node - linkType: hard - -"define-data-property@npm:^1.1.4": - version: 1.1.4 - resolution: "define-data-property@npm:1.1.4" - dependencies: - es-define-property: ^1.0.0 - es-errors: ^1.3.0 - gopd: ^1.0.1 - checksum: 8068ee6cab694d409ac25936eb861eea704b7763f7f342adbdfe337fc27c78d7ae0eff2364b2917b58c508d723c7a074326d068eef2e45c4edcd85cf94d0313b - languageName: node - linkType: hard - -"delay@npm:^5.0.0": - version: 5.0.0 - resolution: "delay@npm:5.0.0" - checksum: 62f151151ecfde0d9afbb8a6be37a6d103c4cb24f35a20ef3fe56f920b0d0d0bb02bc9c0a3084d0179ef669ca332b91155f2ee4d9854622cd2cdba5fc95285f9 - languageName: node - linkType: hard - -"delayed-stream@npm:~1.0.0": - version: 1.0.0 - resolution: "delayed-stream@npm:1.0.0" - checksum: 46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020 - languageName: node - linkType: hard - -"depd@npm:2.0.0": - version: 2.0.0 - resolution: "depd@npm:2.0.0" - checksum: abbe19c768c97ee2eed6282d8ce3031126662252c58d711f646921c9623f9052e3e1906443066beec1095832f534e57c523b7333f8e7e0d93051ab6baef5ab3a - languageName: node - linkType: hard - -"detect-file@npm:^1.0.0": - version: 1.0.0 - resolution: "detect-file@npm:1.0.0" - checksum: 1861e4146128622e847abe0e1ed80fef01e78532665858a792267adf89032b7a9c698436137707fcc6f02956c2a6a0052d6a0cef5be3d4b76b1ff0da88e2158a - languageName: node - linkType: hard - -"detect-indent@npm:6.1.0": - version: 6.1.0 - resolution: "detect-indent@npm:6.1.0" - checksum: ab953a73c72dbd4e8fc68e4ed4bfd92c97eb6c43734af3900add963fd3a9316f3bc0578b018b24198d4c31a358571eff5f0656e81a1f3b9ad5c547d58b2d093d - languageName: node - linkType: hard - -"diff@npm:^4.0.1": - version: 4.0.2 - resolution: "diff@npm:4.0.2" - checksum: f2c09b0ce4e6b301c221addd83bf3f454c0bc00caa3dd837cf6c127d6edf7223aa2bbe3b688feea110b7f262adbfc845b757c44c8a9f8c0c5b15d8fa9ce9d20d - languageName: node - linkType: hard - -"diff@npm:^5.2.0": - version: 5.2.0 - resolution: "diff@npm:5.2.0" - checksum: 12b63ca9c36c72bafa3effa77121f0581b4015df18bc16bac1f8e263597735649f1a173c26f7eba17fb4162b073fee61788abe49610e6c70a2641fe1895443fd - languageName: node - linkType: hard - -"difflib@npm:^0.2.4": - version: 0.2.4 - resolution: "difflib@npm:0.2.4" - dependencies: - heap: ">= 0.2.0" - checksum: 4f4237b026263ce7471b77d9019b901c2f358a7da89401a80a84a8c3cdc1643a8e70b7495ccbe686cb4d95492eaf5dac119cd9ecbffe5f06bfc175fbe5c20a27 - languageName: node - linkType: hard - -"dir-glob@npm:^3.0.1": - version: 3.0.1 - resolution: "dir-glob@npm:3.0.1" - dependencies: - path-type: ^4.0.0 - checksum: fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 - languageName: node - linkType: hard - -"doctrine@npm:^3.0.0": - version: 3.0.0 - resolution: "doctrine@npm:3.0.0" - dependencies: - esutils: ^2.0.2 - checksum: fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce - languageName: node - linkType: hard - -"dot-prop@npm:^5.1.0": - version: 5.3.0 - resolution: "dot-prop@npm:5.3.0" - dependencies: - is-obj: ^2.0.0 - checksum: d5775790093c234ef4bfd5fbe40884ff7e6c87573e5339432870616331189f7f5d86575c5b5af2dcf0f61172990f4f734d07844b1f23482fff09e3c4bead05ea - languageName: node - linkType: hard - -"dotenv@npm:^16.0.3, dotenv@npm:^16.3.1": - version: 16.4.5 - resolution: "dotenv@npm:16.4.5" - checksum: 301a12c3d44fd49888b74eb9ccf9f07a1f5df43f489e7fcb89647a2edcd84c42d6bc349dc8df099cd18f07c35c7b04685c1a4f3e6a6a9e6b30f8d48c15b7f49c - languageName: node - linkType: hard - -"eastasianwidth@npm:^0.2.0": - version: 0.2.0 - resolution: "eastasianwidth@npm:0.2.0" - checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed - languageName: node - linkType: hard - -"elliptic@npm:6.5.4": - version: 6.5.4 - resolution: "elliptic@npm:6.5.4" - 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 - checksum: d56d21fd04e97869f7ffcc92e18903b9f67f2d4637a23c860492fbbff5a3155fd9ca0184ce0c865dd6eb2487d234ce9551335c021c376cd2d3b7cb749c7d10f4 - languageName: node - linkType: hard - -"elliptic@npm:^6.5.2, elliptic@npm:^6.5.4": - version: 6.5.7 - resolution: "elliptic@npm:6.5.7" - 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 - checksum: af0ffddffdbc2fea4eeec74388cd73e62ed5a0eac6711568fb28071566319785df529c968b0bf1250ba4bc628e074b2d64c54a633e034aa6f0c6b152ceb49ab8 - languageName: node - linkType: hard - -"emoji-regex@npm:^8.0.0": - version: 8.0.0 - resolution: "emoji-regex@npm:8.0.0" - checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 - languageName: node - linkType: hard - -"emoji-regex@npm:^9.2.2": - version: 9.2.2 - resolution: "emoji-regex@npm:9.2.2" - checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601 - languageName: node - linkType: hard - -"enabled@npm:2.0.x": - version: 2.0.0 - resolution: "enabled@npm:2.0.0" - checksum: 9d256d89f4e8a46ff988c6a79b22fa814b4ffd82826c4fdacd9b42e9b9465709d3b748866d0ab4d442dfc6002d81de7f7b384146ccd1681f6a7f868d2acca063 - languageName: node - linkType: hard - -"encode-utf8@npm:^1.0.2": - version: 1.0.3 - resolution: "encode-utf8@npm:1.0.3" - checksum: 550224bf2a104b1d355458c8a82e9b4ea07f9fc78387bc3a49c151b940ad26473de8dc9e121eefc4e84561cb0b46de1e4cd2bc766f72ee145e9ea9541482817f - languageName: node - linkType: hard - -"encoding@npm:^0.1.13": - version: 0.1.13 - resolution: "encoding@npm:0.1.13" - dependencies: - iconv-lite: ^0.6.2 - checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f - languageName: node - linkType: hard - -"enquirer@npm:^2.3.0, enquirer@npm:^2.3.6": - version: 2.4.1 - resolution: "enquirer@npm:2.4.1" - dependencies: - ansi-colors: ^4.1.1 - strip-ansi: ^6.0.1 - checksum: f080f11a74209647dbf347a7c6a83c8a47ae1ebf1e75073a808bc1088eb780aa54075bfecd1bcdb3e3c724520edb8e6ee05da031529436b421b71066fcc48cb5 - languageName: node - linkType: hard - -"env-paths@npm:^2.2.0, env-paths@npm:^2.2.1": - version: 2.2.1 - resolution: "env-paths@npm:2.2.1" - checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e - languageName: node - linkType: hard - -"err-code@npm:^2.0.2": - version: 2.0.3 - resolution: "err-code@npm:2.0.3" - checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54 - languageName: node - linkType: hard - -"error-ex@npm:^1.3.1": - version: 1.3.2 - resolution: "error-ex@npm:1.3.2" - dependencies: - is-arrayish: ^0.2.1 - checksum: c1c2b8b65f9c91b0f9d75f0debaa7ec5b35c266c2cac5de412c1a6de86d4cbae04ae44e510378cb14d032d0645a36925d0186f8bb7367bcc629db256b743a001 - languageName: node - linkType: hard - -"es-define-property@npm:^1.0.0": - version: 1.0.0 - resolution: "es-define-property@npm:1.0.0" - dependencies: - get-intrinsic: ^1.2.4 - checksum: f66ece0a887b6dca71848fa71f70461357c0e4e7249696f81bad0a1f347eed7b31262af4a29f5d726dc026426f085483b6b90301855e647aa8e21936f07293c6 - languageName: node - linkType: hard - -"es-errors@npm:^1.3.0": - version: 1.3.0 - resolution: "es-errors@npm:1.3.0" - checksum: ec1414527a0ccacd7f15f4a3bc66e215f04f595ba23ca75cdae0927af099b5ec865f9f4d33e9d7e86f512f252876ac77d4281a7871531a50678132429b1271b5 - languageName: node - linkType: hard - -"es6-promise@npm:^4.0.3": - version: 4.2.8 - resolution: "es6-promise@npm:4.2.8" - checksum: 95614a88873611cb9165a85d36afa7268af5c03a378b35ca7bda9508e1d4f1f6f19a788d4bc755b3fd37c8ebba40782018e02034564ff24c9d6fa37e959ad57d - languageName: node - linkType: hard - -"es6-promisify@npm:^5.0.0": - version: 5.0.0 - resolution: "es6-promisify@npm:5.0.0" - dependencies: - es6-promise: ^4.0.3 - checksum: fbed9d791598831413be84a5374eca8c24800ec71a16c1c528c43a98e2dadfb99331483d83ae6094ddb9b87e6f799a15d1553cebf756047e0865c753bc346b92 - languageName: node - linkType: hard - -"escalade@npm:^3.1.1": - version: 3.2.0 - resolution: "escalade@npm:3.2.0" - checksum: 47b029c83de01b0d17ad99ed766347b974b0d628e848de404018f3abee728e987da0d2d370ad4574aa3d5b5bfc368754fd085d69a30f8e75903486ec4b5b709e - languageName: node - linkType: hard - -"escape-string-regexp@npm:^1.0.5": - version: 1.0.5 - resolution: "escape-string-regexp@npm:1.0.5" - checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^4.0.0": - version: 4.0.0 - resolution: "escape-string-regexp@npm:4.0.0" - checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 - languageName: node - linkType: hard - -"escodegen@npm:1.8.x": - version: 1.8.1 - resolution: "escodegen@npm:1.8.1" - dependencies: - esprima: ^2.7.1 - estraverse: ^1.9.1 - esutils: ^2.0.2 - optionator: ^0.8.1 - source-map: ~0.2.0 - dependenciesMeta: - source-map: - optional: true - bin: - escodegen: ./bin/escodegen.js - esgenerate: ./bin/esgenerate.js - checksum: 99f5579dbc309d8f95f8051cce2f85620c073ff1d4f7b58197addee7e81aeb5281dadfbd446a0885b8fb8c0c47ce5c2cdb5f97dbfddccb5126cca5eb9af73992 - languageName: node - linkType: hard - -"eslint-config-prettier@npm:^8.5.0": - version: 8.10.0 - resolution: "eslint-config-prettier@npm:8.10.0" - peerDependencies: - eslint: ">=7.0.0" - bin: - eslint-config-prettier: bin/cli.js - checksum: 153266badd477e49b0759816246b2132f1dbdb6c7f313ca60a9af5822fd1071c2bc5684a3720d78b725452bbac04bb130878b2513aea5e72b1b792de5a69fec8 - languageName: node - linkType: hard - -"eslint-config-prettier@npm:^9.0.0": - version: 9.1.0 - resolution: "eslint-config-prettier@npm:9.1.0" - peerDependencies: - eslint: ">=7.0.0" - bin: - eslint-config-prettier: bin/cli.js - checksum: 9229b768c879f500ee54ca05925f31b0c0bafff3d9f5521f98ff05127356de78c81deb9365c86a5ec4efa990cb72b74df8612ae15965b14136044c73e1f6a907 - languageName: node - linkType: hard - -"eslint-scope@npm:^5.1.1": - version: 5.1.1 - resolution: "eslint-scope@npm:5.1.1" - dependencies: - esrecurse: ^4.3.0 - estraverse: ^4.1.1 - checksum: 47e4b6a3f0cc29c7feedee6c67b225a2da7e155802c6ea13bbef4ac6b9e10c66cd2dcb987867ef176292bf4e64eccc680a49e35e9e9c669f4a02bac17e86abdb - languageName: node - linkType: hard - -"eslint-scope@npm:^7.2.2": - version: 7.2.2 - resolution: "eslint-scope@npm:7.2.2" - dependencies: - esrecurse: ^4.3.0 - estraverse: ^5.2.0 - checksum: ec97dbf5fb04b94e8f4c5a91a7f0a6dd3c55e46bfc7bbcd0e3138c3a76977570e02ed89a1810c778dcd72072ff0e9621ba1379b4babe53921d71e2e4486fda3e - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": - version: 3.4.3 - resolution: "eslint-visitor-keys@npm:3.4.3" - checksum: 36e9ef87fca698b6fd7ca5ca35d7b2b6eeaaf106572e2f7fd31c12d3bfdaccdb587bba6d3621067e5aece31c8c3a348b93922ab8f7b2cbc6aaab5e1d89040c60 - languageName: node - linkType: hard - -"eslint@npm:^8.28.0, eslint@npm:^8.51.0": - version: 8.57.0 - resolution: "eslint@npm:8.57.0" - 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 - bin: - eslint: bin/eslint.js - checksum: 3a48d7ff85ab420a8447e9810d8087aea5b1df9ef68c9151732b478de698389ee656fd895635b5f2871c89ee5a2652b3f343d11e9db6f8486880374ebc74a2d9 - languageName: node - linkType: hard - -"espree@npm:^9.6.0, espree@npm:^9.6.1": - version: 9.6.1 - resolution: "espree@npm:9.6.1" - dependencies: - acorn: ^8.9.0 - acorn-jsx: ^5.3.2 - eslint-visitor-keys: ^3.4.1 - checksum: eb8c149c7a2a77b3f33a5af80c10875c3abd65450f60b8af6db1bfcfa8f101e21c1e56a561c6dc13b848e18148d43469e7cd208506238554fb5395a9ea5a1ab9 - languageName: node - linkType: hard - -"esprima@npm:2.7.x, esprima@npm:^2.7.1": - version: 2.7.3 - resolution: "esprima@npm:2.7.3" - bin: - esparse: ./bin/esparse.js - esvalidate: ./bin/esvalidate.js - checksum: 55584508dca0551885e62c3369bc4a783bd948b43e2f034f05c2a37f3ca398db99f072ab228234e9cab09af8dc8c65d6ca7de3a975f2a296b34d1a3aba7e89f1 - languageName: node - linkType: hard - -"esprima@npm:^4.0.0": - version: 4.0.1 - resolution: "esprima@npm:4.0.1" - bin: - esparse: ./bin/esparse.js - esvalidate: ./bin/esvalidate.js - checksum: b45bc805a613dbea2835278c306b91aff6173c8d034223fa81498c77dcbce3b2931bf6006db816f62eacd9fd4ea975dfd85a5b7f3c6402cfd050d4ca3c13a628 - languageName: node - linkType: hard - -"esquery@npm:^1.4.2": - version: 1.6.0 - resolution: "esquery@npm:1.6.0" - dependencies: - estraverse: ^5.1.0 - checksum: 08ec4fe446d9ab27186da274d979558557fbdbbd10968fa9758552482720c54152a5640e08b9009e5a30706b66aba510692054d4129d32d0e12e05bbc0b96fb2 - languageName: node - linkType: hard - -"esrecurse@npm:^4.3.0": - version: 4.3.0 - resolution: "esrecurse@npm:4.3.0" - dependencies: - estraverse: ^5.2.0 - checksum: ebc17b1a33c51cef46fdc28b958994b1dc43cd2e86237515cbc3b4e5d2be6a811b2315d0a1a4d9d340b6d2308b15322f5c8291059521cc5f4802f65e7ec32837 - languageName: node - linkType: hard - -"estraverse@npm:^1.9.1": - version: 1.9.3 - resolution: "estraverse@npm:1.9.3" - checksum: 78fa96317500e7783d48297dbd4c7f8735ddeb970be2981b485639ffa77578d05b8f781332622e436f2e9e533f32923c62c2e6463291e577ceeaf2776ac5e4b5 - languageName: node - linkType: hard - -"estraverse@npm:^4.1.1": - version: 4.3.0 - resolution: "estraverse@npm:4.3.0" - checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 - languageName: node - linkType: hard - -"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": - version: 5.3.0 - resolution: "estraverse@npm:5.3.0" - checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b - languageName: node - linkType: hard - -"esutils@npm:^2.0.2": - version: 2.0.3 - resolution: "esutils@npm:2.0.3" - checksum: 22b5b08f74737379a840b8ed2036a5fb35826c709ab000683b092d9054e5c2a82c27818f12604bfc2a9a76b90b6834ef081edbc1c7ae30d1627012e067c6ec87 - languageName: node - linkType: hard - -"eth-gas-reporter@npm:^0.2.25": - version: 0.2.27 - resolution: "eth-gas-reporter@npm:0.2.27" - dependencies: - "@solidity-parser/parser": ^0.14.0 - axios: ^1.5.1 - cli-table3: ^0.5.0 - colors: 1.4.0 - ethereum-cryptography: ^1.0.3 - ethers: ^5.7.2 - fs-readdir-recursive: ^1.1.0 - lodash: ^4.17.14 - markdown-table: ^1.1.3 - mocha: ^10.2.0 - req-cwd: ^2.0.0 - sha1: ^1.1.1 - sync-request: ^6.0.0 - peerDependencies: - "@codechecks/client": ^0.1.0 - peerDependenciesMeta: - "@codechecks/client": - optional: true - checksum: 9a26a4936693de6dbe633a9e6f9d69eb93c9d45c61ecbc20702a72f15ade424785e29ae8e62ea3a2afc49ea22a4777a71914dc8da1b8587e9d47d085a3246784 - languageName: node - linkType: hard - -"ethereum-bloom-filters@npm:^1.0.6": - version: 1.2.0 - resolution: "ethereum-bloom-filters@npm:1.2.0" - dependencies: - "@noble/hashes": ^1.4.0 - checksum: 3a4d11495a5845483b78eca6455a915835d691df09a8c5754785c6bdfb5d18382d7e65b066a1c092493c1d87850c6a77243136996a231baec82f22c727e15258 - languageName: node - linkType: hard - -"ethereum-cryptography@npm:0.1.3, ethereum-cryptography@npm:^0.1.3": - version: 0.1.3 - resolution: "ethereum-cryptography@npm:0.1.3" - dependencies: - "@types/pbkdf2": ^3.0.0 - "@types/secp256k1": ^4.0.1 - blakejs: ^1.1.0 - browserify-aes: ^1.2.0 - bs58check: ^2.1.2 - create-hash: ^1.2.0 - create-hmac: ^1.1.7 - hash.js: ^1.1.7 - keccak: ^3.0.0 - pbkdf2: ^3.0.17 - randombytes: ^2.1.0 - safe-buffer: ^5.1.2 - scrypt-js: ^3.0.0 - secp256k1: ^4.0.1 - setimmediate: ^1.0.5 - checksum: 54bae7a4a96bd81398cdc35c91cfcc74339f71a95ed1b5b694663782e69e8e3afd21357de3b8bac9ff4877fd6f043601e200a7ad9133d94be6fd7d898ee0a449 - languageName: node - linkType: hard - -"ethereum-cryptography@npm:^1.0.3": - version: 1.2.0 - resolution: "ethereum-cryptography@npm:1.2.0" - dependencies: - "@noble/hashes": 1.2.0 - "@noble/secp256k1": 1.7.1 - "@scure/bip32": 1.1.5 - "@scure/bip39": 1.1.1 - checksum: 97e8e8253cb9f5a9271bd0201c37609c451c890eb85883b9c564f14743c3d7c673287406c93bf5604307593ee298ad9a03983388b85c11ca61461b9fc1a4f2c7 - languageName: node - linkType: hard - -"ethereum-cryptography@npm:^2.0.0, ethereum-cryptography@npm:^2.1.2": - version: 2.2.1 - resolution: "ethereum-cryptography@npm:2.2.1" - dependencies: - "@noble/curves": 1.4.2 - "@noble/hashes": 1.4.0 - "@scure/bip32": 1.4.0 - "@scure/bip39": 1.3.0 - checksum: 1466e4c417b315a6ac67f95088b769fafac8902b495aada3c6375d827e5a7882f9e0eea5f5451600d2250283d9198b8a3d4d996e374e07a80a324e29136f25c6 - languageName: node - linkType: hard - -"ethereumjs-abi@npm:^0.6.8": - version: 0.6.8 - resolution: "ethereumjs-abi@npm:0.6.8" - dependencies: - bn.js: ^4.11.8 - ethereumjs-util: ^6.0.0 - checksum: cede2a8ae7c7e04eeaec079c2f925601a25b2ef75cf9230e7c5da63b4ea27883b35447365a47e35c1e831af520973a2252af89022c292c18a09a4607821a366b - languageName: node - linkType: hard - -"ethereumjs-util@npm:^6.0.0, ethereumjs-util@npm:^6.2.1": - version: 6.2.1 - resolution: "ethereumjs-util@npm:6.2.1" - dependencies: - "@types/bn.js": ^4.11.3 - bn.js: ^4.11.0 - create-hash: ^1.1.2 - elliptic: ^6.5.2 - ethereum-cryptography: ^0.1.3 - ethjs-util: 0.1.6 - rlp: ^2.2.3 - checksum: e3cb4a2c034a2529281fdfc21a2126fe032fdc3038863f5720352daa65ddcc50fc8c67dbedf381a882dc3802e05d979287126d7ecf781504bde1fd8218693bde - languageName: node - linkType: hard - -"ethereumjs-util@npm:^7.1.4": - version: 7.1.5 - resolution: "ethereumjs-util@npm:7.1.5" - dependencies: - "@types/bn.js": ^5.1.0 - bn.js: ^5.1.2 - create-hash: ^1.1.2 - ethereum-cryptography: ^0.1.3 - rlp: ^2.2.4 - checksum: 27a3c79d6e06b2df34b80d478ce465b371c8458b58f5afc14d91c8564c13363ad336e6e83f57eb0bd719fde94d10ee5697ceef78b5aa932087150c5287b286d1 - languageName: node - linkType: hard - -"ethers@npm:^5.7.0, ethers@npm:^5.7.1, ethers@npm:^5.7.2": - version: 5.7.2 - resolution: "ethers@npm:5.7.2" - 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 - checksum: b7c08cf3e257185a7946117dbbf764433b7ba0e77c27298dec6088b3bc871aff711462b0621930c56880ff0a7ceb8b1d3a361ffa259f93377b48e34107f62553 - languageName: node - linkType: hard - -"ethers@npm:^6.2.3": - version: 6.13.2 - resolution: "ethers@npm:6.13.2" - 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.17.1 - checksum: 981860c736c7ae121774ad38ea07e3611ce524a77d2fcb77db499b65afe0cbe8f344cd5204d94b68b316349ff770fd2a7d9c8b2039da41c072f98d9864099925 - languageName: node - linkType: hard - -"ethjs-unit@npm:0.1.6": - version: 0.1.6 - resolution: "ethjs-unit@npm:0.1.6" - dependencies: - bn.js: 4.11.6 - number-to-bn: 1.7.0 - checksum: df6b4752ff7461a59a20219f4b1684c631ea601241c39660e3f6c6bd63c950189723841c22b3c6c0ebeb3c9fc99e0e803e3c613101206132603705fcbcf4def5 - languageName: node - linkType: hard - -"ethjs-util@npm:0.1.6, ethjs-util@npm:^0.1.6": - version: 0.1.6 - resolution: "ethjs-util@npm:0.1.6" - dependencies: - is-hex-prefixed: 1.0.0 - strip-hex-prefix: 1.0.0 - checksum: 1f42959e78ec6f49889c49c8a98639e06f52a15966387dd39faf2930db48663d026efb7db2702dcffe7f2a99c4a0144b7ce784efdbf733f4077aae95de76d65f - languageName: node - linkType: hard - -"eventemitter3@npm:^5.0.1": - version: 5.0.1 - resolution: "eventemitter3@npm:5.0.1" - checksum: 543d6c858ab699303c3c32e0f0f47fc64d360bf73c3daf0ac0b5079710e340d6fe9f15487f94e66c629f5f82cd1a8678d692f3dbb6f6fcd1190e1b97fcad36f8 - languageName: node - linkType: hard - -"evp_bytestokey@npm:^1.0.3": - version: 1.0.3 - resolution: "evp_bytestokey@npm:1.0.3" - dependencies: - md5.js: ^1.3.4 - node-gyp: latest - safe-buffer: ^5.1.1 - checksum: ad4e1577f1a6b721c7800dcc7c733fe01f6c310732bb5bf2240245c2a5b45a38518b91d8be2c610611623160b9d1c0e91f1ce96d639f8b53e8894625cf20fa45 - languageName: node - linkType: hard - -"execa@npm:7.2.0": - version: 7.2.0 - resolution: "execa@npm:7.2.0" - dependencies: - cross-spawn: ^7.0.3 - get-stream: ^6.0.1 - human-signals: ^4.3.0 - is-stream: ^3.0.0 - merge-stream: ^2.0.0 - npm-run-path: ^5.1.0 - onetime: ^6.0.0 - signal-exit: ^3.0.7 - strip-final-newline: ^3.0.0 - checksum: 14fd17ba0ca8c87b277584d93b1d9fc24f2a65e5152b31d5eb159a3b814854283eaae5f51efa9525e304447e2f757c691877f7adff8fde5746aae67eb1edd1cc - languageName: node - linkType: hard - -"execa@npm:^5.0.0": - version: 5.1.1 - resolution: "execa@npm:5.1.1" - dependencies: - cross-spawn: ^7.0.3 - get-stream: ^6.0.0 - human-signals: ^2.1.0 - is-stream: ^2.0.0 - merge-stream: ^2.0.0 - npm-run-path: ^4.0.1 - onetime: ^5.1.2 - signal-exit: ^3.0.3 - strip-final-newline: ^2.0.0 - checksum: fba9022c8c8c15ed862847e94c252b3d946036d7547af310e344a527e59021fd8b6bb0723883ea87044dc4f0201f949046993124a42ccb0855cae5bf8c786343 - languageName: node - linkType: hard - -"expand-tilde@npm:^2.0.0, expand-tilde@npm:^2.0.2": - version: 2.0.2 - resolution: "expand-tilde@npm:2.0.2" - dependencies: - homedir-polyfill: ^1.0.1 - checksum: 2efe6ed407d229981b1b6ceb552438fbc9e5c7d6a6751ad6ced3e0aa5cf12f0b299da695e90d6c2ac79191b5c53c613e508f7149e4573abfbb540698ddb7301a - languageName: node - linkType: hard - -"exponential-backoff@npm:^3.1.1": - version: 3.1.1 - resolution: "exponential-backoff@npm:3.1.1" - checksum: 3d21519a4f8207c99f7457287291316306255a328770d320b401114ec8481986e4e467e854cb9914dd965e0a1ca810a23ccb559c642c88f4c7f55c55778a9b48 - languageName: node - linkType: hard - -"external-editor@npm:^3.0.3": - version: 3.1.0 - resolution: "external-editor@npm:3.1.0" - dependencies: - chardet: ^0.7.0 - iconv-lite: ^0.4.24 - tmp: ^0.0.33 - checksum: 1c2a616a73f1b3435ce04030261bed0e22d4737e14b090bb48e58865da92529c9f2b05b893de650738d55e692d071819b45e1669259b2b354bc3154d27a698c7 - languageName: node - linkType: hard - -"eyes@npm:^0.1.8": - version: 0.1.8 - resolution: "eyes@npm:0.1.8" - checksum: c31703a92bf36ba75ee8d379ee7985c24ee6149f3a6175f44cec7a05b178c38bce9836d3ca48c9acb0329a960ac2c4b2ead4e60cdd4fe6e8c92cad7cd6913687 - languageName: node - linkType: hard - -"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": - version: 3.1.3 - resolution: "fast-deep-equal@npm:3.1.3" - checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d - languageName: node - linkType: hard - -"fast-diff@npm:^1.1.2, fast-diff@npm:^1.2.0": - version: 1.3.0 - resolution: "fast-diff@npm:1.3.0" - checksum: d22d371b994fdc8cce9ff510d7b8dc4da70ac327bcba20df607dd5b9cae9f908f4d1028f5fe467650f058d1e7270235ae0b8230809a262b4df587a3b3aa216c3 - languageName: node - linkType: hard - -"fast-glob@npm:^3.0.3, fast-glob@npm:^3.2.9": - version: 3.3.2 - resolution: "fast-glob@npm:3.3.2" - 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 - checksum: 900e4979f4dbc3313840078419245621259f349950411ca2fa445a2f9a1a6d98c3b5e7e0660c5ccd563aa61abe133a21765c6c0dec8e57da1ba71d8000b05ec1 - languageName: node - linkType: hard - -"fast-json-stable-stringify@npm:^2.0.0": - version: 2.1.0 - resolution: "fast-json-stable-stringify@npm:2.1.0" - checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb - languageName: node - linkType: hard - -"fast-levenshtein@npm:^2.0.6, fast-levenshtein@npm:~2.0.6": - version: 2.0.6 - resolution: "fast-levenshtein@npm:2.0.6" - checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c - languageName: node - linkType: hard - -"fast-stable-stringify@npm:^1.0.0": - version: 1.0.0 - resolution: "fast-stable-stringify@npm:1.0.0" - checksum: ef1203d246a7e8ac15e2bfbda0a89fa375947bccf9f7910be0ea759856dbe8ea5024a0d8cc2cceabe18a9cb67e95927b78bb6173a3ae37ec55a518cf36e5244b - languageName: node - linkType: hard - -"fast-uri@npm:^3.0.1": - version: 3.0.1 - resolution: "fast-uri@npm:3.0.1" - checksum: 106143ff83705995225dcc559411288f3337e732bb2e264e79788f1914b6bd8f8bc3683102de60b15ba00e6ebb443633cabac77d4ebc5cb228c47cf955e199ff - languageName: node - linkType: hard - -"fastq@npm:^1.6.0": - version: 1.17.1 - resolution: "fastq@npm:1.17.1" - dependencies: - reusify: ^1.0.4 - checksum: a8c5b26788d5a1763f88bae56a8ddeee579f935a831c5fe7a8268cea5b0a91fbfe705f612209e02d639b881d7b48e461a50da4a10cfaa40da5ca7cc9da098d88 - languageName: node - linkType: hard - -"fecha@npm:^4.2.0": - version: 4.2.3 - resolution: "fecha@npm:4.2.3" - checksum: f94e2fb3acf5a7754165d04549460d3ae6c34830394d20c552197e3e000035d69732d74af04b9bed3283bf29fe2a9ebdcc0085e640b0be3cc3658b9726265e31 - languageName: node - linkType: hard - -"figures@npm:^3.0.0": - version: 3.2.0 - resolution: "figures@npm:3.2.0" - dependencies: - escape-string-regexp: ^1.0.5 - checksum: 85a6ad29e9aca80b49b817e7c89ecc4716ff14e3779d9835af554db91bac41c0f289c418923519392a1e582b4d10482ad282021330cd045bb7b80c84152f2a2b - languageName: node - linkType: hard - -"file-entry-cache@npm:^6.0.1": - version: 6.0.1 - resolution: "file-entry-cache@npm:6.0.1" - dependencies: - flat-cache: ^3.0.4 - checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 - languageName: node - linkType: hard - -"file-uri-to-path@npm:1.0.0": - version: 1.0.0 - resolution: "file-uri-to-path@npm:1.0.0" - checksum: b648580bdd893a008c92c7ecc96c3ee57a5e7b6c4c18a9a09b44fb5d36d79146f8e442578bc0e173dc027adf3987e254ba1dfd6e3ec998b7c282873010502144 - languageName: node - linkType: hard - -"fill-range@npm:^7.1.1": - version: 7.1.1 - resolution: "fill-range@npm:7.1.1" - dependencies: - to-regex-range: ^5.0.1 - checksum: b4abfbca3839a3d55e4ae5ec62e131e2e356bf4859ce8480c64c4876100f4df292a63e5bb1618e1d7460282ca2b305653064f01654474aa35c68000980f17798 - languageName: node - linkType: hard - -"find-node-modules@npm:^2.1.2": - version: 2.1.3 - resolution: "find-node-modules@npm:2.1.3" - dependencies: - findup-sync: ^4.0.0 - merge: ^2.1.1 - checksum: 4b8a194ffd56ccf1a1033de35e2ee8209869b05cce68ff7c4ab0dbf04e63fd7196283383eee4c84596c7b311755b2836815209d558234cadc330a87881e5a3f4 - languageName: node - linkType: hard - -"find-replace@npm:^3.0.0": - version: 3.0.0 - resolution: "find-replace@npm:3.0.0" - dependencies: - array-back: ^3.0.1 - checksum: 6b04bcfd79027f5b84aa1dfe100e3295da989bdac4b4de6b277f4d063e78f5c9e92ebc8a1fec6dd3b448c924ba404ee051cc759e14a3ee3e825fa1361025df08 - languageName: node - linkType: hard - -"find-root@npm:1.1.0": - version: 1.1.0 - resolution: "find-root@npm:1.1.0" - checksum: b2a59fe4b6c932eef36c45a048ae8f93c85640212ebe8363164814990ee20f154197505965f3f4f102efc33bfb1cbc26fd17c4a2fc739ebc51b886b137cbefaf - languageName: node - linkType: hard - -"find-up@npm:^2.1.0": - version: 2.1.0 - resolution: "find-up@npm:2.1.0" - dependencies: - locate-path: ^2.0.0 - checksum: 43284fe4da09f89011f08e3c32cd38401e786b19226ea440b75386c1b12a4cb738c94969808d53a84f564ede22f732c8409e3cfc3f7fb5b5c32378ad0bbf28bd - languageName: node - linkType: hard - -"find-up@npm:^4.1.0": - version: 4.1.0 - resolution: "find-up@npm:4.1.0" - dependencies: - locate-path: ^5.0.0 - path-exists: ^4.0.0 - checksum: 4c172680e8f8c1f78839486e14a43ef82e9decd0e74145f40707cc42e7420506d5ec92d9a11c22bd2c48fb0c384ea05dd30e10dd152fefeec6f2f75282a8b844 - languageName: node - linkType: hard - -"find-up@npm:^5.0.0": - version: 5.0.0 - resolution: "find-up@npm:5.0.0" - dependencies: - locate-path: ^6.0.0 - path-exists: ^4.0.0 - checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 - languageName: node - linkType: hard - -"find-yarn-workspace-root@npm:^2.0.0": - version: 2.0.0 - resolution: "find-yarn-workspace-root@npm:2.0.0" - dependencies: - micromatch: ^4.0.2 - checksum: fa5ca8f9d08fe7a54ce7c0a5931ff9b7e36f9ee7b9475fb13752bcea80ec6b5f180fa5102d60b376d5526ce924ea3fc6b19301262efa0a5d248dd710f3644242 - languageName: node - linkType: hard - -"findup-sync@npm:^4.0.0": - version: 4.0.0 - resolution: "findup-sync@npm:4.0.0" - dependencies: - detect-file: ^1.0.0 - is-glob: ^4.0.0 - micromatch: ^4.0.2 - resolve-dir: ^1.0.1 - checksum: 94131e1107ad63790ed00c4c39ca131a93ea602607bd97afeffd92b69a9a63cf2c6f57d6db88cb753fe748ac7fde79e1e76768ff784247026b7c5ebf23ede3a0 - languageName: node - linkType: hard - -"flat-cache@npm:^3.0.4": - version: 3.2.0 - resolution: "flat-cache@npm:3.2.0" - dependencies: - flatted: ^3.2.9 - keyv: ^4.5.3 - rimraf: ^3.0.2 - checksum: e7e0f59801e288b54bee5cb9681e9ee21ee28ef309f886b312c9d08415b79fc0f24ac842f84356ce80f47d6a53de62197ce0e6e148dc42d5db005992e2a756ec - languageName: node - linkType: hard - -"flat@npm:^5.0.2": - version: 5.0.2 - resolution: "flat@npm:5.0.2" - bin: - flat: cli.js - checksum: 12a1536ac746db74881316a181499a78ef953632ddd28050b7a3a43c62ef5462e3357c8c29d76072bb635f147f7a9a1f0c02efef6b4be28f8db62ceb3d5c7f5d - languageName: node - linkType: hard - -"flatted@npm:^3.2.9": - version: 3.3.1 - resolution: "flatted@npm:3.3.1" - checksum: 85ae7181650bb728c221e7644cbc9f4bf28bc556f2fc89bb21266962bdf0ce1029cc7acc44bb646cd469d9baac7c317f64e841c4c4c00516afa97320cdac7f94 - languageName: node - linkType: hard - -"fmix@npm:^0.1.0": - version: 0.1.0 - resolution: "fmix@npm:0.1.0" - dependencies: - imul: ^1.0.0 - checksum: c465344d4f169eaf10d45c33949a1e7a633f09dba2ac7063ce8ae8be743df5979d708f7f24900163589f047f5194ac5fc2476177ce31175e8805adfa7b8fb7a4 - languageName: node - linkType: hard - -"fn.name@npm:1.x.x": - version: 1.1.0 - resolution: "fn.name@npm:1.1.0" - checksum: e357144f48cfc9a7f52a82bbc6c23df7c8de639fce049cac41d41d62cabb740cdb9f14eddc6485e29c933104455bdd7a69bb14a9012cef9cd4fa252a4d0cf293 - languageName: node - linkType: hard - -"follow-redirects@npm:^1.12.1, follow-redirects@npm:^1.14.0, follow-redirects@npm:^1.15.6": - version: 1.15.9 - resolution: "follow-redirects@npm:1.15.9" - peerDependenciesMeta: - debug: - optional: true - checksum: 859e2bacc7a54506f2bf9aacb10d165df78c8c1b0ceb8023f966621b233717dab56e8d08baadc3ad3b9db58af290413d585c999694b7c146aaf2616340c3d2a6 - languageName: node - linkType: hard - -"foreground-child@npm:^3.1.0": - version: 3.3.0 - resolution: "foreground-child@npm:3.3.0" - dependencies: - cross-spawn: ^7.0.0 - signal-exit: ^4.0.1 - checksum: 1989698488f725b05b26bc9afc8a08f08ec41807cd7b92ad85d96004ddf8243fd3e79486b8348c64a3011ae5cc2c9f0936af989e1f28339805d8bc178a75b451 - languageName: node - linkType: hard - -"form-data@npm:^2.2.0": - version: 2.5.1 - resolution: "form-data@npm:2.5.1" - dependencies: - asynckit: ^0.4.0 - combined-stream: ^1.0.6 - mime-types: ^2.1.12 - checksum: 5134ada56cc246b293a1ac7678dba6830000603a3979cf83ff7b2f21f2e3725202237cfb89e32bcb38a1d35727efbd3c3a22e65b42321e8ade8eec01ce755d08 - languageName: node - linkType: hard - -"form-data@npm:^4.0.0": - version: 4.0.0 - resolution: "form-data@npm:4.0.0" - dependencies: - asynckit: ^0.4.0 - combined-stream: ^1.0.8 - mime-types: ^2.1.12 - checksum: 01135bf8675f9d5c61ff18e2e2932f719ca4de964e3be90ef4c36aacfc7b9cb2fceb5eca0b7e0190e3383fe51c5b37f4cb80b62ca06a99aaabfcfd6ac7c9328c - languageName: node - linkType: hard - -"fp-ts@npm:1.19.3": - version: 1.19.3 - resolution: "fp-ts@npm:1.19.3" - checksum: eb0d4766ad561e9c5c01bfdd3d0ae589af135556921c733d26cf5289aad9f400110defdd93e6ac1d71f626697bb44d9d95ed2879c53dfd868f7cac3cf5c5553c - languageName: node - linkType: hard - -"fp-ts@npm:^1.0.0": - version: 1.19.5 - resolution: "fp-ts@npm:1.19.5" - checksum: 67d2d9c3855d211ca2592b1ef805f98b618157e7681791a776d9d0f7f3e52fcca2122ebf5bc215908c9099fad69756d40e37210cf46cb4075dae1b61efe69e40 - languageName: node - linkType: hard - -"fs-extra@npm:9.1.0, fs-extra@npm:^9.0.0, fs-extra@npm:^9.1.0": - version: 9.1.0 - resolution: "fs-extra@npm:9.1.0" - dependencies: - at-least-node: ^1.0.0 - graceful-fs: ^4.2.0 - jsonfile: ^6.0.1 - universalify: ^2.0.0 - checksum: ba71ba32e0faa74ab931b7a0031d1523c66a73e225de7426e275e238e312d07313d2da2d33e34a52aa406c8763ade5712eb3ec9ba4d9edce652bcacdc29e6b20 - languageName: node - linkType: hard - -"fs-extra@npm:^0.30.0": - version: 0.30.0 - resolution: "fs-extra@npm:0.30.0" - dependencies: - graceful-fs: ^4.1.2 - jsonfile: ^2.1.0 - klaw: ^1.0.0 - path-is-absolute: ^1.0.0 - rimraf: ^2.2.8 - checksum: 6edfd65fc813baa27f1603778c0f5ec11f8c5006a20b920437813ee2023eba18aeec8bef1c89b2e6c84f9fc90fdc7c916f4a700466c8c69d22a35d018f2570f0 - languageName: node - linkType: hard - -"fs-extra@npm:^10.0.0, fs-extra@npm:^10.1.0": - version: 10.1.0 - resolution: "fs-extra@npm:10.1.0" - dependencies: - graceful-fs: ^4.2.0 - jsonfile: ^6.0.1 - universalify: ^2.0.0 - checksum: dc94ab37096f813cc3ca12f0f1b5ad6744dfed9ed21e953d72530d103cea193c2f81584a39e9dee1bea36de5ee66805678c0dddc048e8af1427ac19c00fffc50 - languageName: node - linkType: hard - -"fs-extra@npm:^11.0.0": - version: 11.2.0 - resolution: "fs-extra@npm:11.2.0" - dependencies: - graceful-fs: ^4.2.0 - jsonfile: ^6.0.1 - universalify: ^2.0.0 - checksum: b12e42fa40ba47104202f57b8480dd098aa931c2724565e5e70779ab87605665594e76ee5fb00545f772ab9ace167fe06d2ab009c416dc8c842c5ae6df7aa7e8 - languageName: node - linkType: hard - -"fs-extra@npm:^7.0.0, fs-extra@npm:^7.0.1": - version: 7.0.1 - resolution: "fs-extra@npm:7.0.1" - dependencies: - graceful-fs: ^4.1.2 - jsonfile: ^4.0.0 - universalify: ^0.1.0 - checksum: 141b9dccb23b66a66cefdd81f4cda959ff89282b1d721b98cea19ba08db3dcbe6f862f28841f3cf24bb299e0b7e6c42303908f65093cb7e201708e86ea5a8dcf - languageName: node - linkType: hard - -"fs-extra@npm:^8.1.0": - version: 8.1.0 - resolution: "fs-extra@npm:8.1.0" - dependencies: - graceful-fs: ^4.2.0 - jsonfile: ^4.0.0 - universalify: ^0.1.0 - checksum: bf44f0e6cea59d5ce071bba4c43ca76d216f89e402dc6285c128abc0902e9b8525135aa808adad72c9d5d218e9f4bcc63962815529ff2f684ad532172a284880 - languageName: node - linkType: hard - -"fs-minipass@npm:^2.0.0": - version: 2.1.0 - resolution: "fs-minipass@npm:2.1.0" - dependencies: - minipass: ^3.0.0 - checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1 - languageName: node - linkType: hard - -"fs-minipass@npm:^3.0.0": - version: 3.0.3 - resolution: "fs-minipass@npm:3.0.3" - dependencies: - minipass: ^7.0.3 - checksum: 8722a41109130851d979222d3ec88aabaceeaaf8f57b2a8f744ef8bd2d1ce95453b04a61daa0078822bc5cd21e008814f06fe6586f56fef511e71b8d2394d802 - languageName: node - linkType: hard - -"fs-readdir-recursive@npm:^1.1.0": - version: 1.1.0 - resolution: "fs-readdir-recursive@npm:1.1.0" - checksum: 29d50f3d2128391c7fc9fd051c8b7ea45bcc8aa84daf31ef52b17218e20bfd2bd34d02382742801954cc8d1905832b68227f6b680a666ce525d8b6b75068ad1e - languageName: node - linkType: hard - -"fs.realpath@npm:^1.0.0": - version: 1.0.0 - resolution: "fs.realpath@npm:1.0.0" - checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 - languageName: node - linkType: hard - -"fsevents@npm:~2.3.2": - version: 2.3.3 - resolution: "fsevents@npm:2.3.3" - dependencies: - node-gyp: latest - checksum: 11e6ea6fea15e42461fc55b4b0e4a0a3c654faa567f1877dbd353f39156f69def97a69936d1746619d656c4b93de2238bf731f6085a03a50cabf287c9d024317 - conditions: os=darwin - languageName: node - linkType: hard - -"fsevents@patch:fsevents@~2.3.2#~builtin": - version: 2.3.3 - resolution: "fsevents@patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=18f3a7" - dependencies: - node-gyp: latest - conditions: os=darwin - languageName: node - linkType: hard - -"function-bind@npm:^1.1.2": - version: 1.1.2 - resolution: "function-bind@npm:1.1.2" - checksum: 2b0ff4ce708d99715ad14a6d1f894e2a83242e4a52ccfcefaee5e40050562e5f6dafc1adbb4ce2d4ab47279a45dc736ab91ea5042d843c3c092820dfe032efb1 - languageName: node - linkType: hard - -"functional-red-black-tree@npm:^1.0.1": - version: 1.0.1 - resolution: "functional-red-black-tree@npm:1.0.1" - checksum: ca6c170f37640e2d94297da8bb4bf27a1d12bea3e00e6a3e007fd7aa32e37e000f5772acf941b4e4f3cf1c95c3752033d0c509af157ad8f526e7f00723b9eb9f - languageName: node - linkType: hard - -"get-caller-file@npm:^2.0.5": - version: 2.0.5 - resolution: "get-caller-file@npm:2.0.5" - checksum: b9769a836d2a98c3ee734a88ba712e62703f1df31b94b784762c433c27a386dd6029ff55c2a920c392e33657d80191edbf18c61487e198844844516f843496b9 - languageName: node - linkType: hard - -"get-func-name@npm:^2.0.1, get-func-name@npm:^2.0.2": - version: 2.0.2 - resolution: "get-func-name@npm:2.0.2" - checksum: 3f62f4c23647de9d46e6f76d2b3eafe58933a9b3830c60669e4180d6c601ce1b4aa310ba8366143f55e52b139f992087a9f0647274e8745621fa2af7e0acf13b - languageName: node - linkType: hard - -"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.4": - version: 1.2.4 - resolution: "get-intrinsic@npm:1.2.4" - 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 - checksum: 414e3cdf2c203d1b9d7d33111df746a4512a1aa622770b361dadddf8ed0b5aeb26c560f49ca077e24bfafb0acb55ca908d1f709216ccba33ffc548ec8a79a951 - languageName: node - linkType: hard - -"get-port@npm:^3.1.0": - version: 3.2.0 - resolution: "get-port@npm:3.2.0" - checksum: 31f530326569683ac4b7452eb7573c40e9dbe52aec14d80745c35475261e6389160da153d5b8ae911150b4ce99003472b30c69ba5be0cedeaa7865b95542d168 - languageName: node - linkType: hard - -"get-stream@npm:^6.0.0, get-stream@npm:^6.0.1": - version: 6.0.1 - resolution: "get-stream@npm:6.0.1" - checksum: e04ecece32c92eebf5b8c940f51468cd53554dcbb0ea725b2748be583c9523d00128137966afce410b9b051eb2ef16d657cd2b120ca8edafcf5a65e81af63cad - languageName: node - linkType: hard - -"ghost-testrpc@npm:^0.0.2": - version: 0.0.2 - resolution: "ghost-testrpc@npm:0.0.2" - dependencies: - chalk: ^2.4.2 - node-emoji: ^1.10.0 - bin: - testrpc-sc: ./index.js - checksum: 3f86326d32f5e96c9356381837edde7dd0f23dcb7223aa73e02816256b84703cb76ce922987054a05b65963326088e99a4aa142d4b467ddda7c28547ed915d6d - languageName: node - linkType: hard - -"git-raw-commits@npm:^2.0.11": - version: 2.0.11 - resolution: "git-raw-commits@npm:2.0.11" - dependencies: - dargs: ^7.0.0 - lodash: ^4.17.15 - meow: ^8.0.0 - split2: ^3.0.0 - through2: ^4.0.0 - bin: - git-raw-commits: cli.js - checksum: c178af43633684106179793b6e3473e1d2bb50bb41d04e2e285ea4eef342ca4090fee6bc8a737552fde879d22346c90de5c49f18c719a0f38d4c934f258a0f79 - languageName: node - linkType: hard - -"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": - version: 5.1.2 - resolution: "glob-parent@npm:5.1.2" - dependencies: - is-glob: ^4.0.1 - checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e - languageName: node - linkType: hard - -"glob-parent@npm:^6.0.2": - version: 6.0.2 - resolution: "glob-parent@npm:6.0.2" - dependencies: - is-glob: ^4.0.3 - checksum: c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8 - languageName: node - linkType: hard - -"glob@npm:7.1.7": - version: 7.1.7 - resolution: "glob@npm:7.1.7" - 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 - checksum: b61f48973bbdcf5159997b0874a2165db572b368b931135832599875919c237fc05c12984e38fe828e69aa8a921eb0e8a4997266211c517c9cfaae8a93988bb8 - languageName: node - linkType: hard - -"glob@npm:7.2.0": - version: 7.2.0 - resolution: "glob@npm:7.2.0" - 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 - checksum: 78a8ea942331f08ed2e055cb5b9e40fe6f46f579d7fd3d694f3412fe5db23223d29b7fee1575440202e9a7ff9a72ab106a39fee39934c7bedafe5e5f8ae20134 - languageName: node - linkType: hard - -"glob@npm:7.2.3, glob@npm:^7.0.0, glob@npm:^7.1.2, glob@npm:^7.1.3": - version: 7.2.3 - resolution: "glob@npm:7.2.3" - 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 - checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 - languageName: node - linkType: hard - -"glob@npm:^10.2.2, glob@npm:^10.3.10": - version: 10.4.5 - resolution: "glob@npm:10.4.5" - dependencies: - foreground-child: ^3.1.0 - jackspeak: ^3.1.2 - minimatch: ^9.0.4 - minipass: ^7.1.2 - package-json-from-dist: ^1.0.0 - path-scurry: ^1.11.1 - bin: - glob: dist/esm/bin.mjs - checksum: 0bc725de5e4862f9f387fd0f2b274baf16850dcd2714502ccf471ee401803997983e2c05590cb65f9675a3c6f2a58e7a53f9e365704108c6ad3cbf1d60934c4a - languageName: node - linkType: hard - -"glob@npm:^5.0.15": - version: 5.0.15 - resolution: "glob@npm:5.0.15" - dependencies: - inflight: ^1.0.4 - inherits: 2 - minimatch: 2 || 3 - once: ^1.3.0 - path-is-absolute: ^1.0.0 - checksum: f9742448303460672607e569457f1b57e486a79a985e269b69465834d2075b243378225f65dc54c09fcd4b75e4fb34442aec88f33f8c65fa4abccc8ee2dc2f5d - languageName: node - linkType: hard - -"glob@npm:^8.0.3, glob@npm:^8.1.0": - version: 8.1.0 - resolution: "glob@npm:8.1.0" - dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^5.0.1 - once: ^1.3.0 - checksum: 92fbea3221a7d12075f26f0227abac435de868dd0736a17170663783296d0dd8d3d532a5672b4488a439bf5d7fb85cdd07c11185d6cd39184f0385cbdfb86a47 - languageName: node - linkType: hard - -"global-directory@npm:^4.0.1": - version: 4.0.1 - resolution: "global-directory@npm:4.0.1" - dependencies: - ini: 4.1.1 - checksum: 5b4df24438a4e5f21e43fbdd9e54f5e12bb48dce01a0a83b415d8052ce91be2d3a97e0c8f98a535e69649b2190036155e9f0f7d3c62f9318f31bdc3fd4f235f5 - languageName: node - linkType: hard - -"global-dirs@npm:^0.1.1": - version: 0.1.1 - resolution: "global-dirs@npm:0.1.1" - dependencies: - ini: ^1.3.4 - checksum: 10624f5a8ddb8634c22804c6b24f93fb591c3639a6bc78e3584e01a238fc6f7b7965824184e57d63f6df36980b6c191484ad7bc6c35a1599b8f1d64be64c2a4a - languageName: node - linkType: hard - -"global-modules@npm:^1.0.0": - version: 1.0.0 - resolution: "global-modules@npm:1.0.0" - dependencies: - global-prefix: ^1.0.1 - is-windows: ^1.0.1 - resolve-dir: ^1.0.0 - checksum: 10be68796c1e1abc1e2ba87ec4ea507f5629873b119ab0cd29c07284ef2b930f1402d10df01beccb7391dedd9cd479611dd6a24311c71be58937beaf18edf85e - languageName: node - linkType: hard - -"global-modules@npm:^2.0.0": - version: 2.0.0 - resolution: "global-modules@npm:2.0.0" - dependencies: - global-prefix: ^3.0.0 - checksum: d6197f25856c878c2fb5f038899f2dca7cbb2f7b7cf8999660c0104972d5cfa5c68b5a0a77fa8206bb536c3903a4615665acb9709b4d80846e1bb47eaef65430 - languageName: node - linkType: hard - -"global-prefix@npm:^1.0.1": - version: 1.0.2 - resolution: "global-prefix@npm:1.0.2" - dependencies: - expand-tilde: ^2.0.2 - homedir-polyfill: ^1.0.1 - ini: ^1.3.4 - is-windows: ^1.0.1 - which: ^1.2.14 - checksum: 061b43470fe498271bcd514e7746e8a8535032b17ab9570517014ae27d700ff0dca749f76bbde13ba384d185be4310d8ba5712cb0e74f7d54d59390db63dd9a0 - languageName: node - linkType: hard - -"global-prefix@npm:^3.0.0": - version: 3.0.0 - resolution: "global-prefix@npm:3.0.0" - dependencies: - ini: ^1.3.5 - kind-of: ^6.0.2 - which: ^1.3.1 - checksum: 8a82fc1d6f22c45484a4e34656cc91bf021a03e03213b0035098d605bfc612d7141f1e14a21097e8a0413b4884afd5b260df0b6a25605ce9d722e11f1df2881d - languageName: node - linkType: hard - -"globals@npm:^11.1.0": - version: 11.12.0 - resolution: "globals@npm:11.12.0" - checksum: 67051a45eca3db904aee189dfc7cd53c20c7d881679c93f6146ddd4c9f4ab2268e68a919df740d39c71f4445d2b38ee360fc234428baea1dbdfe68bbcb46979e - languageName: node - linkType: hard - -"globals@npm:^13.19.0": - version: 13.24.0 - resolution: "globals@npm:13.24.0" - dependencies: - type-fest: ^0.20.2 - checksum: 56066ef058f6867c04ff203b8a44c15b038346a62efbc3060052a1016be9f56f4cf0b2cd45b74b22b81e521a889fc7786c73691b0549c2f3a6e825b3d394f43c - languageName: node - linkType: hard - -"globby@npm:^10.0.1": - version: 10.0.2 - resolution: "globby@npm:10.0.2" - dependencies: - "@types/glob": ^7.1.1 - array-union: ^2.1.0 - dir-glob: ^3.0.1 - fast-glob: ^3.0.3 - glob: ^7.1.3 - ignore: ^5.1.1 - merge2: ^1.2.3 - slash: ^3.0.0 - checksum: 167cd067f2cdc030db2ec43232a1e835fa06217577d545709dbf29fd21631b30ff8258705172069c855dc4d5766c3b2690834e35b936fbff01ad0329fb95a26f - languageName: node - linkType: hard - -"globby@npm:^11.1.0": - version: 11.1.0 - resolution: "globby@npm:11.1.0" - 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 - checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 - languageName: node - linkType: hard - -"gopd@npm:^1.0.1": - version: 1.0.1 - resolution: "gopd@npm:1.0.1" - dependencies: - get-intrinsic: ^1.1.3 - checksum: a5ccfb8806e0917a94e0b3de2af2ea4979c1da920bc381667c260e00e7cafdbe844e2cb9c5bcfef4e5412e8bf73bab837285bc35c7ba73aaaf0134d4583393a6 - languageName: node - linkType: hard - -"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.1.9, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6": - version: 4.2.11 - resolution: "graceful-fs@npm:4.2.11" - checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 - languageName: node - linkType: hard - -"graphemer@npm:^1.4.0": - version: 1.4.0 - resolution: "graphemer@npm:1.4.0" - checksum: bab8f0be9b568857c7bec9fda95a89f87b783546d02951c40c33f84d05bb7da3fd10f863a9beb901463669b6583173a8c8cc6d6b306ea2b9b9d5d3d943c3a673 - languageName: node - linkType: hard - -"handlebars@npm:^4.0.1": - version: 4.7.8 - resolution: "handlebars@npm:4.7.8" - dependencies: - minimist: ^1.2.5 - neo-async: ^2.6.2 - source-map: ^0.6.1 - uglify-js: ^3.1.4 - wordwrap: ^1.0.0 - dependenciesMeta: - uglify-js: - optional: true - bin: - handlebars: bin/handlebars - checksum: 00e68bb5c183fd7b8b63322e6234b5ac8fbb960d712cb3f25587d559c2951d9642df83c04a1172c918c41bcfc81bfbd7a7718bbce93b893e0135fc99edea93ff - languageName: node - linkType: hard - -"hard-rejection@npm:^2.1.0": - version: 2.1.0 - resolution: "hard-rejection@npm:2.1.0" - checksum: 7baaf80a0c7fff4ca79687b4060113f1529589852152fa935e6787a2bc96211e784ad4588fb3048136ff8ffc9dfcf3ae385314a5b24db32de20bea0d1597f9dc - languageName: node - linkType: hard - -"hardhat-change-network@npm:^0.0.7": - version: 0.0.7 - resolution: "hardhat-change-network@npm:0.0.7" - peerDependencies: - hardhat: ^2.0.0 - checksum: 3cdda51abd45851be3335faa34ac2a54fe304628492a834fcd36ccf476d78ba8df0b4648ef0d93223ac65c24060998408681b5892e968b825784df62da47f402 - languageName: node - linkType: hard - -"hardhat-deploy@npm:^0.11.31": - version: 0.11.45 - resolution: "hardhat-deploy@npm:0.11.45" - dependencies: - "@ethersproject/abi": ^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/contracts": ^5.7.0 - "@ethersproject/providers": ^5.7.2 - "@ethersproject/solidity": ^5.7.0 - "@ethersproject/transactions": ^5.7.0 - "@ethersproject/wallet": ^5.7.0 - "@types/qs": ^6.9.7 - axios: ^0.21.1 - chalk: ^4.1.2 - chokidar: ^3.5.2 - debug: ^4.3.2 - enquirer: ^2.3.6 - ethers: ^5.7.0 - form-data: ^4.0.0 - fs-extra: ^10.0.0 - match-all: ^1.2.6 - murmur-128: ^0.2.1 - qs: ^6.9.4 - zksync-web3: ^0.14.3 - checksum: 7ecce33c3305857bdd1873a25d391e27ae9f581df75757035cb028ace7bb5fbb83f053435e843bc3d925e7fd8412c3dc582797fe5b4bbe1fef7f3dd989a7c878 - languageName: node - linkType: hard - -"hardhat-gas-reporter@npm:^1.0.9": - version: 1.0.10 - resolution: "hardhat-gas-reporter@npm:1.0.10" - dependencies: - array-uniq: 1.0.3 - eth-gas-reporter: ^0.2.25 - sha1: ^1.1.1 - peerDependencies: - hardhat: ^2.0.2 - checksum: caaec13ab3fcda47b8768257e4416b5fd0e8ef3aca5369aa8195419d3d4a948cc182075333651df44215cfc629d088f5ed9f762c8c14ae5a4b4a4f2613e583d0 - languageName: node - linkType: hard - -"hardhat@npm:2.19.4": - version: 2.19.4 - resolution: "hardhat@npm:2.19.4" - dependencies: - "@ethersproject/abi": ^5.1.2 - "@metamask/eth-sig-util": ^4.0.0 - "@nomicfoundation/ethereumjs-block": 5.0.2 - "@nomicfoundation/ethereumjs-blockchain": 7.0.2 - "@nomicfoundation/ethereumjs-common": 4.0.2 - "@nomicfoundation/ethereumjs-evm": 2.0.2 - "@nomicfoundation/ethereumjs-rlp": 5.0.2 - "@nomicfoundation/ethereumjs-statemanager": 2.0.2 - "@nomicfoundation/ethereumjs-trie": 6.0.2 - "@nomicfoundation/ethereumjs-tx": 5.0.2 - "@nomicfoundation/ethereumjs-util": 9.0.2 - "@nomicfoundation/ethereumjs-vm": 7.0.2 - "@nomicfoundation/solidity-analyzer": ^0.1.0 - "@sentry/node": ^5.18.1 - "@types/bn.js": ^5.1.0 - "@types/lru-cache": ^5.1.0 - adm-zip: ^0.4.16 - aggregate-error: ^3.0.0 - ansi-escapes: ^4.3.0 - chalk: ^2.4.2 - chokidar: ^3.4.0 - ci-info: ^2.0.0 - debug: ^4.1.1 - enquirer: ^2.3.0 - env-paths: ^2.2.0 - ethereum-cryptography: ^1.0.3 - ethereumjs-abi: ^0.6.8 - find-up: ^2.1.0 - fp-ts: 1.19.3 - fs-extra: ^7.0.1 - glob: 7.2.0 - immutable: ^4.0.0-rc.12 - io-ts: 1.10.4 - keccak: ^3.0.2 - lodash: ^4.17.11 - mnemonist: ^0.38.0 - mocha: ^10.0.0 - p-map: ^4.0.0 - raw-body: ^2.4.1 - resolve: 1.17.0 - semver: ^6.3.0 - solc: 0.7.3 - source-map-support: ^0.5.13 - stacktrace-parser: ^0.1.10 - tsort: 0.0.1 - undici: ^5.14.0 - uuid: ^8.3.2 - ws: ^7.4.6 - peerDependencies: - ts-node: "*" - typescript: "*" - peerDependenciesMeta: - ts-node: - optional: true - typescript: - optional: true - bin: - hardhat: internal/cli/bootstrap.js - checksum: 05dcaeab5bb641e74426ad47acfda903dcd3fd229b0d30f45b9de1d3c54fe6364161f3c88517984233d18f5b9294a050500ca7336b6ca069fa259fede6f5acb1 - languageName: node - linkType: hard - -"has-flag@npm:^1.0.0": - version: 1.0.0 - resolution: "has-flag@npm:1.0.0" - checksum: ce3f8ae978e70f16e4bbe17d3f0f6d6c0a3dd3b62a23f97c91d0fda9ed8e305e13baf95cc5bee4463b9f25ac9f5255de113165c5fb285e01b8065b2ac079b301 - languageName: node - linkType: hard - -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b - languageName: node - linkType: hard - -"has-flag@npm:^4.0.0": - version: 4.0.0 - resolution: "has-flag@npm:4.0.0" - checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad - languageName: node - linkType: hard - -"has-property-descriptors@npm:^1.0.2": - version: 1.0.2 - resolution: "has-property-descriptors@npm:1.0.2" - dependencies: - es-define-property: ^1.0.0 - checksum: fcbb246ea2838058be39887935231c6d5788babed499d0e9d0cc5737494c48aba4fe17ba1449e0d0fbbb1e36175442faa37f9c427ae357d6ccb1d895fbcd3de3 - languageName: node - linkType: hard - -"has-proto@npm:^1.0.1": - version: 1.0.3 - resolution: "has-proto@npm:1.0.3" - checksum: fe7c3d50b33f50f3933a04413ed1f69441d21d2d2944f81036276d30635cad9279f6b43bc8f32036c31ebdfcf6e731150f46c1907ad90c669ffe9b066c3ba5c4 - languageName: node - linkType: hard - -"has-symbols@npm:^1.0.3": - version: 1.0.3 - resolution: "has-symbols@npm:1.0.3" - checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 - languageName: node - linkType: hard - -"hash-base@npm:^3.0.0": - version: 3.1.0 - resolution: "hash-base@npm:3.1.0" - dependencies: - inherits: ^2.0.4 - readable-stream: ^3.6.0 - safe-buffer: ^5.2.0 - checksum: 26b7e97ac3de13cb23fc3145e7e3450b0530274a9562144fc2bf5c1e2983afd0e09ed7cc3b20974ba66039fad316db463da80eb452e7373e780cbee9a0d2f2dc - languageName: node - linkType: hard - -"hash.js@npm:1.1.7, hash.js@npm:^1.0.0, hash.js@npm:^1.0.3, hash.js@npm:^1.1.7": - version: 1.1.7 - resolution: "hash.js@npm:1.1.7" - dependencies: - inherits: ^2.0.3 - minimalistic-assert: ^1.0.1 - checksum: e350096e659c62422b85fa508e4b3669017311aa4c49b74f19f8e1bc7f3a54a584fdfd45326d4964d6011f2b2d882e38bea775a96046f2a61b7779a979629d8f - languageName: node - linkType: hard - -"hasown@npm:^2.0.0, hasown@npm:^2.0.2": - version: 2.0.2 - resolution: "hasown@npm:2.0.2" - dependencies: - function-bind: ^1.1.2 - checksum: e8516f776a15149ca6c6ed2ae3110c417a00b62260e222590e54aa367cbcd6ed99122020b37b7fbdf05748df57b265e70095d7bf35a47660587619b15ffb93db - languageName: node - linkType: hard - -"he@npm:^1.2.0": - version: 1.2.0 - resolution: "he@npm:1.2.0" - bin: - he: bin/he - checksum: 3d4d6babccccd79c5c5a3f929a68af33360d6445587d628087f39a965079d84f18ce9c3d3f917ee1e3978916fc833bb8b29377c3b403f919426f91bc6965e7a7 - languageName: node - linkType: hard - -"heap@npm:>= 0.2.0": - version: 0.2.7 - resolution: "heap@npm:0.2.7" - checksum: b0f3963a799e02173f994c452921a777f2b895b710119df999736bfed7477235c2860c423d9aea18a9f3b3d065cb1114d605c208cfcb8d0ac550f97ec5d28cb0 - languageName: node - linkType: hard - -"hmac-drbg@npm:^1.0.1": - version: 1.0.1 - resolution: "hmac-drbg@npm:1.0.1" - dependencies: - hash.js: ^1.0.3 - minimalistic-assert: ^1.0.0 - minimalistic-crypto-utils: ^1.0.1 - checksum: bd30b6a68d7f22d63f10e1888aee497d7c2c5c0bb469e66bbdac99f143904d1dfe95f8131f95b3e86c86dd239963c9d972fcbe147e7cffa00e55d18585c43fe0 - languageName: node - linkType: hard - -"homedir-polyfill@npm:^1.0.1": - version: 1.0.3 - resolution: "homedir-polyfill@npm:1.0.3" - dependencies: - parse-passwd: ^1.0.0 - checksum: 18dd4db87052c6a2179d1813adea0c4bfcfa4f9996f0e226fefb29eb3d548e564350fa28ec46b0bf1fbc0a1d2d6922ceceb80093115ea45ff8842a4990139250 - languageName: node - linkType: hard - -"hosted-git-info@npm:^2.1.4": - version: 2.8.9 - resolution: "hosted-git-info@npm:2.8.9" - checksum: c955394bdab888a1e9bb10eb33029e0f7ce5a2ac7b3f158099dc8c486c99e73809dca609f5694b223920ca2174db33d32b12f9a2a47141dc59607c29da5a62dd - languageName: node - linkType: hard - -"hosted-git-info@npm:^4.0.1": - version: 4.1.0 - resolution: "hosted-git-info@npm:4.1.0" - dependencies: - lru-cache: ^6.0.0 - checksum: c3f87b3c2f7eb8c2748c8f49c0c2517c9a95f35d26f4bf54b2a8cba05d2e668f3753548b6ea366b18ec8dadb4e12066e19fa382a01496b0ffa0497eb23cbe461 - languageName: node - linkType: hard - -"http-basic@npm:^8.1.1": - version: 8.1.3 - resolution: "http-basic@npm:8.1.3" - dependencies: - caseless: ^0.12.0 - concat-stream: ^1.6.2 - http-response-object: ^3.0.1 - parse-cache-control: ^1.0.1 - checksum: 7df5dc4d4b6eb8cc3beaa77f8e5c3074288ec3835abd83c85e5bb66d8a95a0ef97664d862caf5e225698cb795f78f9a5abd0d39404e5356ccd3e5e10c87936a5 - languageName: node - linkType: hard - -"http-cache-semantics@npm:^4.1.1": - version: 4.1.1 - resolution: "http-cache-semantics@npm:4.1.1" - checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236 - languageName: node - linkType: hard - -"http-errors@npm:2.0.0": - version: 2.0.0 - resolution: "http-errors@npm:2.0.0" - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - checksum: 9b0a3782665c52ce9dc658a0d1560bcb0214ba5699e4ea15aefb2a496e2ca83db03ebc42e1cce4ac1f413e4e0d2d736a3fd755772c556a9a06853ba2a0b7d920 - languageName: node - linkType: hard - -"http-proxy-agent@npm:^7.0.0": - version: 7.0.2 - resolution: "http-proxy-agent@npm:7.0.2" - dependencies: - agent-base: ^7.1.0 - debug: ^4.3.4 - checksum: 670858c8f8f3146db5889e1fa117630910101db601fff7d5a8aa637da0abedf68c899f03d3451cac2f83bcc4c3d2dabf339b3aa00ff8080571cceb02c3ce02f3 - languageName: node - linkType: hard - -"http-response-object@npm:^3.0.1": - version: 3.0.2 - resolution: "http-response-object@npm:3.0.2" - dependencies: - "@types/node": ^10.0.3 - checksum: 6cbdcb4ce7b27c9158a131b772c903ed54add2ba831e29cc165e91c3969fa6f8105ddf924aac5b954b534ad15a1ae697b693331b2be5281ee24d79aae20c3264 - languageName: node - linkType: hard - -"https-proxy-agent@npm:^5.0.0": - version: 5.0.1 - resolution: "https-proxy-agent@npm:5.0.1" - dependencies: - agent-base: 6 - debug: 4 - checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 - languageName: node - linkType: hard - -"https-proxy-agent@npm:^7.0.1": - version: 7.0.5 - resolution: "https-proxy-agent@npm:7.0.5" - dependencies: - agent-base: ^7.0.2 - debug: 4 - checksum: 2e1a28960f13b041a50702ee74f240add8e75146a5c37fc98f1960f0496710f6918b3a9fe1e5aba41e50f58e6df48d107edd9c405c5f0d73ac260dabf2210857 - languageName: node - linkType: hard - -"human-signals@npm:^2.1.0": - version: 2.1.0 - resolution: "human-signals@npm:2.1.0" - checksum: b87fd89fce72391625271454e70f67fe405277415b48bcc0117ca73d31fa23a4241787afdc8d67f5a116cf37258c052f59ea82daffa72364d61351423848e3b8 - languageName: node - linkType: hard - -"human-signals@npm:^4.3.0": - version: 4.3.1 - resolution: "human-signals@npm:4.3.1" - checksum: 6f12958df3f21b6fdaf02d90896c271df00636a31e2bbea05bddf817a35c66b38a6fdac5863e2df85bd52f34958997f1f50350ff97249e1dff8452865d5235d1 - languageName: node - linkType: hard - -"humanize-ms@npm:^1.2.1": - version: 1.2.1 - resolution: "humanize-ms@npm:1.2.1" - dependencies: - ms: ^2.0.0 - checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16 - languageName: node - linkType: hard - -"husky@npm:^8.0.3": - version: 8.0.3 - resolution: "husky@npm:8.0.3" - bin: - husky: lib/bin.js - checksum: 837bc7e4413e58c1f2946d38fb050f5d7324c6f16b0fd66411ffce5703b294bd21429e8ba58711cd331951ee86ed529c5be4f76805959ff668a337dbfa82a1b0 - languageName: node - linkType: hard - -"iconv-lite@npm:0.4.24, iconv-lite@npm:^0.4.24": - version: 0.4.24 - resolution: "iconv-lite@npm:0.4.24" - dependencies: - safer-buffer: ">= 2.1.2 < 3" - checksum: bd9f120f5a5b306f0bc0b9ae1edeb1577161503f5f8252a20f1a9e56ef8775c9959fd01c55f2d3a39d9a8abaf3e30c1abeb1895f367dcbbe0a8fd1c9ca01c4f6 - languageName: node - linkType: hard - -"iconv-lite@npm:^0.6.2": - version: 0.6.3 - resolution: "iconv-lite@npm:0.6.3" - dependencies: - safer-buffer: ">= 2.1.2 < 3.0.0" - checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf - languageName: node - linkType: hard - -"ieee754@npm:^1.1.13, ieee754@npm:^1.2.1": - version: 1.2.1 - resolution: "ieee754@npm:1.2.1" - checksum: 5144c0c9815e54ada181d80a0b810221a253562422e7c6c3a60b1901154184f49326ec239d618c416c1c5945a2e197107aee8d986a3dd836b53dffefd99b5e7e - languageName: node - linkType: hard - -"ignore-by-default@npm:^1.0.1": - version: 1.0.1 - resolution: "ignore-by-default@npm:1.0.1" - checksum: 441509147b3615e0365e407a3c18e189f78c07af08564176c680be1fabc94b6c789cad1342ad887175d4ecd5225de86f73d376cec8e06b42fd9b429505ffcf8a - languageName: node - linkType: hard - -"ignore@npm:^5.1.1, ignore@npm:^5.2.0, ignore@npm:^5.2.4": - version: 5.3.2 - resolution: "ignore@npm:5.3.2" - checksum: 2acfd32a573260ea522ea0bfeff880af426d68f6831f973129e2ba7363f422923cf53aab62f8369cbf4667c7b25b6f8a3761b34ecdb284ea18e87a5262a865be - languageName: node - linkType: hard - -"immutable@npm:^4.0.0-rc.12": - version: 4.3.7 - resolution: "immutable@npm:4.3.7" - checksum: 1c50eb053bb300796551604afff554066f041aa8e15926cf98f6d11d9736b62ad12531c06515dd96375258653878b4736f8051cd20b640f5f976d09fa640e3ec - languageName: node - linkType: hard - -"import-fresh@npm:^3.0.0, import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0": - version: 3.3.0 - resolution: "import-fresh@npm:3.3.0" - dependencies: - parent-module: ^1.0.0 - resolve-from: ^4.0.0 - checksum: 2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa - languageName: node - linkType: hard - -"import-meta-resolve@npm:^4.0.0": - version: 4.1.0 - resolution: "import-meta-resolve@npm:4.1.0" - checksum: 6497af27bf3ee384ad4efd4e0ec3facf9a114863f35a7b35f248659f32faa5e1ae07baa74d603069f35734ae3718a78b3f66926f98dc9a62e261e7df37854a62 - languageName: node - linkType: hard - -"imul@npm:^1.0.0": - version: 1.0.1 - resolution: "imul@npm:1.0.1" - checksum: 6c2af3d5f09e2135e14d565a2c108412b825b221eb2c881f9130467f2adccf7ae201773ae8bcf1be169e2d090567a1fdfa9cf20d3b7da7b9cecb95b920ff3e52 - languageName: node - linkType: hard - -"imurmurhash@npm:^0.1.4": - version: 0.1.4 - resolution: "imurmurhash@npm:0.1.4" - checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 - languageName: node - linkType: hard - -"indent-string@npm:^4.0.0": - version: 4.0.0 - resolution: "indent-string@npm:4.0.0" - checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 - languageName: node - linkType: hard - -"inflight@npm:^1.0.4": - version: 1.0.6 - resolution: "inflight@npm:1.0.6" - dependencies: - once: ^1.3.0 - wrappy: 1 - checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd - languageName: node - linkType: hard - -"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3": - version: 2.0.4 - resolution: "inherits@npm:2.0.4" - checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 - languageName: node - linkType: hard - -"ini@npm:4.1.1": - version: 4.1.1 - resolution: "ini@npm:4.1.1" - checksum: 0e5909554074fbc31824fa5415b0f604de4a665514c96a897a77bf77353a7ad4743927321270e9d0610a9d510ccd1f3cd77422f7cc80d8f4542dbce75476fb6d - languageName: node - linkType: hard - -"ini@npm:^1.3.4, ini@npm:^1.3.5": - version: 1.3.8 - resolution: "ini@npm:1.3.8" - checksum: dfd98b0ca3a4fc1e323e38a6c8eb8936e31a97a918d3b377649ea15bdb15d481207a0dda1021efbd86b464cae29a0d33c1d7dcaf6c5672bee17fa849bc50a1b3 - languageName: node - linkType: hard - -"inquirer@npm:8.2.5": - version: 8.2.5 - resolution: "inquirer@npm:8.2.5" - dependencies: - ansi-escapes: ^4.2.1 - chalk: ^4.1.1 - cli-cursor: ^3.1.0 - cli-width: ^3.0.0 - external-editor: ^3.0.3 - figures: ^3.0.0 - lodash: ^4.17.21 - mute-stream: 0.0.8 - ora: ^5.4.1 - run-async: ^2.4.0 - rxjs: ^7.5.5 - string-width: ^4.1.0 - strip-ansi: ^6.0.0 - through: ^2.3.6 - wrap-ansi: ^7.0.0 - checksum: f13ee4c444187786fb393609dedf6b30870115a57b603f2e6424f29a99abc13446fd45ee22461c33c9c40a92a60a8df62d0d6b25d74fc6676fa4cb211de55b55 - languageName: node - linkType: hard - -"interpret@npm:^1.0.0": - version: 1.4.0 - resolution: "interpret@npm:1.4.0" - checksum: 2e5f51268b5941e4a17e4ef0575bc91ed0ab5f8515e3cf77486f7c14d13f3010df9c0959f37063dcc96e78d12dc6b0bb1b9e111cdfe69771f4656d2993d36155 - languageName: node - linkType: hard - -"io-ts@npm:1.10.4": - version: 1.10.4 - resolution: "io-ts@npm:1.10.4" - dependencies: - fp-ts: ^1.0.0 - checksum: 619134006778f7ca42693716ade7fc1a383079e7848bbeabc67a0e4ac9139cda6b2a88a052d539ab7d554033ee2ffe4dab5cb96b958c83fee2dff73d23f03e88 - languageName: node - linkType: hard - -"ip-address@npm:^9.0.5": - version: 9.0.5 - resolution: "ip-address@npm:9.0.5" - dependencies: - jsbn: 1.1.0 - sprintf-js: ^1.1.3 - checksum: aa15f12cfd0ef5e38349744e3654bae649a34c3b10c77a674a167e99925d1549486c5b14730eebce9fea26f6db9d5e42097b00aa4f9f612e68c79121c71652dc - languageName: node - linkType: hard - -"is-arrayish@npm:^0.2.1": - version: 0.2.1 - resolution: "is-arrayish@npm:0.2.1" - checksum: eef4417e3c10e60e2c810b6084942b3ead455af16c4509959a27e490e7aee87cfb3f38e01bbde92220b528a0ee1a18d52b787e1458ee86174d8c7f0e58cd488f - languageName: node - linkType: hard - -"is-arrayish@npm:^0.3.1": - version: 0.3.2 - resolution: "is-arrayish@npm:0.3.2" - checksum: 977e64f54d91c8f169b59afcd80ff19227e9f5c791fa28fa2e5bce355cbaf6c2c356711b734656e80c9dd4a854dd7efcf7894402f1031dfc5de5d620775b4d5f - languageName: node - linkType: hard - -"is-binary-path@npm:~2.1.0": - version: 2.1.0 - resolution: "is-binary-path@npm:2.1.0" - dependencies: - binary-extensions: ^2.0.0 - checksum: 84192eb88cff70d320426f35ecd63c3d6d495da9d805b19bc65b518984b7c0760280e57dbf119b7e9be6b161784a5a673ab2c6abe83abb5198a432232ad5b35c - languageName: node - linkType: hard - -"is-buffer@npm:^2.0.5": - version: 2.0.5 - resolution: "is-buffer@npm:2.0.5" - checksum: 764c9ad8b523a9f5a32af29bdf772b08eb48c04d2ad0a7240916ac2688c983bf5f8504bf25b35e66240edeb9d9085461f9b5dae1f3d2861c6b06a65fe983de42 - languageName: node - linkType: hard - -"is-core-module@npm:^2.13.0, is-core-module@npm:^2.5.0": - version: 2.15.1 - resolution: "is-core-module@npm:2.15.1" - dependencies: - hasown: ^2.0.2 - checksum: df134c168115690724b62018c37b2f5bba0d5745fa16960b329c5a00883a8bea6a5632fdb1e3efcce237c201826ba09f93197b7cd95577ea56b0df335be23633 - languageName: node - linkType: hard - -"is-docker@npm:^2.0.0": - version: 2.2.1 - resolution: "is-docker@npm:2.2.1" - bin: - is-docker: cli.js - checksum: 3fef7ddbf0be25958e8991ad941901bf5922ab2753c46980b60b05c1bf9c9c2402d35e6dc32e4380b980ef5e1970a5d9d5e5aa2e02d77727c3b6b5e918474c56 - languageName: node - linkType: hard - -"is-extglob@npm:^2.1.1": - version: 2.1.1 - resolution: "is-extglob@npm:2.1.1" - checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^2.0.0": - version: 2.0.0 - resolution: "is-fullwidth-code-point@npm:2.0.0" - checksum: eef9c6e15f68085fec19ff6a978a6f1b8f48018fd1265035552078ee945573594933b09bbd6f562553e2a241561439f1ef5339276eba68d272001343084cfab8 - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^3.0.0": - version: 3.0.0 - resolution: "is-fullwidth-code-point@npm:3.0.0" - checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^4.0.0": - version: 4.0.0 - resolution: "is-fullwidth-code-point@npm:4.0.0" - checksum: 8ae89bf5057bdf4f57b346fb6c55e9c3dd2549983d54191d722d5c739397a903012cc41a04ee3403fd872e811243ef91a7c5196da7b5841dc6b6aae31a264a8d - languageName: node - linkType: hard - -"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": - version: 4.0.3 - resolution: "is-glob@npm:4.0.3" - dependencies: - is-extglob: ^2.1.1 - checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 - languageName: node - linkType: hard - -"is-hex-prefixed@npm:1.0.0": - version: 1.0.0 - resolution: "is-hex-prefixed@npm:1.0.0" - checksum: 5ac58e6e528fb029cc43140f6eeb380fad23d0041cc23154b87f7c9a1b728bcf05909974e47248fd0b7fcc11ba33cf7e58d64804883056fabd23e2b898be41de - languageName: node - linkType: hard - -"is-interactive@npm:^1.0.0": - version: 1.0.0 - resolution: "is-interactive@npm:1.0.0" - checksum: 824808776e2d468b2916cdd6c16acacebce060d844c35ca6d82267da692e92c3a16fdba624c50b54a63f38bdc4016055b6f443ce57d7147240de4f8cdabaf6f9 - languageName: node - linkType: hard - -"is-lambda@npm:^1.0.1": - version: 1.0.1 - resolution: "is-lambda@npm:1.0.1" - checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35 - languageName: node - linkType: hard - -"is-number@npm:^7.0.0": - version: 7.0.0 - resolution: "is-number@npm:7.0.0" - checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a - languageName: node - linkType: hard - -"is-obj@npm:^2.0.0": - version: 2.0.0 - resolution: "is-obj@npm:2.0.0" - checksum: c9916ac8f4621962a42f5e80e7ffdb1d79a3fab7456ceaeea394cd9e0858d04f985a9ace45be44433bf605673c8be8810540fe4cc7f4266fc7526ced95af5a08 - languageName: node - linkType: hard - -"is-path-inside@npm:^3.0.3": - version: 3.0.3 - resolution: "is-path-inside@npm:3.0.3" - checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 - languageName: node - linkType: hard - -"is-plain-obj@npm:^1.1.0": - version: 1.1.0 - resolution: "is-plain-obj@npm:1.1.0" - checksum: 0ee04807797aad50859652a7467481816cbb57e5cc97d813a7dcd8915da8195dc68c436010bf39d195226cde6a2d352f4b815f16f26b7bf486a5754290629931 - languageName: node - linkType: hard - -"is-plain-obj@npm:^2.1.0": - version: 2.1.0 - resolution: "is-plain-obj@npm:2.1.0" - checksum: cec9100678b0a9fe0248a81743041ed990c2d4c99f893d935545cfbc42876cbe86d207f3b895700c690ad2fa520e568c44afc1605044b535a7820c1d40e38daa - languageName: node - linkType: hard - -"is-stream@npm:^2.0.0": - version: 2.0.1 - resolution: "is-stream@npm:2.0.1" - checksum: b8e05ccdf96ac330ea83c12450304d4a591f9958c11fd17bed240af8d5ffe08aedafa4c0f4cfccd4d28dc9d4d129daca1023633d5c11601a6cbc77521f6fae66 - languageName: node - linkType: hard - -"is-stream@npm:^3.0.0": - version: 3.0.0 - resolution: "is-stream@npm:3.0.0" - checksum: 172093fe99119ffd07611ab6d1bcccfe8bc4aa80d864b15f43e63e54b7abc71e779acd69afdb854c4e2a67fdc16ae710e370eda40088d1cfc956a50ed82d8f16 - languageName: node - linkType: hard - -"is-text-path@npm:^1.0.1": - version: 1.0.1 - resolution: "is-text-path@npm:1.0.1" - dependencies: - text-extensions: ^1.0.0 - checksum: fb5d78752c22b3f73a7c9540768f765ffcfa38c9e421e2b9af869565307fa1ae5e3d3a2ba016a43549742856846566d327da406e94a5846ec838a288b1704fd2 - languageName: node - linkType: hard - -"is-unicode-supported@npm:^0.1.0": - version: 0.1.0 - resolution: "is-unicode-supported@npm:0.1.0" - checksum: a2aab86ee7712f5c2f999180daaba5f361bdad1efadc9610ff5b8ab5495b86e4f627839d085c6530363c6d6d4ecbde340fb8e54bdb83da4ba8e0865ed5513c52 - languageName: node - linkType: hard - -"is-utf8@npm:^0.2.1": - version: 0.2.1 - resolution: "is-utf8@npm:0.2.1" - checksum: 167ccd2be869fc228cc62c1a28df4b78c6b5485d15a29027d3b5dceb09b383e86a3522008b56dcac14b592b22f0a224388718c2505027a994fd8471465de54b3 - languageName: node - linkType: hard - -"is-windows@npm:^1.0.1": - version: 1.0.2 - resolution: "is-windows@npm:1.0.2" - checksum: 438b7e52656fe3b9b293b180defb4e448088e7023a523ec21a91a80b9ff8cdb3377ddb5b6e60f7c7de4fa8b63ab56e121b6705fe081b3cf1b828b0a380009ad7 - languageName: node - linkType: hard - -"is-wsl@npm:^2.1.1": - version: 2.2.0 - resolution: "is-wsl@npm:2.2.0" - dependencies: - is-docker: ^2.0.0 - checksum: 20849846ae414997d290b75e16868e5261e86ff5047f104027026fd61d8b5a9b0b3ade16239f35e1a067b3c7cc02f70183cb661010ed16f4b6c7c93dad1b19d8 - languageName: node - linkType: hard - -"isarray@npm:^2.0.5": - version: 2.0.5 - resolution: "isarray@npm:2.0.5" - checksum: bd5bbe4104438c4196ba58a54650116007fa0262eccef13a4c55b2e09a5b36b59f1e75b9fcc49883dd9d4953892e6fc007eef9e9155648ceea036e184b0f930a - languageName: node - linkType: hard - -"isarray@npm:~1.0.0": - version: 1.0.0 - resolution: "isarray@npm:1.0.0" - checksum: f032df8e02dce8ec565cf2eb605ea939bdccea528dbcf565cdf92bfa2da9110461159d86a537388ef1acef8815a330642d7885b29010e8f7eac967c9993b65ab - languageName: node - linkType: hard - -"isexe@npm:^2.0.0": - version: 2.0.0 - resolution: "isexe@npm:2.0.0" - checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 - languageName: node - linkType: hard - -"isexe@npm:^3.1.1": - version: 3.1.1 - resolution: "isexe@npm:3.1.1" - checksum: 7fe1931ee4e88eb5aa524cd3ceb8c882537bc3a81b02e438b240e47012eef49c86904d0f0e593ea7c3a9996d18d0f1f3be8d3eaa92333977b0c3a9d353d5563e - languageName: node - linkType: hard - -"isomorphic-ws@npm:^4.0.1": - version: 4.0.1 - resolution: "isomorphic-ws@npm:4.0.1" - peerDependencies: - ws: "*" - checksum: d7190eadefdc28bdb93d67b5f0c603385aaf87724fa2974abb382ac1ec9756ed2cfb27065cbe76122879c2d452e2982bc4314317f3d6c737ddda6c047328771a - languageName: node - linkType: hard - -"isows@npm:1.0.4": - version: 1.0.4 - resolution: "isows@npm:1.0.4" - peerDependencies: - ws: "*" - checksum: a3ee62e3d6216abb3adeeb2a551fe2e7835eac87b05a6ecc3e7739259bf5f8e83290501f49e26137390c8093f207fc3378d4a7653aab76ad7bbab4b2dba9c5b9 - languageName: node - linkType: hard - -"jackspeak@npm:^3.1.2": - version: 3.4.3 - resolution: "jackspeak@npm:3.4.3" - dependencies: - "@isaacs/cliui": ^8.0.2 - "@pkgjs/parseargs": ^0.11.0 - dependenciesMeta: - "@pkgjs/parseargs": - optional: true - checksum: be31027fc72e7cc726206b9f560395604b82e0fddb46c4cbf9f97d049bcef607491a5afc0699612eaa4213ca5be8fd3e1e7cd187b3040988b65c9489838a7c00 - languageName: node - linkType: hard - -"javascript-natural-sort@npm:0.7.1": - version: 0.7.1 - resolution: "javascript-natural-sort@npm:0.7.1" - checksum: 161e2c512cc7884bc055a582c6645d9032cab88497a76123d73cb23bfb03d97a04cf7772ecdb8bd3366fc07192c2f996366f479f725c23ef073fffe03d6a586a - languageName: node - linkType: hard - -"jayson@npm:^4.1.1": - version: 4.1.2 - resolution: "jayson@npm:4.1.2" - dependencies: - "@types/connect": ^3.4.33 - "@types/node": ^12.12.54 - "@types/ws": ^7.4.4 - JSONStream: ^1.3.5 - commander: ^2.20.3 - delay: ^5.0.0 - es6-promisify: ^5.0.0 - eyes: ^0.1.8 - isomorphic-ws: ^4.0.1 - json-stringify-safe: ^5.0.1 - uuid: ^8.3.2 - ws: ^7.5.10 - bin: - jayson: bin/jayson.js - checksum: 10d6a0ce55045a1098b9b0d1d9b4b898f034e70696e57240ba76d67eddaabd703e1f59477c667b57e39f6f1fc54dbb87b1327a8a4edef39a37a17b70c79bb6e4 - languageName: node - linkType: hard - -"jiti@npm:^1.19.1": - version: 1.21.6 - resolution: "jiti@npm:1.21.6" - bin: - jiti: bin/jiti.js - checksum: 9ea4a70a7bb950794824683ed1c632e2ede26949fbd348e2ba5ec8dc5efa54dc42022d85ae229cadaa60d4b95012e80ea07d625797199b688cc22ab0e8891d32 - languageName: node - linkType: hard - -"js-sdsl@npm:^4.1.4": - version: 4.4.2 - resolution: "js-sdsl@npm:4.4.2" - checksum: ba705adc1788bf3c6f6c8e5077824f2bb4f0acab5a984420ce5cc492c7fff3daddc26335ad2c9a67d4f5e3241ec790f9e5b72a625adcf20cf321d2fd85e62b8b - languageName: node - linkType: hard - -"js-sha3@npm:0.8.0, js-sha3@npm:^0.8.0": - version: 0.8.0 - resolution: "js-sha3@npm:0.8.0" - checksum: 75df77c1fc266973f06cce8309ce010e9e9f07ec35ab12022ed29b7f0d9c8757f5a73e1b35aa24840dced0dea7059085aa143d817aea9e188e2a80d569d9adce - languageName: node - linkType: hard - -"js-tokens@npm:^4.0.0": - version: 4.0.0 - resolution: "js-tokens@npm:4.0.0" - checksum: 8a95213a5a77deb6cbe94d86340e8d9ace2b93bc367790b260101d2f36a2eaf4e4e22d9fa9cf459b38af3a32fb4190e638024cf82ec95ef708680e405ea7cc78 - languageName: node - linkType: hard - -"js-yaml@npm:3.x": - version: 3.14.1 - resolution: "js-yaml@npm:3.14.1" - dependencies: - argparse: ^1.0.7 - esprima: ^4.0.0 - bin: - js-yaml: bin/js-yaml.js - checksum: bef146085f472d44dee30ec34e5cf36bf89164f5d585435a3d3da89e52622dff0b188a580e4ad091c3341889e14cb88cac6e4deb16dc5b1e9623bb0601fc255c - languageName: node - linkType: hard - -"js-yaml@npm:^4.1.0": - version: 4.1.0 - resolution: "js-yaml@npm:4.1.0" - dependencies: - argparse: ^2.0.1 - bin: - js-yaml: bin/js-yaml.js - checksum: c7830dfd456c3ef2c6e355cc5a92e6700ceafa1d14bba54497b34a99f0376cecbb3e9ac14d3e5849b426d5a5140709a66237a8c991c675431271c4ce5504151a - languageName: node - linkType: hard - -"jsbn@npm:1.1.0": - version: 1.1.0 - resolution: "jsbn@npm:1.1.0" - checksum: 944f924f2bd67ad533b3850eee47603eed0f6ae425fd1ee8c760f477e8c34a05f144c1bd4f5a5dd1963141dc79a2c55f89ccc5ab77d039e7077f3ad196b64965 - languageName: node - linkType: hard - -"jsesc@npm:^2.5.1": - version: 2.5.2 - resolution: "jsesc@npm:2.5.2" - bin: - jsesc: bin/jsesc - checksum: 4dc190771129e12023f729ce20e1e0bfceac84d73a85bc3119f7f938843fe25a4aeccb54b6494dce26fcf263d815f5f31acdefac7cc9329efb8422a4f4d9fa9d - languageName: node - linkType: hard - -"json-buffer@npm:3.0.1": - version: 3.0.1 - resolution: "json-buffer@npm:3.0.1" - checksum: 9026b03edc2847eefa2e37646c579300a1f3a4586cfb62bf857832b60c852042d0d6ae55d1afb8926163fa54c2b01d83ae24705f34990348bdac6273a29d4581 - languageName: node - linkType: hard - -"json-parse-even-better-errors@npm:^2.3.0": - version: 2.3.1 - resolution: "json-parse-even-better-errors@npm:2.3.1" - checksum: 798ed4cf3354a2d9ccd78e86d2169515a0097a5c133337807cdf7f1fc32e1391d207ccfc276518cc1d7d8d4db93288b8a50ba4293d212ad1336e52a8ec0a941f - languageName: node - linkType: hard - -"json-schema-traverse@npm:^0.4.1": - version: 0.4.1 - resolution: "json-schema-traverse@npm:0.4.1" - checksum: 7486074d3ba247769fda17d5181b345c9fb7d12e0da98b22d1d71a5db9698d8b4bd900a3ec1a4ffdd60846fc2556274a5c894d0c48795f14cb03aeae7b55260b - languageName: node - linkType: hard - -"json-schema-traverse@npm:^1.0.0": - version: 1.0.0 - resolution: "json-schema-traverse@npm:1.0.0" - checksum: 02f2f466cdb0362558b2f1fd5e15cce82ef55d60cd7f8fa828cf35ba74330f8d767fcae5c5c2adb7851fa811766c694b9405810879bc4e1ddd78a7c0e03658ad - languageName: node - linkType: hard - -"json-stable-stringify-without-jsonify@npm:^1.0.1": - version: 1.0.1 - resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" - checksum: cff44156ddce9c67c44386ad5cddf91925fe06b1d217f2da9c4910d01f358c6e3989c4d5a02683c7a5667f9727ff05831f7aa8ae66c8ff691c556f0884d49215 - languageName: node - linkType: hard - -"json-stable-stringify@npm:^1.0.2": - version: 1.1.1 - resolution: "json-stable-stringify@npm:1.1.1" - dependencies: - call-bind: ^1.0.5 - isarray: ^2.0.5 - jsonify: ^0.0.1 - object-keys: ^1.1.1 - checksum: e1ba06600fd278767eeff53f28e408e29c867e79abf564e7aadc3ce8f31f667258f8db278ef28831e45884dd687388fa1910f46e599fc19fb94c9afbbe3a4de8 - languageName: node - linkType: hard - -"json-stringify-safe@npm:^5.0.1": - version: 5.0.1 - resolution: "json-stringify-safe@npm:5.0.1" - checksum: 48ec0adad5280b8a96bb93f4563aa1667fd7a36334f79149abd42446d0989f2ddc58274b479f4819f1f00617957e6344c886c55d05a4e15ebb4ab931e4a6a8ee - languageName: node - linkType: hard - -"jsonfile@npm:^2.1.0": - version: 2.4.0 - resolution: "jsonfile@npm:2.4.0" - dependencies: - graceful-fs: ^4.1.6 - dependenciesMeta: - graceful-fs: - optional: true - checksum: f5064aabbc9e35530dc471d8b203ae1f40dbe949ddde4391c6f6a6d310619a15f0efdae5587df594d1d70c555193aaeee9d2ed4aec9ffd5767bd5e4e62d49c3d - languageName: node - linkType: hard - -"jsonfile@npm:^4.0.0": - version: 4.0.0 - resolution: "jsonfile@npm:4.0.0" - dependencies: - graceful-fs: ^4.1.6 - dependenciesMeta: - graceful-fs: - optional: true - checksum: 6447d6224f0d31623eef9b51185af03ac328a7553efcee30fa423d98a9e276ca08db87d71e17f2310b0263fd3ffa6c2a90a6308367f661dc21580f9469897c9e - languageName: node - linkType: hard - -"jsonfile@npm:^6.0.1": - version: 6.1.0 - resolution: "jsonfile@npm:6.1.0" - dependencies: - graceful-fs: ^4.1.6 - universalify: ^2.0.0 - dependenciesMeta: - graceful-fs: - optional: true - checksum: 7af3b8e1ac8fe7f1eccc6263c6ca14e1966fcbc74b618d3c78a0a2075579487547b94f72b7a1114e844a1e15bb00d440e5d1720bfc4612d790a6f285d5ea8354 - languageName: node - linkType: hard - -"jsonify@npm:^0.0.1": - version: 0.0.1 - resolution: "jsonify@npm:0.0.1" - checksum: 027287e1c0294fce15f18c0ff990cfc2318e7f01fb76515f784d5cd0784abfec6fc5c2355c3a2f2cb0ad7f4aa2f5b74ebbfe4e80476c35b2d13cabdb572e1134 - languageName: node - linkType: hard - -"jsonparse@npm:^1.2.0": - version: 1.3.1 - resolution: "jsonparse@npm:1.3.1" - checksum: 6514a7be4674ebf407afca0eda3ba284b69b07f9958a8d3113ef1005f7ec610860c312be067e450c569aab8b89635e332cee3696789c750692bb60daba627f4d - languageName: node - linkType: hard - -"jsonschema@npm:^1.2.4": - version: 1.4.1 - resolution: "jsonschema@npm:1.4.1" - checksum: 1ef02a6cd9bc32241ec86bbf1300bdbc3b5f2d8df6eb795517cf7d1cd9909e7beba1e54fdf73990fd66be98a182bda9add9607296b0cb00b1348212988e424b2 - languageName: node - linkType: hard - -"keccak@npm:^3.0.0, keccak@npm:^3.0.2": - version: 3.0.4 - resolution: "keccak@npm:3.0.4" - dependencies: - node-addon-api: ^2.0.0 - node-gyp: latest - node-gyp-build: ^4.2.0 - readable-stream: ^3.6.0 - checksum: 2bf27b97b2f24225b1b44027de62be547f5c7326d87d249605665abd0c8c599d774671c35504c62c9b922cae02758504c6f76a73a84234d23af8a2211afaaa11 - languageName: node - linkType: hard - -"keyv@npm:^4.5.3": - version: 4.5.4 - resolution: "keyv@npm:4.5.4" - dependencies: - json-buffer: 3.0.1 - checksum: 74a24395b1c34bd44ad5cb2b49140d087553e170625240b86755a6604cd65aa16efdbdeae5cdb17ba1284a0fbb25ad06263755dbc71b8d8b06f74232ce3cdd72 - languageName: node - linkType: hard - -"kind-of@npm:^6.0.2, kind-of@npm:^6.0.3": - version: 6.0.3 - resolution: "kind-of@npm:6.0.3" - checksum: 3ab01e7b1d440b22fe4c31f23d8d38b4d9b91d9f291df683476576493d5dfd2e03848a8b05813dd0c3f0e835bc63f433007ddeceb71f05cb25c45ae1b19c6d3b - languageName: node - linkType: hard - -"klaw-sync@npm:^6.0.0": - version: 6.0.0 - resolution: "klaw-sync@npm:6.0.0" - dependencies: - graceful-fs: ^4.1.11 - checksum: 0da397f8961313c3ef8f79fb63af9002cde5a8fb2aeb1a37351feff0dd6006129c790400c3f5c3b4e757bedcabb13d21ec0a5eaef5a593d59515d4f2c291e475 - languageName: node - linkType: hard - -"klaw@npm:^1.0.0": - version: 1.3.1 - resolution: "klaw@npm:1.3.1" - dependencies: - graceful-fs: ^4.1.9 - dependenciesMeta: - graceful-fs: - optional: true - checksum: 8f69e4797c26e7c3f2426bfa85f38a3da3c2cb1b4c6bd850d2377aed440d41ce9d806f2885c2e2e224372c56af4b1d43b8a499adecf9a05e7373dc6b8b7c52e4 - languageName: node - linkType: hard - -"kuler@npm:^2.0.0": - version: 2.0.0 - resolution: "kuler@npm:2.0.0" - checksum: 9e10b5a1659f9ed8761d38df3c35effabffbd19fc6107324095238e4ef0ff044392cae9ac64a1c2dda26e532426485342226b93806bd97504b174b0dcf04ed81 - languageName: node - linkType: hard - -"level-supports@npm:^4.0.0": - version: 4.0.1 - resolution: "level-supports@npm:4.0.1" - checksum: d4552b42bb8cdeada07b0f6356c7a90fefe76279147331f291aceae26e3e56d5f927b09ce921647c0230bfe03ddfbdcef332be921e5c2194421ae2bfa3cf6368 - languageName: node - linkType: hard - -"level-transcoder@npm:^1.0.1": - version: 1.0.1 - resolution: "level-transcoder@npm:1.0.1" - dependencies: - buffer: ^6.0.3 - module-error: ^1.0.1 - checksum: 304f08d802faf3491a533b6d87ad8be3cabfd27f2713bbe9d4c633bf50fcb9460eab5a6776bf015e101ead7ba1c1853e05e7f341112f17a9d0cb37ee5a421a25 - languageName: node - linkType: hard - -"level@npm:^8.0.0": - version: 8.0.1 - resolution: "level@npm:8.0.1" - dependencies: - abstract-level: ^1.0.4 - browser-level: ^1.0.1 - classic-level: ^1.2.0 - checksum: c5641cbba666ef9eb0292aad01d86a4f1af18e637d1fc097c65bf0109ab8d7e6fba8c8faf6c74ae4e48edac4310f7dd87def26ffeebfe395c7afd9bd2461ab97 - languageName: node - linkType: hard - -"levn@npm:^0.4.1": - version: 0.4.1 - resolution: "levn@npm:0.4.1" - dependencies: - prelude-ls: ^1.2.1 - type-check: ~0.4.0 - checksum: 12c5021c859bd0f5248561bf139121f0358285ec545ebf48bb3d346820d5c61a4309535c7f387ed7d84361cf821e124ce346c6b7cef8ee09a67c1473b46d0fc4 - languageName: node - linkType: hard - -"levn@npm:~0.3.0": - version: 0.3.0 - resolution: "levn@npm:0.3.0" - dependencies: - prelude-ls: ~1.1.2 - type-check: ~0.3.2 - checksum: 0d084a524231a8246bb10fec48cdbb35282099f6954838604f3c7fc66f2e16fa66fd9cc2f3f20a541a113c4dafdf181e822c887c8a319c9195444e6c64ac395e - languageName: node - linkType: hard - -"lilconfig@npm:2.1.0": - version: 2.1.0 - resolution: "lilconfig@npm:2.1.0" - checksum: 8549bb352b8192375fed4a74694cd61ad293904eee33f9d4866c2192865c44c4eb35d10782966242634e0cbc1e91fe62b1247f148dc5514918e3a966da7ea117 - languageName: node - linkType: hard - -"lines-and-columns@npm:^1.1.6": - version: 1.2.4 - resolution: "lines-and-columns@npm:1.2.4" - checksum: 0c37f9f7fa212b38912b7145e1cd16a5f3cd34d782441c3e6ca653485d326f58b3caccda66efce1c5812bde4961bbde3374fae4b0d11bf1226152337f3894aa5 - languageName: node - linkType: hard - -"lint-staged@npm:^13.0.4": - version: 13.3.0 - resolution: "lint-staged@npm:13.3.0" - dependencies: - chalk: 5.3.0 - commander: 11.0.0 - debug: 4.3.4 - execa: 7.2.0 - lilconfig: 2.1.0 - listr2: 6.6.1 - micromatch: 4.0.5 - pidtree: 0.6.0 - string-argv: 0.3.2 - yaml: 2.3.1 - bin: - lint-staged: bin/lint-staged.js - checksum: f7c146cc2849c9ce4f1d2808d990fcbdef5e0bb79e6e79cc895f53c91f5ac4dcefdb8c3465156b38a015dcb051f2795c6bda4f20a1e2f2fa654c7ba521b2d2e0 - languageName: node - linkType: hard - -"listr2@npm:6.6.1": - version: 6.6.1 - resolution: "listr2@npm:6.6.1" - dependencies: - cli-truncate: ^3.1.0 - colorette: ^2.0.20 - eventemitter3: ^5.0.1 - log-update: ^5.0.1 - rfdc: ^1.3.0 - wrap-ansi: ^8.1.0 - peerDependencies: - enquirer: ">= 2.3.0 < 3" - peerDependenciesMeta: - enquirer: - optional: true - checksum: 99600e8a51f838f7208bce7e16d6b3d91d361f13881e6aa91d0b561a9a093ddcf63b7bc2a7b47aec7fdbff9d0e8c9f68cb66e6dfe2d857e5b1df8ab045c26ce8 - languageName: node - linkType: hard - -"locate-path@npm:^2.0.0": - version: 2.0.0 - resolution: "locate-path@npm:2.0.0" - dependencies: - p-locate: ^2.0.0 - path-exists: ^3.0.0 - checksum: 02d581edbbbb0fa292e28d96b7de36b5b62c2fa8b5a7e82638ebb33afa74284acf022d3b1e9ae10e3ffb7658fbc49163fcd5e76e7d1baaa7801c3e05a81da755 - languageName: node - linkType: hard - -"locate-path@npm:^5.0.0": - version: 5.0.0 - resolution: "locate-path@npm:5.0.0" - dependencies: - p-locate: ^4.1.0 - checksum: 83e51725e67517287d73e1ded92b28602e3ae5580b301fe54bfb76c0c723e3f285b19252e375712316774cf52006cb236aed5704692c32db0d5d089b69696e30 - languageName: node - linkType: hard - -"locate-path@npm:^6.0.0": - version: 6.0.0 - resolution: "locate-path@npm:6.0.0" - dependencies: - p-locate: ^5.0.0 - checksum: 72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a - languageName: node - linkType: hard - -"lodash.camelcase@npm:^4.3.0": - version: 4.3.0 - resolution: "lodash.camelcase@npm:4.3.0" - checksum: cb9227612f71b83e42de93eccf1232feeb25e705bdb19ba26c04f91e885bfd3dd5c517c4a97137658190581d3493ea3973072ca010aab7e301046d90740393d1 - languageName: node - linkType: hard - -"lodash.isfunction@npm:^3.0.9": - version: 3.0.9 - resolution: "lodash.isfunction@npm:3.0.9" - checksum: 99e54c34b1e8a9ba75c034deb39cedbd2aca7af685815e67a2a8ec4f73ec9748cda6ebee5a07d7de4b938e90d421fd280e9c385cc190f903ac217ac8aff30314 - languageName: node - linkType: hard - -"lodash.isplainobject@npm:^4.0.6": - version: 4.0.6 - resolution: "lodash.isplainobject@npm:4.0.6" - checksum: 29c6351f281e0d9a1d58f1a4c8f4400924b4c79f18dfc4613624d7d54784df07efaff97c1ff2659f3e085ecf4fff493300adc4837553104cef2634110b0d5337 - languageName: node - linkType: hard - -"lodash.kebabcase@npm:^4.1.1": - version: 4.1.1 - resolution: "lodash.kebabcase@npm:4.1.1" - checksum: 5a6c59161914e1bae23438a298c7433e83d935e0f59853fa862e691164696bc07f6dfa4c313d499fbf41ba8d53314e9850416502376705a357d24ee6ca33af78 - languageName: node - linkType: hard - -"lodash.map@npm:^4.5.1": - version: 4.6.0 - resolution: "lodash.map@npm:4.6.0" - checksum: 7369a41d7d24d15ce3bbd02a7faa3a90f6266c38184e64932571b9b21b758bd10c04ffd117d1859be1a44156f29b94df5045eff172bf8a97fddf68bf1002d12f - languageName: node - linkType: hard - -"lodash.merge@npm:^4.6.2": - version: 4.6.2 - resolution: "lodash.merge@npm:4.6.2" - checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005 - languageName: node - linkType: hard - -"lodash.mergewith@npm:^4.6.2": - version: 4.6.2 - resolution: "lodash.mergewith@npm:4.6.2" - checksum: a6db2a9339752411f21b956908c404ec1e088e783a65c8b29e30ae5b3b6384f82517662d6f425cc97c2070b546cc2c7daaa8d33f78db7b6e9be06cd834abdeb8 - languageName: node - linkType: hard - -"lodash.snakecase@npm:^4.1.1": - version: 4.1.1 - resolution: "lodash.snakecase@npm:4.1.1" - checksum: 1685ed3e83dda6eae5a4dcaee161a51cd210aabb3e1c09c57150e7dd8feda19e4ca0d27d0631eabe8d0f4eaa51e376da64e8c018ae5415417c5890d42feb72a8 - languageName: node - linkType: hard - -"lodash.startcase@npm:^4.4.0": - version: 4.4.0 - resolution: "lodash.startcase@npm:4.4.0" - checksum: c03a4a784aca653845fe09d0ef67c902b6e49288dc45f542a4ab345a9c406a6dc194c774423fa313ee7b06283950301c1221dd2a1d8ecb2dac8dfbb9ed5606b5 - languageName: node - linkType: hard - -"lodash.truncate@npm:^4.4.2": - version: 4.4.2 - resolution: "lodash.truncate@npm:4.4.2" - checksum: b463d8a382cfb5f0e71c504dcb6f807a7bd379ff1ea216669aa42c52fc28c54e404bfbd96791aa09e6df0de2c1d7b8f1b7f4b1a61f324d38fe98bc535aeee4f5 - languageName: node - linkType: hard - -"lodash.uniq@npm:^4.5.0": - version: 4.5.0 - resolution: "lodash.uniq@npm:4.5.0" - checksum: a4779b57a8d0f3c441af13d9afe7ecff22dd1b8ce1129849f71d9bbc8e8ee4e46dfb4b7c28f7ad3d67481edd6e51126e4e2a6ee276e25906d10f7140187c392d - languageName: node - linkType: hard - -"lodash.upperfirst@npm:^4.3.1": - version: 4.3.1 - resolution: "lodash.upperfirst@npm:4.3.1" - checksum: cadec6955900afe1928cc60cdc4923a79c2ef991e42665419cc81630ed9b4f952a1093b222e0141ab31cbc4dba549f97ec28ff67929d71e01861c97188a5fa83 - languageName: node - linkType: hard - -"lodash@npm:4.17.21, lodash@npm:^4.17.11, lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.21": - version: 4.17.21 - resolution: "lodash@npm:4.17.21" - checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 - languageName: node - linkType: hard - -"log-symbols@npm:^4.1.0": - version: 4.1.0 - resolution: "log-symbols@npm:4.1.0" - dependencies: - chalk: ^4.1.0 - is-unicode-supported: ^0.1.0 - checksum: fce1497b3135a0198803f9f07464165e9eb83ed02ceb2273930a6f8a508951178d8cf4f0378e9d28300a2ed2bc49050995d2bd5f53ab716bb15ac84d58c6ef74 - languageName: node - linkType: hard - -"log-update@npm:^5.0.1": - version: 5.0.1 - resolution: "log-update@npm:5.0.1" - dependencies: - ansi-escapes: ^5.0.0 - cli-cursor: ^4.0.0 - slice-ansi: ^5.0.0 - strip-ansi: ^7.0.1 - wrap-ansi: ^8.0.1 - checksum: 2c6b47dcce6f9233df6d232a37d9834cb3657a0749ef6398f1706118de74c55f158587d4128c225297ea66803f35c5ac3db4f3f617046d817233c45eedc32ef1 - languageName: node - linkType: hard - -"logform@npm:^2.6.0, logform@npm:^2.6.1": - version: 2.6.1 - resolution: "logform@npm:2.6.1" - dependencies: - "@colors/colors": 1.6.0 - "@types/triple-beam": ^1.3.2 - fecha: ^4.2.0 - ms: ^2.1.1 - safe-stable-stringify: ^2.3.1 - triple-beam: ^1.3.0 - checksum: 0c6b95fa8350ccc33c7c33d77de2a9920205399706fc1b125151c857b61eb90873f4670d9e0e58e58c165b68a363206ae670d6da8b714527c838da3c84449605 - languageName: node - linkType: hard - -"longest@npm:^2.0.1": - version: 2.0.1 - resolution: "longest@npm:2.0.1" - checksum: 9587c153919a883ecbcc33e9439bc2592aa6fdbbd2d343f8ab17d8d3e0373c4e4350e3b428566fd689d704800a23f2b4d145cbdcca4ef3fd35742e5927f919a9 - languageName: node - linkType: hard - -"loupe@npm:^2.3.6": - version: 2.3.7 - resolution: "loupe@npm:2.3.7" - dependencies: - get-func-name: ^2.0.1 - checksum: 96c058ec7167598e238bb7fb9def2f9339215e97d6685d9c1e3e4bdb33d14600e11fe7a812cf0c003dfb73ca2df374f146280b2287cae9e8d989e9d7a69a203b - languageName: node - linkType: hard - -"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": - version: 10.4.3 - resolution: "lru-cache@npm:10.4.3" - checksum: 6476138d2125387a6d20f100608c2583d415a4f64a0fecf30c9e2dda976614f09cad4baa0842447bd37dd459a7bd27f57d9d8f8ce558805abd487c583f3d774a - languageName: node - linkType: hard - -"lru-cache@npm:^5.1.1": - version: 5.1.1 - resolution: "lru-cache@npm:5.1.1" - dependencies: - yallist: ^3.0.2 - checksum: c154ae1cbb0c2206d1501a0e94df349653c92c8cbb25236d7e85190bcaf4567a03ac6eb43166fabfa36fd35623694da7233e88d9601fbf411a9a481d85dbd2cb - languageName: node - linkType: hard - -"lru-cache@npm:^6.0.0": - version: 6.0.0 - resolution: "lru-cache@npm:6.0.0" - dependencies: - yallist: ^4.0.0 - checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 - languageName: node - linkType: hard - -"lru_map@npm:^0.3.3": - version: 0.3.3 - resolution: "lru_map@npm:0.3.3" - checksum: ca9dd43c65ed7a4f117c548028101c5b6855e10923ea9d1f635af53ad20c5868ff428c364d454a7b57fe391b89c704982275410c3c5099cca5aeee00d76e169a - languageName: node - linkType: hard - -"make-error@npm:^1.1.1": - version: 1.3.6 - resolution: "make-error@npm:1.3.6" - checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 - languageName: node - linkType: hard - -"make-fetch-happen@npm:^13.0.0": - version: 13.0.1 - resolution: "make-fetch-happen@npm:13.0.1" - dependencies: - "@npmcli/agent": ^2.0.0 - cacache: ^18.0.0 - http-cache-semantics: ^4.1.1 - is-lambda: ^1.0.1 - minipass: ^7.0.2 - minipass-fetch: ^3.0.0 - minipass-flush: ^1.0.5 - minipass-pipeline: ^1.2.4 - negotiator: ^0.6.3 - proc-log: ^4.2.0 - promise-retry: ^2.0.1 - ssri: ^10.0.0 - checksum: 5c9fad695579b79488fa100da05777213dd9365222f85e4757630f8dd2a21a79ddd3206c78cfd6f9b37346819681782b67900ac847a57cf04190f52dda5343fd - languageName: node - linkType: hard - -"map-obj@npm:^1.0.0": - version: 1.0.1 - resolution: "map-obj@npm:1.0.1" - checksum: 9949e7baec2a336e63b8d4dc71018c117c3ce6e39d2451ccbfd3b8350c547c4f6af331a4cbe1c83193d7c6b786082b6256bde843db90cb7da2a21e8fcc28afed - languageName: node - linkType: hard - -"map-obj@npm:^4.0.0": - version: 4.3.0 - resolution: "map-obj@npm:4.3.0" - checksum: fbc554934d1a27a1910e842bc87b177b1a556609dd803747c85ece420692380827c6ae94a95cce4407c054fa0964be3bf8226f7f2cb2e9eeee432c7c1985684e - languageName: node - linkType: hard - -"markdown-table@npm:^1.1.3": - version: 1.1.3 - resolution: "markdown-table@npm:1.1.3" - checksum: 292e8c956ae833c2ccb0a55cd8d87980cd657ab11cd9ff63c3fcc4d3a518d3b3882ba07410b8f477ba9e30b3f70658677e4e8acf61816dd6cfdd1f6293130664 - languageName: node - linkType: hard - -"match-all@npm:^1.2.6": - version: 1.2.6 - resolution: "match-all@npm:1.2.6" - checksum: 3d4f16b8fd082f2fd10e362f4a8b71c62f8a767591b3db831ca2bdcf726337e9a64e4abc30e2ef053dc2bcfb875a9ed80bd78e006ad5ef11380a7158d0cb00e1 - languageName: node - linkType: hard - -"mcl-wasm@npm:^0.7.1": - version: 0.7.9 - resolution: "mcl-wasm@npm:0.7.9" - checksum: 6b6ed5084156b98b2db70b223e1ba2c01953970b48a2e0c4ea3eeb9296610e6b3bfb2a2cce9e92e2d7ad61778b5f5a630e705e663835e915ba188c174a0a37fa - languageName: node - linkType: hard - -"md5.js@npm:^1.3.4": - version: 1.3.5 - resolution: "md5.js@npm:1.3.5" - dependencies: - hash-base: ^3.0.0 - inherits: ^2.0.1 - safe-buffer: ^5.1.2 - checksum: 098494d885684bcc4f92294b18ba61b7bd353c23147fbc4688c75b45cb8590f5a95fd4584d742415dcc52487f7a1ef6ea611cfa1543b0dc4492fe026357f3f0c - languageName: node - linkType: hard - -"memory-level@npm:^1.0.0": - version: 1.0.0 - resolution: "memory-level@npm:1.0.0" - dependencies: - abstract-level: ^1.0.0 - functional-red-black-tree: ^1.0.1 - module-error: ^1.0.1 - checksum: 80b1b7aedaf936e754adbcd7b9303018c3684fb32f9992fd967c448f145d177f16c724fbba9ed3c3590a9475fd563151eae664d69b83d2ad48714852e9fc5c72 - languageName: node - linkType: hard - -"memory-pager@npm:^1.0.2": - version: 1.5.0 - resolution: "memory-pager@npm:1.5.0" - checksum: d1a2e684583ef55c61cd3a49101da645b11ad57014dfc565e0b43baa9004b743f7e4ab81493d8fff2ab24e9950987cc3209c94bcc4fc8d7e30a475489a1f15e9 - languageName: node - linkType: hard - -"memorystream@npm:^0.3.1": - version: 0.3.1 - resolution: "memorystream@npm:0.3.1" - checksum: f18b42440d24d09516d01466c06adf797df7873f0d40aa7db02e5fb9ed83074e5e65412d0720901d7069363465f82dc4f8bcb44f0cde271567a61426ce6ca2e9 - languageName: node - linkType: hard - -"meow@npm:^8.0.0, meow@npm:^8.1.2": - version: 8.1.2 - resolution: "meow@npm:8.1.2" - dependencies: - "@types/minimist": ^1.2.0 - camelcase-keys: ^6.2.2 - decamelize-keys: ^1.1.0 - hard-rejection: ^2.1.0 - minimist-options: 4.1.0 - normalize-package-data: ^3.0.0 - read-pkg-up: ^7.0.1 - redent: ^3.0.0 - trim-newlines: ^3.0.0 - type-fest: ^0.18.0 - yargs-parser: ^20.2.3 - checksum: bc23bf1b4423ef6a821dff9734406bce4b91ea257e7f10a8b7f896f45b59649f07adc0926e2917eacd8cf1df9e4cd89c77623cf63dfd0f8bf54de07a32ee5a85 - languageName: node - linkType: hard - -"merge-stream@npm:^2.0.0": - version: 2.0.0 - resolution: "merge-stream@npm:2.0.0" - checksum: 6fa4dcc8d86629705cea944a4b88ef4cb0e07656ebf223fa287443256414283dd25d91c1cd84c77987f2aec5927af1a9db6085757cb43d90eb170ebf4b47f4f4 - languageName: node - linkType: hard - -"merge2@npm:^1.2.3, merge2@npm:^1.3.0, merge2@npm:^1.4.1": - version: 1.4.1 - resolution: "merge2@npm:1.4.1" - checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 - languageName: node - linkType: hard - -"merge@npm:^2.1.1": - version: 2.1.1 - resolution: "merge@npm:2.1.1" - checksum: 9c36b0e25aa53b3f7305d7cf0f330397f1142cf311802b681e5619f12e986a790019b8246c1c0df21701c8652449f9046b0129551030097ef563d1958c823249 - languageName: node - linkType: hard - -"micro-ftch@npm:^0.3.1": - version: 0.3.1 - resolution: "micro-ftch@npm:0.3.1" - checksum: 0e496547253a36e98a83fb00c628c53c3fb540fa5aaeaf718438873785afd193244988c09d219bb1802984ff227d04938d9571ef90fe82b48bd282262586aaff - languageName: node - linkType: hard - -"micromatch@npm:4.0.5": - version: 4.0.5 - resolution: "micromatch@npm:4.0.5" - dependencies: - braces: ^3.0.2 - picomatch: ^2.3.1 - checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc - languageName: node - linkType: hard - -"micromatch@npm:^4.0.2, micromatch@npm:^4.0.4": - version: 4.0.8 - resolution: "micromatch@npm:4.0.8" - dependencies: - braces: ^3.0.3 - picomatch: ^2.3.1 - checksum: 79920eb634e6f400b464a954fcfa589c4e7c7143209488e44baf627f9affc8b1e306f41f4f0deedde97e69cb725920879462d3e750ab3bd3c1aed675bb3a8966 - languageName: node - linkType: hard - -"mime-db@npm:1.52.0": - version: 1.52.0 - resolution: "mime-db@npm:1.52.0" - checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f - languageName: node - linkType: hard - -"mime-types@npm:^2.1.12": - version: 2.1.35 - resolution: "mime-types@npm:2.1.35" - dependencies: - mime-db: 1.52.0 - checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836 - languageName: node - linkType: hard - -"mimic-fn@npm:^2.1.0": - version: 2.1.0 - resolution: "mimic-fn@npm:2.1.0" - checksum: d2421a3444848ce7f84bd49115ddacff29c15745db73f54041edc906c14b131a38d05298dae3081667627a59b2eb1ca4b436ff2e1b80f69679522410418b478a - languageName: node - linkType: hard - -"mimic-fn@npm:^4.0.0": - version: 4.0.0 - resolution: "mimic-fn@npm:4.0.0" - checksum: 995dcece15ee29aa16e188de6633d43a3db4611bcf93620e7e62109ec41c79c0f34277165b8ce5e361205049766e371851264c21ac64ca35499acb5421c2ba56 - languageName: node - linkType: hard - -"min-indent@npm:^1.0.0": - version: 1.0.1 - resolution: "min-indent@npm:1.0.1" - checksum: bfc6dd03c5eaf623a4963ebd94d087f6f4bbbfd8c41329a7f09706b0cb66969c4ddd336abeb587bc44bc6f08e13bf90f0b374f9d71f9f01e04adc2cd6f083ef1 - languageName: node - linkType: hard - -"minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": - version: 1.0.1 - resolution: "minimalistic-assert@npm:1.0.1" - checksum: cc7974a9268fbf130fb055aff76700d7e2d8be5f761fb5c60318d0ed010d839ab3661a533ad29a5d37653133385204c503bfac995aaa4236f4e847461ea32ba7 - languageName: node - linkType: hard - -"minimalistic-crypto-utils@npm:^1.0.1": - version: 1.0.1 - resolution: "minimalistic-crypto-utils@npm:1.0.1" - checksum: 6e8a0422b30039406efd4c440829ea8f988845db02a3299f372fceba56ffa94994a9c0f2fd70c17f9969eedfbd72f34b5070ead9656a34d3f71c0bd72583a0ed - languageName: node - linkType: hard - -"minimatch@npm:2 || 3, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": - version: 3.1.2 - resolution: "minimatch@npm:3.1.2" - dependencies: - brace-expansion: ^1.1.7 - checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a - languageName: node - linkType: hard - -"minimatch@npm:9.0.3": - version: 9.0.3 - resolution: "minimatch@npm:9.0.3" - dependencies: - brace-expansion: ^2.0.1 - checksum: 253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5 - languageName: node - linkType: hard - -"minimatch@npm:^5.0.1, minimatch@npm:^5.1.6": - version: 5.1.6 - resolution: "minimatch@npm:5.1.6" - dependencies: - brace-expansion: ^2.0.1 - checksum: 7564208ef81d7065a370f788d337cd80a689e981042cb9a1d0e6580b6c6a8c9279eba80010516e258835a988363f99f54a6f711a315089b8b42694f5da9d0d77 - languageName: node - linkType: hard - -"minimatch@npm:^9.0.4": - version: 9.0.5 - resolution: "minimatch@npm:9.0.5" - dependencies: - brace-expansion: ^2.0.1 - checksum: 2c035575eda1e50623c731ec6c14f65a85296268f749b9337005210bb2b34e2705f8ef1a358b188f69892286ab99dc42c8fb98a57bde55c8d81b3023c19cea28 - languageName: node - linkType: hard - -"minimist-options@npm:4.1.0": - version: 4.1.0 - resolution: "minimist-options@npm:4.1.0" - dependencies: - arrify: ^1.0.1 - is-plain-obj: ^1.1.0 - kind-of: ^6.0.3 - checksum: 8c040b3068811e79de1140ca2b708d3e203c8003eb9a414c1ab3cd467fc5f17c9ca02a5aef23bedc51a7f8bfbe77f87e9a7e31ec81fba304cda675b019496f4e - languageName: node - linkType: hard - -"minimist@npm:1.2.7": - version: 1.2.7 - resolution: "minimist@npm:1.2.7" - checksum: 7346574a1038ca23c32e02252f603801f09384dd1d78b69a943a4e8c2c28730b80e96193882d3d3b22a063445f460e48316b29b8a25addca2d7e5e8f75478bec - languageName: node - linkType: hard - -"minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6": - version: 1.2.8 - resolution: "minimist@npm:1.2.8" - checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0 - languageName: node - linkType: hard - -"minipass-collect@npm:^2.0.1": - version: 2.0.1 - resolution: "minipass-collect@npm:2.0.1" - dependencies: - minipass: ^7.0.3 - checksum: b251bceea62090f67a6cced7a446a36f4cd61ee2d5cea9aee7fff79ba8030e416327a1c5aa2908dc22629d06214b46d88fdab8c51ac76bacbf5703851b5ad342 - languageName: node - linkType: hard - -"minipass-fetch@npm:^3.0.0": - version: 3.0.5 - resolution: "minipass-fetch@npm:3.0.5" - dependencies: - encoding: ^0.1.13 - minipass: ^7.0.3 - minipass-sized: ^1.0.3 - minizlib: ^2.1.2 - dependenciesMeta: - encoding: - optional: true - checksum: 8047d273236157aab27ab7cd8eab7ea79e6ecd63e8f80c3366ec076cb9a0fed550a6935bab51764369027c414647fd8256c2a20c5445fb250c483de43350de83 - languageName: node - linkType: hard - -"minipass-flush@npm:^1.0.5": - version: 1.0.5 - resolution: "minipass-flush@npm:1.0.5" - dependencies: - minipass: ^3.0.0 - checksum: 56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf - languageName: node - linkType: hard - -"minipass-pipeline@npm:^1.2.4": - version: 1.2.4 - resolution: "minipass-pipeline@npm:1.2.4" - dependencies: - minipass: ^3.0.0 - checksum: b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b - languageName: node - linkType: hard - -"minipass-sized@npm:^1.0.3": - version: 1.0.3 - resolution: "minipass-sized@npm:1.0.3" - dependencies: - minipass: ^3.0.0 - checksum: 79076749fcacf21b5d16dd596d32c3b6bf4d6e62abb43868fac21674078505c8b15eaca4e47ed844985a4514854f917d78f588fcd029693709417d8f98b2bd60 - languageName: node - linkType: hard - -"minipass@npm:^3.0.0": - version: 3.3.6 - resolution: "minipass@npm:3.3.6" - dependencies: - yallist: ^4.0.0 - checksum: a30d083c8054cee83cdcdc97f97e4641a3f58ae743970457b1489ce38ee1167b3aaf7d815cd39ec7a99b9c40397fd4f686e83750e73e652b21cb516f6d845e48 - languageName: node - linkType: hard - -"minipass@npm:^5.0.0": - version: 5.0.0 - resolution: "minipass@npm:5.0.0" - checksum: 425dab288738853fded43da3314a0b5c035844d6f3097a8e3b5b29b328da8f3c1af6fc70618b32c29ff906284cf6406b6841376f21caaadd0793c1d5a6a620ea - languageName: node - linkType: hard - -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.1.2": - version: 7.1.2 - resolution: "minipass@npm:7.1.2" - checksum: 2bfd325b95c555f2b4d2814d49325691c7bee937d753814861b0b49d5edcda55cbbf22b6b6a60bb91eddac8668771f03c5ff647dcd9d0f798e9548b9cdc46ee3 - languageName: node - linkType: hard - -"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": - version: 2.1.2 - resolution: "minizlib@npm:2.1.2" - dependencies: - minipass: ^3.0.0 - yallist: ^4.0.0 - checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3 - languageName: node - linkType: hard - -"mkdirp@npm:0.5.x, mkdirp@npm:^0.5.1": - version: 0.5.6 - resolution: "mkdirp@npm:0.5.6" - dependencies: - minimist: ^1.2.6 - bin: - mkdirp: bin/cmd.js - checksum: 0c91b721bb12c3f9af4b77ebf73604baf350e64d80df91754dc509491ae93bf238581e59c7188360cec7cb62fc4100959245a42cfe01834efedc5e9d068376c2 - languageName: node - linkType: hard - -"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": - version: 1.0.4 - resolution: "mkdirp@npm:1.0.4" - bin: - mkdirp: bin/cmd.js - checksum: a96865108c6c3b1b8e1d5e9f11843de1e077e57737602de1b82030815f311be11f96f09cce59bd5b903d0b29834733e5313f9301e3ed6d6f6fba2eae0df4298f - languageName: node - linkType: hard - -"mnemonist@npm:^0.38.0": - version: 0.38.5 - resolution: "mnemonist@npm:0.38.5" - dependencies: - obliterator: ^2.0.0 - checksum: 66080afc1616866beb164e230c432964d6eed467cf37ad00e9c10161b8267928124ca8f1d0ecfea86c85568acfa62d54faaf646a86968d1135189a0fdfdd6b78 - languageName: node - linkType: hard - -"mocha@npm:^10.0.0, mocha@npm:^10.1.0, mocha@npm:^10.2.0": - version: 10.7.3 - resolution: "mocha@npm:10.7.3" - dependencies: - ansi-colors: ^4.1.3 - browser-stdout: ^1.3.1 - chokidar: ^3.5.3 - debug: ^4.3.5 - diff: ^5.2.0 - escape-string-regexp: ^4.0.0 - find-up: ^5.0.0 - glob: ^8.1.0 - he: ^1.2.0 - js-yaml: ^4.1.0 - log-symbols: ^4.1.0 - minimatch: ^5.1.6 - ms: ^2.1.3 - serialize-javascript: ^6.0.2 - strip-json-comments: ^3.1.1 - supports-color: ^8.1.1 - workerpool: ^6.5.1 - yargs: ^16.2.0 - yargs-parser: ^20.2.9 - yargs-unparser: ^2.0.0 - bin: - _mocha: bin/_mocha - mocha: bin/mocha.js - checksum: 956376dd8c7cd3e4f496ab1b06b7c89673ade2fb7f78704d8fce32b491f6940550eb1e784b7eef617e37fa29257a728df8b5b2b5e34ed7e83a692652290fab3c - languageName: node - linkType: hard - -"module-error@npm:^1.0.1, module-error@npm:^1.0.2": - version: 1.0.2 - resolution: "module-error@npm:1.0.2" - checksum: 5d653e35bd55b3e95f8aee2cdac108082ea892e71b8f651be92cde43e4ee86abee4fa8bd7fc3fe5e68b63926d42f63c54cd17b87a560c31f18739295575a3962 - languageName: node - linkType: hard - -"mongodb-connection-string-url@npm:^3.0.0": - version: 3.0.1 - resolution: "mongodb-connection-string-url@npm:3.0.1" - dependencies: - "@types/whatwg-url": ^11.0.2 - whatwg-url: ^13.0.0 - checksum: b0a3b9e619c53ce8c10452c6475dc1eeba4761ae1b293b1b37014acf609f44ab7057f084de8fceead9934dba2aad0a59315eab9371c1287dbaaf5aae48c6d371 - languageName: node - linkType: hard - -"mongodb@npm:6.5.0": - version: 6.5.0 - resolution: "mongodb@npm:6.5.0" - dependencies: - "@mongodb-js/saslprep": ^1.1.5 - bson: ^6.4.0 - mongodb-connection-string-url: ^3.0.0 - peerDependencies: - "@aws-sdk/credential-providers": ^3.188.0 - "@mongodb-js/zstd": ^1.1.0 - gcp-metadata: ^5.2.0 - kerberos: ^2.0.1 - mongodb-client-encryption: ">=6.0.0 <7" - snappy: ^7.2.2 - socks: ^2.7.1 - peerDependenciesMeta: - "@aws-sdk/credential-providers": - optional: true - "@mongodb-js/zstd": - optional: true - gcp-metadata: - optional: true - kerberos: - optional: true - mongodb-client-encryption: - optional: true - snappy: - optional: true - socks: - optional: true - checksum: 5774dfdd02d8d8e6bb70bf870f19bfad332da612fa6685d182b2e09da4f1306995ddf54f13ae0f6c3936e74444741689c04e7c009e7a847473f08f522ad16542 - languageName: node - linkType: hard - -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f - languageName: node - linkType: hard - -"ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d - languageName: node - linkType: hard - -"murmur-128@npm:^0.2.1": - version: 0.2.1 - resolution: "murmur-128@npm:0.2.1" - dependencies: - encode-utf8: ^1.0.2 - fmix: ^0.1.0 - imul: ^1.0.0 - checksum: 94ff8b39bf1a1a7bde83b6d13f656bbe591e0a5b5ffe4384c39470120ab70e9eadf0af38557742a30d24421ddc63aea6bba1028a1d6b66553038ee86a660dd92 - languageName: node - linkType: hard - -"mute-stream@npm:0.0.8": - version: 0.0.8 - resolution: "mute-stream@npm:0.0.8" - checksum: ff48d251fc3f827e5b1206cda0ffdaec885e56057ee86a3155e1951bc940fd5f33531774b1cc8414d7668c10a8907f863f6561875ee6e8768931a62121a531a1 - languageName: node - linkType: hard - -"napi-macros@npm:^2.2.2": - version: 2.2.2 - resolution: "napi-macros@npm:2.2.2" - checksum: c6f9bd71cdbbc37ddc3535aa5be481238641d89585b8a3f4d301cb89abf459e2d294810432bb7d12056d1f9350b1a0899a5afcf460237a3da6c398cf0fec7629 - languageName: node - linkType: hard - -"natural-compare-lite@npm:^1.4.0": - version: 1.4.0 - resolution: "natural-compare-lite@npm:1.4.0" - checksum: 5222ac3986a2b78dd6069ac62cbb52a7bf8ffc90d972ab76dfe7b01892485d229530ed20d0c62e79a6b363a663b273db3bde195a1358ce9e5f779d4453887225 - languageName: node - linkType: hard - -"natural-compare@npm:^1.4.0": - version: 1.4.0 - resolution: "natural-compare@npm:1.4.0" - checksum: 23ad088b08f898fc9b53011d7bb78ec48e79de7627e01ab5518e806033861bef68d5b0cd0e2205c2f36690ac9571ff6bcb05eb777ced2eeda8d4ac5b44592c3d - languageName: node - linkType: hard - -"negotiator@npm:^0.6.3": - version: 0.6.3 - resolution: "negotiator@npm:0.6.3" - checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 - languageName: node - linkType: hard - -"neo-async@npm:^2.6.2": - version: 2.6.2 - resolution: "neo-async@npm:2.6.2" - checksum: deac9f8d00eda7b2e5cd1b2549e26e10a0faa70adaa6fdadca701cc55f49ee9018e427f424bac0c790b7c7e2d3068db97f3093f1093975f2acb8f8818b936ed9 - languageName: node - linkType: hard - -"node-addon-api@npm:^2.0.0": - version: 2.0.2 - resolution: "node-addon-api@npm:2.0.2" - dependencies: - node-gyp: latest - checksum: 31fb22d674648204f8dd94167eb5aac896c841b84a9210d614bf5d97c74ef059cc6326389cf0c54d2086e35312938401d4cc82e5fcd679202503eb8ac84814f8 - languageName: node - linkType: hard - -"node-emoji@npm:^1.10.0": - version: 1.11.0 - resolution: "node-emoji@npm:1.11.0" - dependencies: - lodash: ^4.17.21 - checksum: e8c856c04a1645062112a72e59a98b203505ed5111ff84a3a5f40611afa229b578c7d50f1e6a7f17aa62baeea4a640d2e2f61f63afc05423aa267af10977fb2b - languageName: node - linkType: hard - -"node-fetch@npm:^2.7.0": - version: 2.7.0 - resolution: "node-fetch@npm:2.7.0" - dependencies: - whatwg-url: ^5.0.0 - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - checksum: d76d2f5edb451a3f05b15115ec89fc6be39de37c6089f1b6368df03b91e1633fd379a7e01b7ab05089a25034b2023d959b47e59759cb38d88341b2459e89d6e5 - languageName: node - linkType: hard - -"node-gyp-build@npm:^4.2.0, node-gyp-build@npm:^4.3.0": - version: 4.8.2 - resolution: "node-gyp-build@npm:4.8.2" - bin: - node-gyp-build: bin.js - node-gyp-build-optional: optional.js - node-gyp-build-test: build-test.js - checksum: 1a57bba8c4c193f808bd8ad1484d4ebdd8106dd9f04a3e82554dc716e3a2d87d7e369e9503c145e0e6a7e2c663fec0d8aaf52bd8156342ec7fc388195f37824e - languageName: node - linkType: hard - -"node-gyp@npm:latest": - version: 10.2.0 - resolution: "node-gyp@npm:10.2.0" - dependencies: - env-paths: ^2.2.0 - exponential-backoff: ^3.1.1 - glob: ^10.3.10 - graceful-fs: ^4.2.6 - make-fetch-happen: ^13.0.0 - nopt: ^7.0.0 - proc-log: ^4.1.0 - semver: ^7.3.5 - tar: ^6.2.1 - which: ^4.0.0 - bin: - node-gyp: bin/node-gyp.js - checksum: 0233759d8c19765f7fdc259a35eb046ad86c3d09e22f7384613ae2b89647dd27fcf833fdf5293d9335041e91f9b1c539494225959cdb312a5c8080b7534b926f - languageName: node - linkType: hard - -"nodemon@npm:^3.0.1": - version: 3.1.4 - resolution: "nodemon@npm:3.1.4" - dependencies: - chokidar: ^3.5.2 - debug: ^4 - ignore-by-default: ^1.0.1 - minimatch: ^3.1.2 - pstree.remy: ^1.1.8 - semver: ^7.5.3 - simple-update-notifier: ^2.0.0 - supports-color: ^5.5.0 - touch: ^3.1.0 - undefsafe: ^2.0.5 - bin: - nodemon: bin/nodemon.js - checksum: 3f003fc2c7bdaba559108320f188b7cb063220455e5da218ff3bf4f7468ad7059852da6e35a52b8c690cc27f6e36a433a9ad1f1bdb8096ec1ee3d930629cbeca - languageName: node - linkType: hard - -"nofilter@npm:^3.1.0": - version: 3.1.0 - resolution: "nofilter@npm:3.1.0" - checksum: 58aa85a5b4b35cbb6e42de8a8591c5e338061edc9f3e7286f2c335e9e9b9b8fa7c335ae45daa8a1f3433164dc0b9a3d187fa96f9516e04a17a1f9ce722becc4f - languageName: node - linkType: hard - -"nopt@npm:3.x": - version: 3.0.6 - resolution: "nopt@npm:3.0.6" - dependencies: - abbrev: 1 - bin: - nopt: ./bin/nopt.js - checksum: 7f8579029a0d7cb3341c6b1610b31e363f708b7aaaaf3580e3ec5ae8528d1f3a79d350d8bfa331776e6c6703a5a148b72edd9b9b4c1dd55874d8e70e963d1e20 - languageName: node - linkType: hard - -"nopt@npm:^7.0.0": - version: 7.2.1 - resolution: "nopt@npm:7.2.1" - dependencies: - abbrev: ^2.0.0 - bin: - nopt: bin/nopt.js - checksum: 6fa729cc77ce4162cfad8abbc9ba31d4a0ff6850c3af61d59b505653bef4781ec059f8890ecfe93ee8aa0c511093369cca88bfc998101616a2904e715bbbb7c9 - languageName: node - linkType: hard - -"normalize-package-data@npm:^2.5.0": - version: 2.5.0 - resolution: "normalize-package-data@npm:2.5.0" - dependencies: - hosted-git-info: ^2.1.4 - resolve: ^1.10.0 - semver: 2 || 3 || 4 || 5 - validate-npm-package-license: ^3.0.1 - checksum: 7999112efc35a6259bc22db460540cae06564aa65d0271e3bdfa86876d08b0e578b7b5b0028ee61b23f1cae9fc0e7847e4edc0948d3068a39a2a82853efc8499 - languageName: node - linkType: hard - -"normalize-package-data@npm:^3.0.0": - version: 3.0.3 - resolution: "normalize-package-data@npm:3.0.3" - dependencies: - hosted-git-info: ^4.0.1 - is-core-module: ^2.5.0 - semver: ^7.3.4 - validate-npm-package-license: ^3.0.1 - checksum: bbcee00339e7c26fdbc760f9b66d429258e2ceca41a5df41f5df06cc7652de8d82e8679ff188ca095cad8eff2b6118d7d866af2b68400f74602fbcbce39c160a - languageName: node - linkType: hard - -"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": - version: 3.0.0 - resolution: "normalize-path@npm:3.0.0" - checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 - languageName: node - linkType: hard - -"npm-run-path@npm:^4.0.1": - version: 4.0.1 - resolution: "npm-run-path@npm:4.0.1" - dependencies: - path-key: ^3.0.0 - checksum: 5374c0cea4b0bbfdfae62da7bbdf1e1558d338335f4cacf2515c282ff358ff27b2ecb91ffa5330a8b14390ac66a1e146e10700440c1ab868208430f56b5f4d23 - languageName: node - linkType: hard - -"npm-run-path@npm:^5.1.0": - version: 5.3.0 - resolution: "npm-run-path@npm:5.3.0" - dependencies: - path-key: ^4.0.0 - checksum: ae8e7a89da9594fb9c308f6555c73f618152340dcaae423e5fb3620026fefbec463618a8b761920382d666fa7a2d8d240b6fe320e8a6cdd54dc3687e2b659d25 - languageName: node - linkType: hard - -"number-to-bn@npm:1.7.0": - version: 1.7.0 - resolution: "number-to-bn@npm:1.7.0" - dependencies: - bn.js: 4.11.6 - strip-hex-prefix: 1.0.0 - checksum: 5b8c9dbe7b49dc7a069e5f0ba4e197257c89db11463478cb002fee7a34dc8868636952bd9f6310e5fdf22b266e0e6dffb5f9537c741734718107e90ae59b3de4 - languageName: node - linkType: hard - -"object-assign@npm:^4.1.0": - version: 4.1.1 - resolution: "object-assign@npm:4.1.1" - checksum: fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f - languageName: node - linkType: hard - -"object-inspect@npm:^1.13.1": - version: 1.13.2 - resolution: "object-inspect@npm:1.13.2" - checksum: 9f850b3c045db60e0e97746e809ee4090d6ce62195af17dd1e9438ac761394a7d8ec4f7906559aea5424eaf61e35d3e53feded2ccd5f62fcc7d9670d3c8eb353 - languageName: node - linkType: hard - -"object-keys@npm:^1.1.1": - version: 1.1.1 - resolution: "object-keys@npm:1.1.1" - checksum: b363c5e7644b1e1b04aa507e88dcb8e3a2f52b6ffd0ea801e4c7a62d5aa559affe21c55a07fd4b1fd55fc03a33c610d73426664b20032405d7b92a1414c34d6a - languageName: node - linkType: hard - -"obliterator@npm:^2.0.0": - version: 2.0.4 - resolution: "obliterator@npm:2.0.4" - checksum: f28ad35b6d812089315f375dc3e6e5f9bebf958ebe4b10ccd471c7115cbcf595e74bdac4783ae758e5b1f47e3096427fdb37cfa7bed566b132df92ff317b9a7c - languageName: node - linkType: hard - -"once@npm:1.x, once@npm:^1.3.0": - version: 1.4.0 - resolution: "once@npm:1.4.0" - dependencies: - wrappy: 1 - checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 - languageName: node - linkType: hard - -"one-time@npm:^1.0.0": - version: 1.0.0 - resolution: "one-time@npm:1.0.0" - dependencies: - fn.name: 1.x.x - checksum: fd008d7e992bdec1c67f53a2f9b46381ee12a9b8c309f88b21f0223546003fb47e8ad7c1fd5843751920a8d276c63bd4b45670ef80c61fb3e07dbccc962b5c7d - languageName: node - linkType: hard - -"onetime@npm:^5.1.0, onetime@npm:^5.1.2": - version: 5.1.2 - resolution: "onetime@npm:5.1.2" - dependencies: - mimic-fn: ^2.1.0 - checksum: 2478859ef817fc5d4e9c2f9e5728512ddd1dbc9fb7829ad263765bb6d3b91ce699d6e2332eef6b7dff183c2f490bd3349f1666427eaba4469fba0ac38dfd0d34 - languageName: node - linkType: hard - -"onetime@npm:^6.0.0": - version: 6.0.0 - resolution: "onetime@npm:6.0.0" - dependencies: - mimic-fn: ^4.0.0 - checksum: 0846ce78e440841335d4e9182ef69d5762e9f38aa7499b19f42ea1c4cd40f0b4446094c455c713f9adac3f4ae86f613bb5e30c99e52652764d06a89f709b3788 - languageName: node - linkType: hard - -"open@npm:^7.4.2": - version: 7.4.2 - resolution: "open@npm:7.4.2" - dependencies: - is-docker: ^2.0.0 - is-wsl: ^2.1.1 - checksum: 3333900ec0e420d64c23b831bc3467e57031461d843c801f569b2204a1acc3cd7b3ec3c7897afc9dde86491dfa289708eb92bba164093d8bd88fb2c231843c91 - languageName: node - linkType: hard - -"openzeppelin-solidity@npm:^4.8.1": - version: 4.8.1 - resolution: "openzeppelin-solidity@npm:4.8.1" - bin: - openzeppelin-contracts-migrate-imports: scripts/migrate-imports.js - checksum: 4337c0669a26f2768231a1e287cc2291d803caa90d36ddb6a3636995235406ef9520a51a0890cabc3907687b58db1293fc44e9069462cf3a9a8ec3b4c1ff4366 - languageName: node - linkType: hard - -"optionator@npm:^0.8.1": - version: 0.8.3 - resolution: "optionator@npm:0.8.3" - 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 - checksum: b8695ddf3d593203e25ab0900e265d860038486c943ff8b774f596a310f8ceebdb30c6832407a8198ba3ec9debe1abe1f51d4aad94843612db3b76d690c61d34 - languageName: node - linkType: hard - -"optionator@npm:^0.9.3": - version: 0.9.4 - resolution: "optionator@npm:0.9.4" - dependencies: - deep-is: ^0.1.3 - fast-levenshtein: ^2.0.6 - levn: ^0.4.1 - prelude-ls: ^1.2.1 - type-check: ^0.4.0 - word-wrap: ^1.2.5 - checksum: ecbd010e3dc73e05d239976422d9ef54a82a13f37c11ca5911dff41c98a6c7f0f163b27f922c37e7f8340af9d36febd3b6e9cef508f3339d4c393d7276d716bb - languageName: node - linkType: hard - -"ora@npm:^5.4.1": - version: 5.4.1 - resolution: "ora@npm:5.4.1" - dependencies: - bl: ^4.1.0 - chalk: ^4.1.0 - cli-cursor: ^3.1.0 - cli-spinners: ^2.5.0 - is-interactive: ^1.0.0 - is-unicode-supported: ^0.1.0 - log-symbols: ^4.1.0 - strip-ansi: ^6.0.0 - wcwidth: ^1.0.1 - checksum: 28d476ee6c1049d68368c0dc922e7225e3b5600c3ede88fade8052837f9ed342625fdaa84a6209302587c8ddd9b664f71f0759833cbdb3a4cf81344057e63c63 - languageName: node - linkType: hard - -"ordinal@npm:^1.0.3": - version: 1.0.3 - resolution: "ordinal@npm:1.0.3" - checksum: 6761c5b7606b6c4b0c22b4097dab4fe7ffcddacc49238eedf9c0ced877f5d4e4ad3f4fd43fefa1cc3f167cc54c7149267441b2ae85b81ccf13f45cf4b7947164 - languageName: node - linkType: hard - -"os-tmpdir@npm:~1.0.2": - version: 1.0.2 - resolution: "os-tmpdir@npm:1.0.2" - checksum: 5666560f7b9f10182548bf7013883265be33620b1c1b4a4d405c25be2636f970c5488ff3e6c48de75b55d02bde037249fe5dbfbb4c0fb7714953d56aed062e6d - languageName: node - linkType: hard - -"p-limit@npm:^1.1.0": - version: 1.3.0 - resolution: "p-limit@npm:1.3.0" - dependencies: - p-try: ^1.0.0 - checksum: 281c1c0b8c82e1ac9f81acd72a2e35d402bf572e09721ce5520164e9de07d8274451378a3470707179ad13240535558f4b277f02405ad752e08c7d5b0d54fbfd - languageName: node - linkType: hard - -"p-limit@npm:^2.2.0": - version: 2.3.0 - resolution: "p-limit@npm:2.3.0" - dependencies: - p-try: ^2.0.0 - checksum: 84ff17f1a38126c3314e91ecfe56aecbf36430940e2873dadaa773ffe072dc23b7af8e46d4b6485d302a11673fe94c6b67ca2cfbb60c989848b02100d0594ac1 - languageName: node - linkType: hard - -"p-limit@npm:^3.0.2": - version: 3.1.0 - resolution: "p-limit@npm:3.1.0" - dependencies: - yocto-queue: ^0.1.0 - checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 - languageName: node - linkType: hard - -"p-locate@npm:^2.0.0": - version: 2.0.0 - resolution: "p-locate@npm:2.0.0" - dependencies: - p-limit: ^1.1.0 - checksum: e2dceb9b49b96d5513d90f715780f6f4972f46987dc32a0e18bc6c3fc74a1a5d73ec5f81b1398af5e58b99ea1ad03fd41e9181c01fa81b4af2833958696e3081 - languageName: node - linkType: hard - -"p-locate@npm:^4.1.0": - version: 4.1.0 - resolution: "p-locate@npm:4.1.0" - dependencies: - p-limit: ^2.2.0 - checksum: 513bd14a455f5da4ebfcb819ef706c54adb09097703de6aeaa5d26fe5ea16df92b48d1ac45e01e3944ce1e6aa2a66f7f8894742b8c9d6e276e16cd2049a2b870 - languageName: node - linkType: hard - -"p-locate@npm:^5.0.0": - version: 5.0.0 - resolution: "p-locate@npm:5.0.0" - dependencies: - p-limit: ^3.0.2 - checksum: 1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3 - languageName: node - linkType: hard - -"p-map@npm:^4.0.0": - version: 4.0.0 - resolution: "p-map@npm:4.0.0" - dependencies: - aggregate-error: ^3.0.0 - checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c - languageName: node - linkType: hard - -"p-try@npm:^1.0.0": - version: 1.0.0 - resolution: "p-try@npm:1.0.0" - checksum: 3b5303f77eb7722144154288bfd96f799f8ff3e2b2b39330efe38db5dd359e4fb27012464cd85cb0a76e9b7edd1b443568cb3192c22e7cffc34989df0bafd605 - languageName: node - linkType: hard - -"p-try@npm:^2.0.0": - version: 2.2.0 - resolution: "p-try@npm:2.2.0" - checksum: f8a8e9a7693659383f06aec604ad5ead237c7a261c18048a6e1b5b85a5f8a067e469aa24f5bc009b991ea3b058a87f5065ef4176793a200d4917349881216cae - languageName: node - linkType: hard - -"package-json-from-dist@npm:^1.0.0": - version: 1.0.0 - resolution: "package-json-from-dist@npm:1.0.0" - checksum: ac706ec856a5a03f5261e4e48fa974f24feb044d51f84f8332e2af0af04fbdbdd5bbbfb9cbbe354190409bc8307c83a9e38c6672c3c8855f709afb0006a009ea - languageName: node - linkType: hard - -"parent-module@npm:^1.0.0": - version: 1.0.1 - resolution: "parent-module@npm:1.0.1" - dependencies: - callsites: ^3.0.0 - checksum: 6ba8b255145cae9470cf5551eb74be2d22281587af787a2626683a6c20fbb464978784661478dd2a3f1dad74d1e802d403e1b03c1a31fab310259eec8ac560ff - languageName: node - linkType: hard - -"parse-cache-control@npm:^1.0.1": - version: 1.0.1 - resolution: "parse-cache-control@npm:1.0.1" - checksum: 5a70868792124eb07c2dd07a78fcb824102e972e908254e9e59ce59a4796c51705ff28196d2b20d3b7353d14e9f98e65ed0e4eda9be072cc99b5297dc0466fee - languageName: node - linkType: hard - -"parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": - version: 5.2.0 - resolution: "parse-json@npm:5.2.0" - dependencies: - "@babel/code-frame": ^7.0.0 - error-ex: ^1.3.1 - json-parse-even-better-errors: ^2.3.0 - lines-and-columns: ^1.1.6 - checksum: 62085b17d64da57f40f6afc2ac1f4d95def18c4323577e1eced571db75d9ab59b297d1d10582920f84b15985cbfc6b6d450ccbf317644cfa176f3ed982ad87e2 - languageName: node - linkType: hard - -"parse-passwd@npm:^1.0.0": - version: 1.0.0 - resolution: "parse-passwd@npm:1.0.0" - checksum: 4e55e0231d58f828a41d0f1da2bf2ff7bcef8f4cb6146e69d16ce499190de58b06199e6bd9b17fbf0d4d8aef9052099cdf8c4f13a6294b1a522e8e958073066e - languageName: node - linkType: hard - -"patch-package@npm:8.0.0": - version: 8.0.0 - resolution: "patch-package@npm:8.0.0" - dependencies: - "@yarnpkg/lockfile": ^1.1.0 - chalk: ^4.1.2 - ci-info: ^3.7.0 - cross-spawn: ^7.0.3 - find-yarn-workspace-root: ^2.0.0 - fs-extra: ^9.0.0 - json-stable-stringify: ^1.0.2 - klaw-sync: ^6.0.0 - minimist: ^1.2.6 - open: ^7.4.2 - rimraf: ^2.6.3 - semver: ^7.5.3 - slash: ^2.0.0 - tmp: ^0.0.33 - yaml: ^2.2.2 - bin: - patch-package: index.js - checksum: d23cddc4d1622e2d8c7ca31b145c6eddb24bd271f69905e766de5e1f199f0b9a5479a6a6939ea857288399d4ed249285639d539a2c00fbddb7daa39934b007a2 - languageName: node - linkType: hard - -"path-exists@npm:^3.0.0": - version: 3.0.0 - resolution: "path-exists@npm:3.0.0" - checksum: 96e92643aa34b4b28d0de1cd2eba52a1c5313a90c6542d03f62750d82480e20bfa62bc865d5cfc6165f5fcd5aeb0851043c40a39be5989646f223300021bae0a - languageName: node - linkType: hard - -"path-exists@npm:^4.0.0": - version: 4.0.0 - resolution: "path-exists@npm:4.0.0" - checksum: 505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 - languageName: node - linkType: hard - -"path-is-absolute@npm:^1.0.0": - version: 1.0.1 - resolution: "path-is-absolute@npm:1.0.1" - checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 - languageName: node - linkType: hard - -"path-key@npm:^3.0.0, path-key@npm:^3.1.0": - version: 3.1.1 - resolution: "path-key@npm:3.1.1" - checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 - languageName: node - linkType: hard - -"path-key@npm:^4.0.0": - version: 4.0.0 - resolution: "path-key@npm:4.0.0" - checksum: 8e6c314ae6d16b83e93032c61020129f6f4484590a777eed709c4a01b50e498822b00f76ceaf94bc64dbd90b327df56ceadce27da3d83393790f1219e07721d7 - languageName: node - linkType: hard - -"path-parse@npm:^1.0.6, path-parse@npm:^1.0.7": - version: 1.0.7 - resolution: "path-parse@npm:1.0.7" - checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a - languageName: node - linkType: hard - -"path-scurry@npm:^1.11.1": - version: 1.11.1 - resolution: "path-scurry@npm:1.11.1" - dependencies: - lru-cache: ^10.2.0 - minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 - checksum: 890d5abcd593a7912dcce7cf7c6bf7a0b5648e3dee6caf0712c126ca0a65c7f3d7b9d769072a4d1baf370f61ce493ab5b038d59988688e0c5f3f646ee3c69023 - languageName: node - linkType: hard - -"path-type@npm:^4.0.0": - version: 4.0.0 - resolution: "path-type@npm:4.0.0" - checksum: 5b1e2daa247062061325b8fdbfd1fb56dde0a448fb1455453276ea18c60685bdad23a445dc148cf87bc216be1573357509b7d4060494a6fd768c7efad833ee45 - languageName: node - linkType: hard - -"pathval@npm:^1.1.1": - version: 1.1.1 - resolution: "pathval@npm:1.1.1" - checksum: 090e3147716647fb7fb5b4b8c8e5b55e5d0a6086d085b6cd23f3d3c01fcf0ff56fd3cc22f2f4a033bd2e46ed55d61ed8379e123b42afe7d531a2a5fc8bb556d6 - languageName: node - linkType: hard - -"pbkdf2@npm:^3.0.17": - version: 3.1.2 - resolution: "pbkdf2@npm:3.1.2" - 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 - checksum: 2c950a100b1da72123449208e231afc188d980177d021d7121e96a2de7f2abbc96ead2b87d03d8fe5c318face097f203270d7e27908af9f471c165a4e8e69c92 - languageName: node - linkType: hard - -"picocolors@npm:^1.0.0": - version: 1.1.0 - resolution: "picocolors@npm:1.1.0" - checksum: a64d653d3a188119ff45781dfcdaeedd7625583f45280aea33fcb032c7a0d3959f2368f9b192ad5e8aade75b74dbd954ffe3106c158509a45e4c18ab379a2acd - languageName: node - linkType: hard - -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1": - version: 2.3.1 - resolution: "picomatch@npm:2.3.1" - checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf - languageName: node - linkType: hard - -"pidtree@npm:0.6.0": - version: 0.6.0 - resolution: "pidtree@npm:0.6.0" - bin: - pidtree: bin/pidtree.js - checksum: 8fbc073ede9209dd15e80d616e65eb674986c93be49f42d9ddde8dbbd141bb53d628a7ca4e58ab5c370bb00383f67d75df59a9a226dede8fa801267a7030c27a - languageName: node - linkType: hard - -"pify@npm:^4.0.1": - version: 4.0.1 - resolution: "pify@npm:4.0.1" - checksum: 9c4e34278cb09987685fa5ef81499c82546c033713518f6441778fbec623fc708777fe8ac633097c72d88470d5963094076c7305cafc7ad340aae27cfacd856b - languageName: node - linkType: hard - -"pinst@npm:^3.0.0": - version: 3.0.0 - resolution: "pinst@npm:3.0.0" - bin: - pinst: bin.js - checksum: 4ae48a6a60f79c37071233af51b4d91bfc85cfa3c12b66ccda60cdb642b4d14a4ab0cb3587afc55b1f6192cea1772a5e4822026a0d0d3528296edef00cc2d61f - languageName: node - linkType: hard - -"pluralize@npm:^8.0.0": - version: 8.0.0 - resolution: "pluralize@npm:8.0.0" - checksum: 08931d4a6a4a5561a7f94f67a31c17e6632cb21e459ab3ff4f6f629d9a822984cf8afef2311d2005fbea5d7ef26016ebb090db008e2d8bce39d0a9a9d218736e - languageName: node - linkType: hard - -"prelude-ls@npm:^1.2.1": - version: 1.2.1 - resolution: "prelude-ls@npm:1.2.1" - checksum: cd192ec0d0a8e4c6da3bb80e4f62afe336df3f76271ac6deb0e6a36187133b6073a19e9727a1ff108cd8b9982e4768850d413baa71214dd80c7979617dca827a - languageName: node - linkType: hard - -"prelude-ls@npm:~1.1.2": - version: 1.1.2 - resolution: "prelude-ls@npm:1.1.2" - checksum: c4867c87488e4a0c233e158e4d0d5565b609b105d75e4c05dc760840475f06b731332eb93cc8c9cecb840aa8ec323ca3c9a56ad7820ad2e63f0261dadcb154e4 - languageName: node - linkType: hard - -"prettier-linter-helpers@npm:^1.0.0": - version: 1.0.0 - resolution: "prettier-linter-helpers@npm:1.0.0" - dependencies: - fast-diff: ^1.1.2 - checksum: 00ce8011cf6430158d27f9c92cfea0a7699405633f7f1d4a45f07e21bf78e99895911cbcdc3853db3a824201a7c745bd49bfea8abd5fb9883e765a90f74f8392 - languageName: node - linkType: hard - -"prettier-plugin-solidity@npm:^1.0.0, prettier-plugin-solidity@npm:^1.3.1, prettier-plugin-solidity@npm:^1.4.1": - version: 1.4.1 - resolution: "prettier-plugin-solidity@npm:1.4.1" - dependencies: - "@solidity-parser/parser": ^0.18.0 - semver: ^7.5.4 - peerDependencies: - prettier: ">=2.3.0" - checksum: ac9f3cc525553a45e70f60898da5d4a7b733128cdd9893686364790ff688c56dd6eb0234620759dc6fabad4dc354a27097927b29ea7761c5814c64613c07222f - languageName: node - linkType: hard - -"prettier@npm:^2.1.2, prettier@npm:^2.3.1, prettier@npm:^2.8.3, prettier@npm:^2.8.7": - version: 2.8.8 - resolution: "prettier@npm:2.8.8" - bin: - prettier: bin-prettier.js - checksum: b49e409431bf129dd89238d64299ba80717b57ff5a6d1c1a8b1a28b590d998a34e083fa13573bc732bb8d2305becb4c9a4407f8486c81fa7d55100eb08263cf8 - languageName: node - linkType: hard - -"prettier@npm:^3.0.3, prettier@npm:^3.3.3": - version: 3.3.3 - resolution: "prettier@npm:3.3.3" - bin: - prettier: bin/prettier.cjs - checksum: bc8604354805acfdde6106852d14b045bb20827ad76a5ffc2455b71a8257f94de93f17f14e463fe844808d2ccc87248364a5691488a3304f1031326e62d9276e - languageName: node - linkType: hard - -"proc-log@npm:^4.1.0, proc-log@npm:^4.2.0": - version: 4.2.0 - resolution: "proc-log@npm:4.2.0" - checksum: 98f6cd012d54b5334144c5255ecb941ee171744f45fca8b43b58ae5a0c1af07352475f481cadd9848e7f0250376ee584f6aa0951a856ff8f021bdfbff4eb33fc - languageName: node - linkType: hard - -"process-nextick-args@npm:~2.0.0": - version: 2.0.1 - resolution: "process-nextick-args@npm:2.0.1" - checksum: 1d38588e520dab7cea67cbbe2efdd86a10cc7a074c09657635e34f035277b59fbb57d09d8638346bf7090f8e8ebc070c96fa5fd183b777fff4f5edff5e9466cf - languageName: node - linkType: hard - -"promise-retry@npm:^2.0.1": - version: 2.0.1 - resolution: "promise-retry@npm:2.0.1" - dependencies: - err-code: ^2.0.2 - retry: ^0.12.0 - checksum: f96a3f6d90b92b568a26f71e966cbbc0f63ab85ea6ff6c81284dc869b41510e6cdef99b6b65f9030f0db422bf7c96652a3fff9f2e8fb4a0f069d8f4430359429 - languageName: node - linkType: hard - -"promise@npm:^8.0.0": - version: 8.3.0 - resolution: "promise@npm:8.3.0" - dependencies: - asap: ~2.0.6 - checksum: a69f0ddbddf78ffc529cffee7ad950d307347615970564b17988ce43fbe767af5c738a9439660b24a9a8cbea106c0dcbb6c2b20e23b7e96a8e89e5c2679e94d5 - languageName: node - linkType: hard - -"proxy-from-env@npm:^1.1.0": - version: 1.1.0 - resolution: "proxy-from-env@npm:1.1.0" - checksum: ed7fcc2ba0a33404958e34d95d18638249a68c430e30fcb6c478497d72739ba64ce9810a24f53a7d921d0c065e5b78e3822759800698167256b04659366ca4d4 - languageName: node - linkType: hard - -"pstree.remy@npm:^1.1.8": - version: 1.1.8 - resolution: "pstree.remy@npm:1.1.8" - checksum: 5cb53698d6bb34dfb278c8a26957964aecfff3e161af5fbf7cee00bbe9d8547c7aced4bd9cb193bce15fb56e9e4220fc02a5bf9c14345ffb13a36b858701ec2d - languageName: node - linkType: hard - -"punycode@npm:^2.1.0, punycode@npm:^2.3.0": - version: 2.3.1 - resolution: "punycode@npm:2.3.1" - checksum: bb0a0ceedca4c3c57a9b981b90601579058903c62be23c5e8e843d2c2d4148a3ecf029d5133486fb0e1822b098ba8bba09e89d6b21742d02fa26bda6441a6fb2 - languageName: node - linkType: hard - -"qs@npm:^6.4.0, qs@npm:^6.9.4": - version: 6.13.0 - resolution: "qs@npm:6.13.0" - dependencies: - side-channel: ^1.0.6 - checksum: e9404dc0fc2849245107108ce9ec2766cde3be1b271de0bf1021d049dc5b98d1a2901e67b431ac5509f865420a7ed80b7acb3980099fe1c118a1c5d2e1432ad8 - languageName: node - linkType: hard - -"queue-microtask@npm:^1.2.2, queue-microtask@npm:^1.2.3": - version: 1.2.3 - resolution: "queue-microtask@npm:1.2.3" - checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 - languageName: node - linkType: hard - -"quick-lru@npm:^4.0.1": - version: 4.0.1 - resolution: "quick-lru@npm:4.0.1" - checksum: bea46e1abfaa07023e047d3cf1716a06172c4947886c053ede5c50321893711577cb6119360f810cc3ffcd70c4d7db4069c3cee876b358ceff8596e062bd1154 - languageName: node - linkType: hard - -"randombytes@npm:^2.1.0": - version: 2.1.0 - resolution: "randombytes@npm:2.1.0" - dependencies: - safe-buffer: ^5.1.0 - checksum: d779499376bd4cbb435ef3ab9a957006c8682f343f14089ed5f27764e4645114196e75b7f6abf1cbd84fd247c0cb0651698444df8c9bf30e62120fbbc52269d6 - languageName: node - linkType: hard - -"raw-body@npm:^2.4.1": - version: 2.5.2 - resolution: "raw-body@npm:2.5.2" - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - checksum: ba1583c8d8a48e8fbb7a873fdbb2df66ea4ff83775421bfe21ee120140949ab048200668c47d9ae3880012f6e217052690628cf679ddfbd82c9fc9358d574676 - languageName: node - linkType: hard - -"read-pkg-up@npm:^7.0.1": - version: 7.0.1 - resolution: "read-pkg-up@npm:7.0.1" - dependencies: - find-up: ^4.1.0 - read-pkg: ^5.2.0 - type-fest: ^0.8.1 - checksum: e4e93ce70e5905b490ca8f883eb9e48b5d3cebc6cd4527c25a0d8f3ae2903bd4121c5ab9c5a3e217ada0141098eeb661313c86fa008524b089b8ed0b7f165e44 - languageName: node - linkType: hard - -"read-pkg@npm:^5.2.0": - version: 5.2.0 - resolution: "read-pkg@npm:5.2.0" - dependencies: - "@types/normalize-package-data": ^2.4.0 - normalize-package-data: ^2.5.0 - parse-json: ^5.0.0 - type-fest: ^0.6.0 - checksum: eb696e60528b29aebe10e499ba93f44991908c57d70f2d26f369e46b8b9afc208ef11b4ba64f67630f31df8b6872129e0a8933c8c53b7b4daf0eace536901222 - languageName: node - linkType: hard - -"readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0, readable-stream@npm:^3.6.2": - version: 3.6.2 - resolution: "readable-stream@npm:3.6.2" - dependencies: - inherits: ^2.0.3 - string_decoder: ^1.1.1 - util-deprecate: ^1.0.1 - checksum: bdcbe6c22e846b6af075e32cf8f4751c2576238c5043169a1c221c92ee2878458a816a4ea33f4c67623c0b6827c8a400409bfb3cf0bf3381392d0b1dfb52ac8d - languageName: node - linkType: hard - -"readable-stream@npm:^2.2.2": - version: 2.3.8 - resolution: "readable-stream@npm:2.3.8" - 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 - checksum: 65645467038704f0c8aaf026a72fbb588a9e2ef7a75cd57a01702ee9db1c4a1e4b03aaad36861a6a0926546a74d174149c8c207527963e0c2d3eee2f37678a42 - languageName: node - linkType: hard - -"readdirp@npm:~3.6.0": - version: 3.6.0 - resolution: "readdirp@npm:3.6.0" - dependencies: - picomatch: ^2.2.1 - checksum: 1ced032e6e45670b6d7352d71d21ce7edf7b9b928494dcaba6f11fba63180d9da6cd7061ebc34175ffda6ff529f481818c962952004d273178acd70f7059b320 - languageName: node - linkType: hard - -"readonly-date@npm:^1.0.0": - version: 1.0.0 - resolution: "readonly-date@npm:1.0.0" - checksum: 78481e2abf3c2f9bc526029458aee3e2b1c476ca1434c4cc9db5c9aba51bf8f1323c1995d764ff01f2055b01f13e05416b2e14b387f644b0a5a56554c3ee9d0a - languageName: node - linkType: hard - -"rechoir@npm:^0.6.2": - version: 0.6.2 - resolution: "rechoir@npm:0.6.2" - dependencies: - resolve: ^1.1.6 - checksum: fe76bf9c21875ac16e235defedd7cbd34f333c02a92546142b7911a0f7c7059d2e16f441fe6fb9ae203f459c05a31b2bcf26202896d89e390eda7514d5d2702b - languageName: node - linkType: hard - -"recursive-readdir@npm:^2.2.2": - version: 2.2.3 - resolution: "recursive-readdir@npm:2.2.3" - dependencies: - minimatch: ^3.0.5 - checksum: 88ec96e276237290607edc0872b4f9842837b95cfde0cdbb1e00ba9623dfdf3514d44cdd14496ab60a0c2dd180a6ef8a3f1c34599e6cf2273afac9b72a6fb2b5 - languageName: node - linkType: hard - -"redent@npm:^3.0.0": - version: 3.0.0 - resolution: "redent@npm:3.0.0" - dependencies: - indent-string: ^4.0.0 - strip-indent: ^3.0.0 - checksum: fa1ef20404a2d399235e83cc80bd55a956642e37dd197b4b612ba7327bf87fa32745aeb4a1634b2bab25467164ab4ed9c15be2c307923dd08b0fe7c52431ae6b - languageName: node - linkType: hard - -"reduce-flatten@npm:^2.0.0": - version: 2.0.0 - resolution: "reduce-flatten@npm:2.0.0" - checksum: 64393ef99a16b20692acfd60982d7fdbd7ff8d9f8f185c6023466444c6dd2abb929d67717a83cec7f7f8fb5f46a25d515b3b2bf2238fdbfcdbfd01d2a9e73cb8 - languageName: node - linkType: hard - -"regenerator-runtime@npm:^0.14.0": - version: 0.14.1 - resolution: "regenerator-runtime@npm:0.14.1" - checksum: 9f57c93277b5585d3c83b0cf76be47b473ae8c6d9142a46ce8b0291a04bb2cf902059f0f8445dcabb3fb7378e5fe4bb4ea1e008876343d42e46d3b484534ce38 - languageName: node - linkType: hard - -"req-cwd@npm:^2.0.0": - version: 2.0.0 - resolution: "req-cwd@npm:2.0.0" - dependencies: - req-from: ^2.0.0 - checksum: c44f9dea0b0f7d3a72be18a04f7769e0eefbadca363e3a346c1c02b79745126c871e1f6970357b3e731c26740aad8344bf80fb3ce055a2bcf8ca85ad2b44f519 - languageName: node - linkType: hard - -"req-from@npm:^2.0.0": - version: 2.0.0 - resolution: "req-from@npm:2.0.0" - dependencies: - resolve-from: ^3.0.0 - checksum: 4c369881a2296e23e71668ed089c5d93b37652fe900ec9f1e1f5c1da65f6bca4ee271e97ba2b806fdea50219e011995d1df3c80a7209015cc1e1fc622507f140 - languageName: node - linkType: hard - -"require-directory@npm:^2.1.1": - version: 2.1.1 - resolution: "require-directory@npm:2.1.1" - checksum: fb47e70bf0001fdeabdc0429d431863e9475e7e43ea5f94ad86503d918423c1543361cc5166d713eaa7029dd7a3d34775af04764bebff99ef413111a5af18c80 - languageName: node - linkType: hard - -"require-from-string@npm:^2.0.0, require-from-string@npm:^2.0.2": - version: 2.0.2 - resolution: "require-from-string@npm:2.0.2" - checksum: a03ef6895445f33a4015300c426699bc66b2b044ba7b670aa238610381b56d3f07c686251740d575e22f4c87531ba662d06937508f0f3c0f1ddc04db3130560b - languageName: node - linkType: hard - -"resolve-dir@npm:^1.0.0, resolve-dir@npm:^1.0.1": - version: 1.0.1 - resolution: "resolve-dir@npm:1.0.1" - dependencies: - expand-tilde: ^2.0.0 - global-modules: ^1.0.0 - checksum: ef736b8ed60d6645c3b573da17d329bfb50ec4e1d6c5ffd6df49e3497acef9226f9810ea6823b8ece1560e01dcb13f77a9f6180d4f242d00cc9a8f4de909c65c - languageName: node - linkType: hard - -"resolve-from@npm:5.0.0, resolve-from@npm:^5.0.0": - version: 5.0.0 - resolution: "resolve-from@npm:5.0.0" - checksum: 4ceeb9113e1b1372d0cd969f3468fa042daa1dd9527b1b6bb88acb6ab55d8b9cd65dbf18819f9f9ddf0db804990901dcdaade80a215e7b2c23daae38e64f5bdf - languageName: node - linkType: hard - -"resolve-from@npm:^3.0.0": - version: 3.0.0 - resolution: "resolve-from@npm:3.0.0" - checksum: fff9819254d2d62b57f74e5c2ca9c0bdd425ca47287c4d801bc15f947533148d858229ded7793b0f59e61e49e782fffd6722048add12996e1bd4333c29669062 - languageName: node - linkType: hard - -"resolve-from@npm:^4.0.0": - version: 4.0.0 - resolution: "resolve-from@npm:4.0.0" - checksum: f4ba0b8494846a5066328ad33ef8ac173801a51739eb4d63408c847da9a2e1c1de1e6cbbf72699211f3d13f8fc1325648b169bd15eb7da35688e30a5fb0e4a7f - languageName: node - linkType: hard - -"resolve-global@npm:1.0.0, resolve-global@npm:^1.0.0": - version: 1.0.0 - resolution: "resolve-global@npm:1.0.0" - dependencies: - global-dirs: ^0.1.1 - checksum: c4e11d33e84bde7516b824503ffbe4b6cce863d5ce485680fd3db997b7c64da1df98321b1fd0703b58be8bc9bc83bc96bd83043f96194386b45eb47229efb6b6 - languageName: node - linkType: hard - -"resolve@npm:1.1.x": - version: 1.1.7 - resolution: "resolve@npm:1.1.7" - checksum: afd20873fbde7641c9125efe3f940c2a99f6b1f90f1b7b743e744bdaac1cb105b2e4e0317bcc052ed7e31d57afa86b394a4dc9a1b33a297977be134fdf0250ab - languageName: node - linkType: hard - -"resolve@npm:1.17.0": - version: 1.17.0 - resolution: "resolve@npm:1.17.0" - dependencies: - path-parse: ^1.0.6 - checksum: 9ceaf83b3429f2d7ff5d0281b8d8f18a1f05b6ca86efea7633e76b8f76547f33800799dfdd24434942dec4fbd9e651ed3aef577d9a6b5ec87ad89c1060e24759 - languageName: node - linkType: hard - -"resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.8.1": - version: 1.22.8 - resolution: "resolve@npm:1.22.8" - dependencies: - is-core-module: ^2.13.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 - bin: - resolve: bin/resolve - checksum: f8a26958aa572c9b064562750b52131a37c29d072478ea32e129063e2da7f83e31f7f11e7087a18225a8561cfe8d2f0df9dbea7c9d331a897571c0a2527dbb4c - languageName: node - linkType: hard - -"resolve@patch:resolve@1.1.x#~builtin": - version: 1.1.7 - resolution: "resolve@patch:resolve@npm%3A1.1.7#~builtin::version=1.1.7&hash=07638b" - checksum: e9dbca78600ae56835c43a09f1276876c883e4b4bbd43e2683fa140671519d2bdebeb1c1576ca87c8c508ae2987b3ec481645ac5d3054b0f23254cfc1ce49942 - languageName: node - linkType: hard - -"resolve@patch:resolve@1.17.0#~builtin": - version: 1.17.0 - resolution: "resolve@patch:resolve@npm%3A1.17.0#~builtin::version=1.17.0&hash=07638b" - dependencies: - path-parse: ^1.0.6 - checksum: 6fd799f282ddf078c4bc20ce863e3af01fa8cb218f0658d9162c57161a2dbafe092b13015b9a4c58d0e1e801cf7aa7a4f13115fea9db98c3f9a0c43e429bad6f - languageName: node - linkType: hard - -"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.8.1#~builtin": - version: 1.22.8 - resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin::version=1.22.8&hash=07638b" - dependencies: - is-core-module: ^2.13.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 - bin: - resolve: bin/resolve - checksum: 5479b7d431cacd5185f8db64bfcb7286ae5e31eb299f4c4f404ad8aa6098b77599563ac4257cb2c37a42f59dfc06a1bec2bcf283bb448f319e37f0feb9a09847 - languageName: node - linkType: hard - -"restore-cursor@npm:^3.1.0": - version: 3.1.0 - resolution: "restore-cursor@npm:3.1.0" - dependencies: - onetime: ^5.1.0 - signal-exit: ^3.0.2 - checksum: f877dd8741796b909f2a82454ec111afb84eb45890eb49ac947d87991379406b3b83ff9673a46012fca0d7844bb989f45cc5b788254cf1a39b6b5a9659de0630 - languageName: node - linkType: hard - -"restore-cursor@npm:^4.0.0": - version: 4.0.0 - resolution: "restore-cursor@npm:4.0.0" - dependencies: - onetime: ^5.1.0 - signal-exit: ^3.0.2 - checksum: 5b675c5a59763bf26e604289eab35711525f11388d77f409453904e1e69c0d37ae5889295706b2c81d23bd780165084d040f9b68fffc32cc921519031c4fa4af - languageName: node - linkType: hard - -"retry@npm:^0.12.0": - version: 0.12.0 - resolution: "retry@npm:0.12.0" - checksum: 623bd7d2e5119467ba66202d733ec3c2e2e26568074923bc0585b6b99db14f357e79bdedb63cab56cec47491c4a0da7e6021a7465ca6dc4f481d3898fdd3158c - languageName: node - linkType: hard - -"reusify@npm:^1.0.4": - version: 1.0.4 - resolution: "reusify@npm:1.0.4" - checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc - languageName: node - linkType: hard - -"rfdc@npm:^1.3.0": - version: 1.4.1 - resolution: "rfdc@npm:1.4.1" - checksum: 3b05bd55062c1d78aaabfcea43840cdf7e12099968f368e9a4c3936beb744adb41cbdb315eac6d4d8c6623005d6f87fdf16d8a10e1ff3722e84afea7281c8d13 - languageName: node - linkType: hard - -"rimraf@npm:^2.2.8, rimraf@npm:^2.6.3": - version: 2.7.1 - resolution: "rimraf@npm:2.7.1" - dependencies: - glob: ^7.1.3 - bin: - rimraf: ./bin.js - checksum: cdc7f6eacb17927f2a075117a823e1c5951792c6498ebcce81ca8203454a811d4cf8900314154d3259bb8f0b42ab17f67396a8694a54cae3283326e57ad250cd - languageName: node - linkType: hard - -"rimraf@npm:^3.0.2": - version: 3.0.2 - resolution: "rimraf@npm:3.0.2" - dependencies: - glob: ^7.1.3 - bin: - rimraf: bin.js - checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 - languageName: node - linkType: hard - -"ripemd160@npm:^2.0.0, ripemd160@npm:^2.0.1": - version: 2.0.2 - resolution: "ripemd160@npm:2.0.2" - dependencies: - hash-base: ^3.0.0 - inherits: ^2.0.1 - checksum: 006accc40578ee2beae382757c4ce2908a826b27e2b079efdcd2959ee544ddf210b7b5d7d5e80467807604244e7388427330f5c6d4cd61e6edaddc5773ccc393 - languageName: node - linkType: hard - -"rlp@npm:^2.2.3, rlp@npm:^2.2.4": - version: 2.2.7 - resolution: "rlp@npm:2.2.7" - dependencies: - bn.js: ^5.2.0 - bin: - rlp: bin/rlp - checksum: 3db4dfe5c793f40ac7e0be689a1f75d05e6f2ca0c66189aeb62adab8c436b857ab4420a419251ee60370d41d957a55698fc5e23ab1e1b41715f33217bc4bb558 - languageName: node - linkType: hard - -"root-workspace-0b6124@workspace:.": - version: 0.0.0-use.local - resolution: "root-workspace-0b6124@workspace:." - dependencies: - "@commitlint/cli": ^17.5.1 - "@commitlint/config-conventional": ^17.4.4 - husky: ^8.0.3 - patch-package: 8.0.0 - prettier: ^2.8.7 - prettier-plugin-solidity: ^1.0.0 - languageName: unknown - linkType: soft - -"rpc-websockets@npm:^9.0.2": - version: 9.0.2 - resolution: "rpc-websockets@npm:9.0.2" - dependencies: - "@swc/helpers": ^0.5.11 - "@types/uuid": ^8.3.4 - "@types/ws": ^8.2.2 - buffer: ^6.0.3 - bufferutil: ^4.0.1 - eventemitter3: ^5.0.1 - utf-8-validate: ^5.0.2 - uuid: ^8.3.2 - ws: ^8.5.0 - dependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: c93cd2e5b348ecfc6a4714d88b34c23470d086cecde5d1ba459750f9f1269c6e8edf80f3c628bab423f8720a49a653093e52821b9b0779fb79e041313d0e7173 - languageName: node - linkType: hard - -"run-async@npm:^2.4.0": - version: 2.4.1 - resolution: "run-async@npm:2.4.1" - checksum: a2c88aa15df176f091a2878eb840e68d0bdee319d8d97bbb89112223259cebecb94bc0defd735662b83c2f7a30bed8cddb7d1674eb48ae7322dc602b22d03797 - languageName: node - linkType: hard - -"run-parallel-limit@npm:^1.1.0": - version: 1.1.0 - resolution: "run-parallel-limit@npm:1.1.0" - dependencies: - queue-microtask: ^1.2.2 - checksum: 672c3b87e7f939c684b9965222b361421db0930223ed1e43ebf0e7e48ccc1a022ea4de080bef4d5468434e2577c33b7681e3f03b7593fdc49ad250a55381123c - languageName: node - linkType: hard - -"run-parallel@npm:^1.1.9": - version: 1.2.0 - resolution: "run-parallel@npm:1.2.0" - dependencies: - queue-microtask: ^1.2.2 - checksum: cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d - languageName: node - linkType: hard - -"rustbn.js@npm:~0.2.0": - version: 0.2.0 - resolution: "rustbn.js@npm:0.2.0" - checksum: 2148e7ba34e70682907ee29df4784639e6eb025481b2c91249403b7ec57181980161868d9aa24822a5075dd1bb5a180dfedc77309e5f0d27b6301f9b563af99a - languageName: node - linkType: hard - -"rxjs@npm:^7.5.5": - version: 7.8.1 - resolution: "rxjs@npm:7.8.1" - dependencies: - tslib: ^2.1.0 - checksum: de4b53db1063e618ec2eca0f7965d9137cabe98cf6be9272efe6c86b47c17b987383df8574861bcced18ebd590764125a901d5506082be84a8b8e364bf05f119 - languageName: node - linkType: hard - -"safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.0, safe-buffer@npm:~5.2.0": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 - languageName: node - linkType: hard - -"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": - version: 5.1.2 - resolution: "safe-buffer@npm:5.1.2" - checksum: f2f1f7943ca44a594893a852894055cf619c1fbcb611237fc39e461ae751187e7baf4dc391a72125e0ac4fb2d8c5c0b3c71529622e6a58f46b960211e704903c - languageName: node - linkType: hard - -"safe-stable-stringify@npm:^2.3.1": - version: 2.5.0 - resolution: "safe-stable-stringify@npm:2.5.0" - checksum: d3ce103ed43c6c2f523e39607208bfb1c73aa48179fc5be53c3aa97c118390bffd4d55e012f5393b982b65eb3e0ee954dd57b547930d3f242b0053dcdb923d17 - languageName: node - linkType: hard - -"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": - version: 2.1.2 - resolution: "safer-buffer@npm:2.1.2" - checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 - languageName: node - linkType: hard - -"sc-istanbul@npm:^0.4.5": - version: 0.4.6 - resolution: "sc-istanbul@npm:0.4.6" - dependencies: - abbrev: 1.0.x - async: 1.x - escodegen: 1.8.x - esprima: 2.7.x - glob: ^5.0.15 - handlebars: ^4.0.1 - js-yaml: 3.x - mkdirp: 0.5.x - nopt: 3.x - once: 1.x - resolve: 1.1.x - supports-color: ^3.1.0 - which: ^1.1.1 - wordwrap: ^1.0.0 - bin: - istanbul: lib/cli.js - checksum: 256472ebd35787985be7fc924f817f3e0fcf0ed17655250555bf24f76d44af18fd1b25a91c33458e17a4c57b80375bea22d46e2a982880ffbde1b1a94dfeed19 - languageName: node - linkType: hard - -"scrypt-js@npm:3.0.1, scrypt-js@npm:^3.0.0": - version: 3.0.1 - resolution: "scrypt-js@npm:3.0.1" - checksum: b7c7d1a68d6ca946f2fbb0778e0c4ec63c65501b54023b2af7d7e9f48fdb6c6580d6f7675cd53bda5944c5ebc057560d5a6365079752546865defb3b79dea454 - languageName: node - linkType: hard - -"sdk@workspace:packages/sdk": - version: 0.0.0-use.local - resolution: "sdk@workspace:packages/sdk" - dependencies: - ethers: ^6.2.3 - languageName: unknown - linkType: soft - -"secp256k1@npm:^4.0.1": - version: 4.0.3 - resolution: "secp256k1@npm:4.0.3" - dependencies: - elliptic: ^6.5.4 - node-addon-api: ^2.0.0 - node-gyp: latest - node-gyp-build: ^4.2.0 - checksum: 21e219adc0024fbd75021001358780a3cc6ac21273c3fcaef46943af73969729709b03f1df7c012a0baab0830fb9a06ccc6b42f8d50050c665cb98078eab477b - languageName: node - linkType: hard - -"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.5.0": - version: 5.7.2 - resolution: "semver@npm:5.7.2" - bin: - semver: bin/semver - checksum: fb4ab5e0dd1c22ce0c937ea390b4a822147a9c53dbd2a9a0132f12fe382902beef4fbf12cf51bb955248d8d15874ce8cd89532569756384f994309825f10b686 - languageName: node - linkType: hard - -"semver@npm:7.5.4": - version: 7.5.4 - resolution: "semver@npm:7.5.4" - dependencies: - lru-cache: ^6.0.0 - bin: - semver: bin/semver.js - checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 - languageName: node - linkType: hard - -"semver@npm:^6.3.0": - version: 6.3.1 - resolution: "semver@npm:6.3.1" - bin: - semver: bin/semver.js - checksum: ae47d06de28836adb9d3e25f22a92943477371292d9b665fb023fae278d345d508ca1958232af086d85e0155aee22e313e100971898bbb8d5d89b8b1d4054ca2 - languageName: node - linkType: hard - -"semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4": - version: 7.6.3 - resolution: "semver@npm:7.6.3" - bin: - semver: bin/semver.js - checksum: 4110ec5d015c9438f322257b1c51fe30276e5f766a3f64c09edd1d7ea7118ecbc3f379f3b69032bacf13116dc7abc4ad8ce0d7e2bd642e26b0d271b56b61a7d8 - languageName: node - linkType: hard - -"serialize-javascript@npm:^6.0.2": - version: 6.0.2 - resolution: "serialize-javascript@npm:6.0.2" - dependencies: - randombytes: ^2.1.0 - checksum: c4839c6206c1d143c0f80763997a361310305751171dd95e4b57efee69b8f6edd8960a0b7fbfc45042aadff98b206d55428aee0dc276efe54f100899c7fa8ab7 - languageName: node - linkType: hard - -"set-function-length@npm:^1.2.1": - version: 1.2.2 - resolution: "set-function-length@npm:1.2.2" - 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 - checksum: a8248bdacdf84cb0fab4637774d9fb3c7a8e6089866d04c817583ff48e14149c87044ce683d7f50759a8c50fb87c7a7e173535b06169c87ef76f5fb276dfff72 - languageName: node - linkType: hard - -"setimmediate@npm:^1.0.5": - version: 1.0.5 - resolution: "setimmediate@npm:1.0.5" - checksum: c9a6f2c5b51a2dabdc0247db9c46460152ffc62ee139f3157440bd48e7c59425093f42719ac1d7931f054f153e2d26cf37dfeb8da17a794a58198a2705e527fd - languageName: node - linkType: hard - -"setprototypeof@npm:1.2.0": - version: 1.2.0 - resolution: "setprototypeof@npm:1.2.0" - checksum: be18cbbf70e7d8097c97f713a2e76edf84e87299b40d085c6bf8b65314e994cc15e2e317727342fa6996e38e1f52c59720b53fe621e2eb593a6847bf0356db89 - languageName: node - linkType: hard - -"sha.js@npm:^2.4.0, sha.js@npm:^2.4.8": - version: 2.4.11 - resolution: "sha.js@npm:2.4.11" - dependencies: - inherits: ^2.0.1 - safe-buffer: ^5.0.1 - bin: - sha.js: ./bin.js - checksum: ebd3f59d4b799000699097dadb831c8e3da3eb579144fd7eb7a19484cbcbb7aca3c68ba2bb362242eb09e33217de3b4ea56e4678184c334323eca24a58e3ad07 - languageName: node - linkType: hard - -"sha1@npm:^1.1.1": - version: 1.1.1 - resolution: "sha1@npm:1.1.1" - dependencies: - charenc: ">= 0.0.1" - crypt: ">= 0.0.1" - checksum: da9f47e949988e2f595ef19733fd1dc736866ef6de4e421a55c13b444c03ae532e528b7350ae6ea55d9fb053be61d4648ec2cd5250d46cfdbdf4f6b4e763713d - languageName: node - linkType: hard - -"shebang-command@npm:^2.0.0": - version: 2.0.0 - resolution: "shebang-command@npm:2.0.0" - dependencies: - shebang-regex: ^3.0.0 - checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa - languageName: node - linkType: hard - -"shebang-regex@npm:^3.0.0": - version: 3.0.0 - resolution: "shebang-regex@npm:3.0.0" - checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 - languageName: node - linkType: hard - -"shelljs@npm:^0.8.3, shelljs@npm:^0.8.5": - version: 0.8.5 - resolution: "shelljs@npm:0.8.5" - dependencies: - glob: ^7.0.0 - interpret: ^1.0.0 - rechoir: ^0.6.2 - bin: - shjs: bin/shjs - checksum: 7babc46f732a98f4c054ec1f048b55b9149b98aa2da32f6cf9844c434b43c6251efebd6eec120937bd0999e13811ebd45efe17410edb3ca938f82f9381302748 - languageName: node - linkType: hard - -"shx@npm:^0.3.4": - version: 0.3.4 - resolution: "shx@npm:0.3.4" - dependencies: - minimist: ^1.2.3 - shelljs: ^0.8.5 - bin: - shx: lib/cli.js - checksum: 0aa168bfddc11e3fe8943cce2e0d2d8514a560bd58cf2b835b4351ba03f46068f7d88286c2627f4b85604e81952154c43746369fb3f0d60df0e3b511f465e5b8 - languageName: node - linkType: hard - -"side-channel@npm:^1.0.6": - version: 1.0.6 - resolution: "side-channel@npm:1.0.6" - dependencies: - call-bind: ^1.0.7 - es-errors: ^1.3.0 - get-intrinsic: ^1.2.4 - object-inspect: ^1.13.1 - checksum: bfc1afc1827d712271453e91b7cd3878ac0efd767495fd4e594c4c2afaa7963b7b510e249572bfd54b0527e66e4a12b61b80c061389e129755f34c493aad9b97 - languageName: node - linkType: hard - -"signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": - version: 3.0.7 - resolution: "signal-exit@npm:3.0.7" - checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 - languageName: node - linkType: hard - -"signal-exit@npm:^4.0.1": - version: 4.1.0 - resolution: "signal-exit@npm:4.1.0" - checksum: 64c757b498cb8629ffa5f75485340594d2f8189e9b08700e69199069c8e3070fb3e255f7ab873c05dc0b3cec412aea7402e10a5990cb6a050bd33ba062a6c549 - languageName: node - linkType: hard - -"simple-swizzle@npm:^0.2.2": - version: 0.2.2 - resolution: "simple-swizzle@npm:0.2.2" - dependencies: - is-arrayish: ^0.3.1 - checksum: a7f3f2ab5c76c4472d5c578df892e857323e452d9f392e1b5cf74b74db66e6294a1e1b8b390b519fa1b96b5b613f2a37db6cffef52c3f1f8f3c5ea64eb2d54c0 - languageName: node - linkType: hard - -"simple-update-notifier@npm:^2.0.0": - version: 2.0.0 - resolution: "simple-update-notifier@npm:2.0.0" - dependencies: - semver: ^7.5.3 - checksum: 9ba00d38ce6a29682f64a46213834e4eb01634c2f52c813a9a7b8873ca49cdbb703696f3290f3b27dc067de6d9418b0b84bef22c3eb074acf352529b2d6c27fd - languageName: node - linkType: hard - -"slash@npm:^2.0.0": - version: 2.0.0 - resolution: "slash@npm:2.0.0" - checksum: 512d4350735375bd11647233cb0e2f93beca6f53441015eea241fe784d8068281c3987fbaa93e7ef1c38df68d9c60013045c92837423c69115297d6169aa85e6 - languageName: node - linkType: hard - -"slash@npm:^3.0.0": - version: 3.0.0 - resolution: "slash@npm:3.0.0" - checksum: 94a93fff615f25a999ad4b83c9d5e257a7280c90a32a7cb8b4a87996e4babf322e469c42b7f649fd5796edd8687652f3fb452a86dc97a816f01113183393f11c - languageName: node - linkType: hard - -"slice-ansi@npm:^4.0.0": - version: 4.0.0 - resolution: "slice-ansi@npm:4.0.0" - dependencies: - ansi-styles: ^4.0.0 - astral-regex: ^2.0.0 - is-fullwidth-code-point: ^3.0.0 - checksum: 4a82d7f085b0e1b070e004941ada3c40d3818563ac44766cca4ceadd2080427d337554f9f99a13aaeb3b4a94d9964d9466c807b3d7b7541d1ec37ee32d308756 - languageName: node - linkType: hard - -"slice-ansi@npm:^5.0.0": - version: 5.0.0 - resolution: "slice-ansi@npm:5.0.0" - dependencies: - ansi-styles: ^6.0.0 - is-fullwidth-code-point: ^4.0.0 - checksum: 7e600a2a55e333a21ef5214b987c8358fe28bfb03c2867ff2cbf919d62143d1812ac27b4297a077fdaf27a03da3678e49551c93e35f9498a3d90221908a1180e - languageName: node - linkType: hard - -"smart-buffer@npm:^4.2.0": - version: 4.2.0 - resolution: "smart-buffer@npm:4.2.0" - checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b - languageName: node - linkType: hard - -"socks-proxy-agent@npm:^8.0.3": - version: 8.0.4 - resolution: "socks-proxy-agent@npm:8.0.4" - dependencies: - agent-base: ^7.1.1 - debug: ^4.3.4 - socks: ^2.8.3 - checksum: b2ec5051d85fe49072f9a250c427e0e9571fd09d5db133819192d078fd291276e1f0f50f6dbc04329b207738b1071314cee8bdbb4b12e27de42dbcf1d4233c67 - languageName: node - linkType: hard - -"socks@npm:^2.8.3": - version: 2.8.3 - resolution: "socks@npm:2.8.3" - dependencies: - ip-address: ^9.0.5 - smart-buffer: ^4.2.0 - checksum: 7a6b7f6eedf7482b9e4597d9a20e09505824208006ea8f2c49b71657427f3c137ca2ae662089baa73e1971c62322d535d9d0cf1c9235cf6f55e315c18203eadd - languageName: node - linkType: hard - -"solc@npm:0.7.3": - version: 0.7.3 - resolution: "solc@npm:0.7.3" - dependencies: - command-exists: ^1.2.8 - commander: 3.0.2 - follow-redirects: ^1.12.1 - fs-extra: ^0.30.0 - js-sha3: 0.8.0 - memorystream: ^0.3.1 - require-from-string: ^2.0.0 - semver: ^5.5.0 - tmp: 0.0.33 - bin: - solcjs: solcjs - checksum: 2d8eb16c6d8f648213c94dc8d977cffe5099cba7d41c82d92d769ef71ae8320a985065ce3d6c306440a85f8e8d2b27fb30bdd3ac38f69e5c1fa0ab8a3fb2f217 - languageName: node - linkType: hard - -"solhint-plugin-prettier@npm:^0.0.5": - version: 0.0.5 - resolution: "solhint-plugin-prettier@npm:0.0.5" - dependencies: - prettier-linter-helpers: ^1.0.0 - peerDependencies: - prettier: ^1.15.0 || ^2.0.0 - prettier-plugin-solidity: ^1.0.0-alpha.14 - checksum: ca721e327daf49a4d9ef0ee5c9622482a8c5563d600eedfd3856c69ce67e416dd77da5166a033e2e641c9cdd7a0f2cbc7913b0eb1712081b3c7e8c633eef82a5 - languageName: node - linkType: hard - -"solhint@npm:^3.3.7": - version: 3.6.2 - resolution: "solhint@npm:3.6.2" - dependencies: - "@solidity-parser/parser": ^0.16.0 - ajv: ^6.12.6 - antlr4: ^4.11.0 - ast-parents: ^0.0.1 - chalk: ^4.1.2 - commander: ^10.0.0 - cosmiconfig: ^8.0.0 - fast-diff: ^1.2.0 - glob: ^8.0.3 - ignore: ^5.2.4 - js-yaml: ^4.1.0 - lodash: ^4.17.21 - pluralize: ^8.0.0 - prettier: ^2.8.3 - semver: ^7.5.2 - strip-ansi: ^6.0.1 - table: ^6.8.1 - text-table: ^0.2.0 - dependenciesMeta: - prettier: - optional: true - bin: - solhint: solhint.js - checksum: 96c2ab3c1444624facb45b929682c65d83019f392c7331463a45e8ed61f08122e24b6709a721b6086ddfb0d5e3c3d4281f175f74eb308415072917556bdeba22 - languageName: node - linkType: hard - -"solidity-coverage@npm:^0.8.2": - version: 0.8.13 - resolution: "solidity-coverage@npm:0.8.13" - dependencies: - "@ethersproject/abi": ^5.0.9 - "@solidity-parser/parser": ^0.18.0 - chalk: ^2.4.2 - death: ^1.1.0 - difflib: ^0.2.4 - fs-extra: ^8.1.0 - ghost-testrpc: ^0.0.2 - global-modules: ^2.0.0 - globby: ^10.0.1 - jsonschema: ^1.2.4 - lodash: ^4.17.21 - mocha: ^10.2.0 - node-emoji: ^1.10.0 - pify: ^4.0.1 - recursive-readdir: ^2.2.2 - sc-istanbul: ^0.4.5 - semver: ^7.3.4 - shelljs: ^0.8.3 - web3-utils: ^1.3.6 - peerDependencies: - hardhat: ^2.11.0 - bin: - solidity-coverage: plugins/bin.js - checksum: aa18bf332bae4256753e24c6e866beecc35adbc694a285dac3947433c708f488cb18f11026b4e00250af8eadb910b642b1532d21137444cf00666b44ac0f8366 - languageName: node - linkType: hard - -"solidity-rlp@npm:2.0.8": - version: 2.0.8 - resolution: "solidity-rlp@npm:2.0.8" - checksum: e182087ffa1ee61447a04cae1b2ac3d814a65f52c1e6c81084ed181216f63fdc44df5197b5a35a627809db392fddd65f6e8dde4b8e49decdfc6fdfc7ed7ba3e8 - languageName: node - linkType: hard - -"source-map-support@npm:^0.5.13": - version: 0.5.21 - resolution: "source-map-support@npm:0.5.21" - dependencies: - buffer-from: ^1.0.0 - source-map: ^0.6.0 - checksum: 43e98d700d79af1d36f859bdb7318e601dfc918c7ba2e98456118ebc4c4872b327773e5a1df09b0524e9e5063bb18f0934538eace60cca2710d1fa687645d137 - languageName: node - linkType: hard - -"source-map@npm:^0.5.0": - version: 0.5.7 - resolution: "source-map@npm:0.5.7" - checksum: 5dc2043b93d2f194142c7f38f74a24670cd7a0063acdaf4bf01d2964b402257ae843c2a8fa822ad5b71013b5fcafa55af7421383da919752f22ff488bc553f4d - languageName: node - linkType: hard - -"source-map@npm:^0.6.0, source-map@npm:^0.6.1": - version: 0.6.1 - resolution: "source-map@npm:0.6.1" - checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 - languageName: node - linkType: hard - -"source-map@npm:~0.2.0": - version: 0.2.0 - resolution: "source-map@npm:0.2.0" - dependencies: - amdefine: ">=0.0.4" - checksum: 95fe800c3a93f8c0b9516c033bfc75f2678e27d2e6c0b23ae222f5ddc4afa0a39bd0be15d1c0a1e766d388f3761cc854a053a4330f49242e6045e1a4f9dc0e26 - languageName: node - linkType: hard - -"sparse-bitfield@npm:^3.0.3": - version: 3.0.3 - resolution: "sparse-bitfield@npm:3.0.3" - dependencies: - memory-pager: ^1.0.2 - checksum: 174da88dbbcc783d5dbd26921931cc83830280b8055fb05333786ebe6fc015b9601b24972b3d55920dd2d9f5fb120576fbfa2469b08e5222c9cadf3f05210aab - languageName: node - linkType: hard - -"spdx-correct@npm:^3.0.0": - version: 3.2.0 - resolution: "spdx-correct@npm:3.2.0" - dependencies: - spdx-expression-parse: ^3.0.0 - spdx-license-ids: ^3.0.0 - checksum: e9ae98d22f69c88e7aff5b8778dc01c361ef635580e82d29e5c60a6533cc8f4d820803e67d7432581af0cc4fb49973125076ee3b90df191d153e223c004193b2 - languageName: node - linkType: hard - -"spdx-exceptions@npm:^2.1.0": - version: 2.5.0 - resolution: "spdx-exceptions@npm:2.5.0" - checksum: bb127d6e2532de65b912f7c99fc66097cdea7d64c10d3ec9b5e96524dbbd7d20e01cba818a6ddb2ae75e62bb0c63d5e277a7e555a85cbc8ab40044984fa4ae15 - languageName: node - linkType: hard - -"spdx-expression-parse@npm:^3.0.0": - version: 3.0.1 - resolution: "spdx-expression-parse@npm:3.0.1" - dependencies: - spdx-exceptions: ^2.1.0 - spdx-license-ids: ^3.0.0 - checksum: a1c6e104a2cbada7a593eaa9f430bd5e148ef5290d4c0409899855ce8b1c39652bcc88a725259491a82601159d6dc790bedefc9016c7472f7de8de7361f8ccde - languageName: node - linkType: hard - -"spdx-license-ids@npm:^3.0.0": - version: 3.0.20 - resolution: "spdx-license-ids@npm:3.0.20" - checksum: 0c57750bedbcff48f3d0e266fbbdaf0aab54217e182f669542ffe0b5a902dce69e8cdfa126a131e1ddd39a9bef4662e357b2b41315d7240b4a28c0a7e782bb40 - languageName: node - linkType: hard - -"split2@npm:^3.0.0, split2@npm:^3.2.2": - version: 3.2.2 - resolution: "split2@npm:3.2.2" - dependencies: - readable-stream: ^3.0.0 - checksum: 8127ddbedd0faf31f232c0e9192fede469913aa8982aa380752e0463b2e31c2359ef6962eb2d24c125bac59eeec76873678d723b1c7ff696216a1cd071e3994a - languageName: node - linkType: hard - -"sprintf-js@npm:^1.1.3": - version: 1.1.3 - resolution: "sprintf-js@npm:1.1.3" - checksum: a3fdac7b49643875b70864a9d9b469d87a40dfeaf5d34d9d0c5b1cda5fd7d065531fcb43c76357d62254c57184a7b151954156563a4d6a747015cfb41021cad0 - languageName: node - linkType: hard - -"sprintf-js@npm:~1.0.2": - version: 1.0.3 - resolution: "sprintf-js@npm:1.0.3" - checksum: 19d79aec211f09b99ec3099b5b2ae2f6e9cdefe50bc91ac4c69144b6d3928a640bb6ae5b3def70c2e85a2c3d9f5ec2719921e3a59d3ca3ef4b2fd1a4656a0df3 - languageName: node - linkType: hard - -"ssri@npm:^10.0.0": - version: 10.0.6 - resolution: "ssri@npm:10.0.6" - dependencies: - minipass: ^7.0.3 - checksum: 4603d53a05bcd44188747d38f1cc43833b9951b5a1ee43ba50535bdfc5fe4a0897472dbe69837570a5417c3c073377ef4f8c1a272683b401857f72738ee57299 - languageName: node - linkType: hard - -"stack-trace@npm:0.0.x": - version: 0.0.10 - resolution: "stack-trace@npm:0.0.10" - checksum: 473036ad32f8c00e889613153d6454f9be0536d430eb2358ca51cad6b95cea08a3cc33cc0e34de66b0dad221582b08ed2e61ef8e13f4087ab690f388362d6610 - languageName: node - linkType: hard - -"stacktrace-parser@npm:^0.1.10": - version: 0.1.10 - resolution: "stacktrace-parser@npm:0.1.10" - dependencies: - type-fest: ^0.7.1 - checksum: f4fbddfc09121d91e587b60de4beb4941108e967d71ad3a171812dc839b010ca374d064ad0a296295fed13acd103609d99a4224a25b4e67de13cae131f1901ee - languageName: node - linkType: hard - -"statuses@npm:2.0.1": - version: 2.0.1 - resolution: "statuses@npm:2.0.1" - checksum: 18c7623fdb8f646fb213ca4051be4df7efb3484d4ab662937ca6fbef7ced9b9e12842709872eb3020cc3504b93bde88935c9f6417489627a7786f24f8031cbcb - languageName: node - linkType: hard - -"string-argv@npm:0.3.2": - version: 0.3.2 - resolution: "string-argv@npm:0.3.2" - checksum: 8703ad3f3db0b2641ed2adbb15cf24d3945070d9a751f9e74a924966db9f325ac755169007233e8985a39a6a292f14d4fee20482989b89b96e473c4221508a0f - languageName: node - linkType: hard - -"string-format@npm:^2.0.0": - version: 2.0.0 - resolution: "string-format@npm:2.0.0" - checksum: dada2ef95f6d36c66562c673d95315f80457fa7dce2f3609a2e75d1190b98c88319028cf0a5b6c043d01c18d581b2641579f79480584ba030d6ac6fceb30bc55 - languageName: node - linkType: hard - -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": - version: 4.2.3 - resolution: "string-width@npm:4.2.3" - dependencies: - emoji-regex: ^8.0.0 - is-fullwidth-code-point: ^3.0.0 - strip-ansi: ^6.0.1 - checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb - languageName: node - linkType: hard - -"string-width@npm:^2.1.1": - version: 2.1.1 - resolution: "string-width@npm:2.1.1" - dependencies: - is-fullwidth-code-point: ^2.0.0 - strip-ansi: ^4.0.0 - checksum: d6173abe088c615c8dffaf3861dc5d5906ed3dc2d6fd67ff2bd2e2b5dce7fd683c5240699cf0b1b8aa679a3b3bd6b28b5053c824cb89b813d7f6541d8f89064a - languageName: node - linkType: hard - -"string-width@npm:^5.0.0, string-width@npm:^5.0.1, string-width@npm:^5.1.2": - version: 5.1.2 - resolution: "string-width@npm:5.1.2" - dependencies: - eastasianwidth: ^0.2.0 - emoji-regex: ^9.2.2 - strip-ansi: ^7.0.1 - checksum: 7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 - languageName: node - linkType: hard - -"string_decoder@npm:^1.1.1": - version: 1.3.0 - resolution: "string_decoder@npm:1.3.0" - dependencies: - safe-buffer: ~5.2.0 - checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 - languageName: node - linkType: hard - -"string_decoder@npm:~1.1.1": - version: 1.1.1 - resolution: "string_decoder@npm:1.1.1" - dependencies: - safe-buffer: ~5.1.0 - checksum: 9ab7e56f9d60a28f2be697419917c50cac19f3e8e6c28ef26ed5f4852289fe0de5d6997d29becf59028556f2c62983790c1d9ba1e2a3cc401768ca12d5183a5b - languageName: node - linkType: hard - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": - version: 6.0.1 - resolution: "strip-ansi@npm:6.0.1" - dependencies: - ansi-regex: ^5.0.1 - checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c - languageName: node - linkType: hard - -"strip-ansi@npm:^4.0.0": - version: 4.0.0 - resolution: "strip-ansi@npm:4.0.0" - dependencies: - ansi-regex: ^3.0.0 - checksum: d9186e6c0cf78f25274f6750ee5e4a5725fb91b70fdd79aa5fe648eab092a0ec5b9621b22d69d4534a56319f75d8944efbd84e3afa8d4ad1b9a9491f12c84eca - languageName: node - linkType: hard - -"strip-ansi@npm:^7.0.1": - version: 7.1.0 - resolution: "strip-ansi@npm:7.1.0" - dependencies: - ansi-regex: ^6.0.1 - checksum: 859c73fcf27869c22a4e4d8c6acfe690064659e84bef9458aa6d13719d09ca88dcfd40cbf31fd0be63518ea1a643fe070b4827d353e09533a5b0b9fd4553d64d - languageName: node - linkType: hard - -"strip-bom@npm:4.0.0": - version: 4.0.0 - resolution: "strip-bom@npm:4.0.0" - checksum: 9dbcfbaf503c57c06af15fe2c8176fb1bf3af5ff65003851a102749f875a6dbe0ab3b30115eccf6e805e9d756830d3e40ec508b62b3f1ddf3761a20ebe29d3f3 - languageName: node - linkType: hard - -"strip-final-newline@npm:^2.0.0": - version: 2.0.0 - resolution: "strip-final-newline@npm:2.0.0" - checksum: 69412b5e25731e1938184b5d489c32e340605bb611d6140344abc3421b7f3c6f9984b21dff296dfcf056681b82caa3bb4cc996a965ce37bcfad663e92eae9c64 - languageName: node - linkType: hard - -"strip-final-newline@npm:^3.0.0": - version: 3.0.0 - resolution: "strip-final-newline@npm:3.0.0" - checksum: 23ee263adfa2070cd0f23d1ac14e2ed2f000c9b44229aec9c799f1367ec001478469560abefd00c5c99ee6f0b31c137d53ec6029c53e9f32a93804e18c201050 - languageName: node - linkType: hard - -"strip-hex-prefix@npm:1.0.0": - version: 1.0.0 - resolution: "strip-hex-prefix@npm:1.0.0" - dependencies: - is-hex-prefixed: 1.0.0 - checksum: 4cafe7caee1d281d3694d14920fd5d3c11adf09371cef7e2ccedd5b83efd9e9bd2219b5d6ce6e809df6e0f437dc9d30db1192116580875698aad164a6d6b285b - languageName: node - linkType: hard - -"strip-indent@npm:^3.0.0": - version: 3.0.0 - resolution: "strip-indent@npm:3.0.0" - dependencies: - min-indent: ^1.0.0 - checksum: 18f045d57d9d0d90cd16f72b2313d6364fd2cb4bf85b9f593523ad431c8720011a4d5f08b6591c9d580f446e78855c5334a30fb91aa1560f5d9f95ed1b4a0530 - languageName: node - linkType: hard - -"strip-json-comments@npm:3.1.1, strip-json-comments@npm:^3.1.1": - version: 3.1.1 - resolution: "strip-json-comments@npm:3.1.1" - checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 - languageName: node - linkType: hard - -"superstruct@npm:^2.0.2": - version: 2.0.2 - resolution: "superstruct@npm:2.0.2" - checksum: a5f75b72cb8b14b86f4f7f750dae8c5ab0e4e1d92414b55e7625bae07bbcafad81c92486e7e32ccacd6ae1f553caff2b92a50ff42ad5093fd35b9cb7f4e5ec86 - languageName: node - linkType: hard - -"supports-color@npm:^3.1.0": - version: 3.2.3 - resolution: "supports-color@npm:3.2.3" - dependencies: - has-flag: ^1.0.0 - checksum: 56afc05fa87d00100d90148c4d0a6e20a0af0d56dca5c54d4d40b2553ee737dab0ca4e8b53c4471afc035227b5b44dfa4824747a7f01ad733173536f7da6fbbb - languageName: node - linkType: hard - -"supports-color@npm:^5.3.0, supports-color@npm:^5.5.0": - version: 5.5.0 - resolution: "supports-color@npm:5.5.0" - dependencies: - has-flag: ^3.0.0 - checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac - languageName: node - linkType: hard - -"supports-color@npm:^7.1.0": - version: 7.2.0 - resolution: "supports-color@npm:7.2.0" - dependencies: - has-flag: ^4.0.0 - checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a - languageName: node - linkType: hard - -"supports-color@npm:^8.1.1": - version: 8.1.1 - resolution: "supports-color@npm:8.1.1" - dependencies: - has-flag: ^4.0.0 - checksum: c052193a7e43c6cdc741eb7f378df605636e01ad434badf7324f17fb60c69a880d8d8fcdcb562cf94c2350e57b937d7425ab5b8326c67c2adc48f7c87c1db406 - languageName: node - linkType: hard - -"supports-preserve-symlinks-flag@npm:^1.0.0": - version: 1.0.0 - resolution: "supports-preserve-symlinks-flag@npm:1.0.0" - checksum: 53b1e247e68e05db7b3808b99b892bd36fb096e6fba213a06da7fab22045e97597db425c724f2bbd6c99a3c295e1e73f3e4de78592289f38431049e1277ca0ae - languageName: node - linkType: hard - -"sync-request@npm:^6.0.0": - version: 6.1.0 - resolution: "sync-request@npm:6.1.0" - dependencies: - http-response-object: ^3.0.1 - sync-rpc: ^1.2.1 - then-request: ^6.0.0 - checksum: cc8438a6749f62fb501d022fae0e3af3ac4a9983f889f929c8721b328a1c3408b98ca218aad886785a02be2c34bd75eb1a5a2608bd1fcee3c8c099391ff53a11 - languageName: node - linkType: hard - -"sync-rpc@npm:^1.2.1": - version: 1.3.6 - resolution: "sync-rpc@npm:1.3.6" - dependencies: - get-port: ^3.1.0 - checksum: 4340974fb5641c2cadb9df18d6b791ed2327f28cf6d8a00c99ebc2278e37391e3f5e237596da2ff83d14d2147594c6f5b3b98a93b9327644db425d239dea172f - languageName: node - linkType: hard - -"table-layout@npm:^1.0.2": - version: 1.0.2 - resolution: "table-layout@npm:1.0.2" - dependencies: - array-back: ^4.0.1 - deep-extend: ~0.6.0 - typical: ^5.2.0 - wordwrapjs: ^4.0.0 - checksum: 8f41b5671f101a5195747ec1727b1d35ea2cd5bf85addda11cc2f4b36892db9696ce3c2c7334b5b8a122505b34d19135fede50e25678df71b0439e0704fd953f - languageName: node - linkType: hard - -"table@npm:^6.8.0, table@npm:^6.8.1": - version: 6.8.2 - resolution: "table@npm:6.8.2" - dependencies: - ajv: ^8.0.1 - lodash.truncate: ^4.4.2 - slice-ansi: ^4.0.0 - string-width: ^4.2.3 - strip-ansi: ^6.0.1 - checksum: 61188652f53a980d1759ca460ca8dea5c5322aece3210457e7084882f053c2b6a870041295e08a82cb1d676e31b056406845d94b0abf3c79a4b104777bec413b - languageName: node - linkType: hard - -"tar@npm:^6.1.11, tar@npm:^6.2.1": - version: 6.2.1 - resolution: "tar@npm:6.2.1" - dependencies: - chownr: ^2.0.0 - fs-minipass: ^2.0.0 - minipass: ^5.0.0 - minizlib: ^2.1.1 - mkdirp: ^1.0.3 - yallist: ^4.0.0 - checksum: f1322768c9741a25356c11373bce918483f40fa9a25c69c59410c8a1247632487edef5fe76c5f12ac51a6356d2f1829e96d2bc34098668a2fc34d76050ac2b6c - languageName: node - linkType: hard - -"text-encoding-utf-8@npm:^1.0.2": - version: 1.0.2 - resolution: "text-encoding-utf-8@npm:1.0.2" - checksum: ec4c15d50e738c5dba7327ad432ebf0725ec75d4d69c0bd55609254c5a3bc5341272d7003691084a0a73d60d981c8eb0e87603676fdb6f3fed60f4c9192309f9 - languageName: node - linkType: hard - -"text-extensions@npm:^1.0.0": - version: 1.9.0 - resolution: "text-extensions@npm:1.9.0" - checksum: 56a9962c1b62d39b2bcb369b7558ca85c1b55e554b38dfd725edcc0a1babe5815782a60c17ff6b839093b163dfebb92b804208aaaea616ec7571c8059ae0cf44 - languageName: node - linkType: hard - -"text-hex@npm:1.0.x": - version: 1.0.0 - resolution: "text-hex@npm:1.0.0" - checksum: 1138f68adc97bf4381a302a24e2352f04992b7b1316c5003767e9b0d3367ffd0dc73d65001ea02b07cd0ecc2a9d186de0cf02f3c2d880b8a522d4ccb9342244a - languageName: node - linkType: hard - -"text-table@npm:^0.2.0": - version: 0.2.0 - resolution: "text-table@npm:0.2.0" - checksum: b6937a38c80c7f84d9c11dd75e49d5c44f71d95e810a3250bd1f1797fc7117c57698204adf676b71497acc205d769d65c16ae8fa10afad832ae1322630aef10a - languageName: node - linkType: hard - -"then-request@npm:^6.0.0": - version: 6.0.2 - resolution: "then-request@npm:6.0.2" - dependencies: - "@types/concat-stream": ^1.6.0 - "@types/form-data": 0.0.33 - "@types/node": ^8.0.0 - "@types/qs": ^6.2.31 - caseless: ~0.12.0 - concat-stream: ^1.6.0 - form-data: ^2.2.0 - http-basic: ^8.1.1 - http-response-object: ^3.0.1 - promise: ^8.0.0 - qs: ^6.4.0 - checksum: a24a4fc95dd8591966bf3752f024f5cd4d53c2b2c29b23b4e40c3322df6a432d939bc17b589d8e9d760b90e92ab860f6f361a4dfcfe3542019e1615fb51afccc - languageName: node - linkType: hard - -"through2@npm:^4.0.0": - version: 4.0.2 - resolution: "through2@npm:4.0.2" - dependencies: - readable-stream: 3 - checksum: ac7430bd54ccb7920fd094b1c7ff3e1ad6edd94202e5528331253e5fde0cc56ceaa690e8df9895de2e073148c52dfbe6c4db74cacae812477a35660090960cc0 - languageName: node - linkType: hard - -"through@npm:>=2.2.7 <3, through@npm:^2.3.6": - version: 2.3.8 - resolution: "through@npm:2.3.8" - checksum: a38c3e059853c494af95d50c072b83f8b676a9ba2818dcc5b108ef252230735c54e0185437618596c790bbba8fcdaef5b290405981ffa09dce67b1f1bf190cbd - languageName: node - linkType: hard - -"tmp@npm:0.0.33, tmp@npm:^0.0.33": - version: 0.0.33 - resolution: "tmp@npm:0.0.33" - dependencies: - os-tmpdir: ~1.0.2 - checksum: 902d7aceb74453ea02abbf58c203f4a8fc1cead89b60b31e354f74ed5b3fb09ea817f94fb310f884a5d16987dd9fa5a735412a7c2dd088dd3d415aa819ae3a28 - languageName: node - linkType: hard - -"to-fast-properties@npm:^2.0.0": - version: 2.0.0 - resolution: "to-fast-properties@npm:2.0.0" - checksum: be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168 - languageName: node - linkType: hard - -"to-regex-range@npm:^5.0.1": - version: 5.0.1 - resolution: "to-regex-range@npm:5.0.1" - dependencies: - is-number: ^7.0.0 - checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed - languageName: node - linkType: hard - -"toidentifier@npm:1.0.1": - version: 1.0.1 - resolution: "toidentifier@npm:1.0.1" - checksum: 952c29e2a85d7123239b5cfdd889a0dde47ab0497f0913d70588f19c53f7e0b5327c95f4651e413c74b785147f9637b17410ac8c846d5d4a20a5a33eb6dc3a45 - languageName: node - linkType: hard - -"touch@npm:^3.1.0": - version: 3.1.1 - resolution: "touch@npm:3.1.1" - bin: - nodetouch: bin/nodetouch.js - checksum: fb8c54207500eb760b6b9d77b9c5626cc027c9ad44431eed4268845f00f8c6bbfc95ce7e9da8e487f020aa921982a8bc5d8e909d0606e82686bd0a08a8e0539b - languageName: node - linkType: hard - -"tr46@npm:^4.1.1": - version: 4.1.1 - resolution: "tr46@npm:4.1.1" - dependencies: - punycode: ^2.3.0 - checksum: aeeb821ac2cd792e63ec84888b4fd6598ac6ed75d861579e21a5cf9d4ee78b2c6b94e7d45036f2ca2088bc85b9b46560ad23c4482979421063b24137349dbd96 - languageName: node - linkType: hard - -"tr46@npm:~0.0.3": - version: 0.0.3 - resolution: "tr46@npm:0.0.3" - checksum: 726321c5eaf41b5002e17ffbd1fb7245999a073e8979085dacd47c4b4e8068ff5777142fc6726d6ca1fd2ff16921b48788b87225cbc57c72636f6efa8efbffe3 - languageName: node - linkType: hard - -"trim-newlines@npm:^3.0.0": - version: 3.0.1 - resolution: "trim-newlines@npm:3.0.1" - checksum: b530f3fadf78e570cf3c761fb74fef655beff6b0f84b29209bac6c9622db75ad1417f4a7b5d54c96605dcd72734ad44526fef9f396807b90839449eb543c6206 - languageName: node - linkType: hard - -"triple-beam@npm:^1.3.0": - version: 1.4.1 - resolution: "triple-beam@npm:1.4.1" - checksum: 2e881a3e8e076b6f2b85b9ec9dd4a900d3f5016e6d21183ed98e78f9abcc0149e7d54d79a3f432b23afde46b0885bdcdcbff789f39bc75de796316961ec07f61 - languageName: node - linkType: hard - -"ts-api-utils@npm:^1.0.1": - version: 1.3.0 - resolution: "ts-api-utils@npm:1.3.0" - peerDependencies: - typescript: ">=4.2.0" - checksum: c746ddabfdffbf16cb0b0db32bb287236a19e583057f8649ee7c49995bb776e1d3ef384685181c11a1a480369e022ca97512cb08c517b2d2bd82c83754c97012 - languageName: node - linkType: hard - -"ts-command-line-args@npm:^2.2.0": - version: 2.5.1 - resolution: "ts-command-line-args@npm:2.5.1" - dependencies: - chalk: ^4.1.0 - command-line-args: ^5.1.1 - command-line-usage: ^6.1.0 - string-format: ^2.0.0 - bin: - write-markdown: dist/write-markdown.js - checksum: 7c0a7582e94f1d2160e3dd379851ec4f1758bc673ccd71bae07f839f83051b6b83e0ae14325c2d04ea728e5bde7b7eacfd2ab060b8fd4b8ab29e0bbf77f6c51e - languageName: node - linkType: hard - -"ts-essentials@npm:^1.0.0": - version: 1.0.4 - resolution: "ts-essentials@npm:1.0.4" - checksum: 2e19bbe51203707ca732dcc6c3f238b2cf22bb9213d26ae0246c02325fb3e5f17c32505ac79c1bd538b7951a798155b07422e263a95cb295070a48233e45a1b5 - languageName: node - linkType: hard - -"ts-essentials@npm:^7.0.1": - version: 7.0.3 - resolution: "ts-essentials@npm:7.0.3" - peerDependencies: - typescript: ">=3.7.0" - checksum: 74d75868acf7f8b95e447d8b3b7442ca21738c6894e576df9917a352423fde5eb43c5651da5f78997da6061458160ae1f6b279150b42f47ccc58b73e55acaa2f - languageName: node - linkType: hard - -"ts-generator@npm:^0.1.1": - version: 0.1.1 - resolution: "ts-generator@npm:0.1.1" - dependencies: - "@types/mkdirp": ^0.5.2 - "@types/prettier": ^2.1.1 - "@types/resolve": ^0.0.8 - chalk: ^2.4.1 - glob: ^7.1.2 - mkdirp: ^0.5.1 - prettier: ^2.1.2 - resolve: ^1.8.1 - ts-essentials: ^1.0.0 - bin: - ts-generator: dist/cli/run.js - checksum: 3add2e76afd7a4d9d9aee1ff26477ee4e8b4cc740b35787f9ea780c11aefc88e6c7833837eacc12b944c1883680639dc9cc47fe173eff95c62112f3a41132146 - languageName: node - linkType: hard - -"ts-node@npm:^10.8.1, ts-node@npm:^10.9.1": - version: 10.9.2 - resolution: "ts-node@npm:10.9.2" - dependencies: - "@cspotcode/source-map-support": ^0.8.0 - "@tsconfig/node10": ^1.0.7 - "@tsconfig/node12": ^1.0.7 - "@tsconfig/node14": ^1.0.0 - "@tsconfig/node16": ^1.0.2 - acorn: ^8.4.1 - acorn-walk: ^8.1.1 - arg: ^4.1.0 - create-require: ^1.1.0 - diff: ^4.0.1 - make-error: ^1.1.1 - v8-compile-cache-lib: ^3.0.1 - yn: 3.1.1 - peerDependencies: - "@swc/core": ">=1.2.50" - "@swc/wasm": ">=1.2.50" - "@types/node": "*" - typescript: ">=2.7" - peerDependenciesMeta: - "@swc/core": - optional: true - "@swc/wasm": - optional: true - bin: - ts-node: dist/bin.js - ts-node-cwd: dist/bin-cwd.js - ts-node-esm: dist/bin-esm.js - ts-node-script: dist/bin-script.js - ts-node-transpile-only: dist/bin-transpile.js - ts-script: dist/bin-script-deprecated.js - checksum: fde256c9073969e234526e2cfead42591b9a2aec5222bac154b0de2fa9e4ceb30efcd717ee8bc785a56f3a119bdd5aa27b333d9dbec94ed254bd26f8944c67ac - languageName: node - linkType: hard - -"tslib@npm:2.4.0": - version: 2.4.0 - resolution: "tslib@npm:2.4.0" - checksum: 8c4aa6a3c5a754bf76aefc38026134180c053b7bd2f81338cb5e5ebf96fefa0f417bff221592bf801077f5bf990562f6264fecbc42cd3309b33872cb6fc3b113 - languageName: node - linkType: hard - -"tslib@npm:^1.8.1, tslib@npm:^1.9.3": - version: 1.14.1 - resolution: "tslib@npm:1.14.1" - checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd - languageName: node - linkType: hard - -"tslib@npm:^2.1.0, tslib@npm:^2.4.0": - version: 2.7.0 - resolution: "tslib@npm:2.7.0" - checksum: 1606d5c89f88d466889def78653f3aab0f88692e80bb2066d090ca6112ae250ec1cfa9dbfaab0d17b60da15a4186e8ec4d893801c67896b277c17374e36e1d28 - languageName: node - linkType: hard - -"tsort@npm:0.0.1": - version: 0.0.1 - resolution: "tsort@npm:0.0.1" - checksum: 581566c248690b9ea7e431e1545affb3d2cab0f5dcd0e45ddef815dfaec4864cb5f0cfd8072924dedbc0de9585ff07e3e65db60f14fab4123737b9bb6e72eacc - languageName: node - linkType: hard - -"tsutils@npm:^3.21.0": - version: 3.21.0 - resolution: "tsutils@npm:3.21.0" - dependencies: - tslib: ^1.8.1 - peerDependencies: - typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - checksum: 1843f4c1b2e0f975e08c4c21caa4af4f7f65a12ac1b81b3b8489366826259323feb3fc7a243123453d2d1a02314205a7634e048d4a8009921da19f99755cdc48 - languageName: node - linkType: hard - -"tweetnacl-util@npm:^0.15.1": - version: 0.15.1 - resolution: "tweetnacl-util@npm:0.15.1" - checksum: ae6aa8a52cdd21a95103a4cc10657d6a2040b36c7a6da7b9d3ab811c6750a2d5db77e8c36969e75fdee11f511aa2b91c552496c6e8e989b6e490e54aca2864fc - languageName: node - linkType: hard - -"tweetnacl@npm:^1.0.3": - version: 1.0.3 - resolution: "tweetnacl@npm:1.0.3" - checksum: e4a57cac188f0c53f24c7a33279e223618a2bfb5fea426231991652a13247bea06b081fd745d71291fcae0f4428d29beba1b984b1f1ce6f66b06a6d1ab90645c - languageName: node - linkType: hard - -"type-check@npm:^0.4.0, type-check@npm:~0.4.0": - version: 0.4.0 - resolution: "type-check@npm:0.4.0" - dependencies: - prelude-ls: ^1.2.1 - checksum: ec688ebfc9c45d0c30412e41ca9c0cdbd704580eb3a9ccf07b9b576094d7b86a012baebc95681999dd38f4f444afd28504cb3a89f2ef16b31d4ab61a0739025a - languageName: node - linkType: hard - -"type-check@npm:~0.3.2": - version: 0.3.2 - resolution: "type-check@npm:0.3.2" - dependencies: - prelude-ls: ~1.1.2 - checksum: dd3b1495642731bc0e1fc40abe5e977e0263005551ac83342ecb6f4f89551d106b368ec32ad3fb2da19b3bd7b2d1f64330da2ea9176d8ddbfe389fb286eb5124 - languageName: node - linkType: hard - -"type-detect@npm:^4.0.0, type-detect@npm:^4.1.0": - version: 4.1.0 - resolution: "type-detect@npm:4.1.0" - checksum: 3b32f873cd02bc7001b00a61502b7ddc4b49278aabe68d652f732e1b5d768c072de0bc734b427abf59d0520a5f19a2e07309ab921ef02018fa1cb4af155cdb37 - languageName: node - linkType: hard - -"type-fest@npm:^0.18.0": - version: 0.18.1 - resolution: "type-fest@npm:0.18.1" - checksum: e96dcee18abe50ec82dab6cbc4751b3a82046da54c52e3b2d035b3c519732c0b3dd7a2fa9df24efd1a38d953d8d4813c50985f215f1957ee5e4f26b0fe0da395 - languageName: node - linkType: hard - -"type-fest@npm:^0.20.2": - version: 0.20.2 - resolution: "type-fest@npm:0.20.2" - checksum: 4fb3272df21ad1c552486f8a2f8e115c09a521ad7a8db3d56d53718d0c907b62c6e9141ba5f584af3f6830d0872c521357e512381f24f7c44acae583ad517d73 - languageName: node - linkType: hard - -"type-fest@npm:^0.21.3": - version: 0.21.3 - resolution: "type-fest@npm:0.21.3" - checksum: e6b32a3b3877f04339bae01c193b273c62ba7bfc9e325b8703c4ee1b32dc8fe4ef5dfa54bf78265e069f7667d058e360ae0f37be5af9f153b22382cd55a9afe0 - languageName: node - linkType: hard - -"type-fest@npm:^0.6.0": - version: 0.6.0 - resolution: "type-fest@npm:0.6.0" - checksum: b2188e6e4b21557f6e92960ec496d28a51d68658018cba8b597bd3ef757721d1db309f120ae987abeeda874511d14b776157ff809f23c6d1ce8f83b9b2b7d60f - languageName: node - linkType: hard - -"type-fest@npm:^0.7.1": - version: 0.7.1 - resolution: "type-fest@npm:0.7.1" - checksum: 5b1b113529d59949d97b76977d545989ddc11b81bb0c766b6d2ccc65473cb4b4a5c7d24f5be2c2bb2de302a5d7a13c1732ea1d34c8c59b7e0ec1f890cf7fc424 - languageName: node - linkType: hard - -"type-fest@npm:^0.8.1": - version: 0.8.1 - resolution: "type-fest@npm:0.8.1" - checksum: d61c4b2eba24009033ae4500d7d818a94fd6d1b481a8111612ee141400d5f1db46f199c014766b9fa9b31a6a7374d96fc748c6d688a78a3ce5a33123839becb7 - languageName: node - linkType: hard - -"type-fest@npm:^1.0.2": - version: 1.4.0 - resolution: "type-fest@npm:1.4.0" - checksum: b011c3388665b097ae6a109a437a04d6f61d81b7357f74cbcb02246f2f5bd72b888ae33631b99871388122ba0a87f4ff1c94078e7119ff22c70e52c0ff828201 - languageName: node - linkType: hard - -"typechain@npm:^8.1.1": - version: 8.3.2 - resolution: "typechain@npm:8.3.2" - 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 - peerDependencies: - typescript: ">=4.3.0" - bin: - typechain: dist/cli/cli.js - checksum: 146a1896fa93403404be78757790b0f95b5457efebcca16b61622e09c374d555ef4f837c1c4eedf77e03abc50276d96a2f33064ec09bb802f62d8cc2b13fce70 - languageName: node - linkType: hard - -"typedarray@npm:^0.0.6": - version: 0.0.6 - resolution: "typedarray@npm:0.0.6" - checksum: 33b39f3d0e8463985eeaeeacc3cb2e28bc3dfaf2a5ed219628c0b629d5d7b810b0eb2165f9f607c34871d5daa92ba1dc69f49051cf7d578b4cbd26c340b9d1b1 - languageName: node - linkType: hard - -"typescript@npm:^4.6.4 || ^5.2.2, typescript@npm:^5.2.2": - version: 5.6.2 - resolution: "typescript@npm:5.6.2" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 48777e1dabd9044519f56cd012b0296e3b72bafe12b7e8e34222751d45c67e0eba5387ecdaa6c14a53871a29361127798df6dc8d1d35643a0a47cb0b1c65a33a - languageName: node - linkType: hard - -"typescript@npm:^4.9.3": - version: 4.9.5 - resolution: "typescript@npm:4.9.5" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: ee000bc26848147ad423b581bd250075662a354d84f0e06eb76d3b892328d8d4440b7487b5a83e851b12b255f55d71835b008a66cbf8f255a11e4400159237db - languageName: node - linkType: hard - -"typescript@patch:typescript@^4.6.4 || ^5.2.2#~builtin, typescript@patch:typescript@^5.2.2#~builtin": - version: 5.6.2 - resolution: "typescript@patch:typescript@npm%3A5.6.2#~builtin::version=5.6.2&hash=7ad353" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: c084ee1ab865f108c787e6233a5f63c126c482c0c8e87ec998ac5288a2ad54b603e1ea8b8b272355823b833eb31b9fabb99e8c6152283e1cb47e3a76bd6faf6c - languageName: node - linkType: hard - -"typescript@patch:typescript@^4.9.3#~builtin": - version: 4.9.5 - resolution: "typescript@patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=7ad353" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 2eee5c37cad4390385db5db5a8e81470e42e8f1401b0358d7390095d6f681b410f2c4a0c496c6ff9ebd775423c7785cdace7bcdad76c7bee283df3d9718c0f20 - languageName: node - linkType: hard - -"typical@npm:^4.0.0": - version: 4.0.0 - resolution: "typical@npm:4.0.0" - checksum: a242081956825328f535e6195a924240b34daf6e7fdb573a1809a42b9f37fb8114fa99c7ab89a695e0cdb419d4149d067f6723e4b95855ffd39c6c4ca378efb3 - languageName: node - linkType: hard - -"typical@npm:^5.2.0": - version: 5.2.0 - resolution: "typical@npm:5.2.0" - checksum: ccaeb151a9a556291b495571ca44c4660f736fb49c29314bbf773c90fad92e9485d3cc2b074c933866c1595abbbc962f2b8bfc6e0f52a8c6b0cdd205442036ac - languageName: node - linkType: hard - -"uglify-js@npm:^3.1.4": - version: 3.19.3 - resolution: "uglify-js@npm:3.19.3" - bin: - uglifyjs: bin/uglifyjs - checksum: 7ed6272fba562eb6a3149cfd13cda662f115847865c03099e3995a0e7a910eba37b82d4fccf9e88271bb2bcbe505bb374967450f433c17fa27aa36d94a8d0553 - languageName: node - linkType: hard - -"undefsafe@npm:^2.0.5": - version: 2.0.5 - resolution: "undefsafe@npm:2.0.5" - checksum: f42ab3b5770fedd4ada175fc1b2eb775b78f609156f7c389106aafd231bfc210813ee49f54483d7191d7b76e483bc7f537b5d92d19ded27156baf57592eb02cc - languageName: node - linkType: hard - -"undici-types@npm:~5.26.4": - version: 5.26.5 - resolution: "undici-types@npm:5.26.5" - checksum: 3192ef6f3fd5df652f2dc1cd782b49d6ff14dc98e5dced492aa8a8c65425227da5da6aafe22523c67f035a272c599bb89cfe803c1db6311e44bed3042fc25487 - languageName: node - linkType: hard - -"undici-types@npm:~6.19.2": - version: 6.19.8 - resolution: "undici-types@npm:6.19.8" - checksum: de51f1b447d22571cf155dfe14ff6d12c5bdaec237c765085b439c38ca8518fc360e88c70f99469162bf2e14188a7b0bcb06e1ed2dc031042b984b0bb9544017 - languageName: node - linkType: hard - -"undici@npm:^5.14.0": - version: 5.28.4 - resolution: "undici@npm:5.28.4" - dependencies: - "@fastify/busboy": ^2.0.0 - checksum: a8193132d84540e4dc1895ecc8dbaa176e8a49d26084d6fbe48a292e28397cd19ec5d13bc13e604484e76f94f6e334b2bdc740d5f06a6e50c44072818d0c19f9 - languageName: node - linkType: hard - -"unique-filename@npm:^3.0.0": - version: 3.0.0 - resolution: "unique-filename@npm:3.0.0" - dependencies: - unique-slug: ^4.0.0 - checksum: 8e2f59b356cb2e54aab14ff98a51ac6c45781d15ceaab6d4f1c2228b780193dc70fae4463ce9e1df4479cb9d3304d7c2043a3fb905bdeca71cc7e8ce27e063df - languageName: node - linkType: hard - -"unique-slug@npm:^4.0.0": - version: 4.0.0 - resolution: "unique-slug@npm:4.0.0" - dependencies: - imurmurhash: ^0.1.4 - checksum: 0884b58365af59f89739e6f71e3feacb5b1b41f2df2d842d0757933620e6de08eff347d27e9d499b43c40476cbaf7988638d3acb2ffbcb9d35fd035591adfd15 - languageName: node - linkType: hard - -"universalify@npm:^0.1.0": - version: 0.1.2 - resolution: "universalify@npm:0.1.2" - checksum: 40cdc60f6e61070fe658ca36016a8f4ec216b29bf04a55dce14e3710cc84c7448538ef4dad3728d0bfe29975ccd7bfb5f414c45e7b78883567fb31b246f02dff - languageName: node - linkType: hard - -"universalify@npm:^2.0.0": - version: 2.0.1 - resolution: "universalify@npm:2.0.1" - checksum: ecd8469fe0db28e7de9e5289d32bd1b6ba8f7183db34f3bfc4ca53c49891c2d6aa05f3fb3936a81285a905cc509fb641a0c3fc131ec786167eff41236ae32e60 - languageName: node - linkType: hard - -"unpipe@npm:1.0.0": - version: 1.0.0 - resolution: "unpipe@npm:1.0.0" - checksum: 4fa18d8d8d977c55cb09715385c203197105e10a6d220087ec819f50cb68870f02942244f1017565484237f1f8c5d3cd413631b1ae104d3096f24fdfde1b4aa2 - languageName: node - linkType: hard - -"uri-js@npm:^4.2.2": - version: 4.4.1 - resolution: "uri-js@npm:4.4.1" - dependencies: - punycode: ^2.1.0 - checksum: 7167432de6817fe8e9e0c9684f1d2de2bb688c94388f7569f7dbdb1587c9f4ca2a77962f134ec90be0cc4d004c939ff0d05acc9f34a0db39a3c797dada262633 - languageName: node - linkType: hard - -"utf-8-validate@npm:^5.0.2": - version: 5.0.10 - resolution: "utf-8-validate@npm:5.0.10" - dependencies: - node-gyp: latest - node-gyp-build: ^4.3.0 - checksum: 5579350a023c66a2326752b6c8804cc7b39dcd251bb088241da38db994b8d78352e388dcc24ad398ab98385ba3c5ffcadb6b5b14b2637e43f767869055e46ba6 - languageName: node - linkType: hard - -"utf8@npm:3.0.0": - version: 3.0.0 - resolution: "utf8@npm:3.0.0" - checksum: cb89a69ad9ab393e3eae9b25305b3ff08bebca9adc839191a34f90777eb2942f86a96369d2839925fea58f8f722f7e27031d697f10f5f39690f8c5047303e62d - languageName: node - linkType: hard - -"util-deprecate@npm:^1.0.1, util-deprecate@npm:~1.0.1": - version: 1.0.2 - resolution: "util-deprecate@npm:1.0.2" - checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 - languageName: node - linkType: hard - -"uuid@npm:^8.3.2": - version: 8.3.2 - resolution: "uuid@npm:8.3.2" - bin: - uuid: dist/bin/uuid - checksum: 5575a8a75c13120e2f10e6ddc801b2c7ed7d8f3c8ac22c7ed0c7b2ba6383ec0abda88c905085d630e251719e0777045ae3236f04c812184b7c765f63a70e58df - languageName: node - linkType: hard - -"v8-compile-cache-lib@npm:^3.0.1": - version: 3.0.1 - resolution: "v8-compile-cache-lib@npm:3.0.1" - checksum: 78089ad549e21bcdbfca10c08850022b22024cdcc2da9b168bcf5a73a6ed7bf01a9cebb9eac28e03cd23a684d81e0502797e88f3ccd27a32aeab1cfc44c39da0 - languageName: node - linkType: hard - -"validate-npm-package-license@npm:^3.0.1": - version: 3.0.4 - resolution: "validate-npm-package-license@npm:3.0.4" - dependencies: - spdx-correct: ^3.0.0 - spdx-expression-parse: ^3.0.0 - checksum: 35703ac889d419cf2aceef63daeadbe4e77227c39ab6287eeb6c1b36a746b364f50ba22e88591f5d017bc54685d8137bc2d328d0a896e4d3fd22093c0f32a9ad - languageName: node - linkType: hard - -"viem@npm:^2.9.28": - version: 2.21.6 - resolution: "viem@npm:2.21.6" - dependencies: - "@adraffy/ens-normalize": 1.10.0 - "@noble/curves": 1.4.0 - "@noble/hashes": 1.4.0 - "@scure/bip32": 1.4.0 - "@scure/bip39": 1.4.0 - abitype: 1.0.5 - isows: 1.0.4 - webauthn-p256: 0.0.5 - ws: 8.17.1 - peerDependencies: - typescript: ">=5.0.4" - peerDependenciesMeta: - typescript: - optional: true - checksum: 6cbcadb178f78b5b0fc73dcd956efeecd3c3da0e86de47154e16c665e5a6f3e495e78ec620a9e8ec63d32afdb93b0f3de8ce60812c76776614ed40434f6bbaf1 - languageName: node - linkType: hard - -"wcwidth@npm:^1.0.1": - version: 1.0.1 - resolution: "wcwidth@npm:1.0.1" - dependencies: - defaults: ^1.0.3 - checksum: 814e9d1ddcc9798f7377ffa448a5a3892232b9275ebb30a41b529607691c0491de47cba426e917a4d08ded3ee7e9ba2f3fe32e62ee3cd9c7d3bafb7754bd553c - languageName: node - linkType: hard - -"web3-utils@npm:^1.3.6": - version: 1.10.4 - resolution: "web3-utils@npm:1.10.4" - dependencies: - "@ethereumjs/util": ^8.1.0 - bn.js: ^5.2.1 - ethereum-bloom-filters: ^1.0.6 - ethereum-cryptography: ^2.1.2 - ethjs-unit: 0.1.6 - number-to-bn: 1.7.0 - randombytes: ^2.1.0 - utf8: 3.0.0 - checksum: a1535817a4653f1b5cc868aa19305158122379078a41e13642e1ba64803f6f8e5dd2fb8c45c033612b8f52dde42d8008afce85296c0608276fe1513dece66a49 - languageName: node - linkType: hard - -"webauthn-p256@npm:0.0.5": - version: 0.0.5 - resolution: "webauthn-p256@npm:0.0.5" - dependencies: - "@noble/curves": ^1.4.0 - "@noble/hashes": ^1.4.0 - checksum: 2837188d1e6d947c87c5728374fb6aec96387cb766f78e7a04d5903774264feb278d68a639748f09997f591e5278796c662bb5c4e8b8286b0f22254694023584 - languageName: node - linkType: hard - -"webidl-conversions@npm:^3.0.0": - version: 3.0.1 - resolution: "webidl-conversions@npm:3.0.1" - checksum: c92a0a6ab95314bde9c32e1d0a6dfac83b578f8fa5f21e675bc2706ed6981bc26b7eb7e6a1fab158e5ce4adf9caa4a0aee49a52505d4d13c7be545f15021b17c - languageName: node - linkType: hard - -"webidl-conversions@npm:^7.0.0": - version: 7.0.0 - resolution: "webidl-conversions@npm:7.0.0" - checksum: f05588567a2a76428515333eff87200fae6c83c3948a7482ebb109562971e77ef6dc49749afa58abb993391227c5697b3ecca52018793e0cb4620a48f10bd21b - languageName: node - linkType: hard - -"whatwg-url@npm:^13.0.0": - version: 13.0.0 - resolution: "whatwg-url@npm:13.0.0" - dependencies: - tr46: ^4.1.1 - webidl-conversions: ^7.0.0 - checksum: 7f69272a1bfd5f0d994988b9e234e35d21071a9bffe0d6fd4477d295552665c566b176ff8e0251a0a79c61c5a67a7a392e248aae5887d7e22bdff0125209e26b - languageName: node - linkType: hard - -"whatwg-url@npm:^5.0.0": - version: 5.0.0 - resolution: "whatwg-url@npm:5.0.0" - dependencies: - tr46: ~0.0.3 - webidl-conversions: ^3.0.0 - checksum: b8daed4ad3356cc4899048a15b2c143a9aed0dfae1f611ebd55073310c7b910f522ad75d727346ad64203d7e6c79ef25eafd465f4d12775ca44b90fa82ed9e2c - languageName: node - linkType: hard - -"which@npm:^1.1.1, which@npm:^1.2.14, which@npm:^1.3.1": - version: 1.3.1 - resolution: "which@npm:1.3.1" - dependencies: - isexe: ^2.0.0 - bin: - which: ./bin/which - checksum: f2e185c6242244b8426c9df1510e86629192d93c1a986a7d2a591f2c24869e7ffd03d6dac07ca863b2e4c06f59a4cc9916c585b72ee9fa1aa609d0124df15e04 - languageName: node - linkType: hard - -"which@npm:^2.0.1": - version: 2.0.2 - resolution: "which@npm:2.0.2" - dependencies: - isexe: ^2.0.0 - bin: - node-which: ./bin/node-which - checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 - languageName: node - linkType: hard - -"which@npm:^4.0.0": - version: 4.0.0 - resolution: "which@npm:4.0.0" - dependencies: - isexe: ^3.1.1 - bin: - node-which: bin/which.js - checksum: f17e84c042592c21e23c8195108cff18c64050b9efb8459589116999ea9da6dd1509e6a1bac3aeebefd137be00fabbb61b5c2bc0aa0f8526f32b58ee2f545651 - languageName: node - linkType: hard - -"winston-transport@npm:^4.7.0": - version: 4.7.1 - resolution: "winston-transport@npm:4.7.1" - dependencies: - logform: ^2.6.1 - readable-stream: ^3.6.2 - triple-beam: ^1.3.0 - checksum: e1dc070df1eb2ab0270a369fd7e8ff2b7a714ba9cf9a3f2c9a3509eb5fe60667c64e5cd4f37b3dd64a21017a93ea63fdcb2ac9176b12d2222a9e4244439d1b35 - languageName: node - linkType: hard - -"winston@npm:^3.11.0": - version: 3.14.2 - resolution: "winston@npm:3.14.2" - dependencies: - "@colors/colors": ^1.6.0 - "@dabh/diagnostics": ^2.0.2 - async: ^3.2.3 - is-stream: ^2.0.0 - logform: ^2.6.0 - one-time: ^1.0.0 - readable-stream: ^3.4.0 - safe-stable-stringify: ^2.3.1 - stack-trace: 0.0.x - triple-beam: ^1.3.0 - winston-transport: ^4.7.0 - checksum: 9021637d3ab1d1e639d64e7217ed5ae63fb0e5325defdbce439f708e9b4e26c7a31eb4a731106790aa8ac6f80a3a89242de18d1991ab3838f9d84e55101f4607 - languageName: node - linkType: hard - -"word-wrap@npm:^1.0.3, word-wrap@npm:^1.2.5, word-wrap@npm:~1.2.3": - version: 1.2.5 - resolution: "word-wrap@npm:1.2.5" - checksum: f93ba3586fc181f94afdaff3a6fef27920b4b6d9eaefed0f428f8e07adea2a7f54a5f2830ce59406c8416f033f86902b91eb824072354645eea687dff3691ccb - languageName: node - linkType: hard - -"wordwrap@npm:^1.0.0": - version: 1.0.0 - resolution: "wordwrap@npm:1.0.0" - checksum: 2a44b2788165d0a3de71fd517d4880a8e20ea3a82c080ce46e294f0b68b69a2e49cff5f99c600e275c698a90d12c5ea32aff06c311f0db2eb3f1201f3e7b2a04 - languageName: node - linkType: hard - -"wordwrapjs@npm:^4.0.0": - version: 4.0.1 - resolution: "wordwrapjs@npm:4.0.1" - dependencies: - reduce-flatten: ^2.0.0 - typical: ^5.2.0 - checksum: 3d927f3c95d0ad990968da54c0ad8cde2801d8e91006cd7474c26e6b742cc8557250ce495c9732b2f9db1f903601cb74ec282e0f122ee0d02d7abe81e150eea8 - languageName: node - linkType: hard - -"workerpool@npm:^6.5.1": - version: 6.5.1 - resolution: "workerpool@npm:6.5.1" - checksum: f86d13f9139c3a57c5a5867e81905cd84134b499849405dec2ffe5b1acd30dabaa1809f6f6ee603a7c65e1e4325f21509db6b8398eaf202c8b8f5809e26a2e16 - languageName: node - linkType: hard - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": - version: 7.0.0 - resolution: "wrap-ansi@npm:7.0.0" - dependencies: - ansi-styles: ^4.0.0 - string-width: ^4.1.0 - strip-ansi: ^6.0.0 - checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b - languageName: node - linkType: hard - -"wrap-ansi@npm:^8.0.1, wrap-ansi@npm:^8.1.0": - version: 8.1.0 - resolution: "wrap-ansi@npm:8.1.0" - dependencies: - ansi-styles: ^6.1.0 - string-width: ^5.0.1 - strip-ansi: ^7.0.1 - checksum: 371733296dc2d616900ce15a0049dca0ef67597d6394c57347ba334393599e800bab03c41d4d45221b6bc967b8c453ec3ae4749eff3894202d16800fdfe0e238 - languageName: node - linkType: hard - -"wrappy@npm:1": - version: 1.0.2 - resolution: "wrappy@npm:1.0.2" - checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 - languageName: node - linkType: hard - -"ws@npm:7.4.6": - version: 7.4.6 - resolution: "ws@npm:7.4.6" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 3a990b32ed08c72070d5e8913e14dfcd831919205be52a3ff0b4cdd998c8d554f167c9df3841605cde8b11d607768cacab3e823c58c96a5c08c987e093eb767a - languageName: node - linkType: hard - -"ws@npm:8.17.1": - version: 8.17.1 - resolution: "ws@npm:8.17.1" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 442badcce1f1178ec87a0b5372ae2e9771e07c4929a3180321901f226127f252441e8689d765aa5cfba5f50ac60dd830954afc5aeae81609aefa11d3ddf5cecf - languageName: node - linkType: hard - -"ws@npm:^7.4.6, ws@npm:^7.5.10": - version: 7.5.10 - resolution: "ws@npm:7.5.10" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: f9bb062abf54cc8f02d94ca86dcd349c3945d63851f5d07a3a61c2fcb755b15a88e943a63cf580cbdb5b74436d67ef6b67f745b8f7c0814e411379138e1863cb - languageName: node - linkType: hard - -"ws@npm:^8.5.0": - version: 8.18.0 - resolution: "ws@npm:8.18.0" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 91d4d35bc99ff6df483bdf029b9ea4bfd7af1f16fc91231a96777a63d263e1eabf486e13a2353970efc534f9faa43bdbf9ee76525af22f4752cbc5ebda333975 - languageName: node - linkType: hard - -"y18n@npm:^5.0.5": - version: 5.0.8 - resolution: "y18n@npm:5.0.8" - checksum: 54f0fb95621ee60898a38c572c515659e51cc9d9f787fb109cef6fde4befbe1c4602dc999d30110feee37456ad0f1660fa2edcfde6a9a740f86a290999550d30 - languageName: node - linkType: hard - -"yallist@npm:^3.0.2": - version: 3.1.1 - resolution: "yallist@npm:3.1.1" - checksum: 48f7bb00dc19fc635a13a39fe547f527b10c9290e7b3e836b9a8f1ca04d4d342e85714416b3c2ab74949c9c66f9cebb0473e6bc353b79035356103b47641285d - languageName: node - linkType: hard - -"yallist@npm:^4.0.0": - version: 4.0.0 - resolution: "yallist@npm:4.0.0" - checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 - languageName: node - linkType: hard - -"yaml@npm:2.3.1": - version: 2.3.1 - resolution: "yaml@npm:2.3.1" - checksum: 2c7bc9a7cd4c9f40d3b0b0a98e370781b68b8b7c4515720869aced2b00d92f5da1762b4ffa947f9e795d6cd6b19f410bd4d15fdd38aca7bd96df59bd9486fb54 - languageName: node - linkType: hard - -"yaml@npm:^2.2.2": - version: 2.5.1 - resolution: "yaml@npm:2.5.1" - bin: - yaml: bin.mjs - checksum: 31275223863fbd0b47ba9d2b248fbdf085db8d899e4ca43fff8a3a009497c5741084da6871d11f40e555d61360951c4c910b98216c1325d2c94753c0036d8172 - languageName: node - linkType: hard - -"yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3, yargs-parser@npm:^20.2.9": - version: 20.2.9 - resolution: "yargs-parser@npm:20.2.9" - checksum: 8bb69015f2b0ff9e17b2c8e6bfe224ab463dd00ca211eece72a4cd8a906224d2703fb8a326d36fdd0e68701e201b2a60ed7cf81ce0fd9b3799f9fe7745977ae3 - languageName: node - linkType: hard - -"yargs-parser@npm:^21.1.1": - version: 21.1.1 - resolution: "yargs-parser@npm:21.1.1" - checksum: ed2d96a616a9e3e1cc7d204c62ecc61f7aaab633dcbfab2c6df50f7f87b393993fe6640d017759fe112d0cb1e0119f2b4150a87305cc873fd90831c6a58ccf1c - languageName: node - linkType: hard - -"yargs-unparser@npm:^2.0.0": - version: 2.0.0 - resolution: "yargs-unparser@npm:2.0.0" - dependencies: - camelcase: ^6.0.0 - decamelize: ^4.0.0 - flat: ^5.0.2 - is-plain-obj: ^2.1.0 - checksum: 68f9a542c6927c3768c2f16c28f71b19008710abd6b8f8efbac6dcce26bbb68ab6503bed1d5994bdbc2df9a5c87c161110c1dfe04c6a3fe5c6ad1b0e15d9a8a3 - languageName: node - linkType: hard - -"yargs@npm:^16.2.0": - version: 16.2.0 - resolution: "yargs@npm:16.2.0" - dependencies: - cliui: ^7.0.2 - escalade: ^3.1.1 - get-caller-file: ^2.0.5 - require-directory: ^2.1.1 - string-width: ^4.2.0 - y18n: ^5.0.5 - yargs-parser: ^20.2.2 - checksum: b14afbb51e3251a204d81937c86a7e9d4bdbf9a2bcee38226c900d00f522969ab675703bee2a6f99f8e20103f608382936034e64d921b74df82b63c07c5e8f59 - languageName: node - linkType: hard - -"yargs@npm:^17.0.0": - version: 17.7.2 - resolution: "yargs@npm:17.7.2" - dependencies: - cliui: ^8.0.1 - escalade: ^3.1.1 - get-caller-file: ^2.0.5 - require-directory: ^2.1.1 - string-width: ^4.2.3 - y18n: ^5.0.5 - yargs-parser: ^21.1.1 - checksum: 73b572e863aa4a8cbef323dd911d79d193b772defd5a51aab0aca2d446655216f5002c42c5306033968193bdbf892a7a4c110b0d77954a7fdf563e653967b56a - languageName: node - linkType: hard - -"yn@npm:3.1.1": - version: 3.1.1 - resolution: "yn@npm:3.1.1" - checksum: 2c487b0e149e746ef48cda9f8bad10fc83693cd69d7f9dcd8be4214e985de33a29c9e24f3c0d6bcf2288427040a8947406ab27f7af67ee9456e6b84854f02dd6 - languageName: node - linkType: hard - -"yocto-queue@npm:^0.1.0": - version: 0.1.0 - resolution: "yocto-queue@npm:0.1.0" - checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 - languageName: node - linkType: hard - -"zksync-web3@npm:^0.14.3": - version: 0.14.4 - resolution: "zksync-web3@npm:0.14.4" - peerDependencies: - ethers: ^5.7.0 - checksum: f702a3437f48a8d42c4bb35b8dd13671a168aadfc4e23ce723d62959220ccb6bf9c529c60331fe5b91afaa622147c6a37490551474fe3e35c06ac476524b5160 - languageName: node - linkType: hard + version "3.4.2" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.4.2.tgz#d81f786fda2871d1eb8a8c5a73e455753ba53527" + integrity sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA== + +"@openzeppelin/contracts@^4.4.1", "@openzeppelin/contracts@^4.9.3": + version "4.9.6" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.9.6.tgz#2a880a24eb19b4f8b25adc2a5095f2aa27f39677" + integrity sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA== + +"@openzeppelin/contracts@~4.3.3": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.3.3.tgz#ff6ee919fc2a1abaf72b22814bfb72ed129ec137" + integrity sha512-tDBopO1c98Yk7Cv/PZlHqrvtVjlgK5R4J6jxLwoO7qxK4xqOiZG+zSkIvGFpPZ0ikc3QOED3plgdqjgNTnBc7g== + +"@polytope-labs/ismp-solidity@^0.7.1": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@polytope-labs/ismp-solidity/-/ismp-solidity-0.7.1.tgz#04c0fd56f9e87878616b2e046087a0fc0cfa826a" + integrity sha512-9kvVMnb1RQhlBppfSMY5/Kexml+18DttX4q5SuX3wLQPCTWADx0I6FP+RnRQhWeeo1pwMSPMcHF8QYNtdDkSrg== + dependencies: + "@polytope-labs/solidity-merkle-trees" "^0.3.3" + openzeppelin-solidity "^4.8.1" + prettier "^3.3.3" + prettier-plugin-solidity "^1.3.1" + +"@polytope-labs/solidity-merkle-trees@0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@polytope-labs/solidity-merkle-trees/-/solidity-merkle-trees-0.3.2.tgz#3698e30ebf44fab2e32fbbe31c5dfba8618c7e4c" + integrity sha512-Zrh12nLkDOkydwaZOya7uo4zeX7PUGEKcxd14O0dFeg0TPyNWQaYZy3tw6XEovfyJOaJYu3Asgc971L6FrscLg== + dependencies: + openzeppelin-solidity "^4.8.1" + +"@polytope-labs/solidity-merkle-trees@^0.3.3": + version "0.3.4" + resolved "https://registry.yarnpkg.com/@polytope-labs/solidity-merkle-trees/-/solidity-merkle-trees-0.3.4.tgz#49553502c768d8dc46daaeb9d1734dd85b518739" + integrity sha512-ldLirdWNd7qNi8iRfpwlHCwy/FrVMd5wbsu9qVxx/IyOnbQnzzU816AfL3Zn01iN8DhB5UFLMkQ/HmF+VOLGFA== + dependencies: + openzeppelin-solidity "^4.8.1" + prettier "^3.3.3" + prettier-plugin-solidity "^1.4.1" + +"@routerprotocol/evm-gateway-contracts@1.1.13": + version "1.1.13" + resolved "https://registry.yarnpkg.com/@routerprotocol/evm-gateway-contracts/-/evm-gateway-contracts-1.1.13.tgz#609cd2a0cbcdb92e9a55fcdcb5cba0cc62fc11a7" + integrity sha512-XCjODM/AKx/WLc8pa9UzlatBBS73xkGBXDbSsFxq4XQUqO8ao7Gcnp61n9CoW8QN7wDKev+6tiHagia+piDzMg== + dependencies: + "@openzeppelin/contracts" "^4.4.1" + "@openzeppelin/contracts-upgradeable" "^4.7.3" + +"@scure/base@~1.1.0", "@scure/base@~1.1.6", "@scure/base@~1.1.8": + version "1.1.8" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.8.tgz#8f23646c352f020c83bca750a82789e246d42b50" + integrity sha512-6CyAclxj3Nb0XT7GHK6K4zK6k2xJm6E4Ft0Ohjt4WgegiFUHEtFb2CGzmPmGBwoIhrLsqNLYfLr04Y1GePrzZg== + +"@scure/bip32@1.1.5": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" + integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw== + dependencies: + "@noble/hashes" "~1.2.0" + "@noble/secp256k1" "~1.7.0" + "@scure/base" "~1.1.0" + +"@scure/bip32@1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.4.0.tgz#4e1f1e196abedcef395b33b9674a042524e20d67" + integrity sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg== + dependencies: + "@noble/curves" "~1.4.0" + "@noble/hashes" "~1.4.0" + "@scure/base" "~1.1.6" + +"@scure/bip39@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" + integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg== + dependencies: + "@noble/hashes" "~1.2.0" + "@scure/base" "~1.1.0" + +"@scure/bip39@1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.3.0.tgz#0f258c16823ddd00739461ac31398b4e7d6a18c3" + integrity sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ== + dependencies: + "@noble/hashes" "~1.4.0" + "@scure/base" "~1.1.6" + +"@scure/bip39@1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.4.0.tgz#664d4f851564e2e1d4bffa0339f9546ea55960a6" + integrity sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw== + dependencies: + "@noble/hashes" "~1.5.0" + "@scure/base" "~1.1.8" + +"@sentry/core@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" + integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/hub@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" + integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== + dependencies: + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/minimal@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" + integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/types" "5.30.0" + tslib "^1.9.3" + +"@sentry/node@^5.18.1": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" + integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== + dependencies: + "@sentry/core" "5.30.0" + "@sentry/hub" "5.30.0" + "@sentry/tracing" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + cookie "^0.4.1" + https-proxy-agent "^5.0.0" + lru_map "^0.3.3" + tslib "^1.9.3" + +"@sentry/tracing@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" + integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/types@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" + integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== + +"@sentry/utils@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" + integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== + dependencies: + "@sentry/types" "5.30.0" + tslib "^1.9.3" + +"@solana/buffer-layout@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz#b996235eaec15b1e0b5092a8ed6028df77fa6c15" + integrity sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA== + dependencies: + buffer "~6.0.3" + +"@solana/web3.js@^1.78.0": + version "1.95.3" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.95.3.tgz#70b5f4d76823f56b5af6403da51125fffeb65ff3" + integrity sha512-O6rPUN0w2fkNqx/Z3QJMB9L225Ex10PRDH8bTaIUPZXMPV0QP8ZpPvjQnXK+upUczlRgzHzd6SjKIha1p+I6og== + dependencies: + "@babel/runtime" "^7.25.0" + "@noble/curves" "^1.4.2" + "@noble/hashes" "^1.4.0" + "@solana/buffer-layout" "^4.0.1" + agentkeepalive "^4.5.0" + bigint-buffer "^1.1.5" + bn.js "^5.2.1" + borsh "^0.7.0" + bs58 "^4.0.1" + buffer "6.0.3" + fast-stable-stringify "^1.0.0" + jayson "^4.1.1" + node-fetch "^2.7.0" + rpc-websockets "^9.0.2" + superstruct "^2.0.2" + +"@solidity-parser/parser@^0.14.0": + version "0.14.5" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.5.tgz#87bc3cc7b068e08195c219c91cd8ddff5ef1a804" + integrity sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg== + dependencies: + antlr4ts "^0.5.0-alpha.4" + +"@solidity-parser/parser@^0.16.0": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.16.2.tgz#42cb1e3d88b3e8029b0c9befff00b634cd92d2fa" + integrity sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg== + dependencies: + antlr4ts "^0.5.0-alpha.4" + +"@solidity-parser/parser@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.18.0.tgz#8e77a02a09ecce957255a2f48c9a7178ec191908" + integrity sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA== + +"@swc/helpers@^0.5.11": + version "0.5.13" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.13.tgz#33e63ff3cd0cade557672bd7888a39ce7d115a8c" + integrity sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w== + dependencies: + tslib "^2.4.0" + +"@trivago/prettier-plugin-sort-imports@^4.0.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.3.0.tgz#725f411646b3942193a37041c84e0b2116339789" + integrity sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ== + dependencies: + "@babel/generator" "7.17.7" + "@babel/parser" "^7.20.5" + "@babel/traverse" "7.23.2" + "@babel/types" "7.17.0" + javascript-natural-sort "0.7.1" + lodash "^4.17.21" + +"@tsconfig/node10@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" + integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@typechain/ethers-v5@^10.1.1": + version "10.2.1" + resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz#50241e6957683281ecfa03fb5a6724d8a3ce2391" + integrity sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A== + dependencies: + lodash "^4.17.15" + ts-essentials "^7.0.1" + +"@typechain/hardhat@^6.1.4": + version "6.1.6" + resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-6.1.6.tgz#1a749eb35e5054c80df531cf440819cb347c62ea" + integrity sha512-BiVnegSs+ZHVymyidtK472syodx1sXYlYJJixZfRstHVGYTi8V1O7QG4nsjyb0PC/LORcq7sfBUcHto1y6UgJA== + dependencies: + fs-extra "^9.1.0" + +"@types/bn.js@^4.11.3": + version "4.11.6" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" + integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== + dependencies: + "@types/node" "*" + +"@types/bn.js@^5.1.0": + version "5.1.6" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.6.tgz#9ba818eec0c85e4d3c679518428afdf611d03203" + integrity sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w== + dependencies: + "@types/node" "*" + +"@types/chai-as-promised@^7.1.3": + version "7.1.8" + resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz#f2b3d82d53c59626b5d6bbc087667ccb4b677fe9" + integrity sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw== + dependencies: + "@types/chai" "*" + +"@types/chai@*", "@types/chai@^4.3.4": + version "4.3.19" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.19.tgz#14519f437361d41e84102ed3fbc922ddace3e228" + integrity sha512-2hHHvQBVE2FiSK4eN0Br6snX9MtolHaTo/batnLjlGRhoQzlCL61iVpxoqO7SfFyOw+P/pwv+0zNHzKoGWz9Cw== + +"@types/concat-stream@^1.6.0": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@types/concat-stream/-/concat-stream-1.6.1.tgz#24bcfc101ecf68e886aaedce60dfd74b632a1b74" + integrity sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA== + dependencies: + "@types/node" "*" + +"@types/connect@^3.4.33": + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== + dependencies: + "@types/node" "*" + +"@types/conventional-commits-parser@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz#8c9d23e0b415b24b91626d07017303755d542dc8" + integrity sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ== + dependencies: + "@types/node" "*" + +"@types/form-data@0.0.33": + version "0.0.33" + resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-0.0.33.tgz#c9ac85b2a5fd18435b8c85d9ecb50e6d6c893ff8" + integrity sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw== + dependencies: + "@types/node" "*" + +"@types/fs-extra@^9.0.13": + version "9.0.13" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" + integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== + dependencies: + "@types/node" "*" + +"@types/glob@^7.1.1": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/json-schema@^7.0.12", "@types/json-schema@^7.0.9": + 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/lru-cache@^5.1.0": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" + integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== + +"@types/minimatch@*": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" + integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== + +"@types/minimist@^1.2.0": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" + integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== + +"@types/mkdirp@^0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f" + integrity sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg== + dependencies: + "@types/node" "*" + +"@types/mocha@^10.0.0": + version "10.0.8" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.8.tgz#a7eff5816e070c3b4d803f1d3cd780c4e42934a1" + integrity sha512-HfMcUmy9hTMJh66VNcmeC9iVErIZJli2bszuXc6julh5YGuRb/W5OnkHjwLNYdFlMis0sY3If5SEAp+PktdJjw== + +"@types/node@*": + version "22.5.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.5.tgz#52f939dd0f65fc552a4ad0b392f3c466cc5d7a44" + integrity sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA== + dependencies: + undici-types "~6.19.2" + +"@types/node@20.5.1": + version "20.5.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.1.tgz#178d58ee7e4834152b0e8b4d30cbfab578b9bb30" + integrity sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg== + +"@types/node@^10.0.3": + version "10.17.60" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" + integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== + +"@types/node@^12.12.54": + version "12.20.55" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" + integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== + +"@types/node@^18.11.9": + version "18.19.50" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.50.tgz#8652b34ee7c0e7e2004b3f08192281808d41bf5a" + integrity sha512-xonK+NRrMBRtkL1hVCc3G+uXtjh1Al4opBLjqVmipe5ZAaBYWW6cNAiBVZ1BvmkBhep698rP3UM3aRAdSALuhg== + dependencies: + undici-types "~5.26.4" + +"@types/node@^20.8.9": + version "20.16.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.16.5.tgz#d43c7f973b32ffdf9aa7bd4f80e1072310fd7a53" + integrity sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA== + dependencies: + undici-types "~6.19.2" + +"@types/node@^8.0.0": + version "8.10.66" + resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.66.tgz#dd035d409df322acc83dff62a602f12a5783bbb3" + integrity sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw== + +"@types/normalize-package-data@^2.4.0": + version "2.4.4" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" + integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== + +"@types/pbkdf2@^3.0.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.2.tgz#2dc43808e9985a2c69ff02e2d2027bd4fe33e8dc" + integrity sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew== + dependencies: + "@types/node" "*" + +"@types/prettier@^2.1.1": + version "2.7.3" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" + integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== + +"@types/qs@^6.2.31", "@types/qs@^6.9.7": + version "6.9.16" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.16.tgz#52bba125a07c0482d26747d5d4947a64daf8f794" + integrity sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A== + +"@types/readable-stream@^2.3.13": + version "2.3.15" + resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-2.3.15.tgz#3d79c9ceb1b6a57d5f6e6976f489b9b5384321ae" + integrity sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ== + dependencies: + "@types/node" "*" + safe-buffer "~5.1.1" + +"@types/resolve@^0.0.8": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" + integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== + dependencies: + "@types/node" "*" + +"@types/secp256k1@^4.0.1": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.6.tgz#d60ba2349a51c2cbc5e816dcd831a42029d376bf" + integrity sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ== + dependencies: + "@types/node" "*" + +"@types/semver@^7.3.12", "@types/semver@^7.5.0": + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + +"@types/triple-beam@^1.3.2": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" + integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== + +"@types/uuid@^8.3.4": + version "8.3.4" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" + integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== + +"@types/webidl-conversions@*": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz#1306dbfa53768bcbcfc95a1c8cde367975581859" + integrity sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA== + +"@types/whatwg-url@^11.0.2": + version "11.0.5" + resolved "https://registry.yarnpkg.com/@types/whatwg-url/-/whatwg-url-11.0.5.tgz#aaa2546e60f0c99209ca13360c32c78caf2c409f" + integrity sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ== + dependencies: + "@types/webidl-conversions" "*" + +"@types/ws@^7.4.4": + version "7.4.7" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" + integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== + dependencies: + "@types/node" "*" + +"@types/ws@^8.2.2": + version "8.5.12" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.12.tgz#619475fe98f35ccca2a2f6c137702d85ec247b7e" + integrity sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ== + dependencies: + "@types/node" "*" + +"@typescript-eslint/eslint-plugin@^5.44.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" + integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== + dependencies: + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/type-utils" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/eslint-plugin@^6.7.5": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz#30830c1ca81fd5f3c2714e524c4303e0194f9cd3" + integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA== + dependencies: + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/type-utils" "6.21.0" + "@typescript-eslint/utils" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/parser@^5.44.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" + integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== + dependencies: + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + debug "^4.3.4" + +"@typescript-eslint/parser@^6.7.5": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" + integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== + dependencies: + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + +"@typescript-eslint/scope-manager@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" + integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== + dependencies: + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + +"@typescript-eslint/type-utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" + integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== + dependencies: + "@typescript-eslint/typescript-estree" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/type-utils@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz#6473281cfed4dacabe8004e8521cee0bd9d4c01e" + integrity sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag== + dependencies: + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/utils" "6.21.0" + debug "^4.3.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== + +"@typescript-eslint/types@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" + integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== + +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/typescript-estree@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" + integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== + dependencies: + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/utils@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.21.0.tgz#4714e7a6b39e773c1c8e97ec587f520840cd8134" + integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + semver "^7.5.4" + +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== + dependencies: + "@typescript-eslint/types" "5.62.0" + eslint-visitor-keys "^3.3.0" + +"@typescript-eslint/visitor-keys@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" + integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== + dependencies: + "@typescript-eslint/types" "6.21.0" + eslint-visitor-keys "^3.4.1" + +"@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== + +"@yarnpkg/lockfile@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + +JSONStream@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +abbrev@1.0.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + integrity sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q== + +abitype@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.5.tgz#29d0daa3eea867ca90f7e4123144c1d1270774b6" + integrity sha512-YzDhti7cjlfaBhHutMaboYB21Ha3rXR9QTkNJFzYC4kC8YclaiwPBBBJY8ejFdu2wnJeZCVZSMlQJ7fi8S6hsw== + +abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3, abstract-level@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.4.tgz#3ad8d684c51cc9cbc9cf9612a7100b716c414b57" + integrity sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg== + dependencies: + buffer "^6.0.3" + catering "^2.1.0" + is-buffer "^2.0.5" + level-supports "^4.0.0" + level-transcoder "^1.0.1" + module-error "^1.0.1" + queue-microtask "^1.2.3" + +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-walk@^8.1.1: + version "8.3.4" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" + integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== + dependencies: + acorn "^8.11.0" + +acorn@^8.11.0, acorn@^8.4.1, acorn@^8.9.0: + version "8.12.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== + +adm-zip@^0.4.16: + version "0.4.16" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" + integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== + +aes-js@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +agentkeepalive@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" + integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== + dependencies: + humanize-ms "^1.2.1" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv@^6.12.4, ajv@^6.12.6: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.1, ajv@^8.11.0: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== + +ansi-colors@^4.1.1, ansi-colors@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-escapes@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-5.0.0.tgz#b6a0caf0eef0c41af190e9a749e0c00ec04bb2a6" + integrity sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA== + dependencies: + type-fest "^1.0.2" + +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@^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-regex@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== + +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.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.0.0, ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +antlr4@^4.11.0: + version "4.13.2" + resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.13.2.tgz#0d084ad0e32620482a9c3a0e2470c02e72e4006d" + integrity sha512-QiVbZhyy4xAZ17UPEuG3YTOt8ZaoeOR1CvEAqrEsDBsOqINslaB147i9xqljZqoyf5S+EUlGStaj+t22LT9MOg== + +antlr4ts@^0.5.0-alpha.4: + version "0.5.0-alpha.4" + resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" + integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +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-ify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" + integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== + +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-uniq@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== + +asap@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +ast-parents@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/ast-parents/-/ast-parents-0.0.1.tgz#508fd0f05d0c48775d9eccda2e174423261e8dd3" + integrity sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async@1.x: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== + +async@^3.2.3: + version "3.2.6" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== + +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== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +axios@^0.21.1: + version "0.21.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== + dependencies: + follow-redirects "^1.14.0" + +axios@^1.5.1: + version "1.7.7" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f" + integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +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== + +base-x@^3.0.2: + version "3.0.10" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.10.tgz#62de58653f8762b5d6f8d9fe30fa75f7b2585a75" + integrity sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ== + dependencies: + safe-buffer "^5.0.1" + +base64-js@^1.3.0, base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bech32@1.1.4, 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== + +bigint-buffer@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/bigint-buffer/-/bigint-buffer-1.1.5.tgz#d038f31c8e4534c1f8d0015209bf34b4fa6dd442" + integrity sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA== + dependencies: + bindings "^1.3.0" + +bigint-crypto-utils@^3.0.23: + version "3.3.0" + resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz#72ad00ae91062cf07f2b1def9594006c279c1d77" + integrity sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg== + +bignumber.js@^9.1.1: + version "9.1.2" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" + integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +bindings@^1.3.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" + +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.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== + +bn.js@4.11.6: + version "4.11.6" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" + integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== + +bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + +borsh@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.7.0.tgz#6e9560d719d86d90dc589bca60ffc8a6c51fec2a" + integrity sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA== + dependencies: + bn.js "^5.2.0" + bs58 "^4.0.0" + text-encoding-utf-8 "^1.0.2" + +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, braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.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== + +browser-level@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browser-level/-/browser-level-1.0.1.tgz#36e8c3183d0fe1c405239792faaab5f315871011" + integrity sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ== + dependencies: + abstract-level "^1.0.2" + catering "^2.1.1" + module-error "^1.0.2" + run-parallel-limit "^1.1.0" + +browser-stdout@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +browserify-aes@^1.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" + +bs58@^4.0.0, bs58@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== + dependencies: + base-x "^3.0.2" + +bs58check@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + +bson@^6.4.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/bson/-/bson-6.8.0.tgz#5063c41ba2437c2b8ff851b50d9e36cb7aaa7525" + integrity sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ== + +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, buffer@^6.0.3, 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" + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +bufferutil@^4.0.1: + version "4.0.8" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.8.tgz#1de6a71092d65d7766c4d8a522b261a6e787e8ea" + integrity sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw== + dependencies: + node-gyp-build "^4.3.0" + +bufio@^1.0.7: + version "1.2.1" + resolved "https://registry.yarnpkg.com/bufio/-/bufio-1.2.1.tgz#8d4ab3ddfcd5faa90f996f922f9397d41cbaf2de" + integrity sha512-9oR3zNdupcg/Ge2sSHQF3GX+kmvL/fTPvD0nd5AGLq8SjUYnTz+SlFjK/GXidndbZtIj+pVKXiWeR9w6e9wKCA== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cachedir@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" + integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== + +call-bind@^1.0.5, 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-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +case@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/case/-/case-1.6.3.tgz#0a4386e3e9825351ca2e6216c60467ff5f1ea1c9" + integrity sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ== + +caseless@^0.12.0, caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + +catering@^2.1.0, catering@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" + integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== + +cbor@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5" + integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg== + dependencies: + nofilter "^3.1.0" + +chai-as-promised@^7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.2.tgz#70cd73b74afd519754161386421fb71832c6d041" + integrity sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw== + dependencies: + check-error "^1.0.2" + +chai@^4.3.4, chai@^4.3.7: + version "4.5.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.5.0.tgz#707e49923afdd9b13a8b0b47d33d732d13812fd8" + integrity sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw== + 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.1.0" + +chalk@5.3.0, chalk@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + +chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + 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, chalk@^4.1.1, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +"charenc@>= 0.0.1": + version "0.0.2" + resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== + +check-error@^1.0.2, 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" + +chokidar@^3.4.0, chokidar@^3.5.2, chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-info@^3.7.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +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" + +classic-level@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.4.1.tgz#169ecf9f9c6200ad42a98c8576af449c1badbaee" + integrity sha512-qGx/KJl3bvtOHrGau2WklEZuXhS3zme+jf+fsu6Ej7W7IP/C49v7KNlWIsT1jZu0YnfzSIYDGcEWpCa1wKGWXQ== + dependencies: + abstract-level "^1.0.2" + catering "^2.1.0" + module-error "^1.0.1" + napi-macros "^2.2.2" + node-gyp-build "^4.3.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-cursor@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea" + integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== + dependencies: + restore-cursor "^4.0.0" + +cli-spinners@^2.5.0: + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== + +cli-table3@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" + integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== + dependencies: + object-assign "^4.1.0" + string-width "^2.1.1" + optionalDependencies: + colors "^1.1.2" + +cli-truncate@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" + integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== + dependencies: + slice-ansi "^5.0.0" + string-width "^5.0.0" + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +color-convert@^1.9.0, color-convert@^1.9.3: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + 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.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.6.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.1.3: + version "3.2.1" + resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + +colorette@^2.0.20: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +colors@1.4.0, colors@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +colorspace@1.1.x: + version "1.1.4" + resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" + integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== + dependencies: + color "^3.1.3" + text-hex "1.0.x" + +combined-stream@^1.0.6, 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-exists@^1.2.8: + version "1.2.9" + resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" + integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== + +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@11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-11.0.0.tgz#43e19c25dbedc8256203538e8d7e9346877a6f67" + integrity sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ== + +commander@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" + integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== + +commander@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + +commander@^2.20.3: + 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== + +commitizen@^4.0.3, commitizen@^4.2.5: + version "4.3.0" + resolved "https://registry.yarnpkg.com/commitizen/-/commitizen-4.3.0.tgz#0d056c542a2d2b1f9b9aba981aa32575b2849924" + integrity sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw== + dependencies: + cachedir "2.3.0" + cz-conventional-changelog "3.3.0" + dedent "0.7.0" + detect-indent "6.1.0" + find-node-modules "^2.1.2" + find-root "1.1.0" + fs-extra "9.1.0" + glob "7.2.3" + inquirer "8.2.5" + is-utf8 "^0.2.1" + lodash "4.17.21" + minimist "1.2.7" + strip-bom "4.0.0" + strip-json-comments "3.1.1" + +compare-func@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" + integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== + dependencies: + array-ify "^1.0.0" + dot-prop "^5.1.0" + +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== + +concat-stream@^1.6.0, concat-stream@^1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +conventional-changelog-angular@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-6.0.0.tgz#a9a9494c28b7165889144fd5b91573c4aa9ca541" + integrity sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg== + dependencies: + compare-func "^2.0.0" + +conventional-changelog-conventionalcommits@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-6.1.0.tgz#3bad05f4eea64e423d3d90fc50c17d2c8cf17652" + integrity sha512-3cS3GEtR78zTfMzk0AizXKKIdN4OvSh7ibNz6/DPbhWWQu7LqE/8+/GqSodV+sywUR2gpJAdP/1JFf4XtN7Zpw== + dependencies: + compare-func "^2.0.0" + +conventional-commit-types@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz#7c9214e58eae93e85dd66dbfbafe7e4fffa2365b" + integrity sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg== + +conventional-commits-parser@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-4.0.0.tgz#02ae1178a381304839bce7cea9da5f1b549ae505" + integrity sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg== + dependencies: + JSONStream "^1.3.5" + is-text-path "^1.0.1" + meow "^8.1.2" + split2 "^3.2.2" + +cookie@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + +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== + +cosmiconfig-typescript-loader@^4.0.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.4.0.tgz#f3feae459ea090f131df5474ce4b1222912319f9" + integrity sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw== + +cosmiconfig-typescript-loader@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.0.0.tgz#0d3becfe022a871f7275ceb2397d692e06045dc8" + integrity sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA== + dependencies: + jiti "^1.19.1" + +cosmiconfig@^8.0.0: + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== + dependencies: + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + path-type "^4.0.0" + +cosmiconfig@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" + integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== + dependencies: + env-paths "^2.2.1" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + +crc-32@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" + integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== + +create-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.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" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-env@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== + dependencies: + cross-spawn "^7.0.1" + +cross-spawn@^7.0.1, 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" + +"crypt@>= 0.0.1": + version "0.0.2" + resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== + +cz-conventional-changelog@3.3.0, cz-conventional-changelog@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz#9246947c90404149b3fe2cf7ee91acad3b7d22d2" + integrity sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw== + dependencies: + chalk "^2.4.1" + commitizen "^4.0.3" + conventional-commit-types "^3.0.0" + lodash.map "^4.5.1" + longest "^2.0.1" + word-wrap "^1.0.3" + optionalDependencies: + "@commitlint/load" ">6.1.1" + +dargs@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" + integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== + +death@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" + integrity sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w== + +debug@4, debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + +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" + +decamelize-keys@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" + integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +dedent@0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== + +deep-eql@^4.0.1, deep-eql@^4.1.3: + version "4.1.4" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7" + integrity sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg== + 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== + +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + +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" + +delay@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" + integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== + +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== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q== + +detect-indent@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" + integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +diff@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" + integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== + +difflib@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/difflib/-/difflib-0.2.4.tgz#b5e30361a6db023176d562892db85940a718f47e" + integrity sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w== + dependencies: + heap ">= 0.2.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@^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" + +dot-prop@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +dotenv@^16.0.3, dotenv@^16.3.1: + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +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.2, elliptic@^6.5.4: + version "6.5.7" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.7.tgz#8ec4da2cb2939926a1b9a73619d768207e647c8b" + integrity sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q== + 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@^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== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +enabled@2.0.x: + version "2.0.0" + resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" + integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== + +encode-utf8@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" + integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw== + +enquirer@^2.3.0, enquirer@^2.3.6: + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== + dependencies: + ansi-colors "^4.1.1" + strip-ansi "^6.0.1" + +env-paths@^2.2.0, env-paths@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-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.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== + +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ== + dependencies: + es6-promise "^4.0.3" + +escalade@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +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== + +escodegen@1.8.x: + version "1.8.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + integrity sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A== + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" + +eslint-config-prettier@^8.5.0: + version "8.10.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" + integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== + +eslint-config-prettier@^9.0.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-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@^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-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@^8.28.0, eslint@^8.51.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@^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@2.7.x, esprima@^2.7.1: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + integrity sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A== + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + integrity sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA== + +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== + +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== + +eth-gas-reporter@^0.2.25: + version "0.2.27" + resolved "https://registry.yarnpkg.com/eth-gas-reporter/-/eth-gas-reporter-0.2.27.tgz#928de8548a674ed64c7ba0bf5795e63079150d4e" + integrity sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw== + dependencies: + "@solidity-parser/parser" "^0.14.0" + axios "^1.5.1" + cli-table3 "^0.5.0" + colors "1.4.0" + ethereum-cryptography "^1.0.3" + ethers "^5.7.2" + fs-readdir-recursive "^1.1.0" + lodash "^4.17.14" + markdown-table "^1.1.3" + mocha "^10.2.0" + req-cwd "^2.0.0" + sha1 "^1.1.1" + sync-request "^6.0.0" + +ethereum-bloom-filters@^1.0.6: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.2.0.tgz#8294f074c1a6cbd32c39d2cc77ce86ff14797dab" + integrity sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA== + dependencies: + "@noble/hashes" "^1.4.0" + +ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" + integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== + dependencies: + "@types/pbkdf2" "^3.0.0" + "@types/secp256k1" "^4.0.1" + blakejs "^1.1.0" + browserify-aes "^1.2.0" + bs58check "^2.1.2" + create-hash "^1.2.0" + create-hmac "^1.1.7" + hash.js "^1.1.7" + keccak "^3.0.0" + pbkdf2 "^3.0.17" + randombytes "^2.1.0" + safe-buffer "^5.1.2" + scrypt-js "^3.0.0" + secp256k1 "^4.0.1" + setimmediate "^1.0.5" + +ethereum-cryptography@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz#5ccfa183e85fdaf9f9b299a79430c044268c9b3a" + integrity sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw== + dependencies: + "@noble/hashes" "1.2.0" + "@noble/secp256k1" "1.7.1" + "@scure/bip32" "1.1.5" + "@scure/bip39" "1.1.1" + +ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz#58f2810f8e020aecb97de8c8c76147600b0b8ccf" + integrity sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg== + dependencies: + "@noble/curves" "1.4.2" + "@noble/hashes" "1.4.0" + "@scure/bip32" "1.4.0" + "@scure/bip39" "1.3.0" + +ethereumjs-abi@^0.6.8: + version "0.6.8" + resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" + integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== + dependencies: + bn.js "^4.11.8" + ethereumjs-util "^6.0.0" + +ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" + integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== + dependencies: + "@types/bn.js" "^4.11.3" + bn.js "^4.11.0" + create-hash "^1.1.2" + elliptic "^6.5.2" + ethereum-cryptography "^0.1.3" + ethjs-util "0.1.6" + rlp "^2.2.3" + +ethereumjs-util@^7.1.4: + version "7.1.5" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" + integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== + dependencies: + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" + +ethers@^5.7.0, ethers@^5.7.1, ethers@^5.7.2: + 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" + +ethjs-unit@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" + integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw== + dependencies: + bn.js "4.11.6" + number-to-bn "1.7.0" + +ethjs-util@0.1.6, ethjs-util@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" + integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== + dependencies: + is-hex-prefixed "1.0.0" + strip-hex-prefix "1.0.0" + +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + +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@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-7.2.0.tgz#657e75ba984f42a70f38928cedc87d6f2d4fe4e9" + integrity sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.1" + human-signals "^4.3.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^3.0.7" + strip-final-newline "^3.0.0" + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw== + dependencies: + homedir-polyfill "^1.0.1" + +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" + +eyes@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ== + +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, fast-diff@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== + +fast-glob@^3.0.3, fast-glob@^3.2.9: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + 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== + +fast-stable-stringify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz#5c5543462b22aeeefd36d05b34e51c78cb86d313" + integrity sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag== + +fast-uri@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.1.tgz#cddd2eecfc83a71c1be2cc2ef2061331be8a7134" + integrity sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw== + +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" + +fecha@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" + integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + 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.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +find-node-modules@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/find-node-modules/-/find-node-modules-2.1.3.tgz#3c976cff2ca29ee94b4f9eafc613987fc4c0ee44" + integrity sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg== + dependencies: + findup-sync "^4.0.0" + merge "^2.1.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-root@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== + dependencies: + locate-path "^2.0.0" + +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + 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" + +find-yarn-workspace-root@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" + integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== + dependencies: + micromatch "^4.0.2" + +findup-sync@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-4.0.0.tgz#956c9cdde804052b881b428512905c4a5f2cdef0" + integrity sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^4.0.2" + resolve-dir "^1.0.1" + +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@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + +fmix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/fmix/-/fmix-0.1.0.tgz#c7bbf124dec42c9d191cfb947d0a9778dd986c0c" + integrity sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w== + dependencies: + imul "^1.0.0" + +fn.name@1.x.x: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" + integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== + +follow-redirects@^1.12.1, follow-redirects@^1.14.0, follow-redirects@^1.15.6: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== + +form-data@^2.2.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" + integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +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" + +fp-ts@1.19.3: + version "1.19.3" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" + integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== + +fp-ts@^1.0.0: + version "1.19.5" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" + integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== + +fs-extra@9.1.0, fs-extra@^9.0.0, fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" + integrity sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + +fs-extra@^10.0.0, fs-extra@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^11.0.0: + version "11.2.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" + integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^7.0.0, fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-readdir-recursive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== + +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== + +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== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +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.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-port@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" + integrity sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg== + +get-stream@^6.0.0, get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +ghost-testrpc@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz#c4de9557b1d1ae7b2d20bbe474a91378ca90ce92" + integrity sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ== + dependencies: + chalk "^2.4.2" + node-emoji "^1.10.0" + +git-raw-commits@^2.0.11: + version "2.0.11" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" + integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== + dependencies: + dargs "^7.0.0" + lodash "^4.17.15" + meow "^8.0.0" + split2 "^3.0.0" + through2 "^4.0.0" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + 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@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.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + 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.2.3, glob@^7.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@^5.0.15: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^8.0.3, glob@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +global-directory@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/global-directory/-/global-directory-4.0.1.tgz#4d7ac7cfd2cb73f304c53b8810891748df5e361e" + integrity sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q== + dependencies: + ini "4.1.1" + +global-dirs@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + integrity sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg== + dependencies: + ini "^1.3.4" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg== + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globals@^11.1.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" + +globby@^10.0.1: + version "10.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" + integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== + dependencies: + "@types/glob" "^7.1.1" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.0.3" + glob "^7.1.3" + ignore "^5.1.1" + merge2 "^1.2.3" + slash "^3.0.0" + +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.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +handlebars@^4.0.1: + version "4.7.8" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" + integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.2" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + +hardhat-change-network@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/hardhat-change-network/-/hardhat-change-network-0.0.7.tgz#9f9b7943ff966515658b70bf5e44bc2f073af402" + integrity sha512-Usp9fJan9SOJnOlVcv/jMJDchseE7bIDA5ZsBnracgVk4MiBwkvMqpmLWn5G1aDBvnUCthvS2gO3odfahgkV0Q== + +hardhat-deploy@^0.11.31: + version "0.11.45" + resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.11.45.tgz#bed86118175a38a03bb58aba2ce1ed5e80a20bc8" + integrity sha512-aC8UNaq3JcORnEUIwV945iJuvBwi65tjHVDU3v6mOcqik7WAzHVCJ7cwmkkipsHrWysrB5YvGF1q9S1vIph83w== + dependencies: + "@ethersproject/abi" "^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/contracts" "^5.7.0" + "@ethersproject/providers" "^5.7.2" + "@ethersproject/solidity" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wallet" "^5.7.0" + "@types/qs" "^6.9.7" + axios "^0.21.1" + chalk "^4.1.2" + chokidar "^3.5.2" + debug "^4.3.2" + enquirer "^2.3.6" + ethers "^5.7.0" + form-data "^4.0.0" + fs-extra "^10.0.0" + match-all "^1.2.6" + murmur-128 "^0.2.1" + qs "^6.9.4" + zksync-web3 "^0.14.3" + +hardhat-gas-reporter@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.10.tgz#ebe5bda5334b5def312747580cd923c2b09aef1b" + integrity sha512-02N4+So/fZrzJ88ci54GqwVA3Zrf0C9duuTyGt0CFRIh/CdNwbnTgkXkRfojOMLBQ+6t+lBIkgbsOtqMvNwikA== + dependencies: + array-uniq "1.0.3" + eth-gas-reporter "^0.2.25" + sha1 "^1.1.1" + +hardhat@2.19.4: + version "2.19.4" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.19.4.tgz#5112c30295d8be2e18e55d847373c50483ed1902" + integrity sha512-fTQJpqSt3Xo9Mn/WrdblNGAfcANM6XC3tAEi6YogB4s02DmTf93A8QsGb8uR0KR8TFcpcS8lgiW4ugAIYpnbrQ== + dependencies: + "@ethersproject/abi" "^5.1.2" + "@metamask/eth-sig-util" "^4.0.0" + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-blockchain" "7.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-evm" "2.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-statemanager" "2.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + "@nomicfoundation/ethereumjs-vm" "7.0.2" + "@nomicfoundation/solidity-analyzer" "^0.1.0" + "@sentry/node" "^5.18.1" + "@types/bn.js" "^5.1.0" + "@types/lru-cache" "^5.1.0" + adm-zip "^0.4.16" + aggregate-error "^3.0.0" + ansi-escapes "^4.3.0" + chalk "^2.4.2" + chokidar "^3.4.0" + ci-info "^2.0.0" + debug "^4.1.1" + enquirer "^2.3.0" + env-paths "^2.2.0" + ethereum-cryptography "^1.0.3" + ethereumjs-abi "^0.6.8" + find-up "^2.1.0" + fp-ts "1.19.3" + fs-extra "^7.0.1" + glob "7.2.0" + immutable "^4.0.0-rc.12" + io-ts "1.10.4" + keccak "^3.0.2" + lodash "^4.17.11" + mnemonist "^0.38.0" + mocha "^10.0.0" + p-map "^4.0.0" + raw-body "^2.4.1" + resolve "1.17.0" + semver "^6.3.0" + solc "0.7.3" + source-map-support "^0.5.13" + stacktrace-parser "^0.1.10" + tsort "0.0.1" + undici "^5.14.0" + uuid "^8.3.2" + ws "^7.4.6" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity 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.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: + 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.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +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.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hasown@^2.0.0, 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" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +"heap@>= 0.2.0": + version "0.2.7" + resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" + integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== + +hmac-drbg@^1.0.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" + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +hosted-git-info@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== + dependencies: + lru-cache "^6.0.0" + +http-basic@^8.1.1: + version "8.1.3" + resolved "https://registry.yarnpkg.com/http-basic/-/http-basic-8.1.3.tgz#a7cabee7526869b9b710136970805b1004261bbf" + integrity sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw== + dependencies: + caseless "^0.12.0" + concat-stream "^1.6.2" + http-response-object "^3.0.1" + parse-cache-control "^1.0.1" + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-response-object@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/http-response-object/-/http-response-object-3.0.2.tgz#7f435bb210454e4360d074ef1f989d5ea8aa9810" + integrity sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA== + dependencies: + "@types/node" "^10.0.3" + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +human-signals@^4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" + integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + dependencies: + ms "^2.0.0" + +husky@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" + integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== + +iconv-lite@0.4.24, 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.1.13, 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-by-default@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== + +ignore@^5.1.1, ignore@^5.2.0, ignore@^5.2.4: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +immutable@^4.0.0-rc.12: + version "4.3.7" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.7.tgz#c70145fc90d89fb02021e65c84eb0226e4e5a381" + integrity sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw== + +import-fresh@^3.0.0, import-fresh@^3.2.1, import-fresh@^3.3.0: + 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-meta-resolve@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz#f9db8bead9fafa61adb811db77a2bf22c5399706" + integrity sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw== + +imul@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/imul/-/imul-1.0.1.tgz#9d5867161e8b3de96c2c38d5dc7cb102f35e2ac9" + integrity sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA== + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +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.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" + integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== + +ini@^1.3.4, ini@^1.3.5: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inquirer@8.2.5: + version "8.2.5" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.5.tgz#d8654a7542c35a9b9e069d27e2df4858784d54f8" + integrity sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + wrap-ansi "^7.0.0" + +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +io-ts@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" + integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g== + dependencies: + fp-ts "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-core-module@^2.13.0, is-core-module@^2.5.0: + version "2.15.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== + dependencies: + hasown "^2.0.2" + +is-docker@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-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@^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-fullwidth-code-point@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hex-prefixed@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" + integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +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-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-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-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + +is-text-path@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" + integrity sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w== + dependencies: + text-extensions "^1.0.0" + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-utf8@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== + +is-windows@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@^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== + +isomorphic-ws@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" + integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== + +isows@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.4.tgz#810cd0d90cc4995c26395d2aa4cfa4037ebdf061" + integrity sha512-hEzjY+x9u9hPmBom9IIAqdJCwNLax+xrPb51vEPpERoFlIxgmZcHzsT5jKG06nvInKOBGvReAVz80Umed5CczQ== + +javascript-natural-sort@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59" + integrity sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw== + +jayson@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/jayson/-/jayson-4.1.2.tgz#443c26a8658703e0b2e881117b09395d88b6982e" + integrity sha512-5nzMWDHy6f+koZOuYsArh2AXs73NfWYVlFyJJuCedr93GpY+Ku8qq10ropSXVfHK+H0T6paA88ww+/dV+1fBNA== + dependencies: + "@types/connect" "^3.4.33" + "@types/node" "^12.12.54" + "@types/ws" "^7.4.4" + JSONStream "^1.3.5" + commander "^2.20.3" + delay "^5.0.0" + es6-promisify "^5.0.0" + eyes "^0.1.8" + isomorphic-ws "^4.0.1" + json-stringify-safe "^5.0.1" + uuid "^8.3.2" + ws "^7.5.10" + +jiti@^1.19.1: + version "1.21.6" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" + integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== + +js-sdsl@^4.1.4: + version "4.4.2" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.2.tgz#2e3c031b1f47d3aca8b775532e3ebb0818e7f847" + integrity sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w== + +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.x: + 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" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +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.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-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== + +json-stable-stringify@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz#52d4361b47d49168bcc4e564189a42e5a7439454" + integrity sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg== + dependencies: + call-bind "^1.0.5" + isarray "^2.0.5" + jsonify "^0.0.1" + object-keys "^1.1.1" + +json-stringify-safe@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" + integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== + +jsonschema@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" + integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== + +keccak@^3.0.0, keccak@^3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d" + integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.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, kind-of@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== + dependencies: + graceful-fs "^4.1.11" + +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== + optionalDependencies: + graceful-fs "^4.1.9" + +kuler@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" + integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== + +level-supports@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a" + integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA== + +level-transcoder@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c" + integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w== + dependencies: + buffer "^6.0.3" + module-error "^1.0.1" + +level@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/level/-/level-8.0.1.tgz#737161db1bc317193aca4e7b6f436e7e1df64379" + integrity sha512-oPBGkheysuw7DmzFQYyFe8NAia5jFLAgEnkgWnK3OXAuJr8qFT+xBQIwokAZPME2bhPFzS8hlYcL16m8UZrtwQ== + dependencies: + abstract-level "^1.0.4" + browser-level "^1.0.1" + classic-level "^1.2.0" + +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" + +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" + +lilconfig@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +lint-staged@^13.0.4: + version "13.3.0" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-13.3.0.tgz#7965d72a8d6a6c932f85e9c13ccf3596782d28a5" + integrity sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ== + dependencies: + chalk "5.3.0" + commander "11.0.0" + debug "4.3.4" + execa "7.2.0" + lilconfig "2.1.0" + listr2 "6.6.1" + micromatch "4.0.5" + pidtree "0.6.0" + string-argv "0.3.2" + yaml "2.3.1" + +listr2@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-6.6.1.tgz#08b2329e7e8ba6298481464937099f4a2cd7f95d" + integrity sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg== + dependencies: + cli-truncate "^3.1.0" + colorette "^2.0.20" + eventemitter3 "^5.0.1" + log-update "^5.0.1" + rfdc "^1.3.0" + wrap-ansi "^8.1.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + 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.isfunction@^3.0.9: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" + integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw== + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== + +lodash.kebabcase@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" + integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== + +lodash.map@^4.5.1: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" + integrity sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q== + +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.mergewith@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" + integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== + +lodash.snakecase@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" + integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== + +lodash.startcase@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" + integrity sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + +lodash.upperfirst@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" + integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== + +lodash@4.17.21, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log-update@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-5.0.1.tgz#9e928bf70cb183c1f0c9e91d9e6b7115d597ce09" + integrity sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw== + dependencies: + ansi-escapes "^5.0.0" + cli-cursor "^4.0.0" + slice-ansi "^5.0.0" + strip-ansi "^7.0.1" + wrap-ansi "^8.0.1" + +logform@^2.6.0, logform@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.6.1.tgz#71403a7d8cae04b2b734147963236205db9b3df0" + integrity sha512-CdaO738xRapbKIMVn2m4F6KTj4j7ooJ8POVnebSgKo3KBz5axNXRAL7ZdRjIV6NOr2Uf4vjtRkxrFETOioCqSA== + dependencies: + "@colors/colors" "1.6.0" + "@types/triple-beam" "^1.3.2" + fecha "^4.2.0" + ms "^2.1.1" + safe-stable-stringify "^2.3.1" + triple-beam "^1.3.0" + +longest@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-2.0.1.tgz#781e183296aa94f6d4d916dc335d0d17aefa23f8" + integrity sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q== + +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@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lru_map@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" + integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +map-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== + +map-obj@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" + integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== + +markdown-table@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" + integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== + +match-all@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/match-all/-/match-all-1.2.6.tgz#66d276ad6b49655551e63d3a6ee53e8be0566f8d" + integrity sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ== + +mcl-wasm@^0.7.1: + version "0.7.9" + resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.9.tgz#c1588ce90042a8700c3b60e40efb339fc07ab87f" + integrity sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ== + +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" + +memory-level@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692" + integrity sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og== + dependencies: + abstract-level "^1.0.0" + functional-red-black-tree "^1.0.1" + module-error "^1.0.1" + +memory-pager@^1.0.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" + integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== + +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== + +meow@^8.0.0, meow@^8.1.2: + version "8.1.2" + resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" + integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^3.0.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.18.0" + yargs-parser "^20.2.3" + +merge-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.2.3, 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== + +merge@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/merge/-/merge-2.1.1.tgz#59ef4bf7e0b3e879186436e8481c06a6c162ca98" + integrity sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w== + +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.5: + 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" + +micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.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: + 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@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + 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@2 || 3", minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^5.0.1, minimatch@^5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimist-options@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + +minimist@1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" + integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== + +minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mkdirp@0.5.x, 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== + +mnemonist@^0.38.0: + version "0.38.5" + resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" + integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg== + dependencies: + obliterator "^2.0.0" + +mocha@^10.0.0, mocha@^10.1.0, mocha@^10.2.0: + version "10.7.3" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.7.3.tgz#ae32003cabbd52b59aece17846056a68eb4b0752" + integrity sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A== + dependencies: + ansi-colors "^4.1.3" + browser-stdout "^1.3.1" + chokidar "^3.5.3" + debug "^4.3.5" + diff "^5.2.0" + escape-string-regexp "^4.0.0" + find-up "^5.0.0" + glob "^8.1.0" + he "^1.2.0" + js-yaml "^4.1.0" + log-symbols "^4.1.0" + minimatch "^5.1.6" + ms "^2.1.3" + serialize-javascript "^6.0.2" + strip-json-comments "^3.1.1" + supports-color "^8.1.1" + workerpool "^6.5.1" + yargs "^16.2.0" + yargs-parser "^20.2.9" + yargs-unparser "^2.0.0" + +module-error@^1.0.1, module-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" + integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== + +mongodb-connection-string-url@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.1.tgz#c13e6ac284ae401752ebafdb8cd7f16c6723b141" + integrity sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg== + dependencies: + "@types/whatwg-url" "^11.0.2" + whatwg-url "^13.0.0" + +mongodb@6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-6.5.0.tgz#3735b4fba085b26ca06f7744e9639bc538e93d87" + integrity sha512-Fozq68InT+JKABGLqctgtb8P56pRrJFkbhW0ux+x1mdHeyinor8oNzJqwLjV/t5X5nJGfTlluxfyMnOXNggIUA== + dependencies: + "@mongodb-js/saslprep" "^1.1.5" + bson "^6.4.0" + mongodb-connection-string-url "^3.0.0" + +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.0.0, ms@^2.1.1, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +murmur-128@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/murmur-128/-/murmur-128-0.2.1.tgz#a9f6568781d2350ecb1bf80c14968cadbeaa4b4d" + integrity sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg== + dependencies: + encode-utf8 "^1.0.2" + fmix "^0.1.0" + imul "^1.0.0" + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +napi-macros@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.2.2.tgz#817fef20c3e0e40a963fbf7b37d1600bd0201044" + integrity sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g== + +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + +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== + +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-emoji@^1.10.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" + integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== + dependencies: + lodash "^4.17.21" + +node-fetch@^2.7.0: + 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.0, node-gyp-build@^4.3.0: + version "4.8.2" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.2.tgz#4f802b71c1ab2ca16af830e6c1ea7dd1ad9496fa" + integrity sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw== + +nodemon@^3.0.1: + version "3.1.4" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.1.4.tgz#c34dcd8eb46a05723ccde60cbdd25addcc8725e4" + integrity sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ== + dependencies: + chokidar "^3.5.2" + debug "^4" + ignore-by-default "^1.0.1" + minimatch "^3.1.2" + pstree.remy "^1.1.8" + semver "^7.5.3" + simple-update-notifier "^2.0.0" + supports-color "^5.5.0" + touch "^3.1.0" + undefsafe "^2.0.5" + +nofilter@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" + integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== + +nopt@3.x: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg== + dependencies: + abbrev "1" + +normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-package-data@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" + integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== + dependencies: + hosted-git-info "^4.0.1" + is-core-module "^2.5.0" + semver "^7.3.4" + validate-npm-package-license "^3.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +npm-run-path@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" + integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== + dependencies: + path-key "^4.0.0" + +number-to-bn@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" + integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig== + dependencies: + bn.js "4.11.6" + strip-hex-prefix "1.0.0" + +object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.1: + version "1.13.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== + +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== + +obliterator@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" + integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== + +once@1.x, once@^1.3.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" + +one-time@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" + integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== + dependencies: + fn.name "1.x.x" + +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + +open@^7.4.2: + version "7.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + +openzeppelin-solidity@^4.8.1: + version "4.8.1" + resolved "https://registry.yarnpkg.com/openzeppelin-solidity/-/openzeppelin-solidity-4.8.1.tgz#2ab492a5a53a5520401e94df36e43807de7a3b50" + integrity sha512-KM0pVpfrCBdifqN2ZeJZFvFuoGz3GmI4Ty/ceKNkcaf7VVWo/rLOfc5EiLh+Ukb5NadNmYo8WMeGhFA8hVWDpg== + +optionator@^0.8.1: + 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.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.5" + +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +ordinal@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ordinal/-/ordinal-1.0.3.tgz#1a3c7726a61728112f50944ad7c35c06ae3a0d4d" + integrity sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ== + +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-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.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@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== + dependencies: + p-limit "^1.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + 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-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +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-cache-control@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e" + integrity sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg== + +parse-json@^5.0.0, parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== + +patch-package@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-8.0.0.tgz#d191e2f1b6e06a4624a0116bcb88edd6714ede61" + integrity sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + chalk "^4.1.2" + ci-info "^3.7.0" + cross-spawn "^7.0.3" + find-yarn-workspace-root "^2.0.0" + fs-extra "^9.0.0" + json-stable-stringify "^1.0.2" + klaw-sync "^6.0.0" + minimist "^1.2.6" + open "^7.4.2" + rimraf "^2.6.3" + semver "^7.5.3" + slash "^2.0.0" + tmp "^0.0.33" + yaml "^2.2.2" + +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-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + +path-parse@^1.0.6, 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.17: + 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.1.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" + integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pidtree@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" + integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinst@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pinst/-/pinst-3.0.0.tgz#80dec0a85f1f993c6084172020f3dbf512897eec" + integrity sha512-cengSmBxtCyaJqtRSvJorIIZXMXg+lJ3sIljGmtBGUVonMnMsVJbnzl6jGN1HkOWwxNuJynCJ2hXxxqCQrFDdw== + +pluralize@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== + +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-plugin-solidity@^1.0.0, prettier-plugin-solidity@^1.3.1, prettier-plugin-solidity@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.4.1.tgz#8060baf18853a9e34d2e09e47e87b4f19e15afe9" + integrity sha512-Mq8EtfacVZ/0+uDKTtHZGW3Aa7vEbX/BNx63hmVg6YTiTXSiuKP0amj0G6pGwjmLaOfymWh3QgXEZkjQbU8QRg== + dependencies: + "@solidity-parser/parser" "^0.18.0" + semver "^7.5.4" + +prettier@^2.1.2, prettier@^2.3.1, prettier@^2.8.3, prettier@^2.8.7: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + +prettier@^3.0.3, prettier@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" + integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== + +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== + +promise@^8.0.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" + integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== + dependencies: + asap "~2.0.6" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +pstree.remy@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" + integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== + +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.4.0, qs@^6.9.4: + version "6.13.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" + integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== + dependencies: + side-channel "^1.0.6" + +queue-microtask@^1.2.2, queue-microtask@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== + +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" + +raw-body@^2.4.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.4.0, readable-stream@^3.6.0, readable-stream@^3.6.2: + 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@^2.2.2: + 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" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +readonly-date@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/readonly-date/-/readonly-date-1.0.0.tgz#5af785464d8c7d7c40b9d738cbde8c646f97dcd9" + integrity sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ== + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== + dependencies: + resolve "^1.1.6" + +recursive-readdir@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" + integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== + dependencies: + minimatch "^3.0.5" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +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== + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +req-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/req-cwd/-/req-cwd-2.0.0.tgz#d4082b4d44598036640fb73ddea01ed53db49ebc" + integrity sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ== + dependencies: + req-from "^2.0.0" + +req-from@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/req-from/-/req-from-2.0.0.tgz#d74188e47f93796f4aa71df6ee35ae689f3e0e70" + integrity sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA== + dependencies: + resolve-from "^3.0.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.0, require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg== + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-from@5.0.0, resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== + +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-global@1.0.0, resolve-global@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-global/-/resolve-global-1.0.0.tgz#a2a79df4af2ca3f49bf77ef9ddacd322dad19255" + integrity sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw== + dependencies: + global-dirs "^0.1.1" + +resolve@1.1.x: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== + +resolve@1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + +resolve@^1.1.6, resolve@^1.10.0, resolve@^1.8.1: + 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@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +restore-cursor@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-4.0.0.tgz#519560a4318975096def6e609d44100edaa4ccb9" + integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== + dependencies: + onetime "^5.1.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== + +rfdc@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" + integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== + +rimraf@^2.2.8, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + 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" + +rlp@^2.2.3, rlp@^2.2.4: + version "2.2.7" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== + dependencies: + bn.js "^5.2.0" + +rpc-websockets@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-9.0.2.tgz#4c1568d00b8100f997379a363478f41f8f4b242c" + integrity sha512-YzggvfItxMY3Lwuax5rC18inhbjJv9Py7JXRHxTIi94JOLrqBsSsUUc5bbl5W6c11tXhdfpDPK0KzBhoGe8jjw== + dependencies: + "@swc/helpers" "^0.5.11" + "@types/uuid" "^8.3.4" + "@types/ws" "^8.2.2" + buffer "^6.0.3" + eventemitter3 "^5.0.1" + uuid "^8.3.2" + ws "^8.5.0" + optionalDependencies: + bufferutil "^4.0.1" + utf-8-validate "^5.0.2" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel-limit@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz#be80e936f5768623a38a963262d6bef8ff11e7ba" + integrity sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw== + dependencies: + queue-microtask "^1.2.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rustbn.js@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" + integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== + +rxjs@^7.5.5: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-stable-stringify@^2.3.1: + version "2.5.0" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" + integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== + +"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== + +sc-istanbul@^0.4.5: + version "0.4.6" + resolved "https://registry.yarnpkg.com/sc-istanbul/-/sc-istanbul-0.4.6.tgz#cf6784355ff2076f92d70d59047d71c13703e839" + integrity sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g== + dependencies: + abbrev "1.0.x" + async "1.x" + escodegen "1.8.x" + esprima "2.7.x" + glob "^5.0.15" + handlebars "^4.0.1" + js-yaml "3.x" + mkdirp "0.5.x" + nopt "3.x" + once "1.x" + resolve "1.1.x" + supports-color "^3.1.0" + which "^1.1.1" + wordwrap "^1.0.0" + +scrypt-js@3.0.1, scrypt-js@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +secp256k1@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== + dependencies: + elliptic "^6.5.4" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + +"semver@2 || 3 || 4 || 5", semver@^5.5.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +semver@^6.3.0: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.4, semver@^7.3.7, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + +serialize-javascript@^6.0.2: + 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-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" + +setimmediate@^1.0.5: + 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== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + 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" + +sha1@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/sha1/-/sha1-1.1.1.tgz#addaa7a93168f393f19eb2b15091618e2700f848" + integrity sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA== + dependencies: + charenc ">= 0.0.1" + crypt ">= 0.0.1" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shelljs@^0.8.3, shelljs@^0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" + integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +shx@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/shx/-/shx-0.3.4.tgz#74289230b4b663979167f94e1935901406e40f02" + integrity sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g== + dependencies: + minimist "^1.2.3" + shelljs "^0.8.5" + +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.2, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + +simple-update-notifier@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" + integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== + dependencies: + semver "^7.5.3" + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +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@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== + dependencies: + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" + +solc@0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" + integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== + dependencies: + command-exists "^1.2.8" + commander "3.0.2" + follow-redirects "^1.12.1" + fs-extra "^0.30.0" + js-sha3 "0.8.0" + memorystream "^0.3.1" + require-from-string "^2.0.0" + semver "^5.5.0" + tmp "0.0.33" + +solhint-plugin-prettier@^0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/solhint-plugin-prettier/-/solhint-plugin-prettier-0.0.5.tgz#e3b22800ba435cd640a9eca805a7f8bc3e3e6a6b" + integrity sha512-7jmWcnVshIrO2FFinIvDQmhQpfpS2rRRn3RejiYgnjIE68xO2bvrYvjqVNfrio4xH9ghOqn83tKuTzLjEbmGIA== + dependencies: + prettier-linter-helpers "^1.0.0" + +solhint@^3.3.7: + version "3.6.2" + resolved "https://registry.yarnpkg.com/solhint/-/solhint-3.6.2.tgz#2b2acbec8fdc37b2c68206a71ba89c7f519943fe" + integrity sha512-85EeLbmkcPwD+3JR7aEMKsVC9YrRSxd4qkXuMzrlf7+z2Eqdfm1wHWq1ffTuo5aDhoZxp2I9yF3QkxZOxOL7aQ== + dependencies: + "@solidity-parser/parser" "^0.16.0" + ajv "^6.12.6" + antlr4 "^4.11.0" + ast-parents "^0.0.1" + chalk "^4.1.2" + commander "^10.0.0" + cosmiconfig "^8.0.0" + fast-diff "^1.2.0" + glob "^8.0.3" + ignore "^5.2.4" + js-yaml "^4.1.0" + lodash "^4.17.21" + pluralize "^8.0.0" + semver "^7.5.2" + strip-ansi "^6.0.1" + table "^6.8.1" + text-table "^0.2.0" + optionalDependencies: + prettier "^2.8.3" + +solidity-coverage@^0.8.2: + version "0.8.13" + resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.8.13.tgz#8eeada2e82ae19d25568368aa782a2baad0e0ce7" + integrity sha512-RiBoI+kF94V3Rv0+iwOj3HQVSqNzA9qm/qDP1ZDXK5IX0Cvho1qiz8hAXTsAo6KOIUeP73jfscq0KlLqVxzGWA== + dependencies: + "@ethersproject/abi" "^5.0.9" + "@solidity-parser/parser" "^0.18.0" + chalk "^2.4.2" + death "^1.1.0" + difflib "^0.2.4" + fs-extra "^8.1.0" + ghost-testrpc "^0.0.2" + global-modules "^2.0.0" + globby "^10.0.1" + jsonschema "^1.2.4" + lodash "^4.17.21" + mocha "^10.2.0" + node-emoji "^1.10.0" + pify "^4.0.1" + recursive-readdir "^2.2.2" + sc-istanbul "^0.4.5" + semver "^7.3.4" + shelljs "^0.8.3" + web3-utils "^1.3.6" + +solidity-rlp@2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/solidity-rlp/-/solidity-rlp-2.0.8.tgz#1548370b690ef06dbb62af06b7675bc86b19bbe3" + integrity sha512-gzYzHoFKRH1ydJeCfzm3z/BvKrZGK/V9+qbOlNbBcRAYeizjCdDNhLTTE8iIJrHqsRrZRSOo+7mhbnxoBoZvJQ== + +source-map-support@^0.5.13: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.5.0: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +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== + +source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + integrity sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA== + dependencies: + amdefine ">=0.0.4" + +sparse-bitfield@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11" + integrity sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ== + dependencies: + memory-pager "^1.0.2" + +spdx-correct@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.20" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz#e44ed19ed318dd1e5888f93325cee800f0f51b89" + integrity sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw== + +split2@^3.0.0, split2@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" + integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== + dependencies: + readable-stream "^3.0.0" + +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== + +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== + +stacktrace-parser@^0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" + integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== + dependencies: + type-fest "^0.7.1" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +string-argv@0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" + integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== + +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@^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@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.0, string-width@^5.0.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + 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@^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@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-bom@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + +strip-hex-prefix@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" + integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== + dependencies: + is-hex-prefixed "1.0.0" + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@3.1.1, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +superstruct@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-2.0.2.tgz#3f6d32fbdc11c357deff127d591a39b996300c54" + integrity sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A== + +supports-color@^3.1.0: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A== + dependencies: + has-flag "^1.0.0" + +supports-color@^5.3.0, supports-color@^5.5.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.1.1: + 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== + +sync-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/sync-request/-/sync-request-6.1.0.tgz#e96217565b5e50bbffe179868ba75532fb597e68" + integrity sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw== + dependencies: + http-response-object "^3.0.1" + sync-rpc "^1.2.1" + then-request "^6.0.0" + +sync-rpc@^1.2.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/sync-rpc/-/sync-rpc-1.3.6.tgz#b2e8b2550a12ccbc71df8644810529deb68665a7" + integrity sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw== + dependencies: + get-port "^3.1.0" + +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@^6.8.0, table@^6.8.1: + version "6.8.2" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.2.tgz#c5504ccf201213fa227248bdc8c5569716ac6c58" + integrity sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA== + dependencies: + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + +text-encoding-utf-8@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" + integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== + +text-extensions@^1.0.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" + integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== + +text-hex@1.0.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" + integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +then-request@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/then-request/-/then-request-6.0.2.tgz#ec18dd8b5ca43aaee5cb92f7e4c1630e950d4f0c" + integrity sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA== + dependencies: + "@types/concat-stream" "^1.6.0" + "@types/form-data" "0.0.33" + "@types/node" "^8.0.0" + "@types/qs" "^6.2.31" + caseless "~0.12.0" + concat-stream "^1.6.0" + form-data "^2.2.0" + http-basic "^8.1.1" + http-response-object "^3.0.1" + promise "^8.0.0" + qs "^6.4.0" + +through2@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" + integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== + dependencies: + readable-stream "3" + +"through@>=2.2.7 <3", 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== + +tmp@0.0.33, tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +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" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +touch@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.1.tgz#097a23d7b161476435e5c1344a95c0f75b4a5694" + integrity sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA== + +tr46@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-4.1.1.tgz#281a758dcc82aeb4fe38c7dfe4d11a395aac8469" + integrity sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw== + dependencies: + punycode "^2.3.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== + +trim-newlines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" + integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== + +triple-beam@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" + integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== + +ts-api-utils@^1.0.1: + 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@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-1.0.4.tgz#ce3b5dade5f5d97cf69889c11bf7d2da8555b15a" + integrity sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ== + +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== + +ts-generator@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ts-generator/-/ts-generator-0.1.1.tgz#af46f2fb88a6db1f9785977e9590e7bcd79220ab" + integrity sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ== + dependencies: + "@types/mkdirp" "^0.5.2" + "@types/prettier" "^2.1.1" + "@types/resolve" "^0.0.8" + chalk "^2.4.1" + glob "^7.1.2" + mkdirp "^0.5.1" + prettier "^2.1.2" + resolve "^1.8.1" + ts-essentials "^1.0.0" + +ts-node@^10.8.1, ts-node@^10.9.1: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tslib@^1.8.1, tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.1.0, tslib@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== + +tsort@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" + integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +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.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" + integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== + +type-fest@^0.18.0: + version "0.18.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" + integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +type-fest@^1.0.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" + integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== + +typechain@^8.1.1: + 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" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== + +"typescript@^4.6.4 || ^5.2.2", typescript@^5.2.2: + version "5.6.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.2.tgz#d1de67b6bef77c41823f822df8f0b3bcff60a5a0" + integrity sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw== + +typescript@^4.9.3: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +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== + +uglify-js@^3.1.4: + version "3.19.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f" + integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== + +undefsafe@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" + integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== + +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== + +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + +undici@^5.14.0: + version "5.28.4" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068" + integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g== + dependencies: + "@fastify/busboy" "^2.0.0" + +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== + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +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" + +utf-8-validate@^5.0.2: + version "5.0.10" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" + integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== + dependencies: + node-gyp-build "^4.3.0" + +utf8@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" + integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== + +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== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +viem@^2.9.28: + version "2.21.7" + resolved "https://registry.yarnpkg.com/viem/-/viem-2.21.7.tgz#c933fd3adb6f771e5c5fe2b4d7a14d8701ddc32f" + integrity sha512-PFgppakInuHX31wHDx1dzAjhj4t6Po6WrWtutDi33z2vabIT0Wv8qT6tl7DLqfLy2NkTqfN2mdshYLeoI5ZHvQ== + dependencies: + "@adraffy/ens-normalize" "1.10.0" + "@noble/curves" "1.4.0" + "@noble/hashes" "1.4.0" + "@scure/bip32" "1.4.0" + "@scure/bip39" "1.4.0" + abitype "1.0.5" + isows "1.0.4" + webauthn-p256 "0.0.5" + ws "8.17.1" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +web3-utils@^1.3.6: + version "1.10.4" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.4.tgz#0daee7d6841641655d8b3726baf33b08eda1cbec" + integrity sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A== + dependencies: + "@ethereumjs/util" "^8.1.0" + bn.js "^5.2.1" + ethereum-bloom-filters "^1.0.6" + ethereum-cryptography "^2.1.2" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + utf8 "3.0.0" + +webauthn-p256@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/webauthn-p256/-/webauthn-p256-0.0.5.tgz#0baebd2ba8a414b21cc09c0d40f9dd0be96a06bd" + integrity sha512-drMGNWKdaixZNobeORVIqq7k5DsRC9FnG201K2QjeOoQLmtSDaSsVZdkg6n5jUALJKcAG++zBPJXmv6hy0nWFg== + dependencies: + "@noble/curves" "^1.4.0" + "@noble/hashes" "^1.4.0" + +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== + +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +whatwg-url@^13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-13.0.0.tgz#b7b536aca48306394a34e44bda8e99f332410f8f" + integrity sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig== + dependencies: + tr46 "^4.1.1" + webidl-conversions "^7.0.0" + +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@^1.1.1, which@^1.2.14, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.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" + +winston-transport@^4.7.0: + version "4.7.1" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.7.1.tgz#52ff1bcfe452ad89991a0aaff9c3b18e7f392569" + integrity sha512-wQCXXVgfv/wUPOfb2x0ruxzwkcZfxcktz6JIMUaPLmcNhO4bZTwA/WtDWK74xV3F2dKu8YadrFv0qhwYjVEwhA== + dependencies: + logform "^2.6.1" + readable-stream "^3.6.2" + triple-beam "^1.3.0" + +winston@^3.11.0: + version "3.14.2" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.14.2.tgz#94ce5fd26d374f563c969d12f0cd9c641065adab" + integrity sha512-CO8cdpBB2yqzEf8v895L+GNKYJiEq8eKlHU38af3snQBQ+sdAIUepjMSguOIJC7ICbzm0ZI+Af2If4vIJrtmOg== + dependencies: + "@colors/colors" "^1.6.0" + "@dabh/diagnostics" "^2.0.2" + async "^3.2.3" + is-stream "^2.0.0" + logform "^2.6.0" + one-time "^1.0.0" + readable-stream "^3.4.0" + safe-stable-stringify "^2.3.1" + stack-trace "0.0.x" + triple-beam "^1.3.0" + winston-transport "^4.7.0" + +word-wrap@^1.0.3, word-wrap@^1.2.5, 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== + +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + +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" + +workerpool@^6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" + integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.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== + +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.17.1: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" + integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== + +ws@^7.4.6, ws@^7.5.10: + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== + +ws@^8.5.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +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== + +yaml@2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b" + integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== + +yaml@^2.2.2: + version "2.5.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.1.tgz#c9772aacf62cb7494a95b0c4f1fb065b563db130" + integrity sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q== + +yargs-parser@^20.2.2, yargs-parser@^20.2.3, yargs-parser@^20.2.9: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs-unparser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.0.0: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zksync-web3@^0.14.3: + version "0.14.4" + resolved "https://registry.yarnpkg.com/zksync-web3/-/zksync-web3-0.14.4.tgz#0b70a7e1a9d45cc57c0971736079185746d46b1f" + integrity sha512-kYehMD/S6Uhe1g434UnaMN+sBr9nQm23Ywn0EUP5BfQCsbjcr3ORuS68PosZw8xUTu3pac7G6YMSnNHk+fwzvg== From 5d114a87ef25d7447ec56f64e6e2852b77484185 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 18 Sep 2024 07:25:40 +0200 Subject: [PATCH 259/297] refactor(evm): adds ARB_SYS constant within ArbHeaderStorage --- packages/evm/contracts/utils/ArbHeaderStorage.sol | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/evm/contracts/utils/ArbHeaderStorage.sol b/packages/evm/contracts/utils/ArbHeaderStorage.sol index 3c5898cb..b14f5db9 100644 --- a/packages/evm/contracts/utils/ArbHeaderStorage.sol +++ b/packages/evm/contracts/utils/ArbHeaderStorage.sol @@ -9,14 +9,15 @@ import { IArbSys } from "../interfaces/IArbSys.sol"; /// Need to call precompiled arbBlockHash(uint256 blockNumber) to get actual block hash of Arbitrum /// https://docs.arbitrum.io/build-decentralized-apps/precompiles/reference#arbsys contract ArbHeaderStorage is IHeaderStorage { + address public constant ARB_SYS = 0x0000000000000000000000000000000000000064; + mapping(uint256 => bytes32) public headers; /// @inheritdoc IHeaderStorage function storeBlockHeader(uint256 blockNumber) public returns (bytes32) { bytes32 blockHeader = headers[blockNumber]; if (blockHeader == 0) { - // ArbSys precompiled contract = 0x0000000000000000000000000000000000000064 - blockHeader = IArbSys(0x0000000000000000000000000000000000000064).arbBlockHash(blockNumber); + blockHeader = IArbSys(ARB_SYS).arbBlockHash(blockNumber); if (blockHeader == 0) revert HeaderOutOfRange(blockNumber); headers[blockNumber] = blockHeader; emit HeaderStored(blockNumber, blockHeader); From 0e86e03fa5ac10557fb37b9c1ac68a2126c9e0a1 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Wed, 18 Sep 2024 18:03:51 +0800 Subject: [PATCH 260/297] chore(reporter): remove redundant addresses in .env.example --- packages/reporter/.env.example | 89 +--------------------------------- 1 file changed, 1 insertion(+), 88 deletions(-) diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index e4ab8bae..8ff12943 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -3,8 +3,7 @@ PRIVATE_KEY= REPORTERS_ENABLED=WormholeReporterController,AMBReporterController,LayerZeroReporterController GNOSIS_RPC_URL=https://rpc.ankr.com/gnosis -MAINNET_RPC_URL= -# MAINNET_RPC_URL=https://eth.llamarpc.com +MAINNET_RPC_URL=https://eth.llamarpc.com BSC_RPC_URL=https://bsc-dataseed1.binance.org GOERLI_RPC_URL= POLYGON_RPC_URL= @@ -60,89 +59,3 @@ ARBITRUM_LZ_REPORTER=0xf4C84D9ced01534f235078A10E8A44A726c4b73c POLYGON_LZ_REPORTER=0x231e48AAEaAC6398978a1dBA4Cd38fcA208Ec391 BSC_LZ_REPORTER=0xc9618e4d4B59570Da67b4fb0E8fC7EB40A5f8462 BASE_LZ_REPORTER=0x495b872b329eba69F81A749f8A152766851C23b0 - -# MAINNET_LAYER_ZERO_REPORTER=0xbc5f67da5347cd4304e9623bc86e71a874287ea1 -# BSC_MAINNET_LAYER_ZERO_ADAPTER=0xDbdF80c87f414fac8342e04D870764197bD3bAC7 -# POLYGON_MAINNET_LAYER_ZERO_ADAPTER=0x998dA7f6cF98541E4F4469cc9d53B9374F186591 -# BASE_MAINNET_LAYER_ZERO_ADAPTER=0xA86bc62Ac53Dc86687AB6C15fdebC71ad51fB615 -# OPTIMISM_MAINNET_LAYER_ZERO_ADAPTER=0xA86bc62Ac53Dc86687AB6C15fdebC71ad51fB615 - -# ### BASE -# BASE_LZ_REPORTER=0x495b872b329eba69F81A749f8A152766851C23b0 -# BASE_POLYGON_LZ_ADAPTER=0x998dA7f6cF98541E4F4469cc9d53B9374F186591 -# BASE_GNO_LZ_ADAPTER=0xC82e50cc90C84DC492B4Beb6792DEeB496d52424 -# BASE_BNB_LZ_ADAPTER=0xDbdF80c87f414fac8342e04D870764197bD3bAC7 -# BASE_OPTIMISM_LZ_ADAPTER=0xA86bc62Ac53Dc86687AB6C15fdebC71ad51fB615 -# BASE_ARBITRUM_LZ_ADAPTER=0xA86bc62Ac53Dc86687AB6C15fdebC71ad51fB615 - -# ## AMB -# MAINNET_AMB_REPORTER=0xDbdF80c87f414fac8342e04D870764197bD3bAC7 -# GNOSIS_AMB_ADAPTER=0x79e4D1B8b8De0bC2F8A3DC477480C935C66F373E - - -# # Testnet -# SEPOLIA_CHIADO_AMB_ADAPTER=0x3F5929bee6A59661D6CcC9c4eB751048009CE11B -# SEPOLIA_CHIADO_AMB_REPORTER=0xc6755144d60548f3DD420F47Cf48DAe553bBf042 - -# SEPOLIA_CHIADO_CCIP_REPORTER=0xf66871C91952b09270d223cD3A1e5Dad57b14fbC -# SEPOLIA_CHIADO_CCIP_ADAPTER=0x8A2A7509B98f0f21BEFF82e2520A920DB61fFa9d -# SEPOLIA_WORMHOLE_ADDRESS=0x4a8bc80Ed5a4067f1CCf107057b8270E0cC11A78 - -# SEPOLIA_CHIADO_WORMHOLE_REPORTER=0xeE8082F48e768e096c2EEC5C80DC818eb6E15858 -# SEPOLIA_CHIADO_WORMHOLE_ADAPTER=0x79e4D1B8b8De0bC2F8A3DC477480C935C66F373E - -# # LEGACY -# GNOSIS_AMB_ADAPTER=0x4efB95c26bB2ebD3281749A5eAA388bc302b4445 -# GNOSIS_AMB_REPORTER=0xc6755144d60548f3DD420F47Cf48DAe553bBf042 - -# SEPOLIA_CHIADO_CCIP_REPORTER=0xf66871C91952b09270d223cD3A1e5Dad57b14fbC -# SEPOLIA_CHIADO_CCIP_ADAPTER=0x8A2A7509B98f0f21BEFF82e2520A920DB61fFa9d -# SEPOLIA_CHIADO_LZ_REPORTER=0xF7c2687c75FcBC7A00663f9436783A2B898537a4 -# SEPOLIA_CHIADO_LZ_ADAPTER=0xF7c2687c75FcBC7A00663f9436783A2B898537a4 - -# SEPOLIA_ARB_LZ_REPORTER=0x49f6BE2C7DB433395939b2c728dF2CB99Ca5f8c5 -# SEPOLIA_ARB_LZ_ADAPTER=0x21eAB033C7D2DF6A67AeF6C5Bda9A7F151eB9f52 - -# OPTIMISM_SEPOLIA_LZ_ADAPTER=0xF7c2687c75FcBC7A00663f9436783A2B898537a4 -# CHIADO_ADAPTER=0x3F5929bee6A59661D6CcC9c4eB751048009CE11B - -# #AMB_ADAPTER=0x4efB95c26bB2ebD3281749A5eAA388bc302b4445 -# SYMGA_ADAPTER=0x9AD7a6f4FDA8247cC0bF5932B68c5b619937dB15 -# GNOSIS_TELEPATHY_ADAPTER=0xDeF29f44f8315d0079A25EF03cfB0b0D8CdA3cF8 -# # MAINNET_AMB_REPORTER=0x6be796cb66CdB3566b8AbebA2C516CbDF93fE831 -# MAINNET_HEADER_REPORTER=0x11378C54aA4e2Daf4603f9be86ae0Cb70786682a -# POLYGON_TELEPATHY_ADAPTER=0x04413A4795dD1f5347eAD1CD7C76Bd9E5e48b461 -# BSC_TELEPATHY_ADAPTER=0x2E5685F20f42cC3b01e4A9ADE49F6848E242f022 -# OPTIMISM_TELEPATHY_ADAPTER=0x856dcc80f75a9737D9D498266E1Af013668316Fb -# ARBITRUM_TELEPATHY_ADAPTER=0x2E5685F20f42cC3b01e4A9ADE49F6848E242f022 -# GNOSIS_WORMHOLE_ADAPTER=0x8EA3F385be8FCB98eB4dBfad2D00846860Bf648D -# POLYGON_WORMHOLE_ADAPTER=0xb7806ea66c1bb9FfeB41Dc303601a469ddf3b9C2 -# BSC_WORMHOLE_ADAPTER=0x11378C54aA4e2Daf4603f9be86ae0Cb70786682a -# OPTIMISM_WORMHOLE_ADAPTER=0x1fF52708D610b1D17F0830f036e992677CDc508A -# AVALANCHE_WORMHOLE_ADAPTER=0x6E9ce437c46e7fA4F0888c21AAC0d9099Ad133ea -# MAINNET_WORMHOLE_HEADER_REPORTER=0xDeF29f44f8315d0079A25EF03cfB0b0D8CdA3cF8 -# MAINNET_WORMHOLE_ADDRESS=0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B -# MAINNET_L1_CROSS_DOMAIN_MESSENGER_HEADER_REPORTER_ADDRESS=0xbA5B3f0643582E75AF252e7631dE62c046970167 -# OPTIMISM_L2_CROSS_DOMAIN_MESSENGER_ADAPTER_ADDRESS=0xe58E7bF7aCD1396D8F9eAF44DB3D4Fd055DCDb51 -# MAINNET_AXELAR_REPORTER_BSC=0xBfd877753F8B4f4117a08aD54DcBE69cF3165d81 -# BSC_AXELAR_ADAPTER_MAINNET=0xb7806ea66c1bb9FfeB41Dc303601a469ddf3b9C2 -# POLYGON_CELER_ADAPTER_MAINNET=0x1fF52708D610b1D17F0830f036e992677CDc508A -# MAINNET_CELER_REPORTER_POLYGON=0x52258b83051B7031483740aC9EcAa07926392ea0 -# AVALANCHE_LAYER_ZERO_ADAPTER_MAINNET=0x11378C54aA4e2Daf4603f9be86ae0Cb70786682a -# MAINNET_LAYER_ZERO_REPORTER_AVALANCHE=0x16B43E348e0A19E9196ae79D172aDC52B3Aa3E20 -# OPTIMISM_GOERLI_CCIP_ADAPTER_SEPOLIA=0x520185210Aa645220a49afD9C33d28b73494e14d -# SEPOLIA_CCIP_REPORTER_OPTIMISM_GOERLI=0xF3D2877866cd8E6771843b96B66aFcE425B2353C -# BSC_TESTNET_CCIP_ADAPTER_SEPOLIA=0xB6133Ab655B990E80Af3E948852C8ec2a46651A5 -# SEPOLIA_CCIP_REPORTER_BSC_TESTNET=0x855A2814E0DFf8327f1a52aCC9537772B829e226 - -# BSC_LAYER_ZERO_ADAPTER_MAINNET=0xaC3c8D19A64B98d62ED16FFf8a4229E8ED36A469 -# GOERLI_ZETA_REPORTER_BSC_TESTNET=0x9a9fc484D3F83B489bc58c2A3EeeA8331F21796B -# BSC_TESTNET_ZETA_ADAPTER_GOERLI=0x2829D554678a767c5B091D28A0A294dB7643ec05 -# MAINNET_CCIP_REPORTER_AVALANCHE=0xeEFD0D67E4eF9330870961C38a3e25ECE369B141 -# AVALANCHE_CCIP_ADAPTER_MAINNET=0x04413A4795dD1f5347eAD1CD7C76Bd9E5e48b461 -# GNOSIS_SYGMA_ADAPTER=0x483285D0e24401D0C5DB6cF1FAC4f79f412079C0 -# MAINNET_SYGMA_REPORTER_GNOSIS=0x973bB99db211755b80c9087fe436fBb81A45AD5E -# MAINNET_HEADER_STORAGE=0x22F1fc71A505c0b2bf4D5075801cc5E0ec84B09e -# GOERLI_HEADER_STORAGE=0x4cD014AC64AAa899b46BF3a477B68bb67e33eDC4 -# CHIADO_ELECTRON_ADAPTER_GOERLI=0x66fBC348aef3797fb885f8073173E5064bf7ABBb -# CHIADO_ELECTRON_LIGHT_CLIENT_GOERLI=0xc01707bD835f6108785DF081C943C7C108FC3D89 \ No newline at end of file From 19b06662a2f1abaeb4b94ab10fcfd03991f57db0 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Wed, 18 Sep 2024 18:06:44 +0800 Subject: [PATCH 261/297] chore(evm): rename LayerZeroAdapter.sol enabledReporters mapping --- .../evm/contracts/adapters/LayerZero/LayerZeroAdapter.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/evm/contracts/adapters/LayerZero/LayerZeroAdapter.sol b/packages/evm/contracts/adapters/LayerZero/LayerZeroAdapter.sol index 0c112382..280fcefb 100644 --- a/packages/evm/contracts/adapters/LayerZero/LayerZeroAdapter.sol +++ b/packages/evm/contracts/adapters/LayerZero/LayerZeroAdapter.sol @@ -11,7 +11,7 @@ contract LayerZeroAdapter is BlockHashAdapter, Ownable, ILayerZeroReceiver, OApp string public constant PROVIDER = "layer-zero"; address public immutable LAYER_ZERO_ENDPOINT; - mapping(uint32 => address) public enabledReporter; + mapping(uint32 => address) public enabledReporters; mapping(uint32 => uint256) public chainIds; error UnauthorizedLayerZeroReceive(); @@ -31,7 +31,7 @@ contract LayerZeroAdapter is BlockHashAdapter, Ownable, ILayerZeroReceiver, OApp ) external payable { if ( msg.sender != LAYER_ZERO_ENDPOINT || - enabledReporter[_origin.srcEid] != address(uint160(uint256(_origin.sender))) + enabledReporters[_origin.srcEid] != address(uint160(uint256(_origin.sender))) ) revert UnauthorizedLayerZeroReceive(); (uint256[] memory ids, bytes32[] memory hashes) = abi.decode(_message, (uint256[], bytes32[])); _storeHashes(chainIds[_origin.srcEid], ids, hashes); @@ -50,7 +50,7 @@ contract LayerZeroAdapter is BlockHashAdapter, Ownable, ILayerZeroReceiver, OApp } function setReporterByChain(uint256 chainId, uint32 endpointId, address reporter) external onlyOwner { - enabledReporter[endpointId] = reporter; + enabledReporters[endpointId] = reporter; chainIds[endpointId] = chainId; emit ReporterSet(chainId, endpointId, reporter); } From 5e9b58a1f0d7618f1b5ab57d6b43a2fa144b0d59 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Wed, 18 Sep 2024 18:47:22 +0800 Subject: [PATCH 262/297] chore(reporter): remove SygmaReporterController class --- .../controllers/StandardReporterController.ts | 2 - .../controllers/SygmaReporterController.ts | 38 ------------------- packages/reporter/src/index.ts | 4 +- 3 files changed, 2 insertions(+), 42 deletions(-) delete mode 100644 packages/reporter/src/controllers/SygmaReporterController.ts diff --git a/packages/reporter/src/controllers/StandardReporterController.ts b/packages/reporter/src/controllers/StandardReporterController.ts index 5686cdfe..4a7fb8b6 100644 --- a/packages/reporter/src/controllers/StandardReporterController.ts +++ b/packages/reporter/src/controllers/StandardReporterController.ts @@ -41,8 +41,6 @@ class StandardReporterController extends BaseController { const txHash = await client.writeContract(request) this.logger.info(`headers reporter from ${this.sourceChain.name} to ${chain.name}: ${txHash}`) - - await new Promise((resolve) => setTimeout(resolve, 12000)) } } catch (_error) { this.logger.error(_error) diff --git a/packages/reporter/src/controllers/SygmaReporterController.ts b/packages/reporter/src/controllers/SygmaReporterController.ts deleted file mode 100644 index 272c73b0..00000000 --- a/packages/reporter/src/controllers/SygmaReporterController.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Chain, parseEther } from "viem" - -import ABI from "../ABIs/SygmaReporterContractABI.json" assert { type: "json" } -import BaseController from "./BaseController.js" - -import { BaseControllerConfigs } from "./BaseController.js" - -class SygmaReporterController extends BaseController { - constructor(_configs: BaseControllerConfigs) { - super(_configs, "SygmaReporterController") - } - - async onBlocks(_blockNumbers: bigint[]) { - try { - const client = this.multiClient.getClientByChain(this.sourceChain) - const blockNumber = _blockNumbers[_blockNumbers.length - 1] - - for (const chain of this.destinationChains as Chain[]) { - if (!this.adapterAddresses[chain.name]) continue - - this.logger.info(`reporting block header for block ${blockNumber} on ${chain.name} ...`) - - const { request } = await client.simulateContract({ - address: this.reporterAddresses[chain.name], - abi: ABI, - functionName: "dispatchBlocks", - args: [chain.id, this.adapterAddresses[chain.name], [blockNumber]], - }) - const txHash = await client.writeContract(request) - this.logger.info(`headers reporter from ${this.sourceChain.name} to ${chain.name}: ${txHash}`) - } - } catch (_error) { - this.logger.error(_error) - } - } -} - -export default SygmaReporterController diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 9baa2ec7..3c0e1be8 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -20,7 +20,6 @@ import { Chain } from "viem" import Multiclient from "./MultiClient.js" import ElectronReporterController from "./controllers/ElectronReporterController.js" import OptimismReporterController from "./controllers/OptimismReporterController.js" -import SygmaReporterController from "./controllers/SygmaReporterController.js" import StandardReporterController from "./controllers/StandardReporterController.js" import TelepathyReporterController from "./controllers/TelepathyReporterController.js" import WormholeReporterController from "./controllers/WormholeReporterController.js" @@ -79,7 +78,8 @@ const main = () => { }, }) - const sygmaReporterController = new SygmaReporterController({ + const sygmaReporterController = new StandardReporterController({ + name: "SygmaReporterController", type: "classic", sourceChain, destinationChains, From 7d03cc0f34c422357af961057a4931a7ba842c8f Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Thu, 19 Sep 2024 09:54:18 +0800 Subject: [PATCH 263/297] chore(reporter): delete files unrelated to Hashi v0.2.0 --- .../reporter/src/ABIs/ElectronAdapterABI.json | 287 ---------- .../src/ABIs/ElectronLightClientABI.json | 21 - .../reporter/src/ABIs/HeaderStorageABI.json | 89 ---- ...CrossDomainMessengerHeaderReporterABI.json | 250 --------- .../src/ABIs/SygmaReporterContractABI.json | 425 --------------- .../src/ABIs/TelepathyAdapterABI.json | 205 -------- .../src/ABIs/TelepathyContractABI.json | 497 ------------------ .../controllers/ElectronReporterController.ts | 177 ------- .../controllers/OptimismReporterController.ts | 37 -- .../TelepathyReporterController.ts | 92 ---- packages/reporter/src/index.ts | 63 --- 11 files changed, 2143 deletions(-) delete mode 100644 packages/reporter/src/ABIs/ElectronAdapterABI.json delete mode 100644 packages/reporter/src/ABIs/ElectronLightClientABI.json delete mode 100644 packages/reporter/src/ABIs/HeaderStorageABI.json delete mode 100644 packages/reporter/src/ABIs/L1CrossDomainMessengerHeaderReporterABI.json delete mode 100644 packages/reporter/src/ABIs/SygmaReporterContractABI.json delete mode 100644 packages/reporter/src/ABIs/TelepathyAdapterABI.json delete mode 100644 packages/reporter/src/ABIs/TelepathyContractABI.json delete mode 100644 packages/reporter/src/controllers/ElectronReporterController.ts delete mode 100644 packages/reporter/src/controllers/OptimismReporterController.ts delete mode 100644 packages/reporter/src/controllers/TelepathyReporterController.ts diff --git a/packages/reporter/src/ABIs/ElectronAdapterABI.json b/packages/reporter/src/ABIs/ElectronAdapterABI.json deleted file mode 100644 index 159d376a..00000000 --- a/packages/reporter/src/ABIs/ElectronAdapterABI.json +++ /dev/null @@ -1,287 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "address", - "name": "_lightClientAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_eventSourceAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_chainIdSource", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "blockHash", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "storedBlockHash", - "type": "bytes32" - } - ], - "name": "ConflictingBlockHeader", - "type": "error" - }, - { - "inputs": [], - "name": "ErrorParseReceipt", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "length", - "type": "uint256" - } - ], - "name": "InvalidBlockHeaderLength", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidBlockHeaderRLP", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidEventSignature", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidEventSource", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidReceiptsRoot", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "slot", - "type": "uint256" - } - ], - "name": "MissingHeaderOnLC", - "type": "error" - }, - { - "inputs": [], - "name": "UnsupportedTxType", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "id", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "hash", - "type": "bytes32" - } - ], - "name": "HashStored", - "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": [], - "name": "EVENT_SIG_HASH", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "chainIdSource", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "eventSource", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "domain", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "id", - "type": "uint256" - } - ], - "name": "getHash", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "lightClient", - "outputs": [ - { - "internalType": "contract ILightClient", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "internalType": "bytes[]", - "name": "blockHeaders", - "type": "bytes[]" - } - ], - "name": "proveAncestralBlockHashes", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "lightclientAddress", - "type": "address" - } - ], - "name": "setLightClientAddress", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "_metadata", - "type": "bytes" - } - ], - "name": "storeHash", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/packages/reporter/src/ABIs/ElectronLightClientABI.json b/packages/reporter/src/ABIs/ElectronLightClientABI.json deleted file mode 100644 index 95ec605f..00000000 --- a/packages/reporter/src/ABIs/ElectronLightClientABI.json +++ /dev/null @@ -1,21 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "uint256", - "name": "slot", - "type": "uint256" - } - ], - "name": "headers", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - } -] diff --git a/packages/reporter/src/ABIs/HeaderStorageABI.json b/packages/reporter/src/ABIs/HeaderStorageABI.json deleted file mode 100644 index 7810c996..00000000 --- a/packages/reporter/src/ABIs/HeaderStorageABI.json +++ /dev/null @@ -1,89 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - } - ], - "name": "HeaderOutOfRange", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "blockHeader", - "type": "bytes32" - } - ], - "name": "HeaderStored", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "headers", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - } - ], - "name": "storeBlockHeader", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256[]", - "name": "blockNumbers", - "type": "uint256[]" - } - ], - "name": "storeBlockHeaders", - "outputs": [ - { - "internalType": "bytes32[]", - "name": "", - "type": "bytes32[]" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/packages/reporter/src/ABIs/L1CrossDomainMessengerHeaderReporterABI.json b/packages/reporter/src/ABIs/L1CrossDomainMessengerHeaderReporterABI.json deleted file mode 100644 index 6553392d..00000000 --- a/packages/reporter/src/ABIs/L1CrossDomainMessengerHeaderReporterABI.json +++ /dev/null @@ -1,250 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "address", - "name": "headerStorage", - "type": "address" - }, - { - "internalType": "address", - "name": "yaho", - "type": "address" - }, - { - "internalType": "address", - "name": "l1CrossDomainMessenger", - "type": "address" - }, - { - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "expectedChainId", - "type": "uint256" - } - ], - "name": "InvalidToChainId", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "expectedYaho", - "type": "address" - } - ], - "name": "NotYaho", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "blockHeader", - "type": "bytes32" - } - ], - "name": "BlockDispatched", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "messageId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "messageHash", - "type": "bytes32" - } - ], - "name": "MessageDispatched", - "type": "event" - }, - { - "inputs": [], - "name": "HEADER_STORAGE", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "L1_CROSS_DOMAIN_MESSENGER", - "outputs": [ - { - "internalType": "contract ICrossDomainMessenger", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "PROVIDER", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "TARGET_CHAIN_ID", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "YAHO", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "blockNumbers", - "type": "uint256[]" - } - ], - "name": "dispatchBlocks", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "messageIds", - "type": "uint256[]" - }, - { - "internalType": "bytes32[]", - "name": "messageHashes", - "type": "bytes32[]" - } - ], - "name": "dispatchMessages", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "payable", - "type": "function" - } -] diff --git a/packages/reporter/src/ABIs/SygmaReporterContractABI.json b/packages/reporter/src/ABIs/SygmaReporterContractABI.json deleted file mode 100644 index a69d67e3..00000000 --- a/packages/reporter/src/ABIs/SygmaReporterContractABI.json +++ /dev/null @@ -1,425 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "address", - "name": "headerStorage", - "type": "address" - }, - { - "internalType": "address", - "name": "yaho", - "type": "address" - }, - { - "internalType": "address", - "name": "bridge", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "DomainIdNotAvailable", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "expectedYaho", - "type": "address" - } - ], - "name": "NotYaho", - "type": "error" - }, - { - "inputs": [], - "name": "ResourceIdNotAvailable", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "blockHeader", - "type": "bytes32" - } - ], - "name": "BlockDispatched", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "uint8", - "name": "domainId", - "type": "uint8" - } - ], - "name": "DomainIdSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "messageId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "messageHash", - "type": "bytes32" - } - ], - "name": "MessageDispatched", - "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": true, - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "resourceId", - "type": "bytes32" - } - ], - "name": "ResourceIdSet", - "type": "event" - }, - { - "inputs": [], - "name": "BRIDGE", - "outputs": [ - { - "internalType": "contract IBridge", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "HEADER_STORAGE", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "PROVIDER", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "YAHO", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "blockNumbers", - "type": "uint256[]" - } - ], - "name": "dispatchBlocks", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "messageIds", - "type": "uint256[]" - }, - { - "internalType": "bytes32[]", - "name": "messageHashes", - "type": "bytes32[]" - } - ], - "name": "dispatchMessages", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "domainIds", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256[]", - "name": "messageIds", - "type": "uint256[]" - }, - { - "internalType": "bytes32[]", - "name": "hashes", - "type": "bytes32[]" - } - ], - "name": "prepareDepositData", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "resourceIds", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "domainId", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "resourceId", - "type": "bytes32" - } - ], - "name": "setDomainIdAndResourceIdByChainId", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "input", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "position", - "type": "uint256" - } - ], - "name": "slice", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/packages/reporter/src/ABIs/TelepathyAdapterABI.json b/packages/reporter/src/ABIs/TelepathyAdapterABI.json deleted file mode 100644 index 83723f1e..00000000 --- a/packages/reporter/src/ABIs/TelepathyAdapterABI.json +++ /dev/null @@ -1,205 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "address", - "name": "_telepathyRouter", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "slot", - "type": "uint256" - } - ], - "name": "BlockHeaderNotAvailable", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "blockHash", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "storedBlockHash", - "type": "bytes32" - } - ], - "name": "ConflictingBlockHeader", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "lightClient", - "type": "address" - } - ], - "name": "InconsistentLightClient", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidBlockHashProof", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "length", - "type": "uint256" - } - ], - "name": "InvalidBlockHeaderLength", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidBlockHeaderRLP", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidBlockNumberProof", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint32", - "name": "chainId", - "type": "uint32" - } - ], - "name": "NoLightClientOnChain", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "id", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "hash", - "type": "bytes32" - } - ], - "name": "HashStored", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "domain", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "id", - "type": "uint256" - } - ], - "name": "getHash", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "internalType": "bytes[]", - "name": "blockHeaders", - "type": "bytes[]" - } - ], - "name": "proveAncestralBlockHashes", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint32", - "name": "_chainId", - "type": "uint32" - }, - { - "internalType": "uint64", - "name": "_slot", - "type": "uint64" - }, - { - "internalType": "uint256", - "name": "_blockNumber", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "_blockNumberProof", - "type": "bytes32[]" - }, - { - "internalType": "bytes32", - "name": "_blockHash", - "type": "bytes32" - }, - { - "internalType": "bytes32[]", - "name": "_blockHashProof", - "type": "bytes32[]" - } - ], - "name": "storeBlockHeader", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "telepathyRouter", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } -] diff --git a/packages/reporter/src/ABIs/TelepathyContractABI.json b/packages/reporter/src/ABIs/TelepathyContractABI.json deleted file mode 100644 index 082fc596..00000000 --- a/packages/reporter/src/ABIs/TelepathyContractABI.json +++ /dev/null @@ -1,497 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "bytes32", - "name": "genesisValidatorsRoot", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "genesisTime", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "secondsPerSlot", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "slotsPerPeriod", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "syncCommitteePeriod", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "syncCommitteePoseidon", - "type": "bytes32" - }, - { - "internalType": "uint32", - "name": "sourceChainId", - "type": "uint32" - }, - { - "internalType": "uint16", - "name": "finalityThreshold", - "type": "uint16" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "slot", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "root", - "type": "bytes32" - } - ], - "name": "HeadUpdate", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "period", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "root", - "type": "bytes32" - } - ], - "name": "SyncCommitteeUpdate", - "type": "event" - }, - { - "inputs": [], - "name": "FINALITY_THRESHOLD", - "outputs": [ - { - "internalType": "uint16", - "name": "", - "type": "uint16" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "GENESIS_TIME", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "GENESIS_VALIDATORS_ROOT", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "SECONDS_PER_SLOT", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "SLOTS_PER_PERIOD", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "SOURCE_CHAIN_ID", - "outputs": [ - { - "internalType": "uint32", - "name": "", - "type": "uint32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "consistent", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "executionStateRoots", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "head", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "headers", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "components": [ - { - "internalType": "uint256", - "name": "attestedSlot", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "finalizedSlot", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "participation", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "finalizedHeaderRoot", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "executionStateRoot", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "uint256[2]", - "name": "a", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2][2]", - "name": "b", - "type": "uint256[2][2]" - }, - { - "internalType": "uint256[2]", - "name": "c", - "type": "uint256[2]" - } - ], - "internalType": "struct Groth16Proof", - "name": "proof", - "type": "tuple" - } - ], - "internalType": "struct LightClientStep", - "name": "step", - "type": "tuple" - }, - { - "internalType": "bytes32", - "name": "syncCommitteeSSZ", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "syncCommitteePoseidon", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "uint256[2]", - "name": "a", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2][2]", - "name": "b", - "type": "uint256[2][2]" - }, - { - "internalType": "uint256[2]", - "name": "c", - "type": "uint256[2]" - } - ], - "internalType": "struct Groth16Proof", - "name": "proof", - "type": "tuple" - } - ], - "internalType": "struct LightClientRotate", - "name": "update", - "type": "tuple" - } - ], - "name": "rotate", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "attestedSlot", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "finalizedSlot", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "participation", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "finalizedHeaderRoot", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "executionStateRoot", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "uint256[2]", - "name": "a", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2][2]", - "name": "b", - "type": "uint256[2][2]" - }, - { - "internalType": "uint256[2]", - "name": "c", - "type": "uint256[2]" - } - ], - "internalType": "struct Groth16Proof", - "name": "proof", - "type": "tuple" - } - ], - "internalType": "struct LightClientStep", - "name": "update", - "type": "tuple" - } - ], - "name": "step", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "syncCommitteePoseidons", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "timestamps", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256[2]", - "name": "a", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2][2]", - "name": "b", - "type": "uint256[2][2]" - }, - { - "internalType": "uint256[2]", - "name": "c", - "type": "uint256[2]" - }, - { - "internalType": "uint256[65]", - "name": "input", - "type": "uint256[65]" - } - ], - "name": "verifyProofRotate", - "outputs": [ - { - "internalType": "bool", - "name": "r", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256[2]", - "name": "a", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2][2]", - "name": "b", - "type": "uint256[2][2]" - }, - { - "internalType": "uint256[2]", - "name": "c", - "type": "uint256[2]" - }, - { - "internalType": "uint256[1]", - "name": "input", - "type": "uint256[1]" - } - ], - "name": "verifyProofStep", - "outputs": [ - { - "internalType": "bool", - "name": "r", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } -] diff --git a/packages/reporter/src/controllers/ElectronReporterController.ts b/packages/reporter/src/controllers/ElectronReporterController.ts deleted file mode 100644 index cf429691..00000000 --- a/packages/reporter/src/controllers/ElectronReporterController.ts +++ /dev/null @@ -1,177 +0,0 @@ -import axios from "axios" -import { RLP } from "@ethereumjs/rlp" -import { bytesToHex } from "@ethereumjs/util" -import { Chain, encodeAbiParameters } from "viem" -import { Mutex } from "async-mutex" - -import { getReceiptsRootProof, getReceiptProof } from "../utils/proofs.js" -import HeaderStorageABI from "../ABIs/HeaderStorageABI.json" assert { type: "json" } -import AdapterContractABI from "../ABIs/ElectronAdapterABI.json" assert { type: "json" } -import ElectronLightClientABI from "../ABIs/ElectronLightClientABI.json" assert { type: "json" } -import BaseController from "./BaseController.js" -import { BaseControllerConfigs } from "./BaseController.js" -import sleep from "../utils/sleep.js" - -const EXPECTED_TOPIC = "0xf7df17dce0093aedfcbae24b4f04e823f9e863c97986ab1ba6c5267ace49ddea" //HeaderStored(uint256,bytes32) - -interface TelepathyReporterControllerConfigs extends BaseControllerConfigs { - headerStorageAddress: `0x${string}` - lightClientAddresses: { [chainName: string]: `0x${string}` } - beaconchaBaseUrl: string - beaconApiBaseUrl: string -} - -class ElectronReporterController extends BaseController { - headerStorageAddress: `0x${string}` - lastProcessedBlock: bigint - lightClientAddresses: { [chainName: string]: `0x${string}` } - private _mutex: Mutex - private _beaconchaBaseUrl: string - private _beaconApiBaseUrl: string - - constructor(_configs: TelepathyReporterControllerConfigs) { - super(_configs, "ElectronReporterController") - - this.headerStorageAddress = _configs.headerStorageAddress - this.lightClientAddresses = _configs.lightClientAddresses - this._beaconchaBaseUrl = _configs.beaconchaBaseUrl - this._beaconApiBaseUrl = _configs.beaconApiBaseUrl - this.lastProcessedBlock = 0n - this._mutex = new Mutex() - } - - async update() { - const release = await this._mutex.acquire() - try { - if (!this.headerStorageAddress || this.destinationChains?.length === 0) { - release() - return - } - - const sourceClient = this.multiClient.getClientByChain(this.sourceChain) - const blockNumber = await sourceClient.getBlockNumber() - - this.logger.info(`storing a block header for block ${blockNumber - 1n} on ${this.sourceChain.name} ...`) - const { request } = await sourceClient.simulateContract({ - address: this.headerStorageAddress as `0x${string}`, - abi: HeaderStorageABI, - functionName: "storeBlockHeader", - args: [blockNumber - 1n], - }) - - const hash = await sourceClient.writeContract(request) - this.logger.info( - `header reported from ${this.sourceChain.name} to ${ - this.destinationChains![0].name - }: ${hash} Waiting for the receipt ...`, - ) - const receipt = await sourceClient.waitForTransactionReceipt({ hash }) - - this.logger.info("Calculating receipt proof ...") - const { receiptProof, receiptsRoot } = await getReceiptProof(hash, sourceClient) - - this.logger.info("Getting log index ...") - const logIndex = receipt.logs.findIndex( - ({ address, topics }: { address: string; topics: string[] }) => - address.toLowerCase() === this.headerStorageAddress.toLowerCase() && topics[0] === EXPECTED_TOPIC, - ) - - this.logger.info("Getting transaction slot ...") - let transactionSlot - while (true) { - try { - this.logger.info("Waiting for finality ...") - const { - data: { data }, - } = await axios.get(`${this._beaconchaBaseUrl}/api/v1/execution/block/${receipt.blockNumber}`) - const [ - { - posConsensus: { slot, finalized }, - }, - ] = data - if (finalized) { - transactionSlot = slot - break - } - await sleep(10000) - } catch (_err) { - await sleep(10000) - } - } - - const proof = { - lcSlotTxSlotPack: "0x" as `0x${string}`, - logIndex: BigInt(logIndex), - receiptProof: receiptProof.map((_el) => bytesToHex(_el)) as `0x${string}`[], - receiptsRoot, - receiptsRootProof: [] as string[], - txIndexRLP: ("0x" + Buffer.from(RLP.encode(receipt.transactionIndex)).toString("hex")) as `0x${string}`, - } - - for (const chain of this.destinationChains as Chain[]) { - const destinationClient = this.multiClient.getClientByChain(chain) - const lightClientSlot: bigint = (await destinationClient.readContract({ - address: this.lightClientAddresses[chain.name], - abi: ElectronLightClientABI, - functionName: "head", - args: [], - })) as bigint - - // TODO: check that head is greater than transactionSlot - - proof.lcSlotTxSlotPack = encodeAbiParameters( - [{ type: "uint64" }, { type: "uint64" }], - [lightClientSlot, transactionSlot], - ) - - this.logger.info("Calculating receipts root proof ...") - const { receiptsRootProof } = await getReceiptsRootProof( - Number(lightClientSlot), - Number(transactionSlot), - axios.create({ - baseURL: this._beaconApiBaseUrl, - responseType: "json", - headers: { "Content-Type": "application/json" }, - }), - ) - proof.receiptsRootProof = receiptsRootProof - - const encodedProof = encodeAbiParameters( - [ - { type: "bytes" }, - { type: "bytes32[]" }, - { type: "bytes32" }, - { type: "bytes[]" }, - { type: "bytes" }, - { type: "uint256" }, - ], - [ - proof.lcSlotTxSlotPack, - proof.receiptsRootProof as `0x${string}`[], - proof.receiptsRoot, - proof.receiptProof, - proof.txIndexRLP, - proof.logIndex, - ], - ) - - this.logger.info(`Storing block header for ${blockNumber} on contract ${chain.name} ...`) - const { request } = await destinationClient.simulateContract({ - address: this.adapterAddresses[chain.name], - abi: AdapterContractABI, - functionName: "storeHash", - args: [encodedProof], - }) - const txHash = await destinationClient.writeContract(request) - this.logger.info(`tx sent on ${chain.name}: ${txHash}`) - } - this.lastProcessedBlock = blockNumber - } catch (_error) { - this.logger.error(_error) - } finally { - release() - } - } -} - -export default ElectronReporterController diff --git a/packages/reporter/src/controllers/OptimismReporterController.ts b/packages/reporter/src/controllers/OptimismReporterController.ts deleted file mode 100644 index 8ac1c9e8..00000000 --- a/packages/reporter/src/controllers/OptimismReporterController.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { optimism } from "viem/chains" - -import ABI from "../ABIs/L1CrossDomainMessengerHeaderReporterABI.json" assert { type: "json" } -import BaseController from "./BaseController.js" - -import { BaseControllerConfigs } from "./BaseController.js" - -interface OptimismReporterControllerConfigs extends BaseControllerConfigs {} - -class OptimismReporterController extends BaseController { - constructor(_configs: OptimismReporterControllerConfigs) { - super(_configs, "OptimismReporterController") - } - - async onBlocks(_blockNumbers: bigint[]) { - try { - const client = this.multiClient.getClientByChain(this.sourceChain) - const blockNumber = _blockNumbers[_blockNumbers.length - 1] - - this.logger.info(`reporting block header for block ${blockNumber} on ${optimism.name} ...`) - const { request } = await client.simulateContract({ - address: this.reporterAddress as `0x${string}`, - abi: ABI, - functionName: "reportHeaders", - args: [[blockNumber], this.adapterAddresses[optimism.name]], - gas: 300000n, // NOTE: if we don't put the gas here, the tx fails because of out of gas - }) - - const txHash = await client.writeContract(request) - this.logger.info(`headers reporter from ${this.sourceChain.name} to ${optimism.name}: ${txHash}`) - } catch (_error) { - this.logger.error(_error) - } - } -} - -export default OptimismReporterController diff --git a/packages/reporter/src/controllers/TelepathyReporterController.ts b/packages/reporter/src/controllers/TelepathyReporterController.ts deleted file mode 100644 index a7032fc0..00000000 --- a/packages/reporter/src/controllers/TelepathyReporterController.ts +++ /dev/null @@ -1,92 +0,0 @@ -import axios from "axios" -import { Chain, hexToNumber } from "viem" -import { Mutex } from "async-mutex" - -import LightClientContractABI from "../ABIs/TelepathyContractABI.json" assert { type: "json" } -import AdapterContractABI from "../ABIs/TelepathyAdapterABI.json" assert { type: "json" } -import BaseController from "./BaseController.js" - -import { BaseControllerConfigs } from "./BaseController.js" - -// TODO: Update to comply with Hashi v0.2.0 -interface TelepathyReporterControllerConfigs extends BaseControllerConfigs { - lightClientAddresses: { [chainName: string]: `0x${string}` } - baseProofUrl: string -} - -class TelepathyReporterController extends BaseController { - lastProcessedBlock: bigint - lightClientAddresses: { [chainName: string]: `0x${string}` } - private _baseProofUrl: string - - constructor(_configs: TelepathyReporterControllerConfigs) { - super(_configs, "TelepathyReporterController") - - this.lightClientAddresses = _configs.lightClientAddresses - this._baseProofUrl = _configs.baseProofUrl - - this.lastProcessedBlock = 0n - } - - async update() { - try { - let mutex = new Mutex() - for (const chain of this.destinationChains as Chain[]) { - const client = this.multiClient.getClientByChain(chain) - - const currentBlockNumber = await client.getBlockNumber() - const fromBlock = this.lastProcessedBlock === 0n ? currentBlockNumber : this.lastProcessedBlock + 1n - const toBlock = currentBlockNumber - this.logger.info( - `getting HeadUpdate events in [${fromBlock},${toBlock}] on ${chain.name} , on contract ${ - this.lightClientAddresses[chain.name] - }...`, - ) - - const logs = await client.getContractEvents({ - address: this.lightClientAddresses[chain.name] as `0x${string}`, - abi: LightClientContractABI, - eventName: "HeadUpdate", - fromBlock, - toBlock, - }) - - if (logs.length == 0) { - this.logger.info("No HeadUpdate events. Skipping ...") - this.lastProcessedBlock = toBlock - continue - } - - this.logger.info(`detected ${logs.length} HeadUpdate events. Processing them ...`) - logs.forEach(async (_log: any) => { - const slotValue = _log.topics[1] - this.logger.info(`fetching proof for slot ${slotValue} on ${chain.name} ...`) - - const response = await axios.post(`${this._baseProofUrl}${this.sourceChain.id}/${hexToNumber(slotValue!)}`) - const { chainId, slot, blockNumber, blockNumberProof, blockHash, blockHashProof } = response.data.result - this.logger.info( - `calling storeBlockHeader for block number ${blockNumber} on contract ${ - this.adapterAddresses[chain.name] - } ...`, - ) - - const { request } = await client.simulateContract({ - address: this.adapterAddresses[chain.name] as `0x${string}`, - abi: AdapterContractABI, - functionName: "storeBlockHeader", - args: [chainId, slot, blockNumber, blockNumberProof, blockHash, blockHashProof], - }) - const release = await mutex.acquire() - const txHash = await client.writeContract(request) - this.logger.info(`tx sent on ${chain.name}: ${txHash}`) - release() - }) - this.lastProcessedBlock = toBlock - } - } catch (_error) { - this.logger.error(_error) - } - } -} - -export default TelepathyReporterController diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 3c0e1be8..0cdc7b67 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -18,10 +18,7 @@ import { import { Chain } from "viem" import Multiclient from "./MultiClient.js" -import ElectronReporterController from "./controllers/ElectronReporterController.js" -import OptimismReporterController from "./controllers/OptimismReporterController.js" import StandardReporterController from "./controllers/StandardReporterController.js" -import TelepathyReporterController from "./controllers/TelepathyReporterController.js" import WormholeReporterController from "./controllers/WormholeReporterController.js" import Coordinator from "./Coordinator.js" @@ -93,29 +90,6 @@ const main = () => { }, }) - const telepathyReporterController = new TelepathyReporterController({ - type: "lightClient", - sourceChain, - destinationChains, - logger, - multiClient, - adapterAddresses: { - [gnosis.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.Gnosis?.TelepathyAdapter, - [arbitrum.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.["Arbitrum One"]?.TelepathyAdapter, - [optimism.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.["OP Mainnet"]?.TelepathyAdapter, - [bsc.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.["BNB Smart Chain"]?.TelepathyAdapter, - [polygon.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.Polygon?.TelepathyAdapter, - }, - baseProofUrl: settings.reporterControllers.TelepathyReporterController.baseProofUrl, - lightClientAddresses: { - [gnosis.name]: lightClientAddresses.Gnosis?.[sourceChain.name]?.TelepathyLightClient, - [arbitrum.name]: lightClientAddresses["Arbitrum One"]?.[sourceChain.name]?.TelepathyLightClient, - [optimism.name]: lightClientAddresses["OP Mainnet"]?.[sourceChain.name]?.TelepathyLightClient, - [bsc.name]: lightClientAddresses["BNB Smart Chain"]?.[sourceChain.name]?.TelepathyLightClient, - [polygon.name]: lightClientAddresses.Polygon?.[sourceChain.name]?.TelepathyLightClient, - }, - }) - const wormholeReporterController = new WormholeReporterController({ type: "classic", sourceChain, @@ -136,21 +110,6 @@ const main = () => { wormholeChainIds: settings.reporterControllers.WormholeReporterController.wormholeChainIds, }) - // TODO: add check to prevent to always run OptimismReporterController even when destinationChains does not include optimism - const optimismReporterController = new OptimismReporterController({ - type: "native", - sourceChain, - logger, - multiClient, - reporterAddress: - settings.contractAddresses.reporterAddresses.unidirectional.Ethereum["OP Mainnet"] - .L1CrossDomainMessengerHeaderReporter, - adapterAddresses: { - [optimism.name]: - settings.contractAddresses.adapterAddresses.unidirectional.Ethereum["OP Mainnet"].L2CrossDomainMessengerAdapter, - }, - }) - const axelarReporterController = new StandardReporterController({ name: "AxelarReporterController", type: "classic", @@ -278,40 +237,18 @@ const main = () => { reportHeadersValue: settings.reporterControllers.ZetaReporterController.reportHeadersValue, }) - const electronReporterController = new ElectronReporterController({ - type: "lightClient", - sourceChain, - destinationChains, - logger, - multiClient, - adapterAddresses: { - [gnosisChiado.name]: unidirectionalAdaptersAddresses[sourceChain.name]?.["Gnosis Chiado"]?.ElectronAdapter, - }, - headerStorageAddress: (settings.contractAddresses as any)[sourceChain.name]?.HeaderStorage, - lightClientAddresses: { - [gnosisChiado.name]: lightClientAddresses["Gnosis Chiado"]?.[sourceChain.name]?.ElectronLightClient, - }, - beaconchaBaseUrl: (settings.reporterControllers.ElectronReporterController.beaconchaBaseUrls as any)[ - sourceChain.name - ], - beaconApiBaseUrl: (settings.beaconApiUrls as any)[sourceChain.name], - }) - const coordinator = new Coordinator({ controllers: [ ambReporterController, ccipReporterController, sygmaReporterController, - telepathyReporterController, wormholeReporterController, - optimismReporterController, axelarReporterController, connextReporterController, celerReporterController, layerZeroReporterController, hyperlaneReporterController, zetaReporterController, - electronReporterController, ].filter((_controller) => controllersEnabled?.includes(_controller.name)), intervalFetchBlocksMs: settings.Coordinator.intervalFetchBlocksMs, logger, From 56bb792a258aa2eaff7141b51e7d3bc5e21f8a95 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Thu, 19 Sep 2024 17:15:43 +0800 Subject: [PATCH 264/297] fix(reporter): wormhole reporter ABI file name --- .../ABIs/{WormhomeReporterABI.json => WormholeReporterABI.json} | 0 packages/reporter/src/controllers/WormholeReporterController.ts | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename packages/reporter/src/ABIs/{WormhomeReporterABI.json => WormholeReporterABI.json} (100%) diff --git a/packages/reporter/src/ABIs/WormhomeReporterABI.json b/packages/reporter/src/ABIs/WormholeReporterABI.json similarity index 100% rename from packages/reporter/src/ABIs/WormhomeReporterABI.json rename to packages/reporter/src/ABIs/WormholeReporterABI.json diff --git a/packages/reporter/src/controllers/WormholeReporterController.ts b/packages/reporter/src/controllers/WormholeReporterController.ts index a0553eb1..5bbff0ba 100644 --- a/packages/reporter/src/controllers/WormholeReporterController.ts +++ b/packages/reporter/src/controllers/WormholeReporterController.ts @@ -4,7 +4,7 @@ import { Chain } from "viem" import BaseController from "./BaseController.js" import sleep from "../utils/sleep.js" -import ReporterABI from "../ABIs/WormhomeReporterABI.json" assert { type: "json" } +import ReporterABI from "../ABIs/WormholeReporterABI.json" assert { type: "json" } import AdapterABI from "../ABIs/WormholeAdapterABI.json" assert { type: "json" } import WormholeABI from "../ABIs/WormholeABI.json" assert { type: "json" } From a90cde0ec4b3ddfe38e70041d3405243b2a70a85 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Thu, 19 Sep 2024 17:56:39 +0800 Subject: [PATCH 265/297] chore(reporter): remove yarn.lock --- packages/reporter/yarn.lock | 3562 ----------------------------------- 1 file changed, 3562 deletions(-) delete mode 100644 packages/reporter/yarn.lock diff --git a/packages/reporter/yarn.lock b/packages/reporter/yarn.lock deleted file mode 100644 index 17edb509..00000000 --- a/packages/reporter/yarn.lock +++ /dev/null @@ -1,3562 +0,0 @@ -# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! - -__metadata: - version: 6 - cacheKey: 8 - -"@aashutoshrathi/word-wrap@npm:^1.2.3": - version: 1.2.6 - resolution: "@aashutoshrathi/word-wrap@npm:1.2.6" - checksum: ada901b9e7c680d190f1d012c84217ce0063d8f5c5a7725bb91ec3c5ed99bb7572680eb2d2938a531ccbaec39a95422fcd8a6b4a13110c7d98dd75402f66a0cd - languageName: node - linkType: hard - -"@adraffy/ens-normalize@npm:1.10.0": - version: 1.10.0 - resolution: "@adraffy/ens-normalize@npm:1.10.0" - checksum: af0540f963a2632da2bbc37e36ea6593dcfc607b937857133791781e246d47f870d5e3d21fa70d5cfe94e772c284588c81ea3f5b7f4ea8fbb824369444e4dbcb - languageName: node - linkType: hard - -"@adraffy/ens-normalize@npm:1.9.4": - version: 1.9.4 - resolution: "@adraffy/ens-normalize@npm:1.9.4" - checksum: 7d7fff58ebe2c4961f7e5e61dad123aa6a63fec0df5c84af1fa41079dc05d398599690be4427b3a94d2baa94084544bcfdf2d51cbed7504b9b0583b0960ad550 - languageName: node - linkType: hard - -"@chainsafe/as-sha256@npm:^0.4.1": - version: 0.4.1 - resolution: "@chainsafe/as-sha256@npm:0.4.1" - checksum: 6d86975e648ecdafd366802278ac15b392b252e967f3681412ec48b5a3518b936cc5e977517499882b084991446d25787d98f8f585891943688cc81549a44e9a - languageName: node - linkType: hard - -"@chainsafe/persistent-merkle-tree@npm:^0.6.1": - version: 0.6.1 - resolution: "@chainsafe/persistent-merkle-tree@npm:0.6.1" - dependencies: - "@chainsafe/as-sha256": ^0.4.1 - "@noble/hashes": ^1.3.0 - checksum: 74614b8d40970dc930d5bf741619498b0bbbde5ff24ce45fce6ad122143aa77bf57249a28175b1b972cf56bff57d529a4258b7222ab4e60c1261119b5986c51b - languageName: node - linkType: hard - -"@chainsafe/ssz@npm:^0.14.0": - version: 0.14.0 - resolution: "@chainsafe/ssz@npm:0.14.0" - dependencies: - "@chainsafe/as-sha256": ^0.4.1 - "@chainsafe/persistent-merkle-tree": ^0.6.1 - checksum: fffec7b8966edb24a146b3c4ada23c9d9b2159c60327eaba2174c7175355f8c750646816a187b439da861fc3cdad5e93a9c0387c1758a3e97d7b4d79a36480c9 - languageName: node - linkType: hard - -"@colors/colors@npm:1.6.0, @colors/colors@npm:^1.6.0": - version: 1.6.0 - resolution: "@colors/colors@npm:1.6.0" - checksum: aa209963e0c3218e80a4a20553ba8c0fbb6fa13140540b4e5f97923790be06801fc90172c1114fc8b7e888b3d012b67298cde6b9e81521361becfaee400c662f - languageName: node - linkType: hard - -"@cspotcode/source-map-support@npm:^0.8.0": - version: 0.8.1 - resolution: "@cspotcode/source-map-support@npm:0.8.1" - dependencies: - "@jridgewell/trace-mapping": 0.3.9 - checksum: 5718f267085ed8edb3e7ef210137241775e607ee18b77d95aa5bd7514f47f5019aa2d82d96b3bf342ef7aa890a346fa1044532ff7cc3009e7d24fce3ce6200fa - languageName: node - linkType: hard - -"@dabh/diagnostics@npm:^2.0.2": - version: 2.0.3 - resolution: "@dabh/diagnostics@npm:2.0.3" - dependencies: - colorspace: 1.1.x - enabled: 2.0.x - kuler: ^2.0.0 - checksum: 4879600c55c8315a0fb85fbb19057bad1adc08f0a080a8cb4e2b63f723c379bfc4283b68123a2b078d367b327dd8df12fcb27464efe791addc0a48b9df6d79a1 - languageName: node - linkType: hard - -"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": - version: 4.4.0 - resolution: "@eslint-community/eslint-utils@npm:4.4.0" - dependencies: - eslint-visitor-keys: ^3.3.0 - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: cdfe3ae42b4f572cbfb46d20edafe6f36fc5fb52bf2d90875c58aefe226892b9677fef60820e2832caf864a326fe4fc225714c46e8389ccca04d5f9288aabd22 - languageName: node - linkType: hard - -"@eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": - version: 4.10.0 - resolution: "@eslint-community/regexpp@npm:4.10.0" - checksum: 2a6e345429ea8382aaaf3a61f865cae16ed44d31ca917910033c02dc00d505d939f10b81e079fa14d43b51499c640138e153b7e40743c4c094d9df97d4e56f7b - languageName: node - linkType: hard - -"@eslint/eslintrc@npm:^2.1.2": - version: 2.1.2 - resolution: "@eslint/eslintrc@npm:2.1.2" - 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 - checksum: bc742a1e3b361f06fedb4afb6bf32cbd27171292ef7924f61c62f2aed73048367bcc7ac68f98c06d4245cd3fabc43270f844e3c1699936d4734b3ac5398814a7 - languageName: node - linkType: hard - -"@eslint/js@npm:8.52.0": - version: 8.52.0 - resolution: "@eslint/js@npm:8.52.0" - checksum: 490893b8091a66415f4ac98b963d23eb287264ea3bd6af7ec788f0570705cf64fd6ab84b717785980f55e39d08ff5c7fde6d8e4391ccb507169370ce3a6d091a - languageName: node - linkType: hard - -"@ethereumjs/block@npm:^5.0.1": - version: 5.0.1 - resolution: "@ethereumjs/block@npm:5.0.1" - dependencies: - "@ethereumjs/common": ^4.1.0 - "@ethereumjs/rlp": ^5.0.1 - "@ethereumjs/trie": ^6.0.1 - "@ethereumjs/tx": ^5.1.0 - "@ethereumjs/util": ^9.0.1 - ethereum-cryptography: ^2.1.2 - checksum: 6bee1189bf097b8a7ea328cdef50ffce352698f4bac4e594b0d721ee715626947e3863e7a546a55ec88547dd50c57447ecbb44b4e0fee746290745ac081566c0 - languageName: node - linkType: hard - -"@ethereumjs/blockchain@npm:^7.0.1": - version: 7.0.1 - resolution: "@ethereumjs/blockchain@npm:7.0.1" - dependencies: - "@ethereumjs/block": ^5.0.1 - "@ethereumjs/common": ^4.1.0 - "@ethereumjs/ethash": ^3.0.1 - "@ethereumjs/rlp": ^5.0.1 - "@ethereumjs/trie": ^6.0.1 - "@ethereumjs/tx": ^5.1.0 - "@ethereumjs/util": ^9.0.1 - debug: ^4.3.3 - ethereum-cryptography: ^2.1.2 - lru-cache: ^10.0.0 - checksum: 54c3019f66528e8549aa48ebe9e700017551c74491cd168353a43af25493e2cddd6f995575bfbcedb31f4b3a55f76f76c5393687495851b57a2024edad01ffa4 - languageName: node - linkType: hard - -"@ethereumjs/common@npm:^4.1.0": - version: 4.1.0 - resolution: "@ethereumjs/common@npm:4.1.0" - dependencies: - "@ethereumjs/util": ^9.0.1 - crc: ^4.3.2 - checksum: 8494e6d179fe3949d8d8285badfb7be9ade71864e477da5dbf432ecc8046a58a0db73e99b5543c807fdc1b3f5959ed9c85ba99536b2f4753e08eaeb096af4beb - languageName: node - linkType: hard - -"@ethereumjs/ethash@npm:^3.0.1": - version: 3.0.1 - resolution: "@ethereumjs/ethash@npm:3.0.1" - dependencies: - "@ethereumjs/block": ^5.0.1 - "@ethereumjs/rlp": ^5.0.1 - "@ethereumjs/util": ^9.0.1 - bigint-crypto-utils: ^3.2.2 - ethereum-cryptography: ^2.1.2 - checksum: 9d613e1bb3c58a4f33b99588cdeeae79c4481f4a368e98bbbf8249883fdc0f66806b7644b4e4420b096711da859982ca5764a9076df3f767f5e73cc291ca81c5 - languageName: node - linkType: hard - -"@ethereumjs/evm@npm:^2.1.0": - version: 2.1.0 - resolution: "@ethereumjs/evm@npm:2.1.0" - dependencies: - "@ethereumjs/common": ^4.1.0 - "@ethereumjs/statemanager": ^2.1.0 - "@ethereumjs/tx": ^5.1.0 - "@ethereumjs/util": ^9.0.1 - "@types/debug": ^4.1.9 - debug: ^4.3.3 - ethereum-cryptography: ^2.1.2 - rustbn-wasm: ^0.2.0 - checksum: 27561150def4e23d91ed6443e0354a7d93f6e94aaefc60fb34016f71e49806012425e3b2b8b76eeef40fc5a1b2b95438e3d7827b8b1b4c8af3766af28877fdf1 - languageName: node - linkType: hard - -"@ethereumjs/rlp@npm:^5.0.1": - version: 5.0.1 - resolution: "@ethereumjs/rlp@npm:5.0.1" - bin: - rlp: bin/rlp.cjs - checksum: eddff08718c3b8312007ef51a951dff6b2c1152f9f9ea6fb9eec65d50caf3fa53f5894d79d6d450eef70a5ef3b0688be044912096aa8d263345a0d9debb4d477 - languageName: node - linkType: hard - -"@ethereumjs/statemanager@npm:^2.1.0": - version: 2.1.0 - resolution: "@ethereumjs/statemanager@npm:2.1.0" - dependencies: - "@ethereumjs/common": ^4.1.0 - "@ethereumjs/rlp": ^5.0.1 - "@ethereumjs/trie": ^6.0.1 - "@ethereumjs/util": ^9.0.1 - debug: ^4.3.3 - ethereum-cryptography: ^2.1.2 - ethers: ^6.4.0 - js-sdsl: ^4.1.4 - lru-cache: ^10.0.0 - checksum: 07e1b5b9d00851328c2ebf12df3ea0440012b9fcdcb8ce3f5301c74dd71d6192cdee197c2c040b11a6e95b466f255f532c4dc337f95585eaadc0e3919245190c - languageName: node - linkType: hard - -"@ethereumjs/trie@npm:^6.0.1": - version: 6.0.1 - resolution: "@ethereumjs/trie@npm:6.0.1" - dependencies: - "@ethereumjs/rlp": ^5.0.1 - "@ethereumjs/util": ^9.0.1 - "@types/readable-stream": ^2.3.13 - ethereum-cryptography: ^2.1.2 - lru-cache: ^10.0.0 - readable-stream: ^3.6.0 - checksum: 6773fc54f2dbdab2afa230cd9ebca16a14f774c7bc5c51c2ee0d51cd6a14cabbceac87a3d1100adf5b8e19a28c7ac4056f1879274a6ec5c22c3f40e2068e060d - languageName: node - linkType: hard - -"@ethereumjs/tx@npm:^5.1.0": - version: 5.1.0 - resolution: "@ethereumjs/tx@npm:5.1.0" - dependencies: - "@ethereumjs/common": ^4.1.0 - "@ethereumjs/rlp": ^5.0.1 - "@ethereumjs/util": ^9.0.1 - ethereum-cryptography: ^2.1.2 - peerDependencies: - c-kzg: ^2.1.2 - peerDependenciesMeta: - c-kzg: - optional: true - checksum: fd17b337f7a64a6a29b1d279c52ac5bfb9655cda06858b198b85a306cc978d25b871acc4ec57e0c29bab50a7c9600d934837fb62052cbde7dc88223be7ebc740 - languageName: node - linkType: hard - -"@ethereumjs/util@npm:^9.0.1": - version: 9.0.1 - resolution: "@ethereumjs/util@npm:9.0.1" - dependencies: - "@ethereumjs/rlp": ^5.0.1 - ethereum-cryptography: ^2.1.2 - peerDependencies: - c-kzg: ^2.1.2 - peerDependenciesMeta: - c-kzg: - optional: true - checksum: 3569dcc0106f5e962e62811be66b5f49529c9d1a29671908568528b2b45d6cae03cb497fc755a1ae4144170f749133308494be42255ac98b61c930d143ed26f4 - languageName: node - linkType: hard - -"@ethereumjs/vm@npm:^7.1.0": - version: 7.1.0 - resolution: "@ethereumjs/vm@npm:7.1.0" - dependencies: - "@ethereumjs/block": ^5.0.1 - "@ethereumjs/blockchain": ^7.0.1 - "@ethereumjs/common": ^4.1.0 - "@ethereumjs/evm": ^2.1.0 - "@ethereumjs/rlp": ^5.0.1 - "@ethereumjs/statemanager": ^2.1.0 - "@ethereumjs/trie": ^6.0.1 - "@ethereumjs/tx": ^5.1.0 - "@ethereumjs/util": ^9.0.1 - debug: ^4.3.3 - ethereum-cryptography: ^2.1.2 - checksum: 03ef823f33b92057b64884a9c96893517d3bc24c6fae1251373c2247be48cdc05b4d88c5fdbd23701944af185c13c751c1b7aa430dabfc32b1cc08a135dfc9d2 - languageName: node - linkType: hard - -"@humanwhocodes/config-array@npm:^0.11.13": - version: 0.11.13 - resolution: "@humanwhocodes/config-array@npm:0.11.13" - dependencies: - "@humanwhocodes/object-schema": ^2.0.1 - debug: ^4.1.1 - minimatch: ^3.0.5 - checksum: f8ea57b0d7ed7f2d64cd3944654976829d9da91c04d9c860e18804729a33f7681f78166ef4c761850b8c324d362f7d53f14c5c44907a6b38b32c703ff85e4805 - languageName: node - linkType: hard - -"@humanwhocodes/module-importer@npm:^1.0.1": - version: 1.0.1 - resolution: "@humanwhocodes/module-importer@npm:1.0.1" - checksum: 0fd22007db8034a2cdf2c764b140d37d9020bbfce8a49d3ec5c05290e77d4b0263b1b972b752df8c89e5eaa94073408f2b7d977aed131faf6cf396ebb5d7fb61 - languageName: node - linkType: hard - -"@humanwhocodes/object-schema@npm:^2.0.1": - version: 2.0.1 - resolution: "@humanwhocodes/object-schema@npm:2.0.1" - checksum: 24929487b1ed48795d2f08346a0116cc5ee4634848bce64161fb947109352c562310fd159fc64dda0e8b853307f5794605191a9547f7341158559ca3c8262a45 - languageName: node - linkType: hard - -"@isaacs/cliui@npm:^8.0.2": - version: 8.0.2 - resolution: "@isaacs/cliui@npm:8.0.2" - dependencies: - string-width: ^5.1.2 - string-width-cjs: "npm:string-width@^4.2.0" - strip-ansi: ^7.0.1 - strip-ansi-cjs: "npm:strip-ansi@^6.0.1" - wrap-ansi: ^8.1.0 - wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" - checksum: 4a473b9b32a7d4d3cfb7a614226e555091ff0c5a29a1734c28c72a182c2f6699b26fc6b5c2131dfd841e86b185aea714c72201d7c98c2fba5f17709333a67aeb - languageName: node - linkType: hard - -"@jridgewell/resolve-uri@npm:^3.0.3": - version: 3.1.1 - resolution: "@jridgewell/resolve-uri@npm:3.1.1" - checksum: f5b441fe7900eab4f9155b3b93f9800a916257f4e8563afbcd3b5a5337b55e52bd8ae6735453b1b745457d9f6cdb16d74cd6220bbdd98cf153239e13f6cbb653 - languageName: node - linkType: hard - -"@jridgewell/sourcemap-codec@npm:^1.4.10": - version: 1.4.15 - resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" - checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:0.3.9": - version: 0.3.9 - resolution: "@jridgewell/trace-mapping@npm:0.3.9" - dependencies: - "@jridgewell/resolve-uri": ^3.0.3 - "@jridgewell/sourcemap-codec": ^1.4.10 - checksum: d89597752fd88d3f3480845691a05a44bd21faac18e2185b6f436c3b0fd0c5a859fbbd9aaa92050c4052caf325ad3e10e2e1d1b64327517471b7d51babc0ddef - languageName: node - linkType: hard - -"@lodestar/params@npm:^1.12.0": - version: 1.12.0 - resolution: "@lodestar/params@npm:1.12.0" - checksum: 572a75b14163b0b742f7e75692e995b1cd4b01420e9a59305d124b941660185bf70315779f62a135ddc17ed7db7109a5a564588187c3ebe3fbbee0107a7c2ea8 - languageName: node - linkType: hard - -"@lodestar/types@npm:^1.12.0": - version: 1.12.0 - resolution: "@lodestar/types@npm:1.12.0" - dependencies: - "@chainsafe/ssz": ^0.14.0 - "@lodestar/params": ^1.12.0 - checksum: ebba20b637ae4ace22ffacadf2b0a7c0dd72701354042ff7508630f82657942672c6247899ecbe618cc4cc74af6dd2b6e87b0aff18735698a591e21f5f819761 - languageName: node - linkType: hard - -"@noble/curves@npm:1.1.0, @noble/curves@npm:~1.1.0": - version: 1.1.0 - resolution: "@noble/curves@npm:1.1.0" - dependencies: - "@noble/hashes": 1.3.1 - checksum: 2658cdd3f84f71079b4e3516c47559d22cf4b55c23ac8ee9d2b1f8e5b72916d9689e59820e0f9d9cb4a46a8423af5b56dc6bb7782405c88be06a015180508db5 - languageName: node - linkType: hard - -"@noble/curves@npm:1.2.0, @noble/curves@npm:~1.2.0": - version: 1.2.0 - resolution: "@noble/curves@npm:1.2.0" - dependencies: - "@noble/hashes": 1.3.2 - checksum: bb798d7a66d8e43789e93bc3c2ddff91a1e19fdb79a99b86cd98f1e5eff0ee2024a2672902c2576ef3577b6f282f3b5c778bebd55761ddbb30e36bf275e83dd0 - languageName: node - linkType: hard - -"@noble/hashes@npm:1.3.1": - version: 1.3.1 - resolution: "@noble/hashes@npm:1.3.1" - checksum: 7fdefc0f7a0c1ec27acc6ff88841793e3f93ec4ce6b8a6a12bfc0dd70ae6b7c4c82fe305fdfeda1735d5ad4a9eebe761e6693b3d355689c559e91242f4bc95b1 - languageName: node - linkType: hard - -"@noble/hashes@npm:1.3.2, @noble/hashes@npm:^1.3.0, @noble/hashes@npm:~1.3.0, @noble/hashes@npm:~1.3.1, @noble/hashes@npm:~1.3.2": - version: 1.3.2 - resolution: "@noble/hashes@npm:1.3.2" - checksum: fe23536b436539d13f90e4b9be843cc63b1b17666a07634a2b1259dded6f490be3d050249e6af98076ea8f2ea0d56f578773c2197f2aa0eeaa5fba5bc18ba474 - languageName: node - linkType: hard - -"@nodelib/fs.scandir@npm:2.1.5": - version: 2.1.5 - resolution: "@nodelib/fs.scandir@npm:2.1.5" - dependencies: - "@nodelib/fs.stat": 2.0.5 - run-parallel: ^1.1.9 - checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59 - languageName: node - linkType: hard - -"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": - version: 2.0.5 - resolution: "@nodelib/fs.stat@npm:2.0.5" - checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 - languageName: node - linkType: hard - -"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": - version: 1.2.8 - resolution: "@nodelib/fs.walk@npm:1.2.8" - dependencies: - "@nodelib/fs.scandir": 2.1.5 - fastq: ^1.6.0 - checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53 - languageName: node - linkType: hard - -"@npmcli/fs@npm:^3.1.0": - version: 3.1.0 - resolution: "@npmcli/fs@npm:3.1.0" - dependencies: - semver: ^7.3.5 - checksum: a50a6818de5fc557d0b0e6f50ec780a7a02ab8ad07e5ac8b16bf519e0ad60a144ac64f97d05c443c3367235d337182e1d012bbac0eb8dbae8dc7b40b193efd0e - languageName: node - linkType: hard - -"@pkgjs/parseargs@npm:^0.11.0": - version: 0.11.0 - resolution: "@pkgjs/parseargs@npm:0.11.0" - checksum: 6ad6a00fc4f2f2cfc6bff76fb1d88b8ee20bc0601e18ebb01b6d4be583733a860239a521a7fbca73b612e66705078809483549d2b18f370eb346c5155c8e4a0f - languageName: node - linkType: hard - -"@scure/base@npm:^1.1.1, @scure/base@npm:~1.1.0, @scure/base@npm:~1.1.2": - version: 1.1.3 - resolution: "@scure/base@npm:1.1.3" - checksum: 1606ab8a4db898cb3a1ada16c15437c3bce4e25854fadc8eb03ae93cbbbac1ed90655af4b0be3da37e12056fef11c0374499f69b9e658c9e5b7b3e06353c630c - languageName: node - linkType: hard - -"@scure/bip32@npm:1.3.1": - version: 1.3.1 - resolution: "@scure/bip32@npm:1.3.1" - dependencies: - "@noble/curves": ~1.1.0 - "@noble/hashes": ~1.3.1 - "@scure/base": ~1.1.0 - checksum: 394d65f77a40651eba21a5096da0f4233c3b50d422864751d373fcf142eeedb94a1149f9ab1dbb078086dab2d0bc27e2b1afec8321bf22d4403c7df2fea5bfe2 - languageName: node - linkType: hard - -"@scure/bip32@npm:1.3.2": - version: 1.3.2 - resolution: "@scure/bip32@npm:1.3.2" - dependencies: - "@noble/curves": ~1.2.0 - "@noble/hashes": ~1.3.2 - "@scure/base": ~1.1.2 - checksum: c5ae84fae43490853693b481531132b89e056d45c945fc8b92b9d032577f753dfd79c5a7bbcbf0a7f035951006ff0311b6cf7a389e26c9ec6335e42b20c53157 - languageName: node - linkType: hard - -"@scure/bip39@npm:1.2.1": - version: 1.2.1 - resolution: "@scure/bip39@npm:1.2.1" - dependencies: - "@noble/hashes": ~1.3.0 - "@scure/base": ~1.1.0 - checksum: c5bd6f1328fdbeae2dcdd891825b1610225310e5e62a4942714db51066866e4f7bef242c7b06a1b9dcc8043a4a13412cf5c5df76d3b10aa9e36b82e9b6e3eeaa - languageName: node - linkType: hard - -"@tootallnate/once@npm:2": - version: 2.0.0 - resolution: "@tootallnate/once@npm:2.0.0" - checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 - languageName: node - linkType: hard - -"@tsconfig/node10@npm:^1.0.7": - version: 1.0.9 - resolution: "@tsconfig/node10@npm:1.0.9" - checksum: a33ae4dc2a621c0678ac8ac4bceb8e512ae75dac65417a2ad9b022d9b5411e863c4c198b6ba9ef659e14b9fb609bbec680841a2e84c1172df7a5ffcf076539df - languageName: node - linkType: hard - -"@tsconfig/node12@npm:^1.0.7": - version: 1.0.11 - resolution: "@tsconfig/node12@npm:1.0.11" - checksum: 5ce29a41b13e7897a58b8e2df11269c5395999e588b9a467386f99d1d26f6c77d1af2719e407621412520ea30517d718d5192a32403b8dfcc163bf33e40a338a - languageName: node - linkType: hard - -"@tsconfig/node14@npm:^1.0.0": - version: 1.0.3 - resolution: "@tsconfig/node14@npm:1.0.3" - checksum: 19275fe80c4c8d0ad0abed6a96dbf00642e88b220b090418609c4376e1cef81bf16237bf170ad1b341452feddb8115d8dd2e5acdfdea1b27422071163dc9ba9d - languageName: node - linkType: hard - -"@tsconfig/node16@npm:^1.0.2": - version: 1.0.4 - resolution: "@tsconfig/node16@npm:1.0.4" - checksum: 202319785901f942a6e1e476b872d421baec20cf09f4b266a1854060efbf78cde16a4d256e8bc949d31e6cd9a90f1e8ef8fb06af96a65e98338a2b6b0de0a0ff - languageName: node - linkType: hard - -"@types/debug@npm:^4.1.9": - version: 4.1.12 - resolution: "@types/debug@npm:4.1.12" - dependencies: - "@types/ms": "*" - checksum: 47876a852de8240bfdaf7481357af2b88cb660d30c72e73789abf00c499d6bc7cd5e52f41c915d1b9cd8ec9fef5b05688d7b7aef17f7f272c2d04679508d1053 - languageName: node - linkType: hard - -"@types/json-schema@npm:^7.0.12": - version: 7.0.14 - resolution: "@types/json-schema@npm:7.0.14" - checksum: 4b3dd99616c7c808201c56f6c7f6552eb67b5c0c753ab3fa03a6cb549aae950da537e9558e53fa65fba23d1be624a1e4e8d20c15027efbe41e03ca56f2b04fb0 - languageName: node - linkType: hard - -"@types/ms@npm:*": - version: 0.7.34 - resolution: "@types/ms@npm:0.7.34" - checksum: f38d36e7b6edecd9badc9cf50474159e9da5fa6965a75186cceaf883278611b9df6669dc3a3cc122b7938d317b68a9e3d573d316fcb35d1be47ec9e468c6bd8a - languageName: node - linkType: hard - -"@types/node-cron@npm:^3.0.9": - version: 3.0.9 - resolution: "@types/node-cron@npm:3.0.9" - checksum: 8335eb0a453b956cc2da5431269e4732e0063c6cca0763cf779c7c242d0dfe3eea1929951a0b11fb9e7a2eee838836ee8cda79e9d6098b1bee91d5a17dce1e73 - languageName: node - linkType: hard - -"@types/node@npm:*": - version: 20.10.3 - resolution: "@types/node@npm:20.10.3" - dependencies: - undici-types: ~5.26.4 - checksum: 34a329494f0ea239af05eeb6f00f396963725b3eb9a2f79c5e6a6d37e823f2ab85e1079c2ee56723a37d8b89e7bbe2bd050c97144e5bb06dab93fd1cace65c97 - languageName: node - linkType: hard - -"@types/node@npm:18.15.13": - version: 18.15.13 - resolution: "@types/node@npm:18.15.13" - checksum: 79cc5a2b5f98e8973061a4260a781425efd39161a0e117a69cd089603964816c1a14025e1387b4590c8e82d05133b7b4154fa53a7dffb3877890a66145e76515 - languageName: node - linkType: hard - -"@types/node@npm:^20.8.9": - version: 20.8.9 - resolution: "@types/node@npm:20.8.9" - dependencies: - undici-types: ~5.26.4 - checksum: 0c05f3502a9507ff27e91dd6fd574fa6f391b3fafedcfe8e0c8d33351fb22d02c0121f854e5b6b3ecb9a8a468407ddf6e7ac0029fb236d4c7e1361ffc758a01f - languageName: node - linkType: hard - -"@types/readable-stream@npm:^2.3.13": - version: 2.3.15 - resolution: "@types/readable-stream@npm:2.3.15" - dependencies: - "@types/node": "*" - safe-buffer: ~5.1.1 - checksum: ec36f525cad09b6c65a1dafcb5ad99b9e2ed824ec49b7aa23180ac427e5d35b8a0706193ecd79ab4253a283ad485ba03d5917a98daaaa144f0ea34f4823e9d82 - languageName: node - linkType: hard - -"@types/semver@npm:^7.5.0": - version: 7.5.4 - resolution: "@types/semver@npm:7.5.4" - checksum: 120c0189f6fec5f2d12d0d71ac8a4cfa952dc17fa3d842e8afddb82bba8828a4052f8799c1653e2b47ae1977435f38e8985658fde971905ce5afb8e23ee97ecf - languageName: node - linkType: hard - -"@types/triple-beam@npm:^1.3.2": - version: 1.3.4 - resolution: "@types/triple-beam@npm:1.3.4" - checksum: 869641358164a9b87aec710e046c11a65803b7dc3545f33c3365df9590d1059c70592bb35a7fc4099fa746f112ab5a207881ba9fb570e9b1dea4ffd89761d804 - languageName: node - linkType: hard - -"@typescript-eslint/eslint-plugin@npm:^6.7.5": - version: 6.9.0 - resolution: "@typescript-eslint/eslint-plugin@npm:6.9.0" - dependencies: - "@eslint-community/regexpp": ^4.5.1 - "@typescript-eslint/scope-manager": 6.9.0 - "@typescript-eslint/type-utils": 6.9.0 - "@typescript-eslint/utils": 6.9.0 - "@typescript-eslint/visitor-keys": 6.9.0 - debug: ^4.3.4 - graphemer: ^1.4.0 - ignore: ^5.2.4 - natural-compare: ^1.4.0 - semver: ^7.5.4 - ts-api-utils: ^1.0.1 - peerDependencies: - "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 51d7afc18bab711e20147f7163083f05435b6860174169eae56de217ed2cb1b3c08cba01b7d338315c2d8ecb982e83ce8f2ca7d2108c1c7c04faff2001b094d3 - languageName: node - linkType: hard - -"@typescript-eslint/parser@npm:^6.7.5": - version: 6.9.0 - resolution: "@typescript-eslint/parser@npm:6.9.0" - dependencies: - "@typescript-eslint/scope-manager": 6.9.0 - "@typescript-eslint/types": 6.9.0 - "@typescript-eslint/typescript-estree": 6.9.0 - "@typescript-eslint/visitor-keys": 6.9.0 - debug: ^4.3.4 - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: d8ff69d236d6495474ab93c67e2785cc94bf9c098f25c33f1c5958a4b2b5af2b70edf1cdd0c23ee3436df454a769e80eb47d2d34df8382a826fcdb79bac4382d - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:6.9.0": - version: 6.9.0 - resolution: "@typescript-eslint/scope-manager@npm:6.9.0" - dependencies: - "@typescript-eslint/types": 6.9.0 - "@typescript-eslint/visitor-keys": 6.9.0 - checksum: b7ddcea11bdb95107659800bdf3b33eae22a4dc5c28dc0f8dc5507aa9affaae0e332b6d8c7d5286a7ec75e7c4abd211eb9fdf9647a9a796689cdcc11f6ab40c6 - languageName: node - linkType: hard - -"@typescript-eslint/type-utils@npm:6.9.0": - version: 6.9.0 - resolution: "@typescript-eslint/type-utils@npm:6.9.0" - dependencies: - "@typescript-eslint/typescript-estree": 6.9.0 - "@typescript-eslint/utils": 6.9.0 - debug: ^4.3.4 - ts-api-utils: ^1.0.1 - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 279b0000cd2fe7ccfbd2f311736b14c8bb9287081f553c9452c95966650c822e67442ba5a62d7fea3ee2f61ccc0fcb218f21e1ee7ccf3984c52e5942d2bbb065 - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:6.9.0": - version: 6.9.0 - resolution: "@typescript-eslint/types@npm:6.9.0" - checksum: e0444afa1f2ebca746c72b3d0bf95982eb1e8b4fb91bcba465c1345c35fa13b36c589bfd91c776b864f223bc50817b2613df5892185c2e34332bf4cc57cc865d - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:6.9.0": - version: 6.9.0 - resolution: "@typescript-eslint/typescript-estree@npm:6.9.0" - dependencies: - "@typescript-eslint/types": 6.9.0 - "@typescript-eslint/visitor-keys": 6.9.0 - debug: ^4.3.4 - globby: ^11.1.0 - is-glob: ^4.0.3 - semver: ^7.5.4 - ts-api-utils: ^1.0.1 - peerDependenciesMeta: - typescript: - optional: true - checksum: 51088c23cca608a6e5c195b0a2d8a17ad00ca47199ba4df0c1013912a80194bff9f5bd4d035d6ab2596788491e9a3e04bbf6cad6494a3b1bbd59fea442750268 - languageName: node - linkType: hard - -"@typescript-eslint/utils@npm:6.9.0": - version: 6.9.0 - resolution: "@typescript-eslint/utils@npm:6.9.0" - dependencies: - "@eslint-community/eslint-utils": ^4.4.0 - "@types/json-schema": ^7.0.12 - "@types/semver": ^7.5.0 - "@typescript-eslint/scope-manager": 6.9.0 - "@typescript-eslint/types": 6.9.0 - "@typescript-eslint/typescript-estree": 6.9.0 - semver: ^7.5.4 - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - checksum: 973c24d7858f224934958ee58c21ff21dfe54dbb1d0e0c5f889298fadcd7ee2dbfd49cf86ccafab74d428c31de66cd9beee7c39d2b64f9edcc9e941573bac175 - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:6.9.0": - version: 6.9.0 - resolution: "@typescript-eslint/visitor-keys@npm:6.9.0" - dependencies: - "@typescript-eslint/types": 6.9.0 - eslint-visitor-keys: ^3.4.1 - checksum: de8e2e363df41e5ae9774a5ebd1c49d29c771ea8b3869917f65a74cd4d14a67417c79916f456ee81ef5b0d947b7b8975385fc6eea3f1812d53a2eaaea832459e - languageName: node - linkType: hard - -"@ungap/structured-clone@npm:^1.2.0": - version: 1.2.0 - resolution: "@ungap/structured-clone@npm:1.2.0" - checksum: 4f656b7b4672f2ce6e272f2427d8b0824ed11546a601d8d5412b9d7704e83db38a8d9f402ecdf2b9063fc164af842ad0ec4a55819f621ed7e7ea4d1efcc74524 - languageName: node - linkType: hard - -"@yarnpkg/lockfile@npm:^1.1.0": - version: 1.1.0 - resolution: "@yarnpkg/lockfile@npm:1.1.0" - checksum: 05b881b4866a3546861fee756e6d3812776ea47fa6eb7098f983d6d0eefa02e12b66c3fff931574120f196286a7ad4879ce02743c8bb2be36c6a576c7852083a - languageName: node - linkType: hard - -"abbrev@npm:1, abbrev@npm:^1.0.0": - version: 1.1.1 - resolution: "abbrev@npm:1.1.1" - checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 - languageName: node - linkType: hard - -"abitype@npm:0.9.8": - version: 0.9.8 - resolution: "abitype@npm:0.9.8" - peerDependencies: - typescript: ">=5.0.4" - zod: ^3 >=3.19.1 - peerDependenciesMeta: - typescript: - optional: true - zod: - optional: true - checksum: d7d887f29d6821e3f7a400de9620511b80ead3f85c5c87308aaec97965d3493e6687ed816e88722b4f512249bd66dee9e69231b49af0e1db8f69400a62c87cf6 - languageName: node - linkType: hard - -"acorn-jsx@npm:^5.3.2": - version: 5.3.2 - resolution: "acorn-jsx@npm:5.3.2" - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: c3d3b2a89c9a056b205b69530a37b972b404ee46ec8e5b341666f9513d3163e2a4f214a71f4dfc7370f5a9c07472d2fd1c11c91c3f03d093e37637d95da98950 - languageName: node - linkType: hard - -"acorn-walk@npm:^8.1.1": - version: 8.2.0 - resolution: "acorn-walk@npm:8.2.0" - checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1 - languageName: node - linkType: hard - -"acorn@npm:^8.4.1, acorn@npm:^8.9.0": - version: 8.10.0 - resolution: "acorn@npm:8.10.0" - bin: - acorn: bin/acorn - checksum: 538ba38af0cc9e5ef983aee196c4b8b4d87c0c94532334fa7e065b2c8a1f85863467bb774231aae91613fcda5e68740c15d97b1967ae3394d20faddddd8af61d - languageName: node - linkType: hard - -"aes-js@npm:4.0.0-beta.5": - version: 4.0.0-beta.5 - resolution: "aes-js@npm:4.0.0-beta.5" - checksum: cc2ea969d77df939c32057f7e361b6530aa6cb93cb10617a17a45cd164e6d761002f031ff6330af3e67e58b1f0a3a8fd0b63a720afd591a653b02f649470e15b - languageName: node - linkType: hard - -"agent-base@npm:6, agent-base@npm:^6.0.2": - version: 6.0.2 - resolution: "agent-base@npm:6.0.2" - dependencies: - debug: 4 - checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d - languageName: node - linkType: hard - -"agentkeepalive@npm:^4.2.1": - version: 4.5.0 - resolution: "agentkeepalive@npm:4.5.0" - dependencies: - humanize-ms: ^1.2.1 - checksum: 13278cd5b125e51eddd5079f04d6fe0914ac1b8b91c1f3db2c1822f99ac1a7457869068997784342fe455d59daaff22e14fb7b8c3da4e741896e7e31faf92481 - languageName: node - linkType: hard - -"aggregate-error@npm:^3.0.0": - version: 3.1.0 - resolution: "aggregate-error@npm:3.1.0" - dependencies: - clean-stack: ^2.0.0 - indent-string: ^4.0.0 - checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 - languageName: node - linkType: hard - -"ajv@npm:^6.12.4": - version: 6.12.6 - resolution: "ajv@npm:6.12.6" - 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 - checksum: 874972efe5c4202ab0a68379481fbd3d1b5d0a7bd6d3cc21d40d3536ebff3352a2a1fabb632d4fd2cc7fe4cbdcd5ed6782084c9bbf7f32a1536d18f9da5007d4 - languageName: node - linkType: hard - -"ansi-regex@npm:^5.0.1": - version: 5.0.1 - resolution: "ansi-regex@npm:5.0.1" - checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b - languageName: node - linkType: hard - -"ansi-regex@npm:^6.0.1": - version: 6.0.1 - resolution: "ansi-regex@npm:6.0.1" - checksum: 1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 - languageName: node - linkType: hard - -"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": - version: 4.3.0 - resolution: "ansi-styles@npm:4.3.0" - dependencies: - color-convert: ^2.0.1 - checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 - languageName: node - linkType: hard - -"ansi-styles@npm:^6.1.0": - version: 6.2.1 - resolution: "ansi-styles@npm:6.2.1" - checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 - languageName: node - linkType: hard - -"anymatch@npm:~3.1.2": - version: 3.1.3 - resolution: "anymatch@npm:3.1.3" - dependencies: - normalize-path: ^3.0.0 - picomatch: ^2.0.4 - checksum: 3e044fd6d1d26545f235a9fe4d7a534e2029d8e59fa7fd9f2a6eb21230f6b5380ea1eaf55136e60cbf8e613544b3b766e7a6fa2102e2a3a117505466e3025dc2 - languageName: node - linkType: hard - -"aproba@npm:^1.0.3 || ^2.0.0": - version: 2.0.0 - resolution: "aproba@npm:2.0.0" - checksum: 5615cadcfb45289eea63f8afd064ab656006361020e1735112e346593856f87435e02d8dcc7ff0d11928bc7d425f27bc7c2a84f6c0b35ab0ff659c814c138a24 - languageName: node - linkType: hard - -"are-we-there-yet@npm:^3.0.0": - version: 3.0.1 - resolution: "are-we-there-yet@npm:3.0.1" - dependencies: - delegates: ^1.0.0 - readable-stream: ^3.6.0 - checksum: 52590c24860fa7173bedeb69a4c05fb573473e860197f618b9a28432ee4379049336727ae3a1f9c4cb083114601c1140cee578376164d0e651217a9843f9fe83 - languageName: node - linkType: hard - -"arg@npm:^4.1.0": - version: 4.1.3 - resolution: "arg@npm:4.1.3" - checksum: 544af8dd3f60546d3e4aff084d451b96961d2267d668670199692f8d054f0415d86fc5497d0e641e91546f0aa920e7c29e5250e99fc89f5552a34b5d93b77f43 - languageName: node - linkType: hard - -"argparse@npm:^2.0.1": - version: 2.0.1 - resolution: "argparse@npm:2.0.1" - checksum: 83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced - languageName: node - linkType: hard - -"array-union@npm:^2.1.0": - version: 2.1.0 - resolution: "array-union@npm:2.1.0" - checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d - languageName: node - linkType: hard - -"async-mutex@npm:^0.4.0": - version: 0.4.0 - resolution: "async-mutex@npm:0.4.0" - dependencies: - tslib: ^2.4.0 - checksum: 813a71728b35a4fbfd64dba719f04726d9133c67b577fcd951b7028c4a675a13ee34e69beb82d621f87bf81f5d4f135c4c44be0448550c7db728547244ef71fc - languageName: node - linkType: hard - -"async@npm:^3.2.3": - version: 3.2.4 - resolution: "async@npm:3.2.4" - checksum: 43d07459a4e1d09b84a20772414aa684ff4de085cbcaec6eea3c7a8f8150e8c62aa6cd4e699fe8ee93c3a5b324e777d34642531875a0817a35697522c1b02e89 - languageName: node - linkType: hard - -"asynckit@npm:^0.4.0": - version: 0.4.0 - resolution: "asynckit@npm:0.4.0" - checksum: 7b78c451df768adba04e2d02e63e2d0bf3b07adcd6e42b4cf665cb7ce899bedd344c69a1dcbce355b5f972d597b25aaa1c1742b52cffd9caccb22f348114f6be - languageName: node - linkType: hard - -"at-least-node@npm:^1.0.0": - version: 1.0.0 - resolution: "at-least-node@npm:1.0.0" - checksum: 463e2f8e43384f1afb54bc68485c436d7622acec08b6fad269b421cb1d29cebb5af751426793d0961ed243146fe4dc983402f6d5a51b720b277818dbf6f2e49e - languageName: node - linkType: hard - -"axios@npm:^1.5.1": - version: 1.5.1 - resolution: "axios@npm:1.5.1" - dependencies: - follow-redirects: ^1.15.0 - form-data: ^4.0.0 - proxy-from-env: ^1.1.0 - checksum: 4444f06601f4ede154183767863d2b8e472b4a6bfc5253597ed6d21899887e1fd0ee2b3de792ac4f8459fe2e359d2aa07c216e45fd8b9e4e0688a6ebf48a5a8d - languageName: node - linkType: hard - -"balanced-match@npm:^1.0.0": - version: 1.0.2 - resolution: "balanced-match@npm:1.0.2" - checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 - languageName: node - linkType: hard - -"bigint-crypto-utils@npm:^3.2.2": - version: 3.3.0 - resolution: "bigint-crypto-utils@npm:3.3.0" - checksum: 9598ce57b23f776c8936d44114c9f051e62b5fa654915b664784cbcbacc5aa0485f4479571c51ff58008abb1210c0d6a234853742f07cf84bda890f2a1e01000 - languageName: node - linkType: hard - -"binary-extensions@npm:^2.0.0": - version: 2.2.0 - resolution: "binary-extensions@npm:2.2.0" - checksum: ccd267956c58d2315f5d3ea6757cf09863c5fc703e50fbeb13a7dc849b812ef76e3cf9ca8f35a0c48498776a7478d7b4a0418e1e2b8cb9cb9731f2922aaad7f8 - languageName: node - linkType: hard - -"brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" - dependencies: - balanced-match: ^1.0.0 - concat-map: 0.0.1 - checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 - languageName: node - linkType: hard - -"brace-expansion@npm:^2.0.1": - version: 2.0.1 - resolution: "brace-expansion@npm:2.0.1" - dependencies: - balanced-match: ^1.0.0 - checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 - languageName: node - linkType: hard - -"braces@npm:^3.0.2, braces@npm:~3.0.2": - version: 3.0.2 - resolution: "braces@npm:3.0.2" - dependencies: - fill-range: ^7.0.1 - checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 - languageName: node - linkType: hard - -"braces@npm:^3.0.3": - version: 3.0.3 - resolution: "braces@npm:3.0.3" - dependencies: - fill-range: ^7.1.1 - checksum: b95aa0b3bd909f6cd1720ffcf031aeaf46154dd88b4da01f9a1d3f7ea866a79eba76a6d01cbc3c422b2ee5cdc39a4f02491058d5df0d7bf6e6a162a832df1f69 - languageName: node - linkType: hard - -"cacache@npm:^17.0.0": - version: 17.1.4 - resolution: "cacache@npm:17.1.4" - dependencies: - "@npmcli/fs": ^3.1.0 - fs-minipass: ^3.0.0 - glob: ^10.2.2 - lru-cache: ^7.7.1 - minipass: ^7.0.3 - minipass-collect: ^1.0.2 - minipass-flush: ^1.0.5 - minipass-pipeline: ^1.2.4 - p-map: ^4.0.0 - ssri: ^10.0.0 - tar: ^6.1.11 - unique-filename: ^3.0.0 - checksum: b7751df756656954a51201335addced8f63fc53266fa56392c9f5ae83c8d27debffb4458ac2d168a744a4517ec3f2163af05c20097f93d17bdc2dc8a385e14a6 - languageName: node - linkType: hard - -"call-bind@npm:^1.0.5": - version: 1.0.7 - resolution: "call-bind@npm:1.0.7" - 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 - checksum: 295c0c62b90dd6522e6db3b0ab1ce26bdf9e7404215bda13cfee25b626b5ff1a7761324d58d38b1ef1607fc65aca2d06e44d2e18d0dfc6c14b465b00d8660029 - languageName: node - linkType: hard - -"callsites@npm:^3.0.0": - version: 3.1.0 - resolution: "callsites@npm:3.1.0" - checksum: 072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 - languageName: node - linkType: hard - -"chalk@npm:^4.0.0, chalk@npm:^4.1.2": - version: 4.1.2 - resolution: "chalk@npm:4.1.2" - dependencies: - ansi-styles: ^4.1.0 - supports-color: ^7.1.0 - checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc - languageName: node - linkType: hard - -"chokidar@npm:^3.5.2": - version: 3.5.3 - resolution: "chokidar@npm:3.5.3" - dependencies: - anymatch: ~3.1.2 - braces: ~3.0.2 - fsevents: ~2.3.2 - glob-parent: ~5.1.2 - is-binary-path: ~2.1.0 - is-glob: ~4.0.1 - normalize-path: ~3.0.0 - readdirp: ~3.6.0 - dependenciesMeta: - fsevents: - optional: true - checksum: b49fcde40176ba007ff361b198a2d35df60d9bb2a5aab228279eb810feae9294a6b4649ab15981304447afe1e6ffbf4788ad5db77235dc770ab777c6e771980c - languageName: node - linkType: hard - -"chownr@npm:^2.0.0": - version: 2.0.0 - resolution: "chownr@npm:2.0.0" - checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f - languageName: node - linkType: hard - -"ci-info@npm:^3.7.0": - version: 3.9.0 - resolution: "ci-info@npm:3.9.0" - checksum: 6b19dc9b2966d1f8c2041a838217299718f15d6c4b63ae36e4674edd2bee48f780e94761286a56aa59eb305a85fbea4ddffb7630ec063e7ec7e7e5ad42549a87 - languageName: node - linkType: hard - -"clean-stack@npm:^2.0.0": - version: 2.2.0 - resolution: "clean-stack@npm:2.2.0" - checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 - languageName: node - linkType: hard - -"color-convert@npm:^1.9.3": - version: 1.9.3 - resolution: "color-convert@npm:1.9.3" - dependencies: - color-name: 1.1.3 - checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 - languageName: node - linkType: hard - -"color-convert@npm:^2.0.1": - version: 2.0.1 - resolution: "color-convert@npm:2.0.1" - dependencies: - color-name: ~1.1.4 - checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 - languageName: node - linkType: hard - -"color-name@npm:1.1.3": - version: 1.1.3 - resolution: "color-name@npm:1.1.3" - checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d - languageName: node - linkType: hard - -"color-name@npm:^1.0.0, color-name@npm:~1.1.4": - version: 1.1.4 - resolution: "color-name@npm:1.1.4" - checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 - languageName: node - linkType: hard - -"color-string@npm:^1.6.0": - version: 1.9.1 - resolution: "color-string@npm:1.9.1" - dependencies: - color-name: ^1.0.0 - simple-swizzle: ^0.2.2 - checksum: c13fe7cff7885f603f49105827d621ce87f4571d78ba28ef4a3f1a104304748f620615e6bf065ecd2145d0d9dad83a3553f52bb25ede7239d18e9f81622f1cc5 - languageName: node - linkType: hard - -"color-support@npm:^1.1.3": - version: 1.1.3 - resolution: "color-support@npm:1.1.3" - bin: - color-support: bin.js - checksum: 9b7356817670b9a13a26ca5af1c21615463b500783b739b7634a0c2047c16cef4b2865d7576875c31c3cddf9dd621fa19285e628f20198b233a5cfdda6d0793b - languageName: node - linkType: hard - -"color@npm:^3.1.3": - version: 3.2.1 - resolution: "color@npm:3.2.1" - dependencies: - color-convert: ^1.9.3 - color-string: ^1.6.0 - checksum: f81220e8b774d35865c2561be921f5652117638dcda7ca4029262046e37fc2444ac7bbfdd110cf1fd9c074a4ee5eda8f85944ffbdda26186b602dd9bb05f6400 - languageName: node - linkType: hard - -"colorspace@npm:1.1.x": - version: 1.1.4 - resolution: "colorspace@npm:1.1.4" - dependencies: - color: ^3.1.3 - text-hex: 1.0.x - checksum: bb3934ef3c417e961e6d03d7ca60ea6e175947029bfadfcdb65109b01881a1c0ecf9c2b0b59abcd0ee4a0d7c1eae93beed01b0e65848936472270a0b341ebce8 - languageName: node - linkType: hard - -"combined-stream@npm:^1.0.8": - version: 1.0.8 - resolution: "combined-stream@npm:1.0.8" - dependencies: - delayed-stream: ~1.0.0 - checksum: 49fa4aeb4916567e33ea81d088f6584749fc90c7abec76fd516bf1c5aa5c79f3584b5ba3de6b86d26ddd64bae5329c4c7479343250cfe71c75bb366eae53bb7c - languageName: node - linkType: hard - -"concat-map@npm:0.0.1": - version: 0.0.1 - resolution: "concat-map@npm:0.0.1" - checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af - languageName: node - linkType: hard - -"console-control-strings@npm:^1.1.0": - version: 1.1.0 - resolution: "console-control-strings@npm:1.1.0" - checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed - languageName: node - linkType: hard - -"crc@npm:^4.3.2": - version: 4.3.2 - resolution: "crc@npm:4.3.2" - peerDependencies: - buffer: ">=6.0.3" - peerDependenciesMeta: - buffer: - optional: true - checksum: 8231cc25331727083ffd22da3575110fc49b4dc8725de973bd43261d4426aba134ed3a75cc247f7c5e97a6e171f87dffc3325b82890e86d032de2e6bcef09c32 - languageName: node - linkType: hard - -"create-require@npm:^1.1.0": - version: 1.1.1 - resolution: "create-require@npm:1.1.1" - checksum: a9a1503d4390d8b59ad86f4607de7870b39cad43d929813599a23714831e81c520bddf61bcdd1f8e30f05fd3a2b71ae8538e946eb2786dc65c2bbc520f692eff - languageName: node - linkType: hard - -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" - dependencies: - path-key: ^3.1.0 - shebang-command: ^2.0.0 - which: ^2.0.1 - checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 - languageName: node - linkType: hard - -"debug@npm:4, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": - version: 4.3.4 - resolution: "debug@npm:4.3.4" - dependencies: - ms: 2.1.2 - peerDependenciesMeta: - supports-color: - optional: true - checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 - languageName: node - linkType: hard - -"debug@npm:^3.2.7": - version: 3.2.7 - resolution: "debug@npm:3.2.7" - dependencies: - ms: ^2.1.1 - checksum: b3d8c5940799914d30314b7c3304a43305fd0715581a919dacb8b3176d024a782062368405b47491516d2091d6462d4d11f2f4974a405048094f8bfebfa3071c - languageName: node - linkType: hard - -"deep-is@npm:^0.1.3": - version: 0.1.4 - resolution: "deep-is@npm:0.1.4" - checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 - languageName: node - linkType: hard - -"define-data-property@npm:^1.1.4": - version: 1.1.4 - resolution: "define-data-property@npm:1.1.4" - dependencies: - es-define-property: ^1.0.0 - es-errors: ^1.3.0 - gopd: ^1.0.1 - checksum: 8068ee6cab694d409ac25936eb861eea704b7763f7f342adbdfe337fc27c78d7ae0eff2364b2917b58c508d723c7a074326d068eef2e45c4edcd85cf94d0313b - languageName: node - linkType: hard - -"delayed-stream@npm:~1.0.0": - version: 1.0.0 - resolution: "delayed-stream@npm:1.0.0" - checksum: 46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020 - languageName: node - linkType: hard - -"delegates@npm:^1.0.0": - version: 1.0.0 - resolution: "delegates@npm:1.0.0" - checksum: a51744d9b53c164ba9c0492471a1a2ffa0b6727451bdc89e31627fdf4adda9d51277cfcbfb20f0a6f08ccb3c436f341df3e92631a3440226d93a8971724771fd - languageName: node - linkType: hard - -"diff@npm:^4.0.1": - version: 4.0.2 - resolution: "diff@npm:4.0.2" - checksum: f2c09b0ce4e6b301c221addd83bf3f454c0bc00caa3dd837cf6c127d6edf7223aa2bbe3b688feea110b7f262adbfc845b757c44c8a9f8c0c5b15d8fa9ce9d20d - languageName: node - linkType: hard - -"dir-glob@npm:^3.0.1": - version: 3.0.1 - resolution: "dir-glob@npm:3.0.1" - dependencies: - path-type: ^4.0.0 - checksum: fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 - languageName: node - linkType: hard - -"doctrine@npm:^3.0.0": - version: 3.0.0 - resolution: "doctrine@npm:3.0.0" - dependencies: - esutils: ^2.0.2 - checksum: fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce - languageName: node - linkType: hard - -"dotenv@npm:^16.3.1": - version: 16.3.1 - resolution: "dotenv@npm:16.3.1" - checksum: 15d75e7279018f4bafd0ee9706593dd14455ddb71b3bcba9c52574460b7ccaf67d5cf8b2c08a5af1a9da6db36c956a04a1192b101ee102a3e0cf8817bbcf3dfd - languageName: node - linkType: hard - -"eastasianwidth@npm:^0.2.0": - version: 0.2.0 - resolution: "eastasianwidth@npm:0.2.0" - checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed - languageName: node - linkType: hard - -"emoji-regex@npm:^8.0.0": - version: 8.0.0 - resolution: "emoji-regex@npm:8.0.0" - checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 - languageName: node - linkType: hard - -"emoji-regex@npm:^9.2.2": - version: 9.2.2 - resolution: "emoji-regex@npm:9.2.2" - checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601 - languageName: node - linkType: hard - -"enabled@npm:2.0.x": - version: 2.0.0 - resolution: "enabled@npm:2.0.0" - checksum: 9d256d89f4e8a46ff988c6a79b22fa814b4ffd82826c4fdacd9b42e9b9465709d3b748866d0ab4d442dfc6002d81de7f7b384146ccd1681f6a7f868d2acca063 - languageName: node - linkType: hard - -"encoding@npm:^0.1.13": - version: 0.1.13 - resolution: "encoding@npm:0.1.13" - dependencies: - iconv-lite: ^0.6.2 - checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f - languageName: node - linkType: hard - -"env-paths@npm:^2.2.0": - version: 2.2.1 - resolution: "env-paths@npm:2.2.1" - checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e - languageName: node - linkType: hard - -"err-code@npm:^2.0.2": - version: 2.0.3 - resolution: "err-code@npm:2.0.3" - checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54 - languageName: node - linkType: hard - -"es-define-property@npm:^1.0.0": - version: 1.0.0 - resolution: "es-define-property@npm:1.0.0" - dependencies: - get-intrinsic: ^1.2.4 - checksum: f66ece0a887b6dca71848fa71f70461357c0e4e7249696f81bad0a1f347eed7b31262af4a29f5d726dc026426f085483b6b90301855e647aa8e21936f07293c6 - languageName: node - linkType: hard - -"es-errors@npm:^1.3.0": - version: 1.3.0 - resolution: "es-errors@npm:1.3.0" - checksum: ec1414527a0ccacd7f15f4a3bc66e215f04f595ba23ca75cdae0927af099b5ec865f9f4d33e9d7e86f512f252876ac77d4281a7871531a50678132429b1271b5 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^4.0.0": - version: 4.0.0 - resolution: "escape-string-regexp@npm:4.0.0" - checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 - languageName: node - linkType: hard - -"eslint-config-prettier@npm:^9.0.0": - version: 9.0.0 - resolution: "eslint-config-prettier@npm:9.0.0" - peerDependencies: - eslint: ">=7.0.0" - bin: - eslint-config-prettier: bin/cli.js - checksum: 362e991b6cb343f79362bada2d97c202e5303e6865888918a7445c555fb75e4c078b01278e90be98aa98ae22f8597d8e93d48314bec6824f540f7efcab3ce451 - languageName: node - linkType: hard - -"eslint-scope@npm:^7.2.2": - version: 7.2.2 - resolution: "eslint-scope@npm:7.2.2" - dependencies: - esrecurse: ^4.3.0 - estraverse: ^5.2.0 - checksum: ec97dbf5fb04b94e8f4c5a91a7f0a6dd3c55e46bfc7bbcd0e3138c3a76977570e02ed89a1810c778dcd72072ff0e9621ba1379b4babe53921d71e2e4486fda3e - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": - version: 3.4.3 - resolution: "eslint-visitor-keys@npm:3.4.3" - checksum: 36e9ef87fca698b6fd7ca5ca35d7b2b6eeaaf106572e2f7fd31c12d3bfdaccdb587bba6d3621067e5aece31c8c3a348b93922ab8f7b2cbc6aaab5e1d89040c60 - languageName: node - linkType: hard - -"eslint@npm:^8.51.0": - version: 8.52.0 - resolution: "eslint@npm:8.52.0" - dependencies: - "@eslint-community/eslint-utils": ^4.2.0 - "@eslint-community/regexpp": ^4.6.1 - "@eslint/eslintrc": ^2.1.2 - "@eslint/js": 8.52.0 - "@humanwhocodes/config-array": ^0.11.13 - "@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 - bin: - eslint: bin/eslint.js - checksum: fd22d1e9bd7090e31b00cbc7a3b98f3b76020a4c4641f987ae7d0c8f52e1b88c3b268bdfdabac2e1a93513e5d11339b718ff45cbff48a44c35d7e52feba510ed - languageName: node - linkType: hard - -"espree@npm:^9.6.0, espree@npm:^9.6.1": - version: 9.6.1 - resolution: "espree@npm:9.6.1" - dependencies: - acorn: ^8.9.0 - acorn-jsx: ^5.3.2 - eslint-visitor-keys: ^3.4.1 - checksum: eb8c149c7a2a77b3f33a5af80c10875c3abd65450f60b8af6db1bfcfa8f101e21c1e56a561c6dc13b848e18148d43469e7cd208506238554fb5395a9ea5a1ab9 - languageName: node - linkType: hard - -"esquery@npm:^1.4.2": - version: 1.5.0 - resolution: "esquery@npm:1.5.0" - dependencies: - estraverse: ^5.1.0 - checksum: aefb0d2596c230118656cd4ec7532d447333a410a48834d80ea648b1e7b5c9bc9ed8b5e33a89cb04e487b60d622f44cf5713bf4abed7c97343edefdc84a35900 - languageName: node - linkType: hard - -"esrecurse@npm:^4.3.0": - version: 4.3.0 - resolution: "esrecurse@npm:4.3.0" - dependencies: - estraverse: ^5.2.0 - checksum: ebc17b1a33c51cef46fdc28b958994b1dc43cd2e86237515cbc3b4e5d2be6a811b2315d0a1a4d9d340b6d2308b15322f5c8291059521cc5f4802f65e7ec32837 - languageName: node - linkType: hard - -"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": - version: 5.3.0 - resolution: "estraverse@npm:5.3.0" - checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b - languageName: node - linkType: hard - -"esutils@npm:^2.0.2": - version: 2.0.3 - resolution: "esutils@npm:2.0.3" - checksum: 22b5b08f74737379a840b8ed2036a5fb35826c709ab000683b092d9054e5c2a82c27818f12604bfc2a9a76b90b6834ef081edbc1c7ae30d1627012e067c6ec87 - languageName: node - linkType: hard - -"ethereum-cryptography@npm:^2.1.2": - version: 2.1.2 - resolution: "ethereum-cryptography@npm:2.1.2" - dependencies: - "@noble/curves": 1.1.0 - "@noble/hashes": 1.3.1 - "@scure/bip32": 1.3.1 - "@scure/bip39": 1.2.1 - checksum: 2e8f7b8cc90232ae838ab6a8167708e8362621404d26e79b5d9e762c7b53d699f7520aff358d9254de658fcd54d2d0af168ff909943259ed27dc4cef2736410c - languageName: node - linkType: hard - -"ethers@npm:^6.4.0": - version: 6.9.0 - resolution: "ethers@npm:6.9.0" - dependencies: - "@adraffy/ens-normalize": 1.10.0 - "@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 - checksum: e7b3b912b92b818fe65a192b32f4dd87ce0b71f4ffc194b4b3764b4b17d3b6ed953b667293e4c9276f785fa8c8659934c513843350317c61178af8e6165afbdd - languageName: node - linkType: hard - -"exponential-backoff@npm:^3.1.1": - version: 3.1.1 - resolution: "exponential-backoff@npm:3.1.1" - checksum: 3d21519a4f8207c99f7457287291316306255a328770d320b401114ec8481986e4e467e854cb9914dd965e0a1ca810a23ccb559c642c88f4c7f55c55778a9b48 - languageName: node - linkType: hard - -"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": - version: 3.1.3 - resolution: "fast-deep-equal@npm:3.1.3" - checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d - languageName: node - linkType: hard - -"fast-glob@npm:^3.2.9": - version: 3.3.1 - resolution: "fast-glob@npm:3.3.1" - 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 - checksum: b6f3add6403e02cf3a798bfbb1183d0f6da2afd368f27456010c0bc1f9640aea308243d4cb2c0ab142f618276e65ecb8be1661d7c62a7b4e5ba774b9ce5432e5 - languageName: node - linkType: hard - -"fast-json-stable-stringify@npm:^2.0.0": - version: 2.1.0 - resolution: "fast-json-stable-stringify@npm:2.1.0" - checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb - languageName: node - linkType: hard - -"fast-levenshtein@npm:^2.0.6": - version: 2.0.6 - resolution: "fast-levenshtein@npm:2.0.6" - checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c - languageName: node - linkType: hard - -"fastq@npm:^1.6.0": - version: 1.15.0 - resolution: "fastq@npm:1.15.0" - dependencies: - reusify: ^1.0.4 - checksum: 0170e6bfcd5d57a70412440b8ef600da6de3b2a6c5966aeaf0a852d542daff506a0ee92d6de7679d1de82e644bce69d7a574a6c93f0b03964b5337eed75ada1a - languageName: node - linkType: hard - -"fecha@npm:^4.2.0": - version: 4.2.3 - resolution: "fecha@npm:4.2.3" - checksum: f94e2fb3acf5a7754165d04549460d3ae6c34830394d20c552197e3e000035d69732d74af04b9bed3283bf29fe2a9ebdcc0085e640b0be3cc3658b9726265e31 - languageName: node - linkType: hard - -"file-entry-cache@npm:^6.0.1": - version: 6.0.1 - resolution: "file-entry-cache@npm:6.0.1" - dependencies: - flat-cache: ^3.0.4 - checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 - languageName: node - linkType: hard - -"fill-range@npm:^7.0.1": - version: 7.0.1 - resolution: "fill-range@npm:7.0.1" - dependencies: - to-regex-range: ^5.0.1 - checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 - languageName: node - linkType: hard - -"fill-range@npm:^7.1.1": - version: 7.1.1 - resolution: "fill-range@npm:7.1.1" - dependencies: - to-regex-range: ^5.0.1 - checksum: b4abfbca3839a3d55e4ae5ec62e131e2e356bf4859ce8480c64c4876100f4df292a63e5bb1618e1d7460282ca2b305653064f01654474aa35c68000980f17798 - languageName: node - linkType: hard - -"find-up@npm:^5.0.0": - version: 5.0.0 - resolution: "find-up@npm:5.0.0" - dependencies: - locate-path: ^6.0.0 - path-exists: ^4.0.0 - checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 - languageName: node - linkType: hard - -"find-yarn-workspace-root@npm:^2.0.0": - version: 2.0.0 - resolution: "find-yarn-workspace-root@npm:2.0.0" - dependencies: - micromatch: ^4.0.2 - checksum: fa5ca8f9d08fe7a54ce7c0a5931ff9b7e36f9ee7b9475fb13752bcea80ec6b5f180fa5102d60b376d5526ce924ea3fc6b19301262efa0a5d248dd710f3644242 - languageName: node - linkType: hard - -"flat-cache@npm:^3.0.4": - version: 3.1.1 - resolution: "flat-cache@npm:3.1.1" - dependencies: - flatted: ^3.2.9 - keyv: ^4.5.3 - rimraf: ^3.0.2 - checksum: 4958cfe0f46acf84953d4e16676ef5f0d38eab3a92d532a1e8d5f88f11eea8b36d5d598070ff2aeae15f1fde18f8d7d089eefaf9db10b5a587cc1c9072325c7a - languageName: node - linkType: hard - -"flatted@npm:^3.2.9": - version: 3.2.9 - resolution: "flatted@npm:3.2.9" - checksum: f14167fbe26a9d20f6fca8d998e8f1f41df72c8e81f9f2c9d61ed2bea058248f5e1cbd05e7f88c0e5087a6a0b822a1e5e2b446e879f3cfbe0b07ba2d7f80b026 - languageName: node - linkType: hard - -"fn.name@npm:1.x.x": - version: 1.1.0 - resolution: "fn.name@npm:1.1.0" - checksum: e357144f48cfc9a7f52a82bbc6c23df7c8de639fce049cac41d41d62cabb740cdb9f14eddc6485e29c933104455bdd7a69bb14a9012cef9cd4fa252a4d0cf293 - languageName: node - linkType: hard - -"follow-redirects@npm:^1.15.0": - version: 1.15.3 - resolution: "follow-redirects@npm:1.15.3" - peerDependenciesMeta: - debug: - optional: true - checksum: 584da22ec5420c837bd096559ebfb8fe69d82512d5585004e36a3b4a6ef6d5905780e0c74508c7b72f907d1fa2b7bd339e613859e9c304d0dc96af2027fd0231 - languageName: node - linkType: hard - -"foreground-child@npm:^3.1.0": - version: 3.1.1 - resolution: "foreground-child@npm:3.1.1" - dependencies: - cross-spawn: ^7.0.0 - signal-exit: ^4.0.1 - checksum: 139d270bc82dc9e6f8bc045fe2aae4001dc2472157044fdfad376d0a3457f77857fa883c1c8b21b491c6caade9a926a4bed3d3d2e8d3c9202b151a4cbbd0bcd5 - languageName: node - linkType: hard - -"form-data@npm:^4.0.0": - version: 4.0.0 - resolution: "form-data@npm:4.0.0" - dependencies: - asynckit: ^0.4.0 - combined-stream: ^1.0.8 - mime-types: ^2.1.12 - checksum: 01135bf8675f9d5c61ff18e2e2932f719ca4de964e3be90ef4c36aacfc7b9cb2fceb5eca0b7e0190e3383fe51c5b37f4cb80b62ca06a99aaabfcfd6ac7c9328c - languageName: node - linkType: hard - -"fs-extra@npm:^9.0.0": - version: 9.1.0 - resolution: "fs-extra@npm:9.1.0" - dependencies: - at-least-node: ^1.0.0 - graceful-fs: ^4.2.0 - jsonfile: ^6.0.1 - universalify: ^2.0.0 - checksum: ba71ba32e0faa74ab931b7a0031d1523c66a73e225de7426e275e238e312d07313d2da2d33e34a52aa406c8763ade5712eb3ec9ba4d9edce652bcacdc29e6b20 - languageName: node - linkType: hard - -"fs-minipass@npm:^2.0.0": - version: 2.1.0 - resolution: "fs-minipass@npm:2.1.0" - dependencies: - minipass: ^3.0.0 - checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1 - languageName: node - linkType: hard - -"fs-minipass@npm:^3.0.0": - version: 3.0.3 - resolution: "fs-minipass@npm:3.0.3" - dependencies: - minipass: ^7.0.3 - checksum: 8722a41109130851d979222d3ec88aabaceeaaf8f57b2a8f744ef8bd2d1ce95453b04a61daa0078822bc5cd21e008814f06fe6586f56fef511e71b8d2394d802 - languageName: node - linkType: hard - -"fs.realpath@npm:^1.0.0": - version: 1.0.0 - resolution: "fs.realpath@npm:1.0.0" - checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 - languageName: node - linkType: hard - -"fsevents@npm:~2.3.2": - version: 2.3.3 - resolution: "fsevents@npm:2.3.3" - dependencies: - node-gyp: latest - checksum: 11e6ea6fea15e42461fc55b4b0e4a0a3c654faa567f1877dbd353f39156f69def97a69936d1746619d656c4b93de2238bf731f6085a03a50cabf287c9d024317 - conditions: os=darwin - languageName: node - linkType: hard - -"fsevents@patch:fsevents@~2.3.2#~builtin": - version: 2.3.3 - resolution: "fsevents@patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=18f3a7" - dependencies: - node-gyp: latest - conditions: os=darwin - languageName: node - linkType: hard - -"function-bind@npm:^1.1.2": - version: 1.1.2 - resolution: "function-bind@npm:1.1.2" - checksum: 2b0ff4ce708d99715ad14a6d1f894e2a83242e4a52ccfcefaee5e40050562e5f6dafc1adbb4ce2d4ab47279a45dc736ab91ea5042d843c3c092820dfe032efb1 - languageName: node - linkType: hard - -"gauge@npm:^4.0.3": - version: 4.0.4 - resolution: "gauge@npm:4.0.4" - dependencies: - aproba: ^1.0.3 || ^2.0.0 - color-support: ^1.1.3 - console-control-strings: ^1.1.0 - has-unicode: ^2.0.1 - signal-exit: ^3.0.7 - string-width: ^4.2.3 - strip-ansi: ^6.0.1 - wide-align: ^1.1.5 - checksum: 788b6bfe52f1dd8e263cda800c26ac0ca2ff6de0b6eee2fe0d9e3abf15e149b651bd27bf5226be10e6e3edb5c4e5d5985a5a1a98137e7a892f75eff76467ad2d - languageName: node - linkType: hard - -"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.4": - version: 1.2.4 - resolution: "get-intrinsic@npm:1.2.4" - 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 - checksum: 414e3cdf2c203d1b9d7d33111df746a4512a1aa622770b361dadddf8ed0b5aeb26c560f49ca077e24bfafb0acb55ca908d1f709216ccba33ffc548ec8a79a951 - languageName: node - linkType: hard - -"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": - version: 5.1.2 - resolution: "glob-parent@npm:5.1.2" - dependencies: - is-glob: ^4.0.1 - checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e - languageName: node - linkType: hard - -"glob-parent@npm:^6.0.2": - version: 6.0.2 - resolution: "glob-parent@npm:6.0.2" - dependencies: - is-glob: ^4.0.3 - checksum: c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8 - languageName: node - linkType: hard - -"glob@npm:^10.2.2": - version: 10.3.10 - resolution: "glob@npm:10.3.10" - dependencies: - foreground-child: ^3.1.0 - jackspeak: ^2.3.5 - minimatch: ^9.0.1 - minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 - path-scurry: ^1.10.1 - bin: - glob: dist/esm/bin.mjs - checksum: 4f2fe2511e157b5a3f525a54092169a5f92405f24d2aed3142f4411df328baca13059f4182f1db1bf933e2c69c0bd89e57ae87edd8950cba8c7ccbe84f721cf3 - languageName: node - linkType: hard - -"glob@npm:^7.1.3, glob@npm:^7.1.4": - version: 7.2.3 - resolution: "glob@npm:7.2.3" - 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 - checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 - languageName: node - linkType: hard - -"globals@npm:^13.19.0": - version: 13.23.0 - resolution: "globals@npm:13.23.0" - dependencies: - type-fest: ^0.20.2 - checksum: 194c97cf8d1ef6ba59417234c2386549c4103b6e5f24b1ff1952de61a4753e5d2069435ba629de711a6480b1b1d114a98e2ab27f85e966d5a10c319c3bbd3dc3 - languageName: node - linkType: hard - -"globby@npm:^11.1.0": - version: 11.1.0 - resolution: "globby@npm:11.1.0" - 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 - checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 - languageName: node - linkType: hard - -"gopd@npm:^1.0.1": - version: 1.0.1 - resolution: "gopd@npm:1.0.1" - dependencies: - get-intrinsic: ^1.1.3 - checksum: a5ccfb8806e0917a94e0b3de2af2ea4979c1da920bc381667c260e00e7cafdbe844e2cb9c5bcfef4e5412e8bf73bab837285bc35c7ba73aaaf0134d4583393a6 - languageName: node - linkType: hard - -"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6": - version: 4.2.11 - resolution: "graceful-fs@npm:4.2.11" - checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 - languageName: node - linkType: hard - -"graphemer@npm:^1.4.0": - version: 1.4.0 - resolution: "graphemer@npm:1.4.0" - checksum: bab8f0be9b568857c7bec9fda95a89f87b783546d02951c40c33f84d05bb7da3fd10f863a9beb901463669b6583173a8c8cc6d6b306ea2b9b9d5d3d943c3a673 - languageName: node - linkType: hard - -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b - languageName: node - linkType: hard - -"has-flag@npm:^4.0.0": - version: 4.0.0 - resolution: "has-flag@npm:4.0.0" - checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad - languageName: node - linkType: hard - -"has-property-descriptors@npm:^1.0.2": - version: 1.0.2 - resolution: "has-property-descriptors@npm:1.0.2" - dependencies: - es-define-property: ^1.0.0 - checksum: fcbb246ea2838058be39887935231c6d5788babed499d0e9d0cc5737494c48aba4fe17ba1449e0d0fbbb1e36175442faa37f9c427ae357d6ccb1d895fbcd3de3 - languageName: node - linkType: hard - -"has-proto@npm:^1.0.1": - version: 1.0.3 - resolution: "has-proto@npm:1.0.3" - checksum: fe7c3d50b33f50f3933a04413ed1f69441d21d2d2944f81036276d30635cad9279f6b43bc8f32036c31ebdfcf6e731150f46c1907ad90c669ffe9b066c3ba5c4 - languageName: node - linkType: hard - -"has-symbols@npm:^1.0.3": - version: 1.0.3 - resolution: "has-symbols@npm:1.0.3" - checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 - languageName: node - linkType: hard - -"has-unicode@npm:^2.0.1": - version: 2.0.1 - resolution: "has-unicode@npm:2.0.1" - checksum: 1eab07a7436512db0be40a710b29b5dc21fa04880b7f63c9980b706683127e3c1b57cb80ea96d47991bdae2dfe479604f6a1ba410106ee1046a41d1bd0814400 - languageName: node - linkType: hard - -"hasown@npm:^2.0.0": - version: 2.0.2 - resolution: "hasown@npm:2.0.2" - dependencies: - function-bind: ^1.1.2 - checksum: e8516f776a15149ca6c6ed2ae3110c417a00b62260e222590e54aa367cbcd6ed99122020b37b7fbdf05748df57b265e70095d7bf35a47660587619b15ffb93db - languageName: node - linkType: hard - -"http-cache-semantics@npm:^4.1.1": - version: 4.1.1 - resolution: "http-cache-semantics@npm:4.1.1" - checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236 - languageName: node - linkType: hard - -"http-proxy-agent@npm:^5.0.0": - version: 5.0.0 - resolution: "http-proxy-agent@npm:5.0.0" - dependencies: - "@tootallnate/once": 2 - agent-base: 6 - debug: 4 - checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786 - languageName: node - linkType: hard - -"https-proxy-agent@npm:^5.0.0": - version: 5.0.1 - resolution: "https-proxy-agent@npm:5.0.1" - dependencies: - agent-base: 6 - debug: 4 - checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 - languageName: node - linkType: hard - -"humanize-ms@npm:^1.2.1": - version: 1.2.1 - resolution: "humanize-ms@npm:1.2.1" - dependencies: - ms: ^2.0.0 - checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16 - languageName: node - linkType: hard - -"iconv-lite@npm:^0.6.2": - version: 0.6.3 - resolution: "iconv-lite@npm:0.6.3" - dependencies: - safer-buffer: ">= 2.1.2 < 3.0.0" - checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf - languageName: node - linkType: hard - -"ignore-by-default@npm:^1.0.1": - version: 1.0.1 - resolution: "ignore-by-default@npm:1.0.1" - checksum: 441509147b3615e0365e407a3c18e189f78c07af08564176c680be1fabc94b6c789cad1342ad887175d4ecd5225de86f73d376cec8e06b42fd9b429505ffcf8a - languageName: node - linkType: hard - -"ignore@npm:^5.2.0, ignore@npm:^5.2.4": - version: 5.2.4 - resolution: "ignore@npm:5.2.4" - checksum: 3d4c309c6006e2621659311783eaea7ebcd41fe4ca1d78c91c473157ad6666a57a2df790fe0d07a12300d9aac2888204d7be8d59f9aaf665b1c7fcdb432517ef - languageName: node - linkType: hard - -"import-fresh@npm:^3.2.1": - version: 3.3.0 - resolution: "import-fresh@npm:3.3.0" - dependencies: - parent-module: ^1.0.0 - resolve-from: ^4.0.0 - checksum: 2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa - languageName: node - linkType: hard - -"imurmurhash@npm:^0.1.4": - version: 0.1.4 - resolution: "imurmurhash@npm:0.1.4" - checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 - languageName: node - linkType: hard - -"indent-string@npm:^4.0.0": - version: 4.0.0 - resolution: "indent-string@npm:4.0.0" - checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 - languageName: node - linkType: hard - -"inflight@npm:^1.0.4": - version: 1.0.6 - resolution: "inflight@npm:1.0.6" - dependencies: - once: ^1.3.0 - wrappy: 1 - checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd - languageName: node - linkType: hard - -"inherits@npm:2, inherits@npm:^2.0.3": - version: 2.0.4 - resolution: "inherits@npm:2.0.4" - checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 - languageName: node - linkType: hard - -"ip@npm:^2.0.0": - version: 2.0.0 - resolution: "ip@npm:2.0.0" - checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349 - languageName: node - linkType: hard - -"is-arrayish@npm:^0.3.1": - version: 0.3.2 - resolution: "is-arrayish@npm:0.3.2" - checksum: 977e64f54d91c8f169b59afcd80ff19227e9f5c791fa28fa2e5bce355cbaf6c2c356711b734656e80c9dd4a854dd7efcf7894402f1031dfc5de5d620775b4d5f - languageName: node - linkType: hard - -"is-binary-path@npm:~2.1.0": - version: 2.1.0 - resolution: "is-binary-path@npm:2.1.0" - dependencies: - binary-extensions: ^2.0.0 - checksum: 84192eb88cff70d320426f35ecd63c3d6d495da9d805b19bc65b518984b7c0760280e57dbf119b7e9be6b161784a5a673ab2c6abe83abb5198a432232ad5b35c - languageName: node - linkType: hard - -"is-docker@npm:^2.0.0": - version: 2.2.1 - resolution: "is-docker@npm:2.2.1" - bin: - is-docker: cli.js - checksum: 3fef7ddbf0be25958e8991ad941901bf5922ab2753c46980b60b05c1bf9c9c2402d35e6dc32e4380b980ef5e1970a5d9d5e5aa2e02d77727c3b6b5e918474c56 - languageName: node - linkType: hard - -"is-extglob@npm:^2.1.1": - version: 2.1.1 - resolution: "is-extglob@npm:2.1.1" - checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^3.0.0": - version: 3.0.0 - resolution: "is-fullwidth-code-point@npm:3.0.0" - checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 - languageName: node - linkType: hard - -"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": - version: 4.0.3 - resolution: "is-glob@npm:4.0.3" - dependencies: - is-extglob: ^2.1.1 - checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 - languageName: node - linkType: hard - -"is-lambda@npm:^1.0.1": - version: 1.0.1 - resolution: "is-lambda@npm:1.0.1" - checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35 - languageName: node - linkType: hard - -"is-number@npm:^7.0.0": - version: 7.0.0 - resolution: "is-number@npm:7.0.0" - checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a - languageName: node - linkType: hard - -"is-path-inside@npm:^3.0.3": - version: 3.0.3 - resolution: "is-path-inside@npm:3.0.3" - checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 - languageName: node - linkType: hard - -"is-stream@npm:^2.0.0": - version: 2.0.1 - resolution: "is-stream@npm:2.0.1" - checksum: b8e05ccdf96ac330ea83c12450304d4a591f9958c11fd17bed240af8d5ffe08aedafa4c0f4cfccd4d28dc9d4d129daca1023633d5c11601a6cbc77521f6fae66 - languageName: node - linkType: hard - -"is-wsl@npm:^2.1.1": - version: 2.2.0 - resolution: "is-wsl@npm:2.2.0" - dependencies: - is-docker: ^2.0.0 - checksum: 20849846ae414997d290b75e16868e5261e86ff5047f104027026fd61d8b5a9b0b3ade16239f35e1a067b3c7cc02f70183cb661010ed16f4b6c7c93dad1b19d8 - languageName: node - linkType: hard - -"isarray@npm:^2.0.5": - version: 2.0.5 - resolution: "isarray@npm:2.0.5" - checksum: bd5bbe4104438c4196ba58a54650116007fa0262eccef13a4c55b2e09a5b36b59f1e75b9fcc49883dd9d4953892e6fc007eef9e9155648ceea036e184b0f930a - languageName: node - linkType: hard - -"isexe@npm:^2.0.0": - version: 2.0.0 - resolution: "isexe@npm:2.0.0" - checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 - languageName: node - linkType: hard - -"isows@npm:1.0.3": - version: 1.0.3 - resolution: "isows@npm:1.0.3" - peerDependencies: - ws: "*" - checksum: 9cacd5cf59f67deb51e825580cd445ab1725ecb05a67c704050383fb772856f3cd5e7da8ad08f5a3bd2823680d77d099459d0c6a7037972a74d6429af61af440 - languageName: node - linkType: hard - -"jackspeak@npm:^2.3.5": - version: 2.3.6 - resolution: "jackspeak@npm:2.3.6" - dependencies: - "@isaacs/cliui": ^8.0.2 - "@pkgjs/parseargs": ^0.11.0 - dependenciesMeta: - "@pkgjs/parseargs": - optional: true - checksum: 57d43ad11eadc98cdfe7496612f6bbb5255ea69fe51ea431162db302c2a11011642f50cfad57288bd0aea78384a0612b16e131944ad8ecd09d619041c8531b54 - languageName: node - linkType: hard - -"js-sdsl@npm:^4.1.4": - version: 4.4.2 - resolution: "js-sdsl@npm:4.4.2" - checksum: ba705adc1788bf3c6f6c8e5077824f2bb4f0acab5a984420ce5cc492c7fff3daddc26335ad2c9a67d4f5e3241ec790f9e5b72a625adcf20cf321d2fd85e62b8b - languageName: node - linkType: hard - -"js-yaml@npm:^4.1.0": - version: 4.1.0 - resolution: "js-yaml@npm:4.1.0" - dependencies: - argparse: ^2.0.1 - bin: - js-yaml: bin/js-yaml.js - checksum: c7830dfd456c3ef2c6e355cc5a92e6700ceafa1d14bba54497b34a99f0376cecbb3e9ac14d3e5849b426d5a5140709a66237a8c991c675431271c4ce5504151a - languageName: node - linkType: hard - -"json-buffer@npm:3.0.1": - version: 3.0.1 - resolution: "json-buffer@npm:3.0.1" - checksum: 9026b03edc2847eefa2e37646c579300a1f3a4586cfb62bf857832b60c852042d0d6ae55d1afb8926163fa54c2b01d83ae24705f34990348bdac6273a29d4581 - languageName: node - linkType: hard - -"json-schema-traverse@npm:^0.4.1": - version: 0.4.1 - resolution: "json-schema-traverse@npm:0.4.1" - checksum: 7486074d3ba247769fda17d5181b345c9fb7d12e0da98b22d1d71a5db9698d8b4bd900a3ec1a4ffdd60846fc2556274a5c894d0c48795f14cb03aeae7b55260b - languageName: node - linkType: hard - -"json-stable-stringify-without-jsonify@npm:^1.0.1": - version: 1.0.1 - resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" - checksum: cff44156ddce9c67c44386ad5cddf91925fe06b1d217f2da9c4910d01f358c6e3989c4d5a02683c7a5667f9727ff05831f7aa8ae66c8ff691c556f0884d49215 - languageName: node - linkType: hard - -"json-stable-stringify@npm:^1.0.2": - version: 1.1.1 - resolution: "json-stable-stringify@npm:1.1.1" - dependencies: - call-bind: ^1.0.5 - isarray: ^2.0.5 - jsonify: ^0.0.1 - object-keys: ^1.1.1 - checksum: e1ba06600fd278767eeff53f28e408e29c867e79abf564e7aadc3ce8f31f667258f8db278ef28831e45884dd687388fa1910f46e599fc19fb94c9afbbe3a4de8 - languageName: node - linkType: hard - -"jsonfile@npm:^6.0.1": - version: 6.1.0 - resolution: "jsonfile@npm:6.1.0" - dependencies: - graceful-fs: ^4.1.6 - universalify: ^2.0.0 - dependenciesMeta: - graceful-fs: - optional: true - checksum: 7af3b8e1ac8fe7f1eccc6263c6ca14e1966fcbc74b618d3c78a0a2075579487547b94f72b7a1114e844a1e15bb00d440e5d1720bfc4612d790a6f285d5ea8354 - languageName: node - linkType: hard - -"jsonify@npm:^0.0.1": - version: 0.0.1 - resolution: "jsonify@npm:0.0.1" - checksum: 027287e1c0294fce15f18c0ff990cfc2318e7f01fb76515f784d5cd0784abfec6fc5c2355c3a2f2cb0ad7f4aa2f5b74ebbfe4e80476c35b2d13cabdb572e1134 - languageName: node - linkType: hard - -"keyv@npm:^4.5.3": - version: 4.5.4 - resolution: "keyv@npm:4.5.4" - dependencies: - json-buffer: 3.0.1 - checksum: 74a24395b1c34bd44ad5cb2b49140d087553e170625240b86755a6604cd65aa16efdbdeae5cdb17ba1284a0fbb25ad06263755dbc71b8d8b06f74232ce3cdd72 - languageName: node - linkType: hard - -"klaw-sync@npm:^6.0.0": - version: 6.0.0 - resolution: "klaw-sync@npm:6.0.0" - dependencies: - graceful-fs: ^4.1.11 - checksum: 0da397f8961313c3ef8f79fb63af9002cde5a8fb2aeb1a37351feff0dd6006129c790400c3f5c3b4e757bedcabb13d21ec0a5eaef5a593d59515d4f2c291e475 - languageName: node - linkType: hard - -"kuler@npm:^2.0.0": - version: 2.0.0 - resolution: "kuler@npm:2.0.0" - checksum: 9e10b5a1659f9ed8761d38df3c35effabffbd19fc6107324095238e4ef0ff044392cae9ac64a1c2dda26e532426485342226b93806bd97504b174b0dcf04ed81 - languageName: node - linkType: hard - -"levn@npm:^0.4.1": - version: 0.4.1 - resolution: "levn@npm:0.4.1" - dependencies: - prelude-ls: ^1.2.1 - type-check: ~0.4.0 - checksum: 12c5021c859bd0f5248561bf139121f0358285ec545ebf48bb3d346820d5c61a4309535c7f387ed7d84361cf821e124ce346c6b7cef8ee09a67c1473b46d0fc4 - languageName: node - linkType: hard - -"locate-path@npm:^6.0.0": - version: 6.0.0 - resolution: "locate-path@npm:6.0.0" - dependencies: - p-locate: ^5.0.0 - checksum: 72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a - languageName: node - linkType: hard - -"lodash.merge@npm:^4.6.2": - version: 4.6.2 - resolution: "lodash.merge@npm:4.6.2" - checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005 - languageName: node - linkType: hard - -"logform@npm:^2.3.2, logform@npm:^2.4.0": - version: 2.6.0 - resolution: "logform@npm:2.6.0" - dependencies: - "@colors/colors": 1.6.0 - "@types/triple-beam": ^1.3.2 - fecha: ^4.2.0 - ms: ^2.1.1 - safe-stable-stringify: ^2.3.1 - triple-beam: ^1.3.0 - checksum: b9ea74bb75e55379ad0eb3e4d65ae6e8d02bc45b431c218162878bf663997ab9258a73104c2b30e09dd2db288bb83c8bf8748e46689d75f5e7e34cf69378d6df - languageName: node - linkType: hard - -"lru-cache@npm:^10.0.0": - version: 10.1.0 - resolution: "lru-cache@npm:10.1.0" - checksum: 58056d33e2500fbedce92f8c542e7c11b50d7d086578f14b7074d8c241422004af0718e08a6eaae8705cee09c77e39a61c1c79e9370ba689b7010c152e6a76ab - languageName: node - linkType: hard - -"lru-cache@npm:^6.0.0": - version: 6.0.0 - resolution: "lru-cache@npm:6.0.0" - dependencies: - yallist: ^4.0.0 - checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 - languageName: node - linkType: hard - -"lru-cache@npm:^7.7.1": - version: 7.18.3 - resolution: "lru-cache@npm:7.18.3" - checksum: e550d772384709deea3f141af34b6d4fa392e2e418c1498c078de0ee63670f1f46f5eee746e8ef7e69e1c895af0d4224e62ee33e66a543a14763b0f2e74c1356 - languageName: node - linkType: hard - -"lru-cache@npm:^9.1.1 || ^10.0.0": - version: 10.0.1 - resolution: "lru-cache@npm:10.0.1" - checksum: 06f8d0e1ceabd76bb6f644a26dbb0b4c471b79c7b514c13c6856113879b3bf369eb7b497dad4ff2b7e2636db202412394865b33c332100876d838ad1372f0181 - languageName: node - linkType: hard - -"make-error@npm:^1.1.1": - version: 1.3.6 - resolution: "make-error@npm:1.3.6" - checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 - languageName: node - linkType: hard - -"make-fetch-happen@npm:^11.0.3": - version: 11.1.1 - resolution: "make-fetch-happen@npm:11.1.1" - dependencies: - agentkeepalive: ^4.2.1 - cacache: ^17.0.0 - http-cache-semantics: ^4.1.1 - http-proxy-agent: ^5.0.0 - https-proxy-agent: ^5.0.0 - is-lambda: ^1.0.1 - lru-cache: ^7.7.1 - minipass: ^5.0.0 - minipass-fetch: ^3.0.0 - minipass-flush: ^1.0.5 - minipass-pipeline: ^1.2.4 - negotiator: ^0.6.3 - promise-retry: ^2.0.1 - socks-proxy-agent: ^7.0.0 - ssri: ^10.0.0 - checksum: 7268bf274a0f6dcf0343829489a4506603ff34bd0649c12058753900b0eb29191dce5dba12680719a5d0a983d3e57810f594a12f3c18494e93a1fbc6348a4540 - languageName: node - linkType: hard - -"merge2@npm:^1.3.0, merge2@npm:^1.4.1": - version: 1.4.1 - resolution: "merge2@npm:1.4.1" - checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 - languageName: node - linkType: hard - -"micromatch@npm:^4.0.2": - version: 4.0.7 - resolution: "micromatch@npm:4.0.7" - dependencies: - braces: ^3.0.3 - picomatch: ^2.3.1 - checksum: 3cde047d70ad80cf60c787b77198d680db3b8c25b23feb01de5e2652205d9c19f43bd81882f69a0fd1f0cde6a7a122d774998aad3271ddb1b8accf8a0f480cf7 - languageName: node - linkType: hard - -"micromatch@npm:^4.0.4": - version: 4.0.5 - resolution: "micromatch@npm:4.0.5" - dependencies: - braces: ^3.0.2 - picomatch: ^2.3.1 - checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc - languageName: node - linkType: hard - -"mime-db@npm:1.52.0": - version: 1.52.0 - resolution: "mime-db@npm:1.52.0" - checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f - languageName: node - linkType: hard - -"mime-types@npm:^2.1.12": - version: 2.1.35 - resolution: "mime-types@npm:2.1.35" - dependencies: - mime-db: 1.52.0 - checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836 - languageName: node - linkType: hard - -"minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": - version: 3.1.2 - resolution: "minimatch@npm:3.1.2" - dependencies: - brace-expansion: ^1.1.7 - checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a - languageName: node - linkType: hard - -"minimatch@npm:^9.0.1": - version: 9.0.3 - resolution: "minimatch@npm:9.0.3" - dependencies: - brace-expansion: ^2.0.1 - checksum: 253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5 - languageName: node - linkType: hard - -"minimist@npm:^1.2.6": - version: 1.2.8 - resolution: "minimist@npm:1.2.8" - checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0 - languageName: node - linkType: hard - -"minipass-collect@npm:^1.0.2": - version: 1.0.2 - resolution: "minipass-collect@npm:1.0.2" - dependencies: - minipass: ^3.0.0 - checksum: 14df761028f3e47293aee72888f2657695ec66bd7d09cae7ad558da30415fdc4752bbfee66287dcc6fd5e6a2fa3466d6c484dc1cbd986525d9393b9523d97f10 - languageName: node - linkType: hard - -"minipass-fetch@npm:^3.0.0": - version: 3.0.4 - resolution: "minipass-fetch@npm:3.0.4" - dependencies: - encoding: ^0.1.13 - minipass: ^7.0.3 - minipass-sized: ^1.0.3 - minizlib: ^2.1.2 - dependenciesMeta: - encoding: - optional: true - checksum: af7aad15d5c128ab1ebe52e043bdf7d62c3c6f0cecb9285b40d7b395e1375b45dcdfd40e63e93d26a0e8249c9efd5c325c65575aceee192883970ff8cb11364a - languageName: node - linkType: hard - -"minipass-flush@npm:^1.0.5": - version: 1.0.5 - resolution: "minipass-flush@npm:1.0.5" - dependencies: - minipass: ^3.0.0 - checksum: 56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf - languageName: node - linkType: hard - -"minipass-pipeline@npm:^1.2.4": - version: 1.2.4 - resolution: "minipass-pipeline@npm:1.2.4" - dependencies: - minipass: ^3.0.0 - checksum: b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b - languageName: node - linkType: hard - -"minipass-sized@npm:^1.0.3": - version: 1.0.3 - resolution: "minipass-sized@npm:1.0.3" - dependencies: - minipass: ^3.0.0 - checksum: 79076749fcacf21b5d16dd596d32c3b6bf4d6e62abb43868fac21674078505c8b15eaca4e47ed844985a4514854f917d78f588fcd029693709417d8f98b2bd60 - languageName: node - linkType: hard - -"minipass@npm:^3.0.0": - version: 3.3.6 - resolution: "minipass@npm:3.3.6" - dependencies: - yallist: ^4.0.0 - checksum: a30d083c8054cee83cdcdc97f97e4641a3f58ae743970457b1489ce38ee1167b3aaf7d815cd39ec7a99b9c40397fd4f686e83750e73e652b21cb516f6d845e48 - languageName: node - linkType: hard - -"minipass@npm:^5.0.0": - version: 5.0.0 - resolution: "minipass@npm:5.0.0" - checksum: 425dab288738853fded43da3314a0b5c035844d6f3097a8e3b5b29b328da8f3c1af6fc70618b32c29ff906284cf6406b6841376f21caaadd0793c1d5a6a620ea - languageName: node - linkType: hard - -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.3": - version: 7.0.4 - resolution: "minipass@npm:7.0.4" - checksum: 87585e258b9488caf2e7acea242fd7856bbe9a2c84a7807643513a338d66f368c7d518200ad7b70a508664d408aa000517647b2930c259a8b1f9f0984f344a21 - languageName: node - linkType: hard - -"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": - version: 2.1.2 - resolution: "minizlib@npm:2.1.2" - dependencies: - minipass: ^3.0.0 - yallist: ^4.0.0 - checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3 - languageName: node - linkType: hard - -"mkdirp@npm:^1.0.3": - version: 1.0.4 - resolution: "mkdirp@npm:1.0.4" - bin: - mkdirp: bin/cmd.js - checksum: a96865108c6c3b1b8e1d5e9f11843de1e077e57737602de1b82030815f311be11f96f09cce59bd5b903d0b29834733e5313f9301e3ed6d6f6fba2eae0df4298f - languageName: node - linkType: hard - -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f - languageName: node - linkType: hard - -"ms@npm:^2.0.0, ms@npm:^2.1.1": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d - languageName: node - linkType: hard - -"natural-compare@npm:^1.4.0": - version: 1.4.0 - resolution: "natural-compare@npm:1.4.0" - checksum: 23ad088b08f898fc9b53011d7bb78ec48e79de7627e01ab5518e806033861bef68d5b0cd0e2205c2f36690ac9571ff6bcb05eb777ced2eeda8d4ac5b44592c3d - languageName: node - linkType: hard - -"negotiator@npm:^0.6.3": - version: 0.6.3 - resolution: "negotiator@npm:0.6.3" - checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 - languageName: node - linkType: hard - -"node-gyp@npm:latest": - version: 9.4.0 - resolution: "node-gyp@npm:9.4.0" - dependencies: - env-paths: ^2.2.0 - exponential-backoff: ^3.1.1 - glob: ^7.1.4 - graceful-fs: ^4.2.6 - make-fetch-happen: ^11.0.3 - nopt: ^6.0.0 - npmlog: ^6.0.0 - rimraf: ^3.0.2 - semver: ^7.3.5 - tar: ^6.1.2 - which: ^2.0.2 - bin: - node-gyp: bin/node-gyp.js - checksum: 78b404e2e0639d64e145845f7f5a3cb20c0520cdaf6dda2f6e025e9b644077202ea7de1232396ba5bde3fee84cdc79604feebe6ba3ec84d464c85d407bb5da99 - languageName: node - linkType: hard - -"nodemon@npm:^3.0.1": - version: 3.0.1 - resolution: "nodemon@npm:3.0.1" - dependencies: - chokidar: ^3.5.2 - debug: ^3.2.7 - ignore-by-default: ^1.0.1 - minimatch: ^3.1.2 - pstree.remy: ^1.1.8 - semver: ^7.5.3 - simple-update-notifier: ^2.0.0 - supports-color: ^5.5.0 - touch: ^3.1.0 - undefsafe: ^2.0.5 - bin: - nodemon: bin/nodemon.js - checksum: 6a5d81855760d6617049eccce10ccf02bddb482dab13ceea5280ae595ec7004eee13e7b934368e3f46c37fe4d970342a8c38c99cae7e93e4d7a3ed1c1ecb6acf - languageName: node - linkType: hard - -"nopt@npm:^6.0.0": - version: 6.0.0 - resolution: "nopt@npm:6.0.0" - dependencies: - abbrev: ^1.0.0 - bin: - nopt: bin/nopt.js - checksum: 82149371f8be0c4b9ec2f863cc6509a7fd0fa729929c009f3a58e4eb0c9e4cae9920e8f1f8eb46e7d032fec8fb01bede7f0f41a67eb3553b7b8e14fa53de1dac - languageName: node - linkType: hard - -"nopt@npm:~1.0.10": - version: 1.0.10 - resolution: "nopt@npm:1.0.10" - dependencies: - abbrev: 1 - bin: - nopt: ./bin/nopt.js - checksum: f62575aceaa3be43f365bf37a596b89bbac2e796b001b6d2e2a85c2140a4e378ff919e2753ccba959c4fd344776fc88c29b393bc167fa939fb1513f126f4cd45 - languageName: node - linkType: hard - -"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": - version: 3.0.0 - resolution: "normalize-path@npm:3.0.0" - checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 - languageName: node - linkType: hard - -"npmlog@npm:^6.0.0": - version: 6.0.2 - resolution: "npmlog@npm:6.0.2" - dependencies: - are-we-there-yet: ^3.0.0 - console-control-strings: ^1.1.0 - gauge: ^4.0.3 - set-blocking: ^2.0.0 - checksum: ae238cd264a1c3f22091cdd9e2b106f684297d3c184f1146984ecbe18aaa86343953f26b9520dedd1b1372bc0316905b736c1932d778dbeb1fcf5a1001390e2a - languageName: node - linkType: hard - -"object-keys@npm:^1.1.1": - version: 1.1.1 - resolution: "object-keys@npm:1.1.1" - checksum: b363c5e7644b1e1b04aa507e88dcb8e3a2f52b6ffd0ea801e4c7a62d5aa559affe21c55a07fd4b1fd55fc03a33c610d73426664b20032405d7b92a1414c34d6a - languageName: node - linkType: hard - -"once@npm:^1.3.0": - version: 1.4.0 - resolution: "once@npm:1.4.0" - dependencies: - wrappy: 1 - checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 - languageName: node - linkType: hard - -"one-time@npm:^1.0.0": - version: 1.0.0 - resolution: "one-time@npm:1.0.0" - dependencies: - fn.name: 1.x.x - checksum: fd008d7e992bdec1c67f53a2f9b46381ee12a9b8c309f88b21f0223546003fb47e8ad7c1fd5843751920a8d276c63bd4b45670ef80c61fb3e07dbccc962b5c7d - languageName: node - linkType: hard - -"open@npm:^7.4.2": - version: 7.4.2 - resolution: "open@npm:7.4.2" - dependencies: - is-docker: ^2.0.0 - is-wsl: ^2.1.1 - checksum: 3333900ec0e420d64c23b831bc3467e57031461d843c801f569b2204a1acc3cd7b3ec3c7897afc9dde86491dfa289708eb92bba164093d8bd88fb2c231843c91 - languageName: node - linkType: hard - -"optionator@npm:^0.9.3": - version: 0.9.3 - resolution: "optionator@npm:0.9.3" - 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 - checksum: 09281999441f2fe9c33a5eeab76700795365a061563d66b098923eb719251a42bdbe432790d35064d0816ead9296dbeb1ad51a733edf4167c96bd5d0882e428a - languageName: node - linkType: hard - -"os-tmpdir@npm:~1.0.2": - version: 1.0.2 - resolution: "os-tmpdir@npm:1.0.2" - checksum: 5666560f7b9f10182548bf7013883265be33620b1c1b4a4d405c25be2636f970c5488ff3e6c48de75b55d02bde037249fe5dbfbb4c0fb7714953d56aed062e6d - languageName: node - linkType: hard - -"p-limit@npm:^3.0.2": - version: 3.1.0 - resolution: "p-limit@npm:3.1.0" - dependencies: - yocto-queue: ^0.1.0 - checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 - languageName: node - linkType: hard - -"p-locate@npm:^5.0.0": - version: 5.0.0 - resolution: "p-locate@npm:5.0.0" - dependencies: - p-limit: ^3.0.2 - checksum: 1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3 - languageName: node - linkType: hard - -"p-map@npm:^4.0.0": - version: 4.0.0 - resolution: "p-map@npm:4.0.0" - dependencies: - aggregate-error: ^3.0.0 - checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c - languageName: node - linkType: hard - -"parent-module@npm:^1.0.0": - version: 1.0.1 - resolution: "parent-module@npm:1.0.1" - dependencies: - callsites: ^3.0.0 - checksum: 6ba8b255145cae9470cf5551eb74be2d22281587af787a2626683a6c20fbb464978784661478dd2a3f1dad74d1e802d403e1b03c1a31fab310259eec8ac560ff - languageName: node - linkType: hard - -"patch-package@npm:^8.0.0": - version: 8.0.0 - resolution: "patch-package@npm:8.0.0" - dependencies: - "@yarnpkg/lockfile": ^1.1.0 - chalk: ^4.1.2 - ci-info: ^3.7.0 - cross-spawn: ^7.0.3 - find-yarn-workspace-root: ^2.0.0 - fs-extra: ^9.0.0 - json-stable-stringify: ^1.0.2 - klaw-sync: ^6.0.0 - minimist: ^1.2.6 - open: ^7.4.2 - rimraf: ^2.6.3 - semver: ^7.5.3 - slash: ^2.0.0 - tmp: ^0.0.33 - yaml: ^2.2.2 - bin: - patch-package: index.js - checksum: d23cddc4d1622e2d8c7ca31b145c6eddb24bd271f69905e766de5e1f199f0b9a5479a6a6939ea857288399d4ed249285639d539a2c00fbddb7daa39934b007a2 - languageName: node - linkType: hard - -"path-exists@npm:^4.0.0": - version: 4.0.0 - resolution: "path-exists@npm:4.0.0" - checksum: 505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 - languageName: node - linkType: hard - -"path-is-absolute@npm:^1.0.0": - version: 1.0.1 - resolution: "path-is-absolute@npm:1.0.1" - checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 - languageName: node - linkType: hard - -"path-key@npm:^3.1.0": - version: 3.1.1 - resolution: "path-key@npm:3.1.1" - checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 - languageName: node - linkType: hard - -"path-scurry@npm:^1.10.1": - version: 1.10.1 - resolution: "path-scurry@npm:1.10.1" - dependencies: - lru-cache: ^9.1.1 || ^10.0.0 - minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 - checksum: e2557cff3a8fb8bc07afdd6ab163a92587884f9969b05bbbaf6fe7379348bfb09af9ed292af12ed32398b15fb443e81692047b786d1eeb6d898a51eb17ed7d90 - languageName: node - linkType: hard - -"path-type@npm:^4.0.0": - version: 4.0.0 - resolution: "path-type@npm:4.0.0" - checksum: 5b1e2daa247062061325b8fdbfd1fb56dde0a448fb1455453276ea18c60685bdad23a445dc148cf87bc216be1573357509b7d4060494a6fd768c7efad833ee45 - languageName: node - linkType: hard - -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1": - version: 2.3.1 - resolution: "picomatch@npm:2.3.1" - checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf - languageName: node - linkType: hard - -"prelude-ls@npm:^1.2.1": - version: 1.2.1 - resolution: "prelude-ls@npm:1.2.1" - checksum: cd192ec0d0a8e4c6da3bb80e4f62afe336df3f76271ac6deb0e6a36187133b6073a19e9727a1ff108cd8b9982e4768850d413baa71214dd80c7979617dca827a - languageName: node - linkType: hard - -"prettier@npm:^3.0.3": - version: 3.0.3 - resolution: "prettier@npm:3.0.3" - bin: - prettier: bin/prettier.cjs - checksum: e10b9af02b281f6c617362ebd2571b1d7fc9fb8a3bd17e371754428cda992e5e8d8b7a046e8f7d3e2da1dcd21aa001e2e3c797402ebb6111b5cd19609dd228e0 - languageName: node - linkType: hard - -"promise-retry@npm:^2.0.1": - version: 2.0.1 - resolution: "promise-retry@npm:2.0.1" - dependencies: - err-code: ^2.0.2 - retry: ^0.12.0 - checksum: f96a3f6d90b92b568a26f71e966cbbc0f63ab85ea6ff6c81284dc869b41510e6cdef99b6b65f9030f0db422bf7c96652a3fff9f2e8fb4a0f069d8f4430359429 - languageName: node - linkType: hard - -"proxy-from-env@npm:^1.1.0": - version: 1.1.0 - resolution: "proxy-from-env@npm:1.1.0" - checksum: ed7fcc2ba0a33404958e34d95d18638249a68c430e30fcb6c478497d72739ba64ce9810a24f53a7d921d0c065e5b78e3822759800698167256b04659366ca4d4 - languageName: node - linkType: hard - -"pstree.remy@npm:^1.1.8": - version: 1.1.8 - resolution: "pstree.remy@npm:1.1.8" - checksum: 5cb53698d6bb34dfb278c8a26957964aecfff3e161af5fbf7cee00bbe9d8547c7aced4bd9cb193bce15fb56e9e4220fc02a5bf9c14345ffb13a36b858701ec2d - languageName: node - linkType: hard - -"punycode@npm:^2.1.0": - version: 2.3.0 - resolution: "punycode@npm:2.3.0" - checksum: 39f760e09a2a3bbfe8f5287cf733ecdad69d6af2fe6f97ca95f24b8921858b91e9ea3c9eeec6e08cede96181b3bb33f95c6ffd8c77e63986508aa2e8159fa200 - languageName: node - linkType: hard - -"queue-microtask@npm:^1.2.2": - version: 1.2.3 - resolution: "queue-microtask@npm:1.2.3" - checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 - languageName: node - linkType: hard - -"readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": - version: 3.6.2 - resolution: "readable-stream@npm:3.6.2" - dependencies: - inherits: ^2.0.3 - string_decoder: ^1.1.1 - util-deprecate: ^1.0.1 - checksum: bdcbe6c22e846b6af075e32cf8f4751c2576238c5043169a1c221c92ee2878458a816a4ea33f4c67623c0b6827c8a400409bfb3cf0bf3381392d0b1dfb52ac8d - languageName: node - linkType: hard - -"readdirp@npm:~3.6.0": - version: 3.6.0 - resolution: "readdirp@npm:3.6.0" - dependencies: - picomatch: ^2.2.1 - checksum: 1ced032e6e45670b6d7352d71d21ce7edf7b9b928494dcaba6f11fba63180d9da6cd7061ebc34175ffda6ff529f481818c962952004d273178acd70f7059b320 - languageName: node - linkType: hard - -"reporter@workspace:.": - version: 0.0.0-use.local - resolution: "reporter@workspace:." - dependencies: - "@chainsafe/persistent-merkle-tree": ^0.6.1 - "@chainsafe/ssz": ^0.14.0 - "@ethereumjs/rlp": ^5.0.1 - "@ethereumjs/trie": ^6.0.1 - "@ethereumjs/util": ^9.0.1 - "@ethereumjs/vm": ^7.1.0 - "@lodestar/types": ^1.12.0 - "@types/node": ^20.8.9 - "@types/node-cron": ^3.0.9 - "@typescript-eslint/eslint-plugin": ^6.7.5 - "@typescript-eslint/parser": ^6.7.5 - async-mutex: ^0.4.0 - axios: ^1.5.1 - dotenv: ^16.3.1 - eslint: ^8.51.0 - eslint-config-prettier: ^9.0.0 - nodemon: ^3.0.1 - patch-package: ^8.0.0 - prettier: ^3.0.3 - ts-node: ^10.9.2 - typescript: ~5.2.2 - viem: ^1.16.5 - winston: ^3.11.0 - languageName: unknown - linkType: soft - -"resolve-from@npm:^4.0.0": - version: 4.0.0 - resolution: "resolve-from@npm:4.0.0" - checksum: f4ba0b8494846a5066328ad33ef8ac173801a51739eb4d63408c847da9a2e1c1de1e6cbbf72699211f3d13f8fc1325648b169bd15eb7da35688e30a5fb0e4a7f - languageName: node - linkType: hard - -"retry@npm:^0.12.0": - version: 0.12.0 - resolution: "retry@npm:0.12.0" - checksum: 623bd7d2e5119467ba66202d733ec3c2e2e26568074923bc0585b6b99db14f357e79bdedb63cab56cec47491c4a0da7e6021a7465ca6dc4f481d3898fdd3158c - languageName: node - linkType: hard - -"reusify@npm:^1.0.4": - version: 1.0.4 - resolution: "reusify@npm:1.0.4" - checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc - languageName: node - linkType: hard - -"rimraf@npm:^2.6.3": - version: 2.7.1 - resolution: "rimraf@npm:2.7.1" - dependencies: - glob: ^7.1.3 - bin: - rimraf: ./bin.js - checksum: cdc7f6eacb17927f2a075117a823e1c5951792c6498ebcce81ca8203454a811d4cf8900314154d3259bb8f0b42ab17f67396a8694a54cae3283326e57ad250cd - languageName: node - linkType: hard - -"rimraf@npm:^3.0.2": - version: 3.0.2 - resolution: "rimraf@npm:3.0.2" - dependencies: - glob: ^7.1.3 - bin: - rimraf: bin.js - checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 - languageName: node - linkType: hard - -"run-parallel@npm:^1.1.9": - version: 1.2.0 - resolution: "run-parallel@npm:1.2.0" - dependencies: - queue-microtask: ^1.2.2 - checksum: cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d - languageName: node - linkType: hard - -"rustbn-wasm@npm:^0.2.0": - version: 0.2.0 - resolution: "rustbn-wasm@npm:0.2.0" - dependencies: - "@scure/base": ^1.1.1 - checksum: 9cf89ce88a9d161bce8ea2516b3037fe97e1debb2e9b86d6f3cd133e2c120c844644d37c61c27ae00475e49595a397e61559431875a61c5c52a04c40ba658872 - languageName: node - linkType: hard - -"safe-buffer@npm:~5.1.1": - version: 5.1.2 - resolution: "safe-buffer@npm:5.1.2" - checksum: f2f1f7943ca44a594893a852894055cf619c1fbcb611237fc39e461ae751187e7baf4dc391a72125e0ac4fb2d8c5c0b3c71529622e6a58f46b960211e704903c - languageName: node - linkType: hard - -"safe-buffer@npm:~5.2.0": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 - languageName: node - linkType: hard - -"safe-stable-stringify@npm:^2.3.1": - version: 2.4.3 - resolution: "safe-stable-stringify@npm:2.4.3" - checksum: 3aeb64449706ee1f5ad2459fc99648b131d48e7a1fbb608d7c628020177512dc9d94108a5cb61bbc953985d313d0afea6566d243237743e02870490afef04b43 - languageName: node - linkType: hard - -"safer-buffer@npm:>= 2.1.2 < 3.0.0": - version: 2.1.2 - resolution: "safer-buffer@npm:2.1.2" - checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 - languageName: node - linkType: hard - -"semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4": - version: 7.5.4 - resolution: "semver@npm:7.5.4" - dependencies: - lru-cache: ^6.0.0 - bin: - semver: bin/semver.js - checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 - languageName: node - linkType: hard - -"set-blocking@npm:^2.0.0": - version: 2.0.0 - resolution: "set-blocking@npm:2.0.0" - checksum: 6e65a05f7cf7ebdf8b7c75b101e18c0b7e3dff4940d480efed8aad3a36a4005140b660fa1d804cb8bce911cac290441dc728084a30504d3516ac2ff7ad607b02 - languageName: node - linkType: hard - -"set-function-length@npm:^1.2.1": - version: 1.2.2 - resolution: "set-function-length@npm:1.2.2" - 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 - checksum: a8248bdacdf84cb0fab4637774d9fb3c7a8e6089866d04c817583ff48e14149c87044ce683d7f50759a8c50fb87c7a7e173535b06169c87ef76f5fb276dfff72 - languageName: node - linkType: hard - -"shebang-command@npm:^2.0.0": - version: 2.0.0 - resolution: "shebang-command@npm:2.0.0" - dependencies: - shebang-regex: ^3.0.0 - checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa - languageName: node - linkType: hard - -"shebang-regex@npm:^3.0.0": - version: 3.0.0 - resolution: "shebang-regex@npm:3.0.0" - checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 - languageName: node - linkType: hard - -"signal-exit@npm:^3.0.7": - version: 3.0.7 - resolution: "signal-exit@npm:3.0.7" - checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 - languageName: node - linkType: hard - -"signal-exit@npm:^4.0.1": - version: 4.1.0 - resolution: "signal-exit@npm:4.1.0" - checksum: 64c757b498cb8629ffa5f75485340594d2f8189e9b08700e69199069c8e3070fb3e255f7ab873c05dc0b3cec412aea7402e10a5990cb6a050bd33ba062a6c549 - languageName: node - linkType: hard - -"simple-swizzle@npm:^0.2.2": - version: 0.2.2 - resolution: "simple-swizzle@npm:0.2.2" - dependencies: - is-arrayish: ^0.3.1 - checksum: a7f3f2ab5c76c4472d5c578df892e857323e452d9f392e1b5cf74b74db66e6294a1e1b8b390b519fa1b96b5b613f2a37db6cffef52c3f1f8f3c5ea64eb2d54c0 - languageName: node - linkType: hard - -"simple-update-notifier@npm:^2.0.0": - version: 2.0.0 - resolution: "simple-update-notifier@npm:2.0.0" - dependencies: - semver: ^7.5.3 - checksum: 9ba00d38ce6a29682f64a46213834e4eb01634c2f52c813a9a7b8873ca49cdbb703696f3290f3b27dc067de6d9418b0b84bef22c3eb074acf352529b2d6c27fd - languageName: node - linkType: hard - -"slash@npm:^2.0.0": - version: 2.0.0 - resolution: "slash@npm:2.0.0" - checksum: 512d4350735375bd11647233cb0e2f93beca6f53441015eea241fe784d8068281c3987fbaa93e7ef1c38df68d9c60013045c92837423c69115297d6169aa85e6 - languageName: node - linkType: hard - -"slash@npm:^3.0.0": - version: 3.0.0 - resolution: "slash@npm:3.0.0" - checksum: 94a93fff615f25a999ad4b83c9d5e257a7280c90a32a7cb8b4a87996e4babf322e469c42b7f649fd5796edd8687652f3fb452a86dc97a816f01113183393f11c - languageName: node - linkType: hard - -"smart-buffer@npm:^4.2.0": - version: 4.2.0 - resolution: "smart-buffer@npm:4.2.0" - checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b - languageName: node - linkType: hard - -"socks-proxy-agent@npm:^7.0.0": - version: 7.0.0 - resolution: "socks-proxy-agent@npm:7.0.0" - dependencies: - agent-base: ^6.0.2 - debug: ^4.3.3 - socks: ^2.6.2 - checksum: 720554370154cbc979e2e9ce6a6ec6ced205d02757d8f5d93fe95adae454fc187a5cbfc6b022afab850a5ce9b4c7d73e0f98e381879cf45f66317a4895953846 - languageName: node - linkType: hard - -"socks@npm:^2.6.2": - version: 2.7.1 - resolution: "socks@npm:2.7.1" - dependencies: - ip: ^2.0.0 - smart-buffer: ^4.2.0 - checksum: 259d9e3e8e1c9809a7f5c32238c3d4d2a36b39b83851d0f573bfde5f21c4b1288417ce1af06af1452569cd1eb0841169afd4998f0e04ba04656f6b7f0e46d748 - languageName: node - linkType: hard - -"ssri@npm:^10.0.0": - version: 10.0.5 - resolution: "ssri@npm:10.0.5" - dependencies: - minipass: ^7.0.3 - checksum: 0a31b65f21872dea1ed3f7c200d7bc1c1b91c15e419deca14f282508ba917cbb342c08a6814c7f68ca4ca4116dd1a85da2bbf39227480e50125a1ceffeecb750 - languageName: node - linkType: hard - -"stack-trace@npm:0.0.x": - version: 0.0.10 - resolution: "stack-trace@npm:0.0.10" - checksum: 473036ad32f8c00e889613153d6454f9be0536d430eb2358ca51cad6b95cea08a3cc33cc0e34de66b0dad221582b08ed2e61ef8e13f4087ab690f388362d6610 - languageName: node - linkType: hard - -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.3": - version: 4.2.3 - resolution: "string-width@npm:4.2.3" - dependencies: - emoji-regex: ^8.0.0 - is-fullwidth-code-point: ^3.0.0 - strip-ansi: ^6.0.1 - checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb - languageName: node - linkType: hard - -"string-width@npm:^5.0.1, string-width@npm:^5.1.2": - version: 5.1.2 - resolution: "string-width@npm:5.1.2" - dependencies: - eastasianwidth: ^0.2.0 - emoji-regex: ^9.2.2 - strip-ansi: ^7.0.1 - checksum: 7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 - languageName: node - linkType: hard - -"string_decoder@npm:^1.1.1": - version: 1.3.0 - resolution: "string_decoder@npm:1.3.0" - dependencies: - safe-buffer: ~5.2.0 - checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 - languageName: node - linkType: hard - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": - version: 6.0.1 - resolution: "strip-ansi@npm:6.0.1" - dependencies: - ansi-regex: ^5.0.1 - checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c - languageName: node - linkType: hard - -"strip-ansi@npm:^7.0.1": - version: 7.1.0 - resolution: "strip-ansi@npm:7.1.0" - dependencies: - ansi-regex: ^6.0.1 - checksum: 859c73fcf27869c22a4e4d8c6acfe690064659e84bef9458aa6d13719d09ca88dcfd40cbf31fd0be63518ea1a643fe070b4827d353e09533a5b0b9fd4553d64d - languageName: node - linkType: hard - -"strip-json-comments@npm:^3.1.1": - version: 3.1.1 - resolution: "strip-json-comments@npm:3.1.1" - checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 - languageName: node - linkType: hard - -"supports-color@npm:^5.5.0": - version: 5.5.0 - resolution: "supports-color@npm:5.5.0" - dependencies: - has-flag: ^3.0.0 - checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac - languageName: node - linkType: hard - -"supports-color@npm:^7.1.0": - version: 7.2.0 - resolution: "supports-color@npm:7.2.0" - dependencies: - has-flag: ^4.0.0 - checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a - languageName: node - linkType: hard - -"tar@npm:^6.1.11, tar@npm:^6.1.2": - version: 6.2.0 - resolution: "tar@npm:6.2.0" - dependencies: - chownr: ^2.0.0 - fs-minipass: ^2.0.0 - minipass: ^5.0.0 - minizlib: ^2.1.1 - mkdirp: ^1.0.3 - yallist: ^4.0.0 - checksum: db4d9fe74a2082c3a5016630092c54c8375ff3b280186938cfd104f2e089c4fd9bad58688ef6be9cf186a889671bf355c7cda38f09bbf60604b281715ca57f5c - languageName: node - linkType: hard - -"text-hex@npm:1.0.x": - version: 1.0.0 - resolution: "text-hex@npm:1.0.0" - checksum: 1138f68adc97bf4381a302a24e2352f04992b7b1316c5003767e9b0d3367ffd0dc73d65001ea02b07cd0ecc2a9d186de0cf02f3c2d880b8a522d4ccb9342244a - languageName: node - linkType: hard - -"text-table@npm:^0.2.0": - version: 0.2.0 - resolution: "text-table@npm:0.2.0" - checksum: b6937a38c80c7f84d9c11dd75e49d5c44f71d95e810a3250bd1f1797fc7117c57698204adf676b71497acc205d769d65c16ae8fa10afad832ae1322630aef10a - languageName: node - linkType: hard - -"tmp@npm:^0.0.33": - version: 0.0.33 - resolution: "tmp@npm:0.0.33" - dependencies: - os-tmpdir: ~1.0.2 - checksum: 902d7aceb74453ea02abbf58c203f4a8fc1cead89b60b31e354f74ed5b3fb09ea817f94fb310f884a5d16987dd9fa5a735412a7c2dd088dd3d415aa819ae3a28 - languageName: node - linkType: hard - -"to-regex-range@npm:^5.0.1": - version: 5.0.1 - resolution: "to-regex-range@npm:5.0.1" - dependencies: - is-number: ^7.0.0 - checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed - languageName: node - linkType: hard - -"touch@npm:^3.1.0": - version: 3.1.0 - resolution: "touch@npm:3.1.0" - dependencies: - nopt: ~1.0.10 - bin: - nodetouch: ./bin/nodetouch.js - checksum: e0be589cb5b0e6dbfce6e7e077d4a0d5f0aba558ef769c6d9c33f635e00d73d5be49da6f8631db302ee073919d82b5b7f56da2987feb28765c95a7673af68647 - languageName: node - linkType: hard - -"triple-beam@npm:^1.3.0": - version: 1.4.1 - resolution: "triple-beam@npm:1.4.1" - checksum: 2e881a3e8e076b6f2b85b9ec9dd4a900d3f5016e6d21183ed98e78f9abcc0149e7d54d79a3f432b23afde46b0885bdcdcbff789f39bc75de796316961ec07f61 - languageName: node - linkType: hard - -"ts-api-utils@npm:^1.0.1": - version: 1.0.3 - resolution: "ts-api-utils@npm:1.0.3" - peerDependencies: - typescript: ">=4.2.0" - checksum: 441cc4489d65fd515ae6b0f4eb8690057add6f3b6a63a36073753547fb6ce0c9ea0e0530220a0b282b0eec535f52c4dfc315d35f8a4c9a91c0def0707a714ca6 - languageName: node - linkType: hard - -"ts-node@npm:^10.9.2": - version: 10.9.2 - resolution: "ts-node@npm:10.9.2" - dependencies: - "@cspotcode/source-map-support": ^0.8.0 - "@tsconfig/node10": ^1.0.7 - "@tsconfig/node12": ^1.0.7 - "@tsconfig/node14": ^1.0.0 - "@tsconfig/node16": ^1.0.2 - acorn: ^8.4.1 - acorn-walk: ^8.1.1 - arg: ^4.1.0 - create-require: ^1.1.0 - diff: ^4.0.1 - make-error: ^1.1.1 - v8-compile-cache-lib: ^3.0.1 - yn: 3.1.1 - peerDependencies: - "@swc/core": ">=1.2.50" - "@swc/wasm": ">=1.2.50" - "@types/node": "*" - typescript: ">=2.7" - peerDependenciesMeta: - "@swc/core": - optional: true - "@swc/wasm": - optional: true - bin: - ts-node: dist/bin.js - ts-node-cwd: dist/bin-cwd.js - ts-node-esm: dist/bin-esm.js - ts-node-script: dist/bin-script.js - ts-node-transpile-only: dist/bin-transpile.js - ts-script: dist/bin-script-deprecated.js - checksum: fde256c9073969e234526e2cfead42591b9a2aec5222bac154b0de2fa9e4ceb30efcd717ee8bc785a56f3a119bdd5aa27b333d9dbec94ed254bd26f8944c67ac - languageName: node - linkType: hard - -"tslib@npm:2.4.0": - version: 2.4.0 - resolution: "tslib@npm:2.4.0" - checksum: 8c4aa6a3c5a754bf76aefc38026134180c053b7bd2f81338cb5e5ebf96fefa0f417bff221592bf801077f5bf990562f6264fecbc42cd3309b33872cb6fc3b113 - languageName: node - linkType: hard - -"tslib@npm:^2.4.0": - version: 2.6.2 - resolution: "tslib@npm:2.6.2" - checksum: 329ea56123005922f39642318e3d1f0f8265d1e7fcb92c633e0809521da75eeaca28d2cf96d7248229deb40e5c19adf408259f4b9640afd20d13aecc1430f3ad - languageName: node - linkType: hard - -"type-check@npm:^0.4.0, type-check@npm:~0.4.0": - version: 0.4.0 - resolution: "type-check@npm:0.4.0" - dependencies: - prelude-ls: ^1.2.1 - checksum: ec688ebfc9c45d0c30412e41ca9c0cdbd704580eb3a9ccf07b9b576094d7b86a012baebc95681999dd38f4f444afd28504cb3a89f2ef16b31d4ab61a0739025a - languageName: node - linkType: hard - -"type-fest@npm:^0.20.2": - version: 0.20.2 - resolution: "type-fest@npm:0.20.2" - checksum: 4fb3272df21ad1c552486f8a2f8e115c09a521ad7a8db3d56d53718d0c907b62c6e9141ba5f584af3f6830d0872c521357e512381f24f7c44acae583ad517d73 - languageName: node - linkType: hard - -"typescript@npm:~5.2.2": - version: 5.2.2 - resolution: "typescript@npm:5.2.2" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 7912821dac4d962d315c36800fe387cdc0a6298dba7ec171b350b4a6e988b51d7b8f051317786db1094bd7431d526b648aba7da8236607febb26cf5b871d2d3c - languageName: node - linkType: hard - -"typescript@patch:typescript@~5.2.2#~builtin": - version: 5.2.2 - resolution: "typescript@patch:typescript@npm%3A5.2.2#~builtin::version=5.2.2&hash=f456af" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 07106822b4305de3f22835cbba949a2b35451cad50888759b6818421290ff95d522b38ef7919e70fb381c5fe9c1c643d7dea22c8b31652a717ddbd57b7f4d554 - languageName: node - linkType: hard - -"undefsafe@npm:^2.0.5": - version: 2.0.5 - resolution: "undefsafe@npm:2.0.5" - checksum: f42ab3b5770fedd4ada175fc1b2eb775b78f609156f7c389106aafd231bfc210813ee49f54483d7191d7b76e483bc7f537b5d92d19ded27156baf57592eb02cc - languageName: node - linkType: hard - -"undici-types@npm:~5.26.4": - version: 5.26.5 - resolution: "undici-types@npm:5.26.5" - checksum: 3192ef6f3fd5df652f2dc1cd782b49d6ff14dc98e5dced492aa8a8c65425227da5da6aafe22523c67f035a272c599bb89cfe803c1db6311e44bed3042fc25487 - languageName: node - linkType: hard - -"unique-filename@npm:^3.0.0": - version: 3.0.0 - resolution: "unique-filename@npm:3.0.0" - dependencies: - unique-slug: ^4.0.0 - checksum: 8e2f59b356cb2e54aab14ff98a51ac6c45781d15ceaab6d4f1c2228b780193dc70fae4463ce9e1df4479cb9d3304d7c2043a3fb905bdeca71cc7e8ce27e063df - languageName: node - linkType: hard - -"unique-slug@npm:^4.0.0": - version: 4.0.0 - resolution: "unique-slug@npm:4.0.0" - dependencies: - imurmurhash: ^0.1.4 - checksum: 0884b58365af59f89739e6f71e3feacb5b1b41f2df2d842d0757933620e6de08eff347d27e9d499b43c40476cbaf7988638d3acb2ffbcb9d35fd035591adfd15 - languageName: node - linkType: hard - -"universalify@npm:^2.0.0": - version: 2.0.1 - resolution: "universalify@npm:2.0.1" - checksum: ecd8469fe0db28e7de9e5289d32bd1b6ba8f7183db34f3bfc4ca53c49891c2d6aa05f3fb3936a81285a905cc509fb641a0c3fc131ec786167eff41236ae32e60 - languageName: node - linkType: hard - -"uri-js@npm:^4.2.2": - version: 4.4.1 - resolution: "uri-js@npm:4.4.1" - dependencies: - punycode: ^2.1.0 - checksum: 7167432de6817fe8e9e0c9684f1d2de2bb688c94388f7569f7dbdb1587c9f4ca2a77962f134ec90be0cc4d004c939ff0d05acc9f34a0db39a3c797dada262633 - languageName: node - linkType: hard - -"util-deprecate@npm:^1.0.1": - version: 1.0.2 - resolution: "util-deprecate@npm:1.0.2" - checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 - languageName: node - linkType: hard - -"v8-compile-cache-lib@npm:^3.0.1": - version: 3.0.1 - resolution: "v8-compile-cache-lib@npm:3.0.1" - checksum: 78089ad549e21bcdbfca10c08850022b22024cdcc2da9b168bcf5a73a6ed7bf01a9cebb9eac28e03cd23a684d81e0502797e88f3ccd27a32aeab1cfc44c39da0 - languageName: node - linkType: hard - -"viem@npm:^1.16.5": - version: 1.17.1 - resolution: "viem@npm:1.17.1" - dependencies: - "@adraffy/ens-normalize": 1.9.4 - "@noble/curves": 1.2.0 - "@noble/hashes": 1.3.2 - "@scure/bip32": 1.3.2 - "@scure/bip39": 1.2.1 - abitype: 0.9.8 - isows: 1.0.3 - ws: 8.13.0 - peerDependencies: - typescript: ">=5.0.4" - peerDependenciesMeta: - typescript: - optional: true - checksum: 040225bbc4714c2ebaaa9593cc1abad3367ed6c6413b9c3b8cc4dd6478ff788abd7d81afd396facdc468f6c8e7a7411c55234f25ea7cc8f0004923535f5f5411 - languageName: node - linkType: hard - -"which@npm:^2.0.1, which@npm:^2.0.2": - version: 2.0.2 - resolution: "which@npm:2.0.2" - dependencies: - isexe: ^2.0.0 - bin: - node-which: ./bin/node-which - checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 - languageName: node - linkType: hard - -"wide-align@npm:^1.1.5": - version: 1.1.5 - resolution: "wide-align@npm:1.1.5" - dependencies: - string-width: ^1.0.2 || 2 || 3 || 4 - checksum: d5fc37cd561f9daee3c80e03b92ed3e84d80dde3365a8767263d03dacfc8fa06b065ffe1df00d8c2a09f731482fcacae745abfbb478d4af36d0a891fad4834d3 - languageName: node - linkType: hard - -"winston-transport@npm:^4.5.0": - version: 4.6.0 - resolution: "winston-transport@npm:4.6.0" - dependencies: - logform: ^2.3.2 - readable-stream: ^3.6.0 - triple-beam: ^1.3.0 - checksum: 19f06ebdbb57cb14cdd48a23145d418d3bbe538851053303f84f04a8a849bb530b78b1495a175059c1299f92945dc61d5421c4914fee32d9a41bc397d84f26d7 - languageName: node - linkType: hard - -"winston@npm:^3.11.0": - version: 3.11.0 - resolution: "winston@npm:3.11.0" - dependencies: - "@colors/colors": ^1.6.0 - "@dabh/diagnostics": ^2.0.2 - async: ^3.2.3 - is-stream: ^2.0.0 - logform: ^2.4.0 - one-time: ^1.0.0 - readable-stream: ^3.4.0 - safe-stable-stringify: ^2.3.1 - stack-trace: 0.0.x - triple-beam: ^1.3.0 - winston-transport: ^4.5.0 - checksum: ca4454070f7a71b19f53c8c1765c59a013dab220edb49161b2e81917751d3e9edc3382430e4fb050feda04fb8463290ecab7cbc9240ec8d3d3b32a121849bbb0 - languageName: node - linkType: hard - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version: 7.0.0 - resolution: "wrap-ansi@npm:7.0.0" - dependencies: - ansi-styles: ^4.0.0 - string-width: ^4.1.0 - strip-ansi: ^6.0.0 - checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b - languageName: node - linkType: hard - -"wrap-ansi@npm:^8.1.0": - version: 8.1.0 - resolution: "wrap-ansi@npm:8.1.0" - dependencies: - ansi-styles: ^6.1.0 - string-width: ^5.0.1 - strip-ansi: ^7.0.1 - checksum: 371733296dc2d616900ce15a0049dca0ef67597d6394c57347ba334393599e800bab03c41d4d45221b6bc967b8c453ec3ae4749eff3894202d16800fdfe0e238 - languageName: node - linkType: hard - -"wrappy@npm:1": - version: 1.0.2 - resolution: "wrappy@npm:1.0.2" - checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 - languageName: node - linkType: hard - -"ws@npm:8.13.0": - version: 8.13.0 - resolution: "ws@npm:8.13.0" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 53e991bbf928faf5dc6efac9b8eb9ab6497c69feeb94f963d648b7a3530a720b19ec2e0ec037344257e05a4f35bd9ad04d9de6f289615ffb133282031b18c61c - languageName: node - linkType: hard - -"ws@npm:8.5.0": - version: 8.5.0 - resolution: "ws@npm:8.5.0" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 76f2f90e40344bf18fd544194e7067812fb1372b2a37865678d8f12afe4b478ff2ebc0c7c0aff82cd5e6b66fc43d889eec0f1865c2365d8f7a66d92da7744a77 - languageName: node - linkType: hard - -"yallist@npm:^4.0.0": - version: 4.0.0 - resolution: "yallist@npm:4.0.0" - checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 - languageName: node - linkType: hard - -"yaml@npm:^2.2.2": - version: 2.4.5 - resolution: "yaml@npm:2.4.5" - bin: - yaml: bin.mjs - checksum: f8efd407c07e095f00f3031108c9960b2b12971d10162b1ec19007200f6c987d2e28f73283f4731119aa610f177a3ea03d4a8fcf640600a25de1b74d00c69b3d - languageName: node - linkType: hard - -"yn@npm:3.1.1": - version: 3.1.1 - resolution: "yn@npm:3.1.1" - checksum: 2c487b0e149e746ef48cda9f8bad10fc83693cd69d7f9dcd8be4214e985de33a29c9e24f3c0d6bcf2288427040a8947406ab27f7af67ee9456e6b84854f02dd6 - languageName: node - linkType: hard - -"yocto-queue@npm:^0.1.0": - version: 0.1.0 - resolution: "yocto-queue@npm:0.1.0" - checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 - languageName: node - linkType: hard From 681a16f5c103149a85d3e3174afd8b39da6dde2d Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Fri, 20 Sep 2024 11:30:54 +0800 Subject: [PATCH 266/297] refactor(reporter,relayer,executor): dockerfile and docker-compose.yml for better monorepo support --- Dockerfile.executor | 30 ------------------------------ Dockerfile.relayer | 30 ------------------------------ docker-compose.yml | 31 ++++++++++++++++--------------- packages/executor/Dockerfile | 23 +++++++++++++++++++++++ packages/relayer/Dockerfile | 23 +++++++++++++++++++++++ packages/reporter/Dockerfile | 2 +- 6 files changed, 63 insertions(+), 76 deletions(-) delete mode 100644 Dockerfile.executor delete mode 100644 Dockerfile.relayer create mode 100644 packages/executor/Dockerfile create mode 100644 packages/relayer/Dockerfile diff --git a/Dockerfile.executor b/Dockerfile.executor deleted file mode 100644 index c3404b9f..00000000 --- a/Dockerfile.executor +++ /dev/null @@ -1,30 +0,0 @@ -FROM node:18-alpine - -WORKDIR /usr/src/app -COPY package.json yarn.lock ./ - -COPY packages/common/package.json ./packages/common/ -COPY packages/executor/package.json ./packages/executor/ - -RUN yarn install --ignore-scripts - -WORKDIR /usr/src/app/packages/common -RUN yarn install --ignore-scripts - -WORKDIR /usr/src/app/packages/executor -RUN yarn install --ignore-scripts - -WORKDIR /usr/src/app - -COPY packages/common/ ./packages/common/ -COPY packages/executor/ ./packages/executor/ - -WORKDIR /usr/src/app/packages/common -RUN yarn compile - - - -WORKDIR /usr/src/app/packages/executor -RUN yarn compile - -CMD ["yarn", "start"] \ No newline at end of file diff --git a/Dockerfile.relayer b/Dockerfile.relayer deleted file mode 100644 index f2d4479a..00000000 --- a/Dockerfile.relayer +++ /dev/null @@ -1,30 +0,0 @@ -FROM node:18-alpine - -WORKDIR /usr/src/app -COPY package.json yarn.lock ./ - -COPY packages/common/package.json ./packages/common/ -COPY packages/relayer/package.json ./packages/relayer/ - -RUN yarn install --ignore-scripts - -WORKDIR /usr/src/app/packages/common -RUN yarn install --ignore-scripts - -WORKDIR /usr/src/app/packages/relayer -RUN yarn install --ignore-scripts - -WORKDIR /usr/src/app - -COPY packages/common/ ./packages/common/ -COPY packages/relayer/ ./packages/relayer/ - -WORKDIR /usr/src/app/packages/common -RUN yarn compile - - - -WORKDIR /usr/src/app/packages/relayer -RUN yarn compile - -CMD ["yarn", "start"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 80025ddb..f19e6bdb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,38 +2,39 @@ version: "3.8" services: mongodb: - image: mongo:latest - container_name: mongodb - ports: - - "27017:27017" - networks: - - mongo-network - volumes: - - mongo-data:/data/db + image: mongo:latest + container_name: mongodb + ports: + - "27017:27017" + networks: + - mongo-network + volumes: + - mongo-data:/data/db - executor: + relayer: build: context: . - dockerfile: Dockerfile.executor - container_name: executor + dockerfile: packages/relayer/Dockerfile + container_name: relayer networks: - mongo-network depends_on: - mongodb - relayer: + executor: build: context: . - dockerfile: Dockerfile.relayer - container_name: hashi-relayer + dockerfile: packages/executor/Dockerfile + container_name: executor networks: - mongo-network depends_on: - mongodb + networks: mongo-network: driver: bridge volumes: mongo-data: - driver: local + driver: local \ No newline at end of file diff --git a/packages/executor/Dockerfile b/packages/executor/Dockerfile new file mode 100644 index 00000000..9c01c83b --- /dev/null +++ b/packages/executor/Dockerfile @@ -0,0 +1,23 @@ +FROM node:18-alpine + +WORKDIR /usr/src/app + +# Copy root package.json and yarn.lock for dependency resolution +COPY ../../package.json ../../yarn.lock ./ + +# Copy both executor and common package folders +COPY ./packages/common ./packages/common +COPY ./packages/executor ./packages/executor + + +# Install dependencies at root level +RUN yarn install + +# Compile both common and executor packages +WORKDIR /usr/src/app/packages/common +RUN yarn compile + +WORKDIR /usr/src/app/packages/executor +RUN yarn compile + +CMD ["yarn", "start"] \ No newline at end of file diff --git a/packages/relayer/Dockerfile b/packages/relayer/Dockerfile new file mode 100644 index 00000000..aec8ea25 --- /dev/null +++ b/packages/relayer/Dockerfile @@ -0,0 +1,23 @@ +FROM node:18-alpine + +WORKDIR /usr/src/app + +# Copy root package.json and yarn.lock for dependency resolution +COPY ../../package.json ../../yarn.lock ./ + +# Copy both executor and common package folders +COPY ./packages/common ./packages/common +COPY ./packages/relayer ./packages/relayer + + +# Install dependencies at root level +RUN yarn install + +# Compile both common and executor packages +WORKDIR /usr/src/app/packages/common +RUN yarn compile + +WORKDIR /usr/src/app/packages/relayer +RUN yarn compile + +CMD ["yarn", "start"] \ No newline at end of file diff --git a/packages/reporter/Dockerfile b/packages/reporter/Dockerfile index b251100d..035d9c21 100644 --- a/packages/reporter/Dockerfile +++ b/packages/reporter/Dockerfile @@ -2,7 +2,7 @@ FROM node:18-alpine WORKDIR /usr/src/app -COPY package.json yarn.lock .env ./ +COPY package.json .env ./ RUN corepack enable && \ corepack prepare --activate yarn@3.2.2 && \ From 77ff55ce812b1f0c4ff494425b84059a7ed29fd3 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Fri, 20 Sep 2024 07:23:18 +0200 Subject: [PATCH 267/297] chore(reporter): <- makes it to be part of the workspaces --- packages/reporter/package.json | 2 +- yarn.lock | 396 ++++++++++++++++++++++++++++++++- 2 files changed, 391 insertions(+), 7 deletions(-) diff --git a/packages/reporter/package.json b/packages/reporter/package.json index 5d6868a2..b8cfb84f 100644 --- a/packages/reporter/package.json +++ b/packages/reporter/package.json @@ -1,5 +1,6 @@ { "name": "reporter", + "version": "0.1.0", "author": { "name": "gnosis", "url": "https://github.com/gnosis" @@ -12,7 +13,6 @@ "prettier:write": "prettier --write \"**/*.{js,json,md,sol,ts,yml}\"", "start:dev": "nodemon" }, - "packageManager": "yarn@3.2.2", "dependencies": { "@chainsafe/persistent-merkle-tree": "^0.6.1", "@chainsafe/ssz": "^0.14.0", diff --git a/yarn.lock b/yarn.lock index 6ca9774b..3da8cd17 100644 --- a/yarn.lock +++ b/yarn.lock @@ -154,11 +154,54 @@ "@openzeppelin/contracts-upgradeable-4.7.3" "npm:@openzeppelin/contracts-upgradeable@v4.7.3" "@openzeppelin/contracts-v0.7" "npm:@openzeppelin/contracts@v3.4.2" +"@chainsafe/as-sha256@0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@chainsafe/as-sha256/-/as-sha256-0.5.0.tgz#2523fbef2b80b5000f9aa71f4a76e5c2c5c076bb" + integrity sha512-dTIY6oUZNdC5yDTVP5Qc9hAlKAsn0QTQ2DnQvvsbTnKSTbYs3p5RPN0aIUqN0liXei/9h24c7V0dkV44cnWIQA== + "@chainsafe/as-sha256@^0.3.1": version "0.3.1" resolved "https://registry.yarnpkg.com/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz#3639df0e1435cab03f4d9870cc3ac079e57a6fc9" integrity sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg== +"@chainsafe/as-sha256@^0.4.1": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@chainsafe/as-sha256/-/as-sha256-0.4.2.tgz#21ad1371e2245e430c1a554a05f10d333c6f42cc" + integrity sha512-HJ8GZBRjLeWtRsAXf3EbNsNzmTGpzTFjfpSf4yHkLYC+E52DhT6hwz+7qpj6I/EmFzSUm5tYYvT9K8GZokLQCQ== + +"@chainsafe/hashtree-darwin-arm64@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@chainsafe/hashtree-darwin-arm64/-/hashtree-darwin-arm64-1.0.1.tgz#e2c60090c56a1c8dc8bdff329856184ad32e4cd5" + integrity sha512-+KmEgQMpO7FDL3klAcpXbQ4DPZvfCe0qSaBBrtT4vLF8V1JGm3sp+j7oibtxtOsLKz7nJMiK1pZExi7vjXu8og== + +"@chainsafe/hashtree-linux-arm64-gnu@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@chainsafe/hashtree-linux-arm64-gnu/-/hashtree-linux-arm64-gnu-1.0.1.tgz#49d2604a6c9106219448af3eaf76f4da6e44daca" + integrity sha512-p1hnhGq2aFY+Zhdn1Q6L/6yLYNKjqXfn/Pc8jiM0e3+Lf/hB+yCdqYVu1pto26BrZjugCFZfupHaL4DjUTDttw== + +"@chainsafe/hashtree-linux-x64-gnu@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@chainsafe/hashtree-linux-x64-gnu/-/hashtree-linux-x64-gnu-1.0.1.tgz#31c5a2bb196b78f04f2bf4bfb5c1bf1f3331f071" + integrity sha512-uCIGuUWuWV0LiB4KLMy6JFa7Jp6NmPl3hKF5BYWu8TzUBe7vSXMZfqTzGxXPggFYN2/0KymfRdG9iDCOJfGRqg== + +"@chainsafe/hashtree@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@chainsafe/hashtree/-/hashtree-1.0.1.tgz#587666a261e1da6a37904095ce875fddc53c7c89" + integrity sha512-bleu9FjqBeR/l6W1u2Lz+HsS0b0LLJX2eUt3hOPBN7VqOhidx8wzkVh2S7YurS+iTQtfdK4K5QU9tcTGNrGwDg== + optionalDependencies: + "@chainsafe/hashtree-darwin-arm64" "1.0.1" + "@chainsafe/hashtree-linux-arm64-gnu" "1.0.1" + "@chainsafe/hashtree-linux-x64-gnu" "1.0.1" + +"@chainsafe/persistent-merkle-tree@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.8.0.tgz#18e2f0a5de3a0b59c6e5be8797a78e0d209dd7dc" + integrity sha512-hh6C1JO6SKlr0QGNTNtTLqgGVMA/Bc20wD6CeMHp+wqbFKCULRJuBUxhF4WDx/7mX8QlqF3nFriF/Eo8oYJ4/A== + dependencies: + "@chainsafe/as-sha256" "0.5.0" + "@chainsafe/hashtree" "1.0.1" + "@noble/hashes" "^1.3.0" + "@chainsafe/persistent-merkle-tree@^0.4.2": version "0.4.2" resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz#4c9ee80cc57cd3be7208d98c40014ad38f36f7ff" @@ -173,6 +216,14 @@ dependencies: "@chainsafe/as-sha256" "^0.3.1" +"@chainsafe/persistent-merkle-tree@^0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.6.1.tgz#37bde25cf6cbe1660ad84311aa73157dc86ec7f2" + integrity sha512-gcENLemRR13+1MED2NeZBMA7FRS0xQPM7L2vhMqvKkjqtFT4YfjSVADq5U0iLuQLhFUJEMVuA8fbv5v+TN6O9A== + dependencies: + "@chainsafe/as-sha256" "^0.4.1" + "@noble/hashes" "^1.3.0" + "@chainsafe/ssz@^0.10.0": version "0.10.2" resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.10.2.tgz#c782929e1bb25fec66ba72e75934b31fd087579e" @@ -181,6 +232,22 @@ "@chainsafe/as-sha256" "^0.3.1" "@chainsafe/persistent-merkle-tree" "^0.5.0" +"@chainsafe/ssz@^0.14.0": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.14.3.tgz#caae48ae2670b2f8b6febed22b0e0619a636f316" + integrity sha512-ldOx4Rk9OC8YMvFdwvHKtRc7KpFRLcXlb9ATCdQ5fHtLT438LRQyxdWFufC9+M8jFHSZcgq31h2BJsSva6sZ0w== + dependencies: + "@chainsafe/as-sha256" "^0.4.1" + "@chainsafe/persistent-merkle-tree" "^0.6.1" + +"@chainsafe/ssz@^0.17.1": + version "0.17.1" + resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.17.1.tgz#7986afbcad5e6971006d596fdb7dfa34bc195131" + integrity sha512-1ay46QqYcVTBvUnDXTPTi5WTiENu7tIxpZGMDpUWps1/nYBmh/We/UoCF/jO+o/fkcDD3p8xQPlHbcCfy+jyjA== + dependencies: + "@chainsafe/as-sha256" "0.5.0" + "@chainsafe/persistent-merkle-tree" "0.8.0" + "@chainsafe/ssz@^0.9.2": version "0.9.4" resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.9.4.tgz#696a8db46d6975b600f8309ad3a12f7c0e310497" @@ -507,11 +574,113 @@ bufio "^1.0.7" chai "^4.3.4" +"@ethereumjs/block@^5.1.1", "@ethereumjs/block@^5.3.0": + version "5.3.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-5.3.0.tgz#a22d615f825a3aa123189434263a6c1d43d4ac8f" + integrity sha512-cyphdEB/ywIERqWLRHdAS6muTkAcd6BibMOp6XmGbeWgvtIhe4ArxcMDI78MVstJzT/faihvRI4rKQKy+MpdKQ== + dependencies: + "@ethereumjs/common" "^4.4.0" + "@ethereumjs/rlp" "^5.0.2" + "@ethereumjs/trie" "^6.2.1" + "@ethereumjs/tx" "^5.4.0" + "@ethereumjs/util" "^9.1.0" + ethereum-cryptography "^2.2.1" + +"@ethereumjs/blockchain@^7.1.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-7.3.0.tgz#87049c61b51a0870f3c23b5390b6ff9f3e3ae7f0" + integrity sha512-UZXFb6JFeXDHobKhXGAiKf+m5n2ynCtqpgHWCl2nQ3Tol9W7C3By4UFMpAl2E6EyaFhC26Maig9kqCWxfsQ6bQ== + dependencies: + "@ethereumjs/block" "^5.3.0" + "@ethereumjs/common" "^4.4.0" + "@ethereumjs/ethash" "^3.0.4" + "@ethereumjs/rlp" "^5.0.2" + "@ethereumjs/trie" "^6.2.1" + "@ethereumjs/tx" "^5.4.0" + "@ethereumjs/util" "^9.1.0" + debug "^4.3.3" + ethereum-cryptography "^2.2.1" + lru-cache "10.1.0" + +"@ethereumjs/common@^4.2.0", "@ethereumjs/common@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-4.4.0.tgz#fba41612f527a815bf304e98653d6b5fc5d6d4de" + integrity sha512-Fy5hMqF6GsE6DpYTyqdDIJPJgUtDn4dL120zKw+Pswuo+iLyBsEYuSyzMw6NVzD2vDzcBG9fE4+qX4X2bPc97w== + dependencies: + "@ethereumjs/util" "^9.1.0" + +"@ethereumjs/ethash@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@ethereumjs/ethash/-/ethash-3.0.4.tgz#663524abbc2f5ef6fa9813067eb33808fd8a0309" + integrity sha512-dDc9h4RxEIWr38DxzeFyWlTmc++WeAFysFT6Ru0opoQ8WSM/hM3KH1VfHMPwx6JaqQT89Q/xtHV3CEvWrbwLKw== + dependencies: + "@ethereumjs/block" "^5.3.0" + "@ethereumjs/rlp" "^5.0.2" + "@ethereumjs/util" "^9.1.0" + bigint-crypto-utils "^3.2.2" + ethereum-cryptography "^2.2.1" + +"@ethereumjs/evm@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/evm/-/evm-2.2.1.tgz#07dd48152bb19277980b295a149b0936d2ff67b3" + integrity sha512-equF3QqssDgfZyVDEoMqJUsMCjO9SwgFdpUTc7yHFOU74X43l/MHM+Cqdey+wcBhdU2yOwD9S2AbW6wh7tDYfQ== + dependencies: + "@ethereumjs/common" "^4.2.0" + "@ethereumjs/statemanager" "^2.2.2" + "@ethereumjs/tx" "^5.2.1" + "@ethereumjs/util" "^9.0.2" + "@types/debug" "^4.1.9" + debug "^4.3.3" + ethereum-cryptography "^2.1.3" + rustbn-wasm "^0.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/rlp@^5.0.1", "@ethereumjs/rlp@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-5.0.2.tgz#c89bd82f2f3bec248ab2d517ae25f5bbc4aac842" + integrity sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA== + +"@ethereumjs/statemanager@^2.2.2": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/statemanager/-/statemanager-2.4.0.tgz#105feb0653942118758b3522ef05c8901d7924b3" + integrity sha512-IBe5kMGsDWlSvNg7QCERwO3BQE1c9hzVIZ9ktZF7xyifFEfA4VNhTMMEpwLuiAIy0l/ZzZiZ17/Iqar+SawMYA== + dependencies: + "@ethereumjs/common" "^4.4.0" + "@ethereumjs/rlp" "^5.0.2" + "@ethereumjs/trie" "^6.2.1" + "@ethereumjs/util" "^9.1.0" + debug "^4.3.3" + ethereum-cryptography "^2.2.1" + js-sdsl "^4.1.4" + lru-cache "10.1.0" + +"@ethereumjs/trie@^6.0.1", "@ethereumjs/trie@^6.1.1", "@ethereumjs/trie@^6.2.1": + version "6.2.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/trie/-/trie-6.2.1.tgz#11d3e91ffd7d565f468a62c0e3d7952063991fa9" + integrity sha512-MguABMVi/dPtgagK+SuY57rpXFP+Ghr2x+pBDy+e3VmMqUY+WGzFu1QWjBb5/iJ7lINk4CI2Uwsih07Nu9sTSg== + dependencies: + "@ethereumjs/rlp" "^5.0.2" + "@ethereumjs/util" "^9.1.0" + "@types/readable-stream" "^2.3.13" + debug "^4.3.4" + ethereum-cryptography "^2.2.1" + lru-cache "10.1.0" + readable-stream "^3.6.0" + +"@ethereumjs/tx@^5.2.1", "@ethereumjs/tx@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-5.4.0.tgz#6f47894cc3e2d4e63d87c62b41ed7e8180a1de58" + integrity sha512-SCHnK7m/AouZ7nyoR0MEXw1OO/tQojSbp88t8oxhwes5iZkZCtfFdUrJaiIb72qIpH2FVw6s1k1uP7LXuH7PsA== + dependencies: + "@ethereumjs/common" "^4.4.0" + "@ethereumjs/rlp" "^5.0.2" + "@ethereumjs/util" "^9.1.0" + ethereum-cryptography "^2.2.1" + "@ethereumjs/util@^8.1.0": version "8.1.0" resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-8.1.0.tgz#299df97fb6b034e0577ce9f94c7d9d1004409ed4" @@ -521,6 +690,31 @@ ethereum-cryptography "^2.0.0" micro-ftch "^0.3.1" +"@ethereumjs/util@^9.0.1", "@ethereumjs/util@^9.0.2", "@ethereumjs/util@^9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-9.1.0.tgz#75e3898a3116d21c135fa9e29886565609129bce" + integrity sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog== + dependencies: + "@ethereumjs/rlp" "^5.0.2" + ethereum-cryptography "^2.2.1" + +"@ethereumjs/vm@^7.1.0": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-7.2.1.tgz#c53610a8c327aabfdd0a5dedfe32eb3aebb17665" + integrity sha512-exmyhDPlfiBtV/nIPY7gE5iu3QC62F7hf/fALLgQaUS8ezxmJQG2MRaFI1eqYwvsAhfNBfst7K6KcCE4jbGbhw== + dependencies: + "@ethereumjs/block" "^5.1.1" + "@ethereumjs/blockchain" "^7.1.0" + "@ethereumjs/common" "^4.2.0" + "@ethereumjs/evm" "^2.2.1" + "@ethereumjs/rlp" "^5.0.2" + "@ethereumjs/statemanager" "^2.2.2" + "@ethereumjs/trie" "^6.1.1" + "@ethereumjs/tx" "^5.2.1" + "@ethereumjs/util" "^9.0.2" + debug "^4.3.3" + ethereum-cryptography "^2.1.3" + "@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" @@ -947,6 +1141,35 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@layerzerolabs/lz-evm-messagelib-v2@^2.3.29": + version "2.3.42" + resolved "https://registry.yarnpkg.com/@layerzerolabs/lz-evm-messagelib-v2/-/lz-evm-messagelib-v2-2.3.42.tgz#224e8b07940b829fc8955ec97987526da17625fd" + integrity sha512-ugCgAueNzrvp2p8LrNFlv/c5nYhDdZq5gCwJ5UzntniHf9enB4NoE3AxGYgMakh26Uckc2pQRzWlbO8+a6GD5g== + +"@layerzerolabs/lz-evm-oapp-v2@^2.3.29": + version "2.3.42" + resolved "https://registry.yarnpkg.com/@layerzerolabs/lz-evm-oapp-v2/-/lz-evm-oapp-v2-2.3.42.tgz#0cbb5095a7b7cdd1bca6f7c7cee87c7383723db4" + integrity sha512-TDhM8PGsH4nsKwXdoGDV9/USSJwOEGglsNfCUrpCs8EqkQ7rtlMDOvI60oFEebvOjxKSG9OwCcBFvXwaFf0ORQ== + +"@layerzerolabs/lz-evm-protocol-v2@^2.3.29": + version "2.3.42" + resolved "https://registry.yarnpkg.com/@layerzerolabs/lz-evm-protocol-v2/-/lz-evm-protocol-v2-2.3.42.tgz#171e2332aa83e5d30ebdb64c1b1158d204139153" + integrity sha512-my4tWF57jtwth/oLz3X1hYljPDDZM9wKzU498yk+6FgBtKg6J4uZIUoNh3p3GgUJ+Lde8pVpxqJ5pNchPICxmQ== + +"@lodestar/params@^1.22.0": + version "1.22.0" + resolved "https://registry.yarnpkg.com/@lodestar/params/-/params-1.22.0.tgz#e2d436da9ceb742e7ae088a6474468e8e8756a1b" + integrity sha512-wbbeQAG+4YOl1ATsSDJnx7wBk5FXsRl2OrmLkMnJXI67wqvRwWk8WQBx7wjx2hnWWrk0in4/8bTtHz3At1GydQ== + +"@lodestar/types@^1.12.0": + version "1.22.0" + resolved "https://registry.yarnpkg.com/@lodestar/types/-/types-1.22.0.tgz#5178c5edfaefe8875533545d95707957fa59f80a" + integrity sha512-BB0zgiqmIYmpg1ifDJ4VW0Ka2vkdmM7ju7lAQLk1O666iGWLObhfrLzQ+LbZ8/0h+PnjpDMB55MJSffmnqCkGg== + dependencies: + "@chainsafe/ssz" "^0.17.1" + "@lodestar/params" "^1.22.0" + ethereum-cryptography "^2.0.0" + "@metamask/eth-sig-util@^4.0.0": version "4.0.1" resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" @@ -965,6 +1188,13 @@ dependencies: sparse-bitfield "^3.0.3" +"@noble/curves@1.2.0", "@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.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.0.tgz#f05771ef64da724997f69ee1261b2417a49522d6" @@ -991,16 +1221,26 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== +"@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.4.0", "@noble/hashes@~1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== -"@noble/hashes@1.5.0", "@noble/hashes@^1.4.0", "@noble/hashes@~1.5.0": +"@noble/hashes@1.5.0", "@noble/hashes@^1.3.0", "@noble/hashes@^1.4.0", "@noble/hashes@~1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.5.0.tgz#abadc5ca20332db2b1b2aa3e496e9af1213570b0" integrity sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA== +"@noble/hashes@~1.3.0", "@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/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": version "1.7.1" resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" @@ -1184,6 +1424,21 @@ resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-2.0.2.tgz#ec95f23b53cb4e71a1a7091380fa223aad18f156" integrity sha512-vnN1AzxbvpSx9pfdRHbUzTRIXpMLPXnUlkW855VaDk6N1pwRaQ2gNzEmFAABk4lWf11E00PKwFd/q27HuwYrYg== +"@nomicfoundation/hardhat-verify@^2.0.8": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.11.tgz#4ce12b592e01ee93a81933924609c233ed00d951" + integrity sha512-lGIo4dNjVQFdsiEgZp3KP6ntLiF7xJEJsbNHfSyIiFCyI0Yv0518ElsFtMC5uCuHEChiBBMrib9jWQvHHT+X3Q== + dependencies: + "@ethersproject/abi" "^5.1.2" + "@ethersproject/address" "^5.0.2" + cbor "^8.1.0" + chalk "^2.4.2" + debug "^4.1.1" + lodash.clonedeep "^4.5.0" + semver "^6.3.0" + table "^6.8.0" + undici "^5.14.0" + "@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2": version "0.1.2" resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz#3a9c3b20d51360b20affb8f753e756d553d49557" @@ -1317,6 +1572,11 @@ "@openzeppelin/contracts" "^4.4.1" "@openzeppelin/contracts-upgradeable" "^4.7.3" +"@scure/base@^1.1.1", "@scure/base@~1.1.2": + version "1.1.9" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1" + integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg== + "@scure/base@~1.1.0", "@scure/base@~1.1.6", "@scure/base@~1.1.8": version "1.1.8" resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.8.tgz#8f23646c352f020c83bca750a82789e246d42b50" @@ -1331,6 +1591,15 @@ "@noble/secp256k1" "~1.7.0" "@scure/base" "~1.1.0" +"@scure/bip32@1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.2.tgz#90e78c027d5e30f0b22c1f8d50ff12f3fb7559f8" + integrity sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA== + dependencies: + "@noble/curves" "~1.2.0" + "@noble/hashes" "~1.3.2" + "@scure/base" "~1.1.2" + "@scure/bip32@1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.4.0.tgz#4e1f1e196abedcef395b33b9674a042524e20d67" @@ -1348,6 +1617,14 @@ "@noble/hashes" "~1.2.0" "@scure/base" "~1.1.0" +"@scure/bip39@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.1.tgz#5cee8978656b272a917b7871c981e0541ad6ac2a" + integrity sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg== + dependencies: + "@noble/hashes" "~1.3.0" + "@scure/base" "~1.1.0" + "@scure/bip39@1.3.0": version "1.3.0" resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.3.0.tgz#0f258c16823ddd00739461ac31398b4e7d6a18c3" @@ -1580,6 +1857,13 @@ dependencies: "@types/node" "*" +"@types/debug@^4.1.9": + 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/form-data@0.0.33": version "0.0.33" resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-0.0.33.tgz#c9ac85b2a5fd18435b8c85d9ecb50e6d6c893ff8" @@ -1634,6 +1918,16 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.8.tgz#a7eff5816e070c3b4d803f1d3cd780c4e42934a1" integrity sha512-HfMcUmy9hTMJh66VNcmeC9iVErIZJli2bszuXc6julh5YGuRb/W5OnkHjwLNYdFlMis0sY3If5SEAp+PktdJjw== +"@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-cron@^3.0.9": + version "3.0.11" + resolved "https://registry.yarnpkg.com/@types/node-cron/-/node-cron-3.0.11.tgz#70b7131f65038ae63cfe841354c8aba363632344" + integrity sha512-0ikrnug3/IyneSHqCBeslAhlK2aBfYek1fGo4bP4QnZPmiqSGRK+Oy7ZMisLWkesffJvQ1cqAcBnJC+8+nxIAg== + "@types/node@*": version "22.5.5" resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.5.tgz#52f939dd0f65fc552a4ad0b392f3c466cc5d7a44" @@ -1958,6 +2252,11 @@ abbrev@1.0.x: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" integrity sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q== +abitype@0.9.8: + version "0.9.8" + resolved "https://registry.yarnpkg.com/abitype/-/abitype-0.9.8.tgz#1f120b6b717459deafd213dfbf3a3dd1bf10ae8c" + integrity sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ== + abitype@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.5.tgz#29d0daa3eea867ca90f7e4123144c1d1270774b6" @@ -2188,6 +2487,13 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== +async-mutex@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.4.1.tgz#bccf55b96f2baf8df90ed798cb5544a1f6ee4c2c" + integrity sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA== + dependencies: + tslib "^2.4.0" + async@1.x: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -2253,7 +2559,7 @@ bigint-buffer@^1.1.5: dependencies: bindings "^1.3.0" -bigint-crypto-utils@^3.0.23: +bigint-crypto-utils@^3.0.23, bigint-crypto-utils@^3.2.2: version "3.3.0" resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz#72ad00ae91062cf07f2b1def9594006c279c1d77" integrity sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg== @@ -3106,6 +3412,10 @@ dotenv@^16.0.3, dotenv@^16.3.1: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== +"ds-test@github:dapphub/ds-test": + version "1.0.0" + resolved "https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0" + eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" @@ -3413,7 +3723,7 @@ ethereum-cryptography@^1.0.3: "@scure/bip32" "1.1.5" "@scure/bip39" "1.1.1" -ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2: +ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2, ethereum-cryptography@^2.1.3, ethereum-cryptography@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz#58f2810f8e020aecb97de8c8c76147600b0b8ccf" integrity sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg== @@ -3746,6 +4056,11 @@ follow-redirects@^1.12.1, follow-redirects@^1.14.0, follow-redirects@^1.15.6: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== +forge-std@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/forge-std/-/forge-std-1.1.2.tgz#f4a0eda103538d56f9c563f3cd1fa2fd01bd9378" + integrity sha512-Wfb0iAS9PcfjMKtGpWQw9mXzJxrWD62kJCUqqLcyuI0+VRtJ3j20XembjF3kS20qELYdXft1vD/SPFVWVKMFOw== + form-data@^2.2.0: version "2.5.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" @@ -4616,6 +4931,11 @@ isomorphic-ws@^4.0.1: resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== +isows@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.3.tgz#93c1cf0575daf56e7120bab5c8c448b0809d0d74" + integrity sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg== + isows@1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.4.tgz#810cd0d90cc4995c26395d2aa4cfa4037ebdf061" @@ -4905,6 +5225,11 @@ lodash.camelcase@^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.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== + lodash.isfunction@^3.0.9: version "3.0.9" resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" @@ -5008,6 +5333,11 @@ loupe@^2.3.6: dependencies: get-func-name "^2.0.1" +lru-cache@10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.1.0.tgz#2098d41c2dc56500e6c88584aa656c84de7d0484" + integrity sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -5621,7 +5951,7 @@ parse-passwd@^1.0.0: resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== -patch-package@8.0.0: +patch-package@8.0.0, patch-package@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-8.0.0.tgz#d191e2f1b6e06a4624a0116bcb88edd6714ede61" integrity sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA== @@ -6069,6 +6399,13 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +rustbn-wasm@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/rustbn-wasm/-/rustbn-wasm-0.2.0.tgz#0407521fb55ae69eeb4968d01885d63efd1c4ff9" + integrity sha512-FThvYFNTqrEKGqXuseeg0zR7yROh/6U1617mCHF68OVqrN1tNKRN7Tdwy4WayPVsCmmK+eMxtIZX1qL6JxTkMg== + dependencies: + "@scure/base" "^1.1.1" + rustbn.js@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" @@ -6334,6 +6671,14 @@ solhint@^3.3.7: optionalDependencies: prettier "^2.8.3" +solidity-bytes-utils@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/solidity-bytes-utils/-/solidity-bytes-utils-0.8.2.tgz#763d6a02fd093e93b3a97b742e97d540e66c29bd" + integrity sha512-cqXPYAV2auhpdKSTPuqji0CwpSceZDu95CzqSM/9tDJ2MoMaMsdHTpOIWtVw31BIqqGPNmIChCswzbw0tHaMTw== + dependencies: + ds-test "github:dapphub/ds-test" + forge-std "^1.1.2" + solidity-coverage@^0.8.2: version "0.8.13" resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.8.13.tgz#8eeada2e82ae19d25568368aa782a2baad0e0ce7" @@ -6771,7 +7116,7 @@ ts-generator@^0.1.1: resolve "^1.8.1" ts-essentials "^1.0.0" -ts-node@^10.8.1, ts-node@^10.9.1: +ts-node@^10.8.1, ts-node@^10.9.1, ts-node@^10.9.2: version "10.9.2" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== @@ -6907,6 +7252,11 @@ typescript@^4.9.3: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== +typescript@~5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" + integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== + typical@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" @@ -7001,6 +7351,35 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +viem@2.20.0: + version "2.20.0" + resolved "https://registry.yarnpkg.com/viem/-/viem-2.20.0.tgz#abff4c2cf733bcc20978e662ea17db117a2881ef" + integrity sha512-cM4vs81HnSNbfceI1MLkx4pCVzbVjl9xiNSv5SCutYjUyFFOVSPDlEyhpg2iHinxx1NM4Qne3END5eLT8rvUdg== + dependencies: + "@adraffy/ens-normalize" "1.10.0" + "@noble/curves" "1.4.0" + "@noble/hashes" "1.4.0" + "@scure/bip32" "1.4.0" + "@scure/bip39" "1.3.0" + abitype "1.0.5" + isows "1.0.4" + webauthn-p256 "0.0.5" + ws "8.17.1" + +viem@^1.16.5: + version "1.21.4" + resolved "https://registry.yarnpkg.com/viem/-/viem-1.21.4.tgz#883760e9222540a5a7e0339809202b45fe6a842d" + integrity sha512-BNVYdSaUjeS2zKQgPs+49e5JKocfo60Ib2yiXOWBT6LuVxY1I/6fFX3waEtpXvL1Xn4qu+BVitVtMh9lyThyhQ== + dependencies: + "@adraffy/ens-normalize" "1.10.0" + "@noble/curves" "1.2.0" + "@noble/hashes" "1.3.2" + "@scure/bip32" "1.3.2" + "@scure/bip39" "1.2.1" + abitype "0.9.8" + isows "1.0.3" + ws "8.13.0" + viem@^2.9.28: version "2.21.7" resolved "https://registry.yarnpkg.com/viem/-/viem-2.21.7.tgz#c933fd3adb6f771e5c5fe2b4d7a14d8701ddc32f" @@ -7162,6 +7541,11 @@ ws@7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== +ws@8.13.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + ws@8.17.1: version "8.17.1" resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" @@ -7261,4 +7645,4 @@ yocto-queue@^0.1.0: zksync-web3@^0.14.3: version "0.14.4" resolved "https://registry.yarnpkg.com/zksync-web3/-/zksync-web3-0.14.4.tgz#0b70a7e1a9d45cc57c0971736079185746d46b1f" - integrity sha512-kYehMD/S6Uhe1g434UnaMN+sBr9nQm23Ywn0EUP5BfQCsbjcr3ORuS68PosZw8xUTu3pac7G6YMSnNHk+fwzvg== \ No newline at end of file + integrity sha512-kYehMD/S6Uhe1g434UnaMN+sBr9nQm23Ywn0EUP5BfQCsbjcr3ORuS68PosZw8xUTu3pac7G6YMSnNHk+fwzvg== From c57a4ee76fb2a51429dbedc3c24cfd4bdd3cf44f Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Fri, 20 Sep 2024 08:07:34 +0200 Subject: [PATCH 268/297] fix(reporter): adds nonce within simulateContract to avoid to generate txs with the same nonce --- .../reporter/src/controllers/StandardReporterController.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/reporter/src/controllers/StandardReporterController.ts b/packages/reporter/src/controllers/StandardReporterController.ts index 4a7fb8b6..345774d3 100644 --- a/packages/reporter/src/controllers/StandardReporterController.ts +++ b/packages/reporter/src/controllers/StandardReporterController.ts @@ -24,6 +24,7 @@ class StandardReporterController extends BaseController { const client = this.multiClient.getClientByChain(this.sourceChain) const blockNumber = _blockNumbers[_blockNumbers.length - 1] + let nonce = await client.getTransactionCount({ address: client.account.address }) for (const chain of this.destinationChains as Chain[]) { if (!this.adapterAddresses[chain.name]) { this.logger.info(`Adapter address is missing for ${chain.name}. Skipping...`) @@ -37,10 +38,12 @@ class StandardReporterController extends BaseController { functionName: "dispatchBlocks", args: [chain.id, this.adapterAddresses[chain.name], [blockNumber]], value: this._reportHeadersValue, + nonce, }) const txHash = await client.writeContract(request) this.logger.info(`headers reporter from ${this.sourceChain.name} to ${chain.name}: ${txHash}`) + nonce += 1 } } catch (_error) { this.logger.error(_error) From e43d664c57ad02b74da179bda90b4be052983b7e Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Fri, 20 Sep 2024 15:20:31 +0800 Subject: [PATCH 269/297] refactor(reporter): update dockerfile and tsconfig.json --- packages/reporter/Dockerfile | 13 ++++++------- packages/reporter/tsconfig.json | 3 ++- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/reporter/Dockerfile b/packages/reporter/Dockerfile index 035d9c21..cdca8796 100644 --- a/packages/reporter/Dockerfile +++ b/packages/reporter/Dockerfile @@ -2,15 +2,14 @@ FROM node:18-alpine WORKDIR /usr/src/app -COPY package.json .env ./ +# Copy root package.json and yarn.lock for dependency resolution +COPY ../../package.json ../../yarn.lock ./ -RUN corepack enable && \ - corepack prepare --activate yarn@3.2.2 && \ - yarn install +COPY ./packages/reporter ./packages/reporter -ADD . /usr/src/app +RUN yarn install -RUN yarn install && \ - yarn compile +WORKDIR /usr/src/app/packages/reporter +RUN yarn compile CMD ["node", "dist/index.js"] \ No newline at end of file diff --git a/packages/reporter/tsconfig.json b/packages/reporter/tsconfig.json index 93d4d790..974c23aa 100644 --- a/packages/reporter/tsconfig.json +++ b/packages/reporter/tsconfig.json @@ -20,7 +20,8 @@ "resolveJsonModule": true, "sourceMap": true, "strict": true, - "target": "ESNext" + "target": "ESNext", + "skipLibCheck": true, }, "exclude": [ "node_modules" From 93f96f520ed1c3d5769145b6f9210814f03da020 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Fri, 20 Sep 2024 19:18:37 +0800 Subject: [PATCH 270/297] chore: rename image names in docker-compose.yml --- docker-compose.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index f19e6bdb..c6d65632 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,21 +11,21 @@ services: volumes: - mongo-data:/data/db - relayer: + hashi_relayer: build: context: . dockerfile: packages/relayer/Dockerfile - container_name: relayer + container_name: hashi_relayer networks: - mongo-network depends_on: - mongodb - executor: + hashi_executor: build: context: . dockerfile: packages/executor/Dockerfile - container_name: executor + container_name: hashi_executor networks: - mongo-network depends_on: From 3c0f4f3eb2b6ad972172a50cd8757d9923df57bb Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Mon, 23 Sep 2024 14:55:00 +0800 Subject: [PATCH 271/297] docs: update README --- docker-compose-reporter.yml | 9 +++++++++ packages/executor/README.md | 33 ++++++++++++++++++++++++++++++++- packages/relayer/README.md | 30 ++++++++++++++++++++++++++++++ packages/reporter/README.md | 14 +++----------- 4 files changed, 74 insertions(+), 12 deletions(-) create mode 100644 docker-compose-reporter.yml diff --git a/docker-compose-reporter.yml b/docker-compose-reporter.yml new file mode 100644 index 00000000..629edff2 --- /dev/null +++ b/docker-compose-reporter.yml @@ -0,0 +1,9 @@ +version: "3.8" + +services: + + hashi_reporter: + build: + context: . + dockerfile: packages/reporter/Dockerfile + container_name: hashi_reporter \ No newline at end of file diff --git a/packages/executor/README.md b/packages/executor/README.md index c9829440..8563752f 100644 --- a/packages/executor/README.md +++ b/packages/executor/README.md @@ -1,6 +1,7 @@ # executor -The Executor is a service utilized to execute messages once they have achieved consensus, meaning when adapters have reached consensus on the message. +The Executor is a service utilized to execute messages once they have achieved consensus, meaning when adapters have +reached consensus on the message.   @@ -9,6 +10,7 @@ The Executor is a service utilized to execute messages once they have achieved c   ## Installation + To install the Executor, follow these steps: ```bash @@ -46,3 +48,32 @@ cd packages/executor yarn start dotenv_config_path="your env file" ``` +### Building and Running the Docker Image + +Executor is usually run with Relayer and MongoDB, the `docker-compose.yml` demonstrates how to run these three images +together. + +Run the following command: + +```sh +cd ../.. # To the root level +docker compose -f docker-compose.yml up -d --build +``` + +### Viewing Logs + +To view the logs from the running container, use: + +```sh +docker logs -f [CONTAINER_ID or CONTAINER_NAME] +``` + +You can find the `CONTAINER_ID` or `CONTAINER_NAME` using `docker ps`. + +### Stopping the relayer + +To stop the running container: + +```sh +docker stop [CONTAINER_ID or CONTAINER_NAME] +``` diff --git a/packages/relayer/README.md b/packages/relayer/README.md index da4019d1..4bdd1fbc 100644 --- a/packages/relayer/README.md +++ b/packages/relayer/README.md @@ -46,3 +46,33 @@ cd packages/relayer ```bash yarn start dotenv_config_path="your env file" ``` + +### Building and Running the Docker Image + +Relayer is usually run with Executor and MongoDB, the `docker-compose.yml` demonstrates how to run these three images +together. + +Run the following command: + +```sh +cd ../.. # To the root level +docker compose -f docker-compose.yml up -d --build +``` + +### Viewing Logs + +To view the logs from the running container, use: + +```sh +docker logs -f [CONTAINER_ID or CONTAINER_NAME] +``` + +You can find the `CONTAINER_ID` or `CONTAINER_NAME` using `docker ps`. + +### Stopping the relayer + +To stop the running container: + +```sh +docker stop [CONTAINER_ID or CONTAINER_NAME] +``` diff --git a/packages/reporter/README.md b/packages/reporter/README.md index 9cb4ab9a..da4b9a2c 100644 --- a/packages/reporter/README.md +++ b/packages/reporter/README.md @@ -16,20 +16,12 @@ These instructions will cover the usage information and how to run the code usin Configure the mode you want to run by editing the variable in `.env` by checking `.env.example` -### Building the Docker Image +### Building and Running the Docker Image -To build the Docker image, run the following command from the root of the project: +On the root, run the following command: ```sh -docker build -t reporter . -``` - -### Running the reporter - -After building the image, you can run it using the following command: - -```sh -docker run -d -p reporter +docker compose -f docker-compose-reporter.yml up -d --build ``` ### Viewing Logs From d21c428053d24146e2c8ac189c68d60e9007fe1c Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Mon, 23 Sep 2024 16:17:18 +0800 Subject: [PATCH 272/297] chore: delete docker-compose-reporter.yml and merge the code into docker-compose.yml --- docker-compose-reporter.yml | 9 --------- docker-compose.yml | 6 ++++++ packages/reporter/README.md | 4 ++-- 3 files changed, 8 insertions(+), 11 deletions(-) delete mode 100644 docker-compose-reporter.yml diff --git a/docker-compose-reporter.yml b/docker-compose-reporter.yml deleted file mode 100644 index 629edff2..00000000 --- a/docker-compose-reporter.yml +++ /dev/null @@ -1,9 +0,0 @@ -version: "3.8" - -services: - - hashi_reporter: - build: - context: . - dockerfile: packages/reporter/Dockerfile - container_name: hashi_reporter \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index c6d65632..6442e186 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -31,6 +31,12 @@ services: depends_on: - mongodb + hashi_reporter: + build: + context: . + dockerfile: packages/reporter/Dockerfile + container_name: hashi_reporter + networks: mongo-network: driver: bridge diff --git a/packages/reporter/README.md b/packages/reporter/README.md index da4b9a2c..3909d9ad 100644 --- a/packages/reporter/README.md +++ b/packages/reporter/README.md @@ -18,10 +18,10 @@ Configure the mode you want to run by editing the variable in `.env` by checking ### Building and Running the Docker Image -On the root, run the following command: +On the root's `docker-compose.yml`, remove all the logic unrelated to reporter, and run the following command: ```sh -docker compose -f docker-compose-reporter.yml up -d --build +docker compose -f docker-compose.yml up -d --build ``` ### Viewing Logs From d464ceb8214435548a135cb7b1bfdfeea864bc37 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Mon, 23 Sep 2024 16:36:02 +0800 Subject: [PATCH 273/297] docs: update README --- packages/executor/README.md | 2 +- packages/relayer/README.md | 2 +- packages/reporter/README.md | 5 +++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/executor/README.md b/packages/executor/README.md index 8563752f..e0dbc73b 100644 --- a/packages/executor/README.md +++ b/packages/executor/README.md @@ -57,7 +57,7 @@ Run the following command: ```sh cd ../.. # To the root level -docker compose -f docker-compose.yml up -d --build +docker compose up --build mongodb hashi_relayer hashi_executor ``` ### Viewing Logs diff --git a/packages/relayer/README.md b/packages/relayer/README.md index 4bdd1fbc..47befd7a 100644 --- a/packages/relayer/README.md +++ b/packages/relayer/README.md @@ -56,7 +56,7 @@ Run the following command: ```sh cd ../.. # To the root level -docker compose -f docker-compose.yml up -d --build +docker compose up --build mongodb hashi_relayer hashi_executor ``` ### Viewing Logs diff --git a/packages/reporter/README.md b/packages/reporter/README.md index 3909d9ad..68e80f2c 100644 --- a/packages/reporter/README.md +++ b/packages/reporter/README.md @@ -18,10 +18,11 @@ Configure the mode you want to run by editing the variable in `.env` by checking ### Building and Running the Docker Image -On the root's `docker-compose.yml`, remove all the logic unrelated to reporter, and run the following command: +On the root's `docker-compose.yml`, run the following command: ```sh -docker compose -f docker-compose.yml up -d --build +cd ../.. # To the root level +docker-compose up -d --build --no-deps hashi_reporter ``` ### Viewing Logs From 550f4bac034df0cec7e4861c6c2bfab98bf83309 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Mon, 23 Sep 2024 16:50:39 +0800 Subject: [PATCH 274/297] docs: remove unrelated code in README --- packages/executor/README.md | 2 +- packages/relayer/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/executor/README.md b/packages/executor/README.md index e0dbc73b..0a0d0449 100644 --- a/packages/executor/README.md +++ b/packages/executor/README.md @@ -57,7 +57,7 @@ Run the following command: ```sh cd ../.. # To the root level -docker compose up --build mongodb hashi_relayer hashi_executor +docker compose up --build mongodb hashi_executor ``` ### Viewing Logs diff --git a/packages/relayer/README.md b/packages/relayer/README.md index 47befd7a..812afc57 100644 --- a/packages/relayer/README.md +++ b/packages/relayer/README.md @@ -56,7 +56,7 @@ Run the following command: ```sh cd ../.. # To the root level -docker compose up --build mongodb hashi_relayer hashi_executor +docker compose up --build mongodb hashi_relayer ``` ### Viewing Logs From 91b38e008a3ae9d228312f00300a11061ee49722 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Tue, 24 Sep 2024 13:18:22 +0800 Subject: [PATCH 275/297] docs: update readme --- README_WIP.md | 89 ++++++++++++++++++++++++++++++++++ packages/common/README.md | 22 ++++++++- packages/evm/README.md | 72 +++++++++++++++++++++++++++ packages/executor/README.md | 62 +++++++++++------------ packages/relayer/README.md | 59 +++++++++++----------- packages/reporter/.env.example | 3 +- packages/reporter/README.md | 46 +++++++++++------- packages/reporter/package.json | 1 + 8 files changed, 267 insertions(+), 87 deletions(-) create mode 100644 README_WIP.md create mode 100644 packages/evm/README.md diff --git a/README_WIP.md b/README_WIP.md new file mode 100644 index 00000000..c4661fd7 --- /dev/null +++ b/README_WIP.md @@ -0,0 +1,89 @@ +# Overview + +Hashi is an EVM Hash Oracle Aggregator, designed to facilitate a +[principled approach to cross-chain bridge security](https://ethresear.ch/t/a-principled-approach-to-bridges/14725?u=auryn). + +The primary insight being that the vast majority of bridge-related security incidents could have had minimal impact if +the systems relying on them had built in some redundancy. In other words, it's much more secure to require messages be +validated by multiple independent mechanisms, rather than by just one. + +We call this setup a **RAIHO** (Redundant Array of Independent Hash Oracles). + +# Working with Hashi + +**Node** +This repository targets v18 of node. We recommend using [nvm](https://github.com/nvm-sh/nvm) to manage your node version. +Once installed, you should change versions automatically with the `.nvmrc` file. + +**Docker** +Make sure you have the correct version of [Docker](https://www.docker.com/) installed on your machine. +You may refer to `Dockerfile` under each workspace and `docker-compose.yml` on the root for more details regarding the build process. + +## Project Structure + +1. `packages/common`: Common logic that will be used across multiple workspaces. +2. `packages/evm`: On chain components includes Solidity smart contracts, deploy tasks, tests. Built with [Hardhat](https://hardhat.org/). +3. `packages/executor`: A service utilized to execute messages once they have achieved consensus. +4. `packages/relayer`: A service used to relay batches of dispatched messages through Yaho to the reporter contracts. +5. `packages/reporter`: Script to call Reporter contract's `dispatchBlocks` function of different oracle from source chain to destination chain. + +# Workspaces + +This monorepo uses [Yarn Workspaces](https://yarnpkg.com/features/workspaces). Installing dependencies can be done from the root directory of the repository. + +- Installing dependencies + + ```sh + git clone https://github.com/gnosis/hashi # Clone the repo + cd hashi + nvm use + yarn install + ``` + +## Build & Run + +To build & run each packages, navigate to each package separately, check the README.md in each workspace for more details. + +## Run Docker + +Before running docker for the workspace, insert the correct environment variable in .env. + +```sh +cp .env.example .env +``` + +Build & run +Run the following command to build and run all the services. + +```sh +docker compose up --build +``` + +## Audits + +### v0.1 + +Hashi has been audited by the [G0 group](https://github.com/g0-group). + +All issues and notes of the audit have been addressed as of commit hash [9f373635](https://github.com/gnosis/hashi/tree/9f373635730b59478bf23215906fdb5ad525d3b7/packages/evm/contracts). + +The audit results are available as a [pdf in this repo](https://github.com/gnosis/hashi/blob/main/packages/evm/contracts/docs/audits/HashiMay2023.pdf). + +Please note, there have been changes to contract code since this audit. A subsequent audit of the changed code is pending. + +### v0.2 + +Hashi has been audited by the [G0 group](https://github.com/g0-group). + +The audit results are available as a [pdf in this repo](https://github.com/g0-group/Audits/blob/master/HashiMar2024.pdf). + +Please note, there have been changes to contract code since this audit. A subsequent audit of the changed code is pending. + +## Security and Liability + +All contracts are WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. + +## License + +Created under the [LGPL-3.0+ license](LICENSE). diff --git a/packages/common/README.md b/packages/common/README.md index d0553e6e..ea0d70fa 100644 --- a/packages/common/README.md +++ b/packages/common/README.md @@ -1 +1,21 @@ -# common +# Common + +Common logic that will be used across multiple workspaces/packages. + +## Usage + +### Install + +Please make sure you have run `yarn install` on the root level. + +```sh +cd ../.. # To the root level +nvm use +yarn install +``` + +### Compile + +```sh +yarn compile +``` diff --git a/packages/evm/README.md b/packages/evm/README.md new file mode 100644 index 00000000..b4692f81 --- /dev/null +++ b/packages/evm/README.md @@ -0,0 +1,72 @@ +# EVM + +This workspace includes on chain components such as Solidity smart contracts, deploy tasks, and tests. +The project is built with [Hardhat](https://hardhat.org/). + +## Configuration + +Create a new `.env` with the required environment variables. + +```sh +cp .env.example .env +``` + +## Usage + +### Install + +Please make sure you have run `yarn install` on the root level. + +```sh +cd ../.. # To the root level +nvm use +yarn install +cd packages/evm +``` + +### Compile the contracts + +```sh +yarn build +``` + +### Deploy & Verify + +To deploy a specific contract, + +```sh +yarn hardhat ${task_name} --${arg1Name} ${arg1Value} --${arg2Name} ${arg2Value} --network ${network name} +``` + +Run `yarn hardhat` to check the available options. + +To verify a contract, + +```sh +yarn hardhat verify ${contract address} "${constructor arg1}" "${constructor arg2}" --network ${network name} +``` + +### Test + +```sh +yarn test +``` + +## Adding a new adapter + +1. Create Reporter and Adapter contracts: + + 1. For General Message Passing oracle, there need to be a reporter contract on source chain, and adapter contract on + destination chain. + 2. For Light Client based oracle, there is only an adapter contract on the destination chain. + 3. A reporter contract need to inherit `Reporter.sol`, and override `_dispatch()` function that will eventually call + the relay logic of the bridge. + 4. An adapter contract need to inherit `Adapter.sol` contract, and call `_storeHashes` to store the hash w.r.t an id. + +2. Add Deploy task + 1. Create a new file under `/tasks/deploy/adapters`, and name it ${oracle_name}.ts + 2. Add the reporter and adapter contracts deploy logic. +3. Add test + 1. Create a new file under `/test/adapters`. + 2. Add the test logic. +4. Create PR diff --git a/packages/executor/README.md b/packages/executor/README.md index 0a0d0449..5800d3bf 100644 --- a/packages/executor/README.md +++ b/packages/executor/README.md @@ -1,59 +1,53 @@ -# executor +# Hashi Executor The Executor is a service utilized to execute messages once they have achieved consensus, meaning when adapters have reached consensus on the message. -  +## Getting Started ---- +These instructions will cover the usage information and how to run the code locally for development or using Docker. -  - -## Installation +## Configuration -To install the Executor, follow these steps: +Before running the Relayer, you need to create an `.env` file. All parameters can be found within `.env.example`. -```bash -git clone https://github.com/gnosis/hashi -cd hashi -nvm use -yarn install +```sh +cp .env.example .env ``` -  - ---- - -  - -## Configuration +## Usage -Before running the Executor, you need to create an `.env` file. All parameters can be found within `.env.example`. +### Install -  +Please make sure you have run `yarn install` on the root level. ---- +```sh +cd ../.. # To the root level +nvm use +yarn install +cd packages/executor +``` -  +Run mongoDB and export port 27017 -## Usage +```sh +docker run -d \ + --name mongodb \ + -p 27017:27017 \ + mongo +``` To start Executor, run the following command: -```bash +```sh cd packages/executor -``` - -```bash -yarn start dotenv_config_path="your env file" +yarn start ``` ### Building and Running the Docker Image -Executor is usually run with Relayer and MongoDB, the `docker-compose.yml` demonstrates how to run these three images -together. - -Run the following command: +Executor needs to connect with MongoDB, the `docker-compose.yml` demonstrates how to run these images together. Run the +following command: ```sh cd ../.. # To the root level @@ -70,7 +64,7 @@ docker logs -f [CONTAINER_ID or CONTAINER_NAME] You can find the `CONTAINER_ID` or `CONTAINER_NAME` using `docker ps`. -### Stopping the relayer +### Stopping the executor To stop the running container: diff --git a/packages/relayer/README.md b/packages/relayer/README.md index 812afc57..be78cce2 100644 --- a/packages/relayer/README.md +++ b/packages/relayer/README.md @@ -1,56 +1,51 @@ -# relayer +# Hashi Relayer -The Relayer is a service used to relay batches of dispatched messages through Yaho to the adapters. +The Relayer is a service used to relay batches of dispatched messages through Yaho to the reporter contracts. -  +## Getting Started ---- +These instructions will cover the usage information and how to run the code locally for development or using Docker. -  - -## Installation +## Configuration -To install the Relayer, follow these steps: +Before running the Relayer, you need to create an `.env` file. All parameters can be found within `.env.example`. -```bash -git clone https://github.com/gnosis/hashi -cd hashi -nvm use -yarn install +```sh +cp .env.example .env ``` -  - ---- - -  - -## Configuration +## Usage -Before running the Relayer, you need to create an `.env` file. All parameters can be found within `.env.example`. +### Install -  +Please make sure you have run `yarn install` on the root level. ---- +```sh +cd ../.. # To the root level +nvm use +yarn install +cd packages/relayer +``` -  +Run mongoDB and export port 27017 -## Usage +```sh +docker run -d \ + --name mongodb \ + -p 27017:27017 \ + mongo +``` To start Relayer, run the following command: -```bash +```sh cd packages/relayer -``` - -```bash -yarn start dotenv_config_path="your env file" +yarn start ``` ### Building and Running the Docker Image -Relayer is usually run with Executor and MongoDB, the `docker-compose.yml` demonstrates how to run these three images -together. +Relayer needs to connect with MongoDB, the `docker-compose.yml` demonstrates how to run these images together. Run the following command: diff --git a/packages/reporter/.env.example b/packages/reporter/.env.example index 8ff12943..c3887b37 100644 --- a/packages/reporter/.env.example +++ b/packages/reporter/.env.example @@ -1,4 +1,3 @@ -# Fake private key PRIVATE_KEY= REPORTERS_ENABLED=WormholeReporterController,AMBReporterController,LayerZeroReporterController @@ -17,7 +16,7 @@ GOERLI_BEACON_API_URL= AMB_REPORTER_HEADERS_GAS=200000 AXELAR_REPORT_HEADERS_VALUE=0.0001 CELER_REPORT_HEADERS_VALUE=0.0001 -LAYER_ZERO_REPORT_HEADERS_VALUE=0.00015 +LAYER_ZERO_REPORT_HEADERS_VALUE=0 CCIP_REPORT_HEADERS_VALUE=0.002 CONNEXT_REPORT_HEADERS_VALUE=0.00003 ZETA_CHAIN_REPORT_HEADERS_VALUE=0.001 diff --git a/packages/reporter/README.md b/packages/reporter/README.md index 68e80f2c..4a171633 100644 --- a/packages/reporter/README.md +++ b/packages/reporter/README.md @@ -1,20 +1,36 @@ -# reporter +# Hashi Reporter -Script to call Header Reporter contracts of different oracle from source chain to destination chain. +Script to call Reporter contract's `dispatchBlocks` function of different oracle from source chain to destination chain. -  +## Getting Started ---- +These instructions will cover the usage information and how to run the code locally for development using Docker. -  +### Configuration -## Getting Started +Configure the mode you want to run by editing the variable in `.env` by checking `.env.example` + +```sh +cp .env.example .env +``` -These instructions will cover the usage information and how to run the code using Docker. +### Install -### Create the .env file +Please make sure you have run `yarn install` on the root level. -Configure the mode you want to run by editing the variable in `.env` by checking `.env.example` +```sh +cd ../.. # To the root level +nvm use +yarn install +cd packages/reporter +``` + +To start Reporter, run the following command: + +```sh +cd packages/reporter +yarn start:dev +``` ### Building and Running the Docker Image @@ -43,16 +59,10 @@ To stop the running container: docker stop [CONTAINER_ID or CONTAINER_NAME] ``` -  - ---- - -  - ## How to add a new controller -1. Add a new file under `/controllers`, create the constructor and `onBlocks` function to call block header reporter - contract periodically. +1. Add a new file under `src/controllers`, create the constructor and `onBlocks` function to call reporter contract + periodically. 2. Configure the settings under `settings/index.ts`. -3. Add the new controller instant in `index.ts`. +3. Add the new controller instance in `index.ts`. 4. Add the env variable in `.env.example`. diff --git a/packages/reporter/package.json b/packages/reporter/package.json index b8cfb84f..e4eee5a3 100644 --- a/packages/reporter/package.json +++ b/packages/reporter/package.json @@ -11,6 +11,7 @@ "lint": "eslint --ignore-path ./.eslintignore --ext .js,.ts .", "prettier:check": "prettier --check \"**/*.{js,json,md,sol,ts,yml}\"", "prettier:write": "prettier --write \"**/*.{js,json,md,sol,ts,yml}\"", + "start": "node --loader ts-node/esm ./src/index.ts", "start:dev": "nodemon" }, "dependencies": { From b4d322fc30b429b79d25162e796fdbd7e1962321 Mon Sep 17 00:00:00 2001 From: zengzengzenghuy Date: Tue, 24 Sep 2024 13:51:20 +0800 Subject: [PATCH 276/297] docs: update README --- README.md | 83 ++++++++++++++++++++++++++++++++++++----------- README_WIP.md | 89 --------------------------------------------------- 2 files changed, 64 insertions(+), 108 deletions(-) delete mode 100644 README_WIP.md diff --git a/README.md b/README.md index 7bc62e23..f7ccdbd3 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,8 @@ -> **⚠️ Warning ⚠️** -> -> **⚠️ This code is being actively developed and is not yet production ready.** -> -> **⚠️ DO NOT deploy this code or use deployments of this code for anything valuable.** - ---- - [![Github Actions][gha-badge]][gha] [![Coverage Status][coveralls-badge]][coveralls] [![Hardhat][hardhat-badge]][hardhat] [![License: LGPL-3.0-only][license-badge]][license] ![Hashi](hashi.png) -# Hashi 橋 - [coveralls]: https://coveralls.io/github/gnosis/hashi?branch=master [coveralls-badge]: https://coveralls.io/repos/github/gnosis/hashi/badge.svg?branch=main [gha]: https://github.com/gnosis/hashi/actions @@ -22,6 +12,8 @@ [license]: https://www.gnu.org/licenses/lgpl-3.0.en.html [license-badge]: https://img.shields.io/badge/License-LGPL%20v3.0-blue +# Overview + Hashi is an EVM Hash Oracle Aggregator, designed to facilitate a [principled approach to cross-chain bridge security](https://ethresear.ch/t/a-principled-approach-to-bridges/14725?u=auryn). @@ -31,6 +23,8 @@ validated by multiple independent mechanisms, rather than by just one. We call this setup a **RAIHO** (Redundant Array of Independent Hash Oracles). +For more details: https://crosschain-alliance.gitbook.io/hashi + ## Features **Hashi** (橋) allows users to: @@ -55,7 +49,7 @@ We call this setup a **RAIHO** (Redundant Array of Independent Hash Oracles). - dispatch arbitrary messages via Hashi, which: - emits the hash of arbitrary messages as events - - stores the arbitrary message in storage + - stores the hash of arbitrary message in storage - relay previously stored messages to any number of message adapters - dispatch messages and relay them to adapters in a single call @@ -63,19 +57,60 @@ We call this setup a **RAIHO** (Redundant Array of Independent Hash Oracles). - execute arbitrary messages passed from Yaho -**Hashi Zodiac Module** allows users to: +# Working with Hashi + +**Node** +This repository targets v18 of node. We recommend using [nvm](https://github.com/nvm-sh/nvm) to manage your node version. +Once installed, you should change versions automatically with the `.nvmrc` file. + +**Docker** +Make sure you have the correct version of [Docker](https://www.docker.com/) installed on your machine. +You may refer to `Dockerfile` under each workspace and `docker-compose.yml` on the root for more details regarding the build process. + +## Project Structure + +1. `packages/common`: Common logic that will be used across multiple workspaces. +2. `packages/evm`: On chain components includes Solidity smart contracts, deploy tasks, tests. Built with [Hardhat](https://hardhat.org/). +3. `packages/executor`: A service utilized to execute messages once they have achieved consensus. +4. `packages/relayer`: A service used to relay batches of dispatched messages through Yaho to the reporter contracts. +5. `packages/reporter`: Script to call Reporter contract's `dispatchBlocks` function of different oracle from source chain to destination chain. + +# Workspaces + +This monorepo uses [Yarn Workspaces](https://yarnpkg.com/features/workspaces). Installing dependencies can be done from the root directory of the repository. + +- Installing dependencies + + ```sh + git clone https://github.com/gnosis/hashi # Clone the repo + cd hashi + nvm use + yarn install + ``` -- Control an avatar (like a Safe) on one chain from a `controller` address on another chain, via messages passed over hashi. -- Define an instance of Yaho which can pass it messages. -- Define a `chainId` (usually called `domain` elsewhere in this repo). -- Define a foreign `controller` address. +## Build & Run -Hashi's additional redundancy obviously comes with a higher gas cost, along with moving only as quickly as the slowest -oracle in a given set. However, this trade-off seems well worth it given the scope and frequency of past bridge-related -security incidents. +To build & run each packages, navigate to each package separately, check the README.md in each workspace for more details. + +## Run Docker + +Before running docker for the workspace, insert the correct environment variable in .env. + +```sh +cp .env.example .env +``` + +Build & run +Run the following command to build and run all the services. + +```sh +docker compose up --build +``` ## Audits +### v0.1 + Hashi has been audited by the [G0 group](https://github.com/g0-group). All issues and notes of the audit have been addressed as of commit hash [9f373635](https://github.com/gnosis/hashi/tree/9f373635730b59478bf23215906fdb5ad525d3b7/packages/evm/contracts). @@ -84,6 +119,16 @@ The audit results are available as a [pdf in this repo](https://github.com/gnosi Please note, there have been changes to contract code since this audit. A subsequent audit of the changed code is pending. +### v0.2 + +Hashi has been audited by the [G0 group](https://github.com/g0-group). + +All issues and notes of the audit have been addressed as of commit hash [f1a9fdb](https://github.com/gnosis/hashi/tree/f1a9fdb2998c7024268e9c69777f4dc43d2f775e/packages/evm) + +The audit results are available as a [pdf in this repo](https://github.com/g0-group/Audits/blob/master/HashiMar2024.pdf). + +Please note, there have been changes to contract code since this audit. A subsequent audit of the changed code is pending. + ## Security and Liability All contracts are WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR diff --git a/README_WIP.md b/README_WIP.md deleted file mode 100644 index c4661fd7..00000000 --- a/README_WIP.md +++ /dev/null @@ -1,89 +0,0 @@ -# Overview - -Hashi is an EVM Hash Oracle Aggregator, designed to facilitate a -[principled approach to cross-chain bridge security](https://ethresear.ch/t/a-principled-approach-to-bridges/14725?u=auryn). - -The primary insight being that the vast majority of bridge-related security incidents could have had minimal impact if -the systems relying on them had built in some redundancy. In other words, it's much more secure to require messages be -validated by multiple independent mechanisms, rather than by just one. - -We call this setup a **RAIHO** (Redundant Array of Independent Hash Oracles). - -# Working with Hashi - -**Node** -This repository targets v18 of node. We recommend using [nvm](https://github.com/nvm-sh/nvm) to manage your node version. -Once installed, you should change versions automatically with the `.nvmrc` file. - -**Docker** -Make sure you have the correct version of [Docker](https://www.docker.com/) installed on your machine. -You may refer to `Dockerfile` under each workspace and `docker-compose.yml` on the root for more details regarding the build process. - -## Project Structure - -1. `packages/common`: Common logic that will be used across multiple workspaces. -2. `packages/evm`: On chain components includes Solidity smart contracts, deploy tasks, tests. Built with [Hardhat](https://hardhat.org/). -3. `packages/executor`: A service utilized to execute messages once they have achieved consensus. -4. `packages/relayer`: A service used to relay batches of dispatched messages through Yaho to the reporter contracts. -5. `packages/reporter`: Script to call Reporter contract's `dispatchBlocks` function of different oracle from source chain to destination chain. - -# Workspaces - -This monorepo uses [Yarn Workspaces](https://yarnpkg.com/features/workspaces). Installing dependencies can be done from the root directory of the repository. - -- Installing dependencies - - ```sh - git clone https://github.com/gnosis/hashi # Clone the repo - cd hashi - nvm use - yarn install - ``` - -## Build & Run - -To build & run each packages, navigate to each package separately, check the README.md in each workspace for more details. - -## Run Docker - -Before running docker for the workspace, insert the correct environment variable in .env. - -```sh -cp .env.example .env -``` - -Build & run -Run the following command to build and run all the services. - -```sh -docker compose up --build -``` - -## Audits - -### v0.1 - -Hashi has been audited by the [G0 group](https://github.com/g0-group). - -All issues and notes of the audit have been addressed as of commit hash [9f373635](https://github.com/gnosis/hashi/tree/9f373635730b59478bf23215906fdb5ad525d3b7/packages/evm/contracts). - -The audit results are available as a [pdf in this repo](https://github.com/gnosis/hashi/blob/main/packages/evm/contracts/docs/audits/HashiMay2023.pdf). - -Please note, there have been changes to contract code since this audit. A subsequent audit of the changed code is pending. - -### v0.2 - -Hashi has been audited by the [G0 group](https://github.com/g0-group). - -The audit results are available as a [pdf in this repo](https://github.com/g0-group/Audits/blob/master/HashiMar2024.pdf). - -Please note, there have been changes to contract code since this audit. A subsequent audit of the changed code is pending. - -## Security and Liability - -All contracts are WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. - -## License - -Created under the [LGPL-3.0+ license](LICENSE). From 1058abffd5002288148481a77716d9bac641fb41 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 24 Sep 2024 19:03:55 +0200 Subject: [PATCH 277/297] refactor(evm): rm some warnings within LayerZeroAdapter --- .../contracts/adapters/LayerZero/LayerZeroAdapter.sol | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/evm/contracts/adapters/LayerZero/LayerZeroAdapter.sol b/packages/evm/contracts/adapters/LayerZero/LayerZeroAdapter.sol index 280fcefb..7ad79ebf 100644 --- a/packages/evm/contracts/adapters/LayerZero/LayerZeroAdapter.sol +++ b/packages/evm/contracts/adapters/LayerZero/LayerZeroAdapter.sol @@ -2,10 +2,10 @@ pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; -import { ILayerZeroReceiver } from "./interfaces/ILayerZeroReceiver.sol"; -import { Origin } from "./interfaces/ILayerZeroEndpointV2.sol"; import { OAppCore } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/OAppCore.sol"; import { BlockHashAdapter } from "../BlockHashAdapter.sol"; +import { ILayerZeroReceiver } from "./interfaces/ILayerZeroReceiver.sol"; +import { Origin } from "./interfaces/ILayerZeroEndpointV2.sol"; contract LayerZeroAdapter is BlockHashAdapter, Ownable, ILayerZeroReceiver, OAppCore { string public constant PROVIDER = "layer-zero"; @@ -24,10 +24,10 @@ contract LayerZeroAdapter is BlockHashAdapter, Ownable, ILayerZeroReceiver, OApp function lzReceive( Origin calldata _origin, - bytes32 _guid, + bytes32 /* _guid*/, bytes calldata _message, - address _executor, - bytes calldata _extraData + address /* _executor*/, + bytes calldata /* _extraData*/ ) external payable { if ( msg.sender != LAYER_ZERO_ENDPOINT || From 47791419d4fe4b8db8d7d63ab1dd075fb58bc91a Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 24 Sep 2024 19:05:52 +0200 Subject: [PATCH 278/297] chore(evm): rm not used deps and add new ones needed --- packages/evm/package.json | 17 +- yarn.lock | 1040 ++++--------------------------------- 2 files changed, 114 insertions(+), 943 deletions(-) diff --git a/packages/evm/package.json b/packages/evm/package.json index 63284f03..9036ece5 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -8,8 +8,6 @@ "url": "https://github.com/gnosis" }, "devDependencies": { - "@commitlint/cli": "^17.3.0", - "@commitlint/config-conventional": "^17.3.0", "@ethersproject/abi": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", @@ -21,35 +19,25 @@ "@nomicfoundation/hardhat-verify": "^2.0.8", "@nomiclabs/hardhat-ethers": "^2.2.1", "@nomiclabs/hardhat-etherscan": "^3.1.2", - "@trivago/prettier-plugin-sort-imports": "^4.0.0", "@typechain/ethers-v5": "^10.1.1", "@typechain/hardhat": "^6.1.4", "@types/chai": "^4.3.4", - "@types/fs-extra": "^9.0.13", "@types/mocha": "^10.0.0", "@types/node": "^18.11.9", + "@types/sinon-chai": "3.2.12", "@typescript-eslint/eslint-plugin": "^5.44.0", "@typescript-eslint/parser": "^5.44.0", "chai": "^4.3.7", - "commitizen": "^4.2.5", - "cross-env": "^7.0.3", - "cz-conventional-changelog": "^3.3.0", "dotenv": "^16.0.3", "eslint": "^8.28.0", "eslint-config-prettier": "^8.5.0", "ethers": "^5.7.2", - "fs-extra": "^10.1.0", "hardhat": "2.19.4", "hardhat-change-network": "^0.0.7", "hardhat-deploy": "^0.11.31", "hardhat-gas-reporter": "^1.0.9", - "lint-staged": "^13.0.4", - "lodash": "^4.17.21", - "mocha": "^10.1.0", - "pinst": "^3.0.0", "prettier": "^2.8.7", "prettier-plugin-solidity": "^1.0.0", - "shx": "^0.3.4", "solhint": "^3.3.7", "solhint-plugin-prettier": "^0.0.5", "solidity-coverage": "^0.8.2", @@ -90,9 +78,10 @@ "typechain": "cross-env TS_NODE_TRANSPILE_ONLY=true hardhat typechain" }, "dependencies": { - "@axelar-network/axelar-gmp-sdk-solidity": "5.6.2", + "@axelar-network/axelar-gmp-sdk-solidity": "5.6.4", "@chainlink/contracts-ccip": "0.7.6", "@connext/interfaces": "2.0.0", + "@eth-optimism/contracts": "0.6.0", "@hyperlane-xyz/core": "3.1.10", "@layerzerolabs/lz-evm-messagelib-v2": "^2.3.29", "@layerzerolabs/lz-evm-oapp-v2": "^2.3.29", diff --git a/yarn.lock b/yarn.lock index 3da8cd17..af6bd2ec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,12 +7,12 @@ resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz#d2a39395c587e092d77cbbc80acf956a54f38bf7" integrity sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q== -"@axelar-network/axelar-gmp-sdk-solidity@5.6.2": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@axelar-network/axelar-gmp-sdk-solidity/-/axelar-gmp-sdk-solidity-5.6.2.tgz#9a48a5ef7f00490898d8d33e0756b35416069fd2" - integrity sha512-lJT1Sily/to5jZHkE3rGtkb8qnurNTFnlz4HwbQec+MtqVgPkY3/SsiPTw7967hmZavAw02eiE1jFSW7XKksZQ== +"@axelar-network/axelar-gmp-sdk-solidity@5.6.4": + version "5.6.4" + resolved "https://registry.yarnpkg.com/@axelar-network/axelar-gmp-sdk-solidity/-/axelar-gmp-sdk-solidity-5.6.4.tgz#fe224ff039f86f1cbf72d9b53339a8354f531b65" + integrity sha512-PQjV+HeJynmSRMhyM3SexwnbFNruSaiRUeNCWjV8/7CkdPsDqypoqIXVRVU8Zk92DUUHeqZZzL/3qP2LYuvlnA== -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.24.7": +"@babel/code-frame@^7.0.0": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== @@ -20,60 +20,7 @@ "@babel/highlight" "^7.24.7" picocolors "^1.0.0" -"@babel/generator@7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.7.tgz#8da2599beb4a86194a3b24df6c085931d9ee45ad" - integrity sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w== - dependencies: - "@babel/types" "^7.17.0" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/generator@^7.23.0": - version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.6.tgz#0df1ad8cb32fe4d2b01d8bf437f153d19342a87c" - integrity sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw== - dependencies: - "@babel/types" "^7.25.6" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^2.5.1" - -"@babel/helper-environment-visitor@^7.22.20": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9" - integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-function-name@^7.23.0": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz#75f1e1725742f39ac6584ee0b16d94513da38dd2" - integrity sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA== - dependencies: - "@babel/template" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz#b4ede1cde2fd89436397f30dc9376ee06b0f25ee" - integrity sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-split-export-declaration@^7.22.6": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz#83949436890e07fa3d6873c61a96e3bbf692d856" - integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-string-parser@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" - integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== - -"@babel/helper-validator-identifier@^7.16.7", "@babel/helper-validator-identifier@^7.24.7": +"@babel/helper-validator-identifier@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== @@ -88,13 +35,6 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.20.5", "@babel/parser@^7.23.0", "@babel/parser@^7.25.0": - version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f" - integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q== - dependencies: - "@babel/types" "^7.25.6" - "@babel/runtime@^7.25.0": version "7.25.6" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.6.tgz#9afc3289f7184d8d7f98b099884c26317b9264d2" @@ -102,48 +42,6 @@ dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.24.7": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" - integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== - dependencies: - "@babel/code-frame" "^7.24.7" - "@babel/parser" "^7.25.0" - "@babel/types" "^7.25.0" - -"@babel/traverse@7.23.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" - integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.0" - "@babel/types" "^7.23.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@7.17.0": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" - integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - to-fast-properties "^2.0.0" - -"@babel/types@^7.17.0", "@babel/types@^7.23.0", "@babel/types@^7.24.7", "@babel/types@^7.25.0", "@babel/types@^7.25.6": - version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6" - integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw== - dependencies: - "@babel/helper-string-parser" "^7.24.8" - "@babel/helper-validator-identifier" "^7.24.7" - to-fast-properties "^2.0.0" - "@chainlink/contracts-ccip@0.7.6": version "0.7.6" resolved "https://registry.yarnpkg.com/@chainlink/contracts-ccip/-/contracts-ccip-0.7.6.tgz#5bf4568a0bbf4e29d2e8c32348e5ecc6ced006d2" @@ -262,7 +160,7 @@ resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== -"@commitlint/cli@^17.3.0", "@commitlint/cli@^17.5.1": +"@commitlint/cli@^17.5.1": version "17.8.1" resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-17.8.1.tgz#10492114a022c91dcfb1d84dac773abb3db76d33" integrity sha512-ay+WbzQesE0Rv4EQKfNbSMiJJ12KdKTDzIt0tcK4k11FdsWmtwP0Kp1NWMOUswfIWo6Eb7p7Ln721Nx9FLNBjg== @@ -278,7 +176,7 @@ resolve-global "1.0.0" yargs "^17.0.0" -"@commitlint/config-conventional@^17.3.0", "@commitlint/config-conventional@^17.4.4": +"@commitlint/config-conventional@^17.4.4": version "17.8.1" resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-17.8.1.tgz#e5bcf0cfec8da7ac50bc04dc92e0a4ea74964ce0" integrity sha512-NxCOHx1kgneig3VLauWJcDWS40DVjg7nKOpBEEK9E5fjJpQqLCilcnKkIIjdBH98kEO1q3NpE5NSrZ2kl/QGJg== @@ -293,14 +191,6 @@ "@commitlint/types" "^17.8.1" ajv "^8.11.0" -"@commitlint/config-validator@^19.5.0": - version "19.5.0" - resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-19.5.0.tgz#f0a4eda2109fc716ef01bb8831af9b02e3a1e568" - integrity sha512-CHtj92H5rdhKt17RmgALhfQt95VayrUo2tSqY9g2w+laAXyk7K/Ef6uPm9tn5qSIwSmrLjKaXK9eiNuxmQrDBw== - dependencies: - "@commitlint/types" "^19.5.0" - ajv "^8.11.0" - "@commitlint/ensure@^17.8.1": version "17.8.1" resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-17.8.1.tgz#59183557844999dbb6aab6d03629a3d104d01a8d" @@ -318,11 +208,6 @@ resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-17.8.1.tgz#504ed69eb61044eeb84fdfd10cc18f0dab14f34c" integrity sha512-JHVupQeSdNI6xzA9SqMF+p/JjrHTcrJdI02PwesQIDCIGUrv04hicJgCcws5nzaoZbROapPs0s6zeVHoxpMwFQ== -"@commitlint/execute-rule@^19.5.0": - version "19.5.0" - resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-19.5.0.tgz#c13da8c03ea0379f30856111e27d57518e25b8a2" - integrity sha512-aqyGgytXhl2ejlk+/rfgtwpPexYyri4t8/n4ku6rRJoRhGZpLFMqrZ+YaubeGysCP6oz4mMA34YSTaSOKEeNrg== - "@commitlint/format@^17.8.1": version "17.8.1" resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-17.8.1.tgz#6108bb6b4408e711006680649927e1b559bdc5f8" @@ -349,22 +234,6 @@ "@commitlint/rules" "^17.8.1" "@commitlint/types" "^17.8.1" -"@commitlint/load@>6.1.1": - version "19.5.0" - resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-19.5.0.tgz#67f90a294894d1f99b930b6152bed2df44a81794" - integrity sha512-INOUhkL/qaKqwcTUvCE8iIUf5XHsEPCLY9looJ/ipzi7jtGhgmtH7OOFiNvwYgH7mA8osUWOUDV8t4E2HAi4xA== - dependencies: - "@commitlint/config-validator" "^19.5.0" - "@commitlint/execute-rule" "^19.5.0" - "@commitlint/resolve-extends" "^19.5.0" - "@commitlint/types" "^19.5.0" - chalk "^5.3.0" - cosmiconfig "^9.0.0" - cosmiconfig-typescript-loader "^5.0.0" - lodash.isplainobject "^4.0.6" - lodash.merge "^4.6.2" - lodash.uniq "^4.5.0" - "@commitlint/load@^17.8.1": version "17.8.1" resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-17.8.1.tgz#fa061e7bfa53281eb03ca8517ca26d66a189030c" @@ -422,18 +291,6 @@ resolve-from "^5.0.0" resolve-global "^1.0.0" -"@commitlint/resolve-extends@^19.5.0": - version "19.5.0" - resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-19.5.0.tgz#f3ec33e12d10df90cae0bfad8e593431fb61b18e" - integrity sha512-CU/GscZhCUsJwcKTJS9Ndh3AKGZTNFIOoQB2n8CmFnizE0VnEuJoum+COW+C1lNABEeqk6ssfc1Kkalm4bDklA== - dependencies: - "@commitlint/config-validator" "^19.5.0" - "@commitlint/types" "^19.5.0" - global-directory "^4.0.1" - import-meta-resolve "^4.0.0" - lodash.mergewith "^4.6.2" - resolve-from "^5.0.0" - "@commitlint/rules@^17.8.1": version "17.8.1" resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-17.8.1.tgz#da49cab1b7ebaf90d108de9f58f684dc4ccb65a0" @@ -464,14 +321,6 @@ dependencies: chalk "^4.1.0" -"@commitlint/types@^19.5.0": - version "19.5.0" - resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-19.5.0.tgz#c5084d1231d4dd50e40bdb656ee7601f691400b3" - integrity sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg== - dependencies: - "@types/conventional-commits-parser" "^5.0.0" - chalk "^5.3.0" - "@connext/interfaces@2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@connext/interfaces/-/interfaces-2.0.0.tgz#17f27a516315e40a440c3ef34db83834ad51917f" @@ -529,24 +378,24 @@ 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== +"@eslint/js@8.57.1": + version "8.57.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== -"@eth-optimism/contracts@^0.5.21": - version "0.5.40" - resolved "https://registry.yarnpkg.com/@eth-optimism/contracts/-/contracts-0.5.40.tgz#d13a04a15ea947a69055e6fc74d87e215d4c936a" - integrity sha512-MrzV0nvsymfO/fursTB7m/KunkPsCndltVgfdHaT1Aj5Vi6R/doKIGGkOofHX+8B6VMZpuZosKCMQ5lQuqjt8w== +"@eth-optimism/contracts@0.6.0", "@eth-optimism/contracts@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@eth-optimism/contracts/-/contracts-0.6.0.tgz#15ae76222a9b4d958a550cafb1960923af613a31" + integrity sha512-vQ04wfG9kMf1Fwy3FEMqH2QZbgS0gldKhcBeBUPfO8zu68L61VI97UDXmsMQXzTsEAxK8HnokW3/gosl4/NW3w== dependencies: "@eth-optimism/core-utils" "0.12.0" "@ethersproject/abstract-provider" "^5.7.0" "@ethersproject/abstract-signer" "^5.7.0" -"@eth-optimism/contracts@^0.6.0": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@eth-optimism/contracts/-/contracts-0.6.0.tgz#15ae76222a9b4d958a550cafb1960923af613a31" - integrity sha512-vQ04wfG9kMf1Fwy3FEMqH2QZbgS0gldKhcBeBUPfO8zu68L61VI97UDXmsMQXzTsEAxK8HnokW3/gosl4/NW3w== +"@eth-optimism/contracts@^0.5.21": + version "0.5.40" + resolved "https://registry.yarnpkg.com/@eth-optimism/contracts/-/contracts-0.5.40.tgz#d13a04a15ea947a69055e6fc74d87e215d4c936a" + integrity sha512-MrzV0nvsymfO/fursTB7m/KunkPsCndltVgfdHaT1Aj5Vi6R/doKIGGkOofHX+8B6VMZpuZosKCMQ5lQuqjt8w== dependencies: "@eth-optimism/core-utils" "0.12.0" "@ethersproject/abstract-provider" "^5.7.0" @@ -1062,12 +911,12 @@ resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== -"@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== +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== dependencies: - "@humanwhocodes/object-schema" "^2.0.2" + "@humanwhocodes/object-schema" "^2.0.3" debug "^4.3.1" minimatch "^3.0.5" @@ -1076,7 +925,7 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.2": +"@humanwhocodes/object-schema@^2.0.3": 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== @@ -1101,26 +950,12 @@ bignumber.js "^9.1.1" ethers "^5.7.2" -"@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.0.3", "@jridgewell/resolve-uri@^3.1.0": +"@jridgewell/resolve-uri@^3.0.3": 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/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": +"@jridgewell/sourcemap-codec@^1.4.10": version "1.5.0" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== @@ -1133,14 +968,6 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@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" - "@layerzerolabs/lz-evm-messagelib-v2@^2.3.29": version "2.3.42" resolved "https://registry.yarnpkg.com/@layerzerolabs/lz-evm-messagelib-v2/-/lz-evm-messagelib-v2-2.3.42.tgz#224e8b07940b829fc8955ec97987526da17625fd" @@ -1413,9 +1240,9 @@ ordinal "^1.0.3" "@nomicfoundation/hardhat-network-helpers@^1.0.8": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.11.tgz#64096829661b960b88679bd5c4fbcb50654672d1" - integrity sha512-uGPL7QSKvxrHRU69dx8jzoBvuztlLCtyFsbgfXIwIjnO3dqZRz2GNMHJoO3C3dIiUNM6jdNF4AUnoQKDscdYrA== + version "1.0.12" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.12.tgz#2c0abec0c50b75f9d0d71776e49e3b5ef746d289" + integrity sha512-xTNQNI/9xkHvjmCJnJOTyqDSl8uq1rKb2WOVmixQxFtRd7Oa3ecO8zM0cyC2YmOK+jHB9WPZ+F/ijkHg1CoORA== dependencies: ethereumjs-util "^7.1.4" @@ -1572,16 +1399,11 @@ "@openzeppelin/contracts" "^4.4.1" "@openzeppelin/contracts-upgradeable" "^4.7.3" -"@scure/base@^1.1.1", "@scure/base@~1.1.2": +"@scure/base@^1.1.1", "@scure/base@~1.1.0", "@scure/base@~1.1.2", "@scure/base@~1.1.6", "@scure/base@~1.1.8": version "1.1.9" resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1" integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg== -"@scure/base@~1.1.0", "@scure/base@~1.1.6", "@scure/base@~1.1.8": - version "1.1.8" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.8.tgz#8f23646c352f020c83bca750a82789e246d42b50" - integrity sha512-6CyAclxj3Nb0XT7GHK6K4zK6k2xJm6E4Ft0Ohjt4WgegiFUHEtFb2CGzmPmGBwoIhrLsqNLYfLr04Y1GePrzZg== - "@scure/bip32@1.1.5": version "1.1.5" resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" @@ -1763,18 +1585,6 @@ dependencies: tslib "^2.4.0" -"@trivago/prettier-plugin-sort-imports@^4.0.0": - version "4.3.0" - resolved "https://registry.yarnpkg.com/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.3.0.tgz#725f411646b3942193a37041c84e0b2116339789" - integrity sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ== - dependencies: - "@babel/generator" "7.17.7" - "@babel/parser" "^7.20.5" - "@babel/traverse" "7.23.2" - "@babel/types" "7.17.0" - javascript-natural-sort "0.7.1" - lodash "^4.17.21" - "@tsconfig/node10@^1.0.7": version "1.0.11" resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" @@ -1850,13 +1660,6 @@ dependencies: "@types/node" "*" -"@types/conventional-commits-parser@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz#8c9d23e0b415b24b91626d07017303755d542dc8" - integrity sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ== - dependencies: - "@types/node" "*" - "@types/debug@^4.1.9": version "4.1.12" resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" @@ -1871,13 +1674,6 @@ dependencies: "@types/node" "*" -"@types/fs-extra@^9.0.13": - version "9.0.13" - resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" - integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== - dependencies: - "@types/node" "*" - "@types/glob@^7.1.1": version "7.2.0" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" @@ -1929,9 +1725,9 @@ integrity sha512-0ikrnug3/IyneSHqCBeslAhlK2aBfYek1fGo4bP4QnZPmiqSGRK+Oy7ZMisLWkesffJvQ1cqAcBnJC+8+nxIAg== "@types/node@*": - version "22.5.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.5.tgz#52f939dd0f65fc552a4ad0b392f3c466cc5d7a44" - integrity sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA== + version "22.6.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.6.1.tgz#e531a45f4d78f14a8468cb9cdc29dc9602afc7ac" + integrity sha512-V48tCfcKb/e6cVUigLAaJDAILdMP0fUW6BidkPK4GpGjXcfbnoHasCZDwz3N3yVt5we2RHm4XTQCpv0KJz9zqw== dependencies: undici-types "~6.19.2" @@ -1958,9 +1754,9 @@ undici-types "~5.26.4" "@types/node@^20.8.9": - version "20.16.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.16.5.tgz#d43c7f973b32ffdf9aa7bd4f80e1072310fd7a53" - integrity sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA== + version "20.16.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.16.6.tgz#0bf99fcebcee68ecdc2c45b160a10a0fe5c652b8" + integrity sha512-T7PpxM/6yeDE+AdlVysT62BX6/bECZOmQAgiFg5NoBd5MQheZ3tzal7f1wvzfiEcmrcJNRi2zRr2nY2zF+0uqw== dependencies: undici-types "~6.19.2" @@ -2018,6 +1814,26 @@ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== +"@types/sinon-chai@3.2.12": + version "3.2.12" + resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-3.2.12.tgz#c7cb06bee44a534ec84f3a5534c3a3a46fd779b6" + integrity sha512-9y0Gflk3b0+NhQZ/oxGtaAJDvRywCa5sIyaVnounqLvmf93yBF4EgIRspePtkMs3Tr844nCclYMlcCNmLCvjuQ== + dependencies: + "@types/chai" "*" + "@types/sinon" "*" + +"@types/sinon@*": + version "17.0.3" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-17.0.3.tgz#9aa7e62f0a323b9ead177ed23a36ea757141a5fa" + integrity sha512-j3uovdn8ewky9kRBG19bOwaZbexJu/XjtkHyjvUgt4xfPFz18dcORIMqnYh66Fx3Powhcr85NT5+er3+oViapw== + dependencies: + "@types/sinonjs__fake-timers" "*" + +"@types/sinonjs__fake-timers@*": + version "8.1.5" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz#5fd3592ff10c1e9695d377020c033116cc2889f2" + integrity sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ== + "@types/triple-beam@^1.3.2": version "1.3.5" resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" @@ -2354,20 +2170,13 @@ ansi-colors@^4.1.1, ansi-colors@^4.1.3: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== -ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: +ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" -ansi-escapes@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-5.0.0.tgz#b6a0caf0eef0c41af190e9a749e0c00ec04bb2a6" - integrity sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA== - dependencies: - type-fest "^1.0.2" - ansi-regex@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" @@ -2378,11 +2187,6 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-regex@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" - integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== - ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -2397,11 +2201,6 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -ansi-styles@^6.0.0, ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - antlr4@^4.11.0: version "4.13.2" resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.13.2.tgz#0d084ad0e32620482a9c3a0e2470c02e72e4006d" @@ -2581,15 +2380,6 @@ bindings@^1.3.0: dependencies: file-uri-to-path "1.0.0" -bl@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - blakejs@^1.1.0: version "1.2.1" resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" @@ -2634,7 +2424,7 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.2, braces@^3.0.3, braces@~3.0.2: +braces@^3.0.3, braces@~3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== @@ -2712,14 +2502,6 @@ buffer@6.0.3, buffer@^6.0.3, buffer@~6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - bufferutil@^4.0.1: version "4.0.8" resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.8.tgz#1de6a71092d65d7766c4d8a522b261a6e787e8ea" @@ -2737,11 +2519,6 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -cachedir@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" - integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== - call-bind@^1.0.5, call-bind@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" @@ -2819,11 +2596,6 @@ chai@^4.3.4, chai@^4.3.7: pathval "^1.1.1" type-detect "^4.1.0" -chalk@5.3.0, chalk@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" - integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== - chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -2833,7 +2605,7 @@ chalk@^2.4.1, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2841,11 +2613,6 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: 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== - "charenc@>= 0.0.1": version "0.0.2" resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" @@ -2907,25 +2674,6 @@ clean-stack@^2.0.0: resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-cursor@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea" - integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== - dependencies: - restore-cursor "^4.0.0" - -cli-spinners@^2.5.0: - version "2.9.2" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" - integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== - cli-table3@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" @@ -2936,19 +2684,6 @@ cli-table3@^0.5.0: optionalDependencies: colors "^1.1.2" -cli-truncate@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" - integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== - dependencies: - slice-ansi "^5.0.0" - string-width "^5.0.0" - -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== - cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -2967,11 +2702,6 @@ cliui@^8.0.1: strip-ansi "^6.0.1" wrap-ansi "^7.0.0" -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== - color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -3012,11 +2742,6 @@ color@^3.1.3: color-convert "^1.9.3" color-string "^1.6.0" -colorette@^2.0.20: - version "2.0.20" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" - integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== - colors@1.4.0, colors@^1.1.2: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" @@ -3062,11 +2787,6 @@ command-line-usage@^6.1.0: table-layout "^1.0.2" typical "^5.2.0" -commander@11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-11.0.0.tgz#43e19c25dbedc8256203538e8d7e9346877a6f67" - integrity sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ== - commander@3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" @@ -3082,26 +2802,6 @@ commander@^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== -commitizen@^4.0.3, commitizen@^4.2.5: - version "4.3.0" - resolved "https://registry.yarnpkg.com/commitizen/-/commitizen-4.3.0.tgz#0d056c542a2d2b1f9b9aba981aa32575b2849924" - integrity sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw== - dependencies: - cachedir "2.3.0" - cz-conventional-changelog "3.3.0" - dedent "0.7.0" - detect-indent "6.1.0" - find-node-modules "^2.1.2" - find-root "1.1.0" - fs-extra "9.1.0" - glob "7.2.3" - inquirer "8.2.5" - is-utf8 "^0.2.1" - lodash "4.17.21" - minimist "1.2.7" - strip-bom "4.0.0" - strip-json-comments "3.1.1" - compare-func@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" @@ -3139,11 +2839,6 @@ conventional-changelog-conventionalcommits@^6.1.0: dependencies: compare-func "^2.0.0" -conventional-commit-types@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz#7c9214e58eae93e85dd66dbfbafe7e4fffa2365b" - integrity sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg== - conventional-commits-parser@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-4.0.0.tgz#02ae1178a381304839bce7cea9da5f1b549ae505" @@ -3169,13 +2864,6 @@ cosmiconfig-typescript-loader@^4.0.0: resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.4.0.tgz#f3feae459ea090f131df5474ce4b1222912319f9" integrity sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw== -cosmiconfig-typescript-loader@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.0.0.tgz#0d3becfe022a871f7275ceb2397d692e06045dc8" - integrity sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA== - dependencies: - jiti "^1.19.1" - cosmiconfig@^8.0.0: version "8.3.6" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" @@ -3186,16 +2874,6 @@ cosmiconfig@^8.0.0: parse-json "^5.2.0" path-type "^4.0.0" -cosmiconfig@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" - integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== - dependencies: - env-paths "^2.2.1" - import-fresh "^3.3.0" - js-yaml "^4.1.0" - parse-json "^5.2.0" - crc-32@^1.2.0: version "1.2.2" resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" @@ -3229,14 +2907,7 @@ create-require@^1.1.0: resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== -cross-env@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" - integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== - dependencies: - cross-spawn "^7.0.1" - -cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: +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== @@ -3250,20 +2921,6 @@ cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== -cz-conventional-changelog@3.3.0, cz-conventional-changelog@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz#9246947c90404149b3fe2cf7ee91acad3b7d22d2" - integrity sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw== - dependencies: - chalk "^2.4.1" - commitizen "^4.0.3" - conventional-commit-types "^3.0.0" - lodash.map "^4.5.1" - longest "^2.0.1" - word-wrap "^1.0.3" - optionalDependencies: - "@commitlint/load" ">6.1.1" - dargs@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" @@ -3274,20 +2931,13 @@ death@^1.1.0: resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" integrity sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w== -debug@4, debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5: +debug@4, debug@^4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5: version "4.3.7" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== dependencies: ms "^2.1.3" -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" - decamelize-keys@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" @@ -3306,11 +2956,6 @@ decamelize@^4.0.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== -dedent@0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== - deep-eql@^4.0.1, deep-eql@^4.1.3: version "4.1.4" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7" @@ -3328,13 +2973,6 @@ deep-is@^0.1.3, deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -defaults@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" - integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== - dependencies: - clone "^1.0.2" - 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" @@ -3359,16 +2997,6 @@ depd@2.0.0: resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -detect-file@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" - integrity sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q== - -detect-indent@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" - integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== - diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" @@ -3416,11 +3044,6 @@ dotenv@^16.0.3, dotenv@^16.3.1: version "1.0.0" resolved "https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0" -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - elliptic@6.5.4: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" @@ -3452,11 +3075,6 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - enabled@2.0.x: version "2.0.0" resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" @@ -3475,7 +3093,7 @@ enquirer@^2.3.0, enquirer@^2.3.6: ansi-colors "^4.1.1" strip-ansi "^6.0.1" -env-paths@^2.2.0, env-paths@^2.2.1: +env-paths@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== @@ -3570,15 +3188,15 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^8.28.0, eslint@^8.51.0: - version "8.57.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + version "8.57.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== 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" + "@eslint/js" "8.57.1" + "@humanwhocodes/config-array" "^0.13.0" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" "@ungap/structured-clone" "^1.2.0" @@ -3830,21 +3448,6 @@ evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -execa@7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-7.2.0.tgz#657e75ba984f42a70f38928cedc87d6f2d4fe4e9" - integrity sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.1" - human-signals "^4.3.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^3.0.7" - strip-final-newline "^3.0.0" - execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -3860,22 +3463,6 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -expand-tilde@^2.0.0, expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" - integrity sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw== - dependencies: - homedir-polyfill "^1.0.1" - -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" - eyes@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" @@ -3934,13 +3521,6 @@ fecha@^4.2.0: resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -3960,14 +3540,6 @@ fill-range@^7.1.1: dependencies: to-regex-range "^5.0.1" -find-node-modules@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/find-node-modules/-/find-node-modules-2.1.3.tgz#3c976cff2ca29ee94b4f9eafc613987fc4c0ee44" - integrity sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg== - dependencies: - findup-sync "^4.0.0" - merge "^2.1.1" - find-replace@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" @@ -3975,11 +3547,6 @@ find-replace@^3.0.0: dependencies: array-back "^3.0.1" -find-root@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" - integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== - find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" @@ -4010,16 +3577,6 @@ find-yarn-workspace-root@^2.0.0: dependencies: micromatch "^4.0.2" -findup-sync@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-4.0.0.tgz#956c9cdde804052b881b428512905c4a5f2cdef0" - integrity sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ== - dependencies: - detect-file "^1.0.0" - is-glob "^4.0.0" - micromatch "^4.0.2" - resolve-dir "^1.0.1" - flat-cache@^3.0.4: version "3.2.0" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" @@ -4089,16 +3646,6 @@ fp-ts@^1.0.0: resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== -fs-extra@9.1.0, fs-extra@^9.0.0, fs-extra@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - fs-extra@^0.30.0: version "0.30.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" @@ -4110,7 +3657,7 @@ fs-extra@^0.30.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" -fs-extra@^10.0.0, fs-extra@^10.1.0: +fs-extra@^10.0.0: version "10.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== @@ -4146,6 +3693,16 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^9.0.0, fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-readdir-recursive@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" @@ -4197,7 +3754,7 @@ get-port@^3.1.0: resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" integrity sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg== -get-stream@^6.0.0, get-stream@^6.0.1: +get-stream@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== @@ -4259,26 +3816,26 @@ glob@7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.2.3, glob@^7.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== +glob@^5.0.15: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== dependencies: - fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.1.1" + minimatch "2 || 3" once "^1.3.0" path-is-absolute "^1.0.0" -glob@^5.0.15: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== +glob@^7.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 "2 || 3" + minimatch "^3.1.1" once "^1.3.0" path-is-absolute "^1.0.0" @@ -4293,13 +3850,6 @@ glob@^8.0.3, glob@^8.1.0: minimatch "^5.0.1" once "^1.3.0" -global-directory@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/global-directory/-/global-directory-4.0.1.tgz#4d7ac7cfd2cb73f304c53b8810891748df5e361e" - integrity sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q== - dependencies: - ini "4.1.1" - global-dirs@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" @@ -4307,15 +3857,6 @@ global-dirs@^0.1.1: dependencies: ini "^1.3.4" -global-modules@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" - integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== - dependencies: - global-prefix "^1.0.1" - is-windows "^1.0.1" - resolve-dir "^1.0.0" - global-modules@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" @@ -4323,17 +3864,6 @@ global-modules@^2.0.0: dependencies: global-prefix "^3.0.0" -global-prefix@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" - integrity sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg== - dependencies: - expand-tilde "^2.0.2" - homedir-polyfill "^1.0.1" - ini "^1.3.4" - is-windows "^1.0.1" - which "^1.2.14" - global-prefix@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" @@ -4343,11 +3873,6 @@ global-prefix@^3.0.0: kind-of "^6.0.2" which "^1.3.1" -globals@^11.1.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" @@ -4588,13 +4113,6 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -homedir-polyfill@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" - integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== - dependencies: - parse-passwd "^1.0.0" - hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" @@ -4648,11 +4166,6 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -human-signals@^4.3.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" - integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== - humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" @@ -4665,14 +4178,14 @@ husky@^8.0.3: resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== -iconv-lite@0.4.24, iconv-lite@^0.4.24: +iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" -ieee754@^1.1.13, ieee754@^1.2.1: +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== @@ -4700,11 +4213,6 @@ import-fresh@^3.0.0, import-fresh@^3.2.1, import-fresh@^3.3.0: parent-module "^1.0.0" resolve-from "^4.0.0" -import-meta-resolve@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz#f9db8bead9fafa61adb811db77a2bf22c5399706" - integrity sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw== - imul@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/imul/-/imul-1.0.1.tgz#9d5867161e8b3de96c2c38d5dc7cb102f35e2ac9" @@ -4733,37 +4241,11 @@ inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, i resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ini@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" - integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== - ini@^1.3.4, ini@^1.3.5: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -inquirer@8.2.5: - version "8.2.5" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.5.tgz#d8654a7542c35a9b9e069d27e2df4858784d54f8" - integrity sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.1" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.21" - mute-stream "0.0.8" - ora "^5.4.1" - run-async "^2.4.0" - rxjs "^7.5.5" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - wrap-ansi "^7.0.0" - interpret@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" @@ -4825,11 +4307,6 @@ is-fullwidth-code-point@^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-fullwidth-code-point@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" - integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== - is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -4842,11 +4319,6 @@ is-hex-prefixed@1.0.0: resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== -is-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -4877,11 +4349,6 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - is-text-path@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" @@ -4894,16 +4361,6 @@ is-unicode-supported@^0.1.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== -is-utf8@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== - -is-windows@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - is-wsl@^2.1.1: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" @@ -4941,11 +4398,6 @@ isows@1.0.4: resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.4.tgz#810cd0d90cc4995c26395d2aa4cfa4037ebdf061" integrity sha512-hEzjY+x9u9hPmBom9IIAqdJCwNLax+xrPb51vEPpERoFlIxgmZcHzsT5jKG06nvInKOBGvReAVz80Umed5CczQ== -javascript-natural-sort@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59" - integrity sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw== - jayson@^4.1.1: version "4.1.2" resolved "https://registry.yarnpkg.com/jayson/-/jayson-4.1.2.tgz#443c26a8658703e0b2e881117b09395d88b6982e" @@ -4964,11 +4416,6 @@ jayson@^4.1.1: uuid "^8.3.2" ws "^7.5.10" -jiti@^1.19.1: - version "1.21.6" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" - integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== - js-sdsl@^4.1.4: version "4.4.2" resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.2.tgz#2e3c031b1f47d3aca8b775532e3ebb0818e7f847" @@ -4999,11 +4446,6 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - json-buffer@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" @@ -5160,44 +4602,11 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -lilconfig@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -lint-staged@^13.0.4: - version "13.3.0" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-13.3.0.tgz#7965d72a8d6a6c932f85e9c13ccf3596782d28a5" - integrity sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ== - dependencies: - chalk "5.3.0" - commander "11.0.0" - debug "4.3.4" - execa "7.2.0" - lilconfig "2.1.0" - listr2 "6.6.1" - micromatch "4.0.5" - pidtree "0.6.0" - string-argv "0.3.2" - yaml "2.3.1" - -listr2@6.6.1: - version "6.6.1" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-6.6.1.tgz#08b2329e7e8ba6298481464937099f4a2cd7f95d" - integrity sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg== - dependencies: - cli-truncate "^3.1.0" - colorette "^2.0.20" - eventemitter3 "^5.0.1" - log-update "^5.0.1" - rfdc "^1.3.0" - wrap-ansi "^8.1.0" - locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -5245,11 +4654,6 @@ lodash.kebabcase@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== -lodash.map@^4.5.1: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" - integrity sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q== - lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" @@ -5285,7 +4689,7 @@ lodash.upperfirst@^4.3.1: resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== -lodash@4.17.21, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21: +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -5298,17 +4702,6 @@ log-symbols@^4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" -log-update@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-5.0.1.tgz#9e928bf70cb183c1f0c9e91d9e6b7115d597ce09" - integrity sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw== - dependencies: - ansi-escapes "^5.0.0" - cli-cursor "^4.0.0" - slice-ansi "^5.0.0" - strip-ansi "^7.0.1" - wrap-ansi "^8.0.1" - logform@^2.6.0, logform@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/logform/-/logform-2.6.1.tgz#71403a7d8cae04b2b734147963236205db9b3df0" @@ -5321,11 +4714,6 @@ logform@^2.6.0, logform@^2.6.1: safe-stable-stringify "^2.3.1" triple-beam "^1.3.0" -longest@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-2.0.1.tgz#781e183296aa94f6d4d916dc335d0d17aefa23f8" - integrity sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q== - loupe@^2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" @@ -5442,24 +4830,11 @@ merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -merge@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/merge/-/merge-2.1.1.tgz#59ef4bf7e0b3e879186436e8481c06a6c162ca98" - integrity sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w== - 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.5: - 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" - micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.8" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" @@ -5485,11 +4860,6 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - min-indent@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" @@ -5535,12 +4905,7 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== - -minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6: +minimist@^1.2.5, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -5564,7 +4929,7 @@ mnemonist@^0.38.0: dependencies: obliterator "^2.0.0" -mocha@^10.0.0, mocha@^10.1.0, mocha@^10.2.0: +mocha@^10.0.0, mocha@^10.2.0: version "10.7.3" resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.7.3.tgz#ae32003cabbd52b59aece17846056a68eb4b0752" integrity sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A== @@ -5612,11 +4977,6 @@ mongodb@6.5.0: bson "^6.4.0" mongodb-connection-string-url "^3.0.0" -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.0.0, ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" @@ -5631,11 +4991,6 @@ murmur-128@^0.2.1: fmix "^0.1.0" imul "^1.0.0" -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - napi-macros@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.2.2.tgz#817fef20c3e0e40a963fbf7b37d1600bd0201044" @@ -5681,9 +5036,9 @@ node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: integrity sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw== nodemon@^3.0.1: - version "3.1.4" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.1.4.tgz#c34dcd8eb46a05723ccde60cbdd25addcc8725e4" - integrity sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ== + version "3.1.7" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.1.7.tgz#07cb1f455f8bece6a499e0d72b5e029485521a54" + integrity sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ== dependencies: chokidar "^3.5.2" debug "^4" @@ -5740,13 +5095,6 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" -npm-run-path@^5.1.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" - integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== - dependencies: - path-key "^4.0.0" - number-to-bn@1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" @@ -5789,20 +5137,13 @@ one-time@^1.0.0: dependencies: fn.name "1.x.x" -onetime@^5.1.0, onetime@^5.1.2: +onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - open@^7.4.2: version "7.4.2" resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" @@ -5840,21 +5181,6 @@ optionator@^0.9.3: type-check "^0.4.0" word-wrap "^1.2.5" -ora@^5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" - integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== - dependencies: - bl "^4.1.0" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-spinners "^2.5.0" - is-interactive "^1.0.0" - is-unicode-supported "^0.1.0" - log-symbols "^4.1.0" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - ordinal@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/ordinal/-/ordinal-1.0.3.tgz#1a3c7726a61728112f50944ad7c35c06ae3a0d4d" @@ -5946,11 +5272,6 @@ parse-json@^5.0.0, parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== - patch-package@8.0.0, patch-package@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-8.0.0.tgz#d191e2f1b6e06a4624a0116bcb88edd6714ede61" @@ -5992,11 +5313,6 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - path-parse@^1.0.6, path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" @@ -6033,21 +5349,11 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pidtree@0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" - integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== - pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -pinst@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pinst/-/pinst-3.0.0.tgz#80dec0a85f1f993c6084172020f3dbf512897eec" - integrity sha512-cengSmBxtCyaJqtRSvJorIIZXMXg+lJ3sIljGmtBGUVonMnMsVJbnzl6jGN1HkOWwxNuJynCJ2hXxxqCQrFDdw== - pluralize@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" @@ -6258,14 +5564,6 @@ require-from-string@^2.0.0, require-from-string@^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== -resolve-dir@^1.0.0, resolve-dir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" - integrity sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg== - dependencies: - expand-tilde "^2.0.0" - global-modules "^1.0.0" - resolve-from@5.0.0, resolve-from@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" @@ -6309,32 +5607,11 @@ resolve@^1.1.6, resolve@^1.10.0, resolve@^1.8.1: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -restore-cursor@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-4.0.0.tgz#519560a4318975096def6e609d44100edaa4ccb9" - integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== - dependencies: - onetime "^5.1.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== -rfdc@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" - integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== - rimraf@^2.2.8, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -6380,11 +5657,6 @@ rpc-websockets@^9.0.2: bufferutil "^4.0.1" utf-8-validate "^5.0.2" -run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - run-parallel-limit@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz#be80e936f5768623a38a963262d6bef8ff11e7ba" @@ -6411,13 +5683,6 @@ rustbn.js@~0.2.0: resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== -rxjs@^7.5.5: - version "7.8.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" - integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== - dependencies: - tslib "^2.1.0" - safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -6551,7 +5816,7 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shelljs@^0.8.3, shelljs@^0.8.5: +shelljs@^0.8.3: version "0.8.5" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== @@ -6560,14 +5825,6 @@ shelljs@^0.8.3, shelljs@^0.8.5: interpret "^1.0.0" rechoir "^0.6.2" -shx@^0.3.4: - version "0.3.4" - resolved "https://registry.yarnpkg.com/shx/-/shx-0.3.4.tgz#74289230b4b663979167f94e1935901406e40f02" - integrity sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g== - dependencies: - minimist "^1.2.3" - shelljs "^0.8.5" - side-channel@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" @@ -6578,7 +5835,7 @@ side-channel@^1.0.6: get-intrinsic "^1.2.4" object-inspect "^1.13.1" -signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: +signal-exit@^3.0.3: 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== @@ -6616,14 +5873,6 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" -slice-ansi@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" - integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== - dependencies: - ansi-styles "^6.0.0" - is-fullwidth-code-point "^4.0.0" - solc@0.7.3: version "0.7.3" resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" @@ -6717,11 +5966,6 @@ source-map-support@^0.5.13: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.5.0: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - 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" @@ -6796,11 +6040,6 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -string-argv@0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" - integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== - string-format@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" @@ -6823,15 +6062,6 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^5.0.0, string-width@^5.0.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -6860,28 +6090,11 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-bom@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - strip-hex-prefix@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" @@ -6896,7 +6109,7 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@3.1.1, strip-json-comments@^3.1.1: +strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -7020,7 +6233,7 @@ through2@^4.0.0: dependencies: readable-stream "3" -"through@>=2.2.7 <3", through@^2.3.6: +"through@>=2.2.7 <3": version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== @@ -7032,11 +6245,6 @@ tmp@0.0.33, tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - 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" @@ -7140,7 +6348,7 @@ tslib@^1.8.1, tslib@^1.9.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.1.0, tslib@^2.4.0: +tslib@^2.4.0: version "2.7.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== @@ -7216,11 +6424,6 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-fest@^1.0.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" - integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== - typechain@^8.1.1: version "8.3.2" resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.3.2.tgz#1090dd8d9c57b6ef2aed3640a516bdbf01b00d73" @@ -7381,9 +6584,9 @@ viem@^1.16.5: ws "8.13.0" viem@^2.9.28: - version "2.21.7" - resolved "https://registry.yarnpkg.com/viem/-/viem-2.21.7.tgz#c933fd3adb6f771e5c5fe2b4d7a14d8701ddc32f" - integrity sha512-PFgppakInuHX31wHDx1dzAjhj4t6Po6WrWtutDi33z2vabIT0Wv8qT6tl7DLqfLy2NkTqfN2mdshYLeoI5ZHvQ== + version "2.21.14" + resolved "https://registry.yarnpkg.com/viem/-/viem-2.21.14.tgz#2ce78d52d43dd97103102fcb0852b973a911f478" + integrity sha512-uM6XmY9Q/kJRVSopJAGsakmtNDpk/EswqXUzwOp9DzhGuwgpWtw2MgwpfFdIyqBDFIw+TTypCIUTcwJSgEYSzA== dependencies: "@adraffy/ens-normalize" "1.10.0" "@noble/curves" "1.4.0" @@ -7395,13 +6598,6 @@ viem@^2.9.28: webauthn-p256 "0.0.5" ws "8.17.1" -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== - dependencies: - defaults "^1.0.3" - web3-utils@^1.3.6: version "1.10.4" resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.4.tgz#0daee7d6841641655d8b3726baf33b08eda1cbec" @@ -7450,7 +6646,7 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" -which@^1.1.1, which@^1.2.14, which@^1.3.1: +which@^1.1.1, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -7490,7 +6686,7 @@ winston@^3.11.0: triple-beam "^1.3.0" winston-transport "^4.7.0" -word-wrap@^1.0.3, word-wrap@^1.2.5, word-wrap@~1.2.3: +word-wrap@^1.2.5, 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== @@ -7522,15 +6718,6 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -7576,11 +6763,6 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b" - integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== - yaml@^2.2.2: version "2.5.1" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.1.tgz#c9772aacf62cb7494a95b0c4f1fb065b563db130" From 76bd974eed0370a4c3c8e5d21ab28937b83b943d Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 24 Sep 2024 19:07:24 +0200 Subject: [PATCH 279/297] chore(global): rm patch-package --- package.json | 4 +--- yarn.lock | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 7b085274..d1bdd63c 100644 --- a/package.json +++ b/package.json @@ -6,14 +6,12 @@ "url": "https://github.com/gnosis" }, "scripts": { - "prepare": "husky install", - "postinstall": "patch-package" + "prepare": "husky install" }, "devDependencies": { "@commitlint/cli": "^17.5.1", "@commitlint/config-conventional": "^17.4.4", "husky": "^8.0.3", - "patch-package": "8.0.0", "prettier": "^2.8.7", "prettier-plugin-solidity": "^1.0.0" }, diff --git a/yarn.lock b/yarn.lock index af6bd2ec..9d8c7d3b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5272,7 +5272,7 @@ parse-json@^5.0.0, parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -patch-package@8.0.0, patch-package@^8.0.0: +patch-package@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-8.0.0.tgz#d191e2f1b6e06a4624a0116bcb88edd6714ede61" integrity sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA== From 94810c94e0afb34df91bdcdf8a4b196fd28f1e3f Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 24 Sep 2024 19:08:12 +0200 Subject: [PATCH 280/297] chore(evm): bumps version to 0.2.0 --- packages/evm/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/evm/package.json b/packages/evm/package.json index 9036ece5..8b0ff41c 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -2,7 +2,7 @@ "name": "@gnosis/hashi-evm", "private": true, "description": "", - "version": "0.1.1", + "version": "0.2.0", "author": { "name": "gnosis", "url": "https://github.com/gnosis" From b8bc96ed611f369f0f4a2aaef3778c7aa86a9dfd Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 25 Sep 2024 06:58:45 +0200 Subject: [PATCH 281/297] chore(global): bumps node version to 22 --- .nvmrc | 2 +- packages/common/package.json | 2 +- packages/common/tsconfig.json | 31 +- packages/executor/Dockerfile | 5 +- packages/executor/nodemon.json | 2 +- packages/executor/package.json | 3 +- packages/executor/src/index.ts | 326 +++---- packages/executor/tsconfig.json | 34 +- packages/relayer/Dockerfile | 5 +- packages/relayer/nodemon.json | 2 +- packages/relayer/package.json | 3 +- packages/relayer/src/index.ts | 244 ++--- packages/relayer/tsconfig.json | 35 +- packages/reporter/.nvmrc | 1 - packages/reporter/Dockerfile | 5 +- packages/reporter/README.md | 2 +- packages/reporter/nodemon.json | 3 +- packages/reporter/package.json | 11 +- .../src/ABIs/StandardReporterContractABI.json | 169 ---- packages/reporter/src/ABIs/WormholeABI.json | 9 - .../reporter/src/ABIs/WormholeAdapterABI.json | 375 -------- .../src/ABIs/WormholeReporterABI.json | 216 ----- packages/reporter/src/abi/standardReporter.ts | 169 ++++ packages/reporter/src/abi/wormhole.ts | 9 + packages/reporter/src/abi/wormholeAdapter.ts | 375 ++++++++ packages/reporter/src/abi/wormholeReporter.ts | 216 +++++ .../controllers/StandardReporterController.ts | 10 +- .../controllers/WormholeReporterController.ts | 18 +- packages/reporter/src/index.ts | 20 +- packages/reporter/src/utils/logger.ts | 28 - packages/reporter/src/utils/proofs.ts | 150 ---- packages/reporter/tsconfig.json | 36 +- yarn.lock | 850 +++++++++++++----- 33 files changed, 1723 insertions(+), 1643 deletions(-) delete mode 100644 packages/reporter/.nvmrc delete mode 100644 packages/reporter/src/ABIs/StandardReporterContractABI.json delete mode 100644 packages/reporter/src/ABIs/WormholeABI.json delete mode 100644 packages/reporter/src/ABIs/WormholeAdapterABI.json delete mode 100644 packages/reporter/src/ABIs/WormholeReporterABI.json create mode 100644 packages/reporter/src/abi/standardReporter.ts create mode 100644 packages/reporter/src/abi/wormhole.ts create mode 100644 packages/reporter/src/abi/wormholeAdapter.ts create mode 100644 packages/reporter/src/abi/wormholeReporter.ts delete mode 100644 packages/reporter/src/utils/logger.ts delete mode 100644 packages/reporter/src/utils/proofs.ts diff --git a/.nvmrc b/.nvmrc index 0828ab79..92f279e3 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v18 \ No newline at end of file +v22 \ No newline at end of file diff --git a/packages/common/package.json b/packages/common/package.json index 104f572f..ab728e53 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -6,7 +6,6 @@ "name": "gnosis", "url": "https://github.com/gnosis" }, - "type": "module", "main": "dist/index.js", "types": "dist/index.d.ts", "scripts": { @@ -21,6 +20,7 @@ "winston": "^3.11.0" }, "devDependencies": { + "@tsconfig/node22": "^22.0.0", "@types/node": "^20.8.9", "@typescript-eslint/eslint-plugin": "^6.7.5", "@typescript-eslint/parser": "^6.7.5", diff --git a/packages/common/tsconfig.json b/packages/common/tsconfig.json index 058a857b..b102f033 100644 --- a/packages/common/tsconfig.json +++ b/packages/common/tsconfig.json @@ -1,29 +1,6 @@ { + "extends": "@tsconfig/node22/tsconfig.json", "compilerOptions": { - "allowJs": false, - "allowSyntheticDefaultImports": true, - "checkJs": false, - "declaration": true, - "declarationMap": true, - "esModuleInterop": false, - "exactOptionalPropertyTypes": true, - "forceConsistentCasingInFileNames": true, - "importHelpers": true, - "incremental": true, - "lib": ["ES2022"], - "module": "ES2022", - "moduleResolution": "Bundler", - "noFallthroughCasesInSwitch": true, - "noImplicitOverride": true, - "noImplicitReturns": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "outDir": "./dist", - "rootDir": "./src", - "skipLibCheck": true, - "sourceMap": true, - "strict": true, - "target": "ES2022" - }, - "include": ["./src/**/*"] -} + "outDir": "./dist" + } +} \ No newline at end of file diff --git a/packages/executor/Dockerfile b/packages/executor/Dockerfile index 9c01c83b..029a2b2c 100644 --- a/packages/executor/Dockerfile +++ b/packages/executor/Dockerfile @@ -1,4 +1,4 @@ -FROM node:18-alpine +FROM node:22-alpine WORKDIR /usr/src/app @@ -9,7 +9,6 @@ COPY ../../package.json ../../yarn.lock ./ COPY ./packages/common ./packages/common COPY ./packages/executor ./packages/executor - # Install dependencies at root level RUN yarn install @@ -20,4 +19,4 @@ RUN yarn compile WORKDIR /usr/src/app/packages/executor RUN yarn compile -CMD ["yarn", "start"] \ No newline at end of file +CMD ["yarn", "start:prod"] \ No newline at end of file diff --git a/packages/executor/nodemon.json b/packages/executor/nodemon.json index b5fabeb4..094036ef 100644 --- a/packages/executor/nodemon.json +++ b/packages/executor/nodemon.json @@ -1,5 +1,5 @@ { "watch": ["src"], "ext": "ts,json", - "exec": "ts-node --esm ./src/index.ts" + "exec": "ts-node ./src/index.ts" } diff --git a/packages/executor/package.json b/packages/executor/package.json index 39e31722..038a6f99 100644 --- a/packages/executor/package.json +++ b/packages/executor/package.json @@ -2,7 +2,6 @@ "name": "@gnosis/hashi-executor", "private": true, "version": "0.1.0", - "type": "module", "author": { "name": "gnosis", "url": "https://github.com/gnosis" @@ -13,6 +12,7 @@ "prettier:check": "prettier --check \"**/*.{js,json,md,sol,ts,yml}\"", "prettier:write": "prettier --write \"**/*.{js,json,md,sol,ts,yml}\"", "start": "node --loader ts-node/esm ./src/index.ts", + "start:prod": "node ./dist/index.js", "start:dev": "nodemon" }, "dependencies": { @@ -23,6 +23,7 @@ "winston": "^3.11.0" }, "devDependencies": { + "@tsconfig/node22": "^22.0.0", "@types/node": "^20.8.9", "@typescript-eslint/eslint-plugin": "^6.7.5", "@typescript-eslint/parser": "^6.7.5", diff --git a/packages/executor/src/index.ts b/packages/executor/src/index.ts index 668b89ae..c3c5aa81 100644 --- a/packages/executor/src/index.ts +++ b/packages/executor/src/index.ts @@ -1,187 +1,189 @@ import "dotenv/config" -import { createWalletClient, http, Chain, publicActions, Log, createPublicClient } from "viem" +import { createWalletClient, http, Chain, publicActions, Log } from "viem" import { privateKeyToAccount } from "viem/accounts" import * as chains from "viem/chains" import { MongoClient } from "mongodb" import { adapterAbi, Batcher, logger, Message, Watcher, yahoAbi, yaruAbi } from "@gnosis/hashi-common" -const mongoClient = new MongoClient(process.env.MONGO_DB_URI as string) -await mongoClient.connect() -const db = mongoClient.db("hashi") +;(async () => { + const mongoClient = new MongoClient(process.env.MONGO_DB_URI as string) + await mongoClient.connect() + const db = mongoClient.db("hashi") -const sourceChain = Object.values(chains).find(({ id }) => id.toString() === (process.env.SOURCE_CHAIN_ID as string)) -if (!sourceChain) throw new Error("Invalid SOURCE_CHAIN_ID") -const targetChain = Object.values(chains).find(({ id }) => id.toString() === (process.env.TARGET_CHAIN_ID as string)) -if (!targetChain) throw new Error("Invalid TARGET_CHAIN_ID") + const sourceChain = Object.values(chains).find(({ id }) => id.toString() === (process.env.SOURCE_CHAIN_ID as string)) + if (!sourceChain) throw new Error("Invalid SOURCE_CHAIN_ID") + const targetChain = Object.values(chains).find(({ id }) => id.toString() === (process.env.TARGET_CHAIN_ID as string)) + if (!targetChain) throw new Error("Invalid TARGET_CHAIN_ID") -const sourceClient = createWalletClient({ - account: privateKeyToAccount(process.env.PK as `0x${string}`), - chain: sourceChain as Chain | undefined, - transport: http(process.env.SOURCE_RPC as string), -}).extend(publicActions) + const sourceClient = createWalletClient({ + account: privateKeyToAccount(process.env.PK as `0x${string}`), + chain: sourceChain as Chain | undefined, + transport: http(process.env.SOURCE_RPC as string), + }).extend(publicActions) -const targetClient = createWalletClient({ - account: privateKeyToAccount(process.env.PK as `0x${string}`), - chain: targetChain as Chain | undefined, - transport: http(process.env.TARGET_RPC as string), -}).extend(publicActions) + const targetClient = createWalletClient({ + account: privateKeyToAccount(process.env.PK as `0x${string}`), + chain: targetChain as Chain | undefined, + transport: http(process.env.TARGET_RPC as string), + }).extend(publicActions) -const adapters = (process.env.ADAPTERS as string).split(",") as `0x${string}`[] -const watchers = adapters.map( - (_adapter) => - new Watcher({ - abi: adapterAbi, - client: targetClient, - contractAddress: _adapter as `0x${string}`, - eventName: "HashStored", - logger, - service: `ExecutorWatcher:${_adapter.slice(0, 6)}${_adapter.slice(_adapter.length - 4, _adapter.length)}`, - watchIntervalTimeMs: Number(process.env.WATCH_INTERVAL_TIME_MS as string), - onLogs: async (_logs: Log[]) => { - const messageIds = _logs - .map((_log) => _log.topics[1]) - .filter((id): id is `0x${string}` => id !== undefined) // Filter out undefined values - .map((id) => BigInt(id)) // Convert each string to bigint + const adapters = (process.env.ADAPTERS as string).split(",") as `0x${string}`[] + const watchers = adapters.map( + (_adapter) => + new Watcher({ + abi: adapterAbi, + client: targetClient, + contractAddress: _adapter as `0x${string}`, + eventName: "HashStored", + logger, + service: `ExecutorWatcher:${_adapter.slice(0, 6)}${_adapter.slice(_adapter.length - 4, _adapter.length)}`, + watchIntervalTimeMs: Number(process.env.WATCH_INTERVAL_TIME_MS as string), + onLogs: async (_logs: Log[]) => { + const messageIds = _logs + .map((_log) => _log.topics[1]) + .filter((id): id is `0x${string}` => id !== undefined) // Filter out undefined values + .map((id) => BigInt(id)) // Convert each string to bigint - // NOTE: without setting fromBlock and toBlock, it's not possible to getContractEvents - const blockNumber = await sourceClient.getBlockNumber() - const messageDispatchedLogs = await sourceClient.getContractEvents({ - abi: yahoAbi, - address: process.env.SOURCE_YAHO_ADDRESS as `0x${string}`, - eventName: "MessageDispatched", - args: { - messageId: messageIds, - }, - fromBlock: blockNumber - BigInt(process.env.BLOCKS_WINDOW as string), - toBlock: blockNumber, - strict: true, - }) - logger.info(`Found corresponding ${messageDispatchedLogs.length} message dispatch logs`) - const messages = messageDispatchedLogs.map((_log) => Message.fromLog(_log)) - for (const message of messages) { - const hashStoredLog = _logs.find((_log) => _log.topics[1] === message.id) as Log + // NOTE: without setting fromBlock and toBlock, it's not possible to getContractEvents + const blockNumber = await sourceClient.getBlockNumber() + const messageDispatchedLogs = await sourceClient.getContractEvents({ + abi: yahoAbi, + address: process.env.SOURCE_YAHO_ADDRESS as `0x${string}`, + eventName: "MessageDispatched", + args: { + messageId: messageIds, + }, + fromBlock: blockNumber - BigInt(process.env.BLOCKS_WINDOW as string), + toBlock: blockNumber, + strict: true, + }) + logger.info(`Found corresponding ${messageDispatchedLogs.length} message dispatch logs`) + const messages = messageDispatchedLogs.map((_log) => Message.fromLog(_log)) + for (const message of messages) { + const hashStoredLog = _logs.find((_log) => _log.topics[1] === message.id) as Log - await db.collection("executedMessages").findOneAndUpdate( - { id: message.id }, - { - $addToSet: { - confirmedBy: hashStoredLog.address, - }, - $setOnInsert: { - chainId: targetClient?.chain?.id as number, - storeHashTransactionHash: hashStoredLog.transactionHash, - status: "waitingForConfirmations", - data: { - ...message.toJSON(), + await db.collection("executedMessages").findOneAndUpdate( + { id: message.id }, + { + $addToSet: { + confirmedBy: hashStoredLog.address, + }, + $setOnInsert: { + chainId: targetClient?.chain?.id as number, + storeHashTransactionHash: hashStoredLog.transactionHash, + status: "waitingForConfirmations", + data: { + ...message.toJSON(), + }, }, }, - }, - { upsert: true, returnDocument: "after" }, - ) - } - }, - }), -) -watchers.map((_watcher) => _watcher.start()) - -const batcher = new Batcher({ - createBatchIntervalTimeMs: Number(process.env.CREATE_BATCH_INTERVAL_TIME_MS as string), - logger, - minBatchSize: Number(process.env.MIN_BATCH_SIZE as string), - service: "ExecutorBatcher", - onGetValues: async () => { - const values = await db - .collection("executedMessages") - .find({ - chainId: targetClient?.chain?.id as number, - status: "waitingForConfirmations", - $expr: { $gte: [{ $size: "$confirmedBy" }, "$threshold"] }, - }) - .toArray() - - const messages = values.map( - (_val: any) => - new Message({ - id: _val.id, - ..._val.data, - }), - ) + { upsert: true, returnDocument: "after" }, + ) + } + }, + }), + ) + watchers.map((_watcher) => _watcher.start()) - const executed = await Promise.all( - messages.map((_message: Message) => - targetClient.readContract({ - address: process.env.TARGET_YARU_ADDRESS as `0x${string}`, - abi: yaruAbi, - functionName: "executed", - args: [_message.id], - }), - ), - ) - const messagesAlreadyExecuted = messages.filter((_, _index) => executed[_index]) - if (messagesAlreadyExecuted.length) { - logger - .child({ service: "Executor" }) - .info(`Found ${messagesAlreadyExecuted.length} messages already executed. Processing them ...`) - // TODO: find the transactionHash - await db + const batcher = new Batcher({ + createBatchIntervalTimeMs: Number(process.env.CREATE_BATCH_INTERVAL_TIME_MS as string), + logger, + minBatchSize: Number(process.env.MIN_BATCH_SIZE as string), + service: "ExecutorBatcher", + onGetValues: async () => { + const values = await db .collection("executedMessages") - .updateMany( - { id: { $in: messages.map((_message: Message) => _message.id) } }, - { $set: { status: "alreadyExecuted" } }, - ) - } + .find({ + chainId: targetClient?.chain?.id as number, + status: "waitingForConfirmations", + $expr: { $gte: [{ $size: "$confirmedBy" }, "$threshold"] }, + }) + .toArray() - const messageToBeExecuted = messages.filter((_, _index) => !executed[_index]) + const messages = values.map( + (_val: any) => + new Message({ + id: _val.id, + ..._val.data, + }), + ) - // NOTE: need to try one by one all messages in order to filter those that cannot be executed because the receiver contract reverts - const messagesToBeExecuteWithoutRevert = [] - for (const message of messageToBeExecuted) { - try { - await targetClient.simulateContract({ - address: process.env.TARGET_YARU_ADDRESS as `0x${string}`, - abi: yaruAbi, - functionName: "executeMessages", - args: [[message.serialize()]], - }) - messagesToBeExecuteWithoutRevert.push(message) - } catch (_err) { + const executed = await Promise.all( + messages.map((_message: Message) => + targetClient.readContract({ + address: process.env.TARGET_YARU_ADDRESS as `0x${string}`, + abi: yaruAbi, + functionName: "executed", + args: [_message.id], + }), + ), + ) + const messagesAlreadyExecuted = messages.filter((_, _index) => executed[_index]) + if (messagesAlreadyExecuted.length) { logger .child({ service: "Executor" }) - .info(`Message ${message.id} cannot be executed because it reverts. Skipping it ...`) + .info(`Found ${messagesAlreadyExecuted.length} messages already executed. Processing them ...`) + // TODO: find the transactionHash + await db + .collection("executedMessages") + .updateMany( + { id: { $in: messages.map((_message: Message) => _message.id) } }, + { $set: { status: "alreadyExecuted" } }, + ) } - } - return messagesToBeExecuteWithoutRevert - }, - onBatch: async (_messages: Message[]) => { - logger.child({ service: "Executor" }).info(`Executing ${_messages.length} messages ...`) - const { request } = await targetClient.simulateContract({ - address: process.env.TARGET_YARU_ADDRESS as `0x${string}`, - abi: yaruAbi, - functionName: "executeMessages", - args: [_messages.map((_message: Message) => _message.serialize())], - }) - const transactionHash = await targetClient.writeContract({ ...request, gas: 1000000n }) - logger.child({ service: "Executor" }).info(`${_messages.length} messages executed: ${transactionHash}`) + const messageToBeExecuted = messages.filter((_, _index) => !executed[_index]) - return { - transactionHash, - messages: _messages, - } - }, - onResult: (_result: any) => { - const { messages, transactionHash } = _result as { messages: Message[]; transactionHash: string } + // NOTE: need to try one by one all messages in order to filter those that cannot be executed because the receiver contract reverts + const messagesToBeExecuteWithoutRevert = [] + for (const message of messageToBeExecuted) { + try { + await targetClient.simulateContract({ + address: process.env.TARGET_YARU_ADDRESS as `0x${string}`, + abi: yaruAbi, + functionName: "executeMessages", + args: [[message.serialize()]], + }) + messagesToBeExecuteWithoutRevert.push(message) + } catch (_err) { + logger + .child({ service: "Executor" }) + .info(`Message ${message.id} cannot be executed because it reverts. Skipping it ...`) + } + } + return messagesToBeExecuteWithoutRevert + }, + onBatch: async (_messages: Message[]) => { + logger.child({ service: "Executor" }).info(`Executing ${_messages.length} messages ...`) + const { request } = await targetClient.simulateContract({ + address: process.env.TARGET_YARU_ADDRESS as `0x${string}`, + abi: yaruAbi, + functionName: "executeMessages", + args: [_messages.map((_message: Message) => _message.serialize())], + }) - return Promise.all( - messages.map(({ id }) => - db.collection("executedMessages").updateOne( - { id }, - { - $set: { executeTransactionHash: transactionHash, status: "executed" }, - }, + const transactionHash = await targetClient.writeContract({ ...request, gas: 1000000n }) + logger.child({ service: "Executor" }).info(`${_messages.length} messages executed: ${transactionHash}`) + + return { + transactionHash, + messages: _messages, + } + }, + onResult: (_result: any) => { + const { messages, transactionHash } = _result as { messages: Message[]; transactionHash: string } + + return Promise.all( + messages.map(({ id }) => + db.collection("executedMessages").updateOne( + { id }, + { + $set: { executeTransactionHash: transactionHash, status: "executed" }, + }, + ), ), - ), - ) - }, -}) -batcher.start() + ) + }, + }) + batcher.start() +})() diff --git a/packages/executor/tsconfig.json b/packages/executor/tsconfig.json index 974c23aa..b102f033 100644 --- a/packages/executor/tsconfig.json +++ b/packages/executor/tsconfig.json @@ -1,36 +1,6 @@ { + "extends": "@tsconfig/node22/tsconfig.json", "compilerOptions": { - "declaration": true, - "declarationMap": true, - "emitDecoratorMetadata": true, - "esModuleInterop": true, - "experimentalDecorators": true, - "forceConsistentCasingInFileNames": true, - "lib": [ - "es6", - "ESNext", - "DOM" - ], - "module": "ESNext", - "moduleResolution": "node", - "noImplicitAny": true, - "outDir": "./dist", - "rootDir": "./src", - "removeComments": true, - "resolveJsonModule": true, - "sourceMap": true, - "strict": true, - "target": "ESNext", - "skipLibCheck": true, - }, - "exclude": [ - "node_modules" - ], - "include": [ - "./src/**/*" - ], - "ts-node": { - "esm": true, - "experimentalSpecifierResolution": "node" + "outDir": "./dist" } } \ No newline at end of file diff --git a/packages/relayer/Dockerfile b/packages/relayer/Dockerfile index aec8ea25..7fe640de 100644 --- a/packages/relayer/Dockerfile +++ b/packages/relayer/Dockerfile @@ -1,4 +1,4 @@ -FROM node:18-alpine +FROM node:22-alpine WORKDIR /usr/src/app @@ -9,7 +9,6 @@ COPY ../../package.json ../../yarn.lock ./ COPY ./packages/common ./packages/common COPY ./packages/relayer ./packages/relayer - # Install dependencies at root level RUN yarn install @@ -20,4 +19,4 @@ RUN yarn compile WORKDIR /usr/src/app/packages/relayer RUN yarn compile -CMD ["yarn", "start"] \ No newline at end of file +CMD ["yarn", "start:prod"] \ No newline at end of file diff --git a/packages/relayer/nodemon.json b/packages/relayer/nodemon.json index b5fabeb4..094036ef 100644 --- a/packages/relayer/nodemon.json +++ b/packages/relayer/nodemon.json @@ -1,5 +1,5 @@ { "watch": ["src"], "ext": "ts,json", - "exec": "ts-node --esm ./src/index.ts" + "exec": "ts-node ./src/index.ts" } diff --git a/packages/relayer/package.json b/packages/relayer/package.json index fbc166b2..26616bae 100644 --- a/packages/relayer/package.json +++ b/packages/relayer/package.json @@ -2,7 +2,6 @@ "name": "@gnosis/hashi-relayer", "private": true, "version": "0.1.0", - "type": "module", "author": { "name": "gnosis", "url": "https://github.com/gnosis" @@ -13,6 +12,7 @@ "prettier:check": "prettier --check \"**/*.{js,json,md,sol,ts,yml}\"", "prettier:write": "prettier --write \"**/*.{js,json,md,sol,ts,yml}\"", "start": "node --loader ts-node/esm ./src/index.ts", + "start:prod": "node ./dist/index.js", "start:dev": "nodemon" }, "dependencies": { @@ -23,6 +23,7 @@ "winston": "^3.11.0" }, "devDependencies": { + "@tsconfig/node22": "^22.0.0", "@types/node": "^20.8.9", "@typescript-eslint/eslint-plugin": "^6.7.5", "@typescript-eslint/parser": "^6.7.5", diff --git a/packages/relayer/src/index.ts b/packages/relayer/src/index.ts index e9cf5938..950a68ed 100644 --- a/packages/relayer/src/index.ts +++ b/packages/relayer/src/index.ts @@ -5,139 +5,141 @@ import * as chains from "viem/chains" import { MongoClient, Document } from "mongodb" import { Batcher, logger, Message, Watcher, yahoAbi } from "@gnosis/hashi-common" -const chain = Object.values(chains).find(({ id }) => id.toString() === (process.env.CHAIN_ID as string)) -if (!chain) throw new Error("Invalid CHAIN_ID") +;(async () => { + const chain = Object.values(chains).find(({ id }) => id.toString() === (process.env.CHAIN_ID as string)) + if (!chain) throw new Error("Invalid CHAIN_ID") -const client = createWalletClient({ - account: privateKeyToAccount(process.env.PK as `0x${string}`), - chain: chain as Chain | undefined, - transport: http(process.env.RPC as string), -}).extend(publicActions) + const client = createWalletClient({ + account: privateKeyToAccount(process.env.PK as `0x${string}`), + chain: chain as Chain | undefined, + transport: http(process.env.RPC as string), + }).extend(publicActions) -const mongoClient = new MongoClient(process.env.MONGO_DB_URI as string) -await mongoClient.connect() -const db = mongoClient.db("hashi") + const mongoClient = new MongoClient(process.env.MONGO_DB_URI as string) + await mongoClient.connect() + const db = mongoClient.db("hashi") -const whitelistedSenderAddresses = process.env.WHITELISTED_SENDER_ADDRESSES?.split(",").map((_address: string) => - _address.toLowerCase(), -) as string[] + const whitelistedSenderAddresses = process.env.WHITELISTED_SENDER_ADDRESSES?.split(",").map((_address: string) => + _address.toLowerCase(), + ) as string[] -const watcher = new Watcher({ - service: "RelayerWatcher", - logger, - client, - contractAddress: process.env.YAHO_ADDRESS as `0x${string}`, - abi: yahoAbi, - eventName: "MessageDispatched", - watchIntervalTimeMs: Number(process.env.WATCH_INTERVAL_TIME_MS as string), - onLogs: async (_logs: Log[]) => { - let messages = _logs.map((_log: Log) => Message.fromLog(_log)) - if (whitelistedSenderAddresses?.length) { - logger.child({ service: "Relayer" }).info(`Filtering messages ...`) - messages = messages.filter((_message) => whitelistedSenderAddresses.includes(_message.sender.toLowerCase())) - } + const watcher = new Watcher({ + service: "RelayerWatcher", + logger, + client, + contractAddress: process.env.YAHO_ADDRESS as `0x${string}`, + abi: yahoAbi, + eventName: "MessageDispatched", + watchIntervalTimeMs: Number(process.env.WATCH_INTERVAL_TIME_MS as string), + onLogs: async (_logs: Log[]) => { + let messages = _logs.map((_log: Log) => Message.fromLog(_log)) + if (whitelistedSenderAddresses?.length) { + logger.child({ service: "Relayer" }).info(`Filtering messages ...`) + messages = messages.filter((_message) => whitelistedSenderAddresses.includes(_message.sender.toLowerCase())) + } - await Promise.all( - messages.map((_message: Message, _index: number) => - db.collection("relayedMessages").updateOne( - { id: _message.id }, - { - $set: { - address: process.env.YAHO_ADDRESS as `0x${string}`, - chainId: client?.chain?.id as number, - data: _message.toJSON(), - dispatchTransactionHash: _logs[_index].transactionHash, - status: "dispatched", + await Promise.all( + messages.map((_message: Message, _index: number) => + db.collection("relayedMessages").updateOne( + { id: _message.id }, + { + $set: { + address: process.env.YAHO_ADDRESS as `0x${string}`, + chainId: client?.chain?.id as number, + data: _message.toJSON(), + dispatchTransactionHash: _logs[_index].transactionHash, + status: "dispatched", + }, + }, + { + upsert: true, }, - }, - { - upsert: true, - }, + ), ), - ), - ) - }, -}) -watcher.start() + ) + }, + }) + watcher.start() -const batcher = new Batcher({ - service: "RelayerBatcher", - createBatchIntervalTimeMs: Number(process.env.CREATE_BATCH_INTERVAL_TIME_MS as string), - logger, - minBatchSize: Number(process.env.MIN_BATCH_SIZE as string), - onGetValues: () => { - return db - .collection("relayedMessages") - .find({ - status: "dispatched", - address: process.env.YAHO_ADDRESS as `0x${string}`, - }) - .toArray() - }, - onBatch: async (_batch: Document[]) => { - const messages = _batch.map( - (_val: any) => - new Message({ - id: _val.id, - ..._val.data, - }), - ) + const batcher = new Batcher({ + service: "RelayerBatcher", + createBatchIntervalTimeMs: Number(process.env.CREATE_BATCH_INTERVAL_TIME_MS as string), + logger, + minBatchSize: Number(process.env.MIN_BATCH_SIZE as string), + onGetValues: () => { + return db + .collection("relayedMessages") + .find({ + status: "dispatched", + address: process.env.YAHO_ADDRESS as `0x${string}`, + }) + .toArray() + }, + onBatch: async (_batch: Document[]) => { + const messages = _batch.map( + (_val: any) => + new Message({ + id: _val.id, + ..._val.data, + }), + ) - const executableMessages = [] - for (const message of messages) { - const hash = await client.readContract({ - address: process.env.YAHO_ADDRESS as `0x${string}`, - abi: yahoAbi, - functionName: "getPendingMessageHash", - args: [message.id], - }) - if (hash != "0x0000000000000000000000000000000000000000000000000000000000000000") { - executableMessages.push(message) - } else { - logger.child({ service: "Relayer" }).info(`${message.id} already relayed. Filtering it ...`) - await db.collection("relayedMessages").updateOne( - { id: message.id }, - { - $set: { status: "alreadyRelayed" }, - }, - ) + const executableMessages = [] + for (const message of messages) { + const hash = await client.readContract({ + address: process.env.YAHO_ADDRESS as `0x${string}`, + abi: yahoAbi, + functionName: "getPendingMessageHash", + args: [message.id], + }) + if (hash != "0x0000000000000000000000000000000000000000000000000000000000000000") { + executableMessages.push(message) + } else { + logger.child({ service: "Relayer" }).info(`${message.id} already relayed. Filtering it ...`) + await db.collection("relayedMessages").updateOne( + { id: message.id }, + { + $set: { status: "alreadyRelayed" }, + }, + ) + } } - } - let transactionHash = null - if (executableMessages.length) { - const serializedMessages = executableMessages.map((_message: Message) => _message.serialize()) + let transactionHash = null + if (executableMessages.length) { + const serializedMessages = executableMessages.map((_message: Message) => _message.serialize()) - logger.child({ service: "Relayer" }).info(`Relaying ${serializedMessages.length} messages ...`) - const { request } = await client.simulateContract({ - address: process.env.YAHO_ADDRESS as `0x${string}`, - abi: yahoAbi, - functionName: "relayMessagesToAdapters", - args: [serializedMessages], - }) - transactionHash = await client.writeContract(request) - logger.child({ service: "Relayer" }).info(`${serializedMessages.length} messages relayed: ${transactionHash}`) - } + logger.child({ service: "Relayer" }).info(`Relaying ${serializedMessages.length} messages ...`) + const { request } = await client.simulateContract({ + address: process.env.YAHO_ADDRESS as `0x${string}`, + abi: yahoAbi, + functionName: "relayMessagesToAdapters", + args: [serializedMessages], + }) + transactionHash = await client.writeContract(request) + logger.child({ service: "Relayer" }).info(`${serializedMessages.length} messages relayed: ${transactionHash}`) + } - return { - messages: executableMessages, - transactionHash, - } - }, - onResult: async (_result: any) => { - const { messages, transactionHash } = _result as { messages: Message[]; transactionHash: string } - if (!messages.length) return null + return { + messages: executableMessages, + transactionHash, + } + }, + onResult: async (_result: any) => { + const { messages, transactionHash } = _result as { messages: Message[]; transactionHash: string } + if (!messages.length) return null - return Promise.all( - messages.map(({ id }) => - db.collection("relayedMessages").updateOne( - { id }, - { - $set: { relayTransactionHash: transactionHash, status: "relayed" }, - }, + return Promise.all( + messages.map(({ id }) => + db.collection("relayedMessages").updateOne( + { id }, + { + $set: { relayTransactionHash: transactionHash, status: "relayed" }, + }, + ), ), - ), - ) - }, -}) -batcher.start() + ) + }, + }) + batcher.start() +})() diff --git a/packages/relayer/tsconfig.json b/packages/relayer/tsconfig.json index 652aa407..e6d845c2 100644 --- a/packages/relayer/tsconfig.json +++ b/packages/relayer/tsconfig.json @@ -1,35 +1,6 @@ { + "extends": "@tsconfig/node22/tsconfig.json", "compilerOptions": { - "declaration": true, - "declarationMap": true, - "emitDecoratorMetadata": true, - "esModuleInterop": true, - "experimentalDecorators": true, - "forceConsistentCasingInFileNames": true, - "lib": [ - "es6", - "ESNext", - "DOM" - ], - "module": "ESNext", - "moduleResolution": "node", - "noImplicitAny": true, - "outDir": "./dist", - "removeComments": true, - "resolveJsonModule": true, - "sourceMap": true, - "strict": true, - "target": "ESNext", - "skipLibCheck": true, - }, - "exclude": [ - "node_modules" - ], - "include": [ - "./src/**/*" - ], - "ts-node": { - "esm": true, - "experimentalSpecifierResolution": "node" + "outDir": "./dist" } -} \ No newline at end of file +} diff --git a/packages/reporter/.nvmrc b/packages/reporter/.nvmrc deleted file mode 100644 index 0828ab79..00000000 --- a/packages/reporter/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -v18 \ No newline at end of file diff --git a/packages/reporter/Dockerfile b/packages/reporter/Dockerfile index cdca8796..9e9ac48a 100644 --- a/packages/reporter/Dockerfile +++ b/packages/reporter/Dockerfile @@ -1,10 +1,11 @@ -FROM node:18-alpine +FROM node:22-alpine WORKDIR /usr/src/app # Copy root package.json and yarn.lock for dependency resolution COPY ../../package.json ../../yarn.lock ./ +COPY ./packages/common ./packages/common COPY ./packages/reporter ./packages/reporter RUN yarn install @@ -12,4 +13,4 @@ RUN yarn install WORKDIR /usr/src/app/packages/reporter RUN yarn compile -CMD ["node", "dist/index.js"] \ No newline at end of file +CMD ["yarn", "start:prod"] \ No newline at end of file diff --git a/packages/reporter/README.md b/packages/reporter/README.md index 68e80f2c..6b7babf2 100644 --- a/packages/reporter/README.md +++ b/packages/reporter/README.md @@ -22,7 +22,7 @@ On the root's `docker-compose.yml`, run the following command: ```sh cd ../.. # To the root level -docker-compose up -d --build --no-deps hashi_reporter +docker compose up --build mongodb hashi_reporter ``` ### Viewing Logs diff --git a/packages/reporter/nodemon.json b/packages/reporter/nodemon.json index 06dbc7b5..094036ef 100644 --- a/packages/reporter/nodemon.json +++ b/packages/reporter/nodemon.json @@ -1,6 +1,5 @@ { "watch": ["src"], "ext": "ts,json", - "ignore": ["src/**/*.spec.ts"], - "exec": "ts-node --esm ./src/index.ts" + "exec": "ts-node ./src/index.ts" } diff --git a/packages/reporter/package.json b/packages/reporter/package.json index b8cfb84f..4dfe4449 100644 --- a/packages/reporter/package.json +++ b/packages/reporter/package.json @@ -5,22 +5,16 @@ "name": "gnosis", "url": "https://github.com/gnosis" }, - "type": "module", "scripts": { "compile": "tsc", "lint": "eslint --ignore-path ./.eslintignore --ext .js,.ts .", "prettier:check": "prettier --check \"**/*.{js,json,md,sol,ts,yml}\"", "prettier:write": "prettier --write \"**/*.{js,json,md,sol,ts,yml}\"", + "start:prod": "node ./dist/index.js", "start:dev": "nodemon" }, "dependencies": { - "@chainsafe/persistent-merkle-tree": "^0.6.1", - "@chainsafe/ssz": "^0.14.0", - "@ethereumjs/rlp": "^5.0.1", - "@ethereumjs/trie": "^6.0.1", - "@ethereumjs/util": "^9.0.1", - "@ethereumjs/vm": "^7.1.0", - "@lodestar/types": "^1.12.0", + "@gnosis/hashi-common": "0.1.0", "async-mutex": "^0.4.0", "axios": "^1.5.1", "dotenv": "^16.3.1", @@ -28,6 +22,7 @@ "winston": "^3.11.0" }, "devDependencies": { + "@tsconfig/node22": "^22.0.0", "@types/node": "^20.8.9", "@types/node-cron": "^3.0.9", "@typescript-eslint/eslint-plugin": "^6.7.5", diff --git a/packages/reporter/src/ABIs/StandardReporterContractABI.json b/packages/reporter/src/ABIs/StandardReporterContractABI.json deleted file mode 100644 index c89a25b3..00000000 --- a/packages/reporter/src/ABIs/StandardReporterContractABI.json +++ /dev/null @@ -1,169 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "expectedYaho", - "type": "address" - } - ], - "name": "NotYaho", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "blockHeader", - "type": "bytes32" - } - ], - "name": "BlockDispatched", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "messageId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "messageHash", - "type": "bytes32" - } - ], - "name": "MessageDispatched", - "type": "event" - }, - { - "inputs": [], - "name": "HEADER_STORAGE", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "YAHO", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "blockNumbers", - "type": "uint256[]" - } - ], - "name": "dispatchBlocks", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "messageIds", - "type": "uint256[]" - }, - { - "internalType": "bytes32[]", - "name": "messageHashes", - "type": "bytes32[]" - } - ], - "name": "dispatchMessages", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "payable", - "type": "function" - } -] diff --git a/packages/reporter/src/ABIs/WormholeABI.json b/packages/reporter/src/ABIs/WormholeABI.json deleted file mode 100644 index d1b59b6a..00000000 --- a/packages/reporter/src/ABIs/WormholeABI.json +++ /dev/null @@ -1,9 +0,0 @@ -[ - { - "inputs": [{ "internalType": "address", "name": "emitter", "type": "address" }], - "name": "nextSequence", - "outputs": [{ "internalType": "uint64", "name": "", "type": "uint64" }], - "stateMutability": "view", - "type": "function" - } -] diff --git a/packages/reporter/src/ABIs/WormholeAdapterABI.json b/packages/reporter/src/ABIs/WormholeAdapterABI.json deleted file mode 100644 index dc59d307..00000000 --- a/packages/reporter/src/ABIs/WormholeAdapterABI.json +++ /dev/null @@ -1,375 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "address", - "name": "wormhole", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "blockHash", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "storedBlockHash", - "type": "bytes32" - } - ], - "name": "ConflictingBlockHeader", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "length", - "type": "uint256" - } - ], - "name": "InvalidBlockHeaderLength", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidBlockHeaderRLP", - "type": "error" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint8", - "name": "version", - "type": "uint8" - }, - { - "internalType": "uint32", - "name": "timestamp", - "type": "uint32" - }, - { - "internalType": "uint32", - "name": "nonce", - "type": "uint32" - }, - { - "internalType": "uint16", - "name": "emitterChainId", - "type": "uint16" - }, - { - "internalType": "bytes32", - "name": "emitterAddress", - "type": "bytes32" - }, - { - "internalType": "uint64", - "name": "sequence", - "type": "uint64" - }, - { - "internalType": "uint8", - "name": "consistencyLevel", - "type": "uint8" - }, - { - "internalType": "bytes", - "name": "payload", - "type": "bytes" - }, - { - "internalType": "uint32", - "name": "guardianSetIndex", - "type": "uint32" - }, - { - "components": [ - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "uint8", - "name": "guardianIndex", - "type": "uint8" - } - ], - "internalType": "struct Signature[]", - "name": "signatures", - "type": "tuple[]" - }, - { - "internalType": "bytes32", - "name": "hash", - "type": "bytes32" - } - ], - "internalType": "struct VM", - "name": "vm", - "type": "tuple" - }, - { - "internalType": "string", - "name": "reason", - "type": "string" - } - ], - "name": "InvalidMessage", - "type": "error" - }, - { - "inputs": [], - "name": "UnauthorizedWormholeReceive", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "id", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "hash", - "type": "bytes32" - } - ], - "name": "HashStored", - "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": true, - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "uint16", - "name": "endpointId", - "type": "uint16" - }, - { - "indexed": true, - "internalType": "address", - "name": "reporter", - "type": "address" - } - ], - "name": "ReporterSet", - "type": "event" - }, - { - "inputs": [], - "name": "WORMHOLE", - "outputs": [ - { - "internalType": "contract IWormhole", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint32", - "name": "", - "type": "uint32" - } - ], - "name": "chainIds", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint32", - "name": "", - "type": "uint32" - } - ], - "name": "enabledReporters", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "domain", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "id", - "type": "uint256" - } - ], - "name": "getHash", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "internalType": "bytes[]", - "name": "blockHeaders", - "type": "bytes[]" - } - ], - "name": "proveAncestralBlockHashes", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "internalType": "uint16", - "name": "wormholeChainId", - "type": "uint16" - }, - { - "internalType": "address", - "name": "reporter", - "type": "address" - } - ], - "name": "setReporterByChain", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "encodedVM", - "type": "bytes" - } - ], - "name": "storeHashesByEncodedVM", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/packages/reporter/src/ABIs/WormholeReporterABI.json b/packages/reporter/src/ABIs/WormholeReporterABI.json deleted file mode 100644 index 454cd261..00000000 --- a/packages/reporter/src/ABIs/WormholeReporterABI.json +++ /dev/null @@ -1,216 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "address", - "name": "headerStorage", - "type": "address" - }, - { - "internalType": "address", - "name": "yaho", - "type": "address" - }, - { - "internalType": "address", - "name": "wormhole", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "expectedYaho", - "type": "address" - } - ], - "name": "NotYaho", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "blockHeader", - "type": "bytes32" - } - ], - "name": "BlockDispatched", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "messageId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "messageHash", - "type": "bytes32" - } - ], - "name": "MessageDispatched", - "type": "event" - }, - { - "inputs": [], - "name": "HEADER_STORAGE", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "PROVIDER", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "WOMRHOLE", - "outputs": [ - { - "internalType": "contract IWormhole", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "YAHO", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "blockNumbers", - "type": "uint256[]" - } - ], - "name": "dispatchBlocks", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "messageIds", - "type": "uint256[]" - }, - { - "internalType": "bytes32[]", - "name": "messageHashes", - "type": "bytes32[]" - } - ], - "name": "dispatchMessages", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "payable", - "type": "function" - } -] diff --git a/packages/reporter/src/abi/standardReporter.ts b/packages/reporter/src/abi/standardReporter.ts new file mode 100644 index 00000000..ee98167c --- /dev/null +++ b/packages/reporter/src/abi/standardReporter.ts @@ -0,0 +1,169 @@ +export default [ + { + inputs: [ + { + internalType: "address", + name: "sender", + type: "address", + }, + { + internalType: "address", + name: "expectedYaho", + type: "address", + }, + ], + name: "NotYaho", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "targetChainId", + type: "uint256", + }, + { + indexed: false, + internalType: "contract IAdapter", + name: "adapter", + type: "address", + }, + { + indexed: true, + internalType: "uint256", + name: "blockNumber", + type: "uint256", + }, + { + indexed: false, + internalType: "bytes32", + name: "blockHeader", + type: "bytes32", + }, + ], + name: "BlockDispatched", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "targetChainId", + type: "uint256", + }, + { + indexed: false, + internalType: "contract IAdapter", + name: "adapter", + type: "address", + }, + { + indexed: true, + internalType: "uint256", + name: "messageId", + type: "uint256", + }, + { + indexed: false, + internalType: "bytes32", + name: "messageHash", + type: "bytes32", + }, + ], + name: "MessageDispatched", + type: "event", + }, + { + inputs: [], + name: "HEADER_STORAGE", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "YAHO", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "targetChainId", + type: "uint256", + }, + { + internalType: "contract IAdapter", + name: "adapter", + type: "address", + }, + { + internalType: "uint256[]", + name: "blockNumbers", + type: "uint256[]", + }, + ], + name: "dispatchBlocks", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "targetChainId", + type: "uint256", + }, + { + internalType: "contract IAdapter", + name: "adapter", + type: "address", + }, + { + internalType: "uint256[]", + name: "messageIds", + type: "uint256[]", + }, + { + internalType: "bytes32[]", + name: "messageHashes", + type: "bytes32[]", + }, + ], + name: "dispatchMessages", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "payable", + type: "function", + }, +] diff --git a/packages/reporter/src/abi/wormhole.ts b/packages/reporter/src/abi/wormhole.ts new file mode 100644 index 00000000..3b24449c --- /dev/null +++ b/packages/reporter/src/abi/wormhole.ts @@ -0,0 +1,9 @@ +export default [ + { + inputs: [{ internalType: "address", name: "emitter", type: "address" }], + name: "nextSequence", + outputs: [{ internalType: "uint64", name: "", type: "uint64" }], + stateMutability: "view", + type: "function", + }, +] diff --git a/packages/reporter/src/abi/wormholeAdapter.ts b/packages/reporter/src/abi/wormholeAdapter.ts new file mode 100644 index 00000000..e6dfeb70 --- /dev/null +++ b/packages/reporter/src/abi/wormholeAdapter.ts @@ -0,0 +1,375 @@ +export default [ + { + inputs: [ + { + internalType: "address", + name: "wormhole", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [ + { + internalType: "uint256", + name: "blockNumber", + type: "uint256", + }, + { + internalType: "bytes32", + name: "blockHash", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "storedBlockHash", + type: "bytes32", + }, + ], + name: "ConflictingBlockHeader", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "length", + type: "uint256", + }, + ], + name: "InvalidBlockHeaderLength", + type: "error", + }, + { + inputs: [], + name: "InvalidBlockHeaderRLP", + type: "error", + }, + { + inputs: [ + { + components: [ + { + internalType: "uint8", + name: "version", + type: "uint8", + }, + { + internalType: "uint32", + name: "timestamp", + type: "uint32", + }, + { + internalType: "uint32", + name: "nonce", + type: "uint32", + }, + { + internalType: "uint16", + name: "emitterChainId", + type: "uint16", + }, + { + internalType: "bytes32", + name: "emitterAddress", + type: "bytes32", + }, + { + internalType: "uint64", + name: "sequence", + type: "uint64", + }, + { + internalType: "uint8", + name: "consistencyLevel", + type: "uint8", + }, + { + internalType: "bytes", + name: "payload", + type: "bytes", + }, + { + internalType: "uint32", + name: "guardianSetIndex", + type: "uint32", + }, + { + components: [ + { + internalType: "bytes32", + name: "r", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "s", + type: "bytes32", + }, + { + internalType: "uint8", + name: "v", + type: "uint8", + }, + { + internalType: "uint8", + name: "guardianIndex", + type: "uint8", + }, + ], + internalType: "struct Signature[]", + name: "signatures", + type: "tuple[]", + }, + { + internalType: "bytes32", + name: "hash", + type: "bytes32", + }, + ], + internalType: "struct VM", + name: "vm", + type: "tuple", + }, + { + internalType: "string", + name: "reason", + type: "string", + }, + ], + name: "InvalidMessage", + type: "error", + }, + { + inputs: [], + name: "UnauthorizedWormholeReceive", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "id", + type: "uint256", + }, + { + indexed: true, + internalType: "bytes32", + name: "hash", + type: "bytes32", + }, + ], + name: "HashStored", + 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: true, + internalType: "uint256", + name: "chainId", + type: "uint256", + }, + { + indexed: true, + internalType: "uint16", + name: "endpointId", + type: "uint16", + }, + { + indexed: true, + internalType: "address", + name: "reporter", + type: "address", + }, + ], + name: "ReporterSet", + type: "event", + }, + { + inputs: [], + name: "WORMHOLE", + outputs: [ + { + internalType: "contract IWormhole", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint32", + name: "", + type: "uint32", + }, + ], + name: "chainIds", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint32", + name: "", + type: "uint32", + }, + ], + name: "enabledReporters", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "domain", + type: "uint256", + }, + { + internalType: "uint256", + name: "id", + type: "uint256", + }, + ], + name: "getHash", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "chainId", + type: "uint256", + }, + { + internalType: "bytes[]", + name: "blockHeaders", + type: "bytes[]", + }, + ], + name: "proveAncestralBlockHashes", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "chainId", + type: "uint256", + }, + { + internalType: "uint16", + name: "wormholeChainId", + type: "uint16", + }, + { + internalType: "address", + name: "reporter", + type: "address", + }, + ], + name: "setReporterByChain", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "encodedVM", + type: "bytes", + }, + ], + name: "storeHashesByEncodedVM", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, +] diff --git a/packages/reporter/src/abi/wormholeReporter.ts b/packages/reporter/src/abi/wormholeReporter.ts new file mode 100644 index 00000000..531168da --- /dev/null +++ b/packages/reporter/src/abi/wormholeReporter.ts @@ -0,0 +1,216 @@ +export default [ + { + inputs: [ + { + internalType: "address", + name: "headerStorage", + type: "address", + }, + { + internalType: "address", + name: "yaho", + type: "address", + }, + { + internalType: "address", + name: "wormhole", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [ + { + internalType: "address", + name: "sender", + type: "address", + }, + { + internalType: "address", + name: "expectedYaho", + type: "address", + }, + ], + name: "NotYaho", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "targetChainId", + type: "uint256", + }, + { + indexed: false, + internalType: "contract IAdapter", + name: "adapter", + type: "address", + }, + { + indexed: true, + internalType: "uint256", + name: "blockNumber", + type: "uint256", + }, + { + indexed: false, + internalType: "bytes32", + name: "blockHeader", + type: "bytes32", + }, + ], + name: "BlockDispatched", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "targetChainId", + type: "uint256", + }, + { + indexed: false, + internalType: "contract IAdapter", + name: "adapter", + type: "address", + }, + { + indexed: true, + internalType: "uint256", + name: "messageId", + type: "uint256", + }, + { + indexed: false, + internalType: "bytes32", + name: "messageHash", + type: "bytes32", + }, + ], + name: "MessageDispatched", + type: "event", + }, + { + inputs: [], + name: "HEADER_STORAGE", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "PROVIDER", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "WOMRHOLE", + outputs: [ + { + internalType: "contract IWormhole", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "YAHO", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "targetChainId", + type: "uint256", + }, + { + internalType: "contract IAdapter", + name: "adapter", + type: "address", + }, + { + internalType: "uint256[]", + name: "blockNumbers", + type: "uint256[]", + }, + ], + name: "dispatchBlocks", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "targetChainId", + type: "uint256", + }, + { + internalType: "contract IAdapter", + name: "adapter", + type: "address", + }, + { + internalType: "uint256[]", + name: "messageIds", + type: "uint256[]", + }, + { + internalType: "bytes32[]", + name: "messageHashes", + type: "bytes32[]", + }, + ], + name: "dispatchMessages", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "payable", + type: "function", + }, +] diff --git a/packages/reporter/src/controllers/StandardReporterController.ts b/packages/reporter/src/controllers/StandardReporterController.ts index 345774d3..c203f196 100644 --- a/packages/reporter/src/controllers/StandardReporterController.ts +++ b/packages/reporter/src/controllers/StandardReporterController.ts @@ -1,9 +1,9 @@ -import { Chain, formatEther } from "viem" -import ABI from "../ABIs/StandardReporterContractABI.json" assert { type: "json" } +import { Chain } from "viem" -import BaseController from "./BaseController.js" +import standardReporterAbi from "../abi/standardReporter" +import BaseController from "./BaseController" -import { BaseControllerConfigs } from "./BaseController.js" +import { BaseControllerConfigs } from "./BaseController" interface StandardReporterControllerConfigs extends BaseControllerConfigs { name: string @@ -34,7 +34,7 @@ class StandardReporterController extends BaseController { this.logger.info(`reporting block header for block ${blockNumber} on ${chain.name} ...`) const { request } = await client.simulateContract({ address: this.reporterAddresses[chain.name], - abi: ABI, + abi: standardReporterAbi, functionName: "dispatchBlocks", args: [chain.id, this.adapterAddresses[chain.name], [blockNumber]], value: this._reportHeadersValue, diff --git a/packages/reporter/src/controllers/WormholeReporterController.ts b/packages/reporter/src/controllers/WormholeReporterController.ts index 5bbff0ba..44d2beda 100644 --- a/packages/reporter/src/controllers/WormholeReporterController.ts +++ b/packages/reporter/src/controllers/WormholeReporterController.ts @@ -2,13 +2,13 @@ import axios, { AxiosInstance } from "axios" import { Mutex } from "async-mutex" import { Chain } from "viem" -import BaseController from "./BaseController.js" -import sleep from "../utils/sleep.js" -import ReporterABI from "../ABIs/WormholeReporterABI.json" assert { type: "json" } -import AdapterABI from "../ABIs/WormholeAdapterABI.json" assert { type: "json" } -import WormholeABI from "../ABIs/WormholeABI.json" assert { type: "json" } +import BaseController from "./BaseController" +import sleep from "../utils/sleep" +import wormholeReporterAbi from "../abi/wormholeReporter" +import wormholeAdapterAbi from "../abi/wormholeAdapter" +import wormholeAbi from "../abi/wormhole" -import { BaseControllerConfigs } from "./BaseController.js" +import { BaseControllerConfigs } from "./BaseController" interface WormholeReporterControllerConfigs extends BaseControllerConfigs { wormholeScanBaseUrl: string @@ -40,7 +40,7 @@ class WormholeReporterController extends BaseController { const nextSequence = await client.readContract({ address: this._wormholeAddress as `0x${string}`, - abi: WormholeABI, + abi: wormholeAbi, functionName: "nextSequence", args: [this.reporterAddress], }) @@ -48,7 +48,7 @@ class WormholeReporterController extends BaseController { this.logger.info(`reporting block header for block ${blockNumber} ...`) const { request } = await client.simulateContract({ address: this.reporterAddress as `0x${string}`, - abi: ReporterABI, + abi: wormholeReporterAbi, functionName: "dispatchBlocks", // targetChainId & adapter are not used in _dispatch(), here set to 0 args: [0, "0x0000000000000000000000000000000000000000", [blockNumber]], @@ -85,7 +85,7 @@ class WormholeReporterController extends BaseController { this.logger.info(`Storing header on ${chain.name} ...`) const { request } = await destinationChainClient.simulateContract({ address: this.adapterAddresses[chain.name], - abi: AdapterABI, + abi: wormholeAdapterAbi, functionName: "storeHashesByEncodedVM", args: [vaaBytes], }) diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 0cdc7b67..a3262f8d 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -10,22 +10,20 @@ import { goerli, optimism, optimismGoerli, - optimismSepolia, polygon, mainnet, sepolia, } from "viem/chains" import { Chain } from "viem" +import { logger } from "@gnosis/hashi-common" -import Multiclient from "./MultiClient.js" -import StandardReporterController from "./controllers/StandardReporterController.js" -import WormholeReporterController from "./controllers/WormholeReporterController.js" +import Multiclient from "./MultiClient" +import StandardReporterController from "./controllers/StandardReporterController" +import WormholeReporterController from "./controllers/WormholeReporterController" -import Coordinator from "./Coordinator.js" -import { settings } from "./settings/index.js" -import logger from "./utils/logger.js" - -const main = () => { +import Coordinator from "./Coordinator" +import { settings } from "./settings/index" +;(async () => { const controllersEnabled = process.env.REPORTERS_ENABLED?.split(",") const sourceChainId = Number(process.env.SOURCE_CHAIN_ID) @@ -260,6 +258,4 @@ const main = () => { }) coordinator.start() -} - -main() +})() diff --git a/packages/reporter/src/utils/logger.ts b/packages/reporter/src/utils/logger.ts deleted file mode 100644 index 54055ed2..00000000 --- a/packages/reporter/src/utils/logger.ts +++ /dev/null @@ -1,28 +0,0 @@ -import winston from "winston" - -const colors = { - error: "red", - warn: "yellow", - info: "cyan", - debug: "blue", - service: "magenta", -} - -const logger = winston.createLogger({ - level: "info", - format: winston.format.combine( - winston.format.colorize({ - colors, - }), - winston.format.timestamp(), - winston.format.printf(({ timestamp, level, message, service }) => { - const colorize = winston.format.colorize() - return `${timestamp} [${level}] ${colorize.colorize("service", `${service}`)}: ${message}` - }), - ), - transports: [new winston.transports.Console(), new winston.transports.File({ filename: "./logs/application.log" })], -}) - -winston.addColors(colors) - -export default logger diff --git a/packages/reporter/src/utils/proofs.ts b/packages/reporter/src/utils/proofs.ts deleted file mode 100644 index 77c17251..00000000 --- a/packages/reporter/src/utils/proofs.ts +++ /dev/null @@ -1,150 +0,0 @@ -import { AxiosInstance } from "axios" -import { capella, ssz, phase0 } from "@lodestar/types" -import { ProofType, createProof, SingleProof } from "@chainsafe/persistent-merkle-tree" -import { TransactionType } from "@ethereumjs/tx" -import { hexToBytes, concatBytes, bigIntToBytes, intToBytes } from "@ethereumjs/util" -import { TxReceipt, PostByzantiumTxReceipt, PreByzantiumTxReceipt } from "@ethereumjs/vm" -import { toHexString, fromHexString } from "@chainsafe/ssz" -import { RLP } from "@ethereumjs/rlp" -import { WalletClient, PublicClient, TransactionReceipt, Log } from "viem" -import { Trie } from "@ethereumjs/trie" - -const SLOTS_PER_HISTORICAL_ROOT = 8192 - -export type BeaconId = number | Uint8Array | string - -export const toStringFromBeaconId = (identifier: BeaconId) => { - if (identifier instanceof Uint8Array) { - return toHexString(identifier) - } - return identifier.toString() -} - -export const getState = async (_stateId: BeaconId, _client: AxiosInstance): Promise => { - const { data } = await _client.get(`/eth/v2/debug/beacon/states/${toStringFromBeaconId(_stateId)}`) - return ssz.capella.BeaconState.fromJson(data.data) as capella.BeaconState -} - -export const getHeader = async (_blockId: BeaconId, _client: AxiosInstance): Promise => { - const { data } = await _client.get(`/eth/v1/beacon/headers/${toStringFromBeaconId(_blockId)}`) - return ssz.phase0.BeaconBlockHeader.fromJson(data.data.header.message) -} - -export const getReceiptsRootProof = async (_srcBlockId: BeaconId, _targetBlockId: BeaconId, _client: AxiosInstance) => { - const srcState = await getState(toStringFromBeaconId(_srcBlockId), _client) - const targetState = await getState(toStringFromBeaconId(_targetBlockId), _client) - - const srcView = ssz.capella.BeaconState.toView(srcState as capella.BeaconState) - const targetView = ssz.capella.BeaconState.toView(targetState as capella.BeaconState) - const srcSlot = srcState.slot - const targetSlot = targetState.slot - - const srcHeader = await getHeader(_srcBlockId, _client) - const srcHeaderView = ssz.phase0.BeaconBlockHeader.toView(srcHeader as phase0.BeaconBlockHeader) - - let receiptsRootProof - let receiptsRoot - if (srcSlot == targetSlot) { - const receiptGindex = ssz.capella.BeaconState.getPathInfo(["latestExecutionPayloadHeader", "receiptsRoot"]).gindex - const receiptProof = createProof(targetView.node, { - type: ProofType.single, - gindex: receiptGindex, - }) as SingleProof - receiptsRootProof = receiptProof.witnesses.map(toHexString) - receiptsRoot = toHexString(receiptProof.leaf) - } else if (srcSlot - targetSlot < 8192) { - const headerGindex = ssz.phase0.BeaconBlockHeader.getPathInfo(["stateRoot"]).gindex - const headerProof = createProof(srcHeaderView.node, { - type: ProofType.single, - gindex: headerGindex, - }) as SingleProof - - const stateRootGindex = ssz.capella.BeaconState.getPathInfo([ - "stateRoots", - targetSlot % SLOTS_PER_HISTORICAL_ROOT, - ]).gindex - const proof = createProof(srcView.node, { - type: ProofType.single, - gindex: stateRootGindex, - }) as SingleProof - - const receiptGindex = ssz.capella.BeaconState.getPathInfo(["latestExecutionPayloadHeader", "receiptsRoot"]).gindex - const receiptProof = createProof(targetView.node, { - type: ProofType.single, - gindex: receiptGindex, - }) as SingleProof - receiptsRootProof = receiptProof.witnesses.concat(proof.witnesses).concat(headerProof.witnesses).map(toHexString) - receiptsRoot = toHexString(receiptProof.leaf) - } else { - throw Error("slots are too far") - } - return { receiptsRootProof, receiptsRoot } -} - -// copied from here: https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/runBlock.ts -export const encodeReceipt = (receipt: TxReceipt, txType: TransactionType) => { - const encoded = RLP.encode([ - (receipt as PreByzantiumTxReceipt).stateRoot ?? - ((receipt as PostByzantiumTxReceipt).status === 0 ? Uint8Array.from([]) : hexToBytes("0x01")), - bigIntToBytes(receipt.cumulativeBlockGasUsed), - receipt.bitvector, - receipt.logs, - ]) - - if (txType === TransactionType.Legacy) { - return encoded - } - - // Serialize receipt according to EIP-2718: - // `typed-receipt = tx-type || receipt-data` - return concatBytes(intToBytes(txType), encoded) -} - -export const getReceiptProof = async (_hash: `0x${string}`, _client: PublicClient & WalletClient) => { - const receipt = await _client.getTransactionReceipt({ hash: _hash }) - const block = await _client.getBlock({ blockNumber: receipt.blockNumber }) - const receipts = [] as TransactionReceipt[] - for (const hash of block.transactions) { - receipts.push(await _client.getTransactionReceipt({ hash })) - } - - const trie = new Trie() - const encodedReceipts = receipts.map((_receipt) => { - let type = 0 - if (_receipt.type == "eip2930") { - type = 1 - } else if (_receipt.type == "eip1559") { - type = 2 - } else if (_receipt.type != "legacy") { - throw Error(`Unknown receipt type ${_receipt.type}`) - } - - return encodeReceipt( - { - bitvector: fromHexString(_receipt.logsBloom), - cumulativeBlockGasUsed: BigInt(_receipt.cumulativeGasUsed), - logs: _receipt.logs.map((_log: Log) => { - return [ - fromHexString(_log.address), - _log.topics.map((_topic: `0x${string}`) => fromHexString(_topic)), - fromHexString(_log.data), - ] - }), - status: _receipt.status === "success" ? 1 : 0, - } as TxReceipt, - type, - ) - }) - - await Promise.all( - receipts.map((_receipt, _index) => trie.put(RLP.encode(_receipt.transactionIndex), encodedReceipts[_index])), - ) - const receiptKey = RLP.encode(receipt.transactionIndex) - - const root = toHexString(trie.root()) - if (root !== block.receiptsRoot) { - throw Error("The trie.root() and block.receiptsRoot do not match") - } - - return { receiptProof: await trie.createProof(receiptKey), receiptsRoot: block.receiptsRoot } -} diff --git a/packages/reporter/tsconfig.json b/packages/reporter/tsconfig.json index 974c23aa..e6d845c2 100644 --- a/packages/reporter/tsconfig.json +++ b/packages/reporter/tsconfig.json @@ -1,36 +1,6 @@ { + "extends": "@tsconfig/node22/tsconfig.json", "compilerOptions": { - "declaration": true, - "declarationMap": true, - "emitDecoratorMetadata": true, - "esModuleInterop": true, - "experimentalDecorators": true, - "forceConsistentCasingInFileNames": true, - "lib": [ - "es6", - "ESNext", - "DOM" - ], - "module": "ESNext", - "moduleResolution": "node", - "noImplicitAny": true, - "outDir": "./dist", - "rootDir": "./src", - "removeComments": true, - "resolveJsonModule": true, - "sourceMap": true, - "strict": true, - "target": "ESNext", - "skipLibCheck": true, - }, - "exclude": [ - "node_modules" - ], - "include": [ - "./src/**/*" - ], - "ts-node": { - "esm": true, - "experimentalSpecifierResolution": "node" + "outDir": "./dist" } -} \ No newline at end of file +} diff --git a/yarn.lock b/yarn.lock index 9d8c7d3b..d155c39b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -52,54 +52,11 @@ "@openzeppelin/contracts-upgradeable-4.7.3" "npm:@openzeppelin/contracts-upgradeable@v4.7.3" "@openzeppelin/contracts-v0.7" "npm:@openzeppelin/contracts@v3.4.2" -"@chainsafe/as-sha256@0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@chainsafe/as-sha256/-/as-sha256-0.5.0.tgz#2523fbef2b80b5000f9aa71f4a76e5c2c5c076bb" - integrity sha512-dTIY6oUZNdC5yDTVP5Qc9hAlKAsn0QTQ2DnQvvsbTnKSTbYs3p5RPN0aIUqN0liXei/9h24c7V0dkV44cnWIQA== - "@chainsafe/as-sha256@^0.3.1": version "0.3.1" resolved "https://registry.yarnpkg.com/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz#3639df0e1435cab03f4d9870cc3ac079e57a6fc9" integrity sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg== -"@chainsafe/as-sha256@^0.4.1": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@chainsafe/as-sha256/-/as-sha256-0.4.2.tgz#21ad1371e2245e430c1a554a05f10d333c6f42cc" - integrity sha512-HJ8GZBRjLeWtRsAXf3EbNsNzmTGpzTFjfpSf4yHkLYC+E52DhT6hwz+7qpj6I/EmFzSUm5tYYvT9K8GZokLQCQ== - -"@chainsafe/hashtree-darwin-arm64@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@chainsafe/hashtree-darwin-arm64/-/hashtree-darwin-arm64-1.0.1.tgz#e2c60090c56a1c8dc8bdff329856184ad32e4cd5" - integrity sha512-+KmEgQMpO7FDL3klAcpXbQ4DPZvfCe0qSaBBrtT4vLF8V1JGm3sp+j7oibtxtOsLKz7nJMiK1pZExi7vjXu8og== - -"@chainsafe/hashtree-linux-arm64-gnu@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@chainsafe/hashtree-linux-arm64-gnu/-/hashtree-linux-arm64-gnu-1.0.1.tgz#49d2604a6c9106219448af3eaf76f4da6e44daca" - integrity sha512-p1hnhGq2aFY+Zhdn1Q6L/6yLYNKjqXfn/Pc8jiM0e3+Lf/hB+yCdqYVu1pto26BrZjugCFZfupHaL4DjUTDttw== - -"@chainsafe/hashtree-linux-x64-gnu@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@chainsafe/hashtree-linux-x64-gnu/-/hashtree-linux-x64-gnu-1.0.1.tgz#31c5a2bb196b78f04f2bf4bfb5c1bf1f3331f071" - integrity sha512-uCIGuUWuWV0LiB4KLMy6JFa7Jp6NmPl3hKF5BYWu8TzUBe7vSXMZfqTzGxXPggFYN2/0KymfRdG9iDCOJfGRqg== - -"@chainsafe/hashtree@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@chainsafe/hashtree/-/hashtree-1.0.1.tgz#587666a261e1da6a37904095ce875fddc53c7c89" - integrity sha512-bleu9FjqBeR/l6W1u2Lz+HsS0b0LLJX2eUt3hOPBN7VqOhidx8wzkVh2S7YurS+iTQtfdK4K5QU9tcTGNrGwDg== - optionalDependencies: - "@chainsafe/hashtree-darwin-arm64" "1.0.1" - "@chainsafe/hashtree-linux-arm64-gnu" "1.0.1" - "@chainsafe/hashtree-linux-x64-gnu" "1.0.1" - -"@chainsafe/persistent-merkle-tree@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.8.0.tgz#18e2f0a5de3a0b59c6e5be8797a78e0d209dd7dc" - integrity sha512-hh6C1JO6SKlr0QGNTNtTLqgGVMA/Bc20wD6CeMHp+wqbFKCULRJuBUxhF4WDx/7mX8QlqF3nFriF/Eo8oYJ4/A== - dependencies: - "@chainsafe/as-sha256" "0.5.0" - "@chainsafe/hashtree" "1.0.1" - "@noble/hashes" "^1.3.0" - "@chainsafe/persistent-merkle-tree@^0.4.2": version "0.4.2" resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz#4c9ee80cc57cd3be7208d98c40014ad38f36f7ff" @@ -114,14 +71,6 @@ dependencies: "@chainsafe/as-sha256" "^0.3.1" -"@chainsafe/persistent-merkle-tree@^0.6.1": - version "0.6.1" - resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.6.1.tgz#37bde25cf6cbe1660ad84311aa73157dc86ec7f2" - integrity sha512-gcENLemRR13+1MED2NeZBMA7FRS0xQPM7L2vhMqvKkjqtFT4YfjSVADq5U0iLuQLhFUJEMVuA8fbv5v+TN6O9A== - dependencies: - "@chainsafe/as-sha256" "^0.4.1" - "@noble/hashes" "^1.3.0" - "@chainsafe/ssz@^0.10.0": version "0.10.2" resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.10.2.tgz#c782929e1bb25fec66ba72e75934b31fd087579e" @@ -130,22 +79,6 @@ "@chainsafe/as-sha256" "^0.3.1" "@chainsafe/persistent-merkle-tree" "^0.5.0" -"@chainsafe/ssz@^0.14.0": - version "0.14.3" - resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.14.3.tgz#caae48ae2670b2f8b6febed22b0e0619a636f316" - integrity sha512-ldOx4Rk9OC8YMvFdwvHKtRc7KpFRLcXlb9ATCdQ5fHtLT438LRQyxdWFufC9+M8jFHSZcgq31h2BJsSva6sZ0w== - dependencies: - "@chainsafe/as-sha256" "^0.4.1" - "@chainsafe/persistent-merkle-tree" "^0.6.1" - -"@chainsafe/ssz@^0.17.1": - version "0.17.1" - resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.17.1.tgz#7986afbcad5e6971006d596fdb7dfa34bc195131" - integrity sha512-1ay46QqYcVTBvUnDXTPTi5WTiENu7tIxpZGMDpUWps1/nYBmh/We/UoCF/jO+o/fkcDD3p8xQPlHbcCfy+jyjA== - dependencies: - "@chainsafe/as-sha256" "0.5.0" - "@chainsafe/persistent-merkle-tree" "0.8.0" - "@chainsafe/ssz@^0.9.2": version "0.9.4" resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.9.4.tgz#696a8db46d6975b600f8309ad3a12f7c0e310497" @@ -423,113 +356,16 @@ bufio "^1.0.7" chai "^4.3.4" -"@ethereumjs/block@^5.1.1", "@ethereumjs/block@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-5.3.0.tgz#a22d615f825a3aa123189434263a6c1d43d4ac8f" - integrity sha512-cyphdEB/ywIERqWLRHdAS6muTkAcd6BibMOp6XmGbeWgvtIhe4ArxcMDI78MVstJzT/faihvRI4rKQKy+MpdKQ== - dependencies: - "@ethereumjs/common" "^4.4.0" - "@ethereumjs/rlp" "^5.0.2" - "@ethereumjs/trie" "^6.2.1" - "@ethereumjs/tx" "^5.4.0" - "@ethereumjs/util" "^9.1.0" - ethereum-cryptography "^2.2.1" - -"@ethereumjs/blockchain@^7.1.0": - version "7.3.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-7.3.0.tgz#87049c61b51a0870f3c23b5390b6ff9f3e3ae7f0" - integrity sha512-UZXFb6JFeXDHobKhXGAiKf+m5n2ynCtqpgHWCl2nQ3Tol9W7C3By4UFMpAl2E6EyaFhC26Maig9kqCWxfsQ6bQ== - dependencies: - "@ethereumjs/block" "^5.3.0" - "@ethereumjs/common" "^4.4.0" - "@ethereumjs/ethash" "^3.0.4" - "@ethereumjs/rlp" "^5.0.2" - "@ethereumjs/trie" "^6.2.1" - "@ethereumjs/tx" "^5.4.0" - "@ethereumjs/util" "^9.1.0" - debug "^4.3.3" - ethereum-cryptography "^2.2.1" - lru-cache "10.1.0" - -"@ethereumjs/common@^4.2.0", "@ethereumjs/common@^4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-4.4.0.tgz#fba41612f527a815bf304e98653d6b5fc5d6d4de" - integrity sha512-Fy5hMqF6GsE6DpYTyqdDIJPJgUtDn4dL120zKw+Pswuo+iLyBsEYuSyzMw6NVzD2vDzcBG9fE4+qX4X2bPc97w== - dependencies: - "@ethereumjs/util" "^9.1.0" - -"@ethereumjs/ethash@^3.0.4": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@ethereumjs/ethash/-/ethash-3.0.4.tgz#663524abbc2f5ef6fa9813067eb33808fd8a0309" - integrity sha512-dDc9h4RxEIWr38DxzeFyWlTmc++WeAFysFT6Ru0opoQ8WSM/hM3KH1VfHMPwx6JaqQT89Q/xtHV3CEvWrbwLKw== - dependencies: - "@ethereumjs/block" "^5.3.0" - "@ethereumjs/rlp" "^5.0.2" - "@ethereumjs/util" "^9.1.0" - bigint-crypto-utils "^3.2.2" - ethereum-cryptography "^2.2.1" - -"@ethereumjs/evm@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ethereumjs/evm/-/evm-2.2.1.tgz#07dd48152bb19277980b295a149b0936d2ff67b3" - integrity sha512-equF3QqssDgfZyVDEoMqJUsMCjO9SwgFdpUTc7yHFOU74X43l/MHM+Cqdey+wcBhdU2yOwD9S2AbW6wh7tDYfQ== - dependencies: - "@ethereumjs/common" "^4.2.0" - "@ethereumjs/statemanager" "^2.2.2" - "@ethereumjs/tx" "^5.2.1" - "@ethereumjs/util" "^9.0.2" - "@types/debug" "^4.1.9" - debug "^4.3.3" - ethereum-cryptography "^2.1.3" - rustbn-wasm "^0.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/rlp@^5.0.1", "@ethereumjs/rlp@^5.0.2": +"@ethereumjs/rlp@^5.0.2": version "5.0.2" resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-5.0.2.tgz#c89bd82f2f3bec248ab2d517ae25f5bbc4aac842" integrity sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA== -"@ethereumjs/statemanager@^2.2.2": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/statemanager/-/statemanager-2.4.0.tgz#105feb0653942118758b3522ef05c8901d7924b3" - integrity sha512-IBe5kMGsDWlSvNg7QCERwO3BQE1c9hzVIZ9ktZF7xyifFEfA4VNhTMMEpwLuiAIy0l/ZzZiZ17/Iqar+SawMYA== - dependencies: - "@ethereumjs/common" "^4.4.0" - "@ethereumjs/rlp" "^5.0.2" - "@ethereumjs/trie" "^6.2.1" - "@ethereumjs/util" "^9.1.0" - debug "^4.3.3" - ethereum-cryptography "^2.2.1" - js-sdsl "^4.1.4" - lru-cache "10.1.0" - -"@ethereumjs/trie@^6.0.1", "@ethereumjs/trie@^6.1.1", "@ethereumjs/trie@^6.2.1": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@ethereumjs/trie/-/trie-6.2.1.tgz#11d3e91ffd7d565f468a62c0e3d7952063991fa9" - integrity sha512-MguABMVi/dPtgagK+SuY57rpXFP+Ghr2x+pBDy+e3VmMqUY+WGzFu1QWjBb5/iJ7lINk4CI2Uwsih07Nu9sTSg== - dependencies: - "@ethereumjs/rlp" "^5.0.2" - "@ethereumjs/util" "^9.1.0" - "@types/readable-stream" "^2.3.13" - debug "^4.3.4" - ethereum-cryptography "^2.2.1" - lru-cache "10.1.0" - readable-stream "^3.6.0" - -"@ethereumjs/tx@^5.2.1", "@ethereumjs/tx@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-5.4.0.tgz#6f47894cc3e2d4e63d87c62b41ed7e8180a1de58" - integrity sha512-SCHnK7m/AouZ7nyoR0MEXw1OO/tQojSbp88t8oxhwes5iZkZCtfFdUrJaiIb72qIpH2FVw6s1k1uP7LXuH7PsA== - dependencies: - "@ethereumjs/common" "^4.4.0" - "@ethereumjs/rlp" "^5.0.2" - "@ethereumjs/util" "^9.1.0" - ethereum-cryptography "^2.2.1" - "@ethereumjs/util@^8.1.0": version "8.1.0" resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-8.1.0.tgz#299df97fb6b034e0577ce9f94c7d9d1004409ed4" @@ -539,7 +375,7 @@ ethereum-cryptography "^2.0.0" micro-ftch "^0.3.1" -"@ethereumjs/util@^9.0.1", "@ethereumjs/util@^9.0.2", "@ethereumjs/util@^9.1.0": +"@ethereumjs/util@^9.0.3": version "9.1.0" resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-9.1.0.tgz#75e3898a3116d21c135fa9e29886565609129bce" integrity sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog== @@ -547,23 +383,6 @@ "@ethereumjs/rlp" "^5.0.2" ethereum-cryptography "^2.2.1" -"@ethereumjs/vm@^7.1.0": - version "7.2.1" - resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-7.2.1.tgz#c53610a8c327aabfdd0a5dedfe32eb3aebb17665" - integrity sha512-exmyhDPlfiBtV/nIPY7gE5iu3QC62F7hf/fALLgQaUS8ezxmJQG2MRaFI1eqYwvsAhfNBfst7K6KcCE4jbGbhw== - dependencies: - "@ethereumjs/block" "^5.1.1" - "@ethereumjs/blockchain" "^7.1.0" - "@ethereumjs/common" "^4.2.0" - "@ethereumjs/evm" "^2.2.1" - "@ethereumjs/rlp" "^5.0.2" - "@ethereumjs/statemanager" "^2.2.2" - "@ethereumjs/trie" "^6.1.1" - "@ethereumjs/tx" "^5.2.1" - "@ethereumjs/util" "^9.0.2" - debug "^4.3.3" - ethereum-cryptography "^2.1.3" - "@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" @@ -983,20 +802,6 @@ resolved "https://registry.yarnpkg.com/@layerzerolabs/lz-evm-protocol-v2/-/lz-evm-protocol-v2-2.3.42.tgz#171e2332aa83e5d30ebdb64c1b1158d204139153" integrity sha512-my4tWF57jtwth/oLz3X1hYljPDDZM9wKzU498yk+6FgBtKg6J4uZIUoNh3p3GgUJ+Lde8pVpxqJ5pNchPICxmQ== -"@lodestar/params@^1.22.0": - version "1.22.0" - resolved "https://registry.yarnpkg.com/@lodestar/params/-/params-1.22.0.tgz#e2d436da9ceb742e7ae088a6474468e8e8756a1b" - integrity sha512-wbbeQAG+4YOl1ATsSDJnx7wBk5FXsRl2OrmLkMnJXI67wqvRwWk8WQBx7wjx2hnWWrk0in4/8bTtHz3At1GydQ== - -"@lodestar/types@^1.12.0": - version "1.22.0" - resolved "https://registry.yarnpkg.com/@lodestar/types/-/types-1.22.0.tgz#5178c5edfaefe8875533545d95707957fa59f80a" - integrity sha512-BB0zgiqmIYmpg1ifDJ4VW0Ka2vkdmM7ju7lAQLk1O666iGWLObhfrLzQ+LbZ8/0h+PnjpDMB55MJSffmnqCkGg== - dependencies: - "@chainsafe/ssz" "^0.17.1" - "@lodestar/params" "^1.22.0" - ethereum-cryptography "^2.0.0" - "@metamask/eth-sig-util@^4.0.0": version "4.0.1" resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" @@ -1058,7 +863,7 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== -"@noble/hashes@1.5.0", "@noble/hashes@^1.3.0", "@noble/hashes@^1.4.0", "@noble/hashes@~1.5.0": +"@noble/hashes@1.5.0", "@noble/hashes@^1.4.0", "@noble/hashes@~1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.5.0.tgz#abadc5ca20332db2b1b2aa3e496e9af1213570b0" integrity sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA== @@ -1399,7 +1204,7 @@ "@openzeppelin/contracts" "^4.4.1" "@openzeppelin/contracts-upgradeable" "^4.7.3" -"@scure/base@^1.1.1", "@scure/base@~1.1.0", "@scure/base@~1.1.2", "@scure/base@~1.1.6", "@scure/base@~1.1.8": +"@scure/base@~1.1.0", "@scure/base@~1.1.2", "@scure/base@~1.1.6", "@scure/base@~1.1.8": version "1.1.9" resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1" integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg== @@ -1605,6 +1410,11 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== +"@tsconfig/node22@^22.0.0": + version "22.0.0" + resolved "https://registry.yarnpkg.com/@tsconfig/node22/-/node22-22.0.0.tgz#0bdaf702f2b7594383d24d7b2b8d557dcfdca1ed" + integrity sha512-twLQ77zevtxobBOD4ToAtVmuYrpeYUh3qh+TEp+08IWhpsrIflVHqQ1F1CiPxQGL7doCdBIOOCF+1Tm833faNg== + "@typechain/ethers-v5@^10.1.1": version "10.2.1" resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz#50241e6957683281ecfa03fb5a6724d8a3ce2391" @@ -1634,6 +1444,14 @@ dependencies: "@types/node" "*" +"@types/body-parser@*": + version "1.19.5" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" + integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== + dependencies: + "@types/connect" "*" + "@types/node" "*" + "@types/chai-as-promised@^7.1.3": version "7.1.8" resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz#f2b3d82d53c59626b5d6bbc087667ccb4b677fe9" @@ -1653,19 +1471,32 @@ dependencies: "@types/node" "*" -"@types/connect@^3.4.33": +"@types/connect@*", "@types/connect@^3.4.33": version "3.4.38" resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== dependencies: "@types/node" "*" -"@types/debug@^4.1.9": - version "4.1.12" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" - integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== +"@types/express-serve-static-core@^4.17.33": + version "4.19.5" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz#218064e321126fcf9048d1ca25dd2465da55d9c6" + integrity sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg== dependencies: - "@types/ms" "*" + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@^4.17.21": + version "4.17.21" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" + integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" "@types/form-data@0.0.33": version "0.0.33" @@ -1682,6 +1513,11 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/http-errors@*": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== + "@types/json-schema@^7.0.12", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" @@ -1692,6 +1528,11 @@ resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== +"@types/mime@^1": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== + "@types/minimatch@*": version "5.1.2" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" @@ -1714,11 +1555,6 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.8.tgz#a7eff5816e070c3b4d803f1d3cd780c4e42934a1" integrity sha512-HfMcUmy9hTMJh66VNcmeC9iVErIZJli2bszuXc6julh5YGuRb/W5OnkHjwLNYdFlMis0sY3If5SEAp+PktdJjw== -"@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-cron@^3.0.9": version "3.0.11" resolved "https://registry.yarnpkg.com/@types/node-cron/-/node-cron-3.0.11.tgz#70b7131f65038ae63cfe841354c8aba363632344" @@ -1782,11 +1618,16 @@ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== -"@types/qs@^6.2.31", "@types/qs@^6.9.7": +"@types/qs@*", "@types/qs@^6.2.31", "@types/qs@^6.9.7": version "6.9.16" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.16.tgz#52bba125a07c0482d26747d5d4947a64daf8f794" integrity sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A== +"@types/range-parser@*": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== + "@types/readable-stream@^2.3.13": version "2.3.15" resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-2.3.15.tgz#3d79c9ceb1b6a57d5f6e6976f489b9b5384321ae" @@ -1814,6 +1655,23 @@ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== +"@types/send@*": + version "0.17.4" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-static@*": + version "1.15.7" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" + integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== + dependencies: + "@types/http-errors" "*" + "@types/node" "*" + "@types/send" "*" + "@types/sinon-chai@3.2.12": version "3.2.12" resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-3.2.12.tgz#c7cb06bee44a534ec84f3a5534c3a3a46fd779b6" @@ -2091,6 +1949,14 @@ abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3, abstract-le module-error "^1.0.1" queue-microtask "^1.2.3" +accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -2177,6 +2043,13 @@ ansi-escapes@^4.3.0: dependencies: type-fest "^0.21.3" +ansi-escapes@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-7.0.0.tgz#00fc19f491bbb18e1d481b97868204f92109bfe7" + integrity sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw== + dependencies: + environment "^1.0.0" + ansi-regex@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" @@ -2187,6 +2060,11 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== + ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -2201,6 +2079,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +ansi-styles@^6.0.0, ansi-styles@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + antlr4@^4.11.0: version "4.13.2" resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.13.2.tgz#0d084ad0e32620482a9c3a0e2470c02e72e4006d" @@ -2246,6 +2129,11 @@ array-back@^4.0.1, array-back@^4.0.2: resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + array-ify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" @@ -2358,7 +2246,7 @@ bigint-buffer@^1.1.5: dependencies: bindings "^1.3.0" -bigint-crypto-utils@^3.0.23, bigint-crypto-utils@^3.2.2: +bigint-crypto-utils@^3.0.23: version "3.3.0" resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz#72ad00ae91062cf07f2b1def9594006c279c1d77" integrity sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg== @@ -2400,6 +2288,24 @@ bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== +body-parser@1.20.3, body-parser@^1.20.2: + version "1.20.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" + integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.13.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" + borsh@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.7.0.tgz#6e9560d719d86d90dc589bca60ffc8a6c51fec2a" @@ -2613,6 +2519,11 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + "charenc@>= 0.0.1": version "0.0.2" resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" @@ -2674,6 +2585,13 @@ clean-stack@^2.0.0: resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== +cli-cursor@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-5.0.0.tgz#24a4831ecf5a6b01ddeb32fb71a4b2088b0dce38" + integrity sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw== + dependencies: + restore-cursor "^5.0.0" + cli-table3@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" @@ -2684,6 +2602,14 @@ cli-table3@^0.5.0: optionalDependencies: colors "^1.1.2" +cli-truncate@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a" + integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== + dependencies: + slice-ansi "^5.0.0" + string-width "^7.0.0" + cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -2742,6 +2668,11 @@ color@^3.1.3: color-convert "^1.9.3" color-string "^1.6.0" +colorette@^2.0.20: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + colors@1.4.0, colors@^1.1.2: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" @@ -2802,6 +2733,11 @@ commander@^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== +commander@~12.1.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" + integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== + compare-func@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" @@ -2825,6 +2761,18 @@ concat-stream@^1.6.0, concat-stream@^1.6.2: readable-stream "^2.2.2" typedarray "^0.0.6" +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + conventional-changelog-angular@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-6.0.0.tgz#a9a9494c28b7165889144fd5b91573c4aa9ca541" @@ -2849,6 +2797,16 @@ conventional-commits-parser@^4.0.0: meow "^8.1.2" split2 "^3.2.2" +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" + integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== + cookie@^0.4.1: version "0.4.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" @@ -2931,7 +2889,14 @@ death@^1.1.0: resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" integrity sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w== -debug@4, debug@^4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5: +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@^4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5, debug@~4.3.6: version "4.3.7" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== @@ -2997,6 +2962,11 @@ depd@2.0.0: resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" @@ -3044,6 +3014,11 @@ dotenv@^16.0.3, dotenv@^16.3.1: version "1.0.0" resolved "https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0" +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + elliptic@6.5.4: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" @@ -3070,6 +3045,11 @@ elliptic@^6.5.2, elliptic@^6.5.4: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +emoji-regex@^10.3.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.4.0.tgz#03553afea80b3975749cfcb36f776ca268e413d4" + integrity sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -3085,6 +3065,16 @@ encode-utf8@^1.0.2: resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw== +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +encodeurl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + enquirer@^2.3.0, enquirer@^2.3.6: version "2.4.1" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" @@ -3098,6 +3088,11 @@ env-paths@^2.2.0: resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== +environment@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/environment/-/environment-1.1.0.tgz#8e86c66b180f363c7ab311787e0259665f45a9f1" + integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -3134,6 +3129,11 @@ escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + 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" @@ -3284,6 +3284,11 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + eth-gas-reporter@^0.2.25: version "0.2.27" resolved "https://registry.yarnpkg.com/eth-gas-reporter/-/eth-gas-reporter-0.2.27.tgz#928de8548a674ed64c7ba0bf5795e63079150d4e" @@ -3341,7 +3346,7 @@ ethereum-cryptography@^1.0.3: "@scure/bip32" "1.1.5" "@scure/bip39" "1.1.1" -ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2, ethereum-cryptography@^2.1.3, ethereum-cryptography@^2.2.1: +ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2, ethereum-cryptography@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz#58f2810f8e020aecb97de8c8c76147600b0b8ccf" integrity sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg== @@ -3463,6 +3468,58 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +execa@~8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" + integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^8.0.1" + human-signals "^5.0.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^4.1.0" + strip-final-newline "^3.0.0" + +express@^4.19.2: + version "4.21.0" + resolved "https://registry.yarnpkg.com/express/-/express-4.21.0.tgz#d57cb706d49623d4ac27833f1cbc466b668eb915" + integrity sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.3" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.6.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~2.0.0" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.3.1" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.3" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.10" + proxy-addr "~2.0.7" + qs "6.13.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.19.0" + serve-static "1.16.2" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + eyes@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" @@ -3540,6 +3597,19 @@ fill-range@^7.1.1: dependencies: to-regex-range "^5.0.1" +finalhandler@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" + integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== + dependencies: + debug "2.6.9" + encodeurl "~2.0.0" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + find-replace@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" @@ -3636,6 +3706,11 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + fp-ts@1.19.3: version "1.19.3" resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" @@ -3646,6 +3721,11 @@ fp-ts@^1.0.0: resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + fs-extra@^0.30.0: version "0.30.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" @@ -3733,6 +3813,11 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-east-asian-width@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz#5e6ebd9baee6fb8b7b6bd505221065f0cd91f64e" + integrity sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA== + 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" @@ -3759,6 +3844,11 @@ get-stream@^6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== +get-stream@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" + integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== + ghost-testrpc@^0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz#c4de9557b1d1ae7b2d20bbe474a91378ca90ce92" @@ -4166,6 +4256,11 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== +human-signals@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" + integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== + humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" @@ -4178,6 +4273,11 @@ husky@^8.0.3: resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== +husky@^9.0.11: + version "9.1.6" + resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.6.tgz#e23aa996b6203ab33534bdc82306b0cf2cb07d6c" + integrity sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A== + iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -4258,6 +4358,11 @@ io-ts@1.10.4: dependencies: fp-ts "^1.0.0" +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -4307,6 +4412,18 @@ is-fullwidth-code-point@^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-fullwidth-code-point@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== + +is-fullwidth-code-point@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz#9609efced7c2f97da7b60145ef481c787c7ba704" + integrity sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA== + dependencies: + get-east-asian-width "^1.0.0" + is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -4349,6 +4466,11 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + is-text-path@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" @@ -4456,6 +4578,11 @@ json-parse-even-better-errors@^2.3.0: resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== +json-rpc-2.0@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/json-rpc-2.0/-/json-rpc-2.0-1.7.0.tgz#840deb0bc168463e12bceb462f7fe225e793fc17" + integrity sha512-asnLgC1qD5ytP+fvBP8uL0rvj+l8P6iYICbzZ8dVxCpESffVjzA7KkYkbKCIbavs7cllwH1ZUaNtJwphdeRqpg== + 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" @@ -4602,11 +4729,44 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +lilconfig@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb" + integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== +lint-staged@^15.2.7: + version "15.2.10" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.2.10.tgz#92ac222f802ba911897dcf23671da5bb80643cd2" + integrity sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg== + dependencies: + chalk "~5.3.0" + commander "~12.1.0" + debug "~4.3.6" + execa "~8.0.1" + lilconfig "~3.1.2" + listr2 "~8.2.4" + micromatch "~4.0.8" + pidtree "~0.6.0" + string-argv "~0.3.2" + yaml "~2.5.0" + +listr2@~8.2.4: + version "8.2.4" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.2.4.tgz#486b51cbdb41889108cb7e2c90eeb44519f5a77f" + integrity sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g== + dependencies: + cli-truncate "^4.0.0" + colorette "^2.0.20" + eventemitter3 "^5.0.1" + log-update "^6.1.0" + rfdc "^1.4.1" + wrap-ansi "^9.0.0" + locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -4702,6 +4862,17 @@ log-symbols@^4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" +log-update@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.1.0.tgz#1a04ff38166f94647ae1af562f4bd6a15b1b7cd4" + integrity sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w== + dependencies: + ansi-escapes "^7.0.0" + cli-cursor "^5.0.0" + slice-ansi "^7.1.0" + strip-ansi "^7.1.0" + wrap-ansi "^9.0.0" + logform@^2.6.0, logform@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/logform/-/logform-2.6.1.tgz#71403a7d8cae04b2b734147963236205db9b3df0" @@ -4721,11 +4892,6 @@ loupe@^2.3.6: dependencies: get-func-name "^2.0.1" -lru-cache@10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.1.0.tgz#2098d41c2dc56500e6c88584aa656c84de7d0484" - integrity sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag== - lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -4784,6 +4950,11 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + memory-level@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692" @@ -4820,6 +4991,11 @@ meow@^8.0.0, meow@^8.1.2: type-fest "^0.18.0" yargs-parser "^20.2.3" +merge-descriptors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" + integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -4830,12 +5006,17 @@ merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + 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.2, micromatch@^4.0.4: +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@~4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== @@ -4848,18 +5029,33 @@ mime-db@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.12, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + +mimic-function@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" + integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== + min-indent@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" @@ -4977,7 +5173,12 @@ mongodb@6.5.0: bson "^6.4.0" mongodb-connection-string-url "^3.0.0" -ms@^2.0.0, ms@^2.1.1, ms@^2.1.3: +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -5006,6 +5207,11 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" @@ -5095,6 +5301,13 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" +npm-run-path@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" + integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== + dependencies: + path-key "^4.0.0" + number-to-bn@1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" @@ -5123,6 +5336,13 @@ obliterator@^2.0.0: resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + once@1.x, once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -5144,6 +5364,20 @@ onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + +onetime@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-7.0.0.tgz#9f16c92d8c9ef5120e3acd9dd9957cceecc1ab60" + integrity sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ== + dependencies: + mimic-function "^5.0.0" + open@^7.4.2: version "7.4.2" resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" @@ -5272,6 +5506,11 @@ parse-json@^5.0.0, parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + patch-package@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-8.0.0.tgz#d191e2f1b6e06a4624a0116bcb88edd6714ede61" @@ -5313,11 +5552,21 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + path-parse@^1.0.6, path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-to-regexp@0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" + integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -5349,6 +5598,11 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +pidtree@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" + integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== + pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" @@ -5389,7 +5643,7 @@ prettier@^2.1.2, prettier@^2.3.1, prettier@^2.8.3, prettier@^2.8.7: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== -prettier@^3.0.3, prettier@^3.3.3: +prettier@^3.0.3, prettier@^3.3.2, prettier@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== @@ -5406,6 +5660,14 @@ promise@^8.0.0: dependencies: asap "~2.0.6" +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" @@ -5421,7 +5683,7 @@ punycode@^2.1.0, punycode@^2.3.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -qs@^6.4.0, qs@^6.9.4: +qs@6.13.0, qs@^6.4.0, qs@^6.9.4: version "6.13.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== @@ -5445,7 +5707,12 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -raw-body@^2.4.1: +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.2, raw-body@^2.4.1: version "2.5.2" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== @@ -5607,11 +5874,24 @@ resolve@^1.1.6, resolve@^1.10.0, resolve@^1.8.1: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +restore-cursor@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-5.1.0.tgz#0766d95699efacb14150993f55baf0953ea1ebe7" + integrity sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA== + dependencies: + onetime "^7.0.0" + signal-exit "^4.1.0" + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +rfdc@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" + integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== + rimraf@^2.2.8, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -5671,19 +5951,12 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rustbn-wasm@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/rustbn-wasm/-/rustbn-wasm-0.2.0.tgz#0407521fb55ae69eeb4968d01885d63efd1c4ff9" - integrity sha512-FThvYFNTqrEKGqXuseeg0zR7yROh/6U1617mCHF68OVqrN1tNKRN7Tdwy4WayPVsCmmK+eMxtIZX1qL6JxTkMg== - dependencies: - "@scure/base" "^1.1.1" - rustbn.js@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.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== @@ -5759,6 +6032,25 @@ semver@^7.3.4, semver@^7.3.7, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4: resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== +send@0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" + integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + serialize-javascript@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" @@ -5766,6 +6058,16 @@ serialize-javascript@^6.0.2: dependencies: randombytes "^2.1.0" +serve-static@1.16.2: + version "1.16.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" + integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== + dependencies: + encodeurl "~2.0.0" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.19.0" + 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" @@ -5840,6 +6142,11 @@ signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -5873,6 +6180,22 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== + dependencies: + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" + +slice-ansi@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.0.tgz#cd6b4655e298a8d1bdeb04250a433094b347b9a9" + integrity sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg== + dependencies: + ansi-styles "^6.2.1" + is-fullwidth-code-point "^5.0.0" + solc@0.7.3: version "0.7.3" resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" @@ -6040,6 +6363,11 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +string-argv@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" + integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== + string-format@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" @@ -6062,6 +6390,15 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string-width@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" + integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== + dependencies: + emoji-regex "^10.3.0" + get-east-asian-width "^1.0.0" + strip-ansi "^7.1.0" + string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -6090,11 +6427,23 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-ansi@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + strip-hex-prefix@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" @@ -6424,6 +6773,14 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + typechain@^8.1.1: version "8.3.2" resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.3.2.tgz#1090dd8d9c57b6ef2aed3640a516bdbf01b00d73" @@ -6507,7 +6864,7 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== -unpipe@1.0.0: +unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== @@ -6536,6 +6893,11 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" @@ -6554,6 +6916,11 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + viem@2.20.0: version "2.20.0" resolved "https://registry.yarnpkg.com/viem/-/viem-2.20.0.tgz#abff4c2cf733bcc20978e662ea17db117a2881ef" @@ -6583,7 +6950,7 @@ viem@^1.16.5: isows "1.0.3" ws "8.13.0" -viem@^2.9.28: +viem@^2.17.5, viem@^2.9.28: version "2.21.14" resolved "https://registry.yarnpkg.com/viem/-/viem-2.21.14.tgz#2ce78d52d43dd97103102fcb0852b973a911f478" integrity sha512-uM6XmY9Q/kJRVSopJAGsakmtNDpk/EswqXUzwOp9DzhGuwgpWtw2MgwpfFdIyqBDFIw+TTypCIUTcwJSgEYSzA== @@ -6669,7 +7036,7 @@ winston-transport@^4.7.0: readable-stream "^3.6.2" triple-beam "^1.3.0" -winston@^3.11.0: +winston@^3.11.0, winston@^3.13.1: version "3.14.2" resolved "https://registry.yarnpkg.com/winston/-/winston-3.14.2.tgz#94ce5fd26d374f563c969d12f0cd9c641065adab" integrity sha512-CO8cdpBB2yqzEf8v895L+GNKYJiEq8eKlHU38af3snQBQ+sdAIUepjMSguOIJC7ICbzm0ZI+Af2If4vIJrtmOg== @@ -6718,6 +7085,15 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.0.tgz#1a3dc8b70d85eeb8398ddfb1e4a02cd186e58b3e" + integrity sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== + dependencies: + ansi-styles "^6.2.1" + string-width "^7.0.0" + strip-ansi "^7.1.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -6763,7 +7139,7 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^2.2.2: +yaml@^2.2.2, yaml@~2.5.0: version "2.5.1" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.1.tgz#c9772aacf62cb7494a95b0c4f1fb065b563db130" integrity sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q== From 71d4a2dc7e5d956ca7865cbba6f503d2d36d5ced Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 25 Sep 2024 07:01:37 +0200 Subject: [PATCH 282/297] fix(reporter): fixes Coordinator imports --- packages/reporter/src/Coordinator.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/reporter/src/Coordinator.ts b/packages/reporter/src/Coordinator.ts index 4a5be932..5f4e48dc 100644 --- a/packages/reporter/src/Coordinator.ts +++ b/packages/reporter/src/Coordinator.ts @@ -2,8 +2,8 @@ import { Chain } from "viem" import winston from "winston" import { Mutex } from "async-mutex" -import Multiclient from "./MultiClient.js" -import BaseController from "./controllers/BaseController.js" +import Multiclient from "./MultiClient" +import BaseController from "./controllers/BaseController" interface BlockListenerConfigs { controllers: any[] From 6e13d42e1a1bf9784dd5b190a1f27ebf97b241ed Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 25 Sep 2024 17:27:01 +0200 Subject: [PATCH 283/297] feat(evm): adds HashiProver --- .../evm/contracts/interfaces/IHashiProver.sol | 28 ++ .../libraries/MerklePatriciaProofVerifier.sol | 248 ++++++++++++++++++ packages/evm/contracts/prover/HashiProver.sol | 92 +++++++ .../evm/contracts/test/HashiProverTest.sol | 15 ++ packages/evm/test/05_HashiProver.spec.ts | 95 +++++++ 5 files changed, 478 insertions(+) create mode 100644 packages/evm/contracts/interfaces/IHashiProver.sol create mode 100644 packages/evm/contracts/libraries/MerklePatriciaProofVerifier.sol create mode 100644 packages/evm/contracts/prover/HashiProver.sol create mode 100644 packages/evm/contracts/test/HashiProverTest.sol create mode 100644 packages/evm/test/05_HashiProver.spec.ts diff --git a/packages/evm/contracts/interfaces/IHashiProver.sol b/packages/evm/contracts/interfaces/IHashiProver.sol new file mode 100644 index 00000000..836f43a6 --- /dev/null +++ b/packages/evm/contracts/interfaces/IHashiProver.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity ^0.8.0; + +/** + * @title IHashiProver + */ +interface IHashiProver { + struct AccountProof { + address account; + bytes proof; + bytes blockHeader; + uint256 chainId; + } + + struct StorageProof { + bytes32 storageHash; + bytes32[] storageKeys; + bytes[] proofs; + bytes blockHeader; + uint256 chainId; + } + + error InvalidAccount(); + error InvalidBlockHeader(); + error InvalidChainId(); + error InvalidStorageHash(); + error InvalidStorageProofParams(); +} diff --git a/packages/evm/contracts/libraries/MerklePatriciaProofVerifier.sol b/packages/evm/contracts/libraries/MerklePatriciaProofVerifier.sol new file mode 100644 index 00000000..29641241 --- /dev/null +++ b/packages/evm/contracts/libraries/MerklePatriciaProofVerifier.sol @@ -0,0 +1,248 @@ +pragma solidity ^0.8.20; +/* solhint-disable */ + +import { RLPReader } from "solidity-rlp/contracts/RLPReader.sol"; + +// Copied from here: https://github.com/defi-wonderland/safe-liveness/blob/dev/solidity/libraries/MerklePatriciaProofVerifier.sol +library MerklePatriciaProofVerifier { + using RLPReader for RLPReader.RLPItem; + using RLPReader for bytes; + + /// @dev Validates a Merkle-Patricia-Trie proof. + /// If the proof proves the inclusion of some key-value pair in the + /// trie, the value is returned. Otherwise, i.e. if the proof proves + /// the exclusion of a key from the trie, an empty byte array is + /// returned. + /// @param rootHash is the Keccak-256 hash of the root node of the MPT. + /// @param path is the key of the node whose inclusion/exclusion we are + /// proving. + /// @param stack is the stack of MPT nodes (starting with the root) that + /// need to be traversed during verification. + /// @return value whose inclusion is proved or an empty byte array for + /// a proof of exclusion + function extractProofValue( + bytes32 rootHash, + bytes memory path, + RLPReader.RLPItem[] memory stack + ) internal pure returns (bytes memory value) { + bytes memory mptKey = _decodeNibbles(path, 0); + uint256 mptKeyOffset = 0; + + bytes32 nodeHashHash; + RLPReader.RLPItem[] memory node; + + RLPReader.RLPItem memory rlpValue; + + if (stack.length == 0) { + // Root hash of empty Merkle-Patricia-Trie + require(rootHash == 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421); + return new bytes(0); + } + + // Traverse stack of nodes starting at root. + for (uint256 i = 0; i < stack.length; i++) { + // We use the fact that an rlp encoded list consists of some + // encoding of its length plus the concatenation of its + // *rlp-encoded* items. + + // The root node is hashed with Keccak-256 ... + if (i == 0 && rootHash != stack[i].rlpBytesKeccak256()) { + revert(); + } + // ... whereas all other nodes are hashed with the MPT + // hash function. + if (i != 0 && nodeHashHash != _mptHashHash(stack[i])) { + revert(); + } + // We verified that stack[i] has the correct hash, so we + // may safely decode it. + node = stack[i].toList(); + + if (node.length == 2) { + // Extension or Leaf node + + bool isLeaf; + bytes memory nodeKey; + (isLeaf, nodeKey) = _merklePatriciaCompactDecode(node[0].toBytes()); + + uint256 prefixLength = _sharedPrefixLength(mptKeyOffset, mptKey, nodeKey); + mptKeyOffset += prefixLength; + + if (prefixLength < nodeKey.length) { + // Proof claims divergent extension or leaf. (Only + // relevant for proofs of exclusion.) + // An Extension/Leaf node is divergent iff it 'skips' over + // the point at which a Branch node should have been had the + // excluded key been included in the trie. + // Example: Imagine a proof of exclusion for path [1, 4], + // where the current node is a Leaf node with + // path [1, 3, 3, 7]. For [1, 4] to be included, there + // should have been a Branch node at [1] with a child + // at 3 and a child at 4. + + // Sanity check + if (i < stack.length - 1) { + // divergent node must come last in proof + revert(); + } + + return new bytes(0); + } + + if (isLeaf) { + // Sanity check + if (i < stack.length - 1) { + // leaf node must come last in proof + revert(); + } + + if (mptKeyOffset < mptKey.length) { + return new bytes(0); + } + + rlpValue = node[1]; + return rlpValue.toBytes(); + } else { + // extension + // Sanity check + if (i == stack.length - 1) { + // shouldn't be at last level + revert(); + } + + if (!node[1].isList()) { + // rlp(child) was at least 32 bytes. node[1] contains + // Keccak256(rlp(child)). + nodeHashHash = node[1].payloadKeccak256(); + } else { + // rlp(child) was less than 32 bytes. node[1] contains + // rlp(child). + nodeHashHash = node[1].rlpBytesKeccak256(); + } + } + } else if (node.length == 17) { + // Branch node + + if (mptKeyOffset != mptKey.length) { + // we haven't consumed the entire path, so we need to look at a child + uint8 nibble = uint8(mptKey[mptKeyOffset]); + mptKeyOffset += 1; + if (nibble >= 16) { + // each element of the path has to be a nibble + revert(); + } + + if (_isEmptyBytesequence(node[nibble])) { + // Sanity + if (i != stack.length - 1) { + // leaf node should be at last level + revert(); + } + + return new bytes(0); + } else if (!node[nibble].isList()) { + nodeHashHash = node[nibble].payloadKeccak256(); + } else { + nodeHashHash = node[nibble].rlpBytesKeccak256(); + } + } else { + // we have consumed the entire mptKey, so we need to look at what's contained in this node. + + // Sanity + if (i != stack.length - 1) { + // should be at last level + revert(); + } + + return node[16].toBytes(); + } + } + } + } + + /// @dev Computes the hash of the Merkle-Patricia-Trie hash of the RLP item. + /// Merkle-Patricia-Tries use a weird 'hash function' that outputs + /// *variable-length* hashes: If the item is shorter than 32 bytes, + /// the MPT hash is the item. Otherwise, the MPT hash is the + /// Keccak-256 hash of the item. + /// The easiest way to compare variable-length byte sequences is + /// to compare their Keccak-256 hashes. + /// @param item The RLP item to be hashed. + /// @return Keccak-256(MPT-hash(item)) + function _mptHashHash(RLPReader.RLPItem memory item) private pure returns (bytes32) { + if (item.len < 32) { + return item.rlpBytesKeccak256(); + } else { + return keccak256(abi.encodePacked(item.rlpBytesKeccak256())); + } + } + + function _isEmptyBytesequence(RLPReader.RLPItem memory item) private pure returns (bool) { + if (item.len != 1) { + return false; + } + uint8 b; + uint256 memPtr = item.memPtr; + assembly { + b := byte(0, mload(memPtr)) + } + return b == 0x80; /* empty byte string */ + } + + function _merklePatriciaCompactDecode( + bytes memory compact + ) private pure returns (bool isLeaf, bytes memory nibbles) { + require(compact.length > 0); + uint256 first_nibble = (uint8(compact[0]) >> 4) & 0xF; + uint256 skipNibbles; + if (first_nibble == 0) { + skipNibbles = 2; + isLeaf = false; + } else if (first_nibble == 1) { + skipNibbles = 1; + isLeaf = false; + } else if (first_nibble == 2) { + skipNibbles = 2; + isLeaf = true; + } else if (first_nibble == 3) { + skipNibbles = 1; + isLeaf = true; + } else { + // Not supposed to happen! + revert(); + } + return (isLeaf, _decodeNibbles(compact, skipNibbles)); + } + + function _decodeNibbles(bytes memory compact, uint256 skipNibbles) private pure returns (bytes memory nibbles) { + require(compact.length > 0); + + uint256 length = compact.length * 2; + require(skipNibbles <= length); + length -= skipNibbles; + + nibbles = new bytes(length); + uint256 nibblesLength = 0; + + for (uint256 i = skipNibbles; i < skipNibbles + length; i += 1) { + if (i % 2 == 0) { + nibbles[nibblesLength] = bytes1((uint8(compact[i / 2]) >> 4) & 0xF); + } else { + nibbles[nibblesLength] = bytes1((uint8(compact[i / 2]) >> 0) & 0xF); + } + nibblesLength += 1; + } + + assert(nibblesLength == nibbles.length); + } + + function _sharedPrefixLength(uint256 xsOffset, bytes memory xs, bytes memory ys) private pure returns (uint256) { + uint256 i; + for (i = 0; i + xsOffset < xs.length && i < ys.length; i++) { + if (xs[i + xsOffset] != ys[i]) { + return i; + } + } + return i; + } +} diff --git a/packages/evm/contracts/prover/HashiProver.sol b/packages/evm/contracts/prover/HashiProver.sol new file mode 100644 index 00000000..3b104eaf --- /dev/null +++ b/packages/evm/contracts/prover/HashiProver.sol @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity ^0.8.20; + +import { RLPReader } from "solidity-rlp/contracts/RLPReader.sol"; +import { MerklePatriciaProofVerifier } from "../libraries/MerklePatriciaProofVerifier.sol"; +import { IHashiProver } from "../interfaces/IHashiProver.sol"; +import { IShoyuBashi } from "../interfaces/IShoyuBashi.sol"; + +contract HashiProver is IHashiProver { + using RLPReader for RLPReader.RLPItem; + using RLPReader for bytes; + + address public immutable SHOYU_BASHI; + + constructor(address shoyuBashi) { + SHOYU_BASHI = shoyuBashi; + } + + function _verifyAccountAndStorageProof( + AccountProof calldata accountProof, + StorageProof calldata storageProof + ) internal view returns (bytes[] memory) { + bytes32 blockHeaderHash = keccak256(accountProof.blockHeader); + if (blockHeaderHash != keccak256(storageProof.blockHeader)) revert InvalidBlockHeader(); + if (accountProof.chainId != storageProof.chainId) revert InvalidChainId(); + RLPReader.RLPItem[] memory blockHeaderFields = accountProof.blockHeader.toRlpItem().toList(); + _checkBlockHeaderAgainstHashi(accountProof.chainId, blockHeaderFields[8].toUint(), blockHeaderHash); + bytes32 stateRoot = bytes32(blockHeaderFields[3].toUint()); + (, , bytes32 expectedStorageHash, ) = _verifyAccountProof(accountProof.account, stateRoot, accountProof.proof); + if (storageProof.storageHash != expectedStorageHash) revert InvalidStorageHash(); + return _verifyStorageProofs(storageProof.storageHash, storageProof.storageKeys, storageProof.proofs); + } + + function _verifyStorageProofs(StorageProof calldata storageProof) external view returns (bytes[] memory) { + RLPReader.RLPItem[] memory blockHeaderFields = storageProof.blockHeader.toRlpItem().toList(); + _checkBlockHeaderAgainstHashi( + storageProof.chainId, + blockHeaderFields[8].toUint(), + keccak256(storageProof.blockHeader) + ); + return _verifyStorageProofs(storageProof.storageHash, storageProof.storageKeys, storageProof.proofs); + } + + function _checkBlockHeaderAgainstHashi(uint256 chainId, uint256 blockNumber, bytes32 blockHeaderHash) private view { + bytes32 expectedBlockHeaderHash = IShoyuBashi(SHOYU_BASHI).getThresholdHash(chainId, blockNumber); + if (expectedBlockHeaderHash != blockHeaderHash) revert InvalidBlockHeader(); + } + + function _verifyAccountProof( + address account, + bytes32 stateRoot, + bytes memory proof + ) private pure returns (uint256, uint256, bytes32, bytes32) { + bytes memory accountRlp = MerklePatriciaProofVerifier.extractProofValue( + stateRoot, + abi.encodePacked(keccak256(abi.encodePacked(account))), + proof.toRlpItem().toList() + ); + bytes32 accountStorageRoot = bytes32(accountRlp.toRlpItem().toList()[2].toUint()); + if (accountStorageRoot.length == 0) revert InvalidStorageHash(); + RLPReader.RLPItem[] memory accountFields = accountRlp.toRlpItem().toList(); + if (accountFields.length != 4) revert InvalidAccount(); + // [nonce, balance, storageHash, codeHash] + return ( + accountFields[0].toUint(), + accountFields[1].toUint(), + bytes32(accountFields[2].toUint()), + bytes32(accountFields[3].toUint()) + ); + } + + function _verifyStorageProofs( + bytes32 storageHash, + bytes32[] memory storageKeys, + bytes[] memory proofs + ) private pure returns (bytes[] memory) { + bytes[] memory results = new bytes[](proofs.length); + if (storageKeys.length == 0 || proofs.length == 0 || storageKeys.length != proofs.length) + revert InvalidStorageProofParams(); + for (uint256 i = 0; i < proofs.length; ) { + results[i] = MerklePatriciaProofVerifier.extractProofValue( + storageHash, + abi.encodePacked(keccak256(abi.encode(storageKeys[i]))), + proofs[i].toRlpItem().toList() + ); + unchecked { + ++i; + } + } + return results; + } +} diff --git a/packages/evm/contracts/test/HashiProverTest.sol b/packages/evm/contracts/test/HashiProverTest.sol new file mode 100644 index 00000000..111830ba --- /dev/null +++ b/packages/evm/contracts/test/HashiProverTest.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity ^0.8.20; + +import { HashiProver } from "../prover/HashiProver.sol"; + +contract HashiProverTest is HashiProver { + constructor(address shoyuBashi) HashiProver(shoyuBashi) {} + + function getValue( + HashiProver.AccountProof calldata accountProof, + HashiProver.StorageProof calldata storageProof + ) external view returns (bytes[] memory) { + return _verifyAccountAndStorageProof(accountProof, storageProof); + } +} diff --git a/packages/evm/test/05_HashiProver.spec.ts b/packages/evm/test/05_HashiProver.spec.ts new file mode 100644 index 00000000..63928f4c --- /dev/null +++ b/packages/evm/test/05_HashiProver.spec.ts @@ -0,0 +1,95 @@ +import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/dist/src/signer-with-address" +import { expect } from "chai" +import { Contract } from "ethers" +import { ethers } from "hardhat" + +const SOURCE_CHAIN_ID = 1 +const BLOCK_NUMBER = 20793508 +const BLOCK_HEADER_HASH = "0xafd0481857f5745a4511c51695d753c56380f8a7406ae63dad368e4abdb3ec47" +const VALUE = "0x875e336081790c4c" + +const ACCOUNT_PROOF = [ + "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", + "0xf90ec7f90211a0c7f9548de2413b06c51826457d18686177d6b50cfe9c57052d5e2745ea67405fa037c538f94ae962a12ec446e99913c4a2f84f1262b6187b33e7223842c32cb2eba027252f104dbb368c148808bc165f19872ffee7923996f4b16c0638e3614dd7e7a054e4c38140beb9e6797a2fb319d8547cfa66fa1e2cb6d82127680268385aa672a07338ba4f0182c36261d92001142d58972ef60fa78bf7c619142dbc6ff600200da0a448274d9713da8237b955d1a18c1ada8ea94cfa94a6b4db2342d1842055b189a05e120865c2d8ec5f247e9d8910d7de99db8ff0241edba8740e80e36792aba2c5a012e7432e7545f98874ead265b48ac00d8e2110423be874204e27a29c7be49be6a020ea554b06c3263db4494a8b3dfe7a0bfb4c08033e67a60bd9f6cbc34d251376a0b096aac4ebdbe28c685f7394c6688e95a96e95fa367fb1fbe5f51996bcecaca7a062efd61342b2456537cbf539f25d524237be19d927a2023eed05a8cdd87eb68da09eb19a5e1d1b22618a8fef9049b62fbff55cc92e6b84a56b0d826ba751b4a291a0c1257750d37ae856d9f36832ba3133c3da159f8c96633036852bcc1d67917363a0730e6746c74c0aaa9818e2346205303e1580773e8794dbe60db756cc69d5ccb2a01aea932f111a3426ea32cdcaebb968e9faeb811b27d2d6ccbeb8f13cf3937f8ba04ad0f5122c1797f92f85cb474e4c6fc318e00ebfbf1ed705e224fe8c48c211b080f90211a07168607c5590b0a93f3b5ad40cec52042f51918229dd8e19595058cd069762a8a0d4e8dd9feab21cb31fa0a557f5e131c643bdef986d7ad5d02fe45ce7f5889792a0e364b5776f8a3624fb0000293093cd8321b120820153e97f36890395179ac4d6a0376ac4f7253988b233faaff0919df0045258800c38d2e83fbacc1eaec45e336aa0dcc6c7173e056fa08fd1967a9dfaded1d3133dd96b876f9afa901fa45e07bfd9a01fb35c15a038bbda6afd540cf3396a9c6ebca35479ecd794e38ca57aa962b6aba0d41ffbd124db9534c357ad8908d3b324170395c381980608ac053c5fd72c4130a0ebfacd5239d919283d3082ba24d8a7e601d2ef005530a26cd533243ba1cd100aa0e5d57e7ab231d26840392f500d6feff0ecd423de4f7692277ba89ccb83b8c5fca086466a5523829c87d540bb08bd632fb8eb3d7549884e00c84eb6e8ff0d5965b0a06b196898c2874c5756ba4e388acc41a86b6dc5f5114f96341ddbdde7a1c7a784a061a300fe3f07508c39b9f23c503f89e77c389be2389305da52cddc87aceab4aca055fc141795501ea6ede95f7e8383776f88474af4183092abce713f30ffdf5058a00e8a492f76c475f258d612894073af63b762dfb0ce19f58cee9ab5dbcd729da0a06572d551070866c6eb9fd99320fc27017a4d5a10989e00191de260cc59b6ea86a0ab842580f5891239a9add6f0cb6e8aaf1c7081b08f29752c8ef56c8c218cf00c80f90211a069055abb2693d9d442e7c992b263238fb8fb2c8cec4af8ca2a3201838f89b7a7a04fd2945e89d5dc6a0f43e0930cdbf5d70abf9c90127a8839b8b07240d912a4d0a0f842f3370180cc30bb6521c12fd42ae2d88bee77e73254a6f239f88469c09c55a05537d33d7d06cc4580f3e7e9d7654ef044da71ace71bdf5baf29966561e45befa066cbbd1fc101198ea2e2690dc8d980c72d33a2f6b820d387adb398a116025c18a0697c9530067e3351e87a7c6e6fbbc2a282febe0b63d229b0f4e292d66a1e4c6fa0f72324a07205eae63e114985fa445800a8285e75a53c3adca0466793eead1840a099cd34991d25321a827556e34d2cd347b589037f2b1bc677f940011b7a1c13d7a07863da67c7f99c4243a57456d4a05ddc066c6c8d8fcb25c8c08f01a10533e570a01197d8ef083352a2d90d88551891b3deab62bc20685978b4d99d5fa14cbfa052a07f34645f90cbf7298dc60c7048e1d352e70dd1dae6f787598b6d1080f49971e8a03272e0642f91eb4501840dcc7e9c436ed63344b11f7f049048bcb1a3a7df2ca8a08a76ffa84b3e9272cb6428d49454038859d457bb204f624599ab579dcfef12dea0e7a55031502f08d2734db4ef7390bf17f44e2b3478d70e9bef809c206f293bdfa0abdfb9de732a5cebbd5c92a5001e65db3dda1ce7253435ba5c5708680e2e7726a0b561a68db428a042a35d754a7a1a9f6ebe8836081f992d3d2de19ccec0a55e4980f90211a0bf2ec407e3de692c31ef7df972caa2a21282902d3c2c7869a0bd44868ccd6af4a0e5e4bacd58a1a934a147638918e4451d160e9ec99647ea7f8852c02e073075c2a0e694ba7072b174c6a6752c02d1ec11d7cd988412bd6c37f07d295fbb7f14756fa0d6c7c0fa4c81d699e045c2a22ba0eb61179e4496804d6c0e592b5047b2993191a0798fddb883c25774fc6d1f51b652b8ea81dd03588410b571767727762c1e4c5aa07a7db1965aa0ad10434a95220de03416e2ddd00d654b33d3dc2ed2f7b8f48d22a0be7ed44c61160c17a7b5a3ca5495bf614f6f640c75b095aa6960c872e233e158a09df22d1f287814d3cb828ecea1120d6a9055254e8164d2cfd8b98c5ae0980ba3a0a674bd1b8aaeccc467b331edcb9af81dd09131866e71d055619e57dad9b6a03ea08faed450b4c2371166de0eb1d7db6d5f1af19bd5fd4e7a0b12681026e7a1cdcba0b11e6cc0bc06f9e2dfebb7fafd410a461394ee3f50ec911c7049a390c9c27845a0d2fde948974177cfbfb25d3009d6cbddb9b4f6892df707546f2c00ba03435ecba04be0d058b041af7ce8807b0ca411360cdee3eb6f0059c906ba5600e8f0587309a0b62c7263e747cbed29cc1658606baddcfff8d9aaaf8e25a0d82bed3850e567c3a087b63a803df5cac69d9c9faf447a1289d8c1cb273faf55337d04dfb4111681e9a0ec352f8139edb0fe592c12d452b32defa9570e2f370f74a5feae7924d5785ce580f90211a0cd95d3ae92f92c6839f0f7435ee60791da5027497cec01dc1f4a199b131a608ea0fc91ae6a7c9106cfc39b0efc92870e9f4c98bb7a20ad21ea3d853f4a831efdbca03e3383dfc994780e7393654e27daf30f26f5f2e86c572360bead1a07b32d22c0a0cd6460eb11a1728f4b0ac2caea14b83a6ca0f54995d7f41a8852d1d234ba57f2a0c7edf11df5fcbc8d6bef9c4d63d71c81a02b7893c57a49c432b9177409509c75a0534bc98a6e093069585cf811762741c8594a6b42828f5ad825929ecd8bfc20e4a0d634fe101ab5770dcb54a80a2b794299b300e1adf9343d1ef26c6cdffbb7f21ca0fd2c5d9a536d366c2fcd145073b3b75672699b1ea55c70fb5075f89e427b6b4aa0b82cb047822a3f3283cbe8eb6ac88d8c71b5beaf47c8c6a3e8ae50780f6dfa8aa0e8c97b53fd657b5511173624dde4f31e239c49df5a98a57e1295029f486c94a2a09cfbcdb21e2d410f156bb467897bf73964a01e6dd5539e6330634b794de649e1a0c6e20f19fdf97cba0c8a21d57b1d33e1c283f4ad93f92fb7d67cace9bd434f90a051691b3625c0367b73aebeb6f94c3b5542bbe0f72aca52277ad31a7af8546ac5a05e104969fb1ccd2b7df5bc5f77af07c4ebfc424f506ce8dd0e164c3880e3ea2ca0034154f8f674659f19216e21203706a8314edcf9700f49249aa0894e502a3bada057616f55e2e620afe5ff22f313d5b6e34cedf4a64fc6163b3e3008bae24d35a080f90211a05c2ede3805ac777d64c232fb113ab67116c8a1f252a5bc401cf9f283e9f7a6c4a07acd632dc59a4bed389f18274a1bed7167eac5777e1a3ed16224130958872632a05eb84506a1607d7521f30a366c1891a54e0e84c22a7c48535c63f74d08fc237fa05c38dd95917629395109aff3e91a0d52a13ad9ac93215a635982dfe51a1169fca04e776df61609acc8780d262ec19ae6b63ae21509f9b913d388bd1b5f1a352ae8a05ce8d36e3e8f3fd39e83e1db3b6369120e3692ad8cfc8e622350c432150d98d1a09fd76ff18b2f067852e1601c76112b4e06755d64c48cdeea021d6efefc8cc5eaa0dac65fc9721f10396a9488adc58e5722527bfba2af0c358a985132fca8faadc3a0c35faa1e275ed56ebecc0b51a8f89e115a7320a3c9823fa9a85e7d7afbb5a6eaa0932f7e0b119160a118e3eb7ed691cac7163ff775eb6e5e163a27904a14b75ecba0c41c5e70289ab77172db9e42bf65ca3a2cca2251f22f5717886a51e5d543ea9ea05d8ef1b1d38448fdbc8a6db86647ac38a4b580950bb7bc33902d82555a8f5dcba004a3dc79b1077e6e8be9bca62507b9004ed350a1095b345222f97095cd804bc4a0f53a5c5a890da2d8fa58c0eeee5e5c8dde92a1472441a514c32f03f5b6487315a03e7cff35eb4e28eeae7b163572950b781920079ccf40206ae4387906bf6327c8a05a1ba0533fe12a4dfc22ecbb2d309d113ed8959a1968b730372a99cd07272ddc80f90171a07d337e717ecd4ce5f45c4ea8994e476ce38cf937a4f2924dc40cfa8fe5870fe9a03f98e9ce6af172ec08481a6bcffb89a264933f90ee288a82144c0eab968e42ffa0eb65ea007c07bc1604264fecd433291c165a1211a8bf8bf6492cc1194fa549408080a04a57ac1163277a820bdae649d632f917b3885a80103654d3216f9409b72525d3a0031868dec233f986dc0afa16d6abf78e22396b0fa4a757f0688380756a844be2a0d3bee690d48173444d679a7ab969cd9199b83ac3de64db3d987dc6aa2ddb06e780a0ccb10237fbb545478774d6e858eb7a1327708de6c205c7195d3a5dacd5961209a0903e3cd41d04b4693e0eae1549f7fe024eb06b98fa1c137cacc66d57a7a0e223a023f24686514302e9b0707775885ba13549bad5e8c8a5464c3d8efd4b8e953d5ea0c329d67971ead7da9f1d222990d9aa6c0f448bd161c0981ef504b1d7292b666180a015234d9ef39b97af083fb5715dd5cc2f4454a23ca3a4d72419cfde3ea918036c8080f87180a0568a3548f0c468bec66c6d91b1d72f84e44373c03c6e118d7edc6ba8fe9b4d0c80808080808080a0ec26e129a6fc11a5dcc748bd22ca4e41a0ace63cbf1cb2de018e2b9585a06fc680a043ce799f2836610d1ae648b51b90bdabc437dd7ca340c1ee8c3e2d71eab6ea268080808080f8669d2092cd7f3f78137497df02f6ccb9badda93d9782e0f230c807ba728be0b846f8440180a09d5704aa434de9751d3bfcf9e720a8eb0464ed2b467bd27af86c0415ac15fa14a0d80d4b7c890cb9d6a4893e6b52bc34b56b25335cb13716e0d1d31383e6b41505", + "0xf90256a06f14ee388c6004c9f591c05cc94509906ebcc57e6ce9d7e65c52aa7da6f530e7a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479495222290dd7278aa3ddd389cc1e1d165cc4bafe5a07604903f485d83bda3b1333e28dec61ff3191fef0423ffce44abe02033b323d3a09c6967c2262b8e5aaf07f422806fa22eed9bd05898a71ef3435eb27e258ed240a061cf3a1b00a7ea8e1b8e4a921dbd9af3c73e9ec8646e9884b7936b74e011e05ab901005d61447fd94d1ba8d69022f0b7891c8486f9ae204a03b3b61bbbc905e371ecd613dfbe02ad85113252082314a8e78d016af918d9afd27030b5b7e890842a2f8058103e8c1640a87cd82c733d21e13afc3ce5e133ddd7fd3180a816dc8bfeeaa516555f3bf2545536b6605c1ea8276edf7d076e9346d88e37e24372bec69daa45caa8fe68c4c5edccefefbf60abaa9abee6106cf1dd25dc4fff490c7bf4b1f47993d733a25880a8170f165ed3bb283d69644fb677d0fd763a07218f66249961719ff37e762cf33f76036277f9c2d9e3d5a2a0b6b70cbfbd548a717143e29e3ef4a0f9b17f9f37bc546d06e5d23e02b3c64e2e542f026cf1d4391ccdf19400dc6d8084013d48a48401c9c3808401476c588466edbad78f6265617665726275696c642e6f7267a00b4078ca7a27f9b2448fa3f32e04a269353f80273e6dc95153458475a84238b98800000000000000008502d39a9e8ea00a7c969c5cab15361767d22966b8c0e507572acd096d3bc87af306be3ceb52138080a077f861b303ce5dd4bd241707d60a82406df608caa18ec241e33b5d5a2de94bc2", + 1, +] +const STORAGE_PROOF = [ + "0x9d5704aa434de9751d3bfcf9e720a8eb0464ed2b467bd27af86c0415ac15fa14", + ["0x000000000000000000000000000000000000000000000000000000000000000b"], + [ + "0xf90bd2f90211a0c03ad780fdcff9d8db9c11fb9d1e7e4b7e72ef1e7eb869620b9f8ad84fc2fcbca0affcd853d02392931c090bac4e6daf5d7803bc755efb6f4428844504e56a0824a045b77e35264af8103e562dcf7064f204cc7d97ab329e99afce4734dcd38ebe87a06345cc57a046fe6fde4a96f9b7df705ac96f8945b2bd5fadcb617f87ab56df45a03f0d7ab38aa688d896e5380f34fc7476484c04fcef6dce8fe2fd19f022bd25a1a0f1099114fbade96971fc26d2b7a2822a55ec504b69befda54d658f99afe1e58ca093c6cb05b60356a08b2ceaea7535aa0dbe0c7caf772f9a3220c9e5f17c7592b2a0c6204dc22d4f391abd77861423f3d6cd97f9fb7c2462508c1125527b50e6ca43a0a79c861c69ea5078802d04cbe0b930db2d4bdeb979ab67729c53cf9ab4aa59d3a0784e0c317729503c1212a4fd4db192bc80efe07ffc88ded9bcfc86ac2087b103a019130bf59eede0e5aafd47c1c71fc61fe989f61b4fb948d0c85db13fd6d8dfa8a0245cb0c02898fd4305783b3e4fb036ee39ab471edf5ee8108e971cedb6e2d2a5a0693c76ef03bd97763cffd1bdefb70739c94dac6480502629c83697ead422d5f6a0333cd43acdce2a4b07662fda6fd7c8c3762a0a862df5e6ddda4bace3977c55d2a051abc316d294b1d3d741fdc30ff307fc2cbcab494e74b0c87263ffecd15e5f8da04c586b6f986d28a9553494ecae5cfd6caee098a27c79d273cbdfe7b90bca613a80f90211a09543463b5652bf35a17b7a000ecdef6a09d92c0b6a294ef292706322a643ac87a087c898c7a105f122e4c2b387cabc1b62e79e673e8360872ff8154e27e2a97030a0d8cd06b11d80236ab5377ba55d89efda25a193ca125cb4a3865dd3a853477f1ca0255ccaa30d3fff8ad7d6f958fa965264f8e018d956777ba51538d0e4c1b0d0c8a0816b5b6951cfa8b2d2bfb5b477c633431fa48f3e1712f458f8644ca3b6eef807a0dae819a79bef60b8f4426e82413b2ef4c7ab5ba30ef2e66c9bc2a8bd96de660aa0457e691dbcdeedb4e8d04b48af40029f8d7ad6d99c47696234bc21921c44f47ea00dc6631d7c767e55f3581285a12a7d1bf4aafcd95a471801c885a380b11f20b3a04d949d428a282b3a1a2b6a14e356a1eda9a768d6a50eab1f49f74426a27d3063a0ae7d76fbf7178842db7758faf0360923cd0192cd6db31dc4fd71020478496605a0659e1bd5e68ac0cb78094135200440a255ea1cf5c77575eefb38d9582e03f7e6a0bb66ef993a8e694c33d65aaa7c7920c0fea2569d48392775ce6824fc5db2ffc1a00da42a0f939cc889db93be6467b5687ea1b0e185b612fe11c8b1e0f11bbbbfc7a0c8e46c9aad59802b44569997e7deace74923242b1d0f35871ebc71f7b800d53fa02d22f23e78308978f03da3fc1d30936772d871f03ae8b89e03ee0a5ec1bd9afba0feb114b06e556ac52b7494821e3ed4af5fceed2d0e98b3629abb77b0b7d5352f80f90211a09f1c2b89b4d5b29b3a5e7e4613897363f56a7706c0c48e595129326231357264a06043940ace31b3b2d2f36f526abaeed64cf196f60f752a950a603924bb1be8d1a0a7fea554f16521774b2658a882d9ce0eca1567e34a2ed6bb6a1b8861b984d1fea0f3683ecac011ff970866f63fdbad0b563301300e7f58a00e41cef674aa896d14a06440b5f591a4cb03ea6bbb4cca6b327f8b1e5684983cc171992b43a0e7d7f65aa084570b151819d27b0a0bb8b0f2231ed3a75f082a7da2fbb121b9bf83257265d8a007f572f57dc18a840b9ae7cc983d0d27c1332634711808b57e6bb6af9ef4df38a0c2dd894af0e1c66e6f1337afbb951fc7af4a954e0951e5cabd485f1c22919992a0e214cd8efa8cda96f46b320edba3c8a02a9695ca635f14cbd56c9941c39db758a06fb5032e8727fb0cfb51e6a21c2acb2ad7f25e452001ffa495ce5cd284391531a051950f31467943085f0dbef1856469a16c86174be86b17223a2f66c3a956c897a012189d14af2ef21047ceb340372c71a9a9f2842c25621b292d1458bd876b61a5a013c85fa14ffee57ef1a31e99586ae65d31d65a033c3190cda0734e5389fe9f75a04d8c8815af221c1e6c9cfcd4f736e78266277e324fee0ab92923edd59b55b9dea069819278c8af35925eeb650c2245b03e7ce93cfd595c6f9dbc98a373f0d0918fa0761df9767bb3079f512bbf47390aab6f8ddfaf81d6f8ea6ef986d6b902e5d31580f90211a02a6e912cd7f8e31035d3fe8c65a5d3287288d3888ce9657c250bb70a9f258104a0676c3257a7c90a1c32ca4976f151bc538cc16199598c3640555eddc1b9a1c2d0a0cea107052cadf545b10283abf0e1a1ef92a8e8c56a8bf2764db3adbee2230623a07c0f9c98c9b84dfb73496a3cf6c34e1133733081cf0a0e64688d102384f721b3a03492e8538a07a6d7dd2963848db053b1c9654c41e21970d6172f6148fca2cbdfa0d83c4627c93c8b8086c3cd2f7fb09536f4ec239adb2b8ae47e428565c15df5afa0265456add4ff87a819f9d5e923371a9658b74e182d8cfb4769e4e8ff9a7cfdd6a091836c477ef0ce3b69e2e0fa6737e34b4a9092760194a3942aaa6d9a1426cfcfa0367e3c9c841827130d8a22731a6cf15958419a9a837dec1ff9a5395eee9ca99aa0db5f0ddada06d9b484e627e8c31a0444e6a64cfa854a0f783e748f68d80a5efba06069b95e3007d5e3bb25d747dc182c887edeade46fa1f2af5d49c9f429ed3774a0db2bd955de5a76983c319fbe51078cac6017881efc95848f0b6ae1988e7c7d0ca02efcef46816edd03f8bcefcefd783d277664b7abe8c5ddc33e78be5cd5e6167ba009887381ab79a3d44ae562b50dee905977ad5bef838b4a01a2e517fd8a3c7201a0b2c52c74f392745edf96414cda66a0526137892b5b560a1eca2551846a7c3866a0bdf88d8c1eb3b4f04b953cc617fbba4f2cd1f0c8bb5a56d0f8f279906d6c7d1e80f90211a0418dede3094af4ae5dd26bcb2b04b8b93a9629791d0177516ee6eac134913e0aa0d572368fac7f59ed1437eef4e05554240411abdc8d58c9e8a0e69c2ac30e744ca0980dcafe038e6ea00b8dba7f94c00ea7456ca08d33878c5c44eef7aba61e901ba0f11f693a54f600be4c64f629f1adb22e7de19ac4efde0911ad25cdc767f6dd1da0e1d250c658a7e98e9a84a00da24301347b6880623cc18034b64584efc06c8e49a0809bfed983cf0524e9ff9b4d7bebe105c663b86d4d95f22fe10345b8ac5e200da043f972b6cc2c44ee5f938199dc160b6ca45eda33fe6134fc8731ada7afb78c32a0d24fcc49261e0f659da6adf3ac6351d7c63d7036a5daf9008ccf8e4d79471bc4a0b3190bfedfddf6778deb8f6345be065957194059cf2040eb4261179c9d1ec9a8a07c3ab66333c79466723e5c6055af19a230d2458e9c1f26f69b08e75d9da8ee54a07cd533f3e86ebea9db73b369cd600c4447d92c2d39d798592b99ffafc31b1f5ea07d0534f7e52a7fd27cd414a0022aaa41c3d4f7ce2568fb96639547d3f25cd05aa0fc7b7dc4d0bd28c4212506c9e612800055f3583261e5caa3b4ec610cf9d7db59a0d52f467c81d11f310bb30a8528fd17431cde3eadffa00b86210470417bfb639ca0cce498a31fb06a8f747d686239b4f19dca239e40a378ce3b1f4006a2c7c868c8a013b6449f54a457c8c77708607c6069ba0ce972506f8b072dbe9d3fd931cd80bb80f8f1a096123db9192b6e29db6392ffc7aa5c5046aa0b12e40b688a6b7e1e88708c02d680a0791e7aec5e64bdfac85657e2f10178a82b807dd63027f89f8198a370311a8e31808080a064be38fc87a5208da02a2fa8d4ddc157d638e1ccb1b5805e9fdba41f151c4f6da0f40558ac68cb73d0693fa2db6bd93872fa83b2701fe026807404a55ebbf8faab80a0f7092e0007e47b1540b721877b90d3d98bf64de2948f04babab4192b0c5d450480a009157b7e154898d356b10d07e537d0aadbd30107069d303ad338367e499f7a14808080a0ffe5b78204edd7eead9d2bc2ad2cafec2450430e935ef6fd60935574f0e314c280f85180a00ccd6b1b6d7601266f939979a810d4c42b8cf6676f25778055a23bda076cfbeb8080808080808080a090b0f4c1f8207b6ec8f25d82ec3cd1309e040cae7813ace30a038494e98442bb808080808080e79d3638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db988875e336081790c4c", + ], + "0xf90256a06f14ee388c6004c9f591c05cc94509906ebcc57e6ce9d7e65c52aa7da6f530e7a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479495222290dd7278aa3ddd389cc1e1d165cc4bafe5a07604903f485d83bda3b1333e28dec61ff3191fef0423ffce44abe02033b323d3a09c6967c2262b8e5aaf07f422806fa22eed9bd05898a71ef3435eb27e258ed240a061cf3a1b00a7ea8e1b8e4a921dbd9af3c73e9ec8646e9884b7936b74e011e05ab901005d61447fd94d1ba8d69022f0b7891c8486f9ae204a03b3b61bbbc905e371ecd613dfbe02ad85113252082314a8e78d016af918d9afd27030b5b7e890842a2f8058103e8c1640a87cd82c733d21e13afc3ce5e133ddd7fd3180a816dc8bfeeaa516555f3bf2545536b6605c1ea8276edf7d076e9346d88e37e24372bec69daa45caa8fe68c4c5edccefefbf60abaa9abee6106cf1dd25dc4fff490c7bf4b1f47993d733a25880a8170f165ed3bb283d69644fb677d0fd763a07218f66249961719ff37e762cf33f76036277f9c2d9e3d5a2a0b6b70cbfbd548a717143e29e3ef4a0f9b17f9f37bc546d06e5d23e02b3c64e2e542f026cf1d4391ccdf19400dc6d8084013d48a48401c9c3808401476c588466edbad78f6265617665726275696c642e6f7267a00b4078ca7a27f9b2448fa3f32e04a269353f80273e6dc95153458475a84238b98800000000000000008502d39a9e8ea00a7c969c5cab15361767d22966b8c0e507572acd096d3bc87af306be3ceb52138080a077f861b303ce5dd4bd241707d60a82406df608caa18ec241e33b5d5a2de94bc2", + 1, +] + +let hashi: Contract, adapter: Contract, hashiProverTest: Contract, shoyuBashi: Contract, owner: SignerWithAddress + +describe("HashiProver", () => { + beforeEach(async () => { + const Hashi = await ethers.getContractFactory("Hashi") + const MockAdapter = await ethers.getContractFactory("MockAdapter") + const HashiProverTest = await ethers.getContractFactory("HashiProverTest") + const ShoyuBashi = await ethers.getContractFactory("ShoyuBashi") + + const signers = await ethers.getSigners() + owner = signers[0] + + hashi = await Hashi.deploy() + adapter = await MockAdapter.deploy() + shoyuBashi = await ShoyuBashi.deploy(owner.address, hashi.address) + hashiProverTest = await HashiProverTest.deploy(shoyuBashi.address) + + await shoyuBashi.enableAdapters(SOURCE_CHAIN_ID, [adapter.address], 1) + }) + + it("should't be able to get the value if block headers are not equal", async () => { + const wrongAccountProof = [...ACCOUNT_PROOF] + wrongAccountProof[2] = "0x0011" + await expect(hashiProverTest.getValue(wrongAccountProof, STORAGE_PROOF)).to.be.revertedWithCustomError( + hashiProverTest, + "InvalidBlockHeader", + ) + }) + + it("should't be able to get the value if chain ids are not equal", async () => { + const wrongAccountProof = [...ACCOUNT_PROOF] + wrongAccountProof[3] = 2 + await expect(hashiProverTest.getValue(wrongAccountProof, STORAGE_PROOF)).to.be.revertedWithCustomError( + hashiProverTest, + "InvalidChainId", + ) + }) + + it("should't be able to get the value if the block is not available", async () => { + await expect(hashiProverTest.getValue(ACCOUNT_PROOF, STORAGE_PROOF)).to.be.revertedWithCustomError( + shoyuBashi, + "ThresholdNotMet", + ) + }) + + it("should't be able to get the value if the block is not equal to the one reported by hashi", async () => { + const wrongBlockHeaderHash = "0xafd0481857f5745a4511c51695d753c56380f8a7406ae63dad368e4abdb3ec46" + await adapter.setHashes(SOURCE_CHAIN_ID, [BLOCK_NUMBER], [wrongBlockHeaderHash]) + await expect(hashiProverTest.getValue(ACCOUNT_PROOF, STORAGE_PROOF)).to.be.revertedWithCustomError( + hashiProverTest, + "InvalidBlockHeader", + ) + }) + + it("should't be able to get the value if the storage proof storage_hash is not equal to the one exctracted using the account proof", async () => { + const wrongStorageProof = [...STORAGE_PROOF] + wrongStorageProof[0] = "0x9d5704aa434de9751d3bfcf9e720a8eb0464ed2b467bd27af86c0415ac15fa10" + await adapter.setHashes(SOURCE_CHAIN_ID, [BLOCK_NUMBER], [BLOCK_HEADER_HASH]) + await expect(hashiProverTest.getValue(ACCOUNT_PROOF, wrongStorageProof)).to.be.revertedWithCustomError( + hashiProverTest, + "InvalidStorageHash", + ) + }) + + it("should be able to get the value", async () => { + await adapter.setHashes(SOURCE_CHAIN_ID, [BLOCK_NUMBER], [BLOCK_HEADER_HASH]) + expect(await hashiProverTest.getValue(ACCOUNT_PROOF, STORAGE_PROOF)).to.be.deep.eq([VALUE]) + }) +}) From d34e8c4647fa9e3ad8cde4a05a3de5a71a8760b4 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 25 Sep 2024 17:27:38 +0200 Subject: [PATCH 284/297] fix(common): fixes logger when service is undefined --- packages/common/src/logger.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/common/src/logger.ts b/packages/common/src/logger.ts index 54055ed2..428f4b6d 100644 --- a/packages/common/src/logger.ts +++ b/packages/common/src/logger.ts @@ -17,7 +17,7 @@ const logger = winston.createLogger({ winston.format.timestamp(), winston.format.printf(({ timestamp, level, message, service }) => { const colorize = winston.format.colorize() - return `${timestamp} [${level}] ${colorize.colorize("service", `${service}`)}: ${message}` + return `${timestamp} [${level}] ${service ? colorize.colorize("service", `${service}`) : ''}: ${message}` }), ), transports: [new winston.transports.Console(), new winston.transports.File({ filename: "./logs/application.log" })], From 1e3258b28ef41ae78778bd43d572dddce452ed12 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 25 Sep 2024 17:30:37 +0200 Subject: [PATCH 285/297] feat(rpc): <- adds first implementation of this --- packages/rpc/.env.example | 2 + packages/rpc/.eslintignore | 2 + packages/rpc/.eslintrc.yml | 21 + packages/rpc/.prettierignore | 2 + packages/rpc/.prettierrc.yml | 7 + packages/rpc/nodemon.json | 5 + packages/rpc/package.json | 40 ++ packages/rpc/src/index.ts | 34 ++ .../methods/get-account-and-storage-proof.ts | 66 ++++ packages/rpc/src/methods/types.ts | 5 + packages/rpc/src/middlewares/log.ts | 12 + packages/rpc/src/types/index.ts | 15 + packages/rpc/tsconfig.json | 6 + yarn.lock | 362 +++++------------- 14 files changed, 309 insertions(+), 270 deletions(-) create mode 100644 packages/rpc/.env.example create mode 100644 packages/rpc/.eslintignore create mode 100644 packages/rpc/.eslintrc.yml create mode 100644 packages/rpc/.prettierignore create mode 100644 packages/rpc/.prettierrc.yml create mode 100644 packages/rpc/nodemon.json create mode 100644 packages/rpc/package.json create mode 100644 packages/rpc/src/index.ts create mode 100644 packages/rpc/src/methods/get-account-and-storage-proof.ts create mode 100644 packages/rpc/src/methods/types.ts create mode 100644 packages/rpc/src/middlewares/log.ts create mode 100644 packages/rpc/src/types/index.ts create mode 100644 packages/rpc/tsconfig.json diff --git a/packages/rpc/.env.example b/packages/rpc/.env.example new file mode 100644 index 00000000..5c46bb15 --- /dev/null +++ b/packages/rpc/.env.example @@ -0,0 +1,2 @@ +PORT= +JSON_RPC_URL_1= \ No newline at end of file diff --git a/packages/rpc/.eslintignore b/packages/rpc/.eslintignore new file mode 100644 index 00000000..b68087da --- /dev/null +++ b/packages/rpc/.eslintignore @@ -0,0 +1,2 @@ +**/dist +**/node_modules \ No newline at end of file diff --git a/packages/rpc/.eslintrc.yml b/packages/rpc/.eslintrc.yml new file mode 100644 index 00000000..27672a35 --- /dev/null +++ b/packages/rpc/.eslintrc.yml @@ -0,0 +1,21 @@ +extends: + - "eslint:recommended" + - "plugin:@typescript-eslint/eslint-recommended" + - "plugin:@typescript-eslint/recommended" + - "prettier" +parser: "@typescript-eslint/parser" +parserOptions: + project: "tsconfig.json" +plugins: + - "@typescript-eslint" +root: true +rules: + "@typescript-eslint/no-floating-promises": + - error + - ignoreIIFE: true + ignoreVoid: true + "@typescript-eslint/no-inferrable-types": "off" + "@typescript-eslint/no-unused-vars": + - error + - argsIgnorePattern: "_" + varsIgnorePattern: "_" diff --git a/packages/rpc/.prettierignore b/packages/rpc/.prettierignore new file mode 100644 index 00000000..b68087da --- /dev/null +++ b/packages/rpc/.prettierignore @@ -0,0 +1,2 @@ +**/dist +**/node_modules \ No newline at end of file diff --git a/packages/rpc/.prettierrc.yml b/packages/rpc/.prettierrc.yml new file mode 100644 index 00000000..e9bada2e --- /dev/null +++ b/packages/rpc/.prettierrc.yml @@ -0,0 +1,7 @@ +bracketSpacing: true +printWidth: 120 +proseWrap: "always" +singleQuote: false +tabWidth: 2 +trailingComma: "all" +semi: false diff --git a/packages/rpc/nodemon.json b/packages/rpc/nodemon.json new file mode 100644 index 00000000..094036ef --- /dev/null +++ b/packages/rpc/nodemon.json @@ -0,0 +1,5 @@ +{ + "watch": ["src"], + "ext": "ts,json", + "exec": "ts-node ./src/index.ts" +} diff --git a/packages/rpc/package.json b/packages/rpc/package.json new file mode 100644 index 00000000..65404eda --- /dev/null +++ b/packages/rpc/package.json @@ -0,0 +1,40 @@ +{ + "name": "@gnosis/hashi-rpc", + "private": true, + "version": "0.1.0", + "scripts": { + "compile": "tsc", + "lint": "eslint --ignore-path ./.eslintignore --ext .js,.ts .", + "prettier:check": "prettier --check \"**/*.{js,json,md,sol,ts,yml}\"", + "prettier:write": "prettier --write \"**/*.{js,json,md,sol,ts,yml}\"", + "start": "node --loader ts-node/esm ./src/index.ts", + "start:prod": "node ./dist/index.js", + "start:dev": "nodemon" + }, + "dependencies": { + "@ethereumjs/block": "^5.3.0", + "@ethereumjs/common": "^4.4.0", + "@ethereumjs/rlp": "^5.0.2", + "@ethereumjs/util": "^9.0.3", + "@gnosis/hashi-common": "0.1.0", + "body-parser": "^1.20.2", + "dotenv": "^16.4.5", + "ethers": "^6.13.2", + "express": "^4.19.2", + "json-rpc-2.0": "^1.7.0", + "kzg-wasm": "^0.4.0" + }, + "devDependencies": { + "@tsconfig/node22": "^22.0.0", + "@types/express": "^4.17.21", + "@types/node": "^20.8.9", + "@typescript-eslint/eslint-plugin": "^6.7.5", + "@typescript-eslint/parser": "^6.7.5", + "eslint": "^8.51.0", + "eslint-config-prettier": "^9.0.0", + "nodemon": "^3.0.1", + "prettier": "^3.3.2", + "ts-node": "^10.9.1", + "typescript": "^5.2.2" + } +} diff --git a/packages/rpc/src/index.ts b/packages/rpc/src/index.ts new file mode 100644 index 00000000..be4da8b7 --- /dev/null +++ b/packages/rpc/src/index.ts @@ -0,0 +1,34 @@ +import "dotenv/config" +import express from "express" +import bodyParser from "body-parser" +import { JSONRPCServer, TypedJSONRPCServer } from "json-rpc-2.0" +import { logger } from "@gnosis/hashi-common" + +import logMiddleware from "./middlewares/log" +import getAccountAndStorageProof from "./methods/get-account-and-storage-proof" +import { Methods } from "./methods/types" + +const start = async () => { + const server: TypedJSONRPCServer = new JSONRPCServer() + server.addMethod("hashi_getAccountAndStorageProof", getAccountAndStorageProof) + server.applyMiddleware(logMiddleware) + + const app = express() + app.use(bodyParser.json()) + + app.post("/v1", (_req, _res) => { + const jsonRPCRequest = _req.body + server.receive(jsonRPCRequest).then((_jsonRPCResponse) => { + if (_jsonRPCResponse) { + _res.json(_jsonRPCResponse) + } else { + _res.sendStatus(204) + } + }) + }) + + app.listen(process.env.PORT) + logger.info(`Server listening on port ${process.env.PORT} ...`) +} + +start() diff --git a/packages/rpc/src/methods/get-account-and-storage-proof.ts b/packages/rpc/src/methods/get-account-and-storage-proof.ts new file mode 100644 index 00000000..3a495d9e --- /dev/null +++ b/packages/rpc/src/methods/get-account-and-storage-proof.ts @@ -0,0 +1,66 @@ +import "dotenv/config" +import { ethers } from "ethers" +import { logger } from "@gnosis/hashi-common" +import { Block } from "@ethereumjs/block" +import { loadKZG } from "kzg-wasm" +import { Common, Chain, Hardfork } from "@ethereumjs/common" +import { RLP } from "@ethereumjs/rlp" +import { bigIntToHex, bytesToHex } from "@ethereumjs/util" + +import { + AccountProof, + StorageProof, + GetAccountAndStorageProofParams, + GetAccountAndStorageProofResponse, +} from "../types" + +const getAccountAndStorageProof = async ({ + chainId, + address, + storageKeys, + blockNumber, +}: GetAccountAndStorageProofParams) => { + try { + const rpcUrl = process.env[`JSON_RPC_URL_${chainId}`] + if (!rpcUrl) throw new Error("Chain not supported") + + const kzg = await loadKZG() + const common = new Common({ + chain: Chain.Mainnet, + hardfork: Hardfork.Cancun, + customCrypto: { + kzg, + }, + }) + + const provider = new ethers.JsonRpcProvider(rpcUrl) + + const [proof, block] = await Promise.all([ + provider.send("eth_getProof", [address, storageKeys, bigIntToHex(BigInt(blockNumber))]), + Block.fromJsonRpcProvider(provider, BigInt(blockNumber), { common }), + ]) + + return { + accountProof: [ + address, + bytesToHex(RLP.encode(proof.accountProof.map((_sibling: string) => RLP.decode(_sibling)))), + bytesToHex(block.header.serialize()), + chainId, + ] as AccountProof, + storageProof: [ + proof.storageHash, + proof.storageProof.map(({ key }: any) => key), + proof.storageProof.map(({ proof: storageProof }: any) => + bytesToHex(RLP.encode(storageProof.map((_sibling: string) => RLP.decode(_sibling)))), + ), + bytesToHex(block.header.serialize()), + chainId, + ] as StorageProof, + } as GetAccountAndStorageProofResponse + } catch (_err) { + logger.error(_err) + throw _err + } +} + +export default getAccountAndStorageProof diff --git a/packages/rpc/src/methods/types.ts b/packages/rpc/src/methods/types.ts new file mode 100644 index 00000000..20499eee --- /dev/null +++ b/packages/rpc/src/methods/types.ts @@ -0,0 +1,5 @@ +import { GetAccountAndStorageProofParams, GetAccountAndStorageProofResponse } from "../types" + +export type Methods = { + hashi_getAccountAndStorageProof(params: GetAccountAndStorageProofParams): GetAccountAndStorageProofResponse +} diff --git a/packages/rpc/src/middlewares/log.ts b/packages/rpc/src/middlewares/log.ts new file mode 100644 index 00000000..64decbde --- /dev/null +++ b/packages/rpc/src/middlewares/log.ts @@ -0,0 +1,12 @@ +import { JSONRPCRequest, JSONRPCResponse, JSONRPCServerMiddlewareNext } from "json-rpc-2.0" +import { logger } from "@gnosis/hashi-common" + +const logMiddleware = (_next: JSONRPCServerMiddlewareNext, _request: JSONRPCRequest, _params: any) => { + logger.info(`Received ${JSON.stringify(_request)}`) + return _next(_request, _params).then((_response: JSONRPCResponse | null) => { + logger.info(`Responding ${JSON.stringify(_response)}`) + return _response + }) +} + +export default logMiddleware diff --git a/packages/rpc/src/types/index.ts b/packages/rpc/src/types/index.ts new file mode 100644 index 00000000..9cc8aa2e --- /dev/null +++ b/packages/rpc/src/types/index.ts @@ -0,0 +1,15 @@ +export type AccountProof = [`0x${string}`, `0x${string}`, `0x${string}`, number] + +export type StorageProof = [`0x${string}`, `0x${string}`[], `0x${string}`[], `0x${string}`, number] + +export type GetAccountAndStorageProofParams = { + chainId: number + address: `0x${string}` + storageKeys: `0x${string}`[] + blockNumber: number +} + +export type GetAccountAndStorageProofResponse = { + accountProof: AccountProof + storageProof: StorageProof +} diff --git a/packages/rpc/tsconfig.json b/packages/rpc/tsconfig.json new file mode 100644 index 00000000..e6d845c2 --- /dev/null +++ b/packages/rpc/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "compilerOptions": { + "outDir": "./dist" + } +} diff --git a/yarn.lock b/yarn.lock index d155c39b..3ea890c0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,6 +7,11 @@ resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz#d2a39395c587e092d77cbbc80acf956a54f38bf7" integrity sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q== +"@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== + "@axelar-network/axelar-gmp-sdk-solidity@5.6.4": version "5.6.4" resolved "https://registry.yarnpkg.com/@axelar-network/axelar-gmp-sdk-solidity/-/axelar-gmp-sdk-solidity-5.6.4.tgz#fe224ff039f86f1cbf72d9b53339a8354f531b65" @@ -356,6 +361,25 @@ bufio "^1.0.7" chai "^4.3.4" +"@ethereumjs/block@^5.3.0": + version "5.3.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-5.3.0.tgz#a22d615f825a3aa123189434263a6c1d43d4ac8f" + integrity sha512-cyphdEB/ywIERqWLRHdAS6muTkAcd6BibMOp6XmGbeWgvtIhe4ArxcMDI78MVstJzT/faihvRI4rKQKy+MpdKQ== + dependencies: + "@ethereumjs/common" "^4.4.0" + "@ethereumjs/rlp" "^5.0.2" + "@ethereumjs/trie" "^6.2.1" + "@ethereumjs/tx" "^5.4.0" + "@ethereumjs/util" "^9.1.0" + ethereum-cryptography "^2.2.1" + +"@ethereumjs/common@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-4.4.0.tgz#fba41612f527a815bf304e98653d6b5fc5d6d4de" + integrity sha512-Fy5hMqF6GsE6DpYTyqdDIJPJgUtDn4dL120zKw+Pswuo+iLyBsEYuSyzMw6NVzD2vDzcBG9fE4+qX4X2bPc97w== + dependencies: + "@ethereumjs/util" "^9.1.0" + "@ethereumjs/rlp@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-4.0.1.tgz#626fabfd9081baab3d0a3074b0c7ecaf674aaa41" @@ -366,6 +390,29 @@ resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-5.0.2.tgz#c89bd82f2f3bec248ab2d517ae25f5bbc4aac842" integrity sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA== +"@ethereumjs/trie@^6.2.1": + version "6.2.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/trie/-/trie-6.2.1.tgz#11d3e91ffd7d565f468a62c0e3d7952063991fa9" + integrity sha512-MguABMVi/dPtgagK+SuY57rpXFP+Ghr2x+pBDy+e3VmMqUY+WGzFu1QWjBb5/iJ7lINk4CI2Uwsih07Nu9sTSg== + dependencies: + "@ethereumjs/rlp" "^5.0.2" + "@ethereumjs/util" "^9.1.0" + "@types/readable-stream" "^2.3.13" + debug "^4.3.4" + ethereum-cryptography "^2.2.1" + lru-cache "10.1.0" + readable-stream "^3.6.0" + +"@ethereumjs/tx@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-5.4.0.tgz#6f47894cc3e2d4e63d87c62b41ed7e8180a1de58" + integrity sha512-SCHnK7m/AouZ7nyoR0MEXw1OO/tQojSbp88t8oxhwes5iZkZCtfFdUrJaiIb72qIpH2FVw6s1k1uP7LXuH7PsA== + dependencies: + "@ethereumjs/common" "^4.4.0" + "@ethereumjs/rlp" "^5.0.2" + "@ethereumjs/util" "^9.1.0" + ethereum-cryptography "^2.2.1" + "@ethereumjs/util@^8.1.0": version "8.1.0" resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-8.1.0.tgz#299df97fb6b034e0577ce9f94c7d9d1004409ed4" @@ -375,7 +422,7 @@ ethereum-cryptography "^2.0.0" micro-ftch "^0.3.1" -"@ethereumjs/util@^9.0.3": +"@ethereumjs/util@^9.0.3", "@ethereumjs/util@^9.1.0": version "9.1.0" resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-9.1.0.tgz#75e3898a3116d21c135fa9e29886565609129bce" integrity sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog== @@ -1567,6 +1614,11 @@ dependencies: undici-types "~6.19.2" +"@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/node@20.5.1": version "20.5.1" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.1.tgz#178d58ee7e4834152b0e8b4d30cbfab578b9bb30" @@ -1984,6 +2036,11 @@ aes-js@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@6: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -2043,13 +2100,6 @@ ansi-escapes@^4.3.0: dependencies: type-fest "^0.21.3" -ansi-escapes@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-7.0.0.tgz#00fc19f491bbb18e1d481b97868204f92109bfe7" - integrity sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw== - dependencies: - environment "^1.0.0" - ansi-regex@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" @@ -2060,11 +2110,6 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-regex@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" - integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== - ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -2079,11 +2124,6 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -ansi-styles@^6.0.0, ansi-styles@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - antlr4@^4.11.0: version "4.13.2" resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.13.2.tgz#0d084ad0e32620482a9c3a0e2470c02e72e4006d" @@ -2519,11 +2559,6 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" - integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== - "charenc@>= 0.0.1": version "0.0.2" resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" @@ -2585,13 +2620,6 @@ clean-stack@^2.0.0: resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -cli-cursor@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-5.0.0.tgz#24a4831ecf5a6b01ddeb32fb71a4b2088b0dce38" - integrity sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw== - dependencies: - restore-cursor "^5.0.0" - cli-table3@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" @@ -2602,14 +2630,6 @@ cli-table3@^0.5.0: optionalDependencies: colors "^1.1.2" -cli-truncate@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a" - integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== - dependencies: - slice-ansi "^5.0.0" - string-width "^7.0.0" - cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -2668,11 +2688,6 @@ color@^3.1.3: color-convert "^1.9.3" color-string "^1.6.0" -colorette@^2.0.20: - version "2.0.20" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" - integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== - colors@1.4.0, colors@^1.1.2: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" @@ -2733,11 +2748,6 @@ commander@^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== -commander@~12.1.0: - version "12.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" - integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== - compare-func@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" @@ -2896,7 +2906,7 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5, debug@~4.3.6: +debug@4, debug@^4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5: version "4.3.7" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== @@ -3005,7 +3015,7 @@ dot-prop@^5.1.0: dependencies: is-obj "^2.0.0" -dotenv@^16.0.3, dotenv@^16.3.1: +dotenv@^16.0.3, dotenv@^16.3.1, dotenv@^16.4.5: version "16.4.5" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== @@ -3045,11 +3055,6 @@ elliptic@^6.5.2, elliptic@^6.5.4: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" -emoji-regex@^10.3.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.4.0.tgz#03553afea80b3975749cfcb36f776ca268e413d4" - integrity sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw== - emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -3088,11 +3093,6 @@ env-paths@^2.2.0: resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== -environment@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/environment/-/environment-1.1.0.tgz#8e86c66b180f363c7ab311787e0259665f45a9f1" - integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== - error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -3424,6 +3424,19 @@ ethers@^5.7.0, ethers@^5.7.1, ethers@^5.7.2: "@ethersproject/web" "5.7.1" "@ethersproject/wordlists" "5.7.0" +ethers@^6.13.2: + version "6.13.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.13.2.tgz#4b67d4b49e69b59893931a032560999e5e4419fe" + integrity sha512-9VkriTTed+/27BGuY1s0hf441kqwHJ1wtN2edksEtiRvXx+soxRX3iSXTfFqq2+YwrOqbDoTHjIhQnjJRlzKmg== + 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.17.1" + ethjs-unit@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" @@ -3468,21 +3481,6 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -execa@~8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" - integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^8.0.1" - human-signals "^5.0.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^4.1.0" - strip-final-newline "^3.0.0" - express@^4.19.2: version "4.21.0" resolved "https://registry.yarnpkg.com/express/-/express-4.21.0.tgz#d57cb706d49623d4ac27833f1cbc466b668eb915" @@ -3813,11 +3811,6 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-east-asian-width@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz#5e6ebd9baee6fb8b7b6bd505221065f0cd91f64e" - integrity sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA== - 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" @@ -3844,11 +3837,6 @@ get-stream@^6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -get-stream@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" - integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== - ghost-testrpc@^0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz#c4de9557b1d1ae7b2d20bbe474a91378ca90ce92" @@ -4256,11 +4244,6 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -human-signals@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" - integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== - humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" @@ -4273,11 +4256,6 @@ husky@^8.0.3: resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== -husky@^9.0.11: - version "9.1.6" - resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.6.tgz#e23aa996b6203ab33534bdc82306b0cf2cb07d6c" - integrity sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A== - iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -4412,18 +4390,6 @@ is-fullwidth-code-point@^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-fullwidth-code-point@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" - integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== - -is-fullwidth-code-point@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz#9609efced7c2f97da7b60145ef481c787c7ba704" - integrity sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA== - dependencies: - get-east-asian-width "^1.0.0" - is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -4466,11 +4432,6 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - is-text-path@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" @@ -4691,6 +4652,11 @@ kuler@^2.0.0: resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== +kzg-wasm@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/kzg-wasm/-/kzg-wasm-0.4.0.tgz#362048470e25fb9683eefa9d2b076283ae653fa0" + integrity sha512-hKEwFbKrY1LZnAH5gY8+PlVWfkGnj2wd2tc83eIgzuC4NoshXqplW9OzGlBDqpAmXxwhiN8fgPG2+NcvUIBSwg== + level-supports@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a" @@ -4729,44 +4695,11 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -lilconfig@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb" - integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== - lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -lint-staged@^15.2.7: - version "15.2.10" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.2.10.tgz#92ac222f802ba911897dcf23671da5bb80643cd2" - integrity sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg== - dependencies: - chalk "~5.3.0" - commander "~12.1.0" - debug "~4.3.6" - execa "~8.0.1" - lilconfig "~3.1.2" - listr2 "~8.2.4" - micromatch "~4.0.8" - pidtree "~0.6.0" - string-argv "~0.3.2" - yaml "~2.5.0" - -listr2@~8.2.4: - version "8.2.4" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.2.4.tgz#486b51cbdb41889108cb7e2c90eeb44519f5a77f" - integrity sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g== - dependencies: - cli-truncate "^4.0.0" - colorette "^2.0.20" - eventemitter3 "^5.0.1" - log-update "^6.1.0" - rfdc "^1.4.1" - wrap-ansi "^9.0.0" - locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -4862,17 +4795,6 @@ log-symbols@^4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" -log-update@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.1.0.tgz#1a04ff38166f94647ae1af562f4bd6a15b1b7cd4" - integrity sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w== - dependencies: - ansi-escapes "^7.0.0" - cli-cursor "^5.0.0" - slice-ansi "^7.1.0" - strip-ansi "^7.1.0" - wrap-ansi "^9.0.0" - logform@^2.6.0, logform@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/logform/-/logform-2.6.1.tgz#71403a7d8cae04b2b734147963236205db9b3df0" @@ -4892,6 +4814,11 @@ loupe@^2.3.6: dependencies: get-func-name "^2.0.1" +lru-cache@10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.1.0.tgz#2098d41c2dc56500e6c88584aa656c84de7d0484" + integrity sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -5016,7 +4943,7 @@ micro-ftch@^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.2, micromatch@^4.0.4, micromatch@~4.0.8: +micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.8" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== @@ -5046,16 +4973,6 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - -mimic-function@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" - integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== - min-indent@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" @@ -5301,13 +5218,6 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" -npm-run-path@^5.1.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" - integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== - dependencies: - path-key "^4.0.0" - number-to-bn@1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" @@ -5364,20 +5274,6 @@ onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - -onetime@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-7.0.0.tgz#9f16c92d8c9ef5120e3acd9dd9957cceecc1ab60" - integrity sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ== - dependencies: - mimic-function "^5.0.0" - open@^7.4.2: version "7.4.2" resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" @@ -5552,11 +5448,6 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - path-parse@^1.0.6, path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" @@ -5598,11 +5489,6 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pidtree@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" - integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== - pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" @@ -5874,24 +5760,11 @@ resolve@^1.1.6, resolve@^1.10.0, resolve@^1.8.1: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -restore-cursor@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-5.1.0.tgz#0766d95699efacb14150993f55baf0953ea1ebe7" - integrity sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA== - dependencies: - onetime "^7.0.0" - signal-exit "^4.1.0" - reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rfdc@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" - integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== - rimraf@^2.2.8, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -6142,11 +6015,6 @@ signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -signal-exit@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -6180,22 +6048,6 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" -slice-ansi@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" - integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== - dependencies: - ansi-styles "^6.0.0" - is-fullwidth-code-point "^4.0.0" - -slice-ansi@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.0.tgz#cd6b4655e298a8d1bdeb04250a433094b347b9a9" - integrity sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg== - dependencies: - ansi-styles "^6.2.1" - is-fullwidth-code-point "^5.0.0" - solc@0.7.3: version "0.7.3" resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" @@ -6363,11 +6215,6 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -string-argv@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" - integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== - string-format@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" @@ -6390,15 +6237,6 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^7.0.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" - integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== - dependencies: - emoji-regex "^10.3.0" - get-east-asian-width "^1.0.0" - strip-ansi "^7.1.0" - string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -6427,23 +6265,11 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - strip-hex-prefix@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" @@ -6692,6 +6518,11 @@ ts-node@^10.8.1, ts-node@^10.9.1, ts-node@^10.9.2: v8-compile-cache-lib "^3.0.1" yn "3.1.1" +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.8.1, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" @@ -6950,7 +6781,7 @@ viem@^1.16.5: isows "1.0.3" ws "8.13.0" -viem@^2.17.5, viem@^2.9.28: +viem@^2.9.28: version "2.21.14" resolved "https://registry.yarnpkg.com/viem/-/viem-2.21.14.tgz#2ce78d52d43dd97103102fcb0852b973a911f478" integrity sha512-uM6XmY9Q/kJRVSopJAGsakmtNDpk/EswqXUzwOp9DzhGuwgpWtw2MgwpfFdIyqBDFIw+TTypCIUTcwJSgEYSzA== @@ -7036,7 +6867,7 @@ winston-transport@^4.7.0: readable-stream "^3.6.2" triple-beam "^1.3.0" -winston@^3.11.0, winston@^3.13.1: +winston@^3.11.0: version "3.14.2" resolved "https://registry.yarnpkg.com/winston/-/winston-3.14.2.tgz#94ce5fd26d374f563c969d12f0cd9c641065adab" integrity sha512-CO8cdpBB2yqzEf8v895L+GNKYJiEq8eKlHU38af3snQBQ+sdAIUepjMSguOIJC7ICbzm0ZI+Af2If4vIJrtmOg== @@ -7085,15 +6916,6 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.0.tgz#1a3dc8b70d85eeb8398ddfb1e4a02cd186e58b3e" - integrity sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== - dependencies: - ansi-styles "^6.2.1" - string-width "^7.0.0" - strip-ansi "^7.1.0" - wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -7139,7 +6961,7 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^2.2.2, yaml@~2.5.0: +yaml@^2.2.2: version "2.5.1" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.1.tgz#c9772aacf62cb7494a95b0c4f1fb065b563db130" integrity sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q== From 5392ed2d295fe62b8b9ead26dff661aa6d3f971b Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Fri, 27 Sep 2024 09:03:32 +0200 Subject: [PATCH 286/297] feat(evm): merges AccountProof and StorageProof into Proof --- .../evm/contracts/interfaces/IHashiProver.sol | 22 ++--- packages/evm/contracts/prover/HashiProver.sol | 82 ++++++++++++------- .../evm/contracts/test/HashiProverTest.sol | 7 +- 3 files changed, 67 insertions(+), 44 deletions(-) diff --git a/packages/evm/contracts/interfaces/IHashiProver.sol b/packages/evm/contracts/interfaces/IHashiProver.sol index 836f43a6..9e301c8b 100644 --- a/packages/evm/contracts/interfaces/IHashiProver.sol +++ b/packages/evm/contracts/interfaces/IHashiProver.sol @@ -5,24 +5,24 @@ pragma solidity ^0.8.0; * @title IHashiProver */ interface IHashiProver { - struct AccountProof { - address account; - bytes proof; - bytes blockHeader; + struct AccountAndStorageProof { uint256 chainId; - } - - struct StorageProof { + uint256 blockNumber; + bytes blockHeader; + uint256 ancestralBlockNumber; + bytes[] ancestralBlockHeaders; + address account; + bytes accountProof; bytes32 storageHash; bytes32[] storageKeys; - bytes[] proofs; - bytes blockHeader; - uint256 chainId; + bytes[] storageProof; } + error AncestralBlockHeadersLengthReached(); + error ConflictingBlockHeader(uint256 blockNumber, bytes32 ancestralBlockHeaderHash, bytes32 blockHeaderHash); error InvalidAccount(); error InvalidBlockHeader(); - error InvalidChainId(); + error InvalidBlockHeaderLength(); error InvalidStorageHash(); error InvalidStorageProofParams(); } diff --git a/packages/evm/contracts/prover/HashiProver.sol b/packages/evm/contracts/prover/HashiProver.sol index 3b104eaf..dbb83d7c 100644 --- a/packages/evm/contracts/prover/HashiProver.sol +++ b/packages/evm/contracts/prover/HashiProver.sol @@ -17,33 +17,59 @@ contract HashiProver is IHashiProver { } function _verifyAccountAndStorageProof( - AccountProof calldata accountProof, - StorageProof calldata storageProof + AccountAndStorageProof calldata proof ) internal view returns (bytes[] memory) { - bytes32 blockHeaderHash = keccak256(accountProof.blockHeader); - if (blockHeaderHash != keccak256(storageProof.blockHeader)) revert InvalidBlockHeader(); - if (accountProof.chainId != storageProof.chainId) revert InvalidChainId(); - RLPReader.RLPItem[] memory blockHeaderFields = accountProof.blockHeader.toRlpItem().toList(); - _checkBlockHeaderAgainstHashi(accountProof.chainId, blockHeaderFields[8].toUint(), blockHeaderHash); + bytes memory blockHeader = _checkBlockHeaderAgainstHashi( + proof.chainId, + proof.blockNumber, + proof.blockHeader, + proof.ancestralBlockNumber, + proof.ancestralBlockHeaders + ); + RLPReader.RLPItem[] memory blockHeaderFields = blockHeader.toRlpItem().toList(); bytes32 stateRoot = bytes32(blockHeaderFields[3].toUint()); - (, , bytes32 expectedStorageHash, ) = _verifyAccountProof(accountProof.account, stateRoot, accountProof.proof); - if (storageProof.storageHash != expectedStorageHash) revert InvalidStorageHash(); - return _verifyStorageProofs(storageProof.storageHash, storageProof.storageKeys, storageProof.proofs); + (, , bytes32 expectedStorageHash, ) = _verifyAccountProof(proof.account, stateRoot, proof.accountProof); + if (proof.storageHash != expectedStorageHash) revert InvalidStorageHash(); + return _verifyStorageProof(proof.storageHash, proof.storageKeys, proof.storageProof); } - function _verifyStorageProofs(StorageProof calldata storageProof) external view returns (bytes[] memory) { - RLPReader.RLPItem[] memory blockHeaderFields = storageProof.blockHeader.toRlpItem().toList(); - _checkBlockHeaderAgainstHashi( - storageProof.chainId, - blockHeaderFields[8].toUint(), - keccak256(storageProof.blockHeader) - ); - return _verifyStorageProofs(storageProof.storageHash, storageProof.storageKeys, storageProof.proofs); - } + function _checkBlockHeaderAgainstHashi( + uint256 chainId, + uint256 blockNumber, + bytes memory blockHeader, + uint256 ancestralBlockNumber, + bytes[] memory ancestralBlockHeaders + ) private view returns (bytes memory) { + bytes32 blockHeaderHash = keccak256(blockHeader); + bytes32 currentBlockHeaderHash = IShoyuBashi(SHOYU_BASHI).getThresholdHash(chainId, blockNumber); + if (currentBlockHeaderHash == blockHeaderHash && ancestralBlockHeaders.length == 0) return blockHeader; + + for (uint256 i = 0; i < ancestralBlockHeaders.length; i++) { + RLPReader.RLPItem memory ancestralBlockHeaderRLP = RLPReader.toRlpItem(ancestralBlockHeaders[i]); + RLPReader.RLPItem[] memory ancestralBlockHeaderContent = ancestralBlockHeaderRLP.toList(); + + bytes32 blockParentHash = bytes32(ancestralBlockHeaderContent[0].toUint()); + uint256 currentAncestralBlockNumber = uint256(ancestralBlockHeaderContent[8].toUint()); + + bytes32 ancestralBlockHeaderHash = keccak256(ancestralBlockHeaders[i]); + if (ancestralBlockHeaderHash != currentBlockHeaderHash) + revert ConflictingBlockHeader( + currentAncestralBlockNumber, + ancestralBlockHeaderHash, + currentBlockHeaderHash + ); + + if (ancestralBlockNumber == currentAncestralBlockNumber && i == ancestralBlockHeaders.length - 1) { + return ancestralBlockHeaders[i]; + } else if (i == ancestralBlockHeaders.length - 1) { + revert AncestralBlockHeadersLengthReached(); + } else { + currentBlockHeaderHash = blockParentHash; + } + } - function _checkBlockHeaderAgainstHashi(uint256 chainId, uint256 blockNumber, bytes32 blockHeaderHash) private view { - bytes32 expectedBlockHeaderHash = IShoyuBashi(SHOYU_BASHI).getThresholdHash(chainId, blockNumber); - if (expectedBlockHeaderHash != blockHeaderHash) revert InvalidBlockHeader(); + // NOTE: this point is never reached + return abi.encodePacked(bytes32(0)); } function _verifyAccountProof( @@ -69,19 +95,19 @@ contract HashiProver is IHashiProver { ); } - function _verifyStorageProofs( + function _verifyStorageProof( bytes32 storageHash, bytes32[] memory storageKeys, - bytes[] memory proofs + bytes[] memory proof ) private pure returns (bytes[] memory) { - bytes[] memory results = new bytes[](proofs.length); - if (storageKeys.length == 0 || proofs.length == 0 || storageKeys.length != proofs.length) + bytes[] memory results = new bytes[](proof.length); + if (storageKeys.length == 0 || proof.length == 0 || storageKeys.length != proof.length) revert InvalidStorageProofParams(); - for (uint256 i = 0; i < proofs.length; ) { + for (uint256 i = 0; i < proof.length; ) { results[i] = MerklePatriciaProofVerifier.extractProofValue( storageHash, abi.encodePacked(keccak256(abi.encode(storageKeys[i]))), - proofs[i].toRlpItem().toList() + proof[i].toRlpItem().toList() ); unchecked { ++i; diff --git a/packages/evm/contracts/test/HashiProverTest.sol b/packages/evm/contracts/test/HashiProverTest.sol index 111830ba..ba339907 100644 --- a/packages/evm/contracts/test/HashiProverTest.sol +++ b/packages/evm/contracts/test/HashiProverTest.sol @@ -6,10 +6,7 @@ import { HashiProver } from "../prover/HashiProver.sol"; contract HashiProverTest is HashiProver { constructor(address shoyuBashi) HashiProver(shoyuBashi) {} - function getValue( - HashiProver.AccountProof calldata accountProof, - HashiProver.StorageProof calldata storageProof - ) external view returns (bytes[] memory) { - return _verifyAccountAndStorageProof(accountProof, storageProof); + function getValue(HashiProver.AccountAndStorageProof calldata proof) external view returns (bytes[] memory) { + return _verifyAccountAndStorageProof(proof); } } From 438191cfb592cfe1312cb4174ab11d95976c5a16 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Fri, 27 Sep 2024 09:05:10 +0200 Subject: [PATCH 287/297] feat(rpc): adds integration of ancestralBlockNumber --- packages/evm/test/05_HashiProver.spec.ts | 90 ++++++++++--------- .../methods/get-account-and-storage-proof.ts | 39 +++++--- packages/rpc/src/types/index.ts | 12 +-- 3 files changed, 81 insertions(+), 60 deletions(-) diff --git a/packages/evm/test/05_HashiProver.spec.ts b/packages/evm/test/05_HashiProver.spec.ts index 63928f4c..7fdade68 100644 --- a/packages/evm/test/05_HashiProver.spec.ts +++ b/packages/evm/test/05_HashiProver.spec.ts @@ -8,20 +8,38 @@ const BLOCK_NUMBER = 20793508 const BLOCK_HEADER_HASH = "0xafd0481857f5745a4511c51695d753c56380f8a7406ae63dad368e4abdb3ec47" const VALUE = "0x875e336081790c4c" -const ACCOUNT_PROOF = [ +const PROOF = [ + 1, + 20793508, + "0xf90256a06f14ee388c6004c9f591c05cc94509906ebcc57e6ce9d7e65c52aa7da6f530e7a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479495222290dd7278aa3ddd389cc1e1d165cc4bafe5a07604903f485d83bda3b1333e28dec61ff3191fef0423ffce44abe02033b323d3a09c6967c2262b8e5aaf07f422806fa22eed9bd05898a71ef3435eb27e258ed240a061cf3a1b00a7ea8e1b8e4a921dbd9af3c73e9ec8646e9884b7936b74e011e05ab901005d61447fd94d1ba8d69022f0b7891c8486f9ae204a03b3b61bbbc905e371ecd613dfbe02ad85113252082314a8e78d016af918d9afd27030b5b7e890842a2f8058103e8c1640a87cd82c733d21e13afc3ce5e133ddd7fd3180a816dc8bfeeaa516555f3bf2545536b6605c1ea8276edf7d076e9346d88e37e24372bec69daa45caa8fe68c4c5edccefefbf60abaa9abee6106cf1dd25dc4fff490c7bf4b1f47993d733a25880a8170f165ed3bb283d69644fb677d0fd763a07218f66249961719ff37e762cf33f76036277f9c2d9e3d5a2a0b6b70cbfbd548a717143e29e3ef4a0f9b17f9f37bc546d06e5d23e02b3c64e2e542f026cf1d4391ccdf19400dc6d8084013d48a48401c9c3808401476c588466edbad78f6265617665726275696c642e6f7267a00b4078ca7a27f9b2448fa3f32e04a269353f80273e6dc95153458475a84238b98800000000000000008502d39a9e8ea00a7c969c5cab15361767d22966b8c0e507572acd096d3bc87af306be3ceb52138080a077f861b303ce5dd4bd241707d60a82406df608caa18ec241e33b5d5a2de94bc2", + 0, + [], "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", "0xf90ec7f90211a0c7f9548de2413b06c51826457d18686177d6b50cfe9c57052d5e2745ea67405fa037c538f94ae962a12ec446e99913c4a2f84f1262b6187b33e7223842c32cb2eba027252f104dbb368c148808bc165f19872ffee7923996f4b16c0638e3614dd7e7a054e4c38140beb9e6797a2fb319d8547cfa66fa1e2cb6d82127680268385aa672a07338ba4f0182c36261d92001142d58972ef60fa78bf7c619142dbc6ff600200da0a448274d9713da8237b955d1a18c1ada8ea94cfa94a6b4db2342d1842055b189a05e120865c2d8ec5f247e9d8910d7de99db8ff0241edba8740e80e36792aba2c5a012e7432e7545f98874ead265b48ac00d8e2110423be874204e27a29c7be49be6a020ea554b06c3263db4494a8b3dfe7a0bfb4c08033e67a60bd9f6cbc34d251376a0b096aac4ebdbe28c685f7394c6688e95a96e95fa367fb1fbe5f51996bcecaca7a062efd61342b2456537cbf539f25d524237be19d927a2023eed05a8cdd87eb68da09eb19a5e1d1b22618a8fef9049b62fbff55cc92e6b84a56b0d826ba751b4a291a0c1257750d37ae856d9f36832ba3133c3da159f8c96633036852bcc1d67917363a0730e6746c74c0aaa9818e2346205303e1580773e8794dbe60db756cc69d5ccb2a01aea932f111a3426ea32cdcaebb968e9faeb811b27d2d6ccbeb8f13cf3937f8ba04ad0f5122c1797f92f85cb474e4c6fc318e00ebfbf1ed705e224fe8c48c211b080f90211a07168607c5590b0a93f3b5ad40cec52042f51918229dd8e19595058cd069762a8a0d4e8dd9feab21cb31fa0a557f5e131c643bdef986d7ad5d02fe45ce7f5889792a0e364b5776f8a3624fb0000293093cd8321b120820153e97f36890395179ac4d6a0376ac4f7253988b233faaff0919df0045258800c38d2e83fbacc1eaec45e336aa0dcc6c7173e056fa08fd1967a9dfaded1d3133dd96b876f9afa901fa45e07bfd9a01fb35c15a038bbda6afd540cf3396a9c6ebca35479ecd794e38ca57aa962b6aba0d41ffbd124db9534c357ad8908d3b324170395c381980608ac053c5fd72c4130a0ebfacd5239d919283d3082ba24d8a7e601d2ef005530a26cd533243ba1cd100aa0e5d57e7ab231d26840392f500d6feff0ecd423de4f7692277ba89ccb83b8c5fca086466a5523829c87d540bb08bd632fb8eb3d7549884e00c84eb6e8ff0d5965b0a06b196898c2874c5756ba4e388acc41a86b6dc5f5114f96341ddbdde7a1c7a784a061a300fe3f07508c39b9f23c503f89e77c389be2389305da52cddc87aceab4aca055fc141795501ea6ede95f7e8383776f88474af4183092abce713f30ffdf5058a00e8a492f76c475f258d612894073af63b762dfb0ce19f58cee9ab5dbcd729da0a06572d551070866c6eb9fd99320fc27017a4d5a10989e00191de260cc59b6ea86a0ab842580f5891239a9add6f0cb6e8aaf1c7081b08f29752c8ef56c8c218cf00c80f90211a069055abb2693d9d442e7c992b263238fb8fb2c8cec4af8ca2a3201838f89b7a7a04fd2945e89d5dc6a0f43e0930cdbf5d70abf9c90127a8839b8b07240d912a4d0a0f842f3370180cc30bb6521c12fd42ae2d88bee77e73254a6f239f88469c09c55a05537d33d7d06cc4580f3e7e9d7654ef044da71ace71bdf5baf29966561e45befa066cbbd1fc101198ea2e2690dc8d980c72d33a2f6b820d387adb398a116025c18a0697c9530067e3351e87a7c6e6fbbc2a282febe0b63d229b0f4e292d66a1e4c6fa0f72324a07205eae63e114985fa445800a8285e75a53c3adca0466793eead1840a099cd34991d25321a827556e34d2cd347b589037f2b1bc677f940011b7a1c13d7a07863da67c7f99c4243a57456d4a05ddc066c6c8d8fcb25c8c08f01a10533e570a01197d8ef083352a2d90d88551891b3deab62bc20685978b4d99d5fa14cbfa052a07f34645f90cbf7298dc60c7048e1d352e70dd1dae6f787598b6d1080f49971e8a03272e0642f91eb4501840dcc7e9c436ed63344b11f7f049048bcb1a3a7df2ca8a08a76ffa84b3e9272cb6428d49454038859d457bb204f624599ab579dcfef12dea0e7a55031502f08d2734db4ef7390bf17f44e2b3478d70e9bef809c206f293bdfa0abdfb9de732a5cebbd5c92a5001e65db3dda1ce7253435ba5c5708680e2e7726a0b561a68db428a042a35d754a7a1a9f6ebe8836081f992d3d2de19ccec0a55e4980f90211a0bf2ec407e3de692c31ef7df972caa2a21282902d3c2c7869a0bd44868ccd6af4a0e5e4bacd58a1a934a147638918e4451d160e9ec99647ea7f8852c02e073075c2a0e694ba7072b174c6a6752c02d1ec11d7cd988412bd6c37f07d295fbb7f14756fa0d6c7c0fa4c81d699e045c2a22ba0eb61179e4496804d6c0e592b5047b2993191a0798fddb883c25774fc6d1f51b652b8ea81dd03588410b571767727762c1e4c5aa07a7db1965aa0ad10434a95220de03416e2ddd00d654b33d3dc2ed2f7b8f48d22a0be7ed44c61160c17a7b5a3ca5495bf614f6f640c75b095aa6960c872e233e158a09df22d1f287814d3cb828ecea1120d6a9055254e8164d2cfd8b98c5ae0980ba3a0a674bd1b8aaeccc467b331edcb9af81dd09131866e71d055619e57dad9b6a03ea08faed450b4c2371166de0eb1d7db6d5f1af19bd5fd4e7a0b12681026e7a1cdcba0b11e6cc0bc06f9e2dfebb7fafd410a461394ee3f50ec911c7049a390c9c27845a0d2fde948974177cfbfb25d3009d6cbddb9b4f6892df707546f2c00ba03435ecba04be0d058b041af7ce8807b0ca411360cdee3eb6f0059c906ba5600e8f0587309a0b62c7263e747cbed29cc1658606baddcfff8d9aaaf8e25a0d82bed3850e567c3a087b63a803df5cac69d9c9faf447a1289d8c1cb273faf55337d04dfb4111681e9a0ec352f8139edb0fe592c12d452b32defa9570e2f370f74a5feae7924d5785ce580f90211a0cd95d3ae92f92c6839f0f7435ee60791da5027497cec01dc1f4a199b131a608ea0fc91ae6a7c9106cfc39b0efc92870e9f4c98bb7a20ad21ea3d853f4a831efdbca03e3383dfc994780e7393654e27daf30f26f5f2e86c572360bead1a07b32d22c0a0cd6460eb11a1728f4b0ac2caea14b83a6ca0f54995d7f41a8852d1d234ba57f2a0c7edf11df5fcbc8d6bef9c4d63d71c81a02b7893c57a49c432b9177409509c75a0534bc98a6e093069585cf811762741c8594a6b42828f5ad825929ecd8bfc20e4a0d634fe101ab5770dcb54a80a2b794299b300e1adf9343d1ef26c6cdffbb7f21ca0fd2c5d9a536d366c2fcd145073b3b75672699b1ea55c70fb5075f89e427b6b4aa0b82cb047822a3f3283cbe8eb6ac88d8c71b5beaf47c8c6a3e8ae50780f6dfa8aa0e8c97b53fd657b5511173624dde4f31e239c49df5a98a57e1295029f486c94a2a09cfbcdb21e2d410f156bb467897bf73964a01e6dd5539e6330634b794de649e1a0c6e20f19fdf97cba0c8a21d57b1d33e1c283f4ad93f92fb7d67cace9bd434f90a051691b3625c0367b73aebeb6f94c3b5542bbe0f72aca52277ad31a7af8546ac5a05e104969fb1ccd2b7df5bc5f77af07c4ebfc424f506ce8dd0e164c3880e3ea2ca0034154f8f674659f19216e21203706a8314edcf9700f49249aa0894e502a3bada057616f55e2e620afe5ff22f313d5b6e34cedf4a64fc6163b3e3008bae24d35a080f90211a05c2ede3805ac777d64c232fb113ab67116c8a1f252a5bc401cf9f283e9f7a6c4a07acd632dc59a4bed389f18274a1bed7167eac5777e1a3ed16224130958872632a05eb84506a1607d7521f30a366c1891a54e0e84c22a7c48535c63f74d08fc237fa05c38dd95917629395109aff3e91a0d52a13ad9ac93215a635982dfe51a1169fca04e776df61609acc8780d262ec19ae6b63ae21509f9b913d388bd1b5f1a352ae8a05ce8d36e3e8f3fd39e83e1db3b6369120e3692ad8cfc8e622350c432150d98d1a09fd76ff18b2f067852e1601c76112b4e06755d64c48cdeea021d6efefc8cc5eaa0dac65fc9721f10396a9488adc58e5722527bfba2af0c358a985132fca8faadc3a0c35faa1e275ed56ebecc0b51a8f89e115a7320a3c9823fa9a85e7d7afbb5a6eaa0932f7e0b119160a118e3eb7ed691cac7163ff775eb6e5e163a27904a14b75ecba0c41c5e70289ab77172db9e42bf65ca3a2cca2251f22f5717886a51e5d543ea9ea05d8ef1b1d38448fdbc8a6db86647ac38a4b580950bb7bc33902d82555a8f5dcba004a3dc79b1077e6e8be9bca62507b9004ed350a1095b345222f97095cd804bc4a0f53a5c5a890da2d8fa58c0eeee5e5c8dde92a1472441a514c32f03f5b6487315a03e7cff35eb4e28eeae7b163572950b781920079ccf40206ae4387906bf6327c8a05a1ba0533fe12a4dfc22ecbb2d309d113ed8959a1968b730372a99cd07272ddc80f90171a07d337e717ecd4ce5f45c4ea8994e476ce38cf937a4f2924dc40cfa8fe5870fe9a03f98e9ce6af172ec08481a6bcffb89a264933f90ee288a82144c0eab968e42ffa0eb65ea007c07bc1604264fecd433291c165a1211a8bf8bf6492cc1194fa549408080a04a57ac1163277a820bdae649d632f917b3885a80103654d3216f9409b72525d3a0031868dec233f986dc0afa16d6abf78e22396b0fa4a757f0688380756a844be2a0d3bee690d48173444d679a7ab969cd9199b83ac3de64db3d987dc6aa2ddb06e780a0ccb10237fbb545478774d6e858eb7a1327708de6c205c7195d3a5dacd5961209a0903e3cd41d04b4693e0eae1549f7fe024eb06b98fa1c137cacc66d57a7a0e223a023f24686514302e9b0707775885ba13549bad5e8c8a5464c3d8efd4b8e953d5ea0c329d67971ead7da9f1d222990d9aa6c0f448bd161c0981ef504b1d7292b666180a015234d9ef39b97af083fb5715dd5cc2f4454a23ca3a4d72419cfde3ea918036c8080f87180a0568a3548f0c468bec66c6d91b1d72f84e44373c03c6e118d7edc6ba8fe9b4d0c80808080808080a0ec26e129a6fc11a5dcc748bd22ca4e41a0ace63cbf1cb2de018e2b9585a06fc680a043ce799f2836610d1ae648b51b90bdabc437dd7ca340c1ee8c3e2d71eab6ea268080808080f8669d2092cd7f3f78137497df02f6ccb9badda93d9782e0f230c807ba728be0b846f8440180a09d5704aa434de9751d3bfcf9e720a8eb0464ed2b467bd27af86c0415ac15fa14a0d80d4b7c890cb9d6a4893e6b52bc34b56b25335cb13716e0d1d31383e6b41505", - "0xf90256a06f14ee388c6004c9f591c05cc94509906ebcc57e6ce9d7e65c52aa7da6f530e7a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479495222290dd7278aa3ddd389cc1e1d165cc4bafe5a07604903f485d83bda3b1333e28dec61ff3191fef0423ffce44abe02033b323d3a09c6967c2262b8e5aaf07f422806fa22eed9bd05898a71ef3435eb27e258ed240a061cf3a1b00a7ea8e1b8e4a921dbd9af3c73e9ec8646e9884b7936b74e011e05ab901005d61447fd94d1ba8d69022f0b7891c8486f9ae204a03b3b61bbbc905e371ecd613dfbe02ad85113252082314a8e78d016af918d9afd27030b5b7e890842a2f8058103e8c1640a87cd82c733d21e13afc3ce5e133ddd7fd3180a816dc8bfeeaa516555f3bf2545536b6605c1ea8276edf7d076e9346d88e37e24372bec69daa45caa8fe68c4c5edccefefbf60abaa9abee6106cf1dd25dc4fff490c7bf4b1f47993d733a25880a8170f165ed3bb283d69644fb677d0fd763a07218f66249961719ff37e762cf33f76036277f9c2d9e3d5a2a0b6b70cbfbd548a717143e29e3ef4a0f9b17f9f37bc546d06e5d23e02b3c64e2e542f026cf1d4391ccdf19400dc6d8084013d48a48401c9c3808401476c588466edbad78f6265617665726275696c642e6f7267a00b4078ca7a27f9b2448fa3f32e04a269353f80273e6dc95153458475a84238b98800000000000000008502d39a9e8ea00a7c969c5cab15361767d22966b8c0e507572acd096d3bc87af306be3ceb52138080a077f861b303ce5dd4bd241707d60a82406df608caa18ec241e33b5d5a2de94bc2", - 1, -] -const STORAGE_PROOF = [ "0x9d5704aa434de9751d3bfcf9e720a8eb0464ed2b467bd27af86c0415ac15fa14", ["0x000000000000000000000000000000000000000000000000000000000000000b"], [ "0xf90bd2f90211a0c03ad780fdcff9d8db9c11fb9d1e7e4b7e72ef1e7eb869620b9f8ad84fc2fcbca0affcd853d02392931c090bac4e6daf5d7803bc755efb6f4428844504e56a0824a045b77e35264af8103e562dcf7064f204cc7d97ab329e99afce4734dcd38ebe87a06345cc57a046fe6fde4a96f9b7df705ac96f8945b2bd5fadcb617f87ab56df45a03f0d7ab38aa688d896e5380f34fc7476484c04fcef6dce8fe2fd19f022bd25a1a0f1099114fbade96971fc26d2b7a2822a55ec504b69befda54d658f99afe1e58ca093c6cb05b60356a08b2ceaea7535aa0dbe0c7caf772f9a3220c9e5f17c7592b2a0c6204dc22d4f391abd77861423f3d6cd97f9fb7c2462508c1125527b50e6ca43a0a79c861c69ea5078802d04cbe0b930db2d4bdeb979ab67729c53cf9ab4aa59d3a0784e0c317729503c1212a4fd4db192bc80efe07ffc88ded9bcfc86ac2087b103a019130bf59eede0e5aafd47c1c71fc61fe989f61b4fb948d0c85db13fd6d8dfa8a0245cb0c02898fd4305783b3e4fb036ee39ab471edf5ee8108e971cedb6e2d2a5a0693c76ef03bd97763cffd1bdefb70739c94dac6480502629c83697ead422d5f6a0333cd43acdce2a4b07662fda6fd7c8c3762a0a862df5e6ddda4bace3977c55d2a051abc316d294b1d3d741fdc30ff307fc2cbcab494e74b0c87263ffecd15e5f8da04c586b6f986d28a9553494ecae5cfd6caee098a27c79d273cbdfe7b90bca613a80f90211a09543463b5652bf35a17b7a000ecdef6a09d92c0b6a294ef292706322a643ac87a087c898c7a105f122e4c2b387cabc1b62e79e673e8360872ff8154e27e2a97030a0d8cd06b11d80236ab5377ba55d89efda25a193ca125cb4a3865dd3a853477f1ca0255ccaa30d3fff8ad7d6f958fa965264f8e018d956777ba51538d0e4c1b0d0c8a0816b5b6951cfa8b2d2bfb5b477c633431fa48f3e1712f458f8644ca3b6eef807a0dae819a79bef60b8f4426e82413b2ef4c7ab5ba30ef2e66c9bc2a8bd96de660aa0457e691dbcdeedb4e8d04b48af40029f8d7ad6d99c47696234bc21921c44f47ea00dc6631d7c767e55f3581285a12a7d1bf4aafcd95a471801c885a380b11f20b3a04d949d428a282b3a1a2b6a14e356a1eda9a768d6a50eab1f49f74426a27d3063a0ae7d76fbf7178842db7758faf0360923cd0192cd6db31dc4fd71020478496605a0659e1bd5e68ac0cb78094135200440a255ea1cf5c77575eefb38d9582e03f7e6a0bb66ef993a8e694c33d65aaa7c7920c0fea2569d48392775ce6824fc5db2ffc1a00da42a0f939cc889db93be6467b5687ea1b0e185b612fe11c8b1e0f11bbbbfc7a0c8e46c9aad59802b44569997e7deace74923242b1d0f35871ebc71f7b800d53fa02d22f23e78308978f03da3fc1d30936772d871f03ae8b89e03ee0a5ec1bd9afba0feb114b06e556ac52b7494821e3ed4af5fceed2d0e98b3629abb77b0b7d5352f80f90211a09f1c2b89b4d5b29b3a5e7e4613897363f56a7706c0c48e595129326231357264a06043940ace31b3b2d2f36f526abaeed64cf196f60f752a950a603924bb1be8d1a0a7fea554f16521774b2658a882d9ce0eca1567e34a2ed6bb6a1b8861b984d1fea0f3683ecac011ff970866f63fdbad0b563301300e7f58a00e41cef674aa896d14a06440b5f591a4cb03ea6bbb4cca6b327f8b1e5684983cc171992b43a0e7d7f65aa084570b151819d27b0a0bb8b0f2231ed3a75f082a7da2fbb121b9bf83257265d8a007f572f57dc18a840b9ae7cc983d0d27c1332634711808b57e6bb6af9ef4df38a0c2dd894af0e1c66e6f1337afbb951fc7af4a954e0951e5cabd485f1c22919992a0e214cd8efa8cda96f46b320edba3c8a02a9695ca635f14cbd56c9941c39db758a06fb5032e8727fb0cfb51e6a21c2acb2ad7f25e452001ffa495ce5cd284391531a051950f31467943085f0dbef1856469a16c86174be86b17223a2f66c3a956c897a012189d14af2ef21047ceb340372c71a9a9f2842c25621b292d1458bd876b61a5a013c85fa14ffee57ef1a31e99586ae65d31d65a033c3190cda0734e5389fe9f75a04d8c8815af221c1e6c9cfcd4f736e78266277e324fee0ab92923edd59b55b9dea069819278c8af35925eeb650c2245b03e7ce93cfd595c6f9dbc98a373f0d0918fa0761df9767bb3079f512bbf47390aab6f8ddfaf81d6f8ea6ef986d6b902e5d31580f90211a02a6e912cd7f8e31035d3fe8c65a5d3287288d3888ce9657c250bb70a9f258104a0676c3257a7c90a1c32ca4976f151bc538cc16199598c3640555eddc1b9a1c2d0a0cea107052cadf545b10283abf0e1a1ef92a8e8c56a8bf2764db3adbee2230623a07c0f9c98c9b84dfb73496a3cf6c34e1133733081cf0a0e64688d102384f721b3a03492e8538a07a6d7dd2963848db053b1c9654c41e21970d6172f6148fca2cbdfa0d83c4627c93c8b8086c3cd2f7fb09536f4ec239adb2b8ae47e428565c15df5afa0265456add4ff87a819f9d5e923371a9658b74e182d8cfb4769e4e8ff9a7cfdd6a091836c477ef0ce3b69e2e0fa6737e34b4a9092760194a3942aaa6d9a1426cfcfa0367e3c9c841827130d8a22731a6cf15958419a9a837dec1ff9a5395eee9ca99aa0db5f0ddada06d9b484e627e8c31a0444e6a64cfa854a0f783e748f68d80a5efba06069b95e3007d5e3bb25d747dc182c887edeade46fa1f2af5d49c9f429ed3774a0db2bd955de5a76983c319fbe51078cac6017881efc95848f0b6ae1988e7c7d0ca02efcef46816edd03f8bcefcefd783d277664b7abe8c5ddc33e78be5cd5e6167ba009887381ab79a3d44ae562b50dee905977ad5bef838b4a01a2e517fd8a3c7201a0b2c52c74f392745edf96414cda66a0526137892b5b560a1eca2551846a7c3866a0bdf88d8c1eb3b4f04b953cc617fbba4f2cd1f0c8bb5a56d0f8f279906d6c7d1e80f90211a0418dede3094af4ae5dd26bcb2b04b8b93a9629791d0177516ee6eac134913e0aa0d572368fac7f59ed1437eef4e05554240411abdc8d58c9e8a0e69c2ac30e744ca0980dcafe038e6ea00b8dba7f94c00ea7456ca08d33878c5c44eef7aba61e901ba0f11f693a54f600be4c64f629f1adb22e7de19ac4efde0911ad25cdc767f6dd1da0e1d250c658a7e98e9a84a00da24301347b6880623cc18034b64584efc06c8e49a0809bfed983cf0524e9ff9b4d7bebe105c663b86d4d95f22fe10345b8ac5e200da043f972b6cc2c44ee5f938199dc160b6ca45eda33fe6134fc8731ada7afb78c32a0d24fcc49261e0f659da6adf3ac6351d7c63d7036a5daf9008ccf8e4d79471bc4a0b3190bfedfddf6778deb8f6345be065957194059cf2040eb4261179c9d1ec9a8a07c3ab66333c79466723e5c6055af19a230d2458e9c1f26f69b08e75d9da8ee54a07cd533f3e86ebea9db73b369cd600c4447d92c2d39d798592b99ffafc31b1f5ea07d0534f7e52a7fd27cd414a0022aaa41c3d4f7ce2568fb96639547d3f25cd05aa0fc7b7dc4d0bd28c4212506c9e612800055f3583261e5caa3b4ec610cf9d7db59a0d52f467c81d11f310bb30a8528fd17431cde3eadffa00b86210470417bfb639ca0cce498a31fb06a8f747d686239b4f19dca239e40a378ce3b1f4006a2c7c868c8a013b6449f54a457c8c77708607c6069ba0ce972506f8b072dbe9d3fd931cd80bb80f8f1a096123db9192b6e29db6392ffc7aa5c5046aa0b12e40b688a6b7e1e88708c02d680a0791e7aec5e64bdfac85657e2f10178a82b807dd63027f89f8198a370311a8e31808080a064be38fc87a5208da02a2fa8d4ddc157d638e1ccb1b5805e9fdba41f151c4f6da0f40558ac68cb73d0693fa2db6bd93872fa83b2701fe026807404a55ebbf8faab80a0f7092e0007e47b1540b721877b90d3d98bf64de2948f04babab4192b0c5d450480a009157b7e154898d356b10d07e537d0aadbd30107069d303ad338367e499f7a14808080a0ffe5b78204edd7eead9d2bc2ad2cafec2450430e935ef6fd60935574f0e314c280f85180a00ccd6b1b6d7601266f939979a810d4c42b8cf6676f25778055a23bda076cfbeb8080808080808080a090b0f4c1f8207b6ec8f25d82ec3cd1309e040cae7813ace30a038494e98442bb808080808080e79d3638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db988875e336081790c4c", ], - "0xf90256a06f14ee388c6004c9f591c05cc94509906ebcc57e6ce9d7e65c52aa7da6f530e7a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479495222290dd7278aa3ddd389cc1e1d165cc4bafe5a07604903f485d83bda3b1333e28dec61ff3191fef0423ffce44abe02033b323d3a09c6967c2262b8e5aaf07f422806fa22eed9bd05898a71ef3435eb27e258ed240a061cf3a1b00a7ea8e1b8e4a921dbd9af3c73e9ec8646e9884b7936b74e011e05ab901005d61447fd94d1ba8d69022f0b7891c8486f9ae204a03b3b61bbbc905e371ecd613dfbe02ad85113252082314a8e78d016af918d9afd27030b5b7e890842a2f8058103e8c1640a87cd82c733d21e13afc3ce5e133ddd7fd3180a816dc8bfeeaa516555f3bf2545536b6605c1ea8276edf7d076e9346d88e37e24372bec69daa45caa8fe68c4c5edccefefbf60abaa9abee6106cf1dd25dc4fff490c7bf4b1f47993d733a25880a8170f165ed3bb283d69644fb677d0fd763a07218f66249961719ff37e762cf33f76036277f9c2d9e3d5a2a0b6b70cbfbd548a717143e29e3ef4a0f9b17f9f37bc546d06e5d23e02b3c64e2e542f026cf1d4391ccdf19400dc6d8084013d48a48401c9c3808401476c588466edbad78f6265617665726275696c642e6f7267a00b4078ca7a27f9b2448fa3f32e04a269353f80273e6dc95153458475a84238b98800000000000000008502d39a9e8ea00a7c969c5cab15361767d22966b8c0e507572acd096d3bc87af306be3ceb52138080a077f861b303ce5dd4bd241707d60a82406df608caa18ec241e33b5d5a2de94bc2", +] + +const PROOF_WITH_ANCESTRAL_BLOCKS = [ 1, + 20793508, + "0xf90256a06f14ee388c6004c9f591c05cc94509906ebcc57e6ce9d7e65c52aa7da6f530e7a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479495222290dd7278aa3ddd389cc1e1d165cc4bafe5a07604903f485d83bda3b1333e28dec61ff3191fef0423ffce44abe02033b323d3a09c6967c2262b8e5aaf07f422806fa22eed9bd05898a71ef3435eb27e258ed240a061cf3a1b00a7ea8e1b8e4a921dbd9af3c73e9ec8646e9884b7936b74e011e05ab901005d61447fd94d1ba8d69022f0b7891c8486f9ae204a03b3b61bbbc905e371ecd613dfbe02ad85113252082314a8e78d016af918d9afd27030b5b7e890842a2f8058103e8c1640a87cd82c733d21e13afc3ce5e133ddd7fd3180a816dc8bfeeaa516555f3bf2545536b6605c1ea8276edf7d076e9346d88e37e24372bec69daa45caa8fe68c4c5edccefefbf60abaa9abee6106cf1dd25dc4fff490c7bf4b1f47993d733a25880a8170f165ed3bb283d69644fb677d0fd763a07218f66249961719ff37e762cf33f76036277f9c2d9e3d5a2a0b6b70cbfbd548a717143e29e3ef4a0f9b17f9f37bc546d06e5d23e02b3c64e2e542f026cf1d4391ccdf19400dc6d8084013d48a48401c9c3808401476c588466edbad78f6265617665726275696c642e6f7267a00b4078ca7a27f9b2448fa3f32e04a269353f80273e6dc95153458475a84238b98800000000000000008502d39a9e8ea00a7c969c5cab15361767d22966b8c0e507572acd096d3bc87af306be3ceb52138080a077f861b303ce5dd4bd241707d60a82406df608caa18ec241e33b5d5a2de94bc2", + 20793506, + [ + "0xf90256a06f14ee388c6004c9f591c05cc94509906ebcc57e6ce9d7e65c52aa7da6f530e7a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479495222290dd7278aa3ddd389cc1e1d165cc4bafe5a07604903f485d83bda3b1333e28dec61ff3191fef0423ffce44abe02033b323d3a09c6967c2262b8e5aaf07f422806fa22eed9bd05898a71ef3435eb27e258ed240a061cf3a1b00a7ea8e1b8e4a921dbd9af3c73e9ec8646e9884b7936b74e011e05ab901005d61447fd94d1ba8d69022f0b7891c8486f9ae204a03b3b61bbbc905e371ecd613dfbe02ad85113252082314a8e78d016af918d9afd27030b5b7e890842a2f8058103e8c1640a87cd82c733d21e13afc3ce5e133ddd7fd3180a816dc8bfeeaa516555f3bf2545536b6605c1ea8276edf7d076e9346d88e37e24372bec69daa45caa8fe68c4c5edccefefbf60abaa9abee6106cf1dd25dc4fff490c7bf4b1f47993d733a25880a8170f165ed3bb283d69644fb677d0fd763a07218f66249961719ff37e762cf33f76036277f9c2d9e3d5a2a0b6b70cbfbd548a717143e29e3ef4a0f9b17f9f37bc546d06e5d23e02b3c64e2e542f026cf1d4391ccdf19400dc6d8084013d48a48401c9c3808401476c588466edbad78f6265617665726275696c642e6f7267a00b4078ca7a27f9b2448fa3f32e04a269353f80273e6dc95153458475a84238b98800000000000000008502d39a9e8ea00a7c969c5cab15361767d22966b8c0e507572acd096d3bc87af306be3ceb52138080a077f861b303ce5dd4bd241707d60a82406df608caa18ec241e33b5d5a2de94bc2", + "0xf90257a034c4cec5ba48eef207f01dace9b74648f75423b99274d285eb51a28ea45a7746a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347941f9090aae28b8a3dceadf281b0f12828e676c326a017cb8d562b6da86b898d1579f2c0252ca4fc673ddbece39b0181fe6341dbfbb1a0ae9cf403fc193494aabb363f25427aa1adfe15793abe5765d28b0b1537e0900ba0b950d9ad9c7de4e5bd031c14c6d3afd38f1639e1db56590c6abafacae1e8be9bb9010055b5d41511013102900308208e003834d0c002308b480102a0a90901861621a7664ca1054060d40153aa1b99d74229a5c69380c489626d9027c9635a8d3ba580ed1ddc2810e5ef3f788ac929c12470b06160a08901404f2232ac9d42d9fa0785854040174adb01b6a3dd900ac9098e9d842ee6f52e148f0aba80cab721886001aa28bbd6804c7783a158856d63745f924614c4e1cd398c2a6525247746f4116aeb2021e09a52a018635202c32e2dce22379b9d05caf5986b252e4e0c401a11595d31264220a8210f01132022d6695481a4a02847113ce09583c7220200c6603891f33e680597a840000416a199101be82c29d000738c21d03c3b99150db214078084013d48a38401c9c38083b3f8218466edbacb917273796e632d6275696c6465722e78797aa034169fa758cb3cb5d38e8c22af9b88c525474253da05ca76b683f0c6ef922cee8800000000000000008502e776c769a01c91a492ffa0281242fdcb78078b290d5b055505d1872498d611f8cf295496818080a0686d3a40a3dd6df623831fd87b3c54877f9717001c997f9f9e1758c864df5634", + "0xf9025ba03f60781072e20bd526b224ff426c9784c24a949e977ad855585fc76c897d509fa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479495222290dd7278aa3ddd389cc1e1d165cc4bafe5a021c619739b6e81e67572203fb27f00c390e605a6fef0fe41c59f226853b082aba050885bd6330e2d1e68c236f561bcea587cfde066214e1fd0ca396d5574685a1da00f98eb31cf5b863de6be609e3389a276cdd0f5247ab142bba2210bcb5133d7d7b9010013f1cd759bd4d129b3bc004786899411332acb21690da0fe8cad091d3a35e08220c245663a4a52b01e4cda40d80f2fc1d2ad9988a862ee76672c504a032fc546d78187483ae99a39f89bd13ebde02ab494a3b071ed61dda0ac304eeaf83ac988d55bb445077b71e2a0c8c08d29496a11223b0387e5150c3620059c7c688dd1554a091f5492678d624c6d916063e43956c49dc589cd61013a60a345c7e1f65622bbbc4b9d5419e000ab03b6ef3ce98e82855d2f2748e6820988478101217e81ade1532542a5d11f555011218feb43548f47eb67c742392c7439c70e5be26174b5e5f32cfe83956d41a88413c522f2cfb0febf952d59b816e98a595fa1a18396e58084013d48a28401c9c38083d4d7678466edbabf8f6265617665726275696c642e6f7267a06f3f13b39fc3605558c21368794faf69b5edc4639f5f191fedbb9145f547fd7e8800000000000000008502ee08d0f0a0c3da7cb220020e2b5c78854d4e0822ed99dfeb75ff41a4066cd5c7b27e8943f88302000083040000a0f5decec30ba81918d464d9692fd3e0660f0f0247714899e77787b9b3e2fb2263", + ], + "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", + "0xf90ec7f90211a04e2dd65efb0d9607a296f28b3dd94f39a578c184666ef8d727fa63c76d148687a0d55b95f7f6aefb7c0fb426f00d56734d7f007bfe4dd2c0d8092fa2b208d09093a054192f1ff9b05f44fec83a04e1a5fe931bea4dc6b5ec5d2602913703ea6a07cca078b91156d5454c5dd573c69204ce1398ec8c3dd0e45775f68911d6f9ab8c29a1a062432b56e1ffdacf09220dfedec7653c08a25f35541eafe5a4ba446055a2688ca01f3989ce4cbe571ec9302b2d9fe9a15173e0fb2d52a56202c62ae625f866e8baa0174580c5a75d5d3995935cb44167a0934933e5ce5e14d21a561de586f6ce653ea0ec79240946967dbb5d9da7382ed150f3be16f62292945ca0751ff1e32343fef8a0a2787abbbfed2a5da4d30723ad082a5718aa6e7362a8134b67c4b37560427f23a057075abee0343f47830abe373793fe23659ad6eefacaa843aa8ef9c5f6ea557da027f67977f7b290dabcdaacd2bcb1469b47d378f8d971d5765ad9291a11e694aea0170edfddff726fdcfb87c69f0502860b8371e3f7bad1676f2223ebe396e84a00a0eb6af128e434b15a3c3df104d002f681c005bbb9d5c37390d1c0fe86af6cff6ea05b1b49e7b117588637f33ff16d964a833d2dc255e88981517b1c0f13cf3a27cba0a9c96e294dd5075d7321aa3b13f5d53622b2b9b7c580e391421c6b439f40270da09a969c19da8ade8a3b75bfd7d5bf9b488df9a0ea57e0a46719df6edcfeed76f480f90211a0b1e1c23b13cb58bd674fc077f21df540d3c768f717e219ca754da4eb5b4d94fda040422a936c16b3171c6b3e1d5f12acef9f0f51f5533b72f2fba7d372bfc487baa02d4500ba18bc39133662aa3f327eec10de7d0b4e24f05ee36cdc531694344d84a08c3a78f4ca554b3e4555632f6b29798f2ab382c6db3a7be5915a55e7fcc1bc8ea0382700d7458e3dab087bee5332653247f36ece4d658c326bbabc8e15cc1e92f4a083476fe0a219dd7a21a22f84422b52679faaab28fe1192d34e924aea0c3c1cd8a0ec17d9570c2578a231fca5bf987ba84b6d7b87648395809a1f0d5b0b08dff88aa02979dd8680c706b2e35c0c6be158ab1337420f09ae0aeb80444fe188240206c6a034139646c5d904b67ddf812c410621513e254136c960d6b12654372dc4364dc2a0fcdca3e062628e0a390cf5739e5993870f329ea13a62f9cc220c4e24405f7d91a0f19bc59e7a6c7d164154aa0e5d8a8ab2e7b9fe5063b3a5cce2226d6069c93496a0196b6dbfceddfde56d1dda14450513bc50e48aade0d3c0a487881877f2e562f9a042cf0e4abfce18d69f82fa9b12a284b48ab5b4ed0826893949de2705c12942e1a0a63ea52c0bf0af41783af33ba5ceb103e70d7922405b684d13470b67ba3a7259a007670fcf47b9800a1befc7824556568a559bb18b4b48bee7b046ffc5bcb7ccd6a061f9eef107c8d685c31cde5e51f3cd1b1f213a40e315f0923c6f6f6001f11bff80f90211a0e96698ba1725436c90a88087c88e145b904fb6a870bef4f71ca8fc355e21ced2a04fd2945e89d5dc6a0f43e0930cdbf5d70abf9c90127a8839b8b07240d912a4d0a0f842f3370180cc30bb6521c12fd42ae2d88bee77e73254a6f239f88469c09c55a05537d33d7d06cc4580f3e7e9d7654ef044da71ace71bdf5baf29966561e45befa066cbbd1fc101198ea2e2690dc8d980c72d33a2f6b820d387adb398a116025c18a03236f887fdd3785ccad080b67d65a1ecb0f47feb1734eee22485afc146e35b40a0f72324a07205eae63e114985fa445800a8285e75a53c3adca0466793eead1840a099cd34991d25321a827556e34d2cd347b589037f2b1bc677f940011b7a1c13d7a042de65b70fd2f9d52f6d3b3a19621ed6b18590d35c4361b44f463f6cded27beda01197d8ef083352a2d90d88551891b3deab62bc20685978b4d99d5fa14cbfa052a07f34645f90cbf7298dc60c7048e1d352e70dd1dae6f787598b6d1080f49971e8a03272e0642f91eb4501840dcc7e9c436ed63344b11f7f049048bcb1a3a7df2ca8a08a76ffa84b3e9272cb6428d49454038859d457bb204f624599ab579dcfef12dea0e7a55031502f08d2734db4ef7390bf17f44e2b3478d70e9bef809c206f293bdfa0abdfb9de732a5cebbd5c92a5001e65db3dda1ce7253435ba5c5708680e2e7726a0b561a68db428a042a35d754a7a1a9f6ebe8836081f992d3d2de19ccec0a55e4980f90211a0bf2ec407e3de692c31ef7df972caa2a21282902d3c2c7869a0bd44868ccd6af4a0e5e4bacd58a1a934a147638918e4451d160e9ec99647ea7f8852c02e073075c2a0e694ba7072b174c6a6752c02d1ec11d7cd988412bd6c37f07d295fbb7f14756fa0d6c7c0fa4c81d699e045c2a22ba0eb61179e4496804d6c0e592b5047b2993191a0798fddb883c25774fc6d1f51b652b8ea81dd03588410b571767727762c1e4c5aa07a7db1965aa0ad10434a95220de03416e2ddd00d654b33d3dc2ed2f7b8f48d22a0be7ed44c61160c17a7b5a3ca5495bf614f6f640c75b095aa6960c872e233e158a09df22d1f287814d3cb828ecea1120d6a9055254e8164d2cfd8b98c5ae0980ba3a07b2a7326dd534fa1cca70216e1eb0f1523a71258a42e4e8bd605da79388e88f4a08faed450b4c2371166de0eb1d7db6d5f1af19bd5fd4e7a0b12681026e7a1cdcba0b11e6cc0bc06f9e2dfebb7fafd410a461394ee3f50ec911c7049a390c9c27845a0d2fde948974177cfbfb25d3009d6cbddb9b4f6892df707546f2c00ba03435ecba04be0d058b041af7ce8807b0ca411360cdee3eb6f0059c906ba5600e8f0587309a0b62c7263e747cbed29cc1658606baddcfff8d9aaaf8e25a0d82bed3850e567c3a087b63a803df5cac69d9c9faf447a1289d8c1cb273faf55337d04dfb4111681e9a0ec352f8139edb0fe592c12d452b32defa9570e2f370f74a5feae7924d5785ce580f90211a0cd95d3ae92f92c6839f0f7435ee60791da5027497cec01dc1f4a199b131a608ea0fc91ae6a7c9106cfc39b0efc92870e9f4c98bb7a20ad21ea3d853f4a831efdbca03e3383dfc994780e7393654e27daf30f26f5f2e86c572360bead1a07b32d22c0a0cd6460eb11a1728f4b0ac2caea14b83a6ca0f54995d7f41a8852d1d234ba57f2a0c7edf11df5fcbc8d6bef9c4d63d71c81a02b7893c57a49c432b9177409509c75a07324b4b201e204754c986ba7a4408b46cf64dcccf965a44d3a7da7ac286a0bcca0d634fe101ab5770dcb54a80a2b794299b300e1adf9343d1ef26c6cdffbb7f21ca0fd2c5d9a536d366c2fcd145073b3b75672699b1ea55c70fb5075f89e427b6b4aa0b82cb047822a3f3283cbe8eb6ac88d8c71b5beaf47c8c6a3e8ae50780f6dfa8aa0e8c97b53fd657b5511173624dde4f31e239c49df5a98a57e1295029f486c94a2a09cfbcdb21e2d410f156bb467897bf73964a01e6dd5539e6330634b794de649e1a0c6e20f19fdf97cba0c8a21d57b1d33e1c283f4ad93f92fb7d67cace9bd434f90a051691b3625c0367b73aebeb6f94c3b5542bbe0f72aca52277ad31a7af8546ac5a05e104969fb1ccd2b7df5bc5f77af07c4ebfc424f506ce8dd0e164c3880e3ea2ca0034154f8f674659f19216e21203706a8314edcf9700f49249aa0894e502a3bada057616f55e2e620afe5ff22f313d5b6e34cedf4a64fc6163b3e3008bae24d35a080f90211a05c2ede3805ac777d64c232fb113ab67116c8a1f252a5bc401cf9f283e9f7a6c4a07acd632dc59a4bed389f18274a1bed7167eac5777e1a3ed16224130958872632a05eb84506a1607d7521f30a366c1891a54e0e84c22a7c48535c63f74d08fc237fa05c38dd95917629395109aff3e91a0d52a13ad9ac93215a635982dfe51a1169fca04e776df61609acc8780d262ec19ae6b63ae21509f9b913d388bd1b5f1a352ae8a0a637355fb9d52d16cae8522e1a11af232bde97b2aae1524e2d6b4cba1669f3b2a09fd76ff18b2f067852e1601c76112b4e06755d64c48cdeea021d6efefc8cc5eaa0dac65fc9721f10396a9488adc58e5722527bfba2af0c358a985132fca8faadc3a0c35faa1e275ed56ebecc0b51a8f89e115a7320a3c9823fa9a85e7d7afbb5a6eaa0932f7e0b119160a118e3eb7ed691cac7163ff775eb6e5e163a27904a14b75ecba0c41c5e70289ab77172db9e42bf65ca3a2cca2251f22f5717886a51e5d543ea9ea05d8ef1b1d38448fdbc8a6db86647ac38a4b580950bb7bc33902d82555a8f5dcba004a3dc79b1077e6e8be9bca62507b9004ed350a1095b345222f97095cd804bc4a0f53a5c5a890da2d8fa58c0eeee5e5c8dde92a1472441a514c32f03f5b6487315a03e7cff35eb4e28eeae7b163572950b781920079ccf40206ae4387906bf6327c8a05a1ba0533fe12a4dfc22ecbb2d309d113ed8959a1968b730372a99cd07272ddc80f90171a07d337e717ecd4ce5f45c4ea8994e476ce38cf937a4f2924dc40cfa8fe5870fe9a03f98e9ce6af172ec08481a6bcffb89a264933f90ee288a82144c0eab968e42ffa0eb65ea007c07bc1604264fecd433291c165a1211a8bf8bf6492cc1194fa549408080a04a57ac1163277a820bdae649d632f917b3885a80103654d3216f9409b72525d3a0031868dec233f986dc0afa16d6abf78e22396b0fa4a757f0688380756a844be2a0d3bee690d48173444d679a7ab969cd9199b83ac3de64db3d987dc6aa2ddb06e780a0ccb10237fbb545478774d6e858eb7a1327708de6c205c7195d3a5dacd5961209a0903e3cd41d04b4693e0eae1549f7fe024eb06b98fa1c137cacc66d57a7a0e223a0cd4b12759fdc60c51a4b922a20f065834e03d03e09830c4147f04a9c69a95d8fa0c329d67971ead7da9f1d222990d9aa6c0f448bd161c0981ef504b1d7292b666180a015234d9ef39b97af083fb5715dd5cc2f4454a23ca3a4d72419cfde3ea918036c8080f87180a0568a3548f0c468bec66c6d91b1d72f84e44373c03c6e118d7edc6ba8fe9b4d0c80808080808080a0ec26e129a6fc11a5dcc748bd22ca4e41a0ace63cbf1cb2de018e2b9585a06fc680a0d2a1c6f36ed0a7a00f11bf9afff2708629a67b24503f3b363f7ba8f6e92d56998080808080f8669d2092cd7f3f78137497df02f6ccb9badda93d9782e0f230c807ba728be0b846f8440180a0c7ccbddc2f91003ca8c7fbbe8fee23d7b237e674e0b450dfdec1a599d01bfc26a0d80d4b7c890cb9d6a4893e6b52bc34b56b25335cb13716e0d1d31383e6b41505", + "0xc7ccbddc2f91003ca8c7fbbe8fee23d7b237e674e0b450dfdec1a599d01bfc26", + ["0x000000000000000000000000000000000000000000000000000000000000000b"], + [ + "0xf90bd2f90211a09c966cba08b48e2cc2ed57c1b6d00b444fe2ba9d8f60d8762301e144519d70d8a07a20563343d31d105dd310428d48d1e720bd8a8db6d1d05a22a348b15f1e05e3a03d6146acf162ed187d09d80feeb95362da7a7a7b6b8d87fa0a2fb0241ecbbef6a0eb5cfebf0e4b38f44fd7e96b0f9ec47331ea2b4a001a0aaf15d4feaaaadce88ca0926045992c215e47c38cd774e959c2d7efa181eb7093ef36304cedf107141a90a0b9cb56f9c62c50301c5f6713bc940d15211461a217b0876ebab27cb0b2f35fd2a093c6cb05b60356a08b2ceaea7535aa0dbe0c7caf772f9a3220c9e5f17c7592b2a09e79768e342883191f23ef8fe1a21340fd6f07ac9a3440c5f0a21ecd9e813644a02892cbc44dfe072cb0e866da22cd4bf4241d114a5b1ae00055c3886c4c4ead34a0aaf72e8900c424cbdeb571ea949b4288c7f4f61bdb4ce0ef99a83b4daa068bf3a01aeab78ac9953290def2ad7fd0565ff7299664acb1935f885d9067353e37de5ba0ce477877ffc68b67bdbcd54c77b989c2c892166b03eb5e3735c784450207309ba0e66eac37d87951fa18609fbd7a2b9a8dc30978f319111f1c776128bcf818e73da0ebc519dab9974f968f447306a7345cf935f35afb8e1cae12841cc88da280d6caa051abc316d294b1d3d741fdc30ff307fc2cbcab494e74b0c87263ffecd15e5f8da04c586b6f986d28a9553494ecae5cfd6caee098a27c79d273cbdfe7b90bca613a80f90211a09543463b5652bf35a17b7a000ecdef6a09d92c0b6a294ef292706322a643ac87a087c898c7a105f122e4c2b387cabc1b62e79e673e8360872ff8154e27e2a97030a04391745b2de8244bb89668e063e02e1fe560d6f18bae7040cd39a2dbff00e854a0504749aae80971dd3f209b0fa20449fdbdb67a172464ed27998563c9cf2652e8a0816b5b6951cfa8b2d2bfb5b477c633431fa48f3e1712f458f8644ca3b6eef807a0dae819a79bef60b8f4426e82413b2ef4c7ab5ba30ef2e66c9bc2a8bd96de660aa0f54fdb49115bb4763d4b0a9d523c258e5968b1353d4a6376430c57a65ad435e2a00dc6631d7c767e55f3581285a12a7d1bf4aafcd95a471801c885a380b11f20b3a04d949d428a282b3a1a2b6a14e356a1eda9a768d6a50eab1f49f74426a27d3063a0ae7d76fbf7178842db7758faf0360923cd0192cd6db31dc4fd71020478496605a0659e1bd5e68ac0cb78094135200440a255ea1cf5c77575eefb38d9582e03f7e6a0bb66ef993a8e694c33d65aaa7c7920c0fea2569d48392775ce6824fc5db2ffc1a036265bfb9bc8dccce5fc1537f3e5190a1ed3db823ec18c6165c3cf374c57bd22a0fb55edb852ba28975303dae1f5189ead0f3c54282362abae1fe9abe9cfa6be39a0b7fcec0ee5f033bcb2067d6e80bca5064422d1891ad54c5e035f1b913802ae47a0feb114b06e556ac52b7494821e3ed4af5fceed2d0e98b3629abb77b0b7d5352f80f90211a09f1c2b89b4d5b29b3a5e7e4613897363f56a7706c0c48e595129326231357264a06043940ace31b3b2d2f36f526abaeed64cf196f60f752a950a603924bb1be8d1a0a7fea554f16521774b2658a882d9ce0eca1567e34a2ed6bb6a1b8861b984d1fea0f3683ecac011ff970866f63fdbad0b563301300e7f58a00e41cef674aa896d14a06440b5f591a4cb03ea6bbb4cca6b327f8b1e5684983cc171992b43a0e7d7f65aa084570b151819d27b0a0bb8b0f2231ed3a75f082a7da2fbb121b9bf83257265d8a007f572f57dc18a840b9ae7cc983d0d27c1332634711808b57e6bb6af9ef4df38a0c2dd894af0e1c66e6f1337afbb951fc7af4a954e0951e5cabd485f1c22919992a0e214cd8efa8cda96f46b320edba3c8a02a9695ca635f14cbd56c9941c39db758a06fb5032e8727fb0cfb51e6a21c2acb2ad7f25e452001ffa495ce5cd284391531a051950f31467943085f0dbef1856469a16c86174be86b17223a2f66c3a956c897a012189d14af2ef21047ceb340372c71a9a9f2842c25621b292d1458bd876b61a5a013c85fa14ffee57ef1a31e99586ae65d31d65a033c3190cda0734e5389fe9f75a04d8c8815af221c1e6c9cfcd4f736e78266277e324fee0ab92923edd59b55b9dea069819278c8af35925eeb650c2245b03e7ce93cfd595c6f9dbc98a373f0d0918fa0761df9767bb3079f512bbf47390aab6f8ddfaf81d6f8ea6ef986d6b902e5d31580f90211a02a6e912cd7f8e31035d3fe8c65a5d3287288d3888ce9657c250bb70a9f258104a0676c3257a7c90a1c32ca4976f151bc538cc16199598c3640555eddc1b9a1c2d0a0cea107052cadf545b10283abf0e1a1ef92a8e8c56a8bf2764db3adbee2230623a07c0f9c98c9b84dfb73496a3cf6c34e1133733081cf0a0e64688d102384f721b3a03492e8538a07a6d7dd2963848db053b1c9654c41e21970d6172f6148fca2cbdfa0d83c4627c93c8b8086c3cd2f7fb09536f4ec239adb2b8ae47e428565c15df5afa0265456add4ff87a819f9d5e923371a9658b74e182d8cfb4769e4e8ff9a7cfdd6a091836c477ef0ce3b69e2e0fa6737e34b4a9092760194a3942aaa6d9a1426cfcfa0367e3c9c841827130d8a22731a6cf15958419a9a837dec1ff9a5395eee9ca99aa0db5f0ddada06d9b484e627e8c31a0444e6a64cfa854a0f783e748f68d80a5efba06069b95e3007d5e3bb25d747dc182c887edeade46fa1f2af5d49c9f429ed3774a0db2bd955de5a76983c319fbe51078cac6017881efc95848f0b6ae1988e7c7d0ca02efcef46816edd03f8bcefcefd783d277664b7abe8c5ddc33e78be5cd5e6167ba009887381ab79a3d44ae562b50dee905977ad5bef838b4a01a2e517fd8a3c7201a0b2c52c74f392745edf96414cda66a0526137892b5b560a1eca2551846a7c3866a0bdf88d8c1eb3b4f04b953cc617fbba4f2cd1f0c8bb5a56d0f8f279906d6c7d1e80f90211a0418dede3094af4ae5dd26bcb2b04b8b93a9629791d0177516ee6eac134913e0aa0d572368fac7f59ed1437eef4e05554240411abdc8d58c9e8a0e69c2ac30e744ca0980dcafe038e6ea00b8dba7f94c00ea7456ca08d33878c5c44eef7aba61e901ba0f11f693a54f600be4c64f629f1adb22e7de19ac4efde0911ad25cdc767f6dd1da0e1d250c658a7e98e9a84a00da24301347b6880623cc18034b64584efc06c8e49a0809bfed983cf0524e9ff9b4d7bebe105c663b86d4d95f22fe10345b8ac5e200da043f972b6cc2c44ee5f938199dc160b6ca45eda33fe6134fc8731ada7afb78c32a0d24fcc49261e0f659da6adf3ac6351d7c63d7036a5daf9008ccf8e4d79471bc4a0b3190bfedfddf6778deb8f6345be065957194059cf2040eb4261179c9d1ec9a8a07c3ab66333c79466723e5c6055af19a230d2458e9c1f26f69b08e75d9da8ee54a07cd533f3e86ebea9db73b369cd600c4447d92c2d39d798592b99ffafc31b1f5ea07d0534f7e52a7fd27cd414a0022aaa41c3d4f7ce2568fb96639547d3f25cd05aa0fc7b7dc4d0bd28c4212506c9e612800055f3583261e5caa3b4ec610cf9d7db59a0d52f467c81d11f310bb30a8528fd17431cde3eadffa00b86210470417bfb639ca0cce498a31fb06a8f747d686239b4f19dca239e40a378ce3b1f4006a2c7c868c8a013b6449f54a457c8c77708607c6069ba0ce972506f8b072dbe9d3fd931cd80bb80f8f1a096123db9192b6e29db6392ffc7aa5c5046aa0b12e40b688a6b7e1e88708c02d680a0791e7aec5e64bdfac85657e2f10178a82b807dd63027f89f8198a370311a8e31808080a064be38fc87a5208da02a2fa8d4ddc157d638e1ccb1b5805e9fdba41f151c4f6da0f40558ac68cb73d0693fa2db6bd93872fa83b2701fe026807404a55ebbf8faab80a0f7092e0007e47b1540b721877b90d3d98bf64de2948f04babab4192b0c5d450480a009157b7e154898d356b10d07e537d0aadbd30107069d303ad338367e499f7a14808080a0ffe5b78204edd7eead9d2bc2ad2cafec2450430e935ef6fd60935574f0e314c280f85180a00ccd6b1b6d7601266f939979a810d4c42b8cf6676f25778055a23bda076cfbeb8080808080808080a090b0f4c1f8207b6ec8f25d82ec3cd1309e040cae7813ace30a038494e98442bb808080808080e79d3638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db988875e336081790c4c", + ], ] let hashi: Contract, adapter: Contract, hashiProverTest: Contract, shoyuBashi: Contract, owner: SignerWithAddress @@ -44,52 +62,44 @@ describe("HashiProver", () => { await shoyuBashi.enableAdapters(SOURCE_CHAIN_ID, [adapter.address], 1) }) - it("should't be able to get the value if block headers are not equal", async () => { - const wrongAccountProof = [...ACCOUNT_PROOF] - wrongAccountProof[2] = "0x0011" - await expect(hashiProverTest.getValue(wrongAccountProof, STORAGE_PROOF)).to.be.revertedWithCustomError( - hashiProverTest, - "InvalidBlockHeader", - ) + it("should't be able to get the value if the block is not available", async () => { + await expect(hashiProverTest.getValue(PROOF)).to.be.revertedWithCustomError(shoyuBashi, "ThresholdNotMet") }) - it("should't be able to get the value if chain ids are not equal", async () => { - const wrongAccountProof = [...ACCOUNT_PROOF] - wrongAccountProof[3] = 2 - await expect(hashiProverTest.getValue(wrongAccountProof, STORAGE_PROOF)).to.be.revertedWithCustomError( - hashiProverTest, - "InvalidChainId", - ) + it("should be able to get the value", async () => { + await adapter.setHashes(SOURCE_CHAIN_ID, [BLOCK_NUMBER], [BLOCK_HEADER_HASH]) + expect(await hashiProverTest.getValue(PROOF)).to.be.deep.eq([VALUE]) }) - it("should't be able to get the value if the block is not available", async () => { - await expect(hashiProverTest.getValue(ACCOUNT_PROOF, STORAGE_PROOF)).to.be.revertedWithCustomError( - shoyuBashi, - "ThresholdNotMet", - ) + it("should be able to get the value using ancestral blocks", async () => { + await adapter.setHashes(SOURCE_CHAIN_ID, [BLOCK_NUMBER], [BLOCK_HEADER_HASH]) + expect(await hashiProverTest.getValue(PROOF_WITH_ANCESTRAL_BLOCKS)).to.be.deep.eq([VALUE]) }) - it("should't be able to get the value if the block is not equal to the one reported by hashi", async () => { - const wrongBlockHeaderHash = "0xafd0481857f5745a4511c51695d753c56380f8a7406ae63dad368e4abdb3ec46" - await adapter.setHashes(SOURCE_CHAIN_ID, [BLOCK_NUMBER], [wrongBlockHeaderHash]) - await expect(hashiProverTest.getValue(ACCOUNT_PROOF, STORAGE_PROOF)).to.be.revertedWithCustomError( + it("should not be able to get the value using ancestral blocks because the length is reached without finding the block", async () => { + const wrongProof = [...PROOF_WITH_ANCESTRAL_BLOCKS] + wrongProof[4] = [ + "0xf90256a06f14ee388c6004c9f591c05cc94509906ebcc57e6ce9d7e65c52aa7da6f530e7a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479495222290dd7278aa3ddd389cc1e1d165cc4bafe5a07604903f485d83bda3b1333e28dec61ff3191fef0423ffce44abe02033b323d3a09c6967c2262b8e5aaf07f422806fa22eed9bd05898a71ef3435eb27e258ed240a061cf3a1b00a7ea8e1b8e4a921dbd9af3c73e9ec8646e9884b7936b74e011e05ab901005d61447fd94d1ba8d69022f0b7891c8486f9ae204a03b3b61bbbc905e371ecd613dfbe02ad85113252082314a8e78d016af918d9afd27030b5b7e890842a2f8058103e8c1640a87cd82c733d21e13afc3ce5e133ddd7fd3180a816dc8bfeeaa516555f3bf2545536b6605c1ea8276edf7d076e9346d88e37e24372bec69daa45caa8fe68c4c5edccefefbf60abaa9abee6106cf1dd25dc4fff490c7bf4b1f47993d733a25880a8170f165ed3bb283d69644fb677d0fd763a07218f66249961719ff37e762cf33f76036277f9c2d9e3d5a2a0b6b70cbfbd548a717143e29e3ef4a0f9b17f9f37bc546d06e5d23e02b3c64e2e542f026cf1d4391ccdf19400dc6d8084013d48a48401c9c3808401476c588466edbad78f6265617665726275696c642e6f7267a00b4078ca7a27f9b2448fa3f32e04a269353f80273e6dc95153458475a84238b98800000000000000008502d39a9e8ea00a7c969c5cab15361767d22966b8c0e507572acd096d3bc87af306be3ceb52138080a077f861b303ce5dd4bd241707d60a82406df608caa18ec241e33b5d5a2de94bc2", + "0xf90257a034c4cec5ba48eef207f01dace9b74648f75423b99274d285eb51a28ea45a7746a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347941f9090aae28b8a3dceadf281b0f12828e676c326a017cb8d562b6da86b898d1579f2c0252ca4fc673ddbece39b0181fe6341dbfbb1a0ae9cf403fc193494aabb363f25427aa1adfe15793abe5765d28b0b1537e0900ba0b950d9ad9c7de4e5bd031c14c6d3afd38f1639e1db56590c6abafacae1e8be9bb9010055b5d41511013102900308208e003834d0c002308b480102a0a90901861621a7664ca1054060d40153aa1b99d74229a5c69380c489626d9027c9635a8d3ba580ed1ddc2810e5ef3f788ac929c12470b06160a08901404f2232ac9d42d9fa0785854040174adb01b6a3dd900ac9098e9d842ee6f52e148f0aba80cab721886001aa28bbd6804c7783a158856d63745f924614c4e1cd398c2a6525247746f4116aeb2021e09a52a018635202c32e2dce22379b9d05caf5986b252e4e0c401a11595d31264220a8210f01132022d6695481a4a02847113ce09583c7220200c6603891f33e680597a840000416a199101be82c29d000738c21d03c3b99150db214078084013d48a38401c9c38083b3f8218466edbacb917273796e632d6275696c6465722e78797aa034169fa758cb3cb5d38e8c22af9b88c525474253da05ca76b683f0c6ef922cee8800000000000000008502e776c769a01c91a492ffa0281242fdcb78078b290d5b055505d1872498d611f8cf295496818080a0686d3a40a3dd6df623831fd87b3c54877f9717001c997f9f9e1758c864df5634", + ] + await adapter.setHashes(SOURCE_CHAIN_ID, [BLOCK_NUMBER], [BLOCK_HEADER_HASH]) + expect(await hashiProverTest.getValue(PROOF_WITH_ANCESTRAL_BLOCKS)).to.be.revertedWithCustomError( hashiProverTest, - "InvalidBlockHeader", + "AncestralBlockHeadersLengthReached", ) }) - it("should't be able to get the value if the storage proof storage_hash is not equal to the one exctracted using the account proof", async () => { - const wrongStorageProof = [...STORAGE_PROOF] - wrongStorageProof[0] = "0x9d5704aa434de9751d3bfcf9e720a8eb0464ed2b467bd27af86c0415ac15fa10" + it("should not be able to get the value using ancestral blocks because of a conflict", async () => { + const wrongProof = [...PROOF_WITH_ANCESTRAL_BLOCKS] + wrongProof[4] = [ + "0xf90256a06f14ee388c6004c9f591c05cc94509906ebcc57e6ce9d7e65c52aa7da6f530e7a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479495222290dd7278aa3ddd389cc1e1d165cc4bafe5a07604903f485d83bda3b1333e28dec61ff3191fef0423ffce44abe02033b323d3a09c6967c2262b8e5aaf07f422806fa22eed9bd05898a71ef3435eb27e258ed240a061cf3a1b00a7ea8e1b8e4a921dbd9af3c73e9ec8646e9884b7936b74e011e05ab901005d61447fd94d1ba8d69022f0b7891c8486f9ae204a03b3b61bbbc905e371ecd613dfbe02ad85113252082314a8e78d016af918d9afd27030b5b7e890842a2f8058103e8c1640a87cd82c733d21e13afc3ce5e133ddd7fd3180a816dc8bfeeaa516555f3bf2545536b6605c1ea8276edf7d076e9346d88e37e24372bec69daa45caa8fe68c4c5edccefefbf60abaa9abee6106cf1dd25dc4fff490c7bf4b1f47993d733a25880a8170f165ed3bb283d69644fb677d0fd763a07218f66249961719ff37e762cf33f76036277f9c2d9e3d5a2a0b6b70cbfbd548a717143e29e3ef4a0f9b17f9f37bc546d06e5d23e02b3c64e2e542f026cf1d4391ccdf19400dc6d8084013d48a48401c9c3808401476c588466edbad78f6265617665726275696c642e6f7267a00b4078ca7a27f9b2448fa3f32e04a269353f80273e6dc95153458475a84238b98800000000000000008502d39a9e8ea00a7c969c5cab15361767d22966b8c0e507572acd096d3bc87af306be3ceb52138080a077f861b303ce5dd4bd241707d60a82406df608caa18ec241e33b5d5a2de94bc2", + "0xf90257a034c4cec5ba48eef207f01dace9b74648f75423b99274d285eb51a28ea45a7746a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347941f9090aae28b8a3dceadf281b0f12828e676c326a017cb8d562b6da86b898d1579f2c0252ca4fc673ddbece39b0181fe6341dbfbb1a0ae9cf403fc193494aabb363f25427aa1adfe15793abe5765d28b0b1537e0900ba0b950d9ad9c7de4e5bd031c14c6d3afd38f1639e1db56590c6abafacae1e8be9bb9010055b5d41511013102900308208e003834d0c002308b480102a0a90901861621a7664ca1054060d40153aa1b99d74229a5c69380c489626d9027c9635a8d3ba580ed1ddc2810e5ef3f788ac929c12470b06160a08901404f2232ac9d42d9fa0785854040174adb01b6a3dd900ac9098e9d842ee6f52e148f0aba80cab721886001aa28bbd6804c7783a158856d63745f924614c4e1cd398c2a6525247746f4116aeb2021e09a52a018635202c32e2dce22379b9d05caf5986b252e4e0c401a11595d31264220a8210f01132022d6695481a4a02847113ce09583c7220200c6603891f33e680597a840000416a199101be82c29d000738c21d03c3b99150db214078084013d48a38401c9c38083b3f8218466edbacb917273796e632d6275696c6465722e78797aa034169fa758cb3cb5d38e8c22af9b88c525474253da05ca76b683f0c6ef922cee8800000000000000008502e776c769a01c91a492ffa0281242fdcb78078b290d5b055505d1872498d611f8cf295496818080a0686d3a40a3dd6df623831fd87b3c54877f9717001c997f9f9e1758c864df5634", + "0xf9025ba03f60781072e20bd526b224ff426c9784c24a949e977ad855585fc76c897d509fa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479495222290dd7278aa3ddd389cc1e1d165cc4bafe5a021c619739b6e81e67572203fb27f00c390e605a6fef0fe41c59f226853b082aba050885bd6330e2d1e68c236f561bcea587cfde066214e1fd0ca396d5574685a1da00f98eb31cf5b863de6be609e3389a276cdd0f5247ab142bba2210bcb5133d7d7b9010013f1cd759bd4d129b3bc004786899411332acb21690da0fe8cad091d3a35e08220c245663a4a52b01e4cda40d80f2fc1d2ad9988a862ee76672c504a032fc546d78187483ae99a39f89bd13ebde02ab494a3b071ed61dda0ac304eeaf83ac988d55bb445077b71e2a0c8c08d29496a11223b0387e5150c3620059c7c688dd1554a091f5492678d624c6d916063e43956c49dc589cd61013a60a345c7e1f65622bbbc4b9d5419e000ab03b6ef3ce98e82855d2f2748e6820988478101217e81ade1532542a5d11f555011218feb43548f47eb67c742392c7439c70e5be26174b5e5f32cfe83956d41a88413c522f2cfb0febf952d59b816e98a595fa1a18396e58084013d48a28401c9c38083d4d7678466edbabf8f6265617665726275696c642e6f7267a06f3f13b39fc3605558c21368794faf69b5edc4639f5f191fedbb9145f547fd7e8800000000000000008502ee08d0f0a0c3da7cb220020e2b5c78854d4e0822ed99dfeb75ff41a4066cd5c7b27e8943f88302000083040000a0f5decec30ba81918d464d9692fd3e0660f0f0247714899e77787b9b3e2fb2260", + ] await adapter.setHashes(SOURCE_CHAIN_ID, [BLOCK_NUMBER], [BLOCK_HEADER_HASH]) - await expect(hashiProverTest.getValue(ACCOUNT_PROOF, wrongStorageProof)).to.be.revertedWithCustomError( + expect(await hashiProverTest.getValue(PROOF_WITH_ANCESTRAL_BLOCKS)).to.be.revertedWithCustomError( hashiProverTest, - "InvalidStorageHash", + "ConflictingBlockHeader", ) }) - - it("should be able to get the value", async () => { - await adapter.setHashes(SOURCE_CHAIN_ID, [BLOCK_NUMBER], [BLOCK_HEADER_HASH]) - expect(await hashiProverTest.getValue(ACCOUNT_PROOF, STORAGE_PROOF)).to.be.deep.eq([VALUE]) - }) }) diff --git a/packages/rpc/src/methods/get-account-and-storage-proof.ts b/packages/rpc/src/methods/get-account-and-storage-proof.ts index 3a495d9e..49390241 100644 --- a/packages/rpc/src/methods/get-account-and-storage-proof.ts +++ b/packages/rpc/src/methods/get-account-and-storage-proof.ts @@ -8,17 +8,16 @@ import { RLP } from "@ethereumjs/rlp" import { bigIntToHex, bytesToHex } from "@ethereumjs/util" import { - AccountProof, - StorageProof, GetAccountAndStorageProofParams, GetAccountAndStorageProofResponse, } from "../types" const getAccountAndStorageProof = async ({ - chainId, address, - storageKeys, + ancestralBlockNumber = 0, blockNumber, + chainId, + storageKeys }: GetAccountAndStorageProofParams) => { try { const rpcUrl = process.env[`JSON_RPC_URL_${chainId}`] @@ -36,26 +35,38 @@ const getAccountAndStorageProof = async ({ const provider = new ethers.JsonRpcProvider(rpcUrl) const [proof, block] = await Promise.all([ - provider.send("eth_getProof", [address, storageKeys, bigIntToHex(BigInt(blockNumber))]), + provider.send("eth_getProof", [address, storageKeys, bigIntToHex(BigInt(ancestralBlockNumber || blockNumber))]), Block.fromJsonRpcProvider(provider, BigInt(blockNumber), { common }), ]) + + let ancestralBlockHeaders = [] as `0x${string}`[] + if (ancestralBlockNumber !== 0) { + if (ancestralBlockNumber >= blockNumber) throw new Error("Invalid ancestral block number") + + const blockNumbers = [...Array(blockNumber - ancestralBlockNumber + 1).keys()].map(num => num + ancestralBlockNumber) + ancestralBlockHeaders = (await Promise.all( + blockNumbers.map(_blockNumber => Block.fromJsonRpcProvider(provider, BigInt(_blockNumber), { common }),) + )).map(_block => bytesToHex(_block.header.serialize())).reverse() + } + + + return { - accountProof: [ + proof: [ + chainId, + blockNumber, + bytesToHex(block.header.serialize()), + ancestralBlockNumber, + ancestralBlockHeaders, address, bytesToHex(RLP.encode(proof.accountProof.map((_sibling: string) => RLP.decode(_sibling)))), - bytesToHex(block.header.serialize()), - chainId, - ] as AccountProof, - storageProof: [ proof.storageHash, proof.storageProof.map(({ key }: any) => key), proof.storageProof.map(({ proof: storageProof }: any) => bytesToHex(RLP.encode(storageProof.map((_sibling: string) => RLP.decode(_sibling)))), - ), - bytesToHex(block.header.serialize()), - chainId, - ] as StorageProof, + ) + ], } as GetAccountAndStorageProofResponse } catch (_err) { logger.error(_err) diff --git a/packages/rpc/src/types/index.ts b/packages/rpc/src/types/index.ts index 9cc8aa2e..80596cd8 100644 --- a/packages/rpc/src/types/index.ts +++ b/packages/rpc/src/types/index.ts @@ -1,15 +1,15 @@ -export type AccountProof = [`0x${string}`, `0x${string}`, `0x${string}`, number] +export type AccountAndStorageProof = [number, number, `0x${string}`, number, `0x${string}`[], `0x${string}`, `0x${string}`, `0x${string}`, `0x${string}`[], `0x${string}`] -export type StorageProof = [`0x${string}`, `0x${string}`[], `0x${string}`[], `0x${string}`, number] export type GetAccountAndStorageProofParams = { - chainId: number address: `0x${string}` - storageKeys: `0x${string}`[] + ancestralBlockNumber?: number blockNumber: number + chainId: number + storageKeys: `0x${string}`[] } export type GetAccountAndStorageProofResponse = { - accountProof: AccountProof - storageProof: StorageProof + proof: AccountAndStorageProof } + From d88c81c4b92197a462186bccbae3ad42964e9e5f Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Fri, 27 Sep 2024 09:14:05 +0200 Subject: [PATCH 288/297] refactor(evm): adds BlockHeaderNotFound within _checkBlockHeaderAgainstHashi --- packages/evm/contracts/interfaces/IHashiProver.sol | 1 + packages/evm/contracts/prover/HashiProver.sol | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/evm/contracts/interfaces/IHashiProver.sol b/packages/evm/contracts/interfaces/IHashiProver.sol index 9e301c8b..a77b7e71 100644 --- a/packages/evm/contracts/interfaces/IHashiProver.sol +++ b/packages/evm/contracts/interfaces/IHashiProver.sol @@ -19,6 +19,7 @@ interface IHashiProver { } error AncestralBlockHeadersLengthReached(); + error BlockHeaderNotFound(); error ConflictingBlockHeader(uint256 blockNumber, bytes32 ancestralBlockHeaderHash, bytes32 blockHeaderHash); error InvalidAccount(); error InvalidBlockHeader(); diff --git a/packages/evm/contracts/prover/HashiProver.sol b/packages/evm/contracts/prover/HashiProver.sol index dbb83d7c..81c954ec 100644 --- a/packages/evm/contracts/prover/HashiProver.sol +++ b/packages/evm/contracts/prover/HashiProver.sol @@ -68,8 +68,7 @@ contract HashiProver is IHashiProver { } } - // NOTE: this point is never reached - return abi.encodePacked(bytes32(0)); + revert BlockHeaderNotFound(); } function _verifyAccountProof( From 392880bfb46a90d3712646c2aeca2f5a8b1fd6b9 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Fri, 27 Sep 2024 10:31:10 +0200 Subject: [PATCH 289/297] chore(global): <- updates README --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index f7ccdbd3..621fedd6 100644 --- a/README.md +++ b/README.md @@ -117,8 +117,6 @@ All issues and notes of the audit have been addressed as of commit hash [9f37363 The audit results are available as a [pdf in this repo](https://github.com/gnosis/hashi/blob/main/packages/evm/contracts/docs/audits/HashiMay2023.pdf). -Please note, there have been changes to contract code since this audit. A subsequent audit of the changed code is pending. - ### v0.2 Hashi has been audited by the [G0 group](https://github.com/g0-group). @@ -127,7 +125,7 @@ All issues and notes of the audit have been addressed as of commit hash [f1a9fdb The audit results are available as a [pdf in this repo](https://github.com/g0-group/Audits/blob/master/HashiMar2024.pdf). -Please note, there have been changes to contract code since this audit. A subsequent audit of the changed code is pending. +Additional audits can be found [here](https://crosschain-alliance.gitbook.io/hashi/v0.2/audit-report). ## Security and Liability From 2c0a882c17de22fb4587c227ea8a06d5c2970673 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Fri, 27 Sep 2024 10:54:21 +0200 Subject: [PATCH 290/297] refactor(evm): rm check on the number of block header fields within proveAncestralBlockHashes --- .../contracts/adapters/BlockHashAdapter.sol | 7 ------- .../evm/contracts/interfaces/IAdapter.sol | 1 - packages/evm/test/adapters/02_Adapter.spec.ts | 20 ------------------- 3 files changed, 28 deletions(-) diff --git a/packages/evm/contracts/adapters/BlockHashAdapter.sol b/packages/evm/contracts/adapters/BlockHashAdapter.sol index bdf65b50..173a5a8b 100644 --- a/packages/evm/contracts/adapters/BlockHashAdapter.sol +++ b/packages/evm/contracts/adapters/BlockHashAdapter.sol @@ -12,21 +12,14 @@ abstract contract BlockHashAdapter is IBlockHashAdapter, Adapter { function proveAncestralBlockHashes(uint256 chainId, bytes[] memory blockHeaders) external { for (uint256 i = 0; i < blockHeaders.length; i++) { RLPReader.RLPItem memory blockHeaderRLP = RLPReader.toRlpItem(blockHeaders[i]); - if (!blockHeaderRLP.isList()) revert InvalidBlockHeaderRLP(); - RLPReader.RLPItem[] memory blockHeaderContent = blockHeaderRLP.toList(); - // A block header should have between 15 and 17 elements (baseFee and withdrawalsRoot have been added later) - if (blockHeaderContent.length < 15 || blockHeaderContent.length > 17) - revert InvalidBlockHeaderLength(blockHeaderContent.length); - bytes32 blockParent = bytes32(blockHeaderContent[0].toUint()); uint256 blockNumber = uint256(blockHeaderContent[8].toUint()); bytes32 blockHash = keccak256(blockHeaders[i]); bytes32 storedBlockHash = getHash(chainId, blockNumber); - if (blockHash != storedBlockHash) revert ConflictingBlockHeader(blockNumber, blockHash, storedBlockHash); _storeHash(chainId, blockNumber - 1, blockParent); diff --git a/packages/evm/contracts/interfaces/IAdapter.sol b/packages/evm/contracts/interfaces/IAdapter.sol index 72498484..72b9c7f2 100644 --- a/packages/evm/contracts/interfaces/IAdapter.sol +++ b/packages/evm/contracts/interfaces/IAdapter.sol @@ -6,7 +6,6 @@ pragma solidity ^0.8.0; */ interface IAdapter { error ConflictingBlockHeader(uint256 blockNumber, bytes32 blockHash, bytes32 storedBlockHash); - error InvalidBlockHeaderLength(uint256 length); error InvalidBlockHeaderRLP(); /** diff --git a/packages/evm/test/adapters/02_Adapter.spec.ts b/packages/evm/test/adapters/02_Adapter.spec.ts index ed60d30c..8b9f9987 100644 --- a/packages/evm/test/adapters/02_Adapter.spec.ts +++ b/packages/evm/test/adapters/02_Adapter.spec.ts @@ -113,25 +113,5 @@ describe("Adapter", function () { "InvalidBlockHeaderRLP", ) }) - - it("Reverts if block proof doesn't match valid block header lengths", async function () { - const { adapter, blocks } = await setup() - const blockHeaderContents = RLP.decode(blockRLP(blocks[0])) - const blockHeaderTooShortContents = blockHeaderContents.slice(0, 14) - const blockHeaderTooShort = RLP.encode(blockHeaderTooShortContents) - - // Block header RLP contains too few elements - await expect(adapter.proveAncestralBlockHashes(CHAIN_ID, [blockHeaderTooShort])) - .to.revertedWithCustomError(adapter, "InvalidBlockHeaderLength") - .withArgs(blockHeaderTooShortContents.length) - - const blockHeaderTooLongContents = blockHeaderContents.concat([adapter.address, adapter.address]) - const blockHeaderTooLong = RLP.encode(blockHeaderTooLongContents) - - // Block header RLP contains too many elements - await expect(adapter.proveAncestralBlockHashes(CHAIN_ID, [blockHeaderTooLong])) - .to.revertedWithCustomError(adapter, "InvalidBlockHeaderLength") - .withArgs(blockHeaderTooLongContents.length) - }) }) }) From e1f62c957984d3b5b5ec02c2d516e172a87fb533 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Mon, 30 Sep 2024 15:18:55 +0200 Subject: [PATCH 291/297] refactor(evm): rn _verifyAccountAndStorageProof into verifyForeignStorage --- packages/evm/contracts/prover/HashiProver.sol | 4 +--- packages/evm/contracts/test/HashiProverTest.sol | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/evm/contracts/prover/HashiProver.sol b/packages/evm/contracts/prover/HashiProver.sol index 81c954ec..b97faf42 100644 --- a/packages/evm/contracts/prover/HashiProver.sol +++ b/packages/evm/contracts/prover/HashiProver.sol @@ -16,9 +16,7 @@ contract HashiProver is IHashiProver { SHOYU_BASHI = shoyuBashi; } - function _verifyAccountAndStorageProof( - AccountAndStorageProof calldata proof - ) internal view returns (bytes[] memory) { + function verifyForeignStorage(AccountAndStorageProof calldata proof) internal view returns (bytes[] memory) { bytes memory blockHeader = _checkBlockHeaderAgainstHashi( proof.chainId, proof.blockNumber, diff --git a/packages/evm/contracts/test/HashiProverTest.sol b/packages/evm/contracts/test/HashiProverTest.sol index ba339907..8e4d0892 100644 --- a/packages/evm/contracts/test/HashiProverTest.sol +++ b/packages/evm/contracts/test/HashiProverTest.sol @@ -7,6 +7,6 @@ contract HashiProverTest is HashiProver { constructor(address shoyuBashi) HashiProver(shoyuBashi) {} function getValue(HashiProver.AccountAndStorageProof calldata proof) external view returns (bytes[] memory) { - return _verifyAccountAndStorageProof(proof); + return verifyForeignStorage(proof); } } From 0a2de9c230586244abc8deeb8b9145cef77e66e4 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 1 Oct 2024 12:08:52 +0200 Subject: [PATCH 292/297] feat(rpc): adds support for more chains --- .../methods/get-account-and-storage-proof.ts | 111 +++++++++++++----- packages/rpc/src/types/index.ts | 15 ++- 2 files changed, 95 insertions(+), 31 deletions(-) diff --git a/packages/rpc/src/methods/get-account-and-storage-proof.ts b/packages/rpc/src/methods/get-account-and-storage-proof.ts index 49390241..c539fb8d 100644 --- a/packages/rpc/src/methods/get-account-and-storage-proof.ts +++ b/packages/rpc/src/methods/get-account-and-storage-proof.ts @@ -1,62 +1,117 @@ import "dotenv/config" import { ethers } from "ethers" import { logger } from "@gnosis/hashi-common" -import { Block } from "@ethereumjs/block" -import { loadKZG } from "kzg-wasm" -import { Common, Chain, Hardfork } from "@ethereumjs/common" +import { BlockHeader, JsonRpcBlock } from "@ethereumjs/block" +import { Common, Hardfork } from "@ethereumjs/common" import { RLP } from "@ethereumjs/rlp" -import { bigIntToHex, bytesToHex } from "@ethereumjs/util" - import { - GetAccountAndStorageProofParams, - GetAccountAndStorageProofResponse, -} from "../types" + bigIntToHex, + bytesToHex, + intToHex, +} from "@ethereumjs/util" + +import { GetAccountAndStorageProofParams, GetAccountAndStorageProofResponse } from "../types" + +export function blockHeaderFromRpc(_block: JsonRpcBlock) { + const { + parentHash, + sha3Uncles, + miner, + stateRoot, + transactionsRoot, + receiptsRoot, + logsBloom, + difficulty, + number, + gasLimit, + gasUsed, + timestamp, + extraData, + mixHash, + nonce, + baseFeePerGas, + withdrawalsRoot, + blobGasUsed, + excessBlobGas, + parentBeaconBlockRoot, + requestsRoot, + } = _block + + return { + parentHash, + uncleHash: sha3Uncles, + coinbase: miner, + stateRoot, + transactionsTrie: transactionsRoot, + receiptTrie: receiptsRoot, + logsBloom, + difficulty, + number, + gasLimit, + gasUsed, + timestamp, + extraData, + mixHash, + nonce, + baseFeePerGas, + withdrawalsRoot, + blobGasUsed, + excessBlobGas, + parentBeaconBlockRoot, + requestsRoot, + } +} const getAccountAndStorageProof = async ({ address, ancestralBlockNumber = 0, blockNumber, chainId, - storageKeys + storageKeys, }: GetAccountAndStorageProofParams) => { try { const rpcUrl = process.env[`JSON_RPC_URL_${chainId}`] if (!rpcUrl) throw new Error("Chain not supported") - const kzg = await loadKZG() - const common = new Common({ - chain: Chain.Mainnet, - hardfork: Hardfork.Cancun, - customCrypto: { - kzg, + const common = Common.custom( + { + chainId, + }, + { + hardfork: Hardfork.Cancun, + eips: [1559, 4895, 4844, 4788], }, - }) + ) const provider = new ethers.JsonRpcProvider(rpcUrl) - + const [proof, block] = await Promise.all([ provider.send("eth_getProof", [address, storageKeys, bigIntToHex(BigInt(ancestralBlockNumber || blockNumber))]), - Block.fromJsonRpcProvider(provider, BigInt(blockNumber), { common }), + provider.send("eth_getBlockByNumber", [intToHex(blockNumber), false]), ]) - + const blockHeader = BlockHeader.fromHeaderData(blockHeaderFromRpc(block), { common }) let ancestralBlockHeaders = [] as `0x${string}`[] if (ancestralBlockNumber !== 0) { if (ancestralBlockNumber >= blockNumber) throw new Error("Invalid ancestral block number") - - const blockNumbers = [...Array(blockNumber - ancestralBlockNumber + 1).keys()].map(num => num + ancestralBlockNumber) - ancestralBlockHeaders = (await Promise.all( - blockNumbers.map(_blockNumber => Block.fromJsonRpcProvider(provider, BigInt(_blockNumber), { common }),) - )).map(_block => bytesToHex(_block.header.serialize())).reverse() - } - + const blockNumbers = [...Array(blockNumber - ancestralBlockNumber + 1).keys()].map( + (num) => num + ancestralBlockNumber, + ) + ancestralBlockHeaders = ( + await Promise.all( + blockNumbers.map((_blockNumber) => provider.send("eth_getBlockByNumber", [intToHex(_blockNumber), false])), + ) + ) + .map((_block) => bytesToHex(BlockHeader.fromHeaderData(blockHeaderFromRpc(_block), { common }).serialize())) + .reverse() + } return { proof: [ chainId, blockNumber, - bytesToHex(block.header.serialize()), + bytesToHex(blockHeader.serialize()), ancestralBlockNumber, ancestralBlockHeaders, address, @@ -65,7 +120,7 @@ const getAccountAndStorageProof = async ({ proof.storageProof.map(({ key }: any) => key), proof.storageProof.map(({ proof: storageProof }: any) => bytesToHex(RLP.encode(storageProof.map((_sibling: string) => RLP.decode(_sibling)))), - ) + ), ], } as GetAccountAndStorageProofResponse } catch (_err) { diff --git a/packages/rpc/src/types/index.ts b/packages/rpc/src/types/index.ts index 80596cd8..ec1af0a6 100644 --- a/packages/rpc/src/types/index.ts +++ b/packages/rpc/src/types/index.ts @@ -1,5 +1,15 @@ -export type AccountAndStorageProof = [number, number, `0x${string}`, number, `0x${string}`[], `0x${string}`, `0x${string}`, `0x${string}`, `0x${string}`[], `0x${string}`] - +export type AccountAndStorageProof = [ + number, + number, + `0x${string}`, + number, + `0x${string}`[], + `0x${string}`, + `0x${string}`, + `0x${string}`, + `0x${string}`[], + `0x${string}`, +] export type GetAccountAndStorageProofParams = { address: `0x${string}` @@ -12,4 +22,3 @@ export type GetAccountAndStorageProofParams = { export type GetAccountAndStorageProofResponse = { proof: AccountAndStorageProof } - From 75a82bd16c84389fa38c9620b6b3cb107ba22d6a Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 1 Oct 2024 12:09:36 +0200 Subject: [PATCH 293/297] feat(evm): adds rlp decoding within _verifyStorageProof and updates tests --- packages/evm/contracts/prover/HashiProver.sol | 11 +++-- packages/evm/test/05_HashiProver.spec.ts | 49 ++++++++++--------- 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/packages/evm/contracts/prover/HashiProver.sol b/packages/evm/contracts/prover/HashiProver.sol index b97faf42..85a138ce 100644 --- a/packages/evm/contracts/prover/HashiProver.sol +++ b/packages/evm/contracts/prover/HashiProver.sol @@ -101,11 +101,14 @@ contract HashiProver is IHashiProver { if (storageKeys.length == 0 || proof.length == 0 || storageKeys.length != proof.length) revert InvalidStorageProofParams(); for (uint256 i = 0; i < proof.length; ) { - results[i] = MerklePatriciaProofVerifier.extractProofValue( - storageHash, - abi.encodePacked(keccak256(abi.encode(storageKeys[i]))), - proof[i].toRlpItem().toList() + RLPReader.RLPItem memory item = RLPReader.toRlpItem( + MerklePatriciaProofVerifier.extractProofValue( + storageHash, + abi.encodePacked(keccak256(abi.encode(storageKeys[i]))), + proof[i].toRlpItem().toList() + ) ); + results[i] = item.toBytes(); unchecked { ++i; } diff --git a/packages/evm/test/05_HashiProver.spec.ts b/packages/evm/test/05_HashiProver.spec.ts index 7fdade68..ebf16b43 100644 --- a/packages/evm/test/05_HashiProver.spec.ts +++ b/packages/evm/test/05_HashiProver.spec.ts @@ -3,42 +3,43 @@ import { expect } from "chai" import { Contract } from "ethers" import { ethers } from "hardhat" -const SOURCE_CHAIN_ID = 1 -const BLOCK_NUMBER = 20793508 -const BLOCK_HEADER_HASH = "0xafd0481857f5745a4511c51695d753c56380f8a7406ae63dad368e4abdb3ec47" -const VALUE = "0x875e336081790c4c" +const SOURCE_CHAIN_ID = 10 +const BLOCK_NUMBER = 126086803 +const BLOCK_HEADER_HASH = "0xf72ab984efa166b226dcb589bc445afeb8e666f789173a32de6d04108ac5cb8c" +const VALUE = "0xb56d157e7f5a" const PROOF = [ - 1, - 20793508, - "0xf90256a06f14ee388c6004c9f591c05cc94509906ebcc57e6ce9d7e65c52aa7da6f530e7a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479495222290dd7278aa3ddd389cc1e1d165cc4bafe5a07604903f485d83bda3b1333e28dec61ff3191fef0423ffce44abe02033b323d3a09c6967c2262b8e5aaf07f422806fa22eed9bd05898a71ef3435eb27e258ed240a061cf3a1b00a7ea8e1b8e4a921dbd9af3c73e9ec8646e9884b7936b74e011e05ab901005d61447fd94d1ba8d69022f0b7891c8486f9ae204a03b3b61bbbc905e371ecd613dfbe02ad85113252082314a8e78d016af918d9afd27030b5b7e890842a2f8058103e8c1640a87cd82c733d21e13afc3ce5e133ddd7fd3180a816dc8bfeeaa516555f3bf2545536b6605c1ea8276edf7d076e9346d88e37e24372bec69daa45caa8fe68c4c5edccefefbf60abaa9abee6106cf1dd25dc4fff490c7bf4b1f47993d733a25880a8170f165ed3bb283d69644fb677d0fd763a07218f66249961719ff37e762cf33f76036277f9c2d9e3d5a2a0b6b70cbfbd548a717143e29e3ef4a0f9b17f9f37bc546d06e5d23e02b3c64e2e542f026cf1d4391ccdf19400dc6d8084013d48a48401c9c3808401476c588466edbad78f6265617665726275696c642e6f7267a00b4078ca7a27f9b2448fa3f32e04a269353f80273e6dc95153458475a84238b98800000000000000008502d39a9e8ea00a7c969c5cab15361767d22966b8c0e507572acd096d3bc87af306be3ceb52138080a077f861b303ce5dd4bd241707d60a82406df608caa18ec241e33b5d5a2de94bc2", + 10, + 126086803, + "0xf90244a006f019ce5f815a48534f1894e0bf2bc479f3624eb3658a5b8b09683210371cffa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347944200000000000000000000000000000000000011a0db07d5c7f51b0fabc0ab6abffb98efcac1cb95f63dcae01ea8e73301558f1c94a05ab78472371830bfed304d360240d57e7bee41309297278fd0dcd5b198979a2ea0a9bcb4d6a8f248c15860a40a38c1d965a5c33173226d35eab3cfbb7112bd3532b9010040703482510e004000001884022000202001880a000450400806000144d2210045081100280910224008001040003110004402640012220006200001402020c1000084188008208a3010880940b82000149414030182049548200000208c0001190000281a5406000010100203040900e0311685481c0150002500124808000840000003088c028200010600104840049080d5c08aa14000111090084a2800001210002815123401000011028040260008840010a000000040810410880004804000002308064400c10028860002800840c480040582c3008020040820102901001028010094000110102801088001119000100401828100840080000021280680840783ee938401c9c38083574af28466fbb6df80a0bc24644d93f212885acc3a93836ba214b962f7508721517fde36b89841d126638800000000000000008301fa63a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4218080a080c2a58ed1b8b5bd35567d8dba40773b50e4bbe0b5f0e68b2a8a0d79c6619dae", 0, [], - "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", - "0xf90ec7f90211a0c7f9548de2413b06c51826457d18686177d6b50cfe9c57052d5e2745ea67405fa037c538f94ae962a12ec446e99913c4a2f84f1262b6187b33e7223842c32cb2eba027252f104dbb368c148808bc165f19872ffee7923996f4b16c0638e3614dd7e7a054e4c38140beb9e6797a2fb319d8547cfa66fa1e2cb6d82127680268385aa672a07338ba4f0182c36261d92001142d58972ef60fa78bf7c619142dbc6ff600200da0a448274d9713da8237b955d1a18c1ada8ea94cfa94a6b4db2342d1842055b189a05e120865c2d8ec5f247e9d8910d7de99db8ff0241edba8740e80e36792aba2c5a012e7432e7545f98874ead265b48ac00d8e2110423be874204e27a29c7be49be6a020ea554b06c3263db4494a8b3dfe7a0bfb4c08033e67a60bd9f6cbc34d251376a0b096aac4ebdbe28c685f7394c6688e95a96e95fa367fb1fbe5f51996bcecaca7a062efd61342b2456537cbf539f25d524237be19d927a2023eed05a8cdd87eb68da09eb19a5e1d1b22618a8fef9049b62fbff55cc92e6b84a56b0d826ba751b4a291a0c1257750d37ae856d9f36832ba3133c3da159f8c96633036852bcc1d67917363a0730e6746c74c0aaa9818e2346205303e1580773e8794dbe60db756cc69d5ccb2a01aea932f111a3426ea32cdcaebb968e9faeb811b27d2d6ccbeb8f13cf3937f8ba04ad0f5122c1797f92f85cb474e4c6fc318e00ebfbf1ed705e224fe8c48c211b080f90211a07168607c5590b0a93f3b5ad40cec52042f51918229dd8e19595058cd069762a8a0d4e8dd9feab21cb31fa0a557f5e131c643bdef986d7ad5d02fe45ce7f5889792a0e364b5776f8a3624fb0000293093cd8321b120820153e97f36890395179ac4d6a0376ac4f7253988b233faaff0919df0045258800c38d2e83fbacc1eaec45e336aa0dcc6c7173e056fa08fd1967a9dfaded1d3133dd96b876f9afa901fa45e07bfd9a01fb35c15a038bbda6afd540cf3396a9c6ebca35479ecd794e38ca57aa962b6aba0d41ffbd124db9534c357ad8908d3b324170395c381980608ac053c5fd72c4130a0ebfacd5239d919283d3082ba24d8a7e601d2ef005530a26cd533243ba1cd100aa0e5d57e7ab231d26840392f500d6feff0ecd423de4f7692277ba89ccb83b8c5fca086466a5523829c87d540bb08bd632fb8eb3d7549884e00c84eb6e8ff0d5965b0a06b196898c2874c5756ba4e388acc41a86b6dc5f5114f96341ddbdde7a1c7a784a061a300fe3f07508c39b9f23c503f89e77c389be2389305da52cddc87aceab4aca055fc141795501ea6ede95f7e8383776f88474af4183092abce713f30ffdf5058a00e8a492f76c475f258d612894073af63b762dfb0ce19f58cee9ab5dbcd729da0a06572d551070866c6eb9fd99320fc27017a4d5a10989e00191de260cc59b6ea86a0ab842580f5891239a9add6f0cb6e8aaf1c7081b08f29752c8ef56c8c218cf00c80f90211a069055abb2693d9d442e7c992b263238fb8fb2c8cec4af8ca2a3201838f89b7a7a04fd2945e89d5dc6a0f43e0930cdbf5d70abf9c90127a8839b8b07240d912a4d0a0f842f3370180cc30bb6521c12fd42ae2d88bee77e73254a6f239f88469c09c55a05537d33d7d06cc4580f3e7e9d7654ef044da71ace71bdf5baf29966561e45befa066cbbd1fc101198ea2e2690dc8d980c72d33a2f6b820d387adb398a116025c18a0697c9530067e3351e87a7c6e6fbbc2a282febe0b63d229b0f4e292d66a1e4c6fa0f72324a07205eae63e114985fa445800a8285e75a53c3adca0466793eead1840a099cd34991d25321a827556e34d2cd347b589037f2b1bc677f940011b7a1c13d7a07863da67c7f99c4243a57456d4a05ddc066c6c8d8fcb25c8c08f01a10533e570a01197d8ef083352a2d90d88551891b3deab62bc20685978b4d99d5fa14cbfa052a07f34645f90cbf7298dc60c7048e1d352e70dd1dae6f787598b6d1080f49971e8a03272e0642f91eb4501840dcc7e9c436ed63344b11f7f049048bcb1a3a7df2ca8a08a76ffa84b3e9272cb6428d49454038859d457bb204f624599ab579dcfef12dea0e7a55031502f08d2734db4ef7390bf17f44e2b3478d70e9bef809c206f293bdfa0abdfb9de732a5cebbd5c92a5001e65db3dda1ce7253435ba5c5708680e2e7726a0b561a68db428a042a35d754a7a1a9f6ebe8836081f992d3d2de19ccec0a55e4980f90211a0bf2ec407e3de692c31ef7df972caa2a21282902d3c2c7869a0bd44868ccd6af4a0e5e4bacd58a1a934a147638918e4451d160e9ec99647ea7f8852c02e073075c2a0e694ba7072b174c6a6752c02d1ec11d7cd988412bd6c37f07d295fbb7f14756fa0d6c7c0fa4c81d699e045c2a22ba0eb61179e4496804d6c0e592b5047b2993191a0798fddb883c25774fc6d1f51b652b8ea81dd03588410b571767727762c1e4c5aa07a7db1965aa0ad10434a95220de03416e2ddd00d654b33d3dc2ed2f7b8f48d22a0be7ed44c61160c17a7b5a3ca5495bf614f6f640c75b095aa6960c872e233e158a09df22d1f287814d3cb828ecea1120d6a9055254e8164d2cfd8b98c5ae0980ba3a0a674bd1b8aaeccc467b331edcb9af81dd09131866e71d055619e57dad9b6a03ea08faed450b4c2371166de0eb1d7db6d5f1af19bd5fd4e7a0b12681026e7a1cdcba0b11e6cc0bc06f9e2dfebb7fafd410a461394ee3f50ec911c7049a390c9c27845a0d2fde948974177cfbfb25d3009d6cbddb9b4f6892df707546f2c00ba03435ecba04be0d058b041af7ce8807b0ca411360cdee3eb6f0059c906ba5600e8f0587309a0b62c7263e747cbed29cc1658606baddcfff8d9aaaf8e25a0d82bed3850e567c3a087b63a803df5cac69d9c9faf447a1289d8c1cb273faf55337d04dfb4111681e9a0ec352f8139edb0fe592c12d452b32defa9570e2f370f74a5feae7924d5785ce580f90211a0cd95d3ae92f92c6839f0f7435ee60791da5027497cec01dc1f4a199b131a608ea0fc91ae6a7c9106cfc39b0efc92870e9f4c98bb7a20ad21ea3d853f4a831efdbca03e3383dfc994780e7393654e27daf30f26f5f2e86c572360bead1a07b32d22c0a0cd6460eb11a1728f4b0ac2caea14b83a6ca0f54995d7f41a8852d1d234ba57f2a0c7edf11df5fcbc8d6bef9c4d63d71c81a02b7893c57a49c432b9177409509c75a0534bc98a6e093069585cf811762741c8594a6b42828f5ad825929ecd8bfc20e4a0d634fe101ab5770dcb54a80a2b794299b300e1adf9343d1ef26c6cdffbb7f21ca0fd2c5d9a536d366c2fcd145073b3b75672699b1ea55c70fb5075f89e427b6b4aa0b82cb047822a3f3283cbe8eb6ac88d8c71b5beaf47c8c6a3e8ae50780f6dfa8aa0e8c97b53fd657b5511173624dde4f31e239c49df5a98a57e1295029f486c94a2a09cfbcdb21e2d410f156bb467897bf73964a01e6dd5539e6330634b794de649e1a0c6e20f19fdf97cba0c8a21d57b1d33e1c283f4ad93f92fb7d67cace9bd434f90a051691b3625c0367b73aebeb6f94c3b5542bbe0f72aca52277ad31a7af8546ac5a05e104969fb1ccd2b7df5bc5f77af07c4ebfc424f506ce8dd0e164c3880e3ea2ca0034154f8f674659f19216e21203706a8314edcf9700f49249aa0894e502a3bada057616f55e2e620afe5ff22f313d5b6e34cedf4a64fc6163b3e3008bae24d35a080f90211a05c2ede3805ac777d64c232fb113ab67116c8a1f252a5bc401cf9f283e9f7a6c4a07acd632dc59a4bed389f18274a1bed7167eac5777e1a3ed16224130958872632a05eb84506a1607d7521f30a366c1891a54e0e84c22a7c48535c63f74d08fc237fa05c38dd95917629395109aff3e91a0d52a13ad9ac93215a635982dfe51a1169fca04e776df61609acc8780d262ec19ae6b63ae21509f9b913d388bd1b5f1a352ae8a05ce8d36e3e8f3fd39e83e1db3b6369120e3692ad8cfc8e622350c432150d98d1a09fd76ff18b2f067852e1601c76112b4e06755d64c48cdeea021d6efefc8cc5eaa0dac65fc9721f10396a9488adc58e5722527bfba2af0c358a985132fca8faadc3a0c35faa1e275ed56ebecc0b51a8f89e115a7320a3c9823fa9a85e7d7afbb5a6eaa0932f7e0b119160a118e3eb7ed691cac7163ff775eb6e5e163a27904a14b75ecba0c41c5e70289ab77172db9e42bf65ca3a2cca2251f22f5717886a51e5d543ea9ea05d8ef1b1d38448fdbc8a6db86647ac38a4b580950bb7bc33902d82555a8f5dcba004a3dc79b1077e6e8be9bca62507b9004ed350a1095b345222f97095cd804bc4a0f53a5c5a890da2d8fa58c0eeee5e5c8dde92a1472441a514c32f03f5b6487315a03e7cff35eb4e28eeae7b163572950b781920079ccf40206ae4387906bf6327c8a05a1ba0533fe12a4dfc22ecbb2d309d113ed8959a1968b730372a99cd07272ddc80f90171a07d337e717ecd4ce5f45c4ea8994e476ce38cf937a4f2924dc40cfa8fe5870fe9a03f98e9ce6af172ec08481a6bcffb89a264933f90ee288a82144c0eab968e42ffa0eb65ea007c07bc1604264fecd433291c165a1211a8bf8bf6492cc1194fa549408080a04a57ac1163277a820bdae649d632f917b3885a80103654d3216f9409b72525d3a0031868dec233f986dc0afa16d6abf78e22396b0fa4a757f0688380756a844be2a0d3bee690d48173444d679a7ab969cd9199b83ac3de64db3d987dc6aa2ddb06e780a0ccb10237fbb545478774d6e858eb7a1327708de6c205c7195d3a5dacd5961209a0903e3cd41d04b4693e0eae1549f7fe024eb06b98fa1c137cacc66d57a7a0e223a023f24686514302e9b0707775885ba13549bad5e8c8a5464c3d8efd4b8e953d5ea0c329d67971ead7da9f1d222990d9aa6c0f448bd161c0981ef504b1d7292b666180a015234d9ef39b97af083fb5715dd5cc2f4454a23ca3a4d72419cfde3ea918036c8080f87180a0568a3548f0c468bec66c6d91b1d72f84e44373c03c6e118d7edc6ba8fe9b4d0c80808080808080a0ec26e129a6fc11a5dcc748bd22ca4e41a0ace63cbf1cb2de018e2b9585a06fc680a043ce799f2836610d1ae648b51b90bdabc437dd7ca340c1ee8c3e2d71eab6ea268080808080f8669d2092cd7f3f78137497df02f6ccb9badda93d9782e0f230c807ba728be0b846f8440180a09d5704aa434de9751d3bfcf9e720a8eb0464ed2b467bd27af86c0415ac15fa14a0d80d4b7c890cb9d6a4893e6b52bc34b56b25335cb13716e0d1d31383e6b41505", - "0x9d5704aa434de9751d3bfcf9e720a8eb0464ed2b467bd27af86c0415ac15fa14", + "0x0b2c639c533813f4aa9d7837caf62653d097ff85", + "0xf90df4f90211a0844646418cdc472243623a6adf853cf42930ed027c5f2eceff9a2a274f5e9cc3a0ec7c3704cc16a2ace8fce26d2ad0da2fce10b66df732616516228db1d366cb4ea0c2c588c16144825eb7ea05706f6446d2cbffad3da2174cce3ec3a1effe54c803a01b2297c51766932182e29aafdf7dc4b9bf3c5307f0a38ba23b36f8ecd21fc0e2a063d96d72aa3d8c16be960a74f174e75c4e2db021710a8e461502f5146e30faf5a0012f48dd4b043f6f92c33b2d8deda920eb9865100c29b254f08954f09ecdd2f6a094e26fe5bca0e87b4019c815890e10788a637436fda3896d5505298016270182a0baf314b410c021b42295a806f14ce14700e1699dcf7de35a194229cf94954d1da0a7febdeed6c7dde904228dd454626d9427e0a3383e11398d41ccad56ade292b4a0463943e8401fdd6b0352ae228250096cfa8ddc9dfda3d38d4c33e55e17369a14a0a8b2218d9bb0268f2ed74484331ba4ba428d17b65f4d1a06d7f4ebaf9c514d4aa0f9e9916aaabdbacbf2004783d7403a8891c73c9aa468c72ac7e8b09a0f89142da0ff7d643adb489b721f611c0b981d67dae2b63945a1c7ff908d077746d6c1957fa0176c742cd7ddd01391f0863b472f318e91d3227a3357c306cd86a18d30303641a01e767c4d2bed2343988ea284102b234302b0e1ada620d9b9a0d194077dc7f873a0619ddda96da06f24140ddaafb3d5644b6da53041b39aa7dd5dcc3468d9fa445480f90211a0ecb37076729047293de85c6c4a2b13bb62fa4a402c6b1451e9119bf495aca8a0a0433f3f07bc576292134817472d7166183bc4730e837f964e3011b52bbf9b081aa0e9b2b29d4341d3b168d9bb4f4fe000b876a8f55027cbb69c45160d495141f210a04d482eb4f317e703aab85ad2c6990c98145af5f7cc89a7ccd2161f87b791bc01a0e9357b5192820eea672e3194d2020b131f29abe5671c37601633c485358eb421a00a3f410ab91d016cb1716203d732962685a6fc9436862ab83d9fc5109346a041a096e1687da814500097774352c9f49064dac34fe0de9f1848190b5a56fbedcb17a07006adaa8c1b203eab5ee33ea19de791fc8c9cf5cb15ec90d1ef051c9e2ed78aa0468135eecd2271411b5c039c6dce226ee4b251d3e671fea0238347a522241313a045483167728fabead0fa82c604abcf05e0141b1e82d5e94a427b367839985ed4a04c53cd84dd5c5e90d3e4c6bf7583a2d71a5f440e78d2e550c618a9c326ebce64a0f120f7e462069e2b91d3ce0f1e9be2cef10b699399b76e188a710c74b8968432a05a912ef4d4b331e64a4f5ff4a6268ea3bd66c8b823fcb4c3bf7c6e200d302a1ca07aab0db239e967467ed9b3a155ef0a4e8d03d058d44e9e63c39312ad2a986fc8a0afe49319cf159e2916404743d4ef869043fdeb37c79b20fb355a98e8500491f1a04e7bfee55002c5d87331c6d9a9fb394acf87247fc3e26519224e3851bee4c19380f90211a03b31c916b970491c86305379f7e67c97f98166cbc06fade873c5c7d324a7fa81a0d5ff65d687d30b465e3abc81774a9628de5a67f6f318fbbe0641634af53f0d74a098663d761acb23f77146aa5dc3fd4b487a3fec8d25ab2d5408e38e75489dea43a0a26e34fe93e7455b178fde2f89c1c99cfef61cbcb24bdb7ad8041be83ee67846a008662a0a8da5e79b6f4c601197a57ae00377f2f04a0f5edd17e3aed4c4d3777da0c3113823fec10487cde37f5ee2f39a8c72bd0413a21ba763acb5ebf0d40a49b6a044163b2ab486e7f99d831323ece00eb977db78a6594acb26082c5de00943616fa0dcfad53d7bef9f07e520b4b62d7f71620b244d13d06bb964a619f5536e37fa08a09c630785cd49c1b3aa3457999a1047d980392a18bc1d04f7763416ae01489ed6a07a1d5d86308774a7c26ed21faaa58d45efbb2616961a4bbe10d3fc88d99d0bf5a00c58bf78f9f278a3e75d22b39fda0df112a1cb8e05d79c32e5f31b94d4e99f64a070ed09023a65c88badb25edf59f2cab9708edc992ef461534b0e47ce3982ae90a01b690934defb8655cddc75185dd1612c1165ecfdcc8e7a19fdc57cae0f0065e8a054523f7b5547848216144e68b0ccdb1f819bd54ac210c2e4dd5a380edcce33f0a07dd9da455fb24559012c4903166f73f9c5e661b8c88f0bf7de019d73d4c19c89a04478f70fe968b2da1516a8f6b67a6b28011923c34ebecda2f45355e442cbcbbe80f90211a0d5393c3c06c8d597f6f325789484f12da87d807df33096a0af3161e33c44b8b0a0f27d4b26d1822dc04180fe221b3e7cba86c9fc524791c951b6b71c242099ef3ba011d2b20160240582f75dc941e1785643f7652a43d1d62697808657b0a0b8e186a0e9acd52b94dd294c782ad25e727c17934726d62052deac6cd8ffab7cca3e4176a04dcd91b21b8c73a57023c649f7d27cb9443450ee8301f56d4693e667218fcb3ea0630078c69bd028cb16cfccc05feb9f960484ed470f7bc0d1acf25fea5a68de0ca09ee40510308e721235620dc519619981d81e8997c0e7ab5c91f32f1f9ddffdeca0176656e94e76511030173bc6a39fc6fc11078add4c391a6edceb34cc28b7c83fa01cc9e278e51e81a30d6b18410a7411287b95c03d9ec2fd23396f0ada6410d2a8a019a07cd977b76673046b61debf2ce6e54615f5e69e31e17eb0c4dfb316da1cc1a08b8a356d612925d089be937debbdcbe8a40a941bbd07d7fe168cdbe2bfdc2d7fa0ebad3b72886fc350a5aaa24d20d8a143754c92eabab4ee2cba59697e7771cd50a0c24cf965d70417de74ee02b9cfdde3138d434c2cbc0c21006c04cde27a2d9ab7a0f21f4798a55807d429caadba5da04b2d12fc43569e7bc6c4b965976f21643874a0ec71a00e5b53a2f6043ed744c66b7ae5bc6ea1c7d32066014723a7744ad0e446a08b985961a92fed93614049284d0f08665a7a9f1b5dfbb025682a9551f2660f5380f90211a05510ce326198dee0033e6a2b29957f77687221d6f4b9a082f34922f9f589b003a0a6f336170753299b1adc48077e111e425fdc539ff7160a9babf8afdf5b5bef3ea0ad027c813622b3582247847a8537992e0a3f6a50e10c268d0ac8eacd1fd750bba037babb03742053f969204568854a958947fc93bcb978ebc85c83e35c5dc6fdfda07d3c1a847911e962071639472987bf9f0d112c983b393190af796342557a3ac5a07e243717881703400c60ec2fcc05040759a9646b61adb02412c8b0619e3059bda08acbc6de4a6c92f92dde22536a30bbc7bad7d44394e29312ebc9adfcd84ca300a0c558588e6ae83a42eaf44d7215f853262ad725faef6b3c73830e0903a31fefd6a0921f30e12a3b363b2aed7283870304a503f3613d311bae004eb7a922f6fd50f1a013987bb8a564c1513dd7b42682bb7237f51b94ac28780f41ae45a772e13fa76fa0596b2015a656fd4864bf6789cb5d4e4c67cc05114ae3fd7caa8355bd16cb00a7a0dea6e67052bdc0d975f894dbe6b4d7b7474c7bf6f2d0bb9b5298073a5e95a43ca0f532a3b3466a65f1e6e948bd1a9ac5b36bdb0f824609c37046acefb55f76d0b7a0b92f68142fb15ceac6044f289b074c3333e4826a9f02f1469318f2273026339ea0a5f42aa4c2fd149ba3a73028c450d1d3c0c10536bc1421c6e632bd56d63d7565a0156d9f2ce56dfe6e92fe5779b15821b6bae03882935a167a0d3c10e03523f77480f90211a05d176d139f8def1c9dd83692adad161605fdec658eef8bc28afc4da848d97662a0e3d1f706ca6308d1f5e2d4cb6d641ba574b9ad852d6c878f9cec25ba7c8c8183a0f3647cf8efec130e89c09170b6a82a06cf2b9f4b15aff5d2e93d3c8cb5c294f8a071493e91397ece4c52482e3a20656b6780054a56986544555b07f5b053a4d722a0b60b270ab95f7787f4a40d6f68b667126fcb1272ddc0e9347205ebae3069b7d2a0b00e67c2e390212edde83ad1182fc5f373e9f47f11c8c69a04b87d75d0123b15a02f20f6d8f52b12c28ddba6fdca481dcb5a07363ff08758d83f041b2535666b18a03f573e0937a15fa5167802cb25220547e8b6c2194633ad2d2b4e15fa9b2cc8fda0a27b621d4212470161d3a1786d70b24ba6f0ba013677c11e995feebb3f7be72aa0894ac9ee877ef9fc4ea797c33f994996567a17777a57d22050260b18bb994946a09bf44993469f668dadae80170dfb81156b0decb5f7fbceb62980a2508d3f3702a013fc551024f4961a8e4adedb726962975a60ae0553a65f0dd7e266b0ec34f2dca087561bc3f849b47500f1f503a264466616a31a4e7adf3f2b2753b3f8c60444bda0421bcca422a9f02867ab2b0269bad562e8d35bf35bb332a48d3be29b513e4a78a09fe8fdfd9c06692e93cc2f1b277aadebf462a38a28abfaaba33f4d7e4212ed71a0407f10b8182d07c7f9789d469b68926931e184d7afdc20322387db7dd8dd950b80f9011180a0af3e6c1703878fa0f54ce9ef81044131303255beda112c1750bd46e46c17749780808080a0ee3ef4e754b7044fbaf982f80b8ab4ea00503fe3ec4c50fd7864e81ce1e6c4408080a075fb4f68ac224ec54d38eee3bd972654ca5ee1833530f0ebefd71a9f49cf09f1a05c099f09257a656d98101ccd60d3fbe861cb889f9699b8eed136268028021b70a0b90a5365f3205e9df1129eecaa73667c4d2c567f1ab45f63860c3671b46dc27780a0e38b7963499d1bbde43a95289356e98e19cdc1e21e10e097e1490f15e3662e0ba052b569b11cc62b342b35edfd24e3f8c4f9b3ec16930ac8986eefe14e609d073ba052fe3bf973b9ff06f119a91481e15215c3eccadc584ce8b6e7a05ea68c73054180f8669d3d676334b26bbb561def1bb646db346a0ea5f7c4f069e5ce4083818685b846f8440180a0b8f3308b625ddb7bce9e10a6a13d9988d1b865eb09df34844bf6b86b00904ae6a0aad43333d28e146557f1c682e8a4226743fb231fdd00a577512233bd9e920008", + "0xb8f3308b625ddb7bce9e10a6a13d9988d1b865eb09df34844bf6b86b00904ae6", ["0x000000000000000000000000000000000000000000000000000000000000000b"], [ - "0xf90bd2f90211a0c03ad780fdcff9d8db9c11fb9d1e7e4b7e72ef1e7eb869620b9f8ad84fc2fcbca0affcd853d02392931c090bac4e6daf5d7803bc755efb6f4428844504e56a0824a045b77e35264af8103e562dcf7064f204cc7d97ab329e99afce4734dcd38ebe87a06345cc57a046fe6fde4a96f9b7df705ac96f8945b2bd5fadcb617f87ab56df45a03f0d7ab38aa688d896e5380f34fc7476484c04fcef6dce8fe2fd19f022bd25a1a0f1099114fbade96971fc26d2b7a2822a55ec504b69befda54d658f99afe1e58ca093c6cb05b60356a08b2ceaea7535aa0dbe0c7caf772f9a3220c9e5f17c7592b2a0c6204dc22d4f391abd77861423f3d6cd97f9fb7c2462508c1125527b50e6ca43a0a79c861c69ea5078802d04cbe0b930db2d4bdeb979ab67729c53cf9ab4aa59d3a0784e0c317729503c1212a4fd4db192bc80efe07ffc88ded9bcfc86ac2087b103a019130bf59eede0e5aafd47c1c71fc61fe989f61b4fb948d0c85db13fd6d8dfa8a0245cb0c02898fd4305783b3e4fb036ee39ab471edf5ee8108e971cedb6e2d2a5a0693c76ef03bd97763cffd1bdefb70739c94dac6480502629c83697ead422d5f6a0333cd43acdce2a4b07662fda6fd7c8c3762a0a862df5e6ddda4bace3977c55d2a051abc316d294b1d3d741fdc30ff307fc2cbcab494e74b0c87263ffecd15e5f8da04c586b6f986d28a9553494ecae5cfd6caee098a27c79d273cbdfe7b90bca613a80f90211a09543463b5652bf35a17b7a000ecdef6a09d92c0b6a294ef292706322a643ac87a087c898c7a105f122e4c2b387cabc1b62e79e673e8360872ff8154e27e2a97030a0d8cd06b11d80236ab5377ba55d89efda25a193ca125cb4a3865dd3a853477f1ca0255ccaa30d3fff8ad7d6f958fa965264f8e018d956777ba51538d0e4c1b0d0c8a0816b5b6951cfa8b2d2bfb5b477c633431fa48f3e1712f458f8644ca3b6eef807a0dae819a79bef60b8f4426e82413b2ef4c7ab5ba30ef2e66c9bc2a8bd96de660aa0457e691dbcdeedb4e8d04b48af40029f8d7ad6d99c47696234bc21921c44f47ea00dc6631d7c767e55f3581285a12a7d1bf4aafcd95a471801c885a380b11f20b3a04d949d428a282b3a1a2b6a14e356a1eda9a768d6a50eab1f49f74426a27d3063a0ae7d76fbf7178842db7758faf0360923cd0192cd6db31dc4fd71020478496605a0659e1bd5e68ac0cb78094135200440a255ea1cf5c77575eefb38d9582e03f7e6a0bb66ef993a8e694c33d65aaa7c7920c0fea2569d48392775ce6824fc5db2ffc1a00da42a0f939cc889db93be6467b5687ea1b0e185b612fe11c8b1e0f11bbbbfc7a0c8e46c9aad59802b44569997e7deace74923242b1d0f35871ebc71f7b800d53fa02d22f23e78308978f03da3fc1d30936772d871f03ae8b89e03ee0a5ec1bd9afba0feb114b06e556ac52b7494821e3ed4af5fceed2d0e98b3629abb77b0b7d5352f80f90211a09f1c2b89b4d5b29b3a5e7e4613897363f56a7706c0c48e595129326231357264a06043940ace31b3b2d2f36f526abaeed64cf196f60f752a950a603924bb1be8d1a0a7fea554f16521774b2658a882d9ce0eca1567e34a2ed6bb6a1b8861b984d1fea0f3683ecac011ff970866f63fdbad0b563301300e7f58a00e41cef674aa896d14a06440b5f591a4cb03ea6bbb4cca6b327f8b1e5684983cc171992b43a0e7d7f65aa084570b151819d27b0a0bb8b0f2231ed3a75f082a7da2fbb121b9bf83257265d8a007f572f57dc18a840b9ae7cc983d0d27c1332634711808b57e6bb6af9ef4df38a0c2dd894af0e1c66e6f1337afbb951fc7af4a954e0951e5cabd485f1c22919992a0e214cd8efa8cda96f46b320edba3c8a02a9695ca635f14cbd56c9941c39db758a06fb5032e8727fb0cfb51e6a21c2acb2ad7f25e452001ffa495ce5cd284391531a051950f31467943085f0dbef1856469a16c86174be86b17223a2f66c3a956c897a012189d14af2ef21047ceb340372c71a9a9f2842c25621b292d1458bd876b61a5a013c85fa14ffee57ef1a31e99586ae65d31d65a033c3190cda0734e5389fe9f75a04d8c8815af221c1e6c9cfcd4f736e78266277e324fee0ab92923edd59b55b9dea069819278c8af35925eeb650c2245b03e7ce93cfd595c6f9dbc98a373f0d0918fa0761df9767bb3079f512bbf47390aab6f8ddfaf81d6f8ea6ef986d6b902e5d31580f90211a02a6e912cd7f8e31035d3fe8c65a5d3287288d3888ce9657c250bb70a9f258104a0676c3257a7c90a1c32ca4976f151bc538cc16199598c3640555eddc1b9a1c2d0a0cea107052cadf545b10283abf0e1a1ef92a8e8c56a8bf2764db3adbee2230623a07c0f9c98c9b84dfb73496a3cf6c34e1133733081cf0a0e64688d102384f721b3a03492e8538a07a6d7dd2963848db053b1c9654c41e21970d6172f6148fca2cbdfa0d83c4627c93c8b8086c3cd2f7fb09536f4ec239adb2b8ae47e428565c15df5afa0265456add4ff87a819f9d5e923371a9658b74e182d8cfb4769e4e8ff9a7cfdd6a091836c477ef0ce3b69e2e0fa6737e34b4a9092760194a3942aaa6d9a1426cfcfa0367e3c9c841827130d8a22731a6cf15958419a9a837dec1ff9a5395eee9ca99aa0db5f0ddada06d9b484e627e8c31a0444e6a64cfa854a0f783e748f68d80a5efba06069b95e3007d5e3bb25d747dc182c887edeade46fa1f2af5d49c9f429ed3774a0db2bd955de5a76983c319fbe51078cac6017881efc95848f0b6ae1988e7c7d0ca02efcef46816edd03f8bcefcefd783d277664b7abe8c5ddc33e78be5cd5e6167ba009887381ab79a3d44ae562b50dee905977ad5bef838b4a01a2e517fd8a3c7201a0b2c52c74f392745edf96414cda66a0526137892b5b560a1eca2551846a7c3866a0bdf88d8c1eb3b4f04b953cc617fbba4f2cd1f0c8bb5a56d0f8f279906d6c7d1e80f90211a0418dede3094af4ae5dd26bcb2b04b8b93a9629791d0177516ee6eac134913e0aa0d572368fac7f59ed1437eef4e05554240411abdc8d58c9e8a0e69c2ac30e744ca0980dcafe038e6ea00b8dba7f94c00ea7456ca08d33878c5c44eef7aba61e901ba0f11f693a54f600be4c64f629f1adb22e7de19ac4efde0911ad25cdc767f6dd1da0e1d250c658a7e98e9a84a00da24301347b6880623cc18034b64584efc06c8e49a0809bfed983cf0524e9ff9b4d7bebe105c663b86d4d95f22fe10345b8ac5e200da043f972b6cc2c44ee5f938199dc160b6ca45eda33fe6134fc8731ada7afb78c32a0d24fcc49261e0f659da6adf3ac6351d7c63d7036a5daf9008ccf8e4d79471bc4a0b3190bfedfddf6778deb8f6345be065957194059cf2040eb4261179c9d1ec9a8a07c3ab66333c79466723e5c6055af19a230d2458e9c1f26f69b08e75d9da8ee54a07cd533f3e86ebea9db73b369cd600c4447d92c2d39d798592b99ffafc31b1f5ea07d0534f7e52a7fd27cd414a0022aaa41c3d4f7ce2568fb96639547d3f25cd05aa0fc7b7dc4d0bd28c4212506c9e612800055f3583261e5caa3b4ec610cf9d7db59a0d52f467c81d11f310bb30a8528fd17431cde3eadffa00b86210470417bfb639ca0cce498a31fb06a8f747d686239b4f19dca239e40a378ce3b1f4006a2c7c868c8a013b6449f54a457c8c77708607c6069ba0ce972506f8b072dbe9d3fd931cd80bb80f8f1a096123db9192b6e29db6392ffc7aa5c5046aa0b12e40b688a6b7e1e88708c02d680a0791e7aec5e64bdfac85657e2f10178a82b807dd63027f89f8198a370311a8e31808080a064be38fc87a5208da02a2fa8d4ddc157d638e1ccb1b5805e9fdba41f151c4f6da0f40558ac68cb73d0693fa2db6bd93872fa83b2701fe026807404a55ebbf8faab80a0f7092e0007e47b1540b721877b90d3d98bf64de2948f04babab4192b0c5d450480a009157b7e154898d356b10d07e537d0aadbd30107069d303ad338367e499f7a14808080a0ffe5b78204edd7eead9d2bc2ad2cafec2450430e935ef6fd60935574f0e314c280f85180a00ccd6b1b6d7601266f939979a810d4c42b8cf6676f25778055a23bda076cfbeb8080808080808080a090b0f4c1f8207b6ec8f25d82ec3cd1309e040cae7813ace30a038494e98442bb808080808080e79d3638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db988875e336081790c4c", + "0xf909acf90211a01922b5f82f07bee421217744ed6d4e95b98852241f24dffa2f5701b1ddb8e6dca03fec17456b28fe0aea41291618b766813d90061104d8731e6e937b0922cae1f6a0fb94b76b2f2c5d4b40890a18b9f0579966eb56274035a58010db113ccbab922fa085b2e52483d7a1448504098bd8b3a0fc68becfe6fcf5e8f7442d08d1c17d9446a0c8b2aa37759feac9aad765fca7545ab9d02015364261d3f35384154e77ef77e9a0bc48fb8581b0926eb1d707cb1668b5ecdf2b1759fb7ed8d440bf1163103bd810a046fe65e822efc9f1b49e43ed4eb7600e9658c306b70a95999aeb0112c9954f9ca03d66c408b9ced8ee40c6281f15e26bb7db314045d5f65322fc1d5e24544b9192a0b26bf58b679aaf2a0a5f5a7fc9507e856f31e01a7ea47d9c5719957e51d99f92a003555409bff0cbb217e5d9fbd7d9e3b46a451e2b3cc0f27b34a3b553634770f7a05f71f83b940082edb3f0afaedd000ae4789a8b459c0befecf0085308961a38f4a0110aca3b49ff8a7fc3d60295d0c18602e576427a02907986d3fcdec5c8406607a0b197a531e48bf6f203d6f8b4088117caaa55d2318177d00a849c9bb9c0be11b5a021c55c465168ceb84725b61988c7c174880c9bccb99510ebffcf715f01344022a0173421253267ac8dacdd78bb3a49e4e68ce44c987335e7e22e2067f5998ccc8ba0ddb9469be4af0c764ae2984533a34b6ac6ad4535a7bf773d1bdcaba414288d4e80f90211a0134f748fc5e8562c4037bb335c253e159c2d3c7a1dc48b1e006fee1ffcc63874a0dcad9ec65f0b0b3e3d265b468ceda4c2626bea957ba6dd0f25e91d8f43615dcba0b8fdad766b78548db43d60da964d1abdd784ae56bd9ad9dd5ce7911beadab941a01db88587d7758f452204d265122d451f416f29219de91d8f1fd98b4695ad56f8a06464403607b9759cf6cb0e1bdd58d3a231ece185267c59d0113836bbce312007a0a23247953c05226318750e90668afd8b8f4a308f1f3e5573f92c03cd4fa9cc99a0ec186ad6ea36e64969fac78982f9ddd2c78f01fb5f059afc8d9253cafb348272a00e259709d156973caac69a52dbde1569f0ea9fc58cc9333b6fff01bed4ced9c3a01f76d216b1d1f75ebdcece38a62dc6d85cf090cec0b17ea8fe4a2fbadf02e418a0a44e06aa48e8e2b81b82ac7a55d10e0e75fb0016475f40b4b2b199016fefef11a04e31f7d98493c4af332a55a088d75bd53a55d37feee0fb4ea4bb89bd6cf1189da01fe39db746e4eef3572d1863d2edf73ef178986a33929a353e30d5a5459cffb7a0c64a8a52d3dfb4c33e5eac53820c25604e4c8f34062e2f31a00ada4c4e8ac794a02b09776c323c5f8fc6b69732fc17e7ac78fb63c9a42243b5b65bb067b05af034a0c371630f7af67645f11a19b70a01e20284fd2c3afa8ad5e72fa939e775090b94a0a2680edf63d1735ee9ce81c2bb867aa6708db5be648b511b2997cf6a82b7b12a80f90211a046660614c4b352e38c7a40b3fbacf123b88d343407c60aa3df2fc14e5c57667ea0f326e8d140b8c178ef04d4af3f9435159ad3c3cc9029a24daced2a2e5a7edadba04beaf51b9e686b2e9a3cb11906ac2c2b975a1f2b21fae6345baa832716d08904a00d9c648844e04c5a20d669382e429a02691b92a9ed51346e9e6b4c3e11950c51a0116e5123177580be67dfd0beaa66ff0aaad0d390afa05246c44dc8de9736c21ea0c566c23ca1b65aec125de0d781343787ae3f1037793af3d12e976ebc26b25d82a0ecc286af188cbb0d2f91980a6547e9c21d31e436f362565998d38063cb8e4a43a0161332b061fd1ae44a9cc9a7ee560b1f416a75f723df1d4607487149f0a6ef98a0ce4de6144c942d8cb5180aad406ac42934f039bafe6a7b1fba6094b104e3ed01a088da9aca558d0c51ce0fb208ab108b143e0a5122bcd5bd85c35e09b39a67a7ada0b24c5e971bdcc7151c89d69c0046c899379fcb9fd479d2b8a05df7348f08e4bda0bdb15b37b990be1e658ede5ed0e556d73fca185489124cad494721bd0c9dc79da0279294696fab46dcb10b5069d1929b96500342e6609fc85b5c242ebfd6dee280a02b3df2dfda83841f27315d0dcd3025dce8ee53425de4ccea153dd8f9893b65d6a07b3b6cb9b2148a7086adc24501672da8b0fc348a1fa78051ebb603f337f68de8a025f98ef38ab7bbaf176f7284ff1548b7638d013f817fd84979061507c4cb3f8080f90211a0817f0522b611763caedae0abdbf8a7d1fc523cc759bc6dd400d8837d94587832a0ecd37fcea2b496aeb18f74786fc7aeda2ea78bfb55cf27a829b69c4d15e2525ca019a27a34379a6a5dcd5a1cb8fdc5b7351b40eeb3f4e7d09db2daaf688e7a11b8a02339835ad35c836c7c9b1fd17f8ef9aa377a9e458316252ac63efe702fd895bda08e96214ae9077f46f6d2a440af91126a5bf62732edd0dc513efadba4b956fe9ea026370016e564a879e26f01a077e73badcca1551a92a05571e86d07af2a049493a0fab6a8b576dbf710ba642f849c36ab54ed462ac0f8e3593ad6d25af4e6f23677a06ed7fc714f359a29a6bd13c1a804fc6a19938f46c377fc97e787706dc8da0e58a0c0d3305cf25baab40da08bb2c141d0984d60afc353c4d0e708fed92fb2239460a057cdd07f66b3a31f01079d3933ee6a4fd5280ba7abec7c9bc1404ccca5224d9aa0ab9e1abf9a0bfd89d1483448ec555a10d7956b434787ae6c55605ce4c3fbb3e5a0d9d5c4782ba8bceaf3887b440321190898df7ce785679dcc628516de02069a17a05565679c56603a5614f90447648485ba6f3e324df4845af69482209fcc620156a09e4205f6a5c8e633cb7e5048148675d7aef4030de17d81e6d8e5a3e5f5b77a8ba0b995d98c91905fa0e083455afe9d4219e4f040c6e3bdf948b139a8d12b192157a05ed2de5e483fa16f32c9d56979082e36c77c1102e12020136172dfed9c85d28880f90131a0d56f8e12a9254f3fab9b7c5cb9e917dbc2540b1fa8e14f22840257d30c47adbfa0bcf412e2dcc182720eb7a6d3b260488603cefcdc206815beeea0b4700adb9e46808080a0ba844e9671269f0a8ab47cd42fc59e9ff5077adfa3c400e243146fcb708f4e5da0d1e9012aff863e29b5c2b7111ed41b55669bc3bd70aafd9302247c9a71176550a03f9b33fa55d938ae9dd41dfed6b17fc52327d20a2503c8e5d85a2f401a0e6ea380a0d4947649b148740ce5687696c87bb07217543329c73f7bb8900f1140b1563f3ca0c41116acc085e1d1b88f0998eacf59cc10a4646e9ffc4428b221c00ec5b1f4cca08c6b7c02a459200f13e8b385d3dcb998ec8f9c03cc1b7c8b3a5e753d5a65364880a09dc8cbc03d181ee816de24c1baeaa398a7b98e5f33e730011505e8496e74fefd808080e79e37a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db98786b56d157e7f5a", ], ] const PROOF_WITH_ANCESTRAL_BLOCKS = [ - 1, - 20793508, - "0xf90256a06f14ee388c6004c9f591c05cc94509906ebcc57e6ce9d7e65c52aa7da6f530e7a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479495222290dd7278aa3ddd389cc1e1d165cc4bafe5a07604903f485d83bda3b1333e28dec61ff3191fef0423ffce44abe02033b323d3a09c6967c2262b8e5aaf07f422806fa22eed9bd05898a71ef3435eb27e258ed240a061cf3a1b00a7ea8e1b8e4a921dbd9af3c73e9ec8646e9884b7936b74e011e05ab901005d61447fd94d1ba8d69022f0b7891c8486f9ae204a03b3b61bbbc905e371ecd613dfbe02ad85113252082314a8e78d016af918d9afd27030b5b7e890842a2f8058103e8c1640a87cd82c733d21e13afc3ce5e133ddd7fd3180a816dc8bfeeaa516555f3bf2545536b6605c1ea8276edf7d076e9346d88e37e24372bec69daa45caa8fe68c4c5edccefefbf60abaa9abee6106cf1dd25dc4fff490c7bf4b1f47993d733a25880a8170f165ed3bb283d69644fb677d0fd763a07218f66249961719ff37e762cf33f76036277f9c2d9e3d5a2a0b6b70cbfbd548a717143e29e3ef4a0f9b17f9f37bc546d06e5d23e02b3c64e2e542f026cf1d4391ccdf19400dc6d8084013d48a48401c9c3808401476c588466edbad78f6265617665726275696c642e6f7267a00b4078ca7a27f9b2448fa3f32e04a269353f80273e6dc95153458475a84238b98800000000000000008502d39a9e8ea00a7c969c5cab15361767d22966b8c0e507572acd096d3bc87af306be3ceb52138080a077f861b303ce5dd4bd241707d60a82406df608caa18ec241e33b5d5a2de94bc2", - 20793506, + 10, + 126086803, + "0xf90244a006f019ce5f815a48534f1894e0bf2bc479f3624eb3658a5b8b09683210371cffa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347944200000000000000000000000000000000000011a0db07d5c7f51b0fabc0ab6abffb98efcac1cb95f63dcae01ea8e73301558f1c94a05ab78472371830bfed304d360240d57e7bee41309297278fd0dcd5b198979a2ea0a9bcb4d6a8f248c15860a40a38c1d965a5c33173226d35eab3cfbb7112bd3532b9010040703482510e004000001884022000202001880a000450400806000144d2210045081100280910224008001040003110004402640012220006200001402020c1000084188008208a3010880940b82000149414030182049548200000208c0001190000281a5406000010100203040900e0311685481c0150002500124808000840000003088c028200010600104840049080d5c08aa14000111090084a2800001210002815123401000011028040260008840010a000000040810410880004804000002308064400c10028860002800840c480040582c3008020040820102901001028010094000110102801088001119000100401828100840080000021280680840783ee938401c9c38083574af28466fbb6df80a0bc24644d93f212885acc3a93836ba214b962f7508721517fde36b89841d126638800000000000000008301fa63a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4218080a080c2a58ed1b8b5bd35567d8dba40773b50e4bbe0b5f0e68b2a8a0d79c6619dae", + 126086800, [ - "0xf90256a06f14ee388c6004c9f591c05cc94509906ebcc57e6ce9d7e65c52aa7da6f530e7a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479495222290dd7278aa3ddd389cc1e1d165cc4bafe5a07604903f485d83bda3b1333e28dec61ff3191fef0423ffce44abe02033b323d3a09c6967c2262b8e5aaf07f422806fa22eed9bd05898a71ef3435eb27e258ed240a061cf3a1b00a7ea8e1b8e4a921dbd9af3c73e9ec8646e9884b7936b74e011e05ab901005d61447fd94d1ba8d69022f0b7891c8486f9ae204a03b3b61bbbc905e371ecd613dfbe02ad85113252082314a8e78d016af918d9afd27030b5b7e890842a2f8058103e8c1640a87cd82c733d21e13afc3ce5e133ddd7fd3180a816dc8bfeeaa516555f3bf2545536b6605c1ea8276edf7d076e9346d88e37e24372bec69daa45caa8fe68c4c5edccefefbf60abaa9abee6106cf1dd25dc4fff490c7bf4b1f47993d733a25880a8170f165ed3bb283d69644fb677d0fd763a07218f66249961719ff37e762cf33f76036277f9c2d9e3d5a2a0b6b70cbfbd548a717143e29e3ef4a0f9b17f9f37bc546d06e5d23e02b3c64e2e542f026cf1d4391ccdf19400dc6d8084013d48a48401c9c3808401476c588466edbad78f6265617665726275696c642e6f7267a00b4078ca7a27f9b2448fa3f32e04a269353f80273e6dc95153458475a84238b98800000000000000008502d39a9e8ea00a7c969c5cab15361767d22966b8c0e507572acd096d3bc87af306be3ceb52138080a077f861b303ce5dd4bd241707d60a82406df608caa18ec241e33b5d5a2de94bc2", - "0xf90257a034c4cec5ba48eef207f01dace9b74648f75423b99274d285eb51a28ea45a7746a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347941f9090aae28b8a3dceadf281b0f12828e676c326a017cb8d562b6da86b898d1579f2c0252ca4fc673ddbece39b0181fe6341dbfbb1a0ae9cf403fc193494aabb363f25427aa1adfe15793abe5765d28b0b1537e0900ba0b950d9ad9c7de4e5bd031c14c6d3afd38f1639e1db56590c6abafacae1e8be9bb9010055b5d41511013102900308208e003834d0c002308b480102a0a90901861621a7664ca1054060d40153aa1b99d74229a5c69380c489626d9027c9635a8d3ba580ed1ddc2810e5ef3f788ac929c12470b06160a08901404f2232ac9d42d9fa0785854040174adb01b6a3dd900ac9098e9d842ee6f52e148f0aba80cab721886001aa28bbd6804c7783a158856d63745f924614c4e1cd398c2a6525247746f4116aeb2021e09a52a018635202c32e2dce22379b9d05caf5986b252e4e0c401a11595d31264220a8210f01132022d6695481a4a02847113ce09583c7220200c6603891f33e680597a840000416a199101be82c29d000738c21d03c3b99150db214078084013d48a38401c9c38083b3f8218466edbacb917273796e632d6275696c6465722e78797aa034169fa758cb3cb5d38e8c22af9b88c525474253da05ca76b683f0c6ef922cee8800000000000000008502e776c769a01c91a492ffa0281242fdcb78078b290d5b055505d1872498d611f8cf295496818080a0686d3a40a3dd6df623831fd87b3c54877f9717001c997f9f9e1758c864df5634", - "0xf9025ba03f60781072e20bd526b224ff426c9784c24a949e977ad855585fc76c897d509fa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479495222290dd7278aa3ddd389cc1e1d165cc4bafe5a021c619739b6e81e67572203fb27f00c390e605a6fef0fe41c59f226853b082aba050885bd6330e2d1e68c236f561bcea587cfde066214e1fd0ca396d5574685a1da00f98eb31cf5b863de6be609e3389a276cdd0f5247ab142bba2210bcb5133d7d7b9010013f1cd759bd4d129b3bc004786899411332acb21690da0fe8cad091d3a35e08220c245663a4a52b01e4cda40d80f2fc1d2ad9988a862ee76672c504a032fc546d78187483ae99a39f89bd13ebde02ab494a3b071ed61dda0ac304eeaf83ac988d55bb445077b71e2a0c8c08d29496a11223b0387e5150c3620059c7c688dd1554a091f5492678d624c6d916063e43956c49dc589cd61013a60a345c7e1f65622bbbc4b9d5419e000ab03b6ef3ce98e82855d2f2748e6820988478101217e81ade1532542a5d11f555011218feb43548f47eb67c742392c7439c70e5be26174b5e5f32cfe83956d41a88413c522f2cfb0febf952d59b816e98a595fa1a18396e58084013d48a28401c9c38083d4d7678466edbabf8f6265617665726275696c642e6f7267a06f3f13b39fc3605558c21368794faf69b5edc4639f5f191fedbb9145f547fd7e8800000000000000008502ee08d0f0a0c3da7cb220020e2b5c78854d4e0822ed99dfeb75ff41a4066cd5c7b27e8943f88302000083040000a0f5decec30ba81918d464d9692fd3e0660f0f0247714899e77787b9b3e2fb2263", + "0xf90244a006f019ce5f815a48534f1894e0bf2bc479f3624eb3658a5b8b09683210371cffa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347944200000000000000000000000000000000000011a0db07d5c7f51b0fabc0ab6abffb98efcac1cb95f63dcae01ea8e73301558f1c94a05ab78472371830bfed304d360240d57e7bee41309297278fd0dcd5b198979a2ea0a9bcb4d6a8f248c15860a40a38c1d965a5c33173226d35eab3cfbb7112bd3532b9010040703482510e004000001884022000202001880a000450400806000144d2210045081100280910224008001040003110004402640012220006200001402020c1000084188008208a3010880940b82000149414030182049548200000208c0001190000281a5406000010100203040900e0311685481c0150002500124808000840000003088c028200010600104840049080d5c08aa14000111090084a2800001210002815123401000011028040260008840010a000000040810410880004804000002308064400c10028860002800840c480040582c3008020040820102901001028010094000110102801088001119000100401828100840080000021280680840783ee938401c9c38083574af28466fbb6df80a0bc24644d93f212885acc3a93836ba214b962f7508721517fde36b89841d126638800000000000000008301fa63a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4218080a080c2a58ed1b8b5bd35567d8dba40773b50e4bbe0b5f0e68b2a8a0d79c6619dae", + "0xf90244a0bdb13612402a6004f26314e340d25c864e27cbd26d90464c3a3191195698a038a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347944200000000000000000000000000000000000011a016cd64cf4911d99e5413d5740b90cade7def9698cdabf726e8d931bd5967f878a0c622bc1d9430ec4062302efe23cc8127742f8ca8978a7c3b27743124c4b7430ca093be9a83ad2bf4a046bab6c7a9bf877f261238a9b96058936458d61c2ee4587eb90100907030825b420001a40218a688204060400c00280164a0000844000344c42900250810046000040a80400090006023000150144000032208045046c0406642c12a140080000c308a2100a02952a5302110c45008014b201619000101280200039daa43088b44000010115000020008318003460a4008160000000012a80a55184024002300822500582132023801b0041122168080200268002400582a388019821040923023048002811120890846001a8428862081420980800010200028406000120220420008354800060262301028f12000808803168008001aa801201003100c8d20b3002209904049028801c20800010414809a00800088042013101080840783ee928401c9c38083771a9b8466fbb6dd80a0bc24644d93f212885acc3a93836ba214b962f7508721517fde36b89841d126638800000000000000008301f941a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4218080a080c2a58ed1b8b5bd35567d8dba40773b50e4bbe0b5f0e68b2a8a0d79c6619dae", + "0xf90244a02abeb2f843b0c7e14af20d88b51580260281529864bac81386715d186b188feca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347944200000000000000000000000000000000000011a07f973efd45c15188ca5b64afe8f2a431fc49da885ce3473aca30f18230bd9567a0070547bf249b370121ae7bfcf64c421a91c25b4a694b1982b1f473138d69bb22a057b9a7532db0ead6850099e396471c6ab4b1c1970850d259abe2e1e8f4003d51b90100c401a002c0040080d10018404420012080006908000402002006880044e0011025081804301200210000a0100010380010c1021000122280a4010140406809c822c00088b0290808200008b948a10401148608004108100414000000902800011485010882042204128012a00110480100210002ea0900400b010110010910080800006508800151002142001a08002050001781a82110008000109a2a0885180200000658028e000001010409089600268470040042008020900052a85800806910100200020800130088060882000042c40010038002008100000840046040583cc00902840010209040a1000055011001342c408089400620a08000142c0080840783ee918401c9c3808371781a8466fbb6db80a0bc24644d93f212885acc3a93836ba214b962f7508721517fde36b89841d126638800000000000000008301f846a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4218080a080c2a58ed1b8b5bd35567d8dba40773b50e4bbe0b5f0e68b2a8a0d79c6619dae", + "0xf90244a012dfd2e2be4bcdd6b79eac25fb75a3fc4d755aa463acfc7ff80f3bf4ec49353aa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347944200000000000000000000000000000000000011a0e49a1cb205090a958479f62241d3c812164630f09859538b98f20929700832caa0fb422fe08fca21bf0de2f413bee27c3ff3436ea54e32587238ce182d6dc1fb19a0274c2dbc71d835379c18401e3268e7c4f009b670b9a0ddca04743b7b0b65a111b90100005030021000000300001880204000001200020c000020000840000042c009000d08100030000108004000000000210800100442000022082040004040600000000280008008308a4000002850000000008400a02008000000210000000000000000010006040000000011000000889080004000200a00808000001208480908002000010002300060000202010180200100500080000000020000000a1004018a00001001000080300108208000000000000000000000090080408300000040400001020004240028008006004200000805800002880300000000084800200000300009002000000800001000000100000a011010902a00800010040001000080840783ee908401c9c3808335bb028466fbb6d980a0bc24644d93f212885acc3a93836ba214b962f7508721517fde36b89841d126638800000000000000008301f8dea056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4218080a080c2a58ed1b8b5bd35567d8dba40773b50e4bbe0b5f0e68b2a8a0d79c6619dae", ], - "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", - "0xf90ec7f90211a04e2dd65efb0d9607a296f28b3dd94f39a578c184666ef8d727fa63c76d148687a0d55b95f7f6aefb7c0fb426f00d56734d7f007bfe4dd2c0d8092fa2b208d09093a054192f1ff9b05f44fec83a04e1a5fe931bea4dc6b5ec5d2602913703ea6a07cca078b91156d5454c5dd573c69204ce1398ec8c3dd0e45775f68911d6f9ab8c29a1a062432b56e1ffdacf09220dfedec7653c08a25f35541eafe5a4ba446055a2688ca01f3989ce4cbe571ec9302b2d9fe9a15173e0fb2d52a56202c62ae625f866e8baa0174580c5a75d5d3995935cb44167a0934933e5ce5e14d21a561de586f6ce653ea0ec79240946967dbb5d9da7382ed150f3be16f62292945ca0751ff1e32343fef8a0a2787abbbfed2a5da4d30723ad082a5718aa6e7362a8134b67c4b37560427f23a057075abee0343f47830abe373793fe23659ad6eefacaa843aa8ef9c5f6ea557da027f67977f7b290dabcdaacd2bcb1469b47d378f8d971d5765ad9291a11e694aea0170edfddff726fdcfb87c69f0502860b8371e3f7bad1676f2223ebe396e84a00a0eb6af128e434b15a3c3df104d002f681c005bbb9d5c37390d1c0fe86af6cff6ea05b1b49e7b117588637f33ff16d964a833d2dc255e88981517b1c0f13cf3a27cba0a9c96e294dd5075d7321aa3b13f5d53622b2b9b7c580e391421c6b439f40270da09a969c19da8ade8a3b75bfd7d5bf9b488df9a0ea57e0a46719df6edcfeed76f480f90211a0b1e1c23b13cb58bd674fc077f21df540d3c768f717e219ca754da4eb5b4d94fda040422a936c16b3171c6b3e1d5f12acef9f0f51f5533b72f2fba7d372bfc487baa02d4500ba18bc39133662aa3f327eec10de7d0b4e24f05ee36cdc531694344d84a08c3a78f4ca554b3e4555632f6b29798f2ab382c6db3a7be5915a55e7fcc1bc8ea0382700d7458e3dab087bee5332653247f36ece4d658c326bbabc8e15cc1e92f4a083476fe0a219dd7a21a22f84422b52679faaab28fe1192d34e924aea0c3c1cd8a0ec17d9570c2578a231fca5bf987ba84b6d7b87648395809a1f0d5b0b08dff88aa02979dd8680c706b2e35c0c6be158ab1337420f09ae0aeb80444fe188240206c6a034139646c5d904b67ddf812c410621513e254136c960d6b12654372dc4364dc2a0fcdca3e062628e0a390cf5739e5993870f329ea13a62f9cc220c4e24405f7d91a0f19bc59e7a6c7d164154aa0e5d8a8ab2e7b9fe5063b3a5cce2226d6069c93496a0196b6dbfceddfde56d1dda14450513bc50e48aade0d3c0a487881877f2e562f9a042cf0e4abfce18d69f82fa9b12a284b48ab5b4ed0826893949de2705c12942e1a0a63ea52c0bf0af41783af33ba5ceb103e70d7922405b684d13470b67ba3a7259a007670fcf47b9800a1befc7824556568a559bb18b4b48bee7b046ffc5bcb7ccd6a061f9eef107c8d685c31cde5e51f3cd1b1f213a40e315f0923c6f6f6001f11bff80f90211a0e96698ba1725436c90a88087c88e145b904fb6a870bef4f71ca8fc355e21ced2a04fd2945e89d5dc6a0f43e0930cdbf5d70abf9c90127a8839b8b07240d912a4d0a0f842f3370180cc30bb6521c12fd42ae2d88bee77e73254a6f239f88469c09c55a05537d33d7d06cc4580f3e7e9d7654ef044da71ace71bdf5baf29966561e45befa066cbbd1fc101198ea2e2690dc8d980c72d33a2f6b820d387adb398a116025c18a03236f887fdd3785ccad080b67d65a1ecb0f47feb1734eee22485afc146e35b40a0f72324a07205eae63e114985fa445800a8285e75a53c3adca0466793eead1840a099cd34991d25321a827556e34d2cd347b589037f2b1bc677f940011b7a1c13d7a042de65b70fd2f9d52f6d3b3a19621ed6b18590d35c4361b44f463f6cded27beda01197d8ef083352a2d90d88551891b3deab62bc20685978b4d99d5fa14cbfa052a07f34645f90cbf7298dc60c7048e1d352e70dd1dae6f787598b6d1080f49971e8a03272e0642f91eb4501840dcc7e9c436ed63344b11f7f049048bcb1a3a7df2ca8a08a76ffa84b3e9272cb6428d49454038859d457bb204f624599ab579dcfef12dea0e7a55031502f08d2734db4ef7390bf17f44e2b3478d70e9bef809c206f293bdfa0abdfb9de732a5cebbd5c92a5001e65db3dda1ce7253435ba5c5708680e2e7726a0b561a68db428a042a35d754a7a1a9f6ebe8836081f992d3d2de19ccec0a55e4980f90211a0bf2ec407e3de692c31ef7df972caa2a21282902d3c2c7869a0bd44868ccd6af4a0e5e4bacd58a1a934a147638918e4451d160e9ec99647ea7f8852c02e073075c2a0e694ba7072b174c6a6752c02d1ec11d7cd988412bd6c37f07d295fbb7f14756fa0d6c7c0fa4c81d699e045c2a22ba0eb61179e4496804d6c0e592b5047b2993191a0798fddb883c25774fc6d1f51b652b8ea81dd03588410b571767727762c1e4c5aa07a7db1965aa0ad10434a95220de03416e2ddd00d654b33d3dc2ed2f7b8f48d22a0be7ed44c61160c17a7b5a3ca5495bf614f6f640c75b095aa6960c872e233e158a09df22d1f287814d3cb828ecea1120d6a9055254e8164d2cfd8b98c5ae0980ba3a07b2a7326dd534fa1cca70216e1eb0f1523a71258a42e4e8bd605da79388e88f4a08faed450b4c2371166de0eb1d7db6d5f1af19bd5fd4e7a0b12681026e7a1cdcba0b11e6cc0bc06f9e2dfebb7fafd410a461394ee3f50ec911c7049a390c9c27845a0d2fde948974177cfbfb25d3009d6cbddb9b4f6892df707546f2c00ba03435ecba04be0d058b041af7ce8807b0ca411360cdee3eb6f0059c906ba5600e8f0587309a0b62c7263e747cbed29cc1658606baddcfff8d9aaaf8e25a0d82bed3850e567c3a087b63a803df5cac69d9c9faf447a1289d8c1cb273faf55337d04dfb4111681e9a0ec352f8139edb0fe592c12d452b32defa9570e2f370f74a5feae7924d5785ce580f90211a0cd95d3ae92f92c6839f0f7435ee60791da5027497cec01dc1f4a199b131a608ea0fc91ae6a7c9106cfc39b0efc92870e9f4c98bb7a20ad21ea3d853f4a831efdbca03e3383dfc994780e7393654e27daf30f26f5f2e86c572360bead1a07b32d22c0a0cd6460eb11a1728f4b0ac2caea14b83a6ca0f54995d7f41a8852d1d234ba57f2a0c7edf11df5fcbc8d6bef9c4d63d71c81a02b7893c57a49c432b9177409509c75a07324b4b201e204754c986ba7a4408b46cf64dcccf965a44d3a7da7ac286a0bcca0d634fe101ab5770dcb54a80a2b794299b300e1adf9343d1ef26c6cdffbb7f21ca0fd2c5d9a536d366c2fcd145073b3b75672699b1ea55c70fb5075f89e427b6b4aa0b82cb047822a3f3283cbe8eb6ac88d8c71b5beaf47c8c6a3e8ae50780f6dfa8aa0e8c97b53fd657b5511173624dde4f31e239c49df5a98a57e1295029f486c94a2a09cfbcdb21e2d410f156bb467897bf73964a01e6dd5539e6330634b794de649e1a0c6e20f19fdf97cba0c8a21d57b1d33e1c283f4ad93f92fb7d67cace9bd434f90a051691b3625c0367b73aebeb6f94c3b5542bbe0f72aca52277ad31a7af8546ac5a05e104969fb1ccd2b7df5bc5f77af07c4ebfc424f506ce8dd0e164c3880e3ea2ca0034154f8f674659f19216e21203706a8314edcf9700f49249aa0894e502a3bada057616f55e2e620afe5ff22f313d5b6e34cedf4a64fc6163b3e3008bae24d35a080f90211a05c2ede3805ac777d64c232fb113ab67116c8a1f252a5bc401cf9f283e9f7a6c4a07acd632dc59a4bed389f18274a1bed7167eac5777e1a3ed16224130958872632a05eb84506a1607d7521f30a366c1891a54e0e84c22a7c48535c63f74d08fc237fa05c38dd95917629395109aff3e91a0d52a13ad9ac93215a635982dfe51a1169fca04e776df61609acc8780d262ec19ae6b63ae21509f9b913d388bd1b5f1a352ae8a0a637355fb9d52d16cae8522e1a11af232bde97b2aae1524e2d6b4cba1669f3b2a09fd76ff18b2f067852e1601c76112b4e06755d64c48cdeea021d6efefc8cc5eaa0dac65fc9721f10396a9488adc58e5722527bfba2af0c358a985132fca8faadc3a0c35faa1e275ed56ebecc0b51a8f89e115a7320a3c9823fa9a85e7d7afbb5a6eaa0932f7e0b119160a118e3eb7ed691cac7163ff775eb6e5e163a27904a14b75ecba0c41c5e70289ab77172db9e42bf65ca3a2cca2251f22f5717886a51e5d543ea9ea05d8ef1b1d38448fdbc8a6db86647ac38a4b580950bb7bc33902d82555a8f5dcba004a3dc79b1077e6e8be9bca62507b9004ed350a1095b345222f97095cd804bc4a0f53a5c5a890da2d8fa58c0eeee5e5c8dde92a1472441a514c32f03f5b6487315a03e7cff35eb4e28eeae7b163572950b781920079ccf40206ae4387906bf6327c8a05a1ba0533fe12a4dfc22ecbb2d309d113ed8959a1968b730372a99cd07272ddc80f90171a07d337e717ecd4ce5f45c4ea8994e476ce38cf937a4f2924dc40cfa8fe5870fe9a03f98e9ce6af172ec08481a6bcffb89a264933f90ee288a82144c0eab968e42ffa0eb65ea007c07bc1604264fecd433291c165a1211a8bf8bf6492cc1194fa549408080a04a57ac1163277a820bdae649d632f917b3885a80103654d3216f9409b72525d3a0031868dec233f986dc0afa16d6abf78e22396b0fa4a757f0688380756a844be2a0d3bee690d48173444d679a7ab969cd9199b83ac3de64db3d987dc6aa2ddb06e780a0ccb10237fbb545478774d6e858eb7a1327708de6c205c7195d3a5dacd5961209a0903e3cd41d04b4693e0eae1549f7fe024eb06b98fa1c137cacc66d57a7a0e223a0cd4b12759fdc60c51a4b922a20f065834e03d03e09830c4147f04a9c69a95d8fa0c329d67971ead7da9f1d222990d9aa6c0f448bd161c0981ef504b1d7292b666180a015234d9ef39b97af083fb5715dd5cc2f4454a23ca3a4d72419cfde3ea918036c8080f87180a0568a3548f0c468bec66c6d91b1d72f84e44373c03c6e118d7edc6ba8fe9b4d0c80808080808080a0ec26e129a6fc11a5dcc748bd22ca4e41a0ace63cbf1cb2de018e2b9585a06fc680a0d2a1c6f36ed0a7a00f11bf9afff2708629a67b24503f3b363f7ba8f6e92d56998080808080f8669d2092cd7f3f78137497df02f6ccb9badda93d9782e0f230c807ba728be0b846f8440180a0c7ccbddc2f91003ca8c7fbbe8fee23d7b237e674e0b450dfdec1a599d01bfc26a0d80d4b7c890cb9d6a4893e6b52bc34b56b25335cb13716e0d1d31383e6b41505", - "0xc7ccbddc2f91003ca8c7fbbe8fee23d7b237e674e0b450dfdec1a599d01bfc26", + "0x0b2c639c533813f4aa9d7837caf62653d097ff85", + "0xf90df4f90211a0ae94776f5c237b1e277aa2206301cfcfd3990fef08b60f1acbb7518bd2c353dda0a6dc453d3af2966ec75db38d8b592099cd823972058a68fdfa217788b8307544a04d85ebfc910e05b7de2b9a780dd871d984c36ab0f2c3f38eea8de6adfd1c444da0b5fea1bad6564cade5a31e978195248b2fd67bb195006827d1d61d0d72593f64a0460766bc32f1ce32df10f604758468b2998250732e91dcc43b3e8b185bda669ca0e21dcda48944f76f3d6508ab3d36035cdd82cf3d649f327e78532a62a40376b4a0dba8c95c72743ae2b7bad789e3038040f06f3afbca090b9da364ae39f0b15963a0bca1300f03dcef17a2f614fea6c34eb6a6f0c52f57e7fa15a75860541c671322a06ce72250e0d542a46b25347cada837c6316695108071861dd4b041f4bc56d0dea0f00addb60c5ee291719dfe5d93383380ce0c3a9cf54d27faa70fb3b30d424810a007fbe090c28df1099bc1768e0eefc350701227b351d4b0d434d81673b4867e0ca04e1032bc06c39c9d9ba823088d8ba3106c5018f4ef60765c72b1402c7a7cc5cea0a848e579a56b4c19e92b4a582288f1cf701ffcecfd439fb88c8f40173cabe43ea0d5839de991945ebd86629e32de1de57140de090842f3809bcf4a737bd75c13bea0287235eea51447d1b9b6686381830195568efc908c27092f561b2c65e4113ccda0d902b9642b74f04cf670d6d216c5f03d0d92f2e77c374e3e41c6c6265d8d429980f90211a0d61d720b302bc422f0ece0f3c0e5172f16e8409b6b8bdd15db021284389b28fba0433f3f07bc576292134817472d7166183bc4730e837f964e3011b52bbf9b081aa02906d2af47eb17db297cac9e29381427fee7ebb53d6a914e402535f68c4c7c21a09de01bfc2a3986ed7a00b997b4cb7b55b837a155baa3bfc171efdf1ac31487c7a0e9357b5192820eea672e3194d2020b131f29abe5671c37601633c485358eb421a00a3f410ab91d016cb1716203d732962685a6fc9436862ab83d9fc5109346a041a096e1687da814500097774352c9f49064dac34fe0de9f1848190b5a56fbedcb17a07006adaa8c1b203eab5ee33ea19de791fc8c9cf5cb15ec90d1ef051c9e2ed78aa0468135eecd2271411b5c039c6dce226ee4b251d3e671fea0238347a522241313a045483167728fabead0fa82c604abcf05e0141b1e82d5e94a427b367839985ed4a04c53cd84dd5c5e90d3e4c6bf7583a2d71a5f440e78d2e550c618a9c326ebce64a0f120f7e462069e2b91d3ce0f1e9be2cef10b699399b76e188a710c74b8968432a05a912ef4d4b331e64a4f5ff4a6268ea3bd66c8b823fcb4c3bf7c6e200d302a1ca07aab0db239e967467ed9b3a155ef0a4e8d03d058d44e9e63c39312ad2a986fc8a0afe49319cf159e2916404743d4ef869043fdeb37c79b20fb355a98e8500491f1a024f8f3ea7890564e7c9b344f5493de5f87cfc5e4512c2396a51040cb64d6aba280f90211a03b31c916b970491c86305379f7e67c97f98166cbc06fade873c5c7d324a7fa81a01b01b15dc4b7c66db50809b4236a98a2f05f156dc70a1e00ff7f009784a88173a098663d761acb23f77146aa5dc3fd4b487a3fec8d25ab2d5408e38e75489dea43a0a26e34fe93e7455b178fde2f89c1c99cfef61cbcb24bdb7ad8041be83ee67846a008662a0a8da5e79b6f4c601197a57ae00377f2f04a0f5edd17e3aed4c4d3777da0c3113823fec10487cde37f5ee2f39a8c72bd0413a21ba763acb5ebf0d40a49b6a044163b2ab486e7f99d831323ece00eb977db78a6594acb26082c5de00943616fa026fa7daf50745e3a6dfff87c28840cbb09ddac372d7759b796ea60b775f69f60a09c630785cd49c1b3aa3457999a1047d980392a18bc1d04f7763416ae01489ed6a07a1d5d86308774a7c26ed21faaa58d45efbb2616961a4bbe10d3fc88d99d0bf5a00c58bf78f9f278a3e75d22b39fda0df112a1cb8e05d79c32e5f31b94d4e99f64a070ed09023a65c88badb25edf59f2cab9708edc992ef461534b0e47ce3982ae90a01b690934defb8655cddc75185dd1612c1165ecfdcc8e7a19fdc57cae0f0065e8a054523f7b5547848216144e68b0ccdb1f819bd54ac210c2e4dd5a380edcce33f0a07dd9da455fb24559012c4903166f73f9c5e661b8c88f0bf7de019d73d4c19c89a04478f70fe968b2da1516a8f6b67a6b28011923c34ebecda2f45355e442cbcbbe80f90211a0d5393c3c06c8d597f6f325789484f12da87d807df33096a0af3161e33c44b8b0a0f27d4b26d1822dc04180fe221b3e7cba86c9fc524791c951b6b71c242099ef3ba011d2b20160240582f75dc941e1785643f7652a43d1d62697808657b0a0b8e186a0e9acd52b94dd294c782ad25e727c17934726d62052deac6cd8ffab7cca3e4176a04dcd91b21b8c73a57023c649f7d27cb9443450ee8301f56d4693e667218fcb3ea0630078c69bd028cb16cfccc05feb9f960484ed470f7bc0d1acf25fea5a68de0ca09ee40510308e721235620dc519619981d81e8997c0e7ab5c91f32f1f9ddffdeca0176656e94e76511030173bc6a39fc6fc11078add4c391a6edceb34cc28b7c83fa01cc9e278e51e81a30d6b18410a7411287b95c03d9ec2fd23396f0ada6410d2a8a04060e9e3881260d3fff6981fdabe0861f12fe992e1a2704ff948339ab1ac694ca08b8a356d612925d089be937debbdcbe8a40a941bbd07d7fe168cdbe2bfdc2d7fa0ebad3b72886fc350a5aaa24d20d8a143754c92eabab4ee2cba59697e7771cd50a0c24cf965d70417de74ee02b9cfdde3138d434c2cbc0c21006c04cde27a2d9ab7a0f21f4798a55807d429caadba5da04b2d12fc43569e7bc6c4b965976f21643874a0ec71a00e5b53a2f6043ed744c66b7ae5bc6ea1c7d32066014723a7744ad0e446a08b985961a92fed93614049284d0f08665a7a9f1b5dfbb025682a9551f2660f5380f90211a05510ce326198dee0033e6a2b29957f77687221d6f4b9a082f34922f9f589b003a0a6f336170753299b1adc48077e111e425fdc539ff7160a9babf8afdf5b5bef3ea0ad027c813622b3582247847a8537992e0a3f6a50e10c268d0ac8eacd1fd750bba037babb03742053f969204568854a958947fc93bcb978ebc85c83e35c5dc6fdfda07d3c1a847911e962071639472987bf9f0d112c983b393190af796342557a3ac5a07e243717881703400c60ec2fcc05040759a9646b61adb02412c8b0619e3059bda08acbc6de4a6c92f92dde22536a30bbc7bad7d44394e29312ebc9adfcd84ca300a0c558588e6ae83a42eaf44d7215f853262ad725faef6b3c73830e0903a31fefd6a0921f30e12a3b363b2aed7283870304a503f3613d311bae004eb7a922f6fd50f1a013987bb8a564c1513dd7b42682bb7237f51b94ac28780f41ae45a772e13fa76fa0596b2015a656fd4864bf6789cb5d4e4c67cc05114ae3fd7caa8355bd16cb00a7a0dea6e67052bdc0d975f894dbe6b4d7b7474c7bf6f2d0bb9b5298073a5e95a43ca0f532a3b3466a65f1e6e948bd1a9ac5b36bdb0f824609c37046acefb55f76d0b7a021462b95a644603890bea60588a71a17aac1e830fe290f6d9627f6a0ee173de7a0a5f42aa4c2fd149ba3a73028c450d1d3c0c10536bc1421c6e632bd56d63d7565a0156d9f2ce56dfe6e92fe5779b15821b6bae03882935a167a0d3c10e03523f77480f90211a05d176d139f8def1c9dd83692adad161605fdec658eef8bc28afc4da848d97662a0e3d1f706ca6308d1f5e2d4cb6d641ba574b9ad852d6c878f9cec25ba7c8c8183a0f3647cf8efec130e89c09170b6a82a06cf2b9f4b15aff5d2e93d3c8cb5c294f8a071493e91397ece4c52482e3a20656b6780054a56986544555b07f5b053a4d722a0b60b270ab95f7787f4a40d6f68b667126fcb1272ddc0e9347205ebae3069b7d2a0b00e67c2e390212edde83ad1182fc5f373e9f47f11c8c69a04b87d75d0123b15a02f20f6d8f52b12c28ddba6fdca481dcb5a07363ff08758d83f041b2535666b18a0def25dabbdbebbdfef848073b51725528ae2680f9dc8b2371b52d97e5bce5645a0a27b621d4212470161d3a1786d70b24ba6f0ba013677c11e995feebb3f7be72aa0894ac9ee877ef9fc4ea797c33f994996567a17777a57d22050260b18bb994946a09bf44993469f668dadae80170dfb81156b0decb5f7fbceb62980a2508d3f3702a013fc551024f4961a8e4adedb726962975a60ae0553a65f0dd7e266b0ec34f2dca087561bc3f849b47500f1f503a264466616a31a4e7adf3f2b2753b3f8c60444bda0421bcca422a9f02867ab2b0269bad562e8d35bf35bb332a48d3be29b513e4a78a09fe8fdfd9c06692e93cc2f1b277aadebf462a38a28abfaaba33f4d7e4212ed71a0407f10b8182d07c7f9789d469b68926931e184d7afdc20322387db7dd8dd950b80f9011180a0af3e6c1703878fa0f54ce9ef81044131303255beda112c1750bd46e46c17749780808080a0ee3ef4e754b7044fbaf982f80b8ab4ea00503fe3ec4c50fd7864e81ce1e6c4408080a075fb4f68ac224ec54d38eee3bd972654ca5ee1833530f0ebefd71a9f49cf09f1a05c099f09257a656d98101ccd60d3fbe861cb889f9699b8eed136268028021b70a0b90a5365f3205e9df1129eecaa73667c4d2c567f1ab45f63860c3671b46dc27780a0e38b7963499d1bbde43a95289356e98e19cdc1e21e10e097e1490f15e3662e0ba0ce536ccc69891fc11f58ebaa1a9f09bd1644af223c17493de3fa30e6e39f6845a052fe3bf973b9ff06f119a91481e15215c3eccadc584ce8b6e7a05ea68c73054180f8669d3d676334b26bbb561def1bb646db346a0ea5f7c4f069e5ce4083818685b846f8440180a011a7fd82551848c90631f70de7f85bbc1fb9cce3618351c58eef7d86c6e6535da0aad43333d28e146557f1c682e8a4226743fb231fdd00a577512233bd9e920008", + "0x11a7fd82551848c90631f70de7f85bbc1fb9cce3618351c58eef7d86c6e6535d", ["0x000000000000000000000000000000000000000000000000000000000000000b"], [ - "0xf90bd2f90211a09c966cba08b48e2cc2ed57c1b6d00b444fe2ba9d8f60d8762301e144519d70d8a07a20563343d31d105dd310428d48d1e720bd8a8db6d1d05a22a348b15f1e05e3a03d6146acf162ed187d09d80feeb95362da7a7a7b6b8d87fa0a2fb0241ecbbef6a0eb5cfebf0e4b38f44fd7e96b0f9ec47331ea2b4a001a0aaf15d4feaaaadce88ca0926045992c215e47c38cd774e959c2d7efa181eb7093ef36304cedf107141a90a0b9cb56f9c62c50301c5f6713bc940d15211461a217b0876ebab27cb0b2f35fd2a093c6cb05b60356a08b2ceaea7535aa0dbe0c7caf772f9a3220c9e5f17c7592b2a09e79768e342883191f23ef8fe1a21340fd6f07ac9a3440c5f0a21ecd9e813644a02892cbc44dfe072cb0e866da22cd4bf4241d114a5b1ae00055c3886c4c4ead34a0aaf72e8900c424cbdeb571ea949b4288c7f4f61bdb4ce0ef99a83b4daa068bf3a01aeab78ac9953290def2ad7fd0565ff7299664acb1935f885d9067353e37de5ba0ce477877ffc68b67bdbcd54c77b989c2c892166b03eb5e3735c784450207309ba0e66eac37d87951fa18609fbd7a2b9a8dc30978f319111f1c776128bcf818e73da0ebc519dab9974f968f447306a7345cf935f35afb8e1cae12841cc88da280d6caa051abc316d294b1d3d741fdc30ff307fc2cbcab494e74b0c87263ffecd15e5f8da04c586b6f986d28a9553494ecae5cfd6caee098a27c79d273cbdfe7b90bca613a80f90211a09543463b5652bf35a17b7a000ecdef6a09d92c0b6a294ef292706322a643ac87a087c898c7a105f122e4c2b387cabc1b62e79e673e8360872ff8154e27e2a97030a04391745b2de8244bb89668e063e02e1fe560d6f18bae7040cd39a2dbff00e854a0504749aae80971dd3f209b0fa20449fdbdb67a172464ed27998563c9cf2652e8a0816b5b6951cfa8b2d2bfb5b477c633431fa48f3e1712f458f8644ca3b6eef807a0dae819a79bef60b8f4426e82413b2ef4c7ab5ba30ef2e66c9bc2a8bd96de660aa0f54fdb49115bb4763d4b0a9d523c258e5968b1353d4a6376430c57a65ad435e2a00dc6631d7c767e55f3581285a12a7d1bf4aafcd95a471801c885a380b11f20b3a04d949d428a282b3a1a2b6a14e356a1eda9a768d6a50eab1f49f74426a27d3063a0ae7d76fbf7178842db7758faf0360923cd0192cd6db31dc4fd71020478496605a0659e1bd5e68ac0cb78094135200440a255ea1cf5c77575eefb38d9582e03f7e6a0bb66ef993a8e694c33d65aaa7c7920c0fea2569d48392775ce6824fc5db2ffc1a036265bfb9bc8dccce5fc1537f3e5190a1ed3db823ec18c6165c3cf374c57bd22a0fb55edb852ba28975303dae1f5189ead0f3c54282362abae1fe9abe9cfa6be39a0b7fcec0ee5f033bcb2067d6e80bca5064422d1891ad54c5e035f1b913802ae47a0feb114b06e556ac52b7494821e3ed4af5fceed2d0e98b3629abb77b0b7d5352f80f90211a09f1c2b89b4d5b29b3a5e7e4613897363f56a7706c0c48e595129326231357264a06043940ace31b3b2d2f36f526abaeed64cf196f60f752a950a603924bb1be8d1a0a7fea554f16521774b2658a882d9ce0eca1567e34a2ed6bb6a1b8861b984d1fea0f3683ecac011ff970866f63fdbad0b563301300e7f58a00e41cef674aa896d14a06440b5f591a4cb03ea6bbb4cca6b327f8b1e5684983cc171992b43a0e7d7f65aa084570b151819d27b0a0bb8b0f2231ed3a75f082a7da2fbb121b9bf83257265d8a007f572f57dc18a840b9ae7cc983d0d27c1332634711808b57e6bb6af9ef4df38a0c2dd894af0e1c66e6f1337afbb951fc7af4a954e0951e5cabd485f1c22919992a0e214cd8efa8cda96f46b320edba3c8a02a9695ca635f14cbd56c9941c39db758a06fb5032e8727fb0cfb51e6a21c2acb2ad7f25e452001ffa495ce5cd284391531a051950f31467943085f0dbef1856469a16c86174be86b17223a2f66c3a956c897a012189d14af2ef21047ceb340372c71a9a9f2842c25621b292d1458bd876b61a5a013c85fa14ffee57ef1a31e99586ae65d31d65a033c3190cda0734e5389fe9f75a04d8c8815af221c1e6c9cfcd4f736e78266277e324fee0ab92923edd59b55b9dea069819278c8af35925eeb650c2245b03e7ce93cfd595c6f9dbc98a373f0d0918fa0761df9767bb3079f512bbf47390aab6f8ddfaf81d6f8ea6ef986d6b902e5d31580f90211a02a6e912cd7f8e31035d3fe8c65a5d3287288d3888ce9657c250bb70a9f258104a0676c3257a7c90a1c32ca4976f151bc538cc16199598c3640555eddc1b9a1c2d0a0cea107052cadf545b10283abf0e1a1ef92a8e8c56a8bf2764db3adbee2230623a07c0f9c98c9b84dfb73496a3cf6c34e1133733081cf0a0e64688d102384f721b3a03492e8538a07a6d7dd2963848db053b1c9654c41e21970d6172f6148fca2cbdfa0d83c4627c93c8b8086c3cd2f7fb09536f4ec239adb2b8ae47e428565c15df5afa0265456add4ff87a819f9d5e923371a9658b74e182d8cfb4769e4e8ff9a7cfdd6a091836c477ef0ce3b69e2e0fa6737e34b4a9092760194a3942aaa6d9a1426cfcfa0367e3c9c841827130d8a22731a6cf15958419a9a837dec1ff9a5395eee9ca99aa0db5f0ddada06d9b484e627e8c31a0444e6a64cfa854a0f783e748f68d80a5efba06069b95e3007d5e3bb25d747dc182c887edeade46fa1f2af5d49c9f429ed3774a0db2bd955de5a76983c319fbe51078cac6017881efc95848f0b6ae1988e7c7d0ca02efcef46816edd03f8bcefcefd783d277664b7abe8c5ddc33e78be5cd5e6167ba009887381ab79a3d44ae562b50dee905977ad5bef838b4a01a2e517fd8a3c7201a0b2c52c74f392745edf96414cda66a0526137892b5b560a1eca2551846a7c3866a0bdf88d8c1eb3b4f04b953cc617fbba4f2cd1f0c8bb5a56d0f8f279906d6c7d1e80f90211a0418dede3094af4ae5dd26bcb2b04b8b93a9629791d0177516ee6eac134913e0aa0d572368fac7f59ed1437eef4e05554240411abdc8d58c9e8a0e69c2ac30e744ca0980dcafe038e6ea00b8dba7f94c00ea7456ca08d33878c5c44eef7aba61e901ba0f11f693a54f600be4c64f629f1adb22e7de19ac4efde0911ad25cdc767f6dd1da0e1d250c658a7e98e9a84a00da24301347b6880623cc18034b64584efc06c8e49a0809bfed983cf0524e9ff9b4d7bebe105c663b86d4d95f22fe10345b8ac5e200da043f972b6cc2c44ee5f938199dc160b6ca45eda33fe6134fc8731ada7afb78c32a0d24fcc49261e0f659da6adf3ac6351d7c63d7036a5daf9008ccf8e4d79471bc4a0b3190bfedfddf6778deb8f6345be065957194059cf2040eb4261179c9d1ec9a8a07c3ab66333c79466723e5c6055af19a230d2458e9c1f26f69b08e75d9da8ee54a07cd533f3e86ebea9db73b369cd600c4447d92c2d39d798592b99ffafc31b1f5ea07d0534f7e52a7fd27cd414a0022aaa41c3d4f7ce2568fb96639547d3f25cd05aa0fc7b7dc4d0bd28c4212506c9e612800055f3583261e5caa3b4ec610cf9d7db59a0d52f467c81d11f310bb30a8528fd17431cde3eadffa00b86210470417bfb639ca0cce498a31fb06a8f747d686239b4f19dca239e40a378ce3b1f4006a2c7c868c8a013b6449f54a457c8c77708607c6069ba0ce972506f8b072dbe9d3fd931cd80bb80f8f1a096123db9192b6e29db6392ffc7aa5c5046aa0b12e40b688a6b7e1e88708c02d680a0791e7aec5e64bdfac85657e2f10178a82b807dd63027f89f8198a370311a8e31808080a064be38fc87a5208da02a2fa8d4ddc157d638e1ccb1b5805e9fdba41f151c4f6da0f40558ac68cb73d0693fa2db6bd93872fa83b2701fe026807404a55ebbf8faab80a0f7092e0007e47b1540b721877b90d3d98bf64de2948f04babab4192b0c5d450480a009157b7e154898d356b10d07e537d0aadbd30107069d303ad338367e499f7a14808080a0ffe5b78204edd7eead9d2bc2ad2cafec2450430e935ef6fd60935574f0e314c280f85180a00ccd6b1b6d7601266f939979a810d4c42b8cf6676f25778055a23bda076cfbeb8080808080808080a090b0f4c1f8207b6ec8f25d82ec3cd1309e040cae7813ace30a038494e98442bb808080808080e79d3638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db988875e336081790c4c", + "0xf909acf90211a024523ab4c6860ddc65f3ee25893718ba117b0b64fa1a344b7f05424044422180a0ed987ec06cf1e724fb46f50e02e985eb14aa3de446a026be814cd2c240ab7884a01f37fe3602f2e817c85a42347aeb852d144d5df315f7ea19e5b946ec41e7710ca007818b958a696e024231c8bbc1940ab6f624063ae6536e78d4e751ace5ba3654a08a2d4ae213e6cd7da762e2a310a4b416794015af976c0df934700d67dcb6bb7da09b8c976db3807d89073d4ece4a434f2fb407dd7babc3d60557d7a6413397cd12a018ee334d7d36b3ec14e7fbe17cb2cc8827327961e20474b07b2d755fb60472eba086fd6918693e8bfec3a0b0b8963d88cca3bb1ff3f40058dcf5e0b8e12ebda780a08a57aa735f5e901686d294bb6a9f0af015bfa37a14e47df442043c55b29478afa0c5fdbed2d6f87128f683e845163c29abebd0fccc8720261233cd1739d8999bb8a0c667f820b9056acb0650bbb3da4fb5c829bb9ea3d58d65ab8e87cfaf689eb274a0110aca3b49ff8a7fc3d60295d0c18602e576427a02907986d3fcdec5c8406607a0e0a2958a4e2e8eb16e37ad795e02d8ea636266b4ea3f4e064a4da9ef1ee8f47aa076561dfa2df8680a70d7f949548502001363378d71e9102b2dc5f6bb8b48b328a0173421253267ac8dacdd78bb3a49e4e68ce44c987335e7e22e2067f5998ccc8ba0ddb9469be4af0c764ae2984533a34b6ac6ad4535a7bf773d1bdcaba414288d4e80f90211a0134f748fc5e8562c4037bb335c253e159c2d3c7a1dc48b1e006fee1ffcc63874a0dcad9ec65f0b0b3e3d265b468ceda4c2626bea957ba6dd0f25e91d8f43615dcba0b8fdad766b78548db43d60da964d1abdd784ae56bd9ad9dd5ce7911beadab941a01db88587d7758f452204d265122d451f416f29219de91d8f1fd98b4695ad56f8a06464403607b9759cf6cb0e1bdd58d3a231ece185267c59d0113836bbce312007a0a23247953c05226318750e90668afd8b8f4a308f1f3e5573f92c03cd4fa9cc99a0ec186ad6ea36e64969fac78982f9ddd2c78f01fb5f059afc8d9253cafb348272a00e259709d156973caac69a52dbde1569f0ea9fc58cc9333b6fff01bed4ced9c3a01f76d216b1d1f75ebdcece38a62dc6d85cf090cec0b17ea8fe4a2fbadf02e418a0a44e06aa48e8e2b81b82ac7a55d10e0e75fb0016475f40b4b2b199016fefef11a04e31f7d98493c4af332a55a088d75bd53a55d37feee0fb4ea4bb89bd6cf1189da01fe39db746e4eef3572d1863d2edf73ef178986a33929a353e30d5a5459cffb7a0c64a8a52d3dfb4c33e5eac53820c25604e4c8f34062e2f31a00ada4c4e8ac794a0ffc8acff839a16fefe9f3018b315c00a5d49b051bf7be70f35c452103e78dd6fa0c371630f7af67645f11a19b70a01e20284fd2c3afa8ad5e72fa939e775090b94a026173df7a5906e6d3ff8ee4f6467dfb731e50961f6d65546a4e6cd3efeaa509a80f90211a046660614c4b352e38c7a40b3fbacf123b88d343407c60aa3df2fc14e5c57667ea0f326e8d140b8c178ef04d4af3f9435159ad3c3cc9029a24daced2a2e5a7edadba04beaf51b9e686b2e9a3cb11906ac2c2b975a1f2b21fae6345baa832716d08904a00d9c648844e04c5a20d669382e429a02691b92a9ed51346e9e6b4c3e11950c51a0116e5123177580be67dfd0beaa66ff0aaad0d390afa05246c44dc8de9736c21ea0c566c23ca1b65aec125de0d781343787ae3f1037793af3d12e976ebc26b25d82a0ecc286af188cbb0d2f91980a6547e9c21d31e436f362565998d38063cb8e4a43a0161332b061fd1ae44a9cc9a7ee560b1f416a75f723df1d4607487149f0a6ef98a0ce4de6144c942d8cb5180aad406ac42934f039bafe6a7b1fba6094b104e3ed01a088da9aca558d0c51ce0fb208ab108b143e0a5122bcd5bd85c35e09b39a67a7ada0b24c5e971bdcc7151c89d69c0046c899379fcb9fd479d2b8a05df7348f08e4bda0bdb15b37b990be1e658ede5ed0e556d73fca185489124cad494721bd0c9dc79da0279294696fab46dcb10b5069d1929b96500342e6609fc85b5c242ebfd6dee280a02b3df2dfda83841f27315d0dcd3025dce8ee53425de4ccea153dd8f9893b65d6a07b3b6cb9b2148a7086adc24501672da8b0fc348a1fa78051ebb603f337f68de8a025f98ef38ab7bbaf176f7284ff1548b7638d013f817fd84979061507c4cb3f8080f90211a0817f0522b611763caedae0abdbf8a7d1fc523cc759bc6dd400d8837d94587832a0ecd37fcea2b496aeb18f74786fc7aeda2ea78bfb55cf27a829b69c4d15e2525ca019a27a34379a6a5dcd5a1cb8fdc5b7351b40eeb3f4e7d09db2daaf688e7a11b8a02339835ad35c836c7c9b1fd17f8ef9aa377a9e458316252ac63efe702fd895bda08e96214ae9077f46f6d2a440af91126a5bf62732edd0dc513efadba4b956fe9ea026370016e564a879e26f01a077e73badcca1551a92a05571e86d07af2a049493a0fab6a8b576dbf710ba642f849c36ab54ed462ac0f8e3593ad6d25af4e6f23677a06ed7fc714f359a29a6bd13c1a804fc6a19938f46c377fc97e787706dc8da0e58a0c0d3305cf25baab40da08bb2c141d0984d60afc353c4d0e708fed92fb2239460a057cdd07f66b3a31f01079d3933ee6a4fd5280ba7abec7c9bc1404ccca5224d9aa0ab9e1abf9a0bfd89d1483448ec555a10d7956b434787ae6c55605ce4c3fbb3e5a0d9d5c4782ba8bceaf3887b440321190898df7ce785679dcc628516de02069a17a05565679c56603a5614f90447648485ba6f3e324df4845af69482209fcc620156a09e4205f6a5c8e633cb7e5048148675d7aef4030de17d81e6d8e5a3e5f5b77a8ba0b995d98c91905fa0e083455afe9d4219e4f040c6e3bdf948b139a8d12b192157a05ed2de5e483fa16f32c9d56979082e36c77c1102e12020136172dfed9c85d28880f90131a0d56f8e12a9254f3fab9b7c5cb9e917dbc2540b1fa8e14f22840257d30c47adbfa0bcf412e2dcc182720eb7a6d3b260488603cefcdc206815beeea0b4700adb9e46808080a0ba844e9671269f0a8ab47cd42fc59e9ff5077adfa3c400e243146fcb708f4e5da0d1e9012aff863e29b5c2b7111ed41b55669bc3bd70aafd9302247c9a71176550a03f9b33fa55d938ae9dd41dfed6b17fc52327d20a2503c8e5d85a2f401a0e6ea380a0d4947649b148740ce5687696c87bb07217543329c73f7bb8900f1140b1563f3ca0c41116acc085e1d1b88f0998eacf59cc10a4646e9ffc4428b221c00ec5b1f4cca08c6b7c02a459200f13e8b385d3dcb998ec8f9c03cc1b7c8b3a5e753d5a65364880a09dc8cbc03d181ee816de24c1baeaa398a7b98e5f33e730011505e8496e74fefd808080e79e37a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db98786b56d157e7f5a", ], ] @@ -68,12 +69,12 @@ describe("HashiProver", () => { it("should be able to get the value", async () => { await adapter.setHashes(SOURCE_CHAIN_ID, [BLOCK_NUMBER], [BLOCK_HEADER_HASH]) - expect(await hashiProverTest.getValue(PROOF)).to.be.deep.eq([VALUE]) + expect(await hashiProverTest.getValue(PROOF)).to.be.deep.eq(["0xb56d157e7f5a"]) }) it("should be able to get the value using ancestral blocks", async () => { await adapter.setHashes(SOURCE_CHAIN_ID, [BLOCK_NUMBER], [BLOCK_HEADER_HASH]) - expect(await hashiProverTest.getValue(PROOF_WITH_ANCESTRAL_BLOCKS)).to.be.deep.eq([VALUE]) + expect(await hashiProverTest.getValue(PROOF_WITH_ANCESTRAL_BLOCKS)).to.be.deep.eq(["0xb56d157e7f5a"]) }) it("should not be able to get the value using ancestral blocks because the length is reached without finding the block", async () => { From 16932b9938c28858e827dbe15702cfa9eee48b86 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 1 Oct 2024 16:21:07 +0200 Subject: [PATCH 294/297] feat(rpc): adds Dockerfile --- docker-compose.yml | 26 +++++++++++++++++--------- packages/rpc/.env.example | 2 +- packages/rpc/Dockerfile | 18 ++++++++++++++++++ 3 files changed, 36 insertions(+), 10 deletions(-) create mode 100644 packages/rpc/Dockerfile diff --git a/docker-compose.yml b/docker-compose.yml index 6442e186..e26fbe9a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,14 +2,14 @@ version: "3.8" services: mongodb: - image: mongo:latest - container_name: mongodb - ports: - - "27017:27017" - networks: - - mongo-network - volumes: - - mongo-data:/data/db + image: mongo:latest + container_name: mongodb + ports: + - "27017:27017" + networks: + - mongo-network + volumes: + - mongo-data:/data/db hashi_relayer: build: @@ -37,10 +37,18 @@ services: dockerfile: packages/reporter/Dockerfile container_name: hashi_reporter + hashi_rpc: + build: + context: . + dockerfile: packages/rpc/Dockerfile + ports: + - "3000:3000" + container_name: hashi_rpc + networks: mongo-network: driver: bridge volumes: mongo-data: - driver: local \ No newline at end of file + driver: local diff --git a/packages/rpc/.env.example b/packages/rpc/.env.example index 5c46bb15..592c73a6 100644 --- a/packages/rpc/.env.example +++ b/packages/rpc/.env.example @@ -1,2 +1,2 @@ -PORT= +PORT=3000 JSON_RPC_URL_1= \ No newline at end of file diff --git a/packages/rpc/Dockerfile b/packages/rpc/Dockerfile new file mode 100644 index 00000000..bf14e30a --- /dev/null +++ b/packages/rpc/Dockerfile @@ -0,0 +1,18 @@ +FROM node:22-alpine + +WORKDIR /usr/src/app + +# Copy root package.json and yarn.lock for dependency resolution +COPY ../../package.json ../../yarn.lock ./ + +COPY ./packages/common ./packages/common +COPY ./packages/rpc ./packages/rpc + +RUN yarn install + +WORKDIR /usr/src/app/packages/rpc +RUN yarn compile + +EXPOSE 3000 + +CMD ["yarn", "start:prod"] \ No newline at end of file From c6d296a2b38568c7b6245a0f02b797072200ca03 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 1 Oct 2024 16:23:26 +0200 Subject: [PATCH 295/297] feat(rpc): adds README.md --- packages/rpc/README.md | 62 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 packages/rpc/README.md diff --git a/packages/rpc/README.md b/packages/rpc/README.md new file mode 100644 index 00000000..2bbbff1e --- /dev/null +++ b/packages/rpc/README.md @@ -0,0 +1,62 @@ +# Hashi RPC + +A RPC server to expose hashi APIs. + +## Getting Started + +These instructions will cover the usage information and how to run the code locally for development using Docker. + +### Configuration + +Configure the mode you want to run by editing the variable in `.env` by checking `.env.example` + +```sh +cp .env.example .env +``` + +### Install + +Please make sure you have run `yarn install` on the root level. + +```sh +cd ../.. # To the root level +nvm use +yarn install +cd packages/rpc +``` + +To start the RPC server, run the following command: + +```sh +cd packages/rpc +yarn start:dev +``` + +### Building and Running the Docker Image + +On the root's `docker-compose.yml`, run the following command: + +```sh +cd ../.. # To the root level +docker compose up --build mongodb hashi_rpc +``` + +Make sure to set `PORT=3000` within `.env` file. + +### Viewing Logs + +To view the logs from the running container, use: + +```sh +docker logs -f [CONTAINER_ID or CONTAINER_NAME] +``` + +You can find the `CONTAINER_ID` or `CONTAINER_NAME` using `docker ps`. + +### Stopping the rpc + +To stop the running container: + +```sh +docker stop [CONTAINER_ID or CONTAINER_NAME] +``` \ No newline at end of file From e871dc2f299de4779270d5c4c0e60a2a123c69cc Mon Sep 17 00:00:00 2001 From: Thomas Bertani Date: Tue, 1 Oct 2024 17:13:31 +0200 Subject: [PATCH 296/297] Update README.md --- README.md | 22 +++------------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 621fedd6..180167aa 100644 --- a/README.md +++ b/README.md @@ -21,9 +21,7 @@ The primary insight being that the vast majority of bridge-related security inci the systems relying on them had built in some redundancy. In other words, it's much more secure to require messages be validated by multiple independent mechanisms, rather than by just one. -We call this setup a **RAIHO** (Redundant Array of Independent Hash Oracles). - -For more details: https://crosschain-alliance.gitbook.io/hashi +For detailed documentation, [read the full guide here](https://crosschain-alliance.gitbook.io/hashi). To explore the real-time cross-chain activity and block headers, visit the Hashi [Explorer](https://hashi-explorer.xyz). ## Features @@ -109,23 +107,9 @@ docker compose up --build ## Audits -### v0.1 - -Hashi has been audited by the [G0 group](https://github.com/g0-group). - -All issues and notes of the audit have been addressed as of commit hash [9f373635](https://github.com/gnosis/hashi/tree/9f373635730b59478bf23215906fdb5ad525d3b7/packages/evm/contracts). - -The audit results are available as a [pdf in this repo](https://github.com/gnosis/hashi/blob/main/packages/evm/contracts/docs/audits/HashiMay2023.pdf). - -### v0.2 - -Hashi has been audited by the [G0 group](https://github.com/g0-group). - -All issues and notes of the audit have been addressed as of commit hash [f1a9fdb](https://github.com/gnosis/hashi/tree/f1a9fdb2998c7024268e9c69777f4dc43d2f775e/packages/evm) - -The audit results are available as a [pdf in this repo](https://github.com/g0-group/Audits/blob/master/HashiMar2024.pdf). +Hashi has been audited by G0, Omega and Least Authority. -Additional audits can be found [here](https://crosschain-alliance.gitbook.io/hashi/v0.2/audit-report). +The audit results can be found [here](https://crosschain-alliance.gitbook.io/hashi/meta/audits). ## Security and Liability From 8102f2b671f1804f5bf993936e0b6c5133362f27 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Tue, 1 Oct 2024 17:17:02 +0200 Subject: [PATCH 297/297] chore(root): updates hashi.png --- hashi.png | Bin 1421472 -> 7372 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/hashi.png b/hashi.png index 9847d86ff9ce2acf4ad3a61b29517d6ce711b422..7cfe0b14090124a732cba9682ad5ece95594992d 100644 GIT binary patch literal 7372 zcmdU!cQl)A+{a6+N=wCzy`!OMifYZM6>3I|D)rPJMX5bXYZC;aHEIS;tQxh)(^jMQ zYA9;dEJ12--sE}zfB%2a$vHXa+V^!|_xJbt{;oJ918oL+F8WKCE-~o9G~kymUBzCy zM3r!jTyV(?DE5H-M{WB^TjSD2OmbhxrAs_fIvQ#SAm_$s+WfZ;1&3Rtz=7W%0jy$- zFQk9`3U-?p=$7@)j_7>-;Tkn9;|tj>h3?0W#TjKp-=+FKQy0fdJ@0v_KF=+Ig`Ay^ zhG5dgJ=U3(Q~XKmN{A}Ih)(MN&mWxDM4h%_&;D-n?mgx@cVSLzZ^bC%+NsNR64u8D zHV#J)8LRNAgdW%2{`CW=wu4DGnJ3-fK5M5AuMVc>e`ORdGRZ5|u=W%#>f&CVTl+JY zF%^N_6w&M@scAKs@Yu9G?{BJOQEr%UEz&o;iI~XY$UR!H8tn%240jj6(paz?@=IgQ^OZsx%*e z3%eQ1wkS8=h8thOAa?I3hQU>%cQ^hztHwJe#F(pz$A+WhO){49LW6zb4Z|Ccj5Ubo z-hmj~Yp^&ASCNat(fiB|$8Bxk5;@ZPYs57wFrZYbzeB;6H?@9!TEYmCJv+vUy+#e^ z3d-x__`s{(6EstM@7pJ0@?|*H6^v}oaJIDf-yn>{uST%uy*fJVC2BbHaqf2x+P4@;f=w01)bfio9RppN#eb7Wf)9 zoLB-mNxXfgZj*VNtQ&W%LZhod{Z-apP!Q$*$TCl$0gug9S4!qF{+ zB>OE8D(i)dC`DzK*;A3jw!C1Vm&C#DYr zUxx)|TXdy9?~u@W;Ost`=1wapdRt)W`9{I*3062GUS2_ejuwwWP++az%I+HQWQljJ*IX zdISrd`VP4*uEdA|3P#OfF7&X#2{&5XM3UZ2y3mJ+E={I7@cD3rTA;P%m4!;QzE zc*Y;j=2L1-?0JnOv{X#__;1qkL10;U>z|1|vd);rWqN+MmIxmXrZ1GRy-pbb!j* zDdRu5AHqAiS*NmC%E8(8LyzmJKv^*=l@*1n8V%6>_yfFHD#LjerO~Qqwnu4B@c*%f zp8w&{t*^`(sv)#IAXYR$DK|A&jZWPK>Ub!m4D-Mt*~qn&R74EIw~H}fR?KEs1^Yxp zJnP6NZ*ajg%V}p;#pSo>^1zB}8+lh0Fs{VA(agU5a`8ERVnsplYL7!70Q@x##`R>N z2ffz$YSEsLb5DRRFQo1oMcdPTIW@bRkwRiGyPY41q-#TQH7w?ZK3~m1{5#*B-Ty18 z+$_2kA?1{s{J_4>%v>a06N;-$dt1bl#0!;jOf^39gNY}EBTSXG;Oy@QL^wQC2?GB$ z!kN4+R!XvZuhgnz7V|?8%R>#9lk}x`7{R`#6!nr4Fy7Z-1fL-Oo~4hz-#>HP-(%NV zVnX4Z$pIyM@~ZdW<5K%i->6{X5#b2Uq99|HSuWV#Cna@9j(sS6l^VXc%WJ?HwY50s za`%Y?SE?=t3g@I}*t7a?BDTG>d-Fq43Zf<)AxAz5j|qDD$GHMumV$+`2r8`Wz`9l- z!^9ih$*7|J`08>f3Q-u2kd)wklu3{^@~t>vDVVDGib7f~25^TKZu2#JAwXE~T_OE^N5;XSyc%?~p<6O6tualV`B>8k~QLMT8E zcnGNNv1(m>#YWP#n7FG>rNAzS?GNi8sO$ocRU4#4)TWK%*Nn8LTZ-VaVdXB z`#Uasooh1BfifjwhY+@p|1j3B3>?p$`8&b|9tk>_#vs_-cpo~*x*MkVH#^;NuU^9; z#(tUG1a7UC+PJ8>+N_~)h1E$tKRpg;Kh*Hw1nErQ`}NoD@2V%?`Ci&i%4Bjlf`NFm z7!ERVZ)kh?C1`VE_q+B%@}HO=Pp@EHoo^s|?nQj4$#4;=ByMu_2kager%XnLBWSq! zpi6q#f}YCrcZ*RQQrUsT{BT4F6_y@ED|Gvi3UY5MS^Q+3K0g24&A-jZ)e}>A9hTm( zdfwT1{No^QnDs*qmLGn@E%##in}iVC6DY2=TTa8`&R*?K9OT6{)BUX`R?Xxzn|9|1 z7@_MhwuYmb&cnWKQK!jKP5`@4!q|EaZg7tJt6FyW@D)t_WU!m9)nCC2qL?(mF2o79(He6r z=XJ+49rhn;xTd}czH9XGA}c$#x(9-IvNM#)Ixup;`xJSG z1DU<5$H`)GURs7YkKv&faQ<%&0X8it?%m{7+rCqk3yd#4)PL*kRe^FuyKRECeS{koPAMZ{>G?O`#VOFxB0#ufK zo%e$-HMzFgO<7mwJu=p_W(T`dVNWv@(t#Zv3E$kF3qCCMTHGjzIN|eIc}QO{=!~hO z!EBRZ9D@H;6CnKyh7=wL`R{nlcoNb`nUAP$kjSv6fF4$?g&9>5U`8ZBXTZ8jhW-3& zUwd=KeHioK&4c!Fhn9`{iDr2hqQd?a9EtEi#QA6mH6qg}SC*zTj2bI9zyuArCe~bk zw4XKxOc)atEMrtS8&S*)^MB@sTRteY;m@cx@t!;O^t&3nQCLoz8$o z^V<`Pp1wjYlhNw1E+nV_j!ls7s+#ET`i%RL-1y_LfASO8xRbPWEqLKg?}yWX3*B?+ zZb_goL)gL8oQc}m(l^KJjVJPE`TC5WAuM2PDr{c{uK_ZcAC%C2J(dYS`a8sDN~df+ zbW~_EfAc;jk_K~Ev6dFX)oqU_bRObCKG1~C^JUA?WdP}25XOhRUzT1#$mXf!gkGk0 zWLBJyURAOM(Xz1O&K1h&t$07-heZ3kK`Y|6>m8!JKc-?xG7%PEDFoW%nr;{8MNG5z z-M6yU%m3O;lxP6BbTOo)QtGUngz5~0YW=GO@G4J6pM~CEtYe?&iAR@*BMi!THIdnQ zf-R(1x=0-#s|pUDJIS|fw8_9KUP`y8;p`&xh4wALZjg8NUk_ecvSd{xqjBK~EjJzm zBr#7I-_Z}!V&R>r>bRE&R7b(d(>dGn0|fDv$yI~+|`RFyPh?8g`MDJo5|z^M(Ln6VeC06$GK#foP$Fbd(5 zZA8at!bI_p<$UZVwL|p$rUb|cn%<9rMn=twPC9Wg+wHWi4ml=?wz#91$%}B9W3oM+ zlbhEM&I6{o{TZq}<;|=Zrv>X%VXd;L0V)?#?srzKY@aKgQ@8wD}l&$%(O;ZB?Y;6s=)h%CDT2g(ueQKx+e0` zOo4l4NCG*^@J?Q?LJ_zqG`mE$1c2onZSH>6Y#=c#jj>{nt7eU#LUld1Ey}T8TPJk{ z(<*=+oR@b}&Ys{PN&&Ko1<#Or?;mcjnm_T}n*~vZL31pM~4_-30Vtr0LG?6b=i)H1N9wDPEeg2Ug?fyVZ z>C){AVp@pky=DA}1!ATUowRO!ca6f*h?=to0sKUsF)r^S1?c2gbom6045FZMI?hoD z;`mgj+foc*_l-34x*t@;2h+i+ixXaRvn;GPp*P3KKK)Ck>LGf&v4Vf1wM9D40;WX< zTyh&@pdr%#73_iDF%96DF;6$Jyq0mIPl!#q+gXLOp15{76fkYYn9=_%14yP-z8&&H zv41qR$d->4rE8*?3-mmV-F^o}IvA8FEvFf;c!(6rb4o%fTiO4N$ZWSw-Lr6R!?Lie zg8t@Y|LJO+MFP@Mn6hxpXn<{N2*c9dTyh98V&_K@6fgw`^!B?{l$mvstRjGE9L7?~ z=cz#9wj1pmD&%cOpGa}H7v!XOuVF= ze0RbE!uE8TucxXY^V*)>tqBu*`IOegRV~LbsICdrwJfEVx#%_hyH}SX?QIIhL9Lm6 zetf#^_mp1uEuZmGKGMVtE*)eSABLHWgKQ4(>&l(b)U><+Z?jgeYd9K8{WnUH$qAF4 z65H0cZ|8kmUfn(5M8ylLKn33?HNiK??iK4El&6QJufv$h%c2N zX?%DOjZ+EDxu(2nofxuvtf?xb^pS}&lfKr0h?X#$%!0TrPaQzCIT3ia`7~O|r)@`~ zv+*+6lnN_p1~foU<>h-1WNAmRE{ z`Xu7E_VjP{_jSe9%oGug-OH5gFB@;3Fj0nLFjGnbHk_vDDxAm&{m?7akY{ot%<{o} zH+D|;Vqac{*HFW`ktE&7jBdma8)-58oFuq^a2ZfKuK(7rI7lJSU)yFrB;-1!T`SpB z;}Zwrk4;oXwSFg)J%<*5|~y?Us3|dJlT;)E`t$2%SiycAx8A_iN=$o z5=HqUu6u1~ulHj8*eEHFIzo~F-p~d!a=u|_D{GV$lP5T%($V3z!X;kjxYCk4nH-RO z3LpnEu%(?cAZxH>o-A2FGVi)bPs=kWr zY5A*eD{Gv^JyW88RWIQ8hFkJfyYy21ucX}zKE4ybKVRpF!O&oC zWix>Aq9h|p^L8C%2~@|UDR2LG#!1QuJE~BY!1TLz=R?-uAP65#Ym_z0KEl_>9ffWT zXSJJZql65^;7uD*EfY!6z)hve2)ua;8RTsB1o2`VMw-_Lh47Q=;C>7TxZO!wL)RJ_ z|M9G{vvE!xw@NkzMb$~EeHRATH5=wWL{XA&fUMZ9Em<6{DUM=AT=-Pp7H0pYrDX8d z_kYC!O;k&oE5lNNEJU#WSJJKem_c=28)%OQGeo5kE$-$af_K$6&eDt-Ecrg8+QPEYucCo0&G4+%m``x4{+PBz#3d?lSr%RAyFeP#@ktmmJ*hyWAy3`w zeIP#tugjyKt08Mw;GqpFYRKy8TgG2`SqX-N>f({%Xk)U7bE*p5OpC4l@` z%WN6M1kC&*s$Lii6V=(QzfCu3O>Y3nK_<*Mh}1z3<)6_sY_ z{Gs3cD%!~l(Zn(ob)Vy_!I~60t5!`QrRM{vQp2U#rWS!ZDU5i}Keg(Ab^C#A^5g{zT>d1yy8=eTg34I$T#AEKriZk> zkby++mEQK4U4A^WKc(-XNj8^t8p;O3_=SVi2D*e;Bh~2b0Iy!GB&N(^GO0?C%@Ar? zNLFn-rKapx$`sXJf`s)w^+e%T6%#FD5l|`@9g1YzoX4N)Tf!m@7|^|EL_>FwWrGwn_HPMpyc z^hl|CPfZ5a`$T(vo16qE_rG7n0pZg5f-H-J_z3ru?k(>Po}zqO<-IH1EK}$u1SDr_ zzQ%c-kYHcYfg0Bs(4#pougboHan10z;WhJw*({)zt<}o0LkcMxWM>Is{25u3rHq{g zNT+m|8*skZW$!6cYPtv&w6Z*>xZb25nV0neJ=|eszU#&X*`G{_52$=rWSZ1=WQ|+dASPS7 zjCO}{{y!c{8S*2~_Mm@06m|y()n9QK+)*o)zhA!`j ztsYM7%NMZ7(n10V@NC@rmF80Gc8}c0ZLZ75RrP&$L*G_bkPIe5>R$}U@b?}6gLkWH mQ)2o5dY|@xUjqgnht;XY&t3NR7ol8J>S!8hR6hLY&Hn)RAizTa literal 1421472 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 (9bAR=W^2gK}_&jc?+ETaOZzb8hryO z`f|bv+ro6Wr(iM0%`zUC=D;+Yz?_5D%K$j@#^uu|(s%~q(@&oT7o|P? zW#}ug{yeM-&!Kbq*rjA@FiElz0kKS7g1Hv4z=$&)bN(osDDs!^-Ec;)MQ*WxV>5h_ zxBx6iI&1frFh4_?3Hc&SG9I%(c3vtb%0e&1 z^@}r_S~^|;@$+xOa)B=(*qmv=l+P^56BhFcEF&~=-j62oYR+|LNM<~Pgs&s zD;ONTGb;x#`kX@g76W)GNpmZH(F_?fW z5|%q`P+EIRVYQ6aU2H$hRGG<#$~mv1F^wswEb5p5O5Os%#6)KJ{P^_l`yUR6y=)JpYE>lX+Py7984+!mQy;`jSbUgL_5dZ#n zza9E$1kGx-*=?EJdb_^5xmvGQ`@8$^x8HWh=i}kv&=nuPZs<}@aTrB%2$e%HQx!u% z(M-$}xaavXRx2Y%mM}9vTnJ}f5P%^8sb!nA7FHS{6pYXeizn)&?^jcrQfmajvI|Y6 zN<>6ZwUkrNB2v0dOtXMl2mObKyM1@OJ2b(&p&!ORW|PwxPgyL>-@)!nO%b9elL{?~lnaWzSrD zN2}&)8@~GLx@{Zh0;q8oQxw8v$_kF_s%@*fIgM^VJjX6t790CYO+{qrrQZikn`T{; zKX&=h#n0XF#}5zV(EaAq$A9$c!(aUJCttnZ)eZte2pzf&5ix?9NE#()1TUHmK~Q6s zs`9&w6%kc_{o|j!-85JSm*T)9Q>ZJCtA_Isw%hgkVuxY%)DQ1Iefa$!|JcX)lb?M3 z^_w?8{`yTD+^Pygr^l!Lao^?8qG?lk2cC=5C$UXFwonCU&TICXH01<}=p8yI$T1F2 zr~UENwY$yh^(w2pfA{{~`*&S`)U1R^T#9L0NHQc~VlYcN9#1mH!IKkBAVR847{~?h zeHBs^n5^!t%n#O6@6F60_+V4}xtaoVaq^uw06-v`=FQG=Z1zbzwO$)J)UhMUNP~XCjJGHJJhenPxJl{ppyF=K8Af z^=gB@;y|10`lt1qaWqG`s+a-_o1y?3I3~|^sG)*Ge>`-DdR6`O_08qYSL@AH6B=Lu z%T`9+iW#b^0tf-rt{%s}a7f^gx$@qtiHtFi(F9l9i{|1QU9c=>lF~7Ehun1r>Z{Oh zwqdB}|*bS!F?%z0u)Gbf@drKJ;) z$u+C`@^%HP!vJ~6eHUZ)W(2URT<{eK5;GZby}7yA-L|`(IvS7r^t9(wieu_FXcp1dz5JA!O^avjkbmEeQ}%9JN!o+%ie9xM}8V4~W27g$xE z9v>ecAC&ObH$T3BGPF7_iBxwc+yTdV?B4b_dS)`p-+gsh`= z!%2rBkB19-6Y5qG)d2xF!BJp5sex9lYpOtw2+)9otE>r4yNZ`r>)o#3pG32&_Qz8v z{WuO9N0Xyt-aI|8w(VxK-CXUO-PRFWibh&I{amc?8$p9#UdIMVrub0x-RR`{$jdYLyZdYriuvK+Ns<7_!L!y}w5 zEla{Pk!3d5*(T6#FCc!=ea$tHvJ5i-M_X2>+~w(fCgIauftacpI!$c?BA&4R%QE$! zLStM;Kumr>GwPnk15aL=Vu%wuCjbK`R@Gu1p{C`(Slph?JIKT=StRyX7u&!1+1LN{ zS3iCC>BG10?o-N|i4Bmzfq@7k)BNyHh51s?UkvvQ6$F875>^>lDQ1=a3 z@6zEp=BR4UaY+=_iZ_uCefPt6-|6@74t>}61F2Px0(%o9L}q3riRtuw?8dPh$Mtr7 zv$_ePzJGii#$mhNUR-Q7>o9cthv#?if4G0R*9^C>U%zcy$ubT@8k2|;*}AUQP0fa< z!_g!k_D?yBf~W#BF=FuEB&&*O0staEJ)aY^K#0i1sy3Oy0V0sX)SiUrokP(C(1@Lx z5wVdfW~2=8jSFLx zr{hyUoRVfG0_TanCl;lg%ElqC%a* z;c((k>K5Bj8=?aAV;u76Nn{Wc&^Qdw4|Lk!wBgn60$ueSyXRwi9_c>P_wOEl^W6_W z{P6Dh@c1wO>gV5lbuE;Sn!GzzVMWfSK@w_HZ=Yu(@&@Z&bE&O|OBQ%p{9gd52NKv<%)RSC}cCN8y+%pnDnpOGau|@b?^5Cs)2N_@5m`v47h^EkN0H#Pd`5P%Hfe8vKATk1) z8mXe0fTj@%!>iX{{|Z`jn~QHgv^Tqd{MUc+lb^p`ZK}h*6H5k4hCo!_Kt=)}0TTcO zE})@MT!dgIs;0oj>kYtA4b{kuRRI)>OM?<2NzOWq8l$-=0N}-fm}gh}tGZ?Mpjl;9 zOMq6U@iB0ySD{@!9FHF!A0p-LtIMm`08T-%zHcrr-w=g7#2m9i1|uUxDp3YRl>k66 za2?YqDC~&pfROXy6rWE{eS3Mmy12r+HBiu)QkRd%Zhs(EU)Qc)xmAlzl}$1ruye#_ zrXZkbghZUohQ7xxA)q49A|j|jv<#y`W&sry6jU@rN2^uCZy+WekHhn0 z-tUKTK(i2h2pqVw49-hkt(vN>Ib=yWMi~YeV?c5oP{}}w&I=HgrjoQ}(?04dL1oUf z3l(NF$!Z{G*|M22u`8x)qQF?HzK$3G)r_zV5JuC|kE%q@J5P*A^zq&M|Nh_q`@{X` z^|}Fj6MQ@zVi)_EGczMo&XSX+XrT&iQ?J@;)z(d@ybpC%DUxOtg{(TpK_M5X?J88k zdskPk^6{uS4S_2{6p3;)=>`lAL`l(9tsA;HnrF9K)w``j4Q&$J73J_wamo z|FpR{+zx4%tX{Xo6kG+YVwwx5#mEjpNY$7<0Gg4M{%%49;8|lb1sB2>9j##RbYe&Nhd0~TP16MIhcXwDZ9b>eKXL^C~e5i_5>$XyD-SEy8+;uFA&hS^2PXcO7- zC!o=0x0X3+IiEYsdh{8rzr@T_V`iBKiny2{%$K{QA`7CO#MZO<`W$Twq&>s?7k}no zEf-|7@A-=~Y6{pmD-foeG^J+~Of*;s=0&M+meA;OlV1LM`O+k4!Kq;a&Quf33EzC? zFU6xUH-eXsd{G;iQ24ySw(LyP_vYf!!eLFzXiIfvX0ew1T zn^iA1*MXcX({QPHz{51xlMqORB}dhK)TEF%tLiU*^~;aX$E?48_wg|%O{$)W7)`W{ z!!9ksHW%Arc@Ag!*0Pdi{$V-6!aL6r9-DSHS?l~prKk|yQ*v}x<| z6fEoWLM{hZZmt$Sd+MwyQ_Ye&bN1eo6-A8! zqGNX6tLfMeap+@A-RU@vgT(B782Ua`VYl18dj0C-51;NoKYslD@#FiCF~%x{5<&>9 zsp~par{}}N=g)T^KiU{kjlgnDQKN_g8nYvF92{t|EHl*d#ugs1P?*buR$|8a!Jg2~ z^dn`y2_a4cPXNnw*C~-uRboO$D~c|jrjjEP6B?kYfP$%&Dg+Wr%A#a*#zp`Ph)hJ7 z%*azzF$B#S0hw8mm>d(Ez%h1`;#1fE;lroz%)Yz(;oYYXl5xG=y&7U-Sg+g4ds7qB zp&u)AxQ5_88Tt?cuw;jn&G0m)m~zchRka~IVl+)-T5qblsvXy2bR4xirPFDMS(6Oi z5J9kR+Kcs;9jAOu2EshXsAdkUfKV~sTx_ehUbU-1oymbja!%~IUDbJrsy250aOyN~ zxk43F)D$D-#VeIn1<=S*)wrGCs2YGGK;r^245|u6J1&HFv%UP)&wjC8?M^8^Jnui> zJ$(57{juwQ_OqY-_|4m|zIuIod*wrgE{(@*2A3CCQK(w4HrKZ)K|Gz(I0B(D4tcD= zdb8sgyCKC`xMDJcq%ulA4a4JppVY|toaEvD(agHj5fK>KI|qh}CMwg|XtNYmO+m~| zK+QXDSN?L{u7W2-Uj=2{pZcylWxx>X)n?O##-lScbYx4*ia{BPtsrLPDh~!}$VpPE z=9PEW$~g0LqB}p*3!#FDfD7leRH5f$^Yj-t@3`|$J{MJ?(0ucoGilw-ij$6=-yBm@ zn)XK%5fMwKM9k)GN+n7GS{L)^nJy~vw|KOWnHnTjEd55=Koy+x?QZk4)z!uAt3N+J zWP;7bR&{uMj*>@k!0Jo+a(>NA04%)@2ut~T+QiE=Syn&>AO#lXl8u_8A`uIkl}eEj zac~ui5gSq_OPU$f6BrU>>2p?50Rc0J!s=IzhblaLzWea_u({oCu5T|cUlE1LnX7n! zQ<;cVLr&nowJm3%!jUzmJ)%leHDVEn$gNaGP8*&2%0Hq87~9i(HIfX z*m+l1jiKG&-T&@)zx%)b>;L)R|J!e#pPnu+F24EZ?W>zxU|`SfW^-}5y}rJ=zPzkl zC^A7}=N&pm09Dm7CqXRRIslUC^iFBkOiBoj)iDHz<_(b%9iW&>5+JPVrm6@PG-r{N zhLrPh6!pg3wis#*uBmI=t~K^!9Qy7Qs!%m(Y@%i=6$S4YnAA)ppB2hhl&(m~gvb@U ziknSsumM038Had!K0JMXdcJ!+J|Fgnp*y}?-|sK3E_T=3^~J_FwLntMV2WIZZ~&Hu z>1q79IVycBnE(+Mph;y~%~@Qt(8m)>n^XrcW$<<$GivAU+2(J4q066TMPyhi`B26Z z&Ai4JEIuwLfHTcJg~TN~E(jLSAqdVLz&7c6CNw_5qxni;;?!rL`l6UI#lj_Nz?sf| z3D934>KTl__y#Q1SN!t3GmkR`ZnU|@Yr)6U2fhI1=MP)Hgo_mq%;dOE?hUZO>Uk@f zIeC}_Jd=E=)P?8NX&DSQaok{LWQ#J)UMR?6&Ty8MTQK?3tPOCsZ<_PA7b)bjv=di5 zUH5c}`XV8j|AzCfHLcZrDYL$5E+?6R&0hF~ZYn$x%$>jtMkZyX7JymK8Ux3g66ZGRTUk70gtPiA#nv_t~F4ZKo91N+vO_x-Lxy^M)Q{1UMn}MAWwRGe zQ+`$fB}4!k#~iBq>gvK(br$K4`_t3Ym<18pdmtLdIL0vqPre%B*bl>Z-~BOX33Yh; z_U+qmz6q7XK>O3-bm{=XF*TuL5lIOR>JR|+{_*j@{onuf@rQTM_YYuJg%EsD)0A=v zK18S@R(6wO!$0TqfK&NuPKPE1G8Da4!T!avxKufpcL6|A43!8Kk(fk9R5V+#;5mpv z0s)v!vH+Q3@*yh6o5p8@h?Mjc=gMN4twe@JqHAWD1;7YU5wm1dfixl*F^!sk|MA`F zbb9x6_k8Hub`w)d`+csMy}MeE@ig9j`iu&fzTwbPsPht=V;wihiKpZcLY^-}A$ zu6^Y$*O$JkiCWFJZT+yWk;Bb)JG{AIidQTDqnq8u)z14Wc&peC+&R*rEWv$(ZD2DuD-dr$O^yy{*V9t?|&Ej!8v~O=JlWd>}Nmv(c9I! z3C<%b{8M)37V_Qvj>Rj@NhbPynj6OqcS=4z?i{e z&M84%t%F~g={S!4Fr=J_h?tS7%-aAo02L7|bvF?d^^WThR&9H8xxHF%+YsuyB6g=V z?2mnS?7@Y0U2S&Tb-gCVS??nXCTgOSg?aG_$f|i1OWCBfWtKjn1y`SA%bDY!wxyDY z(wz0$`59lrubG=K!)6;h0k|cnk7qc;j34-*RL+0htn~3&ky$oR5exQ0y?&s zVP@(|tR!PZR!}V%iHe}p0D#aT0IL!h8!#BDv4Ufo;1r#M)aq^0C zih~kl;>oE26m1ZvVCbIv@xJdn)K#clXbgB5hhZ3*(7Q01ydt0}frtvSS2I;3MNiH- zW|ZfL`}e>7{qx;nw|?Vadp1gAmxp~ib=-}^;i#fj2-RjwyRFt$HqAL3Qz&zp6%9;G zRn?;>W6n(C6s7oW={WkqRm4QD%=s_?BN8!D0}uota%kiT0aa9@h?+X~#O(d52^Aua zu{@eFr$}s`8GvLw?e8V$)%J1~DhG9I!Z1WtVMgar&6%Ky0vPjLkTG@{e2hri9sB3Q z{`uHNRI7M%xpfW=12{rKb|fNw98SY&9D30ld=-LU)tjc;)S=OgfRti>|KZ(#_z(a8 z|Ls5i@4x$p-=7XACjasM=O4cNaCLQAxAl6ry12Rg>dh@HZT$A~^0Kb0V(5@`FwJ6F zOk#{$Ol}>4nRCue5!IB;ET#dn8JjUFQC38Aj0~(yY5*wcs^Gn2K*^~a`*Dc**!ARn z%(TvdSHym^-aw8|PatBFl2w`6D}ty-OU@XL2R_1i=C@oV9sD7lbq2A4Am6PfT@gMkb){` zR#Y35ni|e9Vusl^8;+EBa>0)Xg=>7lOc!k#sO4ffgIH4H1w_&`?sOLMO~}U>W?W_G zUf2ohpF!Y;|pnZTaU@2uRICivQ-keYvf$$!kw6$zU!cA|I6&&@9NONw)D23}>edGl0n~T%AV(RsiRj7~&XD z`=gAbNAl}c7CD{{F-J#K(7(-3`czq(o}066Nt*{KY#k}kKaAMf1igDK$!v| zInU0yB)QyIkqk3tqGCh>Y+yvolaJFKSxjl?)D$N_!?Hv$afXwv82|zj&5H=LvP;TO zs+fWxb4fGGNP^PfjetuSDjzhrI$2gJD1;43NN|dYSq;fZ6M}k%tE?{O0QF&F$6Nw?-}|k(@Sx>sMDl@@sVLDAhG?SD_B<85{vK5-=L7fSFjaq%MLI z0~ZJZlO$8fA~B_8k#h&=h$w`RN6lHXq?{nd`0()fo8SJna{izE)nESQKl=Hf{piQn zH&=kga5EBFXlgca$g6gB>V}+B9)^^276n6*2uOizM(TYe!&BFP|Ne8Al6Rr1tEy>S z2z6CA-VtET5fI0edCZC!=kcHOWKI}K5RzfGJ! znBs9bo;az-hnpRL_5&(7NoH+u@6IopXpMoj@gy0N;7)Dh|$>q#oplSvT zM2;OoG|i|w^*gCYCLj|dK}T#35mZE(9XapT+prxRnw^f81`%~g&S9TZI>{-In1*T< zc*@O8EE9qlIbvl}P$ncKGh*i`IEvYx4%*<@^@oSYK4rIQ+g05(mGex_v<$cbNZDeP zu8XJBF{NDjxLIvCl@DAqc>wwN>Cbb-?eXLO;r8S1V$*Ee(AFG?onw#8u4$Z3eFdr}TC#Q|a6o`Db{a?L zv0l|lA&+WCp3AI@C^;t4BqOZW+_X?TABc!^N^(5qaqu}h0=L{)^%vx%h%BCHml9W)5Cr2 zyT?zD-TriWy}SMD)#hsJi4&1p@dyHT4iFIq(8QDw8K$B31cXQiiblm5W7;fBOu~iE zE(qiW-!MV2*$oqHR+r$+$l41o92FF&3}Vuk&soL7;eHw0Ca79?a)KFzQIRLXB0E_` zO0fLQM2t^yZ#sdQx3(7&mgPS-r8Sd`eS#M=4`>Kwz`+#s=GKDwn05xl%R$SBzl6=p z2~R)0#Abu3eloAc7b|ZzWBK#MsPjrqXEYK2GaEfG!;7ERxgQ!Pq93sc@c|8_SVRyn zAk{>TW-GZ#xb-3(JAdrFqBw0=FD`8U{(M7V$_DX^jjk+LNqnX~2w#f33IRW_>69SN zg_>oPgR@`MoJW;}0tna;R7EAloVd)E0#g*{xLLKT@W=0d_|O08zx?j+f1AzSy#881 zV;U5)soA7BJ)5Y`S7Wf$&6lTfDT7UI0x*lVY}#6}qz%(G6uuBlP3Cfl>CE=wB&A!b zC==IjQ=T@nV9Pzn7xU4kg+x?URgG~hhN0s)j4?Uyu5WKvZTtNE^qcYTAMWo}ZQZVK zu5PQ)ylcM~kReCN&N;4pXjg6BHtc+nJMXd$aSXw4cWXrKhJF}EKz#M)^~G*?cz(S5 z@agmW_s@s>Zs_7TbkC-9zL8v`3; zI336Rb3Q8G3SI45}=(ik(lltE+-~9N`-qwvj4$ac}xJ{2+2&73ZijRB3w~**>2xl#$m9}&rkgjBgWwCW>f7p8y^B8j+zZ&7*Ym9 z1GcjHqbd=RnmI>ASd-hWRyVud<>f^cYGMlBX%tQQcpAEtp1Uq(Wv-}c1ZYS(q2`!W zvT0$g$#Wo3QHd#yI*u_t9rm9e?gC1`Yeb}w1~z*ooZsL1p`JrK&g9PYUz`b)mx@a; zaD{1`>9eviPgUiKfta`6`6xy>P5vsvgQ8kssl59l2bAsS{YL?3|(6j4(Nffr=6^ z11R!o)X(>i-@W^x&*Sy$+a|OQT~6ZJAyElTDq;ww@fVR1G)pFQWiGoV?Vq0?KfNEG zp0~bfR;$&f?oM~{(g{tzKIO?YlAHVlK)jtmBy4m3ekTJ|hsY3CO%_Az?A|Q7a~4g`5j&4$9Qf+(_4a1>{Av66@!`|^A3lBjyx$*01VQUfTW?omPT68M z$&%5~5i(IprV$D~3ObGQeL?wt0jJLLhA&|BnUur@p-nSuK^FvCHpfDl5l+Fw$`G$& zIxs0uUdFm2c$fp5%~E@q+kIdBMhRC)rGskvV88{S1J0g1Q#oIkD}gDT;liTB94yIZ zo1MvQd5Xm^`1hAw4B!hA_9gbBg~y(7%Ea5kasZqf8Q=x_{gUXJKz>PszCd^9f4od| zri^7?vH3G6X1z=~05B~nB^a0^RGlg|g-RksBP*qFo9|NT7@eu6sVX!x(O_Vch-luT zCV7hK%zVFCEjZ_VQ*~lmj5&KNiN=&IoRROGqfHmR0CJlc_~LG1h%jA6aRE{lL@|jm zorV)3GqZ?@>8fqpt=sp*AK!iY^{@Z__rLqYdUv_oT~5-0noX6QD>rG;S)DWA zB@JG3*z+Sbtregd$YO75P^?9*pnp@C{%@j>4Q8%qPVA=Sbj}2qDFaKs2Xn4)CI+Vp zIgw3GgxdGr-RCdyPj@=R)81h0dmzp# zrgC|CX(n+T;}~O3fEem}y8G^^Asiz*>kRlQoR%;Yrml42<#0D>uG%j}r2)W=W(6pYJH7%(8tMt2JH*m`3H zwJe&W0l6w%?6y~%^@_zlS+J@wuFeqU8}7A9gTChOUPuk$dbto@j(s_Hbq zdwA^9cslL7!~aXxpEk>qBv*o%E@tNLvESvb`EswUtQu^+4I1d4ZkaC>@)ysLA`}WK zoaPJ$L!i-Upw_G<^X+$y%@;FMRemt{xHp?A1;NXgH{wRPo0}aydi0!q?0U%Bc)woE zH|zECV#)K6Bz0|ne|vlN{^Q-7kMp|v>eJ89Kl|kDY{Lj>U57-@nz~vno4RH;2~9v= zfq`?}9{RmucNFpqw}^>CrYahxF2?fgw^vuc`NI!L)%xsWwO)a$B{8#pXhDg9FBXfc zY1S8)@2;=zw!1#2x~gXLW;JVE@WfoHX45vs_BN^sQQ-zmRZ9?32w~nd7mMX)K0li; zXH`YPE1Ie#%iYkn$8LK(wsGi^LGZ?|jZu$BL_;YSny7#VXp(ZDkL~erJoG8%6z>oF z>%049<4rC2;G7@NiqU3!603}gaK$>>flWw-? z)XOVXK&?ovL8rjS=V$NB07_xI7JrI!tRX`|#Y9@%~6EPuCX#$#Q&J4~2 zI}o-hmY7BlI08jPf?^M?MyyIifF>vggOM}zUR9aAL?mSA93u~XzdN??udl9dZtG=r zcD~uHS9PdLc!~i6kMV?D*fF#$g2cqd4bqOseZ0Ou-d=b2_g?JD*?CO&o7vud$YKZh!4Hj#lCJb(a*iU~O9i@KJH)nv#~Qwpe6%@u+}>qQWlI1~#SCKpQw zfx*ZDWnu;_T(Du8hw!8zDvAcEm@xtw6NhEZ)kaODL_*BN0Hy>`VJ1`%Lvd!PKn%d> zK~fQ|5&}3z00F}Q>Z1-l1bIK-Ql=z zn)%zeZ*OmI{^1|~@jv~)|I^?9=f8K%pMUY$U;p)A|A+thAAa^H|D7jag-S(JN?@9D z>SLEI4qYGnnQ zH9l|!d2l{7&H?%3p^I&AB7}tC7%i*zF+$hRSDUbEEDk_S2Cgitm}1v5Gghu%&Lx86 zD1cGa5it2j7L(&sE+*xuw(^uB6yIHd>AW{&M0NnEnxY{HfDfVac=>#@TF%`- zKfM1q^xfr)r)xpiG*wlD3~hg4L zpm6tQ23QIq`z~kxNPbhM%3RIPevRKMda(2jd2xQP5 z+bj~AimM6%jU1fjB_`ZyQ-9|%);wK!d}siSUlfo|Uvh%7KdO@+8rzRwJ5??=)lR2x zKh~)e);?8k6WW__GKZH_s% z{r2W&HlGn;KvG4d@_>xb=xe1=FwyjZN}^QH4XNhU;5bIvuhMio+yF~+v-VvZsBu&mB6&LJxV$yVE zGD1`WWXcK#CX!JE7!1k8&>SgJ2FXRBpe}e9=C`};uYULa>+gR5^5v5+KU+Ai#5Coc zfOlPgd%sJPzW(ylS1(_D_Qmt37Ypxg$l@J37c{xpC+$nIbGX^=K3v~_xV!H(H_e{P!uJvs>TQaC190ARDcZ-N>&ph z0!jt|0CtXpHwgl4f||V}Ew2@G#i)%rtEz&jP)h8WJV9^{F=p+O#w=iFT(E~B5ff$| zITA$hfM5ceQ8OcXblwn6z%+vylL0WGBR0*VmW&W_?5e7vqaxbDoUIoi^ubG1Q31j_ zG(a%e;r4jA-fffQXPalwpFY35c$(FQIG9<<1#!+#R~|(LnF@i4rm63aw>SHbABWxE z3oaJRdDA#g(JYH103&f#h52%Jw(;{tG&hK*loXU4iD^lMff0R$PT4$fDuT3uew77HaOVn&dX zshH!+hicX|2(BOUVSl)}xo?l%)%A7C!*74}o4^0hfB&mr{^G;?j}-W?{?)(wzx<#7 zPk;HBfBF37i>j)M2R3=CL(POHvecQeB9mzzj_s>gpWWWv?%P9(x$B31h}&*=ce_iH zUFBbV^76AUzc{}*XNNhOh?${tq@w7&nq+XU2{qIiSxNFi`(y!KaE!>UNd&0?e5lY7 zs9BB#LSO`Hnh^vjFjBKgwwKhpP`a$76SSh%Y|-wBA&eZvuPCy-1eHJQxktq$Dnn zlxYDCI+h;@qt51`D*!O54sa3>KEie*qO}tv3V3?O14lakUBQ&&9`(S9Ph8$4`WSJ| zWRGy-(I;eE3|1bgET+#123E#NPj3p-1^@_T0BT~>Cz#YTCulz+_LIEi5!5Xg=HbIV zCbv)MV|M3(CVdjFAD=3vT7Ia@3(jFuW#OexJLJ`X;y99zkYj-Ts8BB8QkC9rqs`7b5LY7ognyBg%(Wt z&?1}g_;`D@6b*orH{R4jGQ}ddGgHmwg~fcV)D1R85 z&g!OGo^Mu*c}=b%H)E{4qrkoBet)>V-yROfF+@Pr+_>YE8%^FZk!WuB+kWU(#g)`y zN2CB|q%GVX2g6o|A-5*+*=G6GC(pip{_OdBb-CVn#_q7+Zg=}*CkD%T(^RgmIXLvf zgzOCoojMoMLErbWZHF!?Uhi7qYt-e%vRQ1-n3Vz!Icc}UtPK^Hd?dz{5+awx*CMNn zId)x_2LXe*pVuKca^%@pbvNYiU%&swZ+_q3@4oo*i{|HVH0%ORa zI;fe5L=qRgUxtd7t1b*}*WK;*eH@esokQo_oWXfBE-z>LI~amQ0s@T zI~@Cz2FQbH8}s4V9uIBGl2k3LJzJs zzMKpOfP|3Mz);mO0fH6^Cq-3cgn;Cn1Armv(B(|(9Ry;B$mGaWA)%QA3Z^EBMA$Hp zV-qG&unYi%M#hNVa2)v}OyJCbKn#?eD>6(*$hl`vm@_jmdr;2Ef(|XVso%ASjIv&D zo?JX#Z#KTJ+Wju(1bMdz3TGot}y;v()!%!p_Lm<1D{qvs;jZ9t1#8A`zg1h$yjll@f|3m0mTY5;+S5=#kkFB9fyJ+^JmR1$#> z?a>%jhpy{g2xP9J#vo)M!5&GSM;{m+WJ@uN7-VG&3-Wq^n>X*@e)z*5f9Q|xZnt~={U87E-S0nqe9MkMdG+Go{rkWAcYpow|INSs zH!og2i+wz{t&aXx=7aanqp1TV164JGYFR&B(g!?D(TaMo{S8#%_qXcN&c8YISfujJWMt#H@+lcZWx#o}XYbq-W z;z1-;fpH?YWE|s&uTMji00cAv54uk%}?!uacduGAs88!a(VGo4xMBthK~=5#{h8>WsM(* z#yM;RGX@SElvBIky}NzCzrEky-vH8QUwyS&ENQ;TU@B5*RUM5U5FQi%<#XVvIGH?o zroyPeIGCgwk1I4h9bfQ}3;?Hs>EXxdkrwQ9{l?+)ksm8sCM*%i$7&~07 zy{88e5Dlj31pqAd1vq8~z&H$l{No=)GXexx&6*|;!_cQL4g2FE=CnCmt~Z;r&4rkB z!*D#d_q*MB@XI=Q=lfw`qENXy)QkCixm+ZXx~?{>GxpTBhnt(Lwmq7uBS+(G31-z{ zh>TQMA$SVG0lQFn1Z=xQ?1wlE5@TS>Sp`5WGdXgep^%jjyl2O007FqR2DH-kM$+P@ zJT{0%lB1N5Bg`-$;^4ihc6}F9Oj#tUcfORkfLb6)dFpbJ9u@7djWgb+U?6}5Kn4ax zDuN7ksOIx}wVW^4i}`%!jD~$X90zjDvnrb1-E6P!ZtnMoDB^%oMa2+6P0c_VR8&b- zBBaz10x^usMzcW9*|H(Xka3VmV4L;oi|0@N^s6tvesQ^}f+W4Z{;<2>c72Ox^Vy8+ zjR#*Ndl0sPB$GMszy~MJcLQHR?2r5F`(qNmUCt;zS$y?r(^LjI=4fqZpn0gEn!Df; zRWy^LSw;j;ltm?*Mzg4~9kOQf;1NR;sxZr$K5lQn``r)s+wR51vzITwTr4(sm~Q_L#fghDbhCRaMUx zLyRHwoCm0W&k9L8KdTuMXRQv;3Z`fkSt>fpyJro z>}O}|(A4!X41I?o^dCQ}NbKV<#3ALBw3Me{MuakfdwV$fPJGftvYZ&RX&wMZqDvi7 zk*gVw(STYw6CO`@v(eGb%ygnv)J%yOfY31^BeJQWF@T^7k*Q`x1Z3bbPKDX~5Il)l zHcSeb$;eCyOtZ?!^$-x6qK;j18?HFs)&FR2&jPq0h41x^#I0bj<5=jJc>z{l-iggqN~EH zX%-8wa@_9w!`&ed-Ti(@eTvzT=gm4$G9dNl1FxFpV$+1$iD;K&1{snn6FJ9KgP|5+ z8H#a`^DfM)g@PLdKEA*HFaPzQ|MNfm*Wdo?S8v|DyS}>W+a5&XFr*aMtMjkF{_L;* z`Y->7|M)+A{ms{#vrXz#PC4i79g}kk0;nHT!nAUap)Yvz%3p3cxdFk|IH82N|*$GPvMeSbGRZ*{61hrjEdo8RXdQW_iwa z;}=!bN^{Cxf}DNKJ_^@{4CvTXO$KZTBxe*>e>1Y6AGR@WEXcvm0 zU@;35q9h`27R|FyUsiRsy}4`myPNkPy8Z6r$@%i^oaTW8Iv)(g%yMxYHw7~yD*g0w zc;dv+8=NTViD4e$-NaH5BA^-SsC_7iO;4}WQPu(gynv$ZefX*qRwkh7 z-%bVzYB2Wl5R7m%Bb&HaE8~ zJL@!ub;7{_FphCh32YisdjVpn3IIkM{;{aiY3O*;uZ&J6FuI?e26o3wh=6${x#5un z9!`CL2^7Lqw~XHa0T9V_^qW^zF(ksescP>r>HWv+`@8%7e*fgj)242G71(pk$x5pG zv`F#cE=`{Se)Nw`fBn$0p~uw-POebXWqG)|r<+m6G_90Ih+|c8>dTx~;dqN1S8q)X;fmS}YgDFsqxK5+HaEhqk@F zz2gv;>kTL%f%o1FQcA&vSu^+S_w6CZczyLD$NtS9zJL4r?e6YgQX1nOW$bSnSk5^y znJOWZN9SBl()GvKcc3;-cN;Pz`I;O%@?%GZ(R)V-%rvyUNXj`o#|X{?M;&T4|p$j*q&(6RSb zP0U&Je!IOp?wYy^fWSdTvKj#sKp>!I z?p+gOmyW}JxAku0T;3kK_wPTp$Nt&VXWxAK*(c9l7+O*l3`yGTuGjPBY7v67 z?vVPkfzGu|$2BhRVc3jg6*}f18ejv6uV!xyM5MAWVJn@@j`;FKlG93?4CB zg>VEc(|4so0brs!z8L~Ci$Do>OF63w7MBQ9G(b*Z=6U@76P67i%IXl8~)#0y7t0Wk_**yY0J<5Z7lbU)3_C-PQH(_9h?N#`*PP+4u&*q_CC5 zNXCwMQSqv>5c+I=8Y~l2;4(_UK&a%1x!iVAF|q8Ji?x44Bxngi4B1znN&3F;c71yg z$rfVljU(XMl4ikIj;b&WS<#RX5VK_l=g8GFM_4;E0y9gX+V}bXZkLY&;K?xpwK46t zw?F*hyXy~cEe(rBU4_bkQXIa2dq1>E4Cd$a%cqymFMNG*R?ild4~?T_@%1Nw64pY9V3IW}bIwsjMNI@;fI7Gk>e-z9 znL9gQFILT=J=9ITT5S|T)f5RCl`xwDA|tbrnG~&#B0CqtvNEeXe@NX{H4=zr&D}nA zb3YH{y_?Tc7F1DHV>Tqy@+1iBV}(G-*r z5tslGsW>137yzGC7BI?0SfON=m-odJJ2JkXmfGWl4@=~^AW=y>hpCc5;)#B@X<(I# zc%(Q1KavAYeTheco3SpLv=)Uv7}eo8W;~tHIgCG4NaPXOpA#7E3z{p}aICWs z%#JwK7HW=^rbO{5((_G0^ zz&-kzsra6{5|3)X6a78OtH#x#DmKvuw|93}*VnW8{IEZ4)*E7C=d;O>V)-JeA8tQfz5npOZ4d47u)Dq6USADeXJ$lX zA~1F|2oOwV7zRm6M7(Fs7-QcbTQDO8$zo>CJ6~5-T_ZCp7GVYv0$R?QMGy&Pr1}eq zFx6N^Jy?1or;55<^D#lW2;0n*ePDKGQmlc|fS7UYWg!t6fI>Di!{R&+Ni}96^?@7! zf~cY?Kvq3;ZPy)BicD1bD!4#Q$6@GG=D=noSr)T76Bl`>st8C@EoEcDZ6H}vLPT%` z0LdhRC^36C_hCI-ozK?i%f-dne7USD53%cC?{_*xQFBaORRQbZT&QaHH8?*A#5{Nv zC2~Ya&Np7XhoeUfRW-jj!^L{}^4XJ5E;sdT7Ly&?_U`_6dvmp}7MsNiFNg?p&LWYF zkQ^GJW*`inj4C1U!N5!~rQFBZ`rt$)#s1=A^VJuhef{imwR9pw%sGQU4(;9U*mwEa zlV-VCg30~%E)U81x^8A1d^ZfYZ}-d4JX>!(`F+& zC^>`Cpu@&5gQ}u7d9FBO^=e9>pdf+(klU6$lEd1EByLa}1Vs!$HD(rJN3*IT)tHi~ zI0wY2fLRR`o$~-BxzAZu1&N&}?>%OLWGdpAPKXALz{rGT5JWU)Le65xeco={?l>TD zGh57;OLo+!7EB!zGa+CRjpQNTU*BlTxjWRpA+uq-tIf`yJgq_?g4E|U>;tg$Pf%6n+@uL!J~R2=NwdtLE8iLfY~f* z*8Z4o`gHVXv-xJ_s~H9_3I?o7hNfv4)Ld1$Iyk`C9d^6zVYffD{eE}UUL-$Vt5 z(-%)KpItVawYr&~)n7jt5@ zx~c24>hk>T=Rf<&H$VC6Pk#QhPd@wX>9Z%x)zW(hNdSz@5ClYXiYZ1zt$ZEo3Xy;i zkP#WO5;%4+aLSnbJg{*fX2PneE-uc`E;barIiE=trMO?Ii76142wew`O_G$yP>|Ty zt3b}}cQN-7hAajmu^*0JRuBRQAC?P8PDNet~iv74w3Jm&@WrD~r=b=yV9Xai zNlFS%Q3D#8d^J-&jlhmVi6Syl8_976Kn2q>u3!jbaxmC9DQqX!eC$U|xhLbkXJaxe z0lL!4$5T_Fd_S5vm9k}-O(=HS2PaT}`oFPtJ0ZP-_NV_cy1tAh)kBA*EQwO?5WuM& zf(T`BaoWhsy*^RAlN0i!cYpW{Q^|Fr*zE+3ZM?JPZ?a}JQc-TI%U3VYo1QM8H^vPU?5=@UrDvACLKDlqAW?4$#G0KPEl;OU_c z0H;sz0RPblU^3JzYhhe|A{p4cpBX^k4{zSQ|L0%*_JxXO|b`~7ZrJalc>4d|%Ow%cy+7jrdRE?0G34>=A)w0Peg_HVxb;Wyv?=IZ0e z6g!kmq7{<&j)4?GRm4CEMbRXysN`s3+54Ub&B;`}^CkbQe2OZBrfJAI6)V&kBE}Sl zGz>$pD#SSM`CuhKc^X!thn^A^&_bhxP7Q4A91=4TA!5NJ2F9)^mCNwe*nU(4RRJ+V zLo#q-KCgYKe5hid)A0~fcMt$IX2>FvElNyD2%{nNn!A);a&&rLr;XBn3zKy>JU6| z1Z*<~<3-(686h1I!I*trhY*fP_lNfN`|CcZS1(_D`}Jq9o?WnsW!)XR?$F2N#e%Y-^GIkajEoLVbIQrUeB}X1LA$;)qt$9ztv6@O<=LVk9a54c zvOC82A8)pYBRW5u%{{y0et*2XX7Xp3%gd+FfA%L(UtVqx$7Kivbl4xZ+dZM5&lhJG z=S^Lup>2=t&<@8g9ee4FGI#})F?b7sSp<@Tl%^LkdGCX70*7JfhE7ZkY*yFj=bQ73 zi}`%HUe2pf$KW;g$HlB`fxH8D=sh=e<$T@u^ZBZ3yBs?}WOl0JoXe6C3`Aj!mnjo^ z7Kb4hd!d}OWar2`PYNj}$IP=?Q`JZ`bq>+g${>JgIgB1Pc&Cl76f%6c_=44VY9g4+?`|C5{n_w~==koL0^UWTV`Jq?`>M`qCdHa>RrHDk_#4 zysNzm91q>i%{In-cD`Akoi&RYkS0l*vvX`h1cXMEv8n1hRQp4>ySg9n(A2K+G@Gx^ z&Mpn1JsbxcisA~L_f_zr${_vmc(~nX-tlbFTwH{v5wR>04Urt+mj|OSz_BTi0A99MYI`?%Gd{sEr`P-EMbxck}V;{oUQ|d@(zJ`s}lx{PZW^{v?FJ-+g~| zd&D>I-~90Lw;zAF_;7i?`Qv83da_!rmYa)L&tH7@>Dl>)(1j+<7IWu=a}E+9!tQGO z`t|Go@=yQtcmME@|NP6}yng+zJ#_5p@?!J#Prv;0KmC(WU%mSFr$2f2;>E?q#e6Xj zJ{YJ<5=lgeCS)=k5A9*wACJj&xmqpH&g<2}9FZDlMFmd`Xy9DRqFGc$6_WNv2JNd# z9VdV+N|>1dRjHh~HcpQcdSn7jW=V5aW3EGR%^Vkl*N9{YR8_)0iLrtrbKQ8ZO-uM) zF&@bT0453q23(jwD4gO0H$0J8hM*(cH-e#}qbrZM;-qX*696l&?WRCf#tX8l8i271 zLVdBQR`bRAs=e9v`)xY3-PNwYIW&tV%o?86ZZY%CjA{=K$TY=>G{#rqIGkuU+Cmm! zZ)mD2K!i+1Sy3hp2}%W1b|Rw(d{Q>WQE*t$QYnW{${j4|1r$og#z|=+THXf7oZ1qb zqBL4_nt`GM5~G1?2IL7JF_dlsj}TkOR(mlOz_ArEvdV-be`tt2&JT{D*9d9!Ap=2l z)0SIyvN1vn2qziON$oTCMoP0_+{>}lL7F8O@XwA3NkNUEIO?JSjKYsGe`;JMQ_hQ- z67Z?z3!`9W{BJPP>f^FODj%^dGDTB_6O1fjDOp7c0(%!iV9Gh`sU@aJ3ey)VP8HLe zjm?wO8ii8iz@x#nhZe-d_?JsI(&y8SA73!RT`b(KohYrTnPPBylToW?r`Mc@BF5W0 zX~d+6j&e*U(A4$%Y<+(D?88pMg?hEztk3Fd2FOGlybC~a=(qQ`?>~I#Q!?+vd_h%i zV-G2+fdd?C^|Cys*_E;GfN|OIsYWUW|5MKdiuwOk7mSp(jb64wAWhS%W3#YB2Q z{{&MfW-O0zig-R1SN1^j1Dpom%L*qjGtCGfIhN%>NQNq6L)W!kdpsUC7Z;1=+ShIv zhGW|U*u0vV>D9+8Flf6@P1o+y40rooIv$VP?T7d8w|BS4-8RLZ0c!RT$e|-D%ho`p zEZ2Szk>brwIVM6x1UL1&0gwoZ7@_oVEK4>6QUZjSV%POU+p(f!CZdzxe=LLXg!{{K zL@SOxFcne;2*|`lh*X|4LN42~ovPi@^$FQ|&c<1iXm;Ms*Q+N_Uo01^l=9upO&`0q zSJ55`>$)Z*VlILu1013VpbHf-6M4rB22zDZ^{n!~kCMs;X2hj@s_WTi zIp3`2i`mkL8o9~{rpNApgBnQ!0rngm3IYXlHE`t*~R=kqULEMqt9x5rk2GX`+$<$7~@PL+$f?>i+^%a+U> z6A&3Ov}+$^%$5dl-`!ka-Spc|gn+8S zAo5rwTIp{9OUjCf&N(7v2Sk9tOyb>-pvRvt8J! zX)khf+#O`dNsnD`rk>c)A)u%*mLxe6Gtdl@2`eI0qm)vNQBpQjR8`Z2n%H@AIg5%^ zMV?j4Rx_kRay;x66ZnURe;Fymaj$>;BRCybi0DpxYxx6C)`D4Na#sjha(nEDG$3H8 z!+hR2=T)?qblCU9APN+GWq>Hz5Cy>j1oq4xr+9e8q?4Cp8HWKN%>vojkO_k)VgnU2 zgCcK01T|npLj@Bnf?OaoGC(5&Dk^!+23aHx%9)4)DUmDel1B&Garr8cd zx4-Mf%`a_raW<=b%mxuafRMrKtw`_LlRAzGmxTW)U53`-rXIx_d@7^s%BZO zS(wC>44F{PvL;|6Vo#_^a>{)_NK#*i%8_v~-8WMO1pp;LW~a$wACnHut_qcRE(>H+ zKoiZxTCWzqa-FYL4T8hE)@ghgiO@3wm42TIATXd16(cM(L@65ak};7x1_1IN95(C4Y~G~(;&^r6-fxGt?Qaix-}`wT z+TK>tFK1W>bm$!$7+A^M9uXzs*q$aVPi*<{W5?at$Ou#(v9eI~bxa7Q{U?UmEN2A+ zB6LjNAy^)dXdL}i9(dnk5(-?P_B7lJFmk*^UuJIQ946p z(1Pw&fq=mkfHgYdA|sKFZ=rz2LAXe>O1w##9RQjHl~#}{l=i{I!i-&=5oi_YKYBqH zNK5F5N5KnN)?CNpHwa` zAp(+^BBCmE8o?$UX@CTTOpK~>8b%{To5oQ`2>$qxnm#-}lmviK^gl8&(+{-PLk9$= zdk+(Cp0NH{?ZQK0qi`x3$79e&$UhcfSnd%a5hh{HMK&Us|uPqVnj3|VrEkj#j%hk<}jOA6nt=ji0|)j@9*!r_PE>ahM0gIAYNZx zU%ma|_T%;L{!p>|{N<}dw{H(eOR2O&imD&cm~d37W%!2cVkc%c0#~bAwnHhU#9}rj# zlI4Pc(8k(E&1O}-S#P{^+Qp**v0p7$%hf8>bv0X5^V&C_9g$^?GNde72($A5q~-vL z5xAHxnNdb*MP!WHE^#vKs`^NJU9iw9oy}$6f@GeVEPbsyQC% z?)I*0`|a_lW*)leFK5ejRJ*y`{{D}@`{B)pYJK+P>Dgjd=b`76HjBl2xj;=UM?4iE{bfA`Fb0r(-N_p4Mma>5qX-`s*tl~GG#6dI1vMA)~J0( zlL~D!pLu|$X`0!*48g{}>kmf+^6byfF2Z7VyWQU3-+#Ef1y#wCVostU$uXIkWVMo} zNstASWRz^Gj@iue5GAG*2Pi^7GX%+`K%#1zL_kxF#h(f$@_t&B|No8-_GqWI>8ye2 z`JT#q#1gkfrbb8#l5zwy9~?7zz?fssIb}^b9op{L9*NvcwW?~zs2Tcxh(k<6%!pBy+A6Ivc{AxLvTKL1_VG68yqqi5VB|{B60)V9 z>?Q%a>D2b@RT+&ni6%uS9Lxu#B4Kxi8A%Kgkx3OH5E6-MM$w4q6f}F^%Al53%f;pSljVGYV0joUMJw)=8H^aveC>Rw zdAY(k48aA&*{q(|b0aK?aKKzG8deKF08(aCO&TMq)kcUocZj*`TUK9*0U9%U6hu@; zfg%kdBP2<9>~nW_%!q7A6pXTB0uhd}B8hART0)G51VrF9@-HBm?@?%U)0x7WvbJU?I5o7H+b|LIS@`Zxdmzxw>^ zFE>vvLeq$%8El?heA85C&!2q#?Kkc2-bhkE zm-FRnvzpD8V7xoD?>~IJzPj$aWALsH)ywBk|LWiW_kaEufBG-}^ygoE_2qItCnf+= z074Yi(kwDlwG1&@8b}AsLx4Q@Y~D96co#$z+nT0JU`8e20Fll8bP8@8S?o%jDJe?T5aZYp!r7A*dGElQLf{BqyEPP+F z!!yZQMa{7bTyIvcsj9Q4yFJ9aJ;ZEXpN3xAV>;AsKId8E>l!>W`;4jtFplnlnKF=# zo{FwKwq~Y~v5YfQ@kcCkkCOn=0L)N?l0dH-Va<7DJhfFN3NT{%Ti z83B~306;(_Us!D>#xhQ%Rwz;>7Ey;tfTUUbA@xz!&@)#RSDqb30R?5G6AfEb=_MCs zgt<`uP#n|*0UaVCWiyx(4;UDb)N(=pWjfzLY3wBE2!G)uiz-B=IqwJ=iSm$CvzeKS zA`+9R;u!vb53=#;WI#eNdIXeD#PSHxk*EX@OvQ&0nros98gO+^UWbTKAidukA18F&DI(`hz73^p$N zsV+cx_}5d}Fdd#_QN~ONASwvR>;Oz85xS-cUw`%L$@3RK|9JQQksaoySu+H->9ye`FzfZUDvk9W0w4AF1ajWRuuv=Q!FkK<>nKjQVFb4 z6H*2Qm~1&lVbGXrTaLd{>FGoejO`GG62iuas3>EDavT6ueB6kbD!s8DE7mrJn}7mL z=^+-#6bN-1fECbL(>y=lY%ZQCvXJ9YH%;@&*@6*ouCK2?4sCZxl9C$N)!D^`4^`iG z_qX>S-oNjT{i{!2e)iet!_Z${ecavMYaGN>B?BT8nU={QQY?ez!aLx<0>ra?Tgb)E(OU+nbys z86Y{LqKyQ01XMCJC1(+{;E2(&V@al}09aM^VzFk%V|`ETopY*jINqcdtL*rLIMk)uP_a>c-cEe%H0HuRebGcnxZwy?p-p%TLZK zrg&I3>&>e1-uEer+A>f|^*?oMTxJSrbW~d+(b$JI975B`7<`l)z}VTFn+S&7Nc2fB10y;iKfl z24u*N+4}0mZ)hou;9FmC%YP{Lu4>QDUOL|fXHB$hKPbhi~$MJA%j!%%AyX? z3=&|@rbA*ta-yigL6Kl6GYV%l6G6+U$ut=!r34fcNQ^z0Ef({$%_;<+`ayGchU@|w z2wKjgxvGJ&_lxzi3LMC4suae(Tg{9xGy(Exei3srF%xBWi`k+QaH^0xXF)AQ#H?a~ zl?$ebSoG6MfDVzJYYk%`fiNA1%w;|gB#X~#LoYd}EXVf1RYj;O!r%=|qqN(7>{G{)4>?^8vyLPva)x~o8?QmDaVd;Bopr)E#|;Yvnr7tsH#Q=TpGNjiY3tz6bQ(BVn;r>oCiz;XCfkI4}gN0 ztso*sP%!D*ecurp*j$_CoIRmqMMMxI0tBj=F({YP+lqp|NMy=KMI&UVh3A`|&*Ggq zLa2g|#(%{V{b`f5!lo&o@n@zDptO&tgKSJPFBT=`^eWz$Ih%?_$qA$mJ}l<-yq+)D z-QsSz*$umWj9p3t4@2&voAtJsq4yL5RxShwjDjGlBAQjn2wkb_frv9?82NM}nzBj| zz<|(!nt?)AOVNgegJ2dhMCTPqjZ6)=_>O`W4~%gz7>SBluxxBv{7yj>0f~SB%HE44 zgajfW3Zf1m39zXzipHF!>+=4XVj@S)a^Ya9;2of`Q&3SsE&Qu8(ul(pfPi?EV3nE% zsCYf9A!HF8tyByEj1d%hY_pEt3m7HZhCs!NzI24lEDk9Rec25)imAHFxylg(ka5X5 z2e9!EBj5f2a1m4=0(Vbxna5SY2?N;!ES|c@^S_)&?MZ~}Wh9Xkt6kw8}BT+%823ib2r!Rvi z4NtlGW%!y90Aymgr~i1m?C{`wtEynglMd{(D9lV$8F_@?V93r)3@M9teVpB;B zwO)&Ad)VFH-(}PDXP2AJI;ZsR^_%;f8_8J#9P*g|h9C-T2!^VfQf5;^H}ip=V^v~8 zL}EwIfvJF@XD~9eL9z`43^5KdtAishT0e7vR_l6J z)r(mT9@`j?UE2+P?4x#)RofWb?k*wvir0<5I9oKcMpF*tr}m+SScYO>hJtLy9AYejhZ>9cRX`s~%Sr$GkFv<}XD7}AhrF!Wg@Wr^Joz~)W8 zn4fhq-*0z!``wWDR4v#w^X2(nx*jwV5+j6AQK)x^{@v~Uhuhm@-vw8lU7R=Go1vlF z2*k}98WH&rH~^rfl+74e#ZpXwE@yED2rdfaJ%A^N2+V}YW&T`6RWwV|k=3vv zWxxmqIVLo4#D$fgo_9k)6;Y8>|M0YP+ldz$w+Wcqg?QRj%Y%L@31HgW%PWfP(G@YN zL6O#=DN0I%0TIWTBxW-p=BoC{J`SRy+vC0)92n*-j10_RYMRsx$W$$hielF%$Jvn! z!4YONq~b_V07zn(Q)B`kymRCjb1rH($|6Jt#ACv?SJa;_*J#WIi zj#H5>W2B^pa(hg&qJa1ih#XoxZg**WZ~(J;;}&z8uhmeIqXMD;XccJQ@NgK?_C87? z?ZYgfcdiZ!YN*Ph1X{>=9Z^xq)U|0`Ptg#h@L9!>+a^MFBr8XY^G7?u1aC%sHg&Zp z@dHleD8Lj@Wsg80Vi}<=DtSO-&kg_t#RLpQ(Ol)`=WEWWDXWNBLQ(CyIK;R=Q1D?< zSIapz4OM~I5dtuPDWHgoh!GPZFqjD_m_Sw~Kr#a+F25Q;Ek_-q_C3UmNzi}*MI@SL zG^WZ0XGmg6$FGcrMMq8u0=u0#?jLjhPg(jOstk*d9SMRFI*+Vy ziFqpNE~C5=RE?ON=QPOu)y>_zkNu&Y`)a*hym<9&y<8?oQBzVG`yLFcijSn>Q*nrh zj|<0w2LWKpD0ti}eppW9QBmG*{N$73oJJv$75AeP>>piy@JBilm>7MV3fc+vPR(n3 zbe5svC>VSASa$M;8rN`nEEIuldZCyW@fA)m@$~w_A&=D=J~RkQ&@UsI@#yu25V#gF z$th(ul^7#vhLnS=XNq7<3^7WwoSap4O8NcA5AQ!-9S$9+g4odYGW5e?AG|AF zH2@{VqT=Ey=h&e54uP2gkra^{q7i|}Ngri44)K?|nGgWVv!h^Aa0(hCI0Gxnzp<52 zihVURow|JR01m8-i> zQQ?Eg%u2ozqG$p*x%HMctO(}3ujjMMnzoC(-Ck5d%~yeg7ldTeR4!DEo&aEo@qW9# zy}vo^59`fpv0A#i>iV`l9#Y>+O2IjVqTfXY6cAHELFbsLb_jJ~_JN2XGdYK z?%Jg6YtL-#U%$KlJO7(D$4_3aKkT~eL%iA_W0V(9mfw8#^s}c=&ej{}s+>p>s4}b| zqgs@B=-T~Z*B-hqlChc`y5r$+$T_W7^Yi9eQ_beh+-ixjHzgh7ZhLtD{hP!6_Oq`) z{qp4}mltOaxR1lW@9($wNcQyQ#fz6OFVEMjdCeJ73?#Kfn}iK zF3I~3cgJI#pI_Fq6&M;JRAiv$0URDv|Ni#&yVpOw`FM5cx@9x(HE)*dP`Tiky(0iu zI+>v|g`}ENZjYU$_Zns<6o3gH9wV+IaNXo~?N z&gOGeO(_k16zNnUs~~wo!ZMwMmU0|A8(2Iskqe$oP|Zxnlu*ZPSZUU*oRf(+bwo@K zofJ1NWHrm00hI`u6~S^Wd$mJQwWMkYVnRTiQ%)j9bqnN?utYg#%>d{MWn*UM3=ISf zfDMtzP!Ir^M`d(I%aXHzsIMG(hone~L_iJ^f{-ROu_0*|b>x*83y&6i8MGw7jkezg zhG0bf5U)OdxW2!3RXDpiTdwC|SyHr^$v_2=kX-;ZRV6O24{C@+tSG6ExsM@OjqI5d zk!VCUWR@WVGB_+oeIkgMRW%=473FMUc~&)ZVoFiOlF5XA5k-WV>&494UiZ7W+a*+= z=6<Np!PRv&UvN{aAP^9tfQhInFaQCoDxp&abYPZ9$YO5qcl!?? zyh2*c@bbc&6LLh}*isgd%t*`G!V7^|ic#*jX{gaTUwd=t=d}gSXkuz01cXWmFxu4F zDAThMoE5M`BUT%Mz*Nwmcu<>2)2X%}0ov(+$0^lj6hcfg2pBcisyY&Tgk~zH?1Cc% zHA<#KcjyO8$pfO|&<%j(Lgl~#DG1~wGGvK4C&50;EOJv}6>W ztfEENji8zmmI$;gk_05$7@%hcX2@3jJp?M_s+xg9P8xSd8zRk{z+^r!@rd0E>26xM z%o6olkZ_3|%_=|u42)3D2SY4VWjULHnFy9*b=sB-vLzrxP|IbfCkoz)X1)D*`~DAa zWIA_`tB^>4!!I`N*q| z1>{IL6&Am^Gs9%v_G4}S_$wzoU(h$fqtEoH_P`OdP9Lanvg2PPO=g$n*(gs3PK5RJ zW;hkhFqVSwqrQ02$QfaYyhH>-0|j72qY_S8!WB`np~291L)$92!yuAk6?_%y7|pU6 zAP|xFp>CSlylD=72ZU^DF%HqRXLiif={??%BH=il)aA11V*>Bt7UEPSKI*HC_f1cb zeY)J`dC@Uc;`AE{@8Yh{r$%q;;`S|6T*76PBG>@y#C<_Mm|5k zJbQA!TyA0%UwMr&55u?^iL&HT$AzP4utb=Z`#Pq4l>9qpCiGRs&XskmsU$mrjXz3b zw-Aa2@Ph(sTH%H`rUVg^77lSLrpwhxIhk3gn%QD8U#_t|hI&@d8zk!w<02!bd87Y_omENv%yqGT*i+NoI)0Dbl z==vnt%!r+1M~pE_H}rk%txGX@V~a7G8kuv(%ml3EQQaQvc~d!GF&7CJBD+rH<97SI z*Kgn7+_b58#C51D=S^WZ^uK@oju^pxnv{HK*2~$~pRGQB{^Gy;^yRld`Si&rPZUFp zgQ^-z&Y(HwLEvwrdX z$+M?Vf(!fm-FAC_-?rr3`I9F=RMlY^_FYdiVi|^h=u{I`Y(`?BilFSA7qQ*873qvP znM=So`~CI)xLB_1ruGat^McyvcyoKWy4(NihYznmUfu4uNp8Z5IKMc%SZ%7h z^2PVL&~9oqVApjiCKWXUH3ec9ymO9-xb&eB!9XQb(V&~Dfry|1u_MQ`Fc(uIMkF9o z)zWJsMkKQ=Sp*##k*cW*oz^B!q|Erwc=F@8TRyn`{5P9wd7`IMVX}WHXaj)>T{(M9 z4Uil&dR0J3sc(mzjXe`+Y-6@z$T`KVDni6)h7gdcP+UpJ)R;1X%Ec6qa+bayg0GlS zjl{AeQZO-9%LYQkWB_WG#-1D@0a3*Y9rc?#|DiUOu^)&l|8jw8z->tVD**e8%L}@~HGRK{e81+J`ZA zsT(W{BOn2IB{hhus$^hjRC!g)2{Nk74wGry4g21;iOd?ts#>Jli2~$l=SL;N;2lDZ zvsx-v7$kQT!F3+gfeWFoc@_Lz!XTmVcKdDKAGL2mD{uh_YNWbpeC=1u#eB2kipkT+ zjS$q{ot-UKb+dT(!Y|jpYO>|-a0JacCV*_9#7GK|4O}ktXc8b)0Ea4MIp>&C8ipf4 zp3fJv&1QCa#;#JKp=NfBn0^{hPlTy6*1%hrj;ozr1|@ z1QE!SnHU<8mC0Pv0(we*gds8!6FK03u0d7r0=pncDyjhB5rNT=jZlkyO$Go*sG4Os z8QmBOfd9=0Y<+vvMyH(79?c4;*sLX-H|vU2KsldZyq(5rTutvEvbP zoMfdmcApgt;K3Rl;Z($zhh4{~9Uf9#$7g;5KM#-(CU`Y!sYi<71cnN>#sz0XvUi5VJ{^oSkD=c|+21Uf8H0UL2JeCH=}qP&=}? zD#;UHUS8;zpD(KBaCi6S&6|&}-+uPPr=NWJX*gTJY-XOh^5nR5hfcuVPF>>4bQ=(f0SqQ}`-vbdEgC%S6yx27Qg=+D zBjrOCevk}J3=kM;K3~k{3(+hozkTyIvhM-l+0uI&M=a)DHj+xy*ims0Nge#paYHvi<+D~ZGX?alV)x^Fw3Y);Bdlp#=| zd|;wHpirMBzQYWF$Bv>Y0F)x%OeeozUzCeoS$DbO*6#)?)GMXJRXjRnB!t~c6o8OIa_WeTUO0d{6Ret5++cF z5>#p^sGxBecKhADu7Ku?%2%#3|ez*TVUf}8pMa6Il44X|F#Lg0E) zZ8pnQvkc6`(5GRLJcvS!;2eJT<%_DSUOsMEmuUi-|g}+5KP|Cm>j7<|mB_?v@ zScD*}TlM-Qn=*=U;5jRzA4c@Aum~>2mGrrmj6RF-d8)f)w3BiFuMiK|sVJB-ew2fCB&n zB{L)E$dNE9gAoD>8hCW1VzC>xyT0q|LwEN4MYUQhc}3C^8Dff>Au9~RSt>@Xy;=?x zIWtLFjigG%uJWFI;EEh&hGTz>s67tioU7})o;UN=a<*RZtTs~BEJN&u41JGX%V0zV zlGD%*P>@wdGh|dX4h)i2QW}ya^kIep(FH_eAX2jo!_e=x+aVvZBAPK$&5j5HGcV?| z#TTEvc=hDxfARCLzWL(+`TzP~{`ptG{+qw~Pv8CKSKq(>{lERozx?VaU!7l^fmxDR z&eSY9iI&A=lemJI4b6zTt{siLt(dBb8L&CeKz|?wro+Fy`IzNZ@MlqJ5CG;J`{Q=k-ygIc z`h6R_Ua}y%_1W6j0oega8hQnAgaCwDRa8tgDmj!GrH|EoUM(7$H(UkJm4FPE#0&(O zxMC+UNk3Q`Op>K!Ih&{n02+}8?|^+VF?N;X;J{HPRLfd)frgY7R6r8tEGc6Y$hi#U zk{OGR-48R<423FCLr^j-WFB&v>~%Ry%2~vKP0*==uL1{Gi8ILwO!_3Q&x+((6oin2 zBcg1^rK_XGv8fE;lyjX-L5HE+?c%ZZo~y;o)s^`QJ+sl+GAIyZWL#0LAksqFXi71l zTb*q#F3#nf{tv(Y?(hD$|Kpdx{MEbr>z~Ert1rKtKSQpA5!Jy1fMjK2n}}~b5y>Zg z{ZtY{31YwrjXofp;t~bZ6v<;|z0hF=Sxv+fPOP;}y=HsB_~n4IhoRo_o}4BUexzzW zEzc9zHI^gg<&P&`PF!}W@yf3*N|nis5ukYGk3_hREZ7vECkA6onw`1?#S6Rh&6dmM#o2jx?E1D(srQWR{6wXfES;0) zZgfU^xEZGcz>2~g5E)DvKmox{d;!2X4p4#^pCY1w46 znn@nw{q?o`Jesiw_kqt^23L> ztIGS;{M%2S{pnYqe){4CB)Px&*luq%Dic%;j*ZC~vLTQWqxp)PIvd!mo>jGC-1Jct?C_58YvJV5`-_3EU-YB?1jO4or&_rE3q2HlNL@ zswsE{1F@>|qOd(2U%&nE!<)B#+pk0@%)*b9 zyF2#F)w1%A$&0{{W8Zas*TtCom~-skym@8Z)Jl0Fj+@&gT;4iA;#>otCjV1T!GVXh2G-aDt)} zQ$R)FHy!t*CUWeR{x{IzL=KMrAJbBwx{>3X7yy71DH|w`HGnc8x+=I3fQXo5)NC-s ztfC@CmBd+*$x7lZDS%kn3PHgf8UrJym<_RVGzKHc zR>~q^CQ?Nr0PxI~MbiLE#xM#vj5SM6YJ`EUa^xHUBbMKVXh5h?vV9N`Nl^tfs)%Hl zjexvnIOV`&2B$!dQ`c|rcDZX+w@$UH+^q4!X-LPYQq{9+v4W~;ukU{M>mS~~y+WpW zsAt}R_QPR6?DweTeF%hPf@Ypfi$F=03>ZL5)ik!cK|v%A7?HgL6UXQrC?gOe6*GG0 z5av`t?ened?~l8iUDfplwCJN$G`el|N38^UtY`>Gc=2mRdZp0MpcF> zBB?+sjU^*M8i62zbL7ZD2F)256|IEOfg++3B#mvn-^J~g$Sr3}UvEsw3=}k%huVZp zDnI}gRx?mWtC%qaM|DI<<)P3tNRESMal}{$U_|H2SU-*ii^V(=CsykbRxhH9GHE%H zRTE440F@?SgeM>O!am^0^uy`Yvr)3bgs5o6Ay5n%2vkuK6hIXK95Z;Y>_Xje;|vo3 zswM?h0s}TRbmW*=(JZTp_CwqE-G1+9O}$z)>&0xja#dw6WD{m`2GmFBySP83V+#_= zWE9C8TX0lYel~-;DgLD72pt+5YBn{8DB6L<`7cm_U;%A&g(? z1U%Uz5E5n;6)l!x1q`WKk|fa_RKPB{Dma9Sjo3u8njk145SSZ18xVjL5D}2o011eg zIhcw@JzU@2UR?ufy;__-eX_VXtD1#~Cdp+sX}Y(iZ)G@I_>PW8f~FR|tHWw``RVh| zc0a+!0YF%-xT!htIPpA=y+TQqd0aBW7>QtNV_{tW_CXg^khV>f(&PeUlV;q^9=c8= zA$pp@J-x@+zJODL@1$XS;O!q#`u3nZ`q3{c|LtLJVZ_UDV$ETKVq>*ZpxsFPgB6j_ zw9rSqHtLFO@|GC;AjNNQtQt%eR3#&z_v9S|k!RP;8bl^+j@!fC?fq|l`Q6>Vo2@sq zW^rtfH@7!!+Y)kBg|;1X8Vs|60y!!%HxvCdMK(N?HigI^3zUaO%XrsD$bb{d)zTio z(WGaj?_m1Lk<`~w?$47Sl@x1HJM9)W!es)QrZvX9i6_E);w{J8aN3+eLDf=9j$F#g zRAWqi*X<8mV}Cpz_q+Xkwm@WP4=KgI>$dkdyZsgcLU1bau-gJr-OM6W-*-dT`^vAE zYbM@q4_%C&s|kmgfMpQ?ELz^NH8xE$jPR#?T*U_*4Q8s66QBWldeoc3@@$ReWXbDz zT!22tRbVh)Y#oOv3pzt6-A^V1NTR@8H!}mn5BcqY!l=_s@kW#c1vnmH@s-|(3IqJ%UrNeo%UU+x4?f&L(e{r+l zfAW0!?Be3-*%OFzGaQ&;wQ0h9fy`x~+XRm{+YfKvzj^z1zdtlp#SHz>=4@cHY-Wjw zk=sLOQCby*x?WzKKN;%!5Ip(voFbwaBUQooefRdm+ud&e?%mt%?Tx9emTOU)E#~WH znZYFmK<7iHU_;*xLr+YV_nY;q8_wbokH?*2A%@5i8lt8s1Q{u%oIwqcn3x@w70$@a zg~TZ88TKv`=@2!g6Akk~SWIHgQ^)o3KMxzNJ#6gbKJbXuDeK%3ql}^+F3dU+A~2R{ zYb0i>t40^#eQ4Xh&ndM>=Sc}2GXbcM&O~OAlNNHVbl#OXi=dm4LqI?!5fC#GaX`Tl zg3;;OBo=^dno24TqeEoyqJ|32v51tY4=^MqGh}2l6a_F;G3ldYEr*W+mPRC2D|syuWdtOsQKM$a=!170+WWiT|N7U5-QDHW&8ttIE;mahhbm3QwQIa< zP%s^#`CMqI` z#vT<_DHD(-B!aRs6j2Bj37IPL0v2ZEypKDHKp*eh+rt5O$B)|~H1Ek*=nBE&sz9EN zML3feSq80q0Ct9;LsH8*C+SoPD{hF8O%aU)hp_g(=4xh0l10IQKuuEL=NPdcD5?or zQW-ECW>!k#at?%5@D`J(3?iP{2rQ~*v7EZLL&L@TjLDIKra{u7I~-!$dB@AuoR*EN zYYQ$$VTlgxFl12m;)AQ2#r*4^e)a5=7oUFe>VNv5{^$Si|M9o~+yDOmxxK%7{lgF6 z{OqUSe*5iey_zo;RcL(W$|;p{)@)g_fkEZ78L{S=z=R1a=ju>H))bHJaVLb$Vvg0q zhzx+ia_Vz;v@Wtj?Rn+{yGoS}3To`LNPpa!_3RuFA_F=$a>nEc2put?H&e50E~P#V zIi}q8(GfP@)n1_ZPn6Tk&}c#d_~@C&u^j*tw|Dw0c&rf`kC6w?f8@2`fkz!*i3q4B zs-uJ*s0fkZ^u4aXc~ikXnukvT6$ToajUOswe0Ay^zT;rfPliI6*B`vB4h^VkcdGbOX?FcvmzM^NLEdf z)1btjoc9#SfRO~yfUtzxAQxy<=)@9~u80{li;_VF;JlBfec$hQcS9QHDTev1IbXB$ zN%~Ur8(;}uncQq(lyevmlt?iVl`P`Wxz+5ezxej~7cW(`Zt7+>BkzYC*%yOUAfl4) z0L50MT3{(dWLX3q7Xc1Par4-vkiwG&D7zgh? zx&Ua0Hr-<;=T=~_uh;mUd#{k=T6MTM9gTOhSC#Bkpw{i7r3^4AG_T$Rh60Z zL#?$>gK8jvWA@o*t*Xk*FTeaggBar&(=bK>a4xhpuU2iv{_e@yXP@l7wh1D`lFBj z?8l$BPXFe={msSsn^I%3!+w8#^IBtERA<5as&ZU;P#?1-P$LV$ zRZZ~TA(MJA5y?5ngNaDWrIMU`R7u7zs#;=o&V@GA%TP7@!|=Q3-~R7^`}bpti|Vr< zeDcZNlRMWJmy#tLc2P8D=gC(-xN5uGeEZ$A@4k7u+wSVNS}d1U6+rTScRlR;#@Ce( zG3EU}_BKEW!L=WL`1$F*C&T7udvm$jTphY0WkH52RL=8eb8~%jv)k{s+kG5*RRN^k z{-A0^E_e(+0~T;R4Kb%E&RbnoC#w?xRE3L6*zdX|;)@Y3fPtnMHJK75PGu2npriT_JXe9s$S5e{n1lpP0W*LIgNDFW!yL>Y zp(2RnQ8Wor0ZEFb4ghgR8q~6+!Q^1s964Z8Z3${14-yb6Ph^(S1Rz7HGuWY1Lo`vz zaTI~*YDd8#O)g`QGn+X=6-%0hfSfZdo)`uQ$gX$-r6deN1;*Xx>cy*z=P#1VdmlVm zp4}DJ6f=8hd_bt`KT^3A3ayelZ5c7@zxCl3xD5HZ6DJuuo1V*3)MI6q1&yWw>>+{!#ufKc! z?VJ6ZtKASsbQi=}ZdDarQ-!vv+9tGB@Dx1Ix^b(fS}X!Hg1M}sz~z7tK|)nY!?2e) zaMiZHLDxprtSRTj0U&Bc;6Wj4j!CjHI3H>IWV>sv2?>la@(u0`G&7s&>5v z?}14$_oJ$6e;Br#)OAEwHH)fVs9zYlq+)2~fK44bNoq>F!&uc&F`t|)fAz0^u{vFT z`uWHI@OOXv zgw7EnV$u zbGBSB8D!k=4wpCMZcn0&0EmKEy6y_55;Go{T@Z9_V@?Wt!!bI~sE}ifhlBJHhDc*_ zW`U@jS!M<*Mrg>O3Z_(SzpR{nWC%t8%;*>$0~hbw%m8_enhc6B8%}A1NG4Uy*+v9M z+*I7I0yk7UVN52aPr}U3ia;o!Lh(FSlaw+NwCnaxx*JohmaD~j#V%wKB0|-fk*-D7 z3=s{boV{dpv_@v{vZ`nf-YxH*tjv)w;4`2CJjJ@rlum}(5afJfB_S;^GuY+baio&CH0449ETi- z97oUW2s|;U0;;K`VIXo2$a_~;RaJ#WyId@myTf6(+irF@L*Lz8Uqa4~7yzUwj{y|9 zFg2xVAs<;|W_Hx!ohAm3T@)lFC8bg&P7U%>m=U7D?OL-V@oBzYG$ABYd4VuFg{!KF zq!{GK5Vbvd^4t9&8>6Z3{}8@fZ2@95EKne zl#K8x#zx{9j>(74p`QQE5zy2@(>Hq!d z2Os|E`+xD_`%e}mH`nLgq3gR|bO=NU8rTs#6&hmdhfz~@fkG4N#SzNq)_3WD$+na5>sOwc*g&GitZr|+($>>8P2HS4CImBKiEPPnh zCyT0Gp5Wcn&CT-FtLn}9#dd#C1Y$fKy6$kexw=j%p{e(t!(w%M)~-&F{gBd_Q!2Vr z02!gk)s?c+d$(LH&rVPKVHjhMW1mgf2+Y(}O_C)sL+7*r;i^nrR;u${#P$n@IPJs2 z;hK)VX&&In4L(-LM`Gt&+Zqv3-x6>;fEUal6-IZ>6QIm#Hds0|`}05KDsw6qOO zqoyuK@h&AvngdfOVn_h$5WRB@j3!`$XktRhK!5=yiE19RF*_%ND)0s|K%6aetS88ZelfIf{4QB(P!|LkWUfAaB9fA*vQ z@}K|uzy5#!`j6jy@$~%ZAHVzZ!!JL0@5y`bJbHM#zH{f!z2$Npe9h#8SHw(`fGDtI z1eGLxcmCq#`KxE$_J$h&;AG(`uu_@?FUpt-x~8oW*jT|53^A*y#hf*dB1uNEl*AbOuin#(fLZtJlV5NkZd&)EZIwxpEq{Y9t0H9^Q)&K~NP>I-cSOn*oOr`I~?l2xY zR4~w(lJmi};pE{N5fp7x9Y@I`#tzYuryP+;0mht$-64)ya?JZ3k*2+KLph19%bCN_`^0$NgfEL!`{xcDI@ zNoJsE=9rv!E@UcN%hU9gV@Bsqq+~!8*byjT%p#&uk|xz2oM;6uFgr)c?8zlf1^{KW z*UYR4HBNLsBA}{T-@ms!TN?s<->lclUd%)VnGgWfaPlvnS>9l%vw^M}5)o1cBZms6 zq71}HsvsZ;MucFjP)1+oZV^oQ^O4+tOW3hvIzKm&rv)>|hhy40^MY>q{kLi3wB&9Z zQd4GaGkfP4ZEl0hlwAFbZZ+OMY+Bxi0zz;7?J)q-l!?vFfaxKmrW4!VqyWJ{AeJ2y zAgEettRqZfsgg1?6;~bRNrIi(IUlm(`Q`Q>fAhybe)HX!ZMizx?7Q#2eY)A~B?$lq zR~bT%*$^EudJm=|YHH4LDWr)BW|!u-H{mg3g_-|krJ;TNq;y*!%?~z&GW%Zm|I=ld zuQymB)6RufQC%}N?;V;Y0Lf*V5CDw}(VUL6cYt$yWJ(mw43vRyZ`J%VV8F=c0g4fl zmOd2}SWiT9j^j9Vhc2g4b4FDJLsKSKrk&K32?0=YX6E3XXErq^BCwp|)y0LODWo`# z48X3~^BhMYP>+++bBp4ws&MMJh-lGYJTB;|&SQ!>Gn37?K+TY_jABl;PU*-UYiOFJ zT1qL2hy}PzG3w!vvN;}#*I^Gj4jmv0m?K`EtX7NFqG{W@A)~&_5(hTHtWqXK4S|`J zQ_f{95}1n(gc=OvuvRFKR^zQw859+qwZm&fW zI|o2!sK^ME#Y6$n6p_IJaumH8x|Grgi9Ith6A{7CZ{A#-FPr+8zxc`j_8kyi%LGp(YcSFD1cl++Js;hf< zPQ7ygDrPF8q9PeI849vH|{rYuIV@jEsfhe$F-@WtBqsR9j zJR~0u{csq1QDf(QMQRF!kpZ0~(wqko=M}vqQ7+}N6_vbT0AK_FS%@Z40%T35!x#k&z*%T=wGt)G z12Aju_lG_XU5Z_MvR>Ui1J44&h~z^ipRyq&&*Z#UJ$(D@+0#FK5y$-fpa103Kl_PW zoj~qXK}NZ{-ra2X&t6^p{@bTtKYIo#eg4^}KmYOfzW3?-r^`0W!BS)qU<6H&v*oA) z#i)18qFv`v19(?X5=SW|L<@`nE(s(Y=b-=>s3H>+N&Rlqb(>9hvm0M;_pdfLFSh%! zA6lgKo%UgSuW6c4dGCEwR|JY8DaYNRyWZ}${U)Y_k{jpm-<-VrAl*5++xmtWM6!Tb z4*=#EmQ~fZZ34a6Y;F$2woBar3KTpBvX!?s;EH_XxvIS=A%UV}L^jFYF2U$926xs} zwR51VjLra!9Z&@-OaVk>9J`yF{hK$b-xrRm?_!(LaV;PW38+Zyfx#sE>c|;@pyZf= zjRT#mmp}XY&mX<}&gb9z=r{lLo4@PSlf zH!&g-69c6p#SKsd{z{#10AgD3@yTKJ7V(-9)hTyNuye8PlE# zu0&*Jgn&e1nk5?}b7ctQw!3-xa{u}ql2xG^W7>3w(^Y%2Zi9Ekv^rb4%EetjY`fe= zHY&0P>|NyexMJA)FdO3nuW2#iIKCB`foW3P_6seGt?<=H!v zjAPH^h?<$myIM^~Ec%;BU@&PMK01OeTmuG-2w z$Br}!IvR#iawg(}+)NTcbIOi34~gO|o(ifef!#DQRD8u?G74ruMn(WMVgM^rEk~Sx z8pgd{19Q$dGwg4}!4Z=`V(29ooaOo{lUv7s#eEa%ue*K5-c4+Da67H^dXi(KvTh-**5GPamlCcv55=~ca zZr5pfuQrcoyfrv6iIrU8E^gn`M*|qgwA&rH-bRF!WgMa;0Z~*S;6<}`AsqV7Gq+8C+cu96x^d!TtMd z0<|=X5re~_M`K~C>N|)ubaC7r`f)?VZR34l9mg_%zwdTmzrOybFP{CkfBx!kzB=y) z_{k^V|K*Q=`ta_e=P>^7mhV`tEz5K6?1%ba~QNs4>QV z?1ngI5uy-Ak?pWQKOA;33Ir9FB%e!~(-M@E#eR7tv9pW&=Xlkrdq}-f$z)T2Z8oJ$nx83ay+kWf;fL)jflVxg$ z;ArzwHXauCJVKTPfJG8E=L`m5YNBLHSe)w$8iPfisw4}?sh!&_e+nmWkMhrTJpM_W z_jr=KsUA3XV+|(!Y3hd;Q5h38AY{a*uB#A=lo~6sA%S@!7dU1SMMTIsW&`4&Kq(ss zS58AiGsYw!n$?()oiS(zR8$SlLGb1rCK*)~5+MX4Hq9vwRygrQSdcS?B#sS;kPT4T z5jm#1fwq-;ne!yZ%?O~dJ9J&2e4RC_t7;%erhp(58KPWSBD3LeIPCWCy#M&qAAaW6 zXZf(dxOjE5+3c=27q73MJ$v)?<*TQcSFUkC|Jjdz^=Ci(0Kv|z3K`vxJhhQ;l&XzSXvJd1d_MVdF*d2B^n-?!HUta89 zZ@bss;e0qWHQ#&i@S_jk|L~)a&Q8wire;UPYAFx9Zp`DWH<$ACSw2u>%qk!{D!#tn z?gp)#cb=Oj)O8@He(1@-Rqe^@j#%#Z!})f5dDHC%?8PiwU=3K4T+%{@xrX(Ok>iXDs!x*JmwE~Ey#3m+5BIXn=iX|=#Ho@5= zR@HLUEIF1r6*eM6Q<0ni(0P9H-jjz9?|u6D$M3!O;6MMTzy9v4Z?4W?U%k2h?&+)c zzyJE=^z^+C-v9n*-~0ZjAHVzLo#1#Jy6s^TZ?3OjJimJJGMSz}y8Gb656|9xQZ4U@ zc~wQpRLJqnvZzK&V^qu;RLIOgn1PANJbDBVV3b5-&fVB2wWwmmKrRp?kvRxWW#$3A zF+=dqBb$+DB%XTifB;z3N))Fi^)!Z8c)`UHdg2J+k>NM()hYHL0Z}{lvL{#+@Cf3; zEectFY=8wlMAXS!M2klkqEoOj?%!OUKYbndhxKYr&RbSwpvrOJY(i*QaYd~p#a*9r z%2`Rk2XevHRj8RoA*ZZ4sw9wvMg*v8IcCYJNG=wKP-5^dXrV%8wWKDJM8w5RY=IpZ zOJ>ahfr)?-$ctsmsKDqzO^UcT75L830SPmCPlU#Ss@gA>ma|c@7Z4FmDolpNzV_ri zH8uEv%m_kNrCCFnFc`*s=*Mw125?xh1MdqlV;bZ_D9R3ICV&NHLdS}(w0b2aEGN#K zMbkXvI`QTWv8X^!>8(u(q!d>eU}l}$If!hUvrZ86LJKPUIMMa9f8yL}Jy+XHy(cO z%$wdzS>{lLZqSNz?L1zey8+D*)jKk@B4J04YwxUl>Ci+$t&ESOw=wlsS2ve8o5Ps; z2vN{R@yt!TVg&D;bBsi)Mg((+owRfdU!>T2Pe9*vN&Y0}mcN>>!&~>q=KC^V-&=va zp~yAUSuUV~qRVR)L0L6p1WAo|zpp z<)YCFCaMHDY5L6rBon3W2zHj5aT=mPQv+8@$KwvbnbTG@cuVsHi=FWF`EIWgPJ_qA zDS57xOfoqJLn30bG>$q91UQbP*tD?^aj={usi{FSMmub7`t3~~ddkYqA(64uEC2|q zRH{c)Ky=JvmPKM5x0}tFA|S;yq6!q;R2~_L_2u)EX$KmGsx(e>kfAO>b>wo-T{=@(2->y7-`}=?1U)?-y`%hmyUDWjO?1YeNc86{^VhYeML#61V zYlN$-?bTPm|KppdFRKP0J$Ufo?1W_(6_?Ai71pT2nZH^2VFKm768We*>H`2Ju0 z<-O^3bW+5diTRlc;7w=g11_4d#>(Qj5gWWxixnEB1jC@4Lx)$% zwfpvTT`wBX9A-7kOl#nWdOUq8G2^1Bzm`N!W6 zL-*mkkMQ5^AJqI{!J&3}cXRdZyYuh9y?XXCWqto=Kl|)Qzg)ljk<>osG3GHCcmgzK z1RxEbpmxcUBuHa6$j(#k**hiy9f1qU5-6)FgCYVuKnI0jBWi%m6(GzMRpvm1jE;m* z3_+Fb$k!;la}o_iAhKylvHU{8+_X`rNx?Z**^Kf|6z6$latgV(IY;RxfT{{05b&hP zSVATc01!9?2V~>`PE@J)UHOV3|zf-O-=1;>A1IxhXdmaYqh9O2)Z9?N+ za6Uk&u&#xOEt6w(OiZd!FKcUDzZ(+3DCWd`ARsLj8ci7)8d#wn3n~Cg&N(LlD+i{T z5f?DqW~94-k%|)rj58cln3xDg(`YjiA<`rXgJ6>l@YF<@prEOd^d~XFrW#{rgV`5pxCC-b=4oSsgZ?eQ=E z1;Oq1t<9IINMWKPAR#JZ*A3TKSCZ4|>H5yunez3%aXI?LC3NJ zJd8`@;A1oK+9c}dQ7=dEGf?TRZCcDF@Wd5~FYPE7SpX|9&t zNAo=c03tvvsgR07F#|>dvT^KE%9ce%42+17D5bd1x$nmu$J7muaDRQZ-|f>lPCL_# znGrAzU|2TSAGYWa(w|M=hkyTAOO{?#wnZusqG|4*+kp7rA$bNeVNNTFS5 z)_ibWJE}&-n_c?)^^3p%{XhQW-~U>+hoArO^ZTcFhi>Q&*L~NwC+@oMzIcBA+pnK~ z`QpW4+HT|mKaAt~W_NjUvs^D1 z>yxToF@nL?)FC-wjslw@ULX2i6xlO+Mh{A&T9~$k41lUI#?cvs+TS@jy?^gP7TNFi zL&}7_I%(JIlSR8EqJ9`+%07hPD@r`XK~zPJ(M@7RL|HT?8Ha%!b8rS&h_oRQ6sC(rvUR->4^Iww;=jWF% zpPyfEH(j5pX&*iO@CTp2`-2~T_Prl`@aWx>GW=14dF8|1388yST`JtCJrphUv}NTQIVh$s*Xdt3NilbKmch)}o9gLYBhd+LrD6*lrHH z{c^c@^5pSqy(B`_Bsv0!p^%5h*N>X^G)r z6&t(Qr5#p7J4(GgAYzU~JPhMu9JpPED_wSD}g5$7UaHv$XX$DX+ zbZpLX9>-zV?XNa64yg)SwIf$m?Jzjs`b=V)OZ|Ixa`z`cY(9Pe417IR*?+z!F#! z$SBgM7oSWt zrK~^-2AXn$0Wdfp8mXsr;}?!8Cg5!eam43g9w(hrCA-bPVIG|< z|Cv+ow?z796#s}4!7=jK?UyhwuiMyj3x6LeL3SIzZlC7Z5SaLF0FyJ?TzgFT>k*&* zAMmj9b43DXGK0-#_vIhI+HZFse(-+9&Dq_vMP0}2vy3?>%nAy?j7SDb4qU}mQ}x^Z z=KA{b^_%PSs~ocrm175}YL;VG%bE=UjY=kp&iOLGZ3=2aSjKE8(atHyo`HOLEB;QE zk?j^+b2c%pC8GJ(6*QfYh=|y-Wz8x%rBvulMS*D|6&J`s6cMQionvWiqH_!- zNkSkZL^t;#1Kr>v&@x6De;n_~V5w^!Td2`Z%73vudz z*tE>ezzC?cQ*oZS&N*{nQ^O+74FC!n@$B2(Vb92nlyhVm+d%hLi%*|CzO!1LtlFe$ zn??&>eakHbgmH}f?y&90Uc|_g4}?tSG@A*6g0Fn-9XU6oGz?>(VgpUnEFM38SJ7gA zc6D`ARaiCka=C1qhL|-bRgEcAAV5TBU^0UQq6r8QeRXo@t|`Xxq>SDV!x$xknd77G z!vw^XY8};p%7}^4ErSw}2(&ctr@qwO`8;9;c>EuGEBil|3de*0_`4!>aGXUrp6XKv zfaXeM-T`I+j1JIL710Q$y;`u4Vm3nr1~NgM1Ucs+4qZ;8KqfZCluY8l&YCLus$upa zxWZ#Vm7H@wBz3;3Jpn>8#_R|K39C3XMlOR9Mg)~tLp2mBemR!a*nrGHNLACA!zkn! zMaU_VD_j5pa^!uk$Op-q_FYYCb%idN4hTZdljsop=TFbS{QA3ZUY%cT`@L(f(7`0>ME{o?08{K*ea9xhe4+ug1ob`Yrbi*|7bns*4f&RdF?;~@*| z5f@59wWE|kIzve0krQI@4$(|=8pqs^9S|)}+GbHf%`Pxy2|_Fm#I?Rz)%E>~)i+EP zjcK>r8fw#2{n$k&G*wM9MnWJ0CS-8yY7ItcL{LGqTrO7aa#<}GC$CS)`8)62UEaOB z3`=g><=G7+0ZN2)=XAZicXHbI?dc{bynek6Opc5wciQizUsCNWPwdb}S5f6WrjR?I zA;xqV2iaZk_dO_Bj9ng*GeWSO;-NcG@TU(RoUG33rfyBLMgzX9O3B)T267Bl8L)iXw{h#ONJ_P^~}(U3OJ+ zXokan6NkePV;V`?ll9`{v z!}jWWb90>~tyb%1wQk$CS~X#{U}gZ642Y;?Ss`VO8PHc@x$>IYMYCKj7po=ss>?Oz23BwGPY*#NIV^RT0VVuzhoWz3;|xC)zBU2GOzbD^ALie$PEiq8##V={h3rEEs%Z^7+9&Dh^6CuT_O`0O(pjYaYKw#k7w_Zx2iAt4mY z992MIrkr%Y+dq5y^3BWF{UM^dPmI?mYetTP?zUSUA~{?vPsoQP8ZCL#q_(*^TwUJW zTy6T@!J-P}gcB(d08vpvMRL-N#EygUH2I)21q)|&4LC|tzI|aQ-igikV2<6>cT@E^ zH&Tv$n7JoUrEo{2Ntvch*3KwnsY+lH6C^4bd%3~W*un9-m++6rngj`sO9^y7PHxM> zDc{GpG>Z_XM3`i54iO`hry{&+P@sA(@PzXSh=exTZ|n5_5RJf8iw&89T5;>8X#kjx zYq9Kr*;RSYfv~)n0&v2NS{@f0zWt2?Qdw+sIXitk1h~CbIK3helE8FXRi(@Vdw6lbWxOnJf zLo^oiOo0i#Cr5^sBqd)i@kLt9U7IA7YVDTuIfq@ zx|Fg>${7Y+t=8-H+1+70zr0qw5ilhHCUj*w#>TPl`T@+yan-hUSRg=*DQYHUVz)Xy zTP{|b^B9Ni=H~M9BIc-bhrOJcSXz5?Ca#l8A56H=%>OJUD^0(dpnQbeQ@GF{k9hyI zO^=|>Q84Y;+&%vBk(p=!fbOl+AIjM?`II3PD1Z=)Kk>{ALIQ?@O+k?qP{Jc$PDI3j z**OJBIZF~$1;@^$;!xEU6RAi}G3GI)kr9LWV%)8w0^mrHjggpu(G0C30*}!&Cd)bH zm{HZUV8M^GN2~Q(K9gvsF(;VFcKNa7|&nd{NwNc z@K0ZS_55ProSnV*_`Uo0)(`G2?%g@j7&q5f*EgHpzI*Te$B!SZ+ZH4qhI|lIUsr6w z^O8f0_0qX2fRlaP-uUYwEZ6H0Si0RfcA%XDicTxWz{KRqU>xH1dbb~T%hT1}dcAyj zADTLWfn+CYy`(OwQq?qJxkw10#D;Etk|igNF-0^$LsoQHp{YbI<8Ee&37{yqGqZQ6 zr)NG?i^akW+V$G|rIBmu1v$_ZO|myf&YGqQ>lKIgaJ9$XkjBA#M289U&4^20E(5i` z3a)a?CHV@(pPpjVC-<7JFE?F3W{?b~psub~?Ygaezu8}2UThAB%j?bJQNLcd1}K_U zGHHoalt2s$d)i2G;VR=gp*dv^n6jpR%rT~swN8v=VwOP-%{v>q#mTCv=;O!te(}SP zt2CahPEMC@RS}scQRjW#-l4Tm57Om+chTLv`u#PuZL?mTo}N@q&7x>XjGhBA0!9-9 z$6zk^DNBTy7ggm$ldP9&+;4V+^vM3CX;-IreYIe$%~95@h{Q-Lgg~I)JF|(amLz8r zL@LpUfXuM$IGQ{=)yxD00g4Kkm;wr7A-)~=FHT7wP7;t4BjMOdz#}wV;x)~Y|1CLT z12ZeC*jbgB$x|A}-SuXFeIsKg=R&BfwrS2*^=iSD&yrKjYKY9_on#TqMi$!ol+i3L znyNiru;--NG^r#5OaQ9M85)?cg0Cwehu(Si6%hoV({TR!qTlzDMF5dFW<_VNri$5@ zTFC)(1&T(%u2L5zYcDqJd*`xCN=DouQ$=lKRYHl9ha5*q83D2li7}ik2~rY`h)7f| zTJ}};heRgPG6NGj1TXVU? z#Ln!Pj^Ui^O%uH3W+5P`O=>5TUl`1ZCQWO@biUVXuV%xrDW5-r+cdw#TvPl>27e4*Q{6&nT9_$?n{iuw z9P5TT%bwXvsA^@X9YjR33q7%w<9R~*uKxTIgo63)gh=6m6 zK{L%@E)S-~G0}_)IS^4yX>wX9g%?7(zd#D+$dM1Ah6TJt$T^QOni+fNedV1K(VU{h zL=z7mk+{H#VxlUDh=fee48&~G?VK_ug9)j?w+=R#3*0iuFe$F!yhh4$nP;?1{WV|O zviv9LbuNbOShkicKyQ@`=EyNQ=RE+aW&~hYoQnYgR0M5ec5}(-G@+^|t{1I|?Yn(c zK%}~D4UD{30y30I-1Y4;SHJvMKmFN9@4dTd!f<_= z#!gctQ#2cgF^|a%g0DlURdP<*a%yB`a6}ZUaI#+Jd$CfvUJtKs!i%e`7nj%LZ@zeS zd2zN_TwiaVfBXFU&9!1CCm+81?hk+ROILd``|`WjR~MULu&&$t58vmy%J9e6=a*gI z{rrcY|HUtV^zp-`hcs-v+#S5bwy9ab1*f1x?8)lJH}9O?F@RCPmD8(gg^#+WUuf}$ZPIv46i?d!VB!(q4Y$HBl5QB=DA0D$a6Rk!Gz0Ce4O zv$-L{s$TTnc(c7Zzq}ZRJ~Z{iM~_2OJLicw$wgcpI?ukY7&9aQRC9=-_LYM+_||b?2n0wd z24G?gb!h9Vah^3>7PYLRs$|YV@lH_{KtpEFY@(_;kD7;(GLSP09z7$PBT&`Y4`RaV zNfmhRZIer)al7qru0^_KLv<4XK`eVBLa><6-&}q1#aF-m!`FX&`f7yw)1Q9$@BjV( z^ud#dlsdAJHA;NA+iY*HH+2=lxHP(^XRVrJJ?%lcsphE_b>ayH9k zj8Lg_Y9@pZiNQ|1yVrz$gV2QKY2eClHI2hzvr)fTu2$>yYHcTrOiE_Kp^XO}aOh03 z`Ns32LFb!h`QXl-(`M0K@2aPZi;J6!o15k4syFV?50X&f>-shdz$ zP&I_ZxZgj2{c4}{>h8(ihxeB!cPd^4*R;NFs^DG4?9G#yjXCYNhkkS8k(EB94#< zA*XyebT`*S*Ezz)YPCK&ZSS7=wnjuKUt5!9w1f0N6e4mt@SUAVYRI0GfHUz^)Dm!KstpX*c8)0YOEEeqbUBriM`&9r@ZZx0OT8tr7aV z0-lFo%aLmZ?*l8UBR0XIq6V`8)7+U+MlQ;Z1-2}QDAJrN6{e*g4``fPKTv88ML+~T z<~8N-OJ?{M@@X~=I~E0)8E?PkdKto7hFnuy00?QKc+bnH#G%{oON^P?LT~4w6Yt#$ zv|S!IS3T3}f~oZY)Ag7>->q}STM_H6{=$)@`ZhmfPW5l+*Z?LkDnuw+E>=J%1yc|@ za$8jqtZ5hb9zGlfiz%I7++1Jn)~n_HDjBT+0RR9=L_t()xl+uB{hrKD?ws7a=?!7q zcbna|8~T)`AL4d17}D9jyF$DDp+{3N%UMlDEu*95a=BO)}E zB8oDD{8qpbB!fKPsG_GRU=uQ8bMYpoIN2}H3wzos$V9|cH?^pVsfYj)5}|3~J28+> zYNzCxLBIf+Y0o#Vh95YX5a$RkSPco>tKbn7Oq zAFn^YyY9rl+>ZbK%Rm0(w@?50`!9a~HJ&yL?Zl0;sH=w$?%%o7oZP+JtRH-P{_^kt z`S*w2e&O6Agiqf85ZZg~lJ*H+y}YQK@VzIGfBMPCkh{x^HxPZjJU!#;#;zfc$ZQ;P zGSNip2trdg26l0C{bsZO`qkyh$(=kx!0_%g=*0*tG2p1 z+&p{z-J4gheW>oW@Ir@H8UYARvg6(oB&Z(jGY~OuwbBCR{Wfrm%dcFgL+)KQ%7K0gfk3cGns8V zV5jo57z>s%zr0An18=dLsf50*D9Wq5`FRLR+(4ed6$Dk8&f^)!C@n=sp16l<3W``H zM2HF7sx`}m8IokkOy)hEt(J{x2F`NeK??Nq|@%#l+~Y6Q*$@ve)1 z{Py*4zWnyPH|G|rAAJ7#zy3Er`{kei)Kzu5dVc--spZjwu9~W$6HV!GeR(q+4%(gE zzw_YnV^=q!TIX#0?r?SWeCVXDLf`c-FQiw*tL>ddIDtAervOO78L?zJjKiQJNe}%n zW=&?>zWeIyXD=?V{A$H@1LW28&8t_hpFLy8p8&7!JX$PQ!Ff|v1Y%-!VHz3ngdWgJ z=LA#N|HA58pp? zZS``qef|2vE@M9qV_O5a;Fbc(L1c6@q*wbj9qf1RE921`ct#TGmKiw^vI55ZI{?mb31oF(QGnVa
$orjMW_2RI*O8s!Nxp0oM@@O*TO{F7ME=yNcyj+B|kHc>JN@KO()_zg> zb`=&)RaI5+b#QGhqT}Ik==Ww)g+Le#*n)S<#VI{xLf_UQERAb56U+ie2%uTgDC02f zHn|^2jlHYtMYBG^P)iBp@R41P>D048s>G#u+L+p4z5BGsmjj zhmxJsMA;^pvwbi_owID5wN_?bb~BaYL4=4pIYUgGP3R)0`O{(Vw|6 z1i)FpW#&}FEq7vuPLF?f%*1h8NB}^FGIa+EbH(Ns0p50<{*>u|B%aLO2$*Bc9L1*O z-xMYtmzil|GjjIUKRixuPM6sxlV&pnbDr+pJ^lFO4^Pj|h9T~5ZeG89^~Z0&KI|hB zIOnRWTHowno^M5^ABV%(9r|vF$qb1r;`;RTR1C&p7{=_KC&nShaqNBN+xrhb{NQ~< zefsQq*GE-QQFaAQDQaFoL^}0Jrhdf?Kf`>TXA=8-iOT1oGOs`1;af%-KylqVKBuY8 z_QhrIPNf>oh_=lYe>vF8Bk3(Z*75cf*{#Wq1n@1=0F?Ow0}xeFbFnW@VBK=T!hR%m@gmfCd5p7eVO02sHNt z)JmyDG!Nd}Ja%24fdGt=Ce%X>d0P5K*PM&6>ZB$M$Lh%DLi(0uZBs|5G$l}RmPRK+ zj5%kK5>IWaxP*up$;?zrd`2~3#=34!&(7NAVoa%z$yW`xK|x&z9K7UF%fz!y9T`Pb zG$ORg!H~0B%$blR>vp%l-du;qciZmUFTZ~F^y$7k02wovH^3eVET*JsJiCAL>HCj< z^yzz#&hA~EUp$T{$&*`E4^I$2%rUhHr5yKncy-l1Q$?b+$coyGdegNJofjXG=wd9{D@ zk6(WE4}bh>x9ck7leWI>;x41FsxQC&mI?2jt)4u(-_+HwfA`gIfB(DtCl4M!e&4DS ztRfPS^Fn^xbr+j$QfR``)lIWFsh8_`vwiXGrF*mSzN#qP^!+}@d-v|FS0}{2staG1 znnl|z+A)vMUcUVO*MGct^Xl~U%z5X0@a&QdUY4RkI23DZu{J zD5K+PQJM(_NWkME4X9>ZbbhBc-ZAe#ZjWQ!nEoFD+Pk#KpfBok_|Jje;b3Eww`r^%Zm#?0WBVRhQ5mls$p@eZHweNj&Zl$KY#J+_3IlAwRfwWt3$upef8z%A3VPE@bs*G$AF`z zD9MH{kJ9(un8uvdg=XcOL+rnMe!2bQ*8+I5UawcHVTdnYzj}W8x>~N5kDq+1gcb}~ zic%vu;=l&1XcoZO2#_p*J&jE?{OuSHw;gQ`SToj5HT05*fHC(vs=qS9gAO z@$$Pj{q}J8^xnfq?>%_ulv`(uCA07CI&X%=Mb@0KH4+g4e23ZWD0B20zu^N~PsuBtzAvr@7QUo&< zw4#R%1VsRa(EcR#nlNZkKqH{Hp;|x?5CWbPL@b9Cp)<1_Q{N3)^J2NUcmKiZqx%|M z1Sl^`;1G)_o*JS<(ws?B9LJm?RGu7)LW(x*#{T9o^gR(&ZSNOLSNVpS1973Zh@t_3 zNsgmnP2uG39Y;jWHy0brxvDBeMZ#(kd|QK40}++sutm%iS`1BSYi=4#Nr!AnRFkNP z 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

(E)@U()YQz!l=^$c?(*ippHP1G59 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�U~$9>vk)Xi1IZuo6T724+NPs=%c6 zdqXrZDZd%q)jN z5y05QgJq358)^&G8nNT1%!8RK5dfQ!5-6Gwf_ayNzZwz@nHib}i2{RwL?!^^nEI<_ z|EIrv{_z)2)!@e;y!XSmAKtxlFq``jU>c^g$#lY@A+IJXX}e7+_rSJ4ola-_A$Zh5 zb2Q0BMnqyLQgkMeMbIFpgf*{$5lwRJcUg@{5kXqlyz}VZJ8wVvaQXP_ufI7veYrk8 z{YK)G$9M1SwR^Ms2Zz(Z@a@UPcTb=F`QtA|=jpOqCZ|e1t0xNShqV9W(sz8e0TQB1(9c6!oU>m)JD{BS-s(^*)5y`4z z0LIM0snU=|MfxPWY^y%5`wbD!XVdv?;+ZVxuG={z6%zqfO(IEQNMeSj8k_?r0|lV0 z20-eHZlzYJffX6e)n%e1g9t`e{S$}*i@&;-e8MWJA7zdvjMbxJ+z?ev5HU19gpftf zFV0>(f4*I>kB)9UxpVLM;DAiKAxhE)ym!87kWgeuSt0-ulbI(|=b8rn3}Mst!)|wS zdcN(4#oj*oX1Uv)#o=nmJ0^4NnF*96BUsL22HA|*vBwg7q_uK~qPQqSX#|!fr!=IL zg6F24I3L7phzSa5Q`yXFA88|hg8*o?D=2MY2~sQUq-il&j3R~vpoUJ-lbD$lnHPx+ z{rYn5;O_C`kAC>U2k-x2u{b}3FNraFXNkwuV zJnE$7**paAO{C9ah=+UA*<=DqvJH!U-fPKWeERIufB5}xpPsHCKiX^eZb0P4Wbwh1 z$KQN+@%5|CP9TTL)GwroL+Ve@USC~a`i9!pPnrpdlIFenBnu7+hkiIa@4DURFJ8QS z^3Kc04~?&9VKN|b+qP^Vaj1$pt(#Z%xh8BT6CyXCS(a4CjMdcCqc4ZG zYUypt9#`ijYj8mI$}XB+xpr3r0LSRaG16?(OuTEoFj<;?0$hN<~9~?u|@F122LNHV`=b5u$?4xgKf3diI>&DH)quJhmFL}9HZi!Ea zNc}EMCJVF1@vL!egStv$tUhD_6m?Aq4VxtGlbL}KB8#Qnb{EisC*SyzZ!4*6>Y$^r zVl2!6iY{59w8Xj8rwUXQ>gb6ncqcKYU6&mI_(E`sW>m+-h^Qt2?dk(a}e`CHk7qjiIEACBD#*|$}b_t1y zQF8%bix`7S^;1@dfr&`Uo_(!V&9W(%cE_<}pItH)kxWQMdZ#LCVxRy<#a}xoQzInL zp^WO97HvqWkKf?s#mv6gk6J}}kcgoQP{!ICDm+~T0fcCDjnM0O@Q-X>as3A@R8a*)B38B0@JFs|S9nwQ*OK~s@c(rQ^8FgRVwfZIQRd@t ztWztEUw^800pEK$8)Y#z;sIk>UxChRAre*;ut*zmJUR=?VP#(^A!3rt8x@5M25k&K{$6}PiGhJjkf+)=GM84xil08xfg2%?ICKsg7Y z1Z6XtVX=osWI~tXAaNJ_ZM^E)jJy}44w#6J4sT~kzy7B`=&t+mlZTJ*AG^TY^?I{h zwxo~m9^SgKH);H)-=!?(0Ey8#Pt`!uz<{a9-q{EpLECPUK709k_4@MgaPQ&0&5Ut%e-42F8i! zmI={-(3k-Yl$kwg^~2O8-KI;!pe9WSZ4<~jG(#X%P)jKZlQBvFZo;CyF=IUr)}Ow5 zb@J*JL%e(Y&fdYn+qVxeJwBQrK7D!d`HSzKuP#6RN(AU^v;Dza58l3W)i+ti=V)_ysoE3uH6GFbzav0$n=kYx1N#! zs%TQAHKxSue8Au{;vgDR8oItqakcF(*XxWnnNH`k>9lQwcaqW|HUNs686+`f5VdTE zL?uJ5nF)v;G8&bvLohAF$$$kyDh-M$(g^XZ7?LBZEM69>!Dist z0jSiGe>Eg_9@%ZT+t;V3uU?+`;O^eKef#FE#caA-tdJF zZr-`e7)~xOy1pmpnFvMWZqtD5PyEeUv*#F8k_Z7CIx$$Sx3Swci*V%k8;8Agrx&L& zcR%>i?GN7hz|ep4`#){2F76&3{j0zF=+3LNkH3EY{BrHXj3&vUxSKIURW#6Y=7xxYhn-GFy0r0^)#UEJAeEk^3e_Gr%N?&^hmO%7`2$ z?HobP;;>WA!!RIF(=;l!-EO+=dVMu9X?%!aiLxUsn78B{ zlMG3-fT2=0RSPAFHVNh&rfzR`BOb`*vRiFCF;uW}d}&exm$GTnS>xu@Y2(NvCMi>r zHSMU(zYs$3uJMg#NI51+B7%s_tft?C7^`Oq5z2Myc_}rhxFA#rj0sgU5qjUW?IbvE zooAvP2Vh5l&QX@U*{rUvE{A@LByI2vmbSa?)#du?q8oV>XtNk%QxD6hBiH%H8#%CgIrig5Az%cy_1@Z)1yKT;WERWl;^ zHbNIr0Ww7x1wd~M&njzDxX{wk6`b|Dgu){CCKgRpWs(X8s>%+DNR<#!ESKF9(VGaU ziD-(kL~a5xvvYC-*=_g-&e)`?n`|rMe^XPDY z;fXrw(_}Ua!SzEFO$SG_j}G7e!3RJ1*^l1c3#P*sHKCcXH#3pwfSG90Hd>rWDXMBp zJ)1*PARzV#B&jFjcH#}Olid)9ezz@x*d{boZXN<5XhsCG+{bP$!!CDgYG!-0$>WEQ z0=pM4o__n?i_Nxs>zyb2`$s=~^zh!1zV%@D&gI=dKmGQTuTOsWr$7DaFMoXd{@tJd z=>1=Q^wIs>cUX^3&ybh|8xgKvUsylY$_#hfHt7K4nK zK|oOrkjRDLToarxhM*uuhFIrakeCdCJv+n_z*2g1u{s`%1PXuxOl*v0XwVSQ)G-+- z8hRobddN}+cAVoj1X0VP5jAHe=P|hLke;2KJv%*J_xUt zUCo;I@tr%lN>IP~03sGXVxO(U>G7 z*(^-vE;w?1pOd6M_ZbWrJu^rueGa1q_8v?nr*0dEZo0Q0nu#KdrZPp;`X**!_GV@v zQv8FV%oT}Q)(i}e(IG$y2^edARYo%i&V#X;S~3AkYCzrxXJA*$%h)fU++O_kM<4v` zqaWP8ckCQ}`pMV-<-h*wFQ0zq8h7XRZ6v?ktb2`ujLL*;DPrndZ+G_Q_vY;sr0=r= zPur=RhS$rJ<;lhVWb$bL{$w_fefsv~<$4%?`t!fOaqCW?#h2fF`|Dr*N9i^{eE)~P z{P_nzmAC)?KmX?c^MCwy)Ai^U4Y83oLT*UJHoL7#W<>>^O{TYx7mNvT;I($$ZnN5c z{pGj2Rrm76`Gdy~@7=k5`_|1#>rxt0>W2)_5V1kd3WKT|P8>_1-7q-f z{k;R`#uMk5x|EGc!4Z-&C(%J{-cI*t{^s7^!ns;jnW&OOGPM$TQi?G{Lq>$th)7Px9eh7EeNY;=Lwh_hk281vY5H)T-YT9^600bMeQ_uaFccqkQ2&sxLgg} zy~W{dF}O*}X?XSe<;&O4FE7`U)e)_>n-?h`?(Zd{NxL|h*|1z0fb#)k&M_iW(>m|T z87WW$H0&T}%`8zA+W?KHB8%N?8sL_V3&|I$5rFeQw$r5t#OBIrtE!lh%h#zdJv_ zT5Y>qw{JeU_kf94%gt`L&T7-i+&MxjL^`r#B2GDaAOtdy(UFs?2xU}Fml`xnh7yye zfQTV9j5ze&049>M7$P(B_fFw!g^xDDqFY}NV{O59;FTDt}!sYqU{4`ETbSVgh{6ttui!)QWM#3`db4+yB>(PP77G&Ve7 zW0z7sR4r<-3a3VlQ_a9sOe%Va1ct?Aq!@QWovhTS=g*!$?}zN0AeLXQ*Zktu zcdsuXQ4`?7&Hee~N9ICC+V+EhE*h^O3OQ>XvgQ!7h$aA40`bl<@MgVx_Uz?1&tJq& zdbM4Q+aUrN`o;iF3RN=v_yAXBkgQrAd)fw73*RkBPd3d0H`KeVl-2djA$GdhX+SKOhonb zuReW!wK?pD!$Uu7Ci4j%A5Y%O`%muQ`rz@!7hk{p^z%=?_~f&bmshXO<4=D2;}71t z|M=#fw;^{svsCD%!nueV)Oika=*8rk69Xz3ixHwLn}S`thK*Xi(kzc?SLKq%eFR65 zUZuj&6pGt6k{I?$ll7bJ_UdXq#3WhO#1O)yao!==5F?6tDNf?v2y!moD^@yE1Eunu zjf1CkYeiJBtiXgwHAV+i5ort#F#tejVu!57VOPf_!J>OBsc8n{$gyKKU=l(|k{pqD ztYU^}-t{S-T`ganyxR8tVzGaG>-PS^K~`O^E?=IWyf}GzzFID(v;BklakC!Q}HvQ0L_KkNgvPK{)YKYH&MfAypH-+$arXV1U+?pOciSO4W#zge!= z$G7gz_YT&}&E@Js0i1Irm{N98SO4fht~zw_NVW^dwl=? zeDCnZ>(^hsJiT+g|3Cco-!As=eev1TPe1$puYU7~?d9(Ls(bM0&M$uYlf8DDyZGt1 z&rUD9t6f$gc7d@erW9FKB%hs~4*hWF(H-Z);e0l0oAr9t?{@ue_~i4a-@U$gaeDU7 zTaT8jhc^%R4)$kl>z!kEfFy{-qK(7JG^ogK+wIm@m#@!;YBG9U#A(esoiVli7j7O z8B7Ski0m7W%)^jZvTIrgfH~)sC5yx%Cow=~=X25+qiT93rm1}q9wCM8n= zaLzH(pq9F=N`L$C)}7mXXsO>uNFG8{atuY46ah&j1A>_1C~zPuV>aMQiAM-llz56& zU1%k37c1H(rJkzZ7f=csD_I$4W@5mYQ_5*j$HANqG7N*7hTwx|CWu`=Uv19ME;gI3 zDl&&`C^4yN%whncExrJvl0A}lEaqd%DQO1m*+&SWnN8;V1g*JYt!J@6R|6sr!8szy z*&$8m6Sih@us>TI5;tnVjK1~3%y)xkG|6g`h9oK}#u}og=JC*9_!xlTAf6XBcAayJ5XrZ8vK`^3Hqj*g1p( z$~qt}a_y=PGbt-jN2W+bz!br$s*196h(KdrfNvT`Fw=ggSrXA$RF@7Kftek<0tBO3 zmPCX^HL{n)8RjAkBP6w4wAy8At9V6V9ip%|hkM2MKug&_BL6tb0IJaEjgqF+_Sd8s zj*1g5CO0A~SpW=)#`LgCnw3(pyn#wCN+BCxmx@B979RCV@Oy9kf2ul0r44BrCI%?= zPC)=+4CpN%0^Yn&{g610CxF@5GmWo2_C^)g$7^drc=L^^l|Lz84r-+oYWaj%MYZ*N zvMQqhtc@(9Nu4E9)uQJ#6*i3>slR4*ip2WO6_wO^07D&JIp2^QUf)|o*v$@z@ z4qfMn+u3Y7TL1xS1-mKdi+`6o z0Ad5pAY_Pu4CshN8OUnEJU*Oiz(hbOpbj~-&HllDJ85#C0MR#%a{)*+CCw@+OUj^% zh6D`RbchH&g~@zA-#a**%oY)(>k;O>i6GVtgm)I<`3@PJ7^0AQNpue9Nf2B>X%hP^v3n2AT6kB1zxF-DHcUt)dF2F zk2*F0*UGtSHCuVLGKRzTr!b-B)Ni|fwO;SmotY6JFlcEM)cU^f`yByJsF}|evk-{c z6H_rhLmOi=Ndpo)0#GU;JB5aXvHvatH=yE9TT(Kil5K>HL?DV($FGVbm6p&GF%WRf z!MVnr<=4fz6{OC2b%F`@K=!h0sI4e8_qPz>FVy%I;&CvnLt8|tM3u} z?7c&{`&x?+9{V82c+)O`Ja*(h5#einQgw5Ac6I)AQTy+G>y1D9(f7ag)*F-Q{QUXF z-~aVL{LNqg?Sro#-Mn+}VDBXM!_{Ur#GW{KW>Lt}vg&d&JD&TABS-_PqB$lShV=OH z)2|+#ADnLiza~gj5&b{+TFaG48-hcnY$N%N; z-ak2c@z&|>KmF17Z|_eYJbeD}V)OCStLJ@;Su+tiuDl0FF{ah!WjAc+^Z9%^U(RL~ zFIvxSHwX-ytM;?se7;?+&z?TNbLZymTQ^Ql5BBz!95_blyKUbMhPd96sI9l{#nmQu zJ^QNhu3^qz<8~EOp58h*Jvp4#4pTpDuOQ0NWIk^^^%E`#NA+` zGKc^XJ6{1p8iv%1MDWg`^Hx^ju}uol5xVhmRs|$rMIoB&L&9P(C*s{tLC0R}~M8)M4soEuVX+g?Uxy(e&G3Q~pK$L(fIwPP~p zDqpb}4a1NmBaP95W(Y*4!)A3!+Vjo*MHAX*s|SxC&iD71cW${!Z6$?Ck&p>EYX;o4 zbRtp--mu+caO}w&33UQCPy-?2!hY&FLKPvjvvnlCBgQ zs&$+7^QTWV#o*nLC1pf%&R3PM$VGuR0y*{vlX@_{+Fq@@^^nN-D^(!-*u$nQ`=<(f6T7amkl5JhJOK!>Dod(K4-faMx;F1t>%jz@%BMc{ z>#IdW-+t}>AOGIlzw_N!UbubCoOQTprt{ZczWMC(<;RzgS3lb(*2R1pa~IpT3H0_` zFa7Bs{K238=m#&|zmc{V=a0T>uP!I`F&Kim-Q(E^Q53p%I6u2wtuAME@V=rD(h!@f zdiBNow~kKt7yHwSK(m4bc8H|e%&79UYkZa*+g_2t%%Mjdh4V_t#%2m8CDRQ`l^wE` z2mNjrESEO|iDffILsxlrq!R_jUCkP1QOOEfA&aO1u_hdnO5V^ALuKkKHEHTe<7qxy zGC9@U^{$qW=k~1^@7-}gPrrT)D#r&$M|*osRVz`- zxlO~6A_PC*n})h!b6r;ohmp{dWe_#VWaC5H zv7Gxpi=cD9nS^E%HLC~_0prdihG0rM#+1S?+-0PfiNp|0Ottvv#yO1$kQ6i*iD?NT z7gtrmd0MY7AAj}rqW0hY&bR*f$3Oh`x8GPEELN+FfBxrx`Okm$=U;sG;PB+;(dlgi zKEHU{4IL2|HiSV4U>e;1V!D_(%>9s)BSwdabg{bn{NdvS^zvJ;zWF=f0ZmUIucik_ z-+Jw(YP$HzPyh9^Pro=iJpTUozyHe1ul&#V|I2^*%U}HK&)=&}fApPi-9OpC|DzwQ zFWV2leDF8#ef*P;zI?P^p=$_(bIygvIp0CQUbn*#RRzU-@Qts$tLlktHhql4#o1Z6 zS+6cGE-o+cZtk4kIGIfArml0!DP}XvBBf#(5sr@bT&S7tYW2K}aepy0#@V!C$Ax}L zB17z1wXWv}Q=bo)7hT^)RX~#xtqa~*#LQ54mr;j3m?3K zj))lX-WH!55*Hx$yIi=wo zp077+0jr#!FP4+#9?+IHKvT}nbFyv_TV;aszU_uAQnIkj za!whEeF#(%e#s%_GEa@epY4!U12fB6a?ZgAW(SBlrx*t&BCL5#JmnCoTuI6~<{?Wq z1ZSl--W33tN38`3h?%7niMgWEfl#b&<=L*PQf9jy(hWPXzXVzCBt;{BXV($xc5r~HiDccqcNwXfc>F(VMrNu+4t7!{ z9KY>xbtxZ-*L4Zk;KK;>kK4lac7u35uE35AzuswVH`|x5gJrLPo!8cist0$Z$L?o^ z-Fk5Sf?m@Ycs=*SZY~-pqmfAY=BFwBU|@y$-?^kf4K!y#3>Ev*)vP(^Bsl}30}p1% zV-v}43fld`O-tkeAv!k(q64843hveyW*pt&#UiR%q!b|`Qb}5~A|BfjPj;OJwaZ`~ zT^49e6nw~v(X{XT)N145=F#%am%j7uci!%Y{NZO`{LMf9blvug*>ZDvxn5tsbo<^P z|L(j0-Jg8_?#ZHGuP!gnwh0awhfTHr(#tnq`1aZdU8fX4{e4`l_4EZ8{Avym%}4 z$zii}fQB*UG;URDrQnPVF=xxsQU>Rp^PnVS|ArC}nVJ9~N%5bmg5VCzGL?*0s*+G7 zmoC~2x!fki9JrFG-OyVWhipoStQu8vl%n<`Q*&luc{5zLSq9;g8#i6;=ZjgAoKh0Y zhL&PV=`w*4lJoBM7jE6Sb??UQ8~Q)}q^!_})`NGMa(}Td=rK|=3g5;4(m~zQ} zG=S1}H$IuJ?<2P(1Z-yvxTfOZ8)~4ihr4Bfu1U8YL53xsMifNAX^MI1hn%uQa!iic z%p4U%pcxucRn!9Q(Bt|lPjpgGnot7*l>`VARm%}Z1Ee`D_8c(7T}4WvVTcOMU?xOR z)?dXj6OGBa5!MDo!qTxq3Sbh`u-y)QKMd8Zo=%!z$YP>`VmWui#rfs)vuE3O13+ky zQrz_I_Uh`(ufKls{EU!p9vr-K=gy72?Fa9?@o)d+$KU<-n}-McZQK6jUw-zNfBDxRee_xF=eJJplU3*E&o z=bXu6Q{h1s7BvS3OO~^dCp5acxO(#BiGjZG;*Hndy5lC;wQ_LtHg7sAAb5j z{l~xgyTAU&lY`~|>Hqw{|Ni&h{@?ujKfHZ%>w}+u5T9>9`suHm*KXW@>FD^RS%lMB z9S)b1Uw`@d%ggoitG>@l^~8mWC$2^&P3=`{gG}d>X*2PT9g&+s&b-~Uo7L6Ob(fb{ z&z_x~-n=niEN|2jCstJ)^a0hDPP$MZc9&&j;X_d;vmx?AeMI8%M z2#L`k<(S0`xacv;p(CoGfXE2Y4Z{#^NSR$tMnj4h>ut=!!Pgat$*^8wO050u{lyD+ z4sYyD`_<*+hY!B~`cdYvfA6y1+pD}QN9kD7LxiTxjK~V6f}@5R%)khCGm&!z;-sBg z_S)kJfM|tmE!qGyBvb%HHSA+nK(!2JNm5oTm9_-L#W>cs-TDeenz{mDGe|0iR@K#f zHl0uE>7>dcU`XW9hiu$s+h**=hfs4^R?WPcEI3S6odHHQK)2XiEN06Xhi$vArj4tD zMq|fSReM(fl49C1Xvzv^0-B^esX|?WW;7L1RVhUfOei~q zRY(++07|BH33{Rt;RZG;H7^x0d0#ip$-!(|O;eQ1)n+raQ8FMg3NeA_A<5$>mye%b z92_+_ZybN}@WJ_}OS$#x3w(>-0ho!RcR-|KF=Z9??0hM^1J27=UP1?Y&2VIP{W|0y+#Fpfqt1bJNrYW?LJEUg8jZMZ|?(+l{tJTqp!n zwJh0dKqBW#kar1UA1C3`9D}qA=i12@unc)4!aI(+1>R=hYuRrxynZtdBH7a6xjQ%5q1H~y0hz3wc(CIL}Nk{QehQU>xgSxy%7`OF0~>)O^&{o!oESa|`=YJ{GhYA!#c5F%$48TtfJ zv~wat<8@F}R;nrr#q@#5?6V~>G|&RT72Xm|3AyZSXr-P)OVV66jeWd0yUbaZ%jMJu zFi2Tb%o#uofRMRDQ~?=c7jv8)-r7I8;VMs{(6w0-I;=3{j0K4uQt!}F+8oZ0zW=Rz zo7H#r!my}Fa@4FPmjG03cljGw*}-=gp#g&K>^Eftce~wooc;^hWZ&%Dqm2Zw--y@R zpfdH3U4JGDstf>TfvE`r%$#BEoHJz4KCqRZ0VX9>v%Vkteuy#kUGI)gr*%UHVn%2q zif`GBRRxH4TE^@3oNU+9R}_H^fJLu@s!|r@0_N=^ZpzQEfPg7w>4&awFZ-U)VLEA+ z^I2WhO%=!$QtABR(`TFYdQwloQHuR1pMU)2!>^>v&!0a-g&W6*uiU+TYk$86>cy7x zc~?b2yX@M*Bum09wfA)?o=t)nk7n35kfX}tFG@& z6%mmM5LB~BITn&6L})@y)kKT01qf)YL@2j78lhr2FGl}#5e-`DJx9k5k<7$2XHy5L zKwy*=vS1cPW`~}cvchJwUOoM~W_$b1H~!t9{?Q-&{&!D~7dglGe)+3E`;Y(SXFq!% zsXD!J*SX30`Ne8|C5l$U8C50s40$=J4yJzU46{f!05>S7c6ffiTDQaLjic}X;I-3} zc^vxL(ZO=QT=n)3?|=GdfAy2U|K|@r{N(Dh&#rFV_+M@vPv7~@cV51A_v<%b|C|5x zcfb1SPhj|Z*1UPT+{^3Lt2dAC-@EsVPe1>M_kQ)SAAkMj`F1<>ZZh}HbTXe+pm~TX z%68L%YDvwjDj&$Z*|Z97+jq~OoUg97kDiV8sczu5$mRz&6=jJOtH_FWjLNM=JSaU-W1wxw@z_L31V{2d54IC zj7G-JOd}98p*ce%H8Rx)y{UtkKK<sQFi*B+k!!W8IL5W7fy%3D$AEu+I%+4DR(jTgZSWFi*# z+^eQO)V1@C5)H!;MbJ57m(2t%s~XyJZ!Zo5GKpwP+4+D>pbQMEAPNR#h7LV4F}tF9 zB|t?r)vjv^DTCyk29cZ{Obr}=!lO{VNCPfW_JY}u5wxJk$~ zr%a9r9W!ac7ZHHSx~Nk8*hPvDSw*uL6mdB)AQ6^`#qxp^kf=(ED!Q0W_U8wCv*~g+ z^WG2LFmrHrWvvYAFa!qgV1L@K){mc^ef8k+@#!l^NBet=#l^bKN#Zd00K~2+TfFxM zmU1$%Atp6rF7T6O5hIhFg*}@A7&8iDiH&CZU#Z5&GEkKv#w5wtz9OH!?}uJAbK>Bq zqkvA;1z&;19EU!Z`)j8dDOb^GGsP0&W~O2(XBWKpPSoH!3kPsS;h6x?a92cCPCvq; z0S5yuDR>0|GAZluxEqW^u9ZE))Jn4$h$(1M12R&HGe!JH7Y(*coH4WVzN02}RPxZ6 zp$Rzt56ZkjV@1F<%w8A@g>U|hikdNu9sqYV!_K>wZ45QCf{-I!6EfqpQeMtt9?)-~ zZrc$AHh#A|;rj@4fL(v_>mL($*y{M|?y`@xM5>lxu)^>FT1gMPEZdDvN_-@<0`nFZ?PaA`6g-sAhq}R+=G|I975D zrO_8hL6oYMfflhGI=1VC1eMYLR8kcQK~+RkGnogZ?Pk?=?T!7@AAa|p|Lvdt;rHHp zbF!SDJ$MSK4~$@GySZ4*>R0dI_?;iTee2Fm6Y4tcdXy9x9b-r-UtXR+di3ziuf9;z z*IvB$qwjwEzx&bee)pYMkN0PBbJexOuA{5SChU?V&x`

Qp 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 z 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ξ}EW?mIIj0vY`+Wga~sK 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

L&Owvyqt*Ij7u&wkH}e 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 jTJSqmr5ZdnYp)8sS29ei10qn=QC8> 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%0AaT3g7?`ox)z~ynBq{9`5ew)TocEeUseS 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 b00;m8000000Mb*F00000NkvXXu0mjfr)I%X

T31u`STbvxeylK0jH!{RFISy91}Vbi8&`RAXhcj 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�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≶Tx0RIx)6q}n7Cn7aP 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�a`&+{#WZ^H=8?PSKKw zZ3T{;HXgt4jgdSMlQa3=rGje$UW4mS)~GYf4ZpnBiAaS^A&aD3BRmtV?I9~G+*Q#M zE-ZPD`}CYZ^*6%=dK4BBg6&;r)daj8P=49Zo+hd{^@H&{hZlm9J$LpLc!6(BiUcut%?}!2lbcBWWIiCU2iZ$T+!C% zIUslbAy~1spnWqSf3m`Lz=vNM$)Fr~3>Jd0tK)Nbd3&edW&}KgM2CAuMESSr`XOUV7$UUr{jwa;Y(i) zp~8d5znxHD@^a25$F*U%WtKGW>3{QYe|vRLb+=7p-96^^hD^XFT3rx|#AM%2%$0i< zlQ}h*7pnJzfpUQ^1}9_^&DI$(9VZf!2Br3JQ8QjAEUt|29w>udIvNZJ9aZ5&^p|@c zPr4*}FaG^Wt}Mw^dEjfa3=?UoyH3vLB@ljH%CF&n|2|kbj=DS`10hp2e_Z`pn{nz4 zzuL{%T~kw3AK%^b;8({E$U{DUcKGZOqyun-mFUsd-OqIvjqVMj&w%Nn0B<0>AO9); z;Qvaje02FYe2v-ZG@!5Ix0$bt%3jb-F++KV!B#9{YUZprMLkL+fQ(MPMm?(E$(8e|UtnG{BTX z)j50_Pac8b#=_TtV8X(nb{rpIFe|2PnCjJmXl6`!Rvdm3`+=evgXL}?ePfRb0E2uSRR*xTPKDgJ^t)>+mnq zYI{TSP-5@RP_4Cpc-yP3-u=j{jUwZ;(aR3r;pp;NojHRL_u6#&@eg=*Kji zFQ#(AV3;FY*pKt4Pjm+ZVgX;8Py*V35jrq}6F&AD>Nka>@xkoyHmCARAAx_m@fi28 z+z~VP;&ya=GPXx48e$b^4O#BL$rZwBLq%VZ-mpwWr9T`)-_1Db*aho^= zZ=>%vg4+6mE*K_;n_eZ1ZLT_A*hE=&XS%kgOT83d?~+1hTY6BuUbFNlp#L_zc3e*< zd1XAH7y$BL_GRJc+ia2V59}TbY`AfqgRTg2N19~AqiO;_qkvo8w_v8sGCPt0FSGeb z+N90uslU{aT�-QX1duBOZJ;bRxAD>h>Fl1X50jB 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[cs@qnVV==w+)SjD3}9v1(6RbuXJt~85s>C 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%0ANT2v51^++xd7@ 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